Остатки отпусков для ЗУП 2.5




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

    весьма неплохо…

    Reply
  2. swwb

    Спасибо.

    Reply
  3. Oks_a

    Спасибо, пригодится

    Reply
  4. Гость

    Подразделения вытягивает по трудовому договору, удобнее по подразделению места работы было бы получить информацию

    Reply
  5. dock

    (4) Гость, Даже не удобней… а правильней по срезу последних РС.РаботникиОрганизаций

    если было перемещение между подразделениями, то только регистр сведений даст реальную информацию

    Reply
  6. swwb

    (5) dock, Да, вы правы. Доработал отчет, теперь подразделения берутся из регистра.

    Reply
  7. rasswet

    основной отпуск и дополнительный как-то выделяются?

    Reply
  8. swwb

    (7) rasswet, Нет, считается общий остаток как в стандартном отчете 1С

    Reply
  9. Патриот

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

    Reply
  10. swwb

    (9) Патриот, да. Отбор по любому полю можно задать в настройках

    Reply
  11. FKLDOZ

    Здравствуйте! Похоже, что в Вашем отчете «Остатки отпусков» ошибка. В нашей компании ввели доп. отпуск с 01.09.2013. Сотрудников перевели кадровыми перемещениями на вредную должность. Ваш отчет учитывает доп. отпук для сотрудников, которые приняты на работу ранее, до даты 01.09.2013, доп.отпук им был не положен. Это неверно. Что скажете?

    Reply
  12. echo77

    Запустил отчет по одному подразделению — отчет ушел в себя.

    Reply
  13. ГердаКай

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

    Reply
  14. ГердаКай

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

    Reply
  15. Roman_Go

    подразделение тоже неправильно выбирается, если человек перемещался с по, то отчет будет брать подразделение «с», хотя вполне должен брать «по» в зависимости от даты отчета, короче запрос надо менять.

    Reply
  16. Roman_Go

    и вообще, если мы формируем отчет на дату, почему данные о подразделении выбираются на последнюю запись регистра, а не тоже на дату? ну разве так можно делать?

    Reply
  17. elian

    Отличная, аккуратная работа! Побольше бы таких!

    Reply

Leave a Comment

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