Табель учета рабочего времени для Бухгалтерии 2.0




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

44 Comments

  1. m667v

    Работает

    Reply
  2. orehova123

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

    Reply
  3. orehova123

    возьму себе на заметку, думаю, пригодится

    Reply
  4. Программулькин

    у меня хелпером такое организовано, но тоже скачал, посмотреть как ты реализовал…

    Reply
  5. Ludmilka

    Скачала. А как установить? Расскажите подробненько, профессионалы.

    Reply
  6. Trek

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

    Reply
  7. Ludmilka

    Спасибо! Работает! Прикольно так!

    Reply
  8. olesechka

    Супер!!!

    Очень удобно! СПАСИБО ОГРОМНОЕ!!!

    Редко что-то толковое можно найти!!!

    Reply
  9. segen

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

    Reply
  10. Trek

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

    Reply
  11. ezupowam

    О! да это же целый ЗиК в бухгалтерии! А если еще отпускные и больничные добавятся — супер! Ждем. Еще бы вот формирование справок о зарплате…

    Спасибо.

    Reply
  12. Фред

    Скачал.Проверил. Восхищен!..)) Работает отлично. Даже если бы был голый табель, и то весьма полезная штука.

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

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

    А справка вообще выше всяких похвал! Даже такому темному буху, как я и то все понятно!

    Разработка заслуживает всяческого одобрения, а уж + сам Бог велел!

    Весьма рекомендую!

    Reply
  13. Фред

    Да… Для информации интересующимся: Опробовал на БП 2.0 Базовая (2.0.28.3)

    Reply
  14. ukgh

    Спасибо! Удобная вещь!!!!

    Reply
  15. Trin

    Доброго времени суток. Скажите а когда появится расчет больничных и отпусков? Стоит ли немного подождать или нужно самой велосипед придумывать? А так очень удачная идея. Спасибо.

    Reply
  16. olesechka

    Гениально!!!!!!!!!!! Спасибо огромное!!!

    Reply
  17. Trek

    (15) Trin, расчет больничных уже сделал, тестирую. Вообще я не зарплатник, поэтому если буду неправ поправьте меня.. Отпускные и коммандировочные считаются за период год, считая от даты отпуска/коммандировки. Расчет общего заработка вытянуть из базы не сложно, а вот количество отработанных дней, не учитывая дни отпуска/больничных невозможно. В бухии не хранятся больничные, отпускные и т.д. Есть идея реализовать так: сумму вытягиваем, а количество отработанных дней указывает пользователь вручную, еще больше автоматизировать это не могу придумать как. Если есть идеи, подскажите

    Reply
  18. dee35

    (17) Для расчета отпускных не нужно знать «Количество отработанных дней», может все-таки получится?

    Средний дневной заработок для расчета отпускных определяется по формуле:

    -В случае если расчетный период отработан полностью: Сумма выплат за расчетный период /( 29,4*12)

    -В случае если расчетный период отработан не полностью: Сумма выплат за расчетный период /Кол-во календарных дней в периоде.

    Количество календарных дней в периоде рассчитывается как 29,4 за каждый полностью отработанный месяц и кол-во отработанных календарных дней в месяце*29,4/кол-во календарных дней в месяце за каждый не полностью отработанный месяц

    Reply
  19. Dethmond

    Trek, спасибо! Новая версия с отпусками и отгулами будет?

    Reply
  20. Trek

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

    Reply
  21. dee35

    (20) не пойму зачем отработанные дни? мне кажется главное нужно знать дату приема на работу, например: Сотрудник принят на работу 20.01.2011, в январе заработал 10т, в феврале-марте не работал(не важно по каким причинам, допустим болел, получил б/л но его не учитываем), в апреле — октябре получил по 20т. С 10.11.2011 пошел в отпуск.

    Среднедневной будет = (10т.+20т.*7)/(12/31*29,4 + 9*29,4)

    Reply
  22. Trek

    например в апреле был отпуск 14 дней, а в мае больничный 5 дней, как их учесть в формуле?

    Reply
  23. KliMich

    СУПЕР! Очень изящно!

    Trek пишет:

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

    А если попробовать так.

    При закрытии принудительно сохраняем данные в файл (как по кнопке «СохранитьВФайл», но с «предопределенным» именем файла, например НазваниеОрганизации_Подразделение_Период.txt).

    Тогда можно накопить данные об отработанных, больничных, отпускных и командировочных для последующего более точного рассчета.

    Как другой вариант, можно эти недостающие данные заполнять в ТабЧасть (добавив доп колонки).

    Reply
  24. Trek

    Сейчас пока реализована колонка Средняя зарплата, данные оттуда идут в расчет коммандировочных и отпускных. Твой вариант хорош) я тоже про это думал, но дело в том, что данные берутся за весь последний год, соответственно пользователю придется перед началом работы создавать табеля за весь последний год помесячно, и сохранять в файлы. Пока лучше идеи нету)

    Reply
  25. bellaform

    Установил.Понравилось. Спасибо большое.

    Неплохо было бы доработать сохранение предыдущих табелей (чтобы иметь не только табели за предыдущие периоды, но вообще все расчеты: если понадобится уточнить табель, не потребуется заполнять его с нуля).

    С расчетом среднего заработка в «Бухгалтерии» заморачиваться, наверное, не стоит — для небольших предприятий нетрудно сделать небольшую табличку в Excel, а для кого этого мало — есть «Зарплата и Кадры». Все же это самостоятельная большая задача, уже решенная в отдельной программе.

    Reply
  26. agarkin

    +1

    Reply
  27. unis

    Класс!!! то что надо!!!! давно искала такую программку!!! Спасибо вам огромно!!!!

    Reply
  28. gutentag

    Замечание/Ошибка: Последний номер табеля не сохраняется.

    Рекомендую сделать номер иабеля = номеру месяца. А если табель составляется по подразделениям, то сделать составной номер, например: «номер месяца/номер подразделения»

    Reply
  29. Asenka

    А можно добавить колонку «Ставка» как в обработке-первоисточнике?

    Reply
  30. ILYA1C

    Спасибо, бухгалтера довольны)

    Reply
  31. artur_antipin

    Кто-нибудь для УТ пробовал табель учета рабочего времени делать?

    Reply
  32. dtitov

    Спасибо! Очень пригодилось.

    Reply
  33. kit

    А печатная форма есть?

    Reply
  34. Sadyga

    Хорошо сделано.

    Reply
  35. pps2715

    подскажите почему выскакивает такая ошибка: Метод объекта не обнаружен (ЗаработокДляВыплатыПособийСоцСтрахованияС2011года) как ее можно исправить? спасибо большое!

    Reply
  36. Trek

    Вохможно релиз старый, тестировался на 25 версии. У вас какой?

    Reply
  37. pps2715

    (37) да вы правы была конфигурация 2.0.14.5 обновился до 2.0.22.1 проблема исчезла, прошу прощения не догадался сразу сделать обновление, есть еще вопрос можно ли его как то привязать через меню дополнительные отчеты и обработки, я не знаю как и просто открываю файл через меню открыть файл. спасибо

    Reply
  38. vadimt_82

    Очень хорошо выполненная обработка. Удобная, наглядная. Бухгалтерия довольна

    Reply
  39. klop_v

    Все работает, пользуемся и отказались от xls-формы. Спасибо.

    Reply
  40. klima

    Спасибо за столь полезную обработку!!! Все замечательно, кроме одного «но»…

    Коды неявок такие как: «Р» (декрет), «ОЖ» (отпуск по уходу за ребенком), «ОЗ»(за свой счет),»ПР» (прогул) не считаются и не отражаются в графах 10,11 (12,13). Понятно, что они встречаются редко, но бывает)))..

    Возможно ли добавить эти коды?

    Спасибо!!!

    Reply
  41. 26178_mail.ru

    Скачал.Посмотрел, отличная задумка.

    Со всеми подробностями еще не разбирался, но зарплату начислил без проблем, заполняя табель.

    Больше обработок такого рода, легче жизнь, и на судьба. большое спасибо ++++++++++++++++++++

    Reply
  42. Светлый ум

    Классная весч — такие вещи надо продавать незадорого: всеравно будут качать.

    Reply
  43. bnw

    Идея отличная!

    Что такое Средняя зарплата и откуда ее брать?

    Reply
  44. ssn5810

    для БП 3 ???

    Reply

Leave a Comment

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