SCM: Планирование закупок 8 (для УТ, УПП, Комплексной). "Пришёл. Сформировал. Заказал."




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

42 Comments

  1. sytkosa

    А в чем ограничение то !!!

    Reply
  2. fedor40

    Там же сразу видно, что некоторые параметры не активны. Зачем описывать, то что итак видно. Это касается корректировки уходимости по тренду (4 параметра отключены) и значение точки заказа и мин. страх. депозита в полной версии можно задавать для каждой позиции номенклатуры в разрезе складов.

    Reply
  3. tsd

    (2) а скажите, плиз, Вы рассматриваете Инфостарт в качестве бесплатной рекламной площадки или таки собираетесь продавать через него свою разработку?

    Reply
  4. tok

    Хорошее начало. Как мне кажется, раз так серьезно взялись за дело, то надо доработать инструментами финансово — аналитического учета: План-фактный анализ, анализ оборачиваемости учетных единиц, ликвидности и пр., хотя бы в «lite» варианте.

    Reply
  5. ValentinV

    Вроде «уходимость» у всех является ликвидностью,

    лично меня эта уходимость как обухом…

    А так надо смотреть…

    Reply
  6. Mickl

    Я соглашусь с 4. Отличное начало. Если учесть пожелания, то можно

    продавать намного дороже

    (+ за идею)

    Reply
  7. coder1cv8

    Минус за спам. Я это даже не качал.

    Reply
  8. fedor40

    (7) Спам это когда всем без разбора шлют. А тут выборочно, лично.

    Reply
  9. fedor40

    (4) см Планирование — наверху кнопка Функционал — План-Факт анализ

    Reply
  10. fedor40

    (5) Уходимость и ликвидность это одно и тоже. Иногда можно это просто спросом назвать.

    Reply
  11. koliaff

    Минус не поставлю, но спамом не надо заниматься !

    Reply
  12. ValentinV

    Я понял так, что письмо пришло, как участнику группы:

    «Логистика и склад. Планирование закупок»

    Если так, то спасибо.

    Если подтвердите, то поставлю ++.

    Думаю и coder1cv8 надо было спросить или хотя бы сослаться

    на однозначнодействующее правило.

    Уж больно он лютый.

    Reply
  13. ValentinV

    Еще мне не понятно, но интересно.

    У вас планирование из каких теоретических посылов,

    наличие заданного количества или есть другие соображения.

    Я может не доглядел в темах группы, извиняюсь.

    В моей практике обычно требуют максимизацию прибыли,

    из-за чего и спросил про ликвидность.

    Reply
  14. fedor40

    (14) Будем сравнивать ?

    Reply
  15. natarezn

    классная вещь, можно сравнить по ТЗ.. 😉

    Reply
  16. pah_a@mail.ru

    Вещь то может и хорошая, только смотря для чего, такой анализ может и кому-то пригодится, мне совершенно бесполезен. Плавали-знаем!!!

    позворляет корректировать уходимость с учетом роста или падения спроса — на счёт сезонного спроса это понятно, а вот как же рекламные акции, во время их проведения уходимость увеличивается на некоторые позиции товаров раз в 10, а затем падает почти до уровня- до проведения той самой акции. Цена тоже — сегодня по 1000 руб, а завтра по 5000 руб, и будет после такого анализа полный склад товаров, которые будут лежать мертвым грузом. Да ещё не мало факторов, которые влияют на анализ: остаточный срок годности, ассортимент (товар за 500 руб., на который наценка 40% не купят без товара за 1 руб., с наценкой 10%), да и др. акторы есть, побольще параметров для анализа надо, чтоб планировать!!!

    Reply
  17. vitaliyua

    Уверен, что если бы не («10 функционалых особенностей, которые потрясли мир:») мания величия в увеличенных размерах, благожелательных комментариев было бы больше. :). Меня интересует, каким алгоритмом, или иначе, по каким регистрам вы высчитываете количество дней продажи. Партионный учет? Линейный метод? Потом, может быть и не внимательно смотрел, учитывается ли при расчете показателей начальный остаток перед реализацией номенклатуры? Пара чисто технических вопросов, точнее — алгоритмических :).

    Reply
  18. fedor40

    (20) Наличие свободного остатка товара на начало дня рассчитывается по регистрам ТоварыНаСкладах, ТоварыВРезерве, ТоварыКПередаче, ТоварыКПолучению, ТоварыКПеремещениюВНТТ. Продажи по регистру Продажи или по ТоварыНаСкладах.

    Reply
  19. Danny Ocean

    С благодарностью…

    Reply
  20. looxxx

    Планирование закупок с возможностью формирования закза (Код открыт) для УТ 10.3 http://infostart.ru/projects/5790/

    Reply
  21. Alex_IT

    Отличная реализация, вот только нет свободного ожидаемого остатка.

    Reply
  22. fedor40

    Да.Но для закупок важен просто свободный остаток, кот вкл ожидаемый. Это же не для мен по продажам.

    Reply
  23. Alex_IT

    Ни правда ;), для закупок тоже очень актуально знать сколько свободного товара у тебя в пути. А то можно склад нагрузить по самые…. Конечно при условии длительности самой поставки товара — 1-2 мес…. и более частой закупке.

    Reply
  24. fedor40

    Думаю это можно будет учесть.

    Reply
  25. romanovkv

    Здравствуйте а можно от вас получить тестовую баз для проверки работы функционала. Мне нужен продукт такого вида но надо посмотреть как он работает. А своей базы нет.

    Reply
  26. halushka

    А для РАУЗ вариант будет ?

    Я понимаю конечно все прелести партионного учета, но специфика подвигла перейти на РАУЗ. Ессно половина отчетов и обработок «ф топку».

    Reply
  27. fedor40

    Для рауза нет.

    Reply
  28. fedor40

    Исправили ошибку:

    Преобразование значения к типу Число не может быть выполнено

    Reply
  29. RegrZ

    Вообще задумка хорошая, но так как это достаточно объемная обработка с большим количеством настраиваемых параметров, то очень нехватает возможности сохранять настройки в файл. а также:

    Неудобные отборы складов и номенклатуры, Отбора построителем очень нехватает.

    Таблица планирования — недостатки:

    на панели нет кнопок сдвинуть, раздвинуть колонки (функции забить в горячие клавиши + и -)

    нет чередования цветов строк.

    Есть кнопка скрыть инфо колонки. А где кнопка отобразить???

    Reply
  30. RegrZ

    очень юзабельно было бы настраивать свои цвета строк указывающие на определенные ситуации в таблице планирования.

    Reply
  31. RegrZ

    И еще вопросик, при расчете количества к заказу по точке заказа учитываются резервы внутренних заказов? т.е. количество к заказу должно быть уменьшено на уже зарезервированное для этого склада во внутренних заказах.

    Reply
  32. fedor40

    //Есть кнопка скрыть инфо колонки. А где кнопка отобразить???

    Правой кнопкой на таблице и выбираем Настройка списка.

    Reply
  33. fedor40

    //И еще вопросик, при расчете количества к заказу по точке заказа учитываются резервы внутренних заказов?

    Резервы все учитываются. Галочка Минус резервы.

    Reply
  34. zenz

    Чем отличаются платная обработка от бесплатной? Только открытым кодом ?

    Reply
  35. fedor40

    Да. Вообще, я хотел выложить только с закрытым кодом.

    Reply
  36. lilenkov

    Возможно ли добавить учет отгрузок со склада типа «Розница»?

    Reply
  37. fedor40

    Все доработки планы.

    Reply
  38. dufrein

    (43) Платны?

    Reply
  39. fedor40

    (44) dufrein, не понял. А как они будут бесплатны?

    Хотите сами дорабатывайте.

    Reply
  40. fedor40

    (19) pah_a,

    В обработке есть возможность исключать Проекты. Например, крупные распродажи.

    Reply
  41. MrFlanker

    Прежде всего БОЛЬШОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО АВТОРУ!!!!

    НУЖНАЯ ВЕЩЬ. Отличная реализация. Прекрасный дизайн. Хороший функционал. Приличное удобство и эргономика.

    У меня бы неделя ушла на создание чего-то подобного. Стоимость ей не «один смарт мани», а как минимум 1000 рублей за копию или 30 тыс. за разработку.

    Много негативных комментариев просто от непонимания, незнания, самоуверенности. Все прекрасно настраивается. ИМХО Лучшее из бесплатного.

    У меня был лишь один момент…. я целый час разбирался со всеми терминами, настройками, и коэффициентами, хелпа почти нет.

    Но сразу было ощущение что писал человек пунктуальный, последовательный и и все получится, нужно только разобраться.

    Завтра у меня внеплановое собрание — обучение менеджеров по закупкам, включаем эту разработку как один из полезных инструментов для работы.

    Еще понадобилась вот эта разработку http://infostart.ru/public/20983/ чтоб Основного поставщика проставлять… (добавил в нее еще фильтр по контрагентам).

    Reply
  42. pvlunegov

    MrFlanker абсолютно согласен с вами.

    Отличная вещь. Интегрировано много чего.

    Много инструментов в удобном виде сразу в одном месте.

    Эта разработка из разряда того, что надо освоить, понять и пользоваться.

    Если вы не умеете ездить на велосипеде, и даже не пробовали, это не значит что он плохой.

    Просто вы ленивы и даже подойти к нему не хотите.

    Не кидайте тухлыми помидорами. Попытайтесь разобраться и понять а не хаять.

    Очень легко сказать фиии. А вы попробуйте помочь автору. Попробуйте потестировать, показать, что там не так и что можно улучшить!

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *