Справка в службу занятости (новая для ЗиК 7.7)




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?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='\

11 Comments

  1. rimma_n

    Замечение:

    1. График работы у вас берется из сотрудника. Кадровики очень часто при приеме на работу не заполняют закладку Прочее документа Приказ о приеме на работу. Соответственно, график работы берется из константы ОсновнойГрафик. Отсюда видно, полная либо неполная неделя, можно выудить продолжительность рабочего дня по графику.

    2. Полный либо неполный день определяется из ставки, занятой сотрудником. ставка=1, значит полный рабочий день по графику работы сотрудника (например при 40-часовой 5-дневной рабочей неделе это 8 часов), ставка=0,5 — половина рабочего дня (например, 4 часа) и т.д.

    Спасибо за обработку. Хотелось бы, чтобы были устранены недоработки 😀

    Reply
  2. WiseSnake

    (1) Спасибо за комментарий!

    1. Приму к сведению. Я все приучил все заполнять. Это просто сделать по этому сделаю в след релизе.

    2. Я не совсем согласен, сотрудник может работать на полном графике, но получать 0.5 ставки, я видел такие вещи. Зависимость рабочего дня от графика просто самый частый случай. А если это шестидневка при 40 часовой? А если это 40-часовой 5-дневной рабочей неделе (другой то не поставить), но график по 13.5 часов? Если это 36 часовой 5-дневка то сколько часовая день?

    Reply
  3. rimma_n

    А если это 40-часовой 5-дневной рабочей неделе (другой то не поставить)?

    ну тут я не согласна. В справочники Графики Работы можно сколько угодно описать графиков с любой продолжительностью недели и любым типом рабочей недели. И каждому работнику назначить свой индивидуальный график. А полный/неполный рабочий день работника как раз регулируется ставкой (так делают грамотные кадровики). Назначьте работнику 0.5 ставки и сформируйте табель. при 8-часовом рабочем дне везде проставятся 4. Хотя не отрицаю, что кадровики такие изобретательные жутко. иногда такое замутят! 😎

    Reply
  4. Арчибальд

    (3) Дело не в кадровиках, а в ТК. Точнее, в стремлении чиновников контролировать каждый чих. Работнику от этого толку никакого, зато в министерствах штаты растут 😐

    Reply
  5. Гена

    (3) в наше кризисное время нельзя брать ставку за основу… на полгода предприятие имеет право вводить режим неполного рабочего времени, когда ставки так и остаются полнозаполненными единицами, а вот рабочая неделя уже не 40, а, например, 30 часов…

    по-хорошему, не хватает нового реквизита коэффициента полноты рабочего времени, тем более, что с 2011 года при новом расчёте б/л он строго понадобится…

    Reply
  6. Andrey3443

    установил пишет что делать

    БазаНевыходов.ДобавитьЗначение(ВидРасчета.ОплатаДнейДоноров);

    Reply
  7. Гена

    (6) с 302 релиза добавили

    Reply
  8. WiseSnake

    (5)(6) Угу

    В 8ке есть такой реквизит, а вот в 7ке пока что «трабла», я могу конечно пока к ставке привязать, если это кому нибудь нужно )))

    Reply
  9. WiseSnake

    (1) Поправил получение графика, сделал зависимость рабочих часов от ставки.

    Reply
  10. rimma_n

    Спасибо 🙂

    Reply
  11. korida

    ставлю плюс

    Reply

Leave a Comment

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