Отчет по учету рабочего времени




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

26 Comments

  1. WiseSnake

    Скриншоты в студию, пожалста…

    Reply
  2. Craig

    скриншоты будут завтра

    Reply
  3. @lex

    Постенько, полезно… Только есть пунктик — если у сотрудника переходящий больничный, к примеру, или невыходы, то количество дней берется общее, а не за период, который попадает в отчет 🙂

    Reply
  4. luns

    Автор. Потратьте пожалуйста немного времени на оформление разработки.

    Не понятно даже для какой платформы из описания. Добавьте скриншотов.

    Reply
  5. Craig

    (3) @lex 25.05.2009 03:25:00. Иногда простое — самое эффективное (хотя, я бы не назвал его простым) . На счет пунктика вы не правы, если б в открыли модуль то увидели расчет идет путем вытеснения, и кол-во больничных, отпусков и командировок отражает только за тот период в котором они предоставлены ( к примеру отпуск 20 дней в январе и 8 дней в феврале будет отражен соответственно по периодам)

    Reply
  6. @lex

    А у меня в отчете — и Больничный и Невыходы полностью отражаются 🙂 В модуль не глядел :). У меня вот переходящий больничный в отчетном месяце — 4 дня, все остальное в следующем.. а в отчете — 30 дней, причем 30 дней больничного и 30 дней невыходы за тот же период… все в куче… И последняя строка на странице после должности переезжает на следующую… :).

    P.S. Насчет модуля — по опыту — бухам и кадровикам с экономистами до лампочки, что там делается и как 🙂

    Reply
  7. Craig

    Странно, а как у вас обычный табель Т-13 заполняется!? Только что рассмотрел все случаи по переходящим больничным ( когда 12 в одном месяце — 5 дней в другом, и когда человек 2,5 месяца находился на больничном) все правильно показывает. Может быть у вас выбран период, в котором записи еще не рассчитаны!?

    Строчку переезжающею исправил) Спасибо за замечание

    Reply
  8. teplova

    У нас суммированный учет рабочего времени, повременно-премиальная оплата по окладу по часам. Итого: ночные часы не заполнены ни у кого; праздничные — вообще абстрактная цифра ,иной раз больше чем отработанных часов; в отчет попадают давно уволенные сотры.

    Reply
  9. Craig

    Tatiana, я не совсем понял вас. Ночные и сверхурочные берутся из документа «табель рабочего времени», а выходные и праздничные из документа «Работа в праздничные дни» Я делал это с той целью — что не все предприятия оплачивают выходные дни и сверхурочные. Если бухгалтер их показал, тогда пусть они попадут в отчет… У меня эти показатели работают нормально, а у остальных как??? Что касается уволенных сотрудников, у меня на работе текучка маленькая — я не посчитал нужным их исключать из списка в отчете, да и к тому же, тот кому нужны только работающие сотрудники — может воспользоваться кнопкой «Заполнить». А про абстрактную цифру можно по подробней ?!

    Reply
  10. Lady-mo

    Ночные и сверхурочные бурутся из табеля и все правильно…

    А вот на счет Праздничных…

    У меня тоже выходные и праздничные считаются неверно..

    3 документа, каждый на 1 день

    Смотрю в журнале расчетов: 3 раза по 1 дню (по 8 часов), т.е. всего в отчет должна выйти цифра 3 дня или 24 часа

    В отчете праздничных и выходных всего 10. Откуда? Почему??

    Видимо, эту абстрактную цифру имели ввиду…



    Да и еще… как график работы у сотрудника менялся в середине месяца

    то есть на начало норма времени одна, потом другая в отчет попадает соответсвенно последняя… к этому претензий нет…

    А вы можете мне лично рассказать, как в таком случае считать отклонения от нормы?

    Бухи мне почему-то не признаются..

    Заранее благодарна!

    Кстати. в целом отчет — замечательнейшая штука! Плюс

    Reply
  11. Lady-mo

    Во.. еще небольшой глюк поймала — сверхурочные не очищаются..

    Reply
  12. AS108

    Скачала, протестировала — очень практичная вещь! Глюков пока замечено не было, если будут — сообщу. Успехов Вам!

    Reply
  13. Craig

    Сверхурочные подправил, спасибо. Что касается праздничных — не могу понять от чего может произойти такое, вроде бы все должно работать отлично, но раз вы сказали — буду разбираться…Может вы мне подскажите, принцип программки такой, сначала смотрим у сотрудника есть Доплата за праздничные или нету, если есть открываем документ «Приказ о работе в праздничные и выходные дни», находим строчку в которой сотрудник присутствует и запоминаем колонку «Всего часов» …

    По поводу «на начало норма времени одна, потом другая в отчет попадает соответственно последняя… » Карл Маркс сказал «Есть лож, есть наглая лож и есть статистика» мне кажется к таким надо относится так как у них выходит последний график ( Я знаю что это не совсем логично, но кто накажет за это?! )

    Reply
  14. kirill_11

    Круто, сам делаю такой же…

    толко хотел еще расшифровку по ячейкам сделать, чтобы по дням месяц выводился….

    даже код практически один)

    Reply
  15. Craig

    (14) Рад буду если моя обработка чем-то поможет, убил на голове не мало волос чтоб все красиво работало и не сильно грузило операционку. А основа как у всех — одна — стандартный табель ЗиК. А зачем по дням делать ? тогда отчет полукилометровый будет бррр…аж страшно стало. 😀

    Reply
  16. kirill_11

    расшифроку ячейки сделать и все! удобно же….

    бух захотел посмотреть откуда цифра взялась, нажала, открылся отчет за данный месяц по дням….. ) круто же)

    Reply
  17. Kruzo

    Досадно, но в ЗиК306 в отчет попадают лишние люди, которые давно уволились

    Reply
  18. Craig

    (16) хотел бы посмотреть на то что у Вас получилось.

    Reply
  19. Nady_71

    Скачала, протестировала — очень практичная вещь! Ошибок пока замечено не было, если будут — сообщу. Читается намного удобнее, чем табель),особенно для руководителей).У меня вообще большинство сотрудников на индивидуальных графиках-поэтому для выверки фактических выходов и запланированных по графикам-очень удобная и полезная вещичка оказалась. Успехов Вам!)

    Reply
  20. Craig

    (19) Спасибо очень приятно

    Reply
  21. son555_555

    а отчет формируется по табелю учета рабочего времени? У нас такой табель не ведется, и что делать

    Reply
  22. Craig

    (21) если у вас не ведется учет по табелю,то предположу что у вас все работают по графику, тогда есть два варианта. Первый начать вести табель (создается 1 табель на месяц по всем сотрудникам и нажатием кнопки заполнить автоматически по всем заполнятся). Второй вариант самим исправить обработку, в принципе это не сложно, можно взять модуль автозаполнения табеля и вставить в процедуру формирования отчета. Удачи

    Reply
  23. dicwork

    Интересная разработка — спасибо автору. Только один вопрос — для какой версии ЗиК она разрабатывалась? Я уже сталкивался с тем, что обработки разработанные для ЗиК России не подходили к конфигурациям для Украины. Плюс поставил.

    Reply
  24. Craig

    (23) Для России

    Reply
  25. akula

    Удобно и помогло

    Reply
  26. vovkakursk

    Очень нужный и хороший отчетик

    Reply

Leave a Comment

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