<?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='\
весьма неплохо…
Спасибо.
Спасибо, пригодится
Подразделения вытягивает по трудовому договору, удобнее по подразделению места работы было бы получить информацию
(4) Гость, Даже не удобней… а правильней по срезу последних РС.РаботникиОрганизаций
если было перемещение между подразделениями, то только регистр сведений даст реальную информацию
(5) dock, Да, вы правы. Доработал отчет, теперь подразделения берутся из регистра.
основной отпуск и дополнительный как-то выделяются?
(7) rasswet, Нет, считается общий остаток как в стандартном отчете 1С
А возможность отбора по полям отчета есть? Например по сотруднику, подразделению и т.д. (просто скачал один отчет, где такой возможности нет)
(9) Патриот, да. Отбор по любому полю можно задать в настройках
Здравствуйте! Похоже, что в Вашем отчете «Остатки отпусков» ошибка. В нашей компании ввели доп. отпуск с 01.09.2013. Сотрудников перевели кадровыми перемещениями на вредную должность. Ваш отчет учитывает доп. отпук для сотрудников, которые приняты на работу ранее, до даты 01.09.2013, доп.отпук им был не положен. Это неверно. Что скажете?
Запустил отчет по одному подразделению — отчет ушел в себя.
Отличный отчет, из всех что я смотрела, самый актуальный, информативный и действительно совпадают данные со встроенной обработкой. Сделан на СКД, за это отдельный плюс. Спасибо. Нужен срочно был, а со сложным механизмом расчета отпусков быстро этот отчет сделать не получится. Единственное что надо добавить сортировку, без нее очень долго формируется.
Все-таки нашелся один нюанс по отпускам по уходу за ребенком. Если отпуск прекращен раньше документом Изменений условий оплаты отпуска по уходу за ребенком, то у сотрудницы все-равно определяется состояние В отпуске по уходу за ребенком, потому что дата окончания состояния не меняется в регистре Состояние сотрудников организаций.
подразделение тоже неправильно выбирается, если человек перемещался с по, то отчет будет брать подразделение «с», хотя вполне должен брать «по» в зависимости от даты отчета, короче запрос надо менять.
и вообще, если мы формируем отчет на дату, почему данные о подразделении выбираются на последнюю запись регистра, а не тоже на дату? ну разве так можно делать?
Отличная, аккуратная работа! Побольше бы таких!