Оплаченные и просроченные реализации (Продажи по оплате)




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

16 Comments

  1. Sintson

    Привет! Плюсик за старания. 😉

    Решить вопрос с количеством дней просрочки легко.

    В основной схеме компоновки на вкладке ресурсы Ресурс «ДниЗадолж» настройка «Расчитывать по…»

    -> «ДокументПродажи», например!

    За старания, при наличии интереса, могу поделиться компоновкой, которая решает ту же задачу, но быстрее и гибче, при условии нераспространения.

    Reply
  2. Darida

    спасибо)

    Reply
  3. Motor24

    Спасибо огромное! Весьма полезная вещь! Удачи в дальнейших работах!

    Reply
  4. kng67

    Возможно ли в Вашем отчете уствновить отбор по Номенклатуре?

    Reply
  5. Anyu-n

    Цели такой при написании этого отчета не было, так что напильник в руки и…. переделывать в конфигураторе )

    Reply
  6. kng67

    (5) Anyu-n, Спасибо за напильник 😉

    Reply
  7. dyak84

    Автор подскажите пожалуйста а в Ут10,3 для Украины ваш отчет работать будет. Если да то какая производительность его а то при запуске типового отчета Оплаченые реализации все зависает минут на 30-40. Зарание спасибо за ответ

    Reply
  8. dyak84

    И еще подскажите возможно ли реализовать отбор по номенклатуре. Судя по скриншоту его нет. Спасибо за ответ

    Reply
  9. kida1

    Возвраты не уменьшают графу «Осталось оплатить». Кто-нибудь разбирался с возвратами в этом отчете?

    Reply
  10. script

    (8) dyak84,

    Для тех кто просит отбор по номенклатуре… Вот интересно, когда проводится платежка где там указвается за какую номенклатуру пришли деньги, тем более при частичной оплате? Как в таком случае распределять среди отгрузок оплаты по ФИФО, если в программе нет данных об оплаченной номенлатуре. Об договоре, контрагенте, даже сделке есть — а о номенклатуре нет.

    И вопрос встречный будет ли работать оагоритм если мне нужно увидеть в этом отчете сделку. Т.е. не просто оплаченные отгрузки, а оплаченные и отгруженные заказы?

    Reply
  11. Bozhevilnoe

    Спасибо большое за отчет. Но в нем не учитываются возвраты. Исправите?

    Reply
  12. Anyu-n

    (11) Bozhevilnoe, Заказчику возвраты не важны были, поэтому можете исправить сами — код открыт 🙂

    Reply
  13. Glemar

    Спасибо за ясность с просрочкой дебиторки с учетом отгрузок и оплаты по ФИФО. Удачи!

    Reply
  14. c_andrey

    Скажите он работает на Управление торговым предприятием 1с 8.2? Скачали, а пустой отчет…Реквизит добавит в Справочник Контрагента «ДопустимоеЧислоДнейЗадолженности» все равно пустой отчет….

    Reply
  15. Anyu-n

    (14) c_andrey, Здравствуйте! Отчет проверяла исключительно на конфигурации Управление торговлей 10.3 На остальных не проверяла

    Reply
  16. prog_ivory

    спасибо за отчет. Очень помог контролю менеждеров

    Reply

Leave a Comment

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