<?php // Полная загрузка сервисных книжек, создан 2025-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) что за столбец такой «працівник» ? а то буквы «К,Г,Д,Т,Х» как то вообще в тупик поставили…беру свои слова обратно, просто не сразу понял что это затертые фамилии работников… слишком уж аккуратно затер 🙂
2) не совсем понятны столбцы «р.», «м.», «дн.» … это стаж сотрудника? правильно догадываюсь ? 🙂
3)
— каким образом учитывает ? через назначенные права на отпуск или в самом отчете заложен алгоритм ?
4)
а вот самого то расчета и нет в отчете 🙂 . Что бы не было непонимания — расчет отпускных подразумевает сумму… Ну это я уже так… перегибаю немного… не относитесь слишком серьезно…
(1) 2. р. — год , м — месяцев дн. — дней стажа (общее количество дней стажа).
3. номра дней для каждой групи работников зашита непосредственно в коде в виде параметров запроса.
4. Нужно было написать что на основании даных стажа и количеста положених и использованых дней бухгалтер считает отпускные работнику.
Сам отчет не считает отпускные.
(2)
хм… а разве в этой конфе нет прав на отпуск ?
УТП я не видел, потому и вопрос… просто обычно всё-таки сотруднику обычно назначают права на отпуск (основной, дополнительный и т.д.)…
Прописывать такие вещи в отчете как-то слишком уж…
— да ничего не нужно было… это уже настроение такое, по придираться…
(3) Ну не знаю смотрел в карточке работника такой информации не нашол, потому и прописал ето параметрами в запросе.
Отчет отличный и делает свою работу без доработок конфы.
Но можно сделать и лучше.
1. Количество положенных дней работнику можно вписывать в свойства и брать оттуда.
2. Так же можно в свойствах указывать дату от которой начинать считать положенные и использованные дни. Потому что не все ведут этот учет от даты создания предприятия.
3. Для предприятие с несложной ЗП пойдет, а там где есть все возможные варианты, все равно не взлетит. Потому что кроме декретных, может быть обычный перевод человека в другое подразделение с другими условиями труда, где положено будет не 24, а больше-меньше. И тогда нужно до перевода посчитать от 24, а после перевода — от нового числа. И это тоже еще не все — там еще есть кучка условий, при которых период нужно сдвигать. Я уже не говорю про то что у человека может быть несколько видов отпуска, совершенно различных.
4. Для таких случаев я перекидываю этот блок из ЗуП. Но и после этого его нужно дорабатывать, потому что, как это ни странно, в ЗУП тоже эти нюансы не учитываются.
А за отчет однозначно огромный +.
(5)
Как это в ЗУП не учитывается ??? Не пугайте вы так…
Всё учитывается: в кадровых документах (прием на работу, кадровый перевод) указывается право на отпуск. Если кадровик не изменяет назначенные права на отпуск, то это уже его проблемы.
З.Ы. Отчет хороший, но именно под указанную конфу. За публикацию автору однозначный плюс.
(5) В таком варианте как вы описали можно всю нужную информацию в свойствах указывать. Не проблема потом запросом витащить даные. Но в таком случае отчет будет менее универсальней для различных баз.
Всё учитывается: в кадровых документах (прием на работу, кадровый перевод) указывается право на отпуск. Если кадровик не изменяет назначенные права на отпуск, то это уже его проблемы.
Я имею в виду, что ЗуП (во всяком случае украинская) не умеет сама сдвигать период начала при расчете остатка дней отпуска. Если например человек ушел в декретный отпуск или перевелся в другое подразделение, в котором количество дней положенного отпуска отличается от предыдущего.