Автоматическое создание ведомостей на выплату зарплаты по статьям финансирования, статьям расходов, зарплатным проектам




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

14 Comments

  1. Svetlana_E

    А чем отличается от стандартного функционала?

    Reply
  2. mib7

    Странно 1С не предусмотрели такой возможности. Надеюсь они все таки добавят подобный функционал.

    Reply
  3. mib7

    (1) Какого стандартного функционала? Стандартного функционала (я имею ввиду автоматического создания сразу по всем банкам, источникам финансирования и статьям расходов) в ЗКГУ вообще нет. Все ручками нужно по-отдельности создавать. Здесь же: поставили галочку разбивать по статьям, выбрали способ выплаты например аванс или зарплата за месяц и жмете «Сформировать все ведомости» . Обработка вам сразу к примеру сотню документов создает. Когда у вас например 3 зарплатных проекта, 8 статей финансирования, 8 статей расходов итого 192 документа выплат трудно руками не ошибившись и не пропустив кого нибудь создавать.

    Reply
  4. Svetlana_E

    Не надо так усложнять.Далеко не все надо делать ручками, если знать программу. Из документа «Начисление зарплаты» отлично автоматически сформируется сразу по всем статьям финансирования и статьям расходов. А также это работает из отпуска и больничного.

    Reply
  5. mib7

    (4) боюсь что вы не понимаете проблемы. Я прекрасно знаю, что если не указывать конкретно статьи финансирования и расходов, то все формируется в один документ сразу по всем статьям. А вот вы попробуйте потом из него банковские файлы сформировать, когда финансистам необходимо на каждую платёжку отдельный файл. Платежи идут в разрезе банки-финансирование-расходы.

    Не все же такие счастливые и работают с одним заплатным проектом. У нас развели демократию и 3 банка с разными требованиями к файлам. А тут ещё правительство с своей отменой банковского рабства.

    Reply
  6. Svetlana_E

    Я отлично знаю эту проблему. И у нас много статей, но ведомости отлично формируются. И ведомости автоматически формируются по всем присутствующим в документах комбинациям «статья финансирования+статья расхода». У нас просто не бывает ведомостей выплаты с незаполненными реквизитами. И все эти ведомости отлично выгружаются в банки

    Написав в (4)

    сформируется сразу по всем статьям финансирования и статьям расходов

    я не имела в виду — в одну ведомость, а подразумевала — сразу все возможные варианты.

    Reply
  7. mib7

    (6) Ну значит банковские обработки у вас по другому устроены. Я бы тоже лучше бы не множил документы, но расчетчикам привычно, когда каждому файлу соответствует определеный документ.

    Reply
  8. mib7

    (6) а если документов начисление у вас не один а как у нас четыре, по числу расчетчиков (каждый работает с своими сотрудниками), но выплаты нужны общие.

    Reply
  9. Svetlana_E

    (7) У нас стандартные банковские обработки. И естественно, каждому документу «ведомость в банк» соответствует свой выгруженный файл. Но разговор же не о выгрузке, а о создании самих ведомостей.

    Я просто написала, что в программе есть возможности очень комфортно это делать. Но если кому-то ваше обработка облегчит жизнь — это здорово.

    Reply
  10. Svetlana_E

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

    Reply
  11. mib7

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

    Reply
  12. mib7

    (10) у нас выплату делает один человек, старший расчетчик, она же следит за источниками. Интересно какая у вас численность и профиль организации.

    Reply
  13. mib7

    Платёжки тоже кстати один всего человек делает и она не расчетчик, представляете если бы эти 192 документов еще на 4 расчетчика помножить. А ещё же есть межрасчет и аванс.

    Reply
  14. mib7

    (3) из документа начисление зарплаты не считается. Там создаваемые выплаты касаются только этого документа. И не затрагивают другие.

    Reply

Leave a Comment

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