<?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='\
Вообще-то за отрицательные остатки положено 3.14zditь ржавой лопатой, так как это говорит о:
1. снятом контроле за остатками,
2. блудливых ручонках юзеров, распроводящих доки поступлений-перемещений.
3. толпоопстве руководителя, глбуха, админа, не следящими за правами доступа юзверей.
4. ……..
(1) Да кто ж спорит, только вот практически в каждой базе ТиС есть такие косяки, и чем оперативнее их выяснять (допустим, запуская отчет каждую неделю), тем легче вставить люлей тем, кто накосячил
(2) Восстановление последовательности все и так выявит 🙂
(3) Абсолютно верно. Но речь об оперотивности и об удобстве. Выявив в течении дня отрицательные остатки, вставив люлей, исправив и включив на ночь востановленние последовательности мы получим НА УТРО РЕЗУЛЬТАТ отличающийся от просто ночного востановления последовательности.
(4) разумно
Но есть несколько «но» 🙂
1) Если запускать этот отчет только за текущий день, то как проконтролировать изменения задними числами?
2) Есть возможность автоматического выбора начала анализа с позиции последовательности?
3) Если надо будет, то еще придумаю 😉
(3) ну да-да, только все ли двигают эту самую границу последовательности?
Большинство просто не знают что это такое и для чего нужно, игнорируют предупреждение в отчетах.
Или как вариант: попробовали восстановить последовательность, оно заткнулось и больше не стали пробовать — и так ведь работает
Вариант 2: пару лет работали и не двигали ГП, теперь уже поздно пытаться двигать, т.к. восстановление последовательности переносит ТА на границу последовательности, а магазин работает каждый день 🙂
(4) да, кстати, можно и так
получается как просмотр предварительного результата, восстановится последовательность или заткнется ночью
(5) насчет контроля изменений задним числом — нужно двигать дату запрета редактирования — чтобы уж чересчур давние доки не редактировали и не запарывали остатки
наверное добавлю 2 выбора начальной даты:
1) дата запрета редактирования
2) дата границы последовательности
правда надо проверить какой максимальный объем данных сможет за раз переварить система, т.к. для выявления косяков формируется очень большая временная выборка данных. Проверял за месяц — нормально, надо попробовать больше период поставить…
(7) вот-вот 😀
но последовательность может заткнутся не только из-за отрицательных остатков по товарам. А и из-за отрицательных остатков на счетах/кассах (только не спрашивайте меня зачем в последовательности есть такие документы 🙂 ).
Смотря какие документы входят в последовательность и сколько вообще есть последовательностей.
Поэтому если делать, то уже делать с учетом всех нюансов учета.
(8) Дата запрета редактирования тоже может быть разной.
По разным видам документов и по разным наборам прав/ролей.
Например, администратор БД может изменять любой документ.
И это правильно! 🙂
+(10) в начале должно было быть (8 )
(9) насчет нюансов — это отчет для типовой ТиС, и imho основная причина затыков восстановления основной последовательности — это отсутствие остатков ТМЦ
(10) тоже самое, в типовой ТиС одна дата запрета редактирования, а администратор тоже может наделать косяков
а вообще основная идея — это это сканировать периоды (например, по месяцу), начиная с самого первого дока в базе и если минусов нет, то двигать дату запрета редактирования, чтобы отрицательные остатки и не могли появится
+(13) Из-за этого — минус
+(14)
упс…. Эти ошибки были из Украинской ТиС
(14) в принципе, я могу сделать так, чтобы из отчета не было вызовов к глобальным функциям, включив их в модуль, но смысла в этом не вижу, т.к. запрос ориентирован именно на ту структуру регистров ОстаткиТМЦ и РезервыТМЦ, которые есть в типовой ТиС
(16) то-то же
(17) Можно и адаптировать под украинские регистры.
Украинских пользователей много….
Если Вам лень, могу и я сделать. А если не лень, могу дать необходимую информацию 😉
(18) мда, посмотрел я эту типовую ТиС для Укранины….
печальное зрелище, чего стоит только регистр РезервыТоваров без измерения Фирма 🙁
Так что Altair777, хочешь, делай для украинских пользователей и выкладывай, они оценят. Я для Украины заморачиваться не буду.
(19) Все слышали? Я первый застолбил 🙂
А насчет недостатков украинских конфигураций все претензии фирме «1С» в Москве 😉
Она же отдала из разработку «ABBYY Ukraine».
Если честно у меня эта обработка не заработала.
(21) А можно поподробнее, что вы понимаете под «не заработала».
Если за выбранный период в базе нет отрицательных остатков, то она и не покажет ничего.
Это очень хорошо!
Может минусов нет, вот и не заработала:)
А вообще полезная штукенция для тех, кому лень вести тотал контроль ежедневно при наличие уже как минимум двух операторов работающих в одной базе.
А бывает и такое чудо, когда есть ЦБ и РБД и там и там умудряются провести один документ, но по причине префикса уникальность не нарушается, а только сползают остатки в минус.
в больших конторах такое отследить проблематично сразу.
А вот данным отчетиком легко:)