Отчет по видам расчета, введенным сотрудникам за указанный период




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2018-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='\

15 Comments

  1. Zuzya2009

    отчет хороший, только хотелось бы еще, что бы справа была итоговая колонка (по людям), по всем видам начислений (итого за период), а НДФЛ, выплату зарплаты убрать…

    Reply
  2. Nicholas

    (1) Ваши пожелания будут учтены.

    Reply
  3. Nicholas

    (1) Только у меня вопрос: А какой смысл у этой итоговой колонки? Если в нее попадут сальдо, начисления, удержания, натуральные доходы, причем все с плюсом, то в итоге получится непонятно что.

    Reply
  4. lefthander

    У меня вот смешнее задачу финансисты поставили. Надо среднюю по начислениям по должности, по подразделениям расчитать. Вот.

    Reply
  5. Filipp_inf

    Хочу еще раз сказать СПАСИБО!!

    Тем более что отчет в открытом доступе,

    написан четко — понятен даже новичку (т.е. мне) для учебных целей.

    Применяемая методика легко расширяет область применения —

    достаточно в запросе сменить Журнал на «СтраховыеВзносы» — вот уже

    и злободневный отчет для 2010 года!!

    Жаль нельзя поставить еще 1 ПЛЮС!

    Reply
  6. Nicholas

    (5) Спасибо за столь приятный отзыв.

    Reply
  7. ston09

    да.. отчет хороший вот бы если еще Этот отчет показывал не все Виды расчетов цены бы не было бы такому отчету… т.е пример:

    допустим у сотрудника 15 Видов Расчета, а выплачиваем один… после, все остальные…

    получается 2 выплаты…. хорошо бы в отчет вытащить по выплате все Виды расчетов касающиеся только выплаты…

    у меня пока это не получается…. 😥

    Reply
  8. lefthander

    (7) Перед выводом в таблицу на печать проверяйте видРасчета на принадлежность к группе расчетов — ВсеНачисления,

    Примерно так:

    Если ВР.ВходитВгруппу(ГруппаРасчетов.ВсеНачисления) = 1 Тогда //0- не входит

    /// Здесь делаем то что надо — добавляем в таблицу…

    Конецесли;

    Или я не понял, что у Вас не получается?

    Reply
  9. maxchaos

    Отчет выдает ошибку «Неверный диапазон дат!» в случае, если после открытия отчета начало периода сдвинуть до текущего периода (ТП), а конец периода не трогать.

    Границы периода при данной ошибке таковы: 31.08.10 — 01.08.10 (для ТП: Август 2010 г.). А все из-за того, что в процедуре «ПриОткрытии» указано

    ДатаОкончанияПериода = НачМесяца(РабочаяДата());

    ,

    а функция «глСменитьПериод» при сдвиге начала периода вперед возвращает дату конца месяца:

    Если Направление=1 Тогда
    ДатаАктуальности = ЖР.КонецПериодаПоДате(ЖР.КонецПериодаПоДате(ДатаАктуальности)+1);
    …
    

    Ошибка устраняется заменой в процедуре «ПриОткрытии» строки

    ДатаОкончанияПериода = НачМесяца(РабочаяДата());

    на строку

    ДатаОкончанияПериода = КонМесяца(РабочаяДата());
    Reply
  10. Nicholas

    (9) Исправил. Спасибо.

    Reply
  11. svetlana@rnt.ru

    Спасибо. В целом отчет понравился , но мне кажется было бы удобнее , если бы виды расчета выводились не по алфавиту , а сначала все начисления по видам , а потом все удержания по видам.

    Reply
  12. al2ko

    Объясни назначение колонки «Задолженность по заработной плате»?

    Неплохо бы увидеть сальдо на начало и конец периода.

    Reply
  13. Arin

    Спасибо!!!

    Reply
  14. Nicholas

    (12) al2ko, колонки соответствуют видам расчета, которые присутствуют в журнале расчета зарплаты для выбранных сотрудников. «Задолженность по заработной плате», «Текущее начальное сальдо» и «Начальное сальдо по переплате НДФЛ», — эти три вида расчета в сумме дают начальное сальдо периода.

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

    Reply
  15. -=LoBoS=-

    Отличный отчет)))

    Скачат перед этим несколько подобных по описанию и они даже рядом не стоят!

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

    Reply

Leave a Comment

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