Отчет по очередным отпускам




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

35 Comments

  1. rdm

    «клетки этого цвета расшифруются» — использованные дни не расшифровываются!

    «годовые периоды работы» — не показывает периоды. Только сотрудник и дата приема. При «расшифровке» проваливаюсь в карточку сотрудника, а хотелось бы как раз периоды увидеть.

    Reply
  2. 010280

    Да, желтая клетка где ФИО сотрудника выводит в карточку сотрудника в любом варианте.

    Если используется режим <По всем сотрудникам>, тогда Сводные данные, расшифровка

    Периодов в поле <Использовано>, то же самое, если сформирована в режиме <По списку сотрудников>, то выводится расклад всех периодов. А там увидите еще желтые клетки.

    Так как, модуле использованы стандартные параметры Журнала зарплата, то от релиза конфи не должен завесить , и использована локальная обработка ячейки. Я уж еще раз проверил. Если все таки проблемы вышли MD, протестирую.

    Reply
  3. rdm

    Приношу свои извинения. Все работает. Видимо сбой был в программе. Обработка отличная. Спасибо!

    Reply
  4. rimma_n

    Хорошая обработка. что примечательно, учитывает документы-исправления 🙂

    Reply
  5. Nativan

    Удачная обработка! Спасибо, пригодилась.

    Reply
  6. ju7ivanova

    Обработка понравилась.

    Но возник вопрос, почему ВНУТРЕНННЕМУ совместителю ставится половина отпуска?

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

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

    Reply
  7. gucci76

    Можно подключить этот отчет без доработки документа «приказ по отпуску» используя механизм описанный здесь:

    http://infostart.ru/public/79583/

    Reply
  8. 010280

    почему ВНУТРЕНННЕМУ совместителю ставится половина отпуска?

    Значит у него в истории 0.5 ставка

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

    Reply
  9. 010280
    gucci76 пишет:

    Можно подключить этот отчет без доработки документа «приказ по отпуску» используя механизм описанный здесь:

    http://infostart.ru/public/79583/

    Конечно.Внедри Константа.КаталогВнешнихФорм и включай Отчет по отпускам StarterExtForms.ert,

    Я лично это не использую, так и так приходится изменить конфи и лазит в допонительные возможности,

    а внедрил в Документе <ПриказОбУвольнении> установил кнопку <Поазать дни>, так как именно это место

    очень возмущает уволняющих.

    Reply
  10. gucci76

    (9) Я конечно не настаиваю на (7). Но могу сказать несколько плюсов (7):

    1. Сделав 1 (ОДИН) раз изменение в глобальнике (2 места) и парочкой новых обработок можно к ЛЮБОМУ документу, без его изменения подключать различные отчеты и обработки, а возможности скрыты в них очень и очень большие, главное иметь прямые руки!!!

    2. Изменения в глобальнике позволяют немного убыстрится ЗиКу (для больших и медленных баз это заметно).

    Решать пользователю!

    Reply
  11. 010280

    gucci76 Согласен.

    Reply
  12. Ироида

    Спасибо! Очень пригодилась!

    Reply
  13. Nady_71

    Хорошая обработка. Спасибо-очень пригодилась.

    Reply
  14. TrinitronOTV

    спасибо за отчет

    Reply
  15. kurvik

    Спасибо.Отчет интенсивно используют и бухгалтера и кадровики

    Reply
  16. TrinitronOTV
    TrinitronOTV пишет:

    спасибо за отчет

    а у меня почему-то по некоторым документам начисления отпуска идёт задвоение количества использованных дней, а в расшифровке показывается два раза один и тот же документ

    Reply
  17. 010280
    TrinitronOTV пишет:

    а у меня почему-то по некоторым документам начисления отпуска идёт задвоение количества использованных дней, а в расшифровке показывается два раза один и тот же документ

    (16) TrinitronOTV, (16) TrinitronOTV,

    Очень интересно. Причин может быть два: 1)База требует полной индексации, 2)запись в журнала ЗП Отпуска очередного является перерасчетом другой записи прошлого периода. Если последняя, то в модуле я его не учитывал,

    просто живым примером не встречался в проведениях по отпускам.

    Reply
  18. TrinitronOTV
    010280 пишет:

    TrinitronOTV, Очень интересно. Причин может быть два: 1)База требует полной индексации, 2)запись в журнала ЗП Отпуска очередного является перерасчетом другой записи прошлого периода. Если последняя, то в модуле я его не учитывал, просто живым примером не встречался в проведениях по отпускам.

    спасибо за разъяснение

    Reply
  19. orsprog

    Обработка работает хорошо…а главное пригодилась на деле, спасибо

    Reply
  20. keysnofelet

    спасибо, посмотрел один из вариантов

    Reply
  21. Мать Тереза

    Спасибо, использовала,когда искала работников без отпусков- официально надо проводить отпуска ,а там по факту-как хотят.

    Reply
  22. kler

    Спасибо, отличный отчет

    Reply
  23. haous

    Спасибо. Собираюсь написать такой же отчет для ЗУП 82, может кто подскажет есть ли он уже реализован.

    Reply
  24. Nikola178

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

    Reply
  25. 010280

    (24) Nikola178,

    Обработка называется <Отчет по очередным отпускам> и учет ведется по виду расчета <Отпуск очередной> из Журнала

    расчетов <Зарплата> и она дает возможность определить количество дней неиспользованного очередного отпуска для возмещения, в случае увольнения и т.п.. Отпуск за свой счет не относится к регламенту, это воля администрации и сотрудника и нет необходимости ввести учет по нему. Модуль открыто, и заменить отпуск очередной на отпуск за свой счет не представляет трудности.

    Другое дело, только недавно столкнулся ошибочным результатом при обращении функции <глПолучитьТаблицуИсторииРеквизитов>(глобальный модуль): если внештатника уволили и тут же приняли в штат, то выдается, что он не работает и соответственно чел-дни далее не нарастают. Пришлось добавить своею подобную функцию локально. Обновление выставлю как будет время и если не затормозят.

    Reply
  26. 010280

    (24) Nikola178,

    Извините Никола, Я в торопясь с первого раза не совсем осознал суть вопроса <учитывается ли отпуск за свой счет при расчете…>, сегодня выставлю обновление, где предусмотрен флажок <Исключить Отпуска за свой счет из Отпускного стажа>. Конечно скорость обработки чуть повысилась, но выбор варианта предусмотрел и в расшифровке.

    Спасибо.

    Reply
  27. JER_MARK

    Прикольно получается, если сотрудник принят на работу скажем в 69 году (ну бывают такие ветераны на предприятиях) ему стаж берется от 1969 года и неиспользованных отпусков — страшно сказать, более тысячи дней. Короче, надо как-то выкрутиться и ставить расчет количества дней выбирая между датой приема и началом учета в программе. Наверное так. Если дата приема < даты начала учета, то брать дату начала учета.

    Reply
  28. gucci76

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

    К этому отчету можно и расчет резервов прикрутить.

    Reply
  29. NPMar

    Хорошая обработка. Спасибо! Надеюсь очень пригодится.

    Reply
  30. 010280

    (27) JER_MARK,

    Спасибо, учел Ваше предложение и обновил, в моей практике такое не встречалось.

    Reply
  31. 010280

    (28) gucci76,

    Мы тут работаем только типовой конфигурацией, модернизация — это другая тема.

    Reply
  32. gucci76

    (31) Новые метаданные никак на типовизну (с точки зрения обновления) не влияют.

    Или у вас базовая?

    Reply
  33. 010280

    (32) gucci76,

    Не издевайся, профессионал, не доведи до спама. (Для пользователей только отвечу, структуры конфигураций что проф, что базовая одинаковы).

    Reply
  34. gucci76

    (33) С чего взял, что издеваюсь? Я серьезно. Кстати, я даже не настаивал, а высказал свое мнение (ИМХО).

    В базовую добавить ничего нельзя. А в проф можно. Что я без раздумья делаю, т.к. при обновлении это никак не сотрется. А типовые объекты 100 раз проанализирую прежде чем изменить.

    А в ЗИКе я давно уже «специалист» ))))

    Reply
  35. skurser

    спасибо, полезная обработка

    Reply

Leave a Comment

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