Расчет остатков отпусков сотрудников




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

24 Comments

  1. sound

    То есть отличия от типового — это только алгоритм расчета?

    Reply
  2. ПСВ

    Вроде все корректно работает, вещь нужная 🙂

    Reply
  3. NDN

    Стандартный алгоритм вечно косячит от релиза к релизу. Написал как альтернативу для кадровиков.

    Reply
  4. sound

    (3) Понято. Тоже проверил, вроде работает, только оформление бы малость подправить или вообще на СКД сделать — и будет зашибись.

    Reply
  5. radian

    Учитывает ли отчет корректировки остатков дней отпуска, если ведение отпусков в программе началось, скажем в 2009-2010м годах, а работник был принят в 2005м или ранее, и за период с 2005 по 2009 кадровых приказов и движений по фактическим отпускам нет?

    Reply
  6. NDN

    radian, нет, не учитывает

    Reply
  7. RailMen

    Я для своих кадровиков реализовал что-то подобное, только в больших масштабах. Как нибудь опишу схему, если время позволит.

    Reply
  8. boogie

    суперский отчёт, особенно хорошо что свой алгоритм — для проверки встроенного

    Reply
  9. rasswet

    а) не учтено, что могут быть остатки отпусков.

    б) не учтено, что до 14ти дней при взятии отпуска за свой счет в течение раб года не удлиняет рабочий год. если более 14 дней, то раб год удлиняется.

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

    В целом понравилось. Натолкнуло на мысли взять одну процедурку себе. Написано внятно и понятно. За это и плюсанул.

    Reply
  10. lynx3009

    А что то подобное для Кофигурации: 1С:Зарплата и Управление Персоналом 8.2 есть?

    Reply
  11. rasswet

    (10) Переконвертировал под 82 и всё работает.

    Reply
  12. macaroon

    Обработка очень помогла! Большое спасибо!

    Reply
  13. macaroon

    Алгоритм очень точный, точнее чем встроенный механизм!

    Reply
  14. Fr1eNd_Tver

    Спасибо, огромное спасибо, меня кадровики замучили требуют именно такой алгоритм расчета, сначала как всегда решил посмотреть что есть готовое, очень помогло.

    Reply
  15. Konsult

    Обработка очень помогла, большое спасибо! Много данных в одном отчете, кадровики счастливы.

    Reply
  16. Helgaadr

    Спасибо большое! Удобный и наглядный отчет, кадровикам требовался именно такой!

    Reply
  17. AlexO

    а если сотрудник был уволен, а потом принят снова? как тогда? не путается в отпусках?

    Reply
  18. candy_sk

    Подскажите в конфигурации 1С:Зарплата и Управление Персоналом 8.2 работает?

    Reply
  19. NDN

    да, работает

    Reply
  20. Bacbka

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

    Reply
  21. msmaiorka

    Классно, однако, можно ли сделать так, чтобы отображалась компенсация отпуска. Раньше по Трудовому законодательству можно было выплачивать компенсацию отпуска, если количество накопленных дней отпуска превышает 28 дней, часть, которая свыше 28 дней можно было выплатить. Соответственно, тем, кому мы выплатили уже эту компенсацию, остатки отпусков считает неправильно.

    в 8.2 выдает ошибку

    {Форма.ФормаОтчета.Форма(375)}: Ошибка при вызове метода контекста (Выполнить)

    Результат = Запрос.Выполнить();

    по причине:

    по причине:

    {(8, 33)}: Поле не найдено «СостояниеРаботниковОрганизаций.УдалитьФизЛицо»

    СостояниеРаботниковОрганизаций.<<?>>УдалитьФизЛицо,

    Reply
  22. Foxux

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

    Reply
  23. NDN

    Foxux, поставленный «плюс» будет лучшей благодарностью 🙂

    Reply
  24. izz

    Очень нужная обработка. Переписала немножко, добавила то, что просил бухгалтер по ЗП. Теперь пользуются пользователи! Спасибо!

    Reply

Leave a Comment

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