Рассылка расчетных листков для ЗУП 3.0/3.1 и ERP2.0 с журналированием




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

17 Comments

  1. Xytras

    большое спасибо! в erp без ошибок все отработало

    Reply
  2. MasI

    Отлично работает, спасибо за обработку

    Reply
  3. rusat

    Добрый день! Обработка работает, спасибо, но мы очень просим убрать дополнительную информацию в теле письма :

    Уважаемый клиент!

    Это письмо сформировано автоматически. Пожалуйста, не отвечайте на него.

    С уважением, Coleman Services

    Your corporate or personal HR-adviser

    129090, Россия, Москва, Долгоруковская ул., 19, стр. 8

    !Телефон: +7 (495) 660 56 00 | Факс: +7 (495) 660 28 80

    ————————————————————————————

    Dear customer!

    Please find attached statement.

    This is automatically generated message. Please don’t reply.

    Yours, Coleman Services

    Your corporate or personal HR-adviser

    129090, Russia, Moscow, Dolgorukovskaya str., 19 building 8

    Tel.: +7 (495) 660 56 00 | fax: +7 (495) 660 28 80

    УВЕДОМЛЕНИЕ О КОНФИДЕНЦИАЛЬНОСТИ: Это электронное сообщение и любые документы, приложенные к нему, содержат конфиденциальную информацию.Настоящим уведомляем Вас о том, что если это сообщение не предназначено Вам, использование, копирование, распространение информации, содержащейся в настоящем сообщении, а также осуществление любых действий на основе этой информации, строго запрещено. Если Вы получили этосообщение по ошибке, пожалуйста, сообщите об этом отправителю по электронной почте и удалите это сообщение.

    CONFIDENTIAL NOTICE: This email and any files attached to it are confidential. If you are not the intended recipient you are notified that using, copying, distributing or taking any action in reliance on the contents of this information is strictly prohibited. If you have received this email in error please notify the sender and delete this email.

    Reply
  4. DonAlPatino

    (3) Вы скачали старую версию обработки. Я ее удалил. В новой, которая PaySlipsZUP30_05_12_2016.epf этого текста нет.

    Reply
  5. rusat

    Добрый день! Я скачивала 9 февраля 2017 г. вчера эта обработка у Вас еще была, а сегодня ее Вы удалили.

    Пришлите пожалуйста новую версию, заранее благодарю.

    Reply
  6. DonAlPatino

    (5) Новая версия сейчас прикреплена к публикации.

    Reply
  7. rusat

    Да, но мне придется дважды оплатить скачивание!.

    Reply
  8. DonAlPatino

    Пришлите ваш e-mail в личку

    Reply
  9. rusat

    А как это в «личку?»

    Reply
  10. DonAlPatino

    нажмите не DonAlPatino и выберите «Написать»

    Reply
  11. sajmon

    Типовым функционалом автоматизированной рассылки отчетов не получится реализовать данный подход? При приеме на работу можем каждому сотруднику задать e-mail, а при начислении получаем печатную форму.

    Reply
  12. DonAlPatino

    (11) Ну попробуйте 🙂 У нас не получилось в 3.0, в 3.1. типовой не смотрел, т.к. обработка решает еще некоторые задачи.

    Reply
  13. sajmon

    На основе рассылки отчета Расчетный листок. В качестве сотрудника достаточно указать Получателя, а список Получателей сформировать на основе списка сотрудников, с заполненными контактами. Выбор формата файла, пароли — есть в стандартном варианте рассылки. Какие еще задачи решили за счет обработки?

    Reply
  14. DonAlPatino

    (13) Вы описание читали?

    Ключевая особенность — при формировании расчетных листков:

    a. Показывается процент северной надбавки

    b. Показывается детализация по регистраторам (например, одна и та же премия будет выведена несколькими строками, если она начислена разными документами)

    c. Показывается период, за который проведено начисление.

    Можно настроить журналирование результатов рассылки.

    Там еще есть выгрузка РЛ на корпоративный портал в личный кабинет сотрудника.

    И да, рассылающий бухгалтер может не включать мозг, а просто жать на кнопку и все уедет в нужном формате с нужными данными. Это вообще киллер-фича

    Reply
  15. vakorp

    В последнем релизе ЗУП северную не показывает.

    Reply
  16. DonAlPatino

    Я поставлю себе в план. Сорри — времени совсем нет 🙁 Как раз последствия перехода на 3.1.8 разгребаем…

    Reply
  17. user984981
    Добавляем контанту КаталогСохраненияРасчетныхЛистков. Вписываем туда путь типа «c:payroll»

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

    Reply

Leave a Comment

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