Заполнение серий товаров в Заказе клиента




Принцип обмена данными из 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='\

16 Comments

  1. milkers

    Насколько я понимаю, у Вас просто неправильно поставлена политика использования серий на складах для вашего вида номенклатуры.

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

    Reply
  2. Andryza

    Почему сразу неправильно? Поставлено так, как требовалось. И такая ситуация имеет место быть, повсеместно.

    Reply
  3. milkers

    (2) Тогда объясните глубинный смысл вашего подхода.

    Reply
  4. ILM

    Почему «крайний» срок годности? Вы сапёр или лётчик? Вы боитесь слова последний? А если эта серия уже просрочена? Что тогда?

    Reply
  5. Andryza

    вот именно, что тут не последний имеется ввиду, а крайний, ближайший, первый если угодно. А смысл по моему изложен в описание, или не понятно?

    Reply
  6. milkers

    Еще один вопрос. На момент заказа серия не просрочена. На момент отгрузки она уже за пределами срока годности. Что происходит у Вас в системе?

    Reply
  7. Andryza

    там отрабатывает по типовому функционалу, т.е. как если бы выбирали серию вручную, через окно подбора серий. Список доступных серий, сформированный в окне, получается такой же.

    Reply
  8. milkers

    (5) Еще раз, зачем выбирать серию в заказе клиента, если к моменту отгрузки она может быть уже перестать годной, заказ может быть отменен и т.д. Не проще ли настроить автоподбор по сроку годности при отгрузке штатными средствами?

    Reply
  9. Andryza

    (8) Проще, то может оно и проще, но дело то не в этом, а в том, что настраивают так, как нужно. А не как проще. Зачастую проще, не значит, то так нужно.

    Reply
  10. klaus38

    Доброго. Себестоимость по сериям при планировании отгрузки, то-бишь серии выбираем в заказе. Есть клиенты которым надо только «свежие» сроки, а иногда в заказе нужно просто заполнить по ФИФО, но в связи с настройками такой возможности по кнопке нет. Обработка поможет по фифо в заказе?

    Reply
  11. klaus38

    (6)То-же что и с настройками в политике «При планировании отгрузки» отмена и перезаполнение всего и вся.

    Reply
  12. Andryza

    (10)Добрый вечер. Да должна помочь. Проверьте, будет ли нужная серия у вас, если попробуете вручную ее указать, как на скрине показано. Если в списке серий увидите нужную, по сроку, то отработает.

    Reply
  13. klaus38

    (12)Отрабатывает как нужно. Но при попытке записать выдает ошибку. При этом серии записаны в документе.

    Reply
  14. Andryza

    (13) Добрый день. Обновите форму, почему-то не обновилась автоматически, проверю этот момент. Что бы обновить форму нажмите F5 или через кнопку «Еще» — «Перечитать»

    Reply
  15. mbIkola

    (6) Обработка весьма полезна, вот думаю как заработать стартмани чтобы скачать.

    Столкнулся с необходимостью внедрения УТ 11.4 + продукция поднадзорная ВетИС (а там не только скоропорт но и товары длительного хранения). Хочется обойтись только встроенной системой интеграции с ВетИС. Но есть проблема, ВетИС требует установку политики учета партий «При планировании отгрузки» и никакую другую. Оператор при формировании заявки понятия не имеет какую партию отберет кладовщик, кладовщика трудно заставить отбирать так как указано в ордере на отгрузку.

    Как быть? Что посоветуете коллеги?

    Пока рассматриваю два варианта:

    1) Убрать в конфигурации привязки на проверки Ветис к типу учетной политики, переделать механизм подбора партий при формировании Исходящей ВСД. Но чем дальше углубляюсь тем больше этих проверок

    2) Заявка заполняется по методу FEFO хоты бы этой же обработкой. Переделать механизм проведения расходного ордера на товары, при проведении корректировать заявку согласно отобранным номерам.

    Reply
  16. Andryza

    (15)Добрый вечер. С ВетИС не сталкивался, так с ходу не подскажу.

    Reply

Leave a Comment

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