Система слежения за исполнением документов




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

10 Comments

  1. CheBurator

    Понятно что здорово, но здорово непонятно…

    Reply
  2. vcv

    Вопрос интересный, но пока видно только три категорически невнятных скриншота.

    Reply
  3. astrosoft

    (2) vcv, спасибо за комментарий.

    Скриншоты обновили и добавили. Надеемся, что сейчас будет нагляднее.

    Если возникнут вопросы, готовы ответить.

    Reply
  4. astrosoft

    (1) CheBurator, (2) vcv, добрый день!

    Мы подготовили тестовую базу, где Вы можете протестировать функционал СИД.

    Reply
  5. vcv

    (4) Глянул. Любопытно. Но как-то непонятно-примитивно.

    Как работает уведомление об объектах с явным формальным признаком (например не заполнена дата отгрузки) понятно. Есть запрос, он отбирает документы, которые ответственный должен отредактировать. Тут более-менее ясно.

    А как работает, например, «Проверь контрагента»? Бухгалтерия оформила документ, коммерческому пришло уведомление, он документ открыл, глянул, согласился с дебиторкой. И что дальше? Как отражается факт, что контрагент согласован? Как получает уведомление о согласовании коммерческим бухгалтер и где бухгалтер видит «ожидающие согласования»? Как выглядит процесс отказа от согласования? И где коммерческий увидит, как пошла дальше согласованная им сделка?

    Не вижу «слежения за исполнением документов». Вижу только элементарные уведомления.

    Reply
  6. v3rter

    Из описания непонятно главное — назначение системы. В описании я вижу проверялку-оповещалку с широким диапазоном условий и непонятной областью применения. Зачем она? Для кого она? Какие задачи решаются с её помощью? Какими механизмами?

    Это система контроля исполнения документов или все-таки их корректности?

    Обычно к таким глобальным вещам пишут статью-мотиватор «Как с помощью нашей суперобработки мы побороли очередные стопицот проблем!» или статью-методичку «Поставьте галочку А и решите проблему номер 1, нажмите кнопку Б — и уйдут проблемы со второй по четвертую».

    Reply
  7. yury.matveev

    (5) vcv, (6) v3rter,

    «Проверь контрагента» — это сценарий, по которому выдаются уведомления при наличии в системе документов, оформленных на определенного контрагента (например, коммерческий запретил отгрузку клиенту, а бухгалтерия все-таки оформила документы).

    В систему не заложен функционал поддержки процесса согласования.

    «Элементарными уведомлениями» достигаются цели предупреждения и выявления некорректного или несвоевременного исполнения сотрудниками своих функций в информационной системе предприятия.

    Например, в нашей компании среди прочих уведомлений настроены напоминания менеджеру отдела продаж о том, что по определенным заказам наступает дата отгрузки и ему необходимо оформить пакет документов. Если за 3 дня до даты отгрузки менеджер не оформил документы, уведомление об этом направляется его руководителю.

    Reply
  8. vcv

    А вот такой вопрос. Как вы решаете вопрос с вероятными повторными уведомлениями. Например, сделала бухгалтерия документ на запрещенного контрагента. В какой момент сформируется уведомление. Не сформируется ли уведомление на следующий день, если документ останется с этим же контрагентом (например, таки договорились на разовую отгрузку)?

    Или, например, не указана дата отгрузки. Уведомление менеджеру будет приходить один раз или каждый день?

    Похоже система уведомлений начинает спамить сотрудников 🙂

    Reply
  9. yury.matveev

    (8) vcv,

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

    Во-вторых, в окне уведомления пользователь может отложить или вообще отключить выдачу того или иного уведомления (например, таки договорились на разовую отгрузку).

    Reply
  10. klaus38

    Бросили поддержку?

    Reply

Leave a Comment

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