Загрузка квитанций от Яндекс.Деньги в Управление торговлей 11.1 для создания документов "Поступление безналичных ДС"




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

11 Comments

  1. Melifaro588

    Разве таковая цепочка верна? Если я правильно понял, то приходник формируется от клинта на продавца.

    Яндекс деньги сначала получает средства от клиента, а потом перечисляет получателю.

    Соответственно необходимо формировать перенос задолженности с клиента на яндекс деньги.

    Reply
  2. jobkostya1c8

    (1) Melifaro588, насчет предметной области Вы верно заметили — это как будто «ПКО оформили» и взаиморасчеты сдвинулись в «нашу пользу», но: мы собираем КВИТАНЦИИ по почте, а не официальное подтверждение из банка. Фактически как работа с эквайрингом получается — банк с нами проводит сводный расчет в конце месяца за вычетом возвратов. Тут то мы получаем бумажки. Мало ли кто там чего прислал? Это всего лишь расчеты, а не взаиморасчеты. Планируемое поступление денег, а не фактическое. Документ в УТ 11.1 «поступление безналичных ДС» в редакции 11.1.9 нужно проводить после заполнения табличной части документа Выписка банка. Это уже в 10-й редакции УТ есть опция «проведено банком» (уже эти редакции на них памяти не хватает).

    К тому же вы же анонс публикации взят один в один по ТЗ к задаче. Вопрос насколько корректна такая цепочка уже к непосредственному заказчику, которого я в глаза не видел 🙂 Может вообще левые платежи хотят собирать?

    Reply
  3. jobkostya1c8

    Дополнительно, формирование банковской выписки в любой программе дело серьезное. Это уже реальные списания со счета (или зачисления на счет). Там формат уже более «строгий», хоть и текстовый, т.к. регламентирован банком и все равно тот кому доверили работу с банком должен все контролировать и быть ответственным не полагаясь на автоматику.

    Reply
  4. jobkostya1c8

    Просматривал аналогичные разработки. Например эта по использованию API-яндекс.деньги из 1С обладает более мощными возможностям, но нужен «монопольный» доступ к финансовой информации.

    Reply
  5. Nefertary

    Тоже работаем с Я.Деньги, но данные об оплате нам передает Битрикс (доработанный).

    У нас используется штатная цепочка «Эквайринговая операция» — «Поступление безналичных ДС»

    Эквайринговая операция — это как раз факт поступления денег от клиента в платежную систему.

    В момент проведения долг клиента переносится на эквайрера(платежную систему)

    При проведении поступления денег долг эквайрера закрывается.

    Reply
  6. jobkostya1c8

    (5) Nefertary, а в том то и дело что по этой обработке НЕ СТАВИТСЯ флажок «Проведено выпиской банка» (я про смысл, а не как там точно в программе) в одних редакциях УТ 11.1 проведение банковской выпиской, в других просто флажок в платежном поручении и один документ.

    Главное смысл: получение по почте квитанции о совершенной операции уже факт что деньги поступят, а у Вас получение сведений от битрикса из эквайринговой системы уже фактически равносильно ОФИЦИАЛЬНОЙ банковской выписки.

    Проведение потом по банку после таких обработок еще никто не отменял!

    Reply
  7. jobkostya1c8

    Тем более парсинг чего-то это фактически «заплатка», которая может не сработать и клиент будет недоволен. Тут задача была интересна с точки зрения методов парсинга HTML, чем создания документов цепочки оплаты.

    Reply
  8. Nefertary

    (6)

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

    По платежке деньги придут потом именно от эквайрера, а не от физика.

    Reply
  9. jobkostya1c8

    (8) Nefertary, в говове БП и проводки

    Reply
  10. jobkostya1c8
    Reply
  11. jobkostya1c8

    Если посмотреть внутренности то документ Поступление ДС более функционален (там почти половина всех регистров накопления и, главное, реквизит «проведеноБанком» при загрузке выписок.

    Каждую задачу приходится смотреть отдельно по той цепочке в ТЗ, которую предоставили. Ее еще самому нужно смоделировать именно в УТ 11.1 из-за большого разброса релизов.

    Reply

Leave a Comment

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