Резерв отпусков по основному и дополнительным в днях с суммами(2 варианта отчета)




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

29 Comments

  1. TrinitronOTV

    1. Было бы хорошо предусмотреть вывод отчета не только с группировкой по подразделениям, но и без этой группировки (простой список с выводом по алфавиту).

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

    3. По некоторым сотрудникам выводит документы на отпуск, а по некоторым почему-то не выводит, хотя документы есть согласно отчета «Справка по отпуску сотрудника»

    4. И последнее, при открытии группировки по документам они не открываются при кликаньи мышкой

    В целом хорошо, спасибо Вам

    Reply
  2. TrinitronOTV

    и ещё не обратил внимание:

    1. есть строчки с сотрудниками, где нет ни одной цифры в строке

    2. есть строчки, где дни указаны, а средний заработок не расчитан, соответственно нет и сумм резерва

    Reply
  3. tvg258

    Спасибо за комментарий:) Я сразу сказала — сделала на основе готового отчета — поэтому группировку оставила — нужно было сделать быстро.

    Про форматирование сумм — при форматировании суммы округляются всегда.

    По отпускам у меня не было такой ситуации -у вас настройки учет вести по кадровым или расчетным документам? У нас по расчетным. Про кликанье мышки вообще не поняла. Проверила еще раз — открытие по уровням группировок, открытие по «+» — везде работает.

    Reply
  4. tvg258

    У меня такой сотрудник тоже был — это женщина, у которой уже 2 года нет начислений

    Reply
  5. TrinitronOTV

    есть строка «Детали», где написано «Основной ежегодный отпуск C 01.12.13 По 30.11.14» — я по этому месту кликаю мышкой, а документ по этому отпуску не открывается

    ещё прочтите мой предыдущий комментарий, я его изменил

    Reply
  6. TrinitronOTV

    (4) у меня такой сотрудник работает нормально, т.е. есть оклад и премии каждый месяц

    Reply
  7. tvg258

    Нулевые да -спасибо, сейчас уберу. Выставлю заново.

    Reply
  8. TrinitronOTV

    существенно: «есть строчки, где дни указаны, а средний заработок не рассчитан, соответственно нет и сумм резерва», хотя штатный механиз рассчитывает средний заработок

    Reply
  9. tvg258

    Кстати — выставила картинку без округления, а в отчете округляется до 2 знаков — если вы про это.

    Reply
  10. tvg258

    Вот у меня и был такой сотрудник где дни есть, а сумм нет -потому что в декретном третий год — я отложила на потом это.

    Reply
  11. TrinitronOTV

    (10) ок, спасибо

    В целом мне понравилось, буду ждать от Вас доработок по этому отчету

    Reply
  12. TrinitronOTV

    у Вас на третьем скрине суммы в колонке «Всего резерв» имеют 4 разряда

    Reply
  13. tvg258

    Я написала — скрин сделан в процессе — в отчете, который выставлен суммы округляются до 2 х знаков:)

    Reply
  14. TrinitronOTV

    (13) ок, буду ждать дальнейших улучшений данного отчета, так как он для нас актуален

    Reply
  15. tvg258

    Хорошо. Но по мере возможности. Сейчас я проблему закрыла и пошла отчетность в ПФР — а у нас ее много

    Reply
  16. TrinitronOTV

    Столкнулся вот с этим: когда ставлю отбор по подразделению -> равно -> какое-то подразделение, то отчет не формируется, а если установить статус «в группе», тогда формируется

    Reply
  17. tvg258

    Заменила отчет — добавила форматирование, округление, убрала сотрудников, если нет остатков отпуска. Посмотрю выборку по подразделению:)

    Reply
  18. tvg258

    Проверила выборку подразделения — у меня все работает. У нас в базе 8 организаций, все организации имеют сложную структуру — работает. А вы организацию и дату выбрали при этом?

    Reply
  19. TrinitronOTV

    (18) конечно организация и на какую дату заполнено и при галочке напротив подразделения выбрано «равно» и выбрано само подразделение и получается таблица пустая, а если заменить на «в группе», тогда формируется отчет

    Reply
  20. TrinitronOTV

    да, забыл сказать, у нас в базе организация одна

    Reply
  21. TrinitronOTV

    (18) виноват, с подразделениями всё нормально, не обратил внимание при выборе подразделения на то, что это подразделение тоже оказалась папкой

    Reply
  22. tvg258

    Обнаружила ошибку — не удалялся документ отпуска, создаваемый для расчета средней зарплаты. Все исправила. Просьба к тем, кто воспользовался обработкой скачать заново.

    Reply
  23. TrinitronOTV

    спасибо, перекачал

    Reply
  24. tvg258

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

    Reply
  25. dock

    (22) эм… вылетает с ошибкой при удалении документа… «Не выбран объект»

    что-то не доправили ?

    Reply
  26. tvg258

    (25) dock, Простите при удалении чего?

    Reply
  27. tvg258

    Напишите подробнее — какой из отчетов и что происходит? У меня все работает

    Reply
  28. olsy

    ЗУП 2.5.118.1. Очень долго работает! Секунд 7 на человека. А у меня 3500 сотрудников :-(. Правильность проверяю…

    Reply
  29. tvg258

    (28)Быстрее не получается, если с суммами. Расчет отпускных быстрее не производится.

    Reply

Leave a Comment

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