<?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='\
Насколько я понимаю, у Вас просто неправильно поставлена политика использования серий на складах для вашего вида номенклатуры.
В настройка есть при планировании отгрузки, при планировании отбора, по факту отбора. При этом, можно сделать автоматический подбор по минимальному сроку годности из остатков в документ отгрузки и не указывать серии в заказе совсем.
Почему сразу неправильно? Поставлено так, как требовалось. И такая ситуация имеет место быть, повсеместно.
(2) Тогда объясните глубинный смысл вашего подхода.
Почему «крайний» срок годности? Вы сапёр или лётчик? Вы боитесь слова последний? А если эта серия уже просрочена? Что тогда?
вот именно, что тут не последний имеется ввиду, а крайний, ближайший, первый если угодно. А смысл по моему изложен в описание, или не понятно?
Еще один вопрос. На момент заказа серия не просрочена. На момент отгрузки она уже за пределами срока годности. Что происходит у Вас в системе?
там отрабатывает по типовому функционалу, т.е. как если бы выбирали серию вручную, через окно подбора серий. Список доступных серий, сформированный в окне, получается такой же.
(5) Еще раз, зачем выбирать серию в заказе клиента, если к моменту отгрузки она может быть уже перестать годной, заказ может быть отменен и т.д. Не проще ли настроить автоподбор по сроку годности при отгрузке штатными средствами?
(8) Проще, то может оно и проще, но дело то не в этом, а в том, что настраивают так, как нужно. А не как проще. Зачастую проще, не значит, то так нужно.
Доброго. Себестоимость по сериям при планировании отгрузки, то-бишь серии выбираем в заказе. Есть клиенты которым надо только «свежие» сроки, а иногда в заказе нужно просто заполнить по ФИФО, но в связи с настройками такой возможности по кнопке нет. Обработка поможет по фифо в заказе?
(6)То-же что и с настройками в политике «При планировании отгрузки» отмена и перезаполнение всего и вся.
(10)Добрый вечер. Да должна помочь. Проверьте, будет ли нужная серия у вас, если попробуете вручную ее указать, как на скрине показано. Если в списке серий увидите нужную, по сроку, то отработает.
(12)Отрабатывает как нужно. Но при попытке записать выдает ошибку. При этом серии записаны в документе.
(13) Добрый день. Обновите форму, почему-то не обновилась автоматически, проверю этот момент. Что бы обновить форму нажмите F5 или через кнопку «Еще» — «Перечитать»
(6) Обработка весьма полезна, вот думаю как заработать стартмани чтобы скачать.
Столкнулся с необходимостью внедрения УТ 11.4 + продукция поднадзорная ВетИС (а там не только скоропорт но и товары длительного хранения). Хочется обойтись только встроенной системой интеграции с ВетИС. Но есть проблема, ВетИС требует установку политики учета партий «При планировании отгрузки» и никакую другую. Оператор при формировании заявки понятия не имеет какую партию отберет кладовщик, кладовщика трудно заставить отбирать так как указано в ордере на отгрузку.
Как быть? Что посоветуете коллеги?
Пока рассматриваю два варианта:
1) Убрать в конфигурации привязки на проверки Ветис к типу учетной политики, переделать механизм подбора партий при формировании Исходящей ВСД. Но чем дальше углубляюсь тем больше этих проверок
2) Заявка заполняется по методу FEFO хоты бы этой же обработкой. Переделать механизм проведения расходного ордера на товары, при проведении корректировать заявку согласно отобранным номерам.
(15)Добрый вечер. С ВетИС не сталкивался, так с ходу не подскажу.