Отчет по расходам на оплату труда (расчетная ведомость + анализ начисленных налогов) 8.2 ЗУП 2.5 (УПП, Комплексная автоматизация… все, что включает ЗУП)




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

17 Comments

  1. Terrain25

    С 01.01.2016 Взносы ПФР начисляются по другому… Версия отчета обновлена, те кто уже скачал пишите в «личку» вышлю новую версию бесплатно

    Reply
  2. masteroff

    Правильно ли покажет отчёт НДФЛ у сотрудников, которые работают в течение месяца в разных обособленных подразделениях? Например, как основной сотрудник в одном подразделении, и как внутренний совместитель в другом.

    Reply
  3. Terrain25

    (2) masteroff, Да все показатели просуммируются,если эти сотрудники содержат ссылку на одно и тоже физлицо, но придется поменять настройку группировки строк таблицы (убрать оттуда подразделение и должность)

    Reply
  4. gala2009

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

    Reply
  5. gala2009

    ПОГПХИЩТАТ..

    скачала, открыла СКД, пришла в ужас, даты не знаю куда воткнуть, помогите!

    Reply
  6. Terrain25

    (5)Код действительно открыт, даты приема и увольнения очевидно будут в разных записях источника данных «Запрос», думаю проще будет создать еще одну таблицу (вложенный запрос)на основе «РаботникиОрганизаций»

    Reply
  7. Terrain25

    Вот так я бы сделал таблицу

    ВЫБРАТЬ

    РаботникиОрганизаций.Сотрудник,

    РаботникиОрганизаций.Организация,

    МАКСИМУМ(ВЫБОР

    КОГДА РаботникиОрганизаций.Регистратор ССЫЛКА Документ.УвольнениеИзОрганизаций

    ТОГДА РаботникиОрганизаций.Период

    ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)

    КОНЕЦ) КАК ДатаУвольнения,

    МАКСИМУМ(ВЫБОР

    КОГДА РаботникиОрганизаций.Регистратор ССЫЛКА Документ.ПриемНаРаботуВОрганизацию

    ТОГДА РаботникиОрганизаций.Период

    ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)

    КОНЕЦ) КАК ДатаПриема

    ИЗ

    РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций

    СГРУППИРОВАТЬ ПО

    РаботникиОрганизаций.Сотрудник,

    РаботникиОрганизаций.Организация

    Reply
  8. Terrain25

    Обязательно соединяйте Последнюю таблицу запроса левым соединением с «Этой» чтобы она вдруг не «выросла»

    Reply
  9. Terrain25

    У меня получилось

    Reply
  10. gala2009

    (9)Денис, у меня не получается, все-таки запросы у вас непростые, чуть тронешь — сбиваются группировки. прошу вас, если не трудно, отправьте отчет с доработкой по датам на zlobina_g@mail.ru, пожалуйста

    Reply
  11. Terrain25

    (10)Отправил

    Reply
  12. gala2009

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

    Reply
  13. Terrain25

    (12) Запросы основаны на методике «последовательного построения временных таблиц» — это классика (Хрусталева)

    Reply
  14. buy_sale

    Люто плюсую и 6см не жалко за такое, хотелось бы еще отделить ПФРдо предела и выше, а то в отчете все в одной колонке ПФРпосуммарномутарифу.

    Reply
  15. Terrain25

    (14)Да сегодня sm чего то стоит, цена была назначена в период его обесценивания, а теперь если снижу тем кто скачал будет обидно… ЗУП 2.5 уходит в небытие… я вообще не ждал что кто то скачает

    Reply
  16. German_Tagil

    А под 3.1 подобное писали?

    Reply
  17. Terrain25

    (16)Нет, не приходилось

    Reply

Leave a Comment

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