Остатки отпусков




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

8 Comments

  1. dock

    Итак, поехали

    1) что за столбец такой «працівник» ? а то буквы «К,Г,Д,Т,Х» как то вообще в тупик поставили…

    беру свои слова обратно, просто не сразу понял что это затертые фамилии работников… слишком уж аккуратно затер 🙂

    2) не совсем понятны столбцы «р.», «м.», «дн.» … это стаж сотрудника? правильно догадываюсь ? 🙂

    3)

    Отчет учитывает норму положено дней для сотрудников — 24 дня отпуска в году, для инвалидов 26 или 30 в зависимости от группы

    — каким образом учитывает ? через назначенные права на отпуск или в самом отчете заложен алгоритм ?

    4)

    Разработанный отчет в связи с необходимостью расчета отпускных работникам организации.

    а вот самого то расчета и нет в отчете 🙂 . Что бы не было непонимания — расчет отпускных подразумевает сумму… Ну это я уже так… перегибаю немного… не относитесь слишком серьезно…

    Reply
  2. Mellow

    (1) 2. р. — год , м — месяцев дн. — дней стажа (общее количество дней стажа).

    3. номра дней для каждой групи работников зашита непосредственно в коде в виде параметров запроса.

    4. Нужно было написать что на основании даных стажа и количеста положених и использованых дней бухгалтер считает отпускные работнику.

    Сам отчет не считает отпускные.

    Reply
  3. dock

    (2)

    3. номра дней для каждой групи работников зашита непосредственно в коде в виде параметров запроса.

    хм… а разве в этой конфе нет прав на отпуск ?

    УТП я не видел, потому и вопрос… просто обычно всё-таки сотруднику обычно назначают права на отпуск (основной, дополнительный и т.д.)…

    Прописывать такие вещи в отчете как-то слишком уж…

    4. Нужно было написать

    — да ничего не нужно было… это уже настроение такое, по придираться…

    Reply
  4. Mellow

    (3) Ну не знаю смотрел в карточке работника такой информации не нашол, потому и прописал ето параметрами в запросе.

    Reply
  5. script

    Отчет отличный и делает свою работу без доработок конфы.

    Но можно сделать и лучше.

    1. Количество положенных дней работнику можно вписывать в свойства и брать оттуда.

    2. Так же можно в свойствах указывать дату от которой начинать считать положенные и использованные дни. Потому что не все ведут этот учет от даты создания предприятия.

    3. Для предприятие с несложной ЗП пойдет, а там где есть все возможные варианты, все равно не взлетит. Потому что кроме декретных, может быть обычный перевод человека в другое подразделение с другими условиями труда, где положено будет не 24, а больше-меньше. И тогда нужно до перевода посчитать от 24, а после перевода — от нового числа. И это тоже еще не все — там еще есть кучка условий, при которых период нужно сдвигать. Я уже не говорю про то что у человека может быть несколько видов отпуска, совершенно различных.

    4. Для таких случаев я перекидываю этот блок из ЗуП. Но и после этого его нужно дорабатывать, потому что, как это ни странно, в ЗУП тоже эти нюансы не учитываются.

    А за отчет однозначно огромный +.

    Reply
  6. dock

    (5)

    4. Для таких случаев я перекидываю этот блок из ЗуП. Но и после этого его нужно дорабатывать, потому что, как это ни странно, в ЗУП тоже эти нюансы не учитываются.

    Как это в ЗУП не учитывается ??? Не пугайте вы так…

    Всё учитывается: в кадровых документах (прием на работу, кадровый перевод) указывается право на отпуск. Если кадровик не изменяет назначенные права на отпуск, то это уже его проблемы.

    З.Ы. Отчет хороший, но именно под указанную конфу. За публикацию автору однозначный плюс.

    Reply
  7. Mellow

    (5) В таком варианте как вы описали можно всю нужную информацию в свойствах указывать. Не проблема потом запросом витащить даные. Но в таком случае отчет будет менее универсальней для различных баз.

    Reply
  8. script
    Как это в ЗУП не учитывается ??? Не пугайте вы так…

    Всё учитывается: в кадровых документах (прием на работу, кадровый перевод) указывается право на отпуск. Если кадровик не изменяет назначенные права на отпуск, то это уже его проблемы.

    Я имею в виду, что ЗуП (во всяком случае украинская) не умеет сама сдвигать период начала при расчете остатка дней отпуска. Если например человек ушел в декретный отпуск или перевелся в другое подразделение, в котором количество дней положенного отпуска отличается от предыдущего.

    Reply

Leave a Comment

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