Проверка пересечения отпускных и больничных




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

9 Comments

  1. Zero_nv

    А почему бы не настроить нормально правила вытеснения? И если я не ошибаюсь продление или перенос отпуска на другую дату в связи с болезнью только по письменному заявлению сотрудника (что-то типо в связи с бользнью прошу продлить/перенести отпуск на). На предприятии работает около 2000 человек никто даж не думает что в этом может быть какая-то проблема.

    Reply
  2. Annett

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

    Reply
  3. Annett

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

    Reply
  4. нинас

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

    Reply
  5. Amras

    Разве кадровые документы не ругаются на пересечение периодов («Неявки и болезни» и «Отпуска организаций»)? Или сотрудник кадров не заводит второй документ (неявки)?

    Можно ведь настроить ЗУП на корректный ввод данных. Завели отпуск >> завели неявку >> а она ругается, что период отпуска ложится на нее >> делаем исправление документа отпуск (благо дело эта возможность в 2.5 есть) >> заводим документ неявки и документ-корректировку отпуска >> расчетчики обработкой «Анализ неявок» формируют данные по больничному листу >> строки отпуска сторнируются >> а вот дальше, надо и отпуск нам продлить расчетным документом (или, если не было ручных корректировок в коде, убрать строки сторно записей в б/л).

    Хотя кто знает, как настроили у вашего клиента конфигурацию.

    Reply
  6. Annett

    Amras ваш вариант конечно интересен. Но один небольшой вопрос: вы на практике это пробовали? Расскажите каким чудесным образом вы документом неявки и болезни вернете сотрудника не на работу, а обратно в отпуск? Конечно можно изменить конфигурацию. Ну а для кадровика конечно вообще эта возня с корректировками очень неудобна. Почему пользователь должен сидеть с календарем и высчитывать сколько отпуска «съел» больничный и насколько продлить? Все можно сделать просто и изящно без нагромождения лишних документов.

    Reply
  7. Amras

    Конечно. Мы таким способом и работаем. ГУП «МОСГАЗ» — штат порядка 4000 человек. Я еще раз повторюсь, в ЗУП есть «Исправление документа» (в том числе и кадрового). Если прописать механизм автоматического переноса отпускных, то проблем вообще не будет. А если ничего не делать, тогда так:

    — Работник в отпуске с 1 июня по 14 июня

    — В период с 10 по 18 июня он болел, о чем имеется б/л

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

    Но если клиент не хочет этого, он может мучаться и делать как и прежде.

    А нагромождать тут ничего не надо, если весь механизм заложить в документ «Неявки и болезни»:

    — Добавить дату «по»

    — Добавить «номер б/л»

    — Немного откорректировать процедуры движения документов

    — И желательно домучать обработку «Анализ неявок» (ну кривая она в типой конфе)

    И клиент доволен будет и вам вопросов меньше станет.

    Reply
  8. mart-sha

    Только хотел писать аналогичную обработку, ну думаю дай-ка поисчу на Инфостарте и бац , то что дохтур приписал. Спасибо !! Кстати у нас галка «Контролировать пересечение периодов» отключена по идейным соображениям, есть собственный документ по учету Бригадных нарядов с учетом Северных и Районных коэфициентов, а виды расчетов он использует с «Фиксированной суммой». Кроме того можем начисляем(доначислять) несколько раз в месяц, поэтому галку отключили, но в результате не контролируем пересечение больничных с отпускными, проэтому Ваша обработка в самый раз !!

    Reply
  9. pattyx

    Amras, пожалуйста, подскажите, как настроить в ЗУП, чтобы при проведении кадровые документы ругались?

    Кадры утверждают, что раньше кадровые «Неявки и болезни» не проводились, ругались, если для сотрудника был введен документ «Отпуска организаций»). Скажите пожалуйста, так ли это, если существует типовой механизм, то как его настроить?

    Нашла тут же на форуме Подписку на событие, но хотелось бы без дописок, если это реально… Спасибо!

    Reply

Leave a Comment

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