Зарплата и управление персоналом. Унифицированная форма Т-3 с сотрудниками




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

24 Comments

  1. rasswet

    если сотрудник например в декрете как отображается? его фио будет? (если флаг освобождать ставку установлен)

    Reply
  2. rasswet

    и второй вопрос. если ставок всего 3, и две заняты каково будет отображение этой ситуации?

    Reply
  3. SergArmy

    (2) rasswet,

    Reply
  4. SergArmy

    (1) rasswet, Да он все равно будет отображен, даже если флаг освобождать ставку установлен, ведь это временное освобождение ставки. А вообще для разных задач могут быть разные реализации, мне нужно было полный список сотрудников и вакантных мест… Но при необходимости это можно поправить.

    Reply
  5. rasswet

    (3) я правильно понял: будут выведены 7мь строк, в 6ти (первые столбцы идентичны будут) будет по одной ФИО, кто там сейчас, а в одной будет «вакансия»?

    другая ситуация. Если в вашем примере занято 5ть, а вакансий 2, то будет выведено две строки с «Вакансия». Верно?

    (4) ну в качестве развития вашего отчета можно сделать флаг настройку, что делать с освобожденными(возможно вашему заказчику это будет интересно). Либо отмечать это событие в самом отчете (примечание временно свободна после ФИО, например)

    у меня была как-то похожая задача на старых релизах ЗУП, если возникнет снова, наверное возьму ваш вариант за основу.

    Reply
  6. SergArmy

    (5) rasswet,

    Если в вашем примере занято 5ть, а вакансий 2, то будет выведено две строки с «Вакансия». Верно?

    Нет, будет 5ть строк с ФИО, где количество штатных единиц будет равно 1, и Одна строка с «Вакансия», где количество штатных единиц будет равно 2.

    (4) ну в качестве развития вашего отчета можно сделать флаг настройку, что делать с освобожденными(возможно вашему заказчику это будет интересно). Либо отмечать это событие в самом отчете (примечание временно свободна после ФИО, например)

    у меня была как-то похожая задача на старых релизах ЗУП, если возникнет снова, наверное возьму ваш вариант за основу.

    После сообщений (1) и (2), задумался над этим, но сейчас все расписано на несколько недель вперед, поэтому развитие отчета пока не планирую.

    Reply
  7. tamidi

    (4) а если на время декрета принят другой работник, ведь ставка свободна?

    Reply
  8. ves.Parnas

    (7) tamidi, как же ставка окажется свободной, если другой все таки принят ?

    Reply
  9. tamidi

    Проверила ситуацию из п.7, выводится ставка по штатному дважды, и с тем, кто в декрете, и с тем, кто на его месте. Может все-таки не выводить ставку при освобожении, даже временном. Или, возможно как-то помечать данную позицию, хотя тогда в общем итоге будет все равно завышенная сумма.

    Reply
  10. Гость

    А если штатное расписание заведено не полностью (отключен контроль штатного расписания), то выведется в список сотрудник из штатной расстановки?

    Reply
  11. SergArmy

    (9) tamidi, Заменил отчет на новый, теперь освобожденные ставки отображаются, но количество занятых штатных единиц равно нулю и в примечании описана причина освобождения ставки

    Reply
  12. SergArmy

    (10) Гость,

    А если штатное расписание заведено не полностью (отключен контроль штатного расписания), то выведется в список сотрудник из штатной расстановки?

    Да сотрудник занимающий, а так же временно освободивший, ставку попадет в список. Количество вакансий не будет отображено, если занимающих ставку сотрудников больше чем по штатному расписанию.

    Reply
  13. (@nek

    Что то не работает, пишет «Значение не является значением объектного типа (НаименованиеПолное)

    ОбластьШапкаДоНадбавок.Параметры.НазваниеОрганизации =ДанныеОрганизации.Организация.НаименованиеПолное;»

    Reply
  14. SergArmy

    (13) (@nek, Какой, у Вас релиз?

    Reply
  15. VeRkA

    Нужный отчет!!! Спасибо!

    Reply
  16. SergArmy

    (15) VeRkA, Пожалуйста 🙂

    Reply
  17. VeRkA

    (16) Тысячу раз СПАСИБО!!!!

    Reply
  18. franchisees

    Отчет очень нужный, но единственное, возможно сделать такое, например: в одном подразделении (подразделение1) имеется одна и таже должность (должность1). В штатном расписание заведено должность 1 (17.03.2014, оклад 2000,00) и должность 1 (18.03.2014, оклад 3000,00). В отчете выводится на текущий момент два раза должность 1 (то что надо !) но с одним окладом (2000,00). Можно ли чтобы оклады были согласно штатного расписание. Т.е. должность 1 — 2000,00 и должность 1 — 3000,00.

    Reply
  19. polo453

    скачал 05.09.2016,ошибка как в первом посте,

    «Значение не является значением объектного типа (НаименованиеПолное)

    ОбластьШапкаДоНадбавок.Параметры.НазваниеОрганизации =ДанныеОрганизации.Организация.НаименованиеПолное;»

    зуп релиз 2.5.108.1(типовой)

    Reply
  20. polo453

    супер, ни ответа ни привета)))

    Reply
  21. polo453

    сам исправил…

    Reply
  22. polo453

    у меня отчет при скачивании работал только при отборе по подразделениям, т.е. если отбор стоял в «не отбирать» , тогда ошибка

    «Значение не является значением объектного типа (НаименованиеПолное)

    ОбластьШапкаДоНадбавок.Параметры.НазваниеОрганизации =ДанныеОрганизации.Организация.НаименованиеПолное;»

    Reply
  23. polo453

    по любому, АВТОРУ спасибо)))

    Reply
  24. Анастасия1978

    (22) polo453, Спасибо огромное!

    Reply

Leave a Comment

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