<?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='\
интересно бы было видеть по рабочим периодам, право, факт взял, и остаток
(1) rasswet, была мысль сделать по рабочим годам, но в процессе создания отчета понял, что запрос в этом случае получается раза в 2 сложнее. Поскольку во времени я был ограничен, пока пришлось отложить данную задачу.
Добавил вариант отчета по рабочим годам
На скрине количество дней основных отпусков что-то уж большое. Они что, в отпуск по несколько лет не ходили? Или как понять такие большие цифры, не могли бы пояснить?
(4) Boroda, скриншот сделан в демо-базе. Использованных отпусков там, действительно, практически нет.
вариант отчета по рабочим годам не катит. нерабочий в принципе, лучше убери
(6) PoVV, готов выслушать конструктивную критику. Убрать никогда не поздно. Интереснее разобраться, в чём проблема. Ведь из 9 скачавших, пока только 1 высказал претензию, причем без особых обоснований. Единственное известное мне неудобство этого варианта заключается в следующем. В использованных отпусках переходящие рабочие года не дробятся, если они были зарегистрированы одним приказом на отпуск. Но это, скорее, особенности хранения данных в ЗУП 3.0. Если есть другие замечания по работе этого отчета, пишите.
(7) Очень коротко- все несколько сложнее. Разработчики ЗУП 3.0 не ищут легких путей.
Прими на работу сотрудника, потом через год и два месяца отправь его в отпуск на 30 дней.
Потом сформируй отчет и сразу все увидишь.
(7) В общем, надо курить функцию ОстаткиОтпусков.ОстаткиОтпусков()
(8) PoVV, воспроизвёл ваш пример. Принял сотрудника на работу 01.01.2013, отправил отпуск 01.03.2014 (на эту же дату сформировал отчет). Проблема получается ровно та, о которой я написал в предыдущем сообщении: заработанные отпуска идут отдельно за 2013 г. и 2014 г., а использованные без разбивки: 2013-2014 гг.
(10) Извини, не прочитал внимательно (7). Все так, на мой взгляд эта проблема убивает смысл такого варианта.
А ведь сделать по-нормальному можно, в функции ОстаткиОтпусков()выполняется необходимый расчет.
(9) PoVV, вы почти правы. Использование этой функции дает остатки по рабочим годам (ненулевые), колонки с использованным отпуском там нет. И, собственно, я ею не пользовался при создании своего отчета.
(11) PoVV, в общем, я подумаю на досуге об устранении багов при сохранении имеющейся информации о заработанных и использованных отпусках за всё время ведения учета.
(12)В ТЗ, которую возвращает эта функция есть массив строк ТЗ с полем «ДанныеРасчета». В данных расчета есть фактические отпуска.
+(14) При формировании печ формы «Справка по отпускам сотрудника» в функции СправкаПоОтпускамСотрудника() все, что надо делается.
(15) PoVV, не всё там есть. Окончательной разбивки отгулянного отпуска по рабочим годам нет ни в массиве ДанныеРасчета, ни в справке по отпускам сотрудника. Её всё равно придётся допиливать. При разработке данных отчетов хотелось получить остатки полностью по данным регистров полностью на СКД. На сегодняшний день понимаю, что без этого никак. Помимо того, что уже озвучено в комментариях, есть ещё ряд причин, почему следует пользоваться именно расчетом.
(16) согласен
вариант отчета по рабочим годам не катит. Нерабочий в принципе.
Добрый день!
Спасибо за обработку, очень бала нужна нашему кадровику. А ка е можно в программу (ЗУП 3.0) добавить?
Спасибо
(19) LadyLulu, пока отчет можно открыть только через меню «Файл — Открыть».
Как ранее писал PoVV, в отчете есть определённые ошибки. Планирую их исправить в течение ближайших недель. По составу полей получится что-то среднее между существующими двумя отчетами. Заодно добавлю в модуль «Сведения о внешней обработке», чтобы отчет можно было встроить в «Дополнительные отчеты и обработки».
Спасибо! Ждём))
(21) LadyLulu, выложил новую версию отчета «Остатки отпусков NEW, ЗУП 3.0»
Данные в этой версии собираются собираются с использованием функций общего модуля «Остатки отпусков». Красивой разбивки по рабочим годам не получилось, но остатки теперь выводятся корректно на любую дату. Также добавлены «Сведения о внешней обработке», позволяющие добавить отчет в справочник «Внешние отчеты и обработки».
Отличный отчет! Спасибо:)
Огромное спасибо! Будем пользоваться))
Спасибо, пригодилось!