Отчет по чекам




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

15 Comments

  1. user694793_cloudia4

    Хороший отчет. Скачала =) очень бы пригодился! Но не работает =(

    Подскажите что может подстроить?

    Выдает только выемки

    работаем через РМК

    8.3.11.3034 УТ 11.4.2.139

    Reply
  2. SinglCOOLer

    (3) Добрый Анна, чтобы точно понять в чем причина нужно увидеть вашу конфигурацию, отчет работает на разных базах без проблем, в том числе и на демо базах. Вы уверены что у вас за этот период есть чеки? перемещения? по выбранному складу?

    Reply
  3. user694793_cloudia4

    Конфигурация типовая. Вообще без каких либо изменений. 8.3.11.3034 УТ 11.4.2.139

    Каждый день есть чеки и перемещения.

    Reply
  4. user694793_cloudia4

    (4)Странная штука обнаружилась. если не выбирать магазин, то показывает чеки, перемещения, списания, возвраты. А выемки все равно отдельно внизу отчета.

    Может что-то не так с 1с? О_о

    Reply
  5. SinglCOOLer

    (5)постараюсь посмотреть на демо базе, с вашей версией

    Reply
  6. user694793_cloudia4

    (7)Ок. Спасибо. Будем ждать =)

    Reply
  7. SinglCOOLer

    (8) проверил в демо, все отлично, с отборами и без, видимо проблема у вас в данных, если Выемка отображается отдельно, то возможно у вас в кассе ккм не заполнено подразделение

    Reply
  8. user694793_cloudia4

    (9)Разобралась. В Склады и магазины не было проставлено подразделение.

    Но все почему-то красное О_о

    Reply
  9. SinglCOOLer

    (10) в описании указано

    В последствии в отчет добавили столбец «Пробито по ККМ», сумма в который собирается по РС «Журнал фискальных операций». Добавили его для того чтобы видеть что все чеки (и прочие фискальные операции) были физически пробиты по фискальному регистратору. Продавцы иногда забывают пробивать чеки. Если «Сумма документа» не сходится с «Пробито по ККМ», то строка начинает светиться красным.

    Это можно убрать в настройках отчета, в условном оформлении

    Reply
  10. user694793_cloudia4

    Все! Со всем разобралась! ОГРОМНОЕ СПАСИБО! ОООООООчень полезный отчет!

    Reply
  11. user694793_cloudia4

    (11)Иван, не могли бы Вы конвертировать Ваш отчет для версии 8.3.11.3034 УТ 11.4.2.139

    Через «открыть» открывается, а вставить в доп формы отчеты не могу =( Пишет что не подходит версия

    Спасибо.

    Reply
  12. SinglCOOLer

    (13) Отчет может использоваться только как внешний, либо его можно встроить в конфигурацию, через конфигуратор.

    Reply
  13. user694793_cloudia4

    (14)Подскажите пожалуйста.

    Вчера начала вываливаться ошибка при открытии отчета.

    «не удалось обновить вспомогательные данные расширений. обратитесь к администратору»

    В чем может быть проблема?

    в базе ничего не менялось.

    Reply
  14. vdashop

    Добрый день. А фильтрация по продавцам есть?

    Просто Кассир один то может быть, а продавец другой.

    Reply
  15. Strannik99

    Добрый день! на 11.4.9 работает у кого, нет возможности проверить

    Reply

Leave a Comment

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