Просроченные долги клиентов




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

21 Comments

  1. valent

    Ой. С 14.07 по 28.07 — 24 (минус двадцать четыре) это в каких единицах?

    Reply
  2. zveruganet

    (1)в днях календарных

    😉

    дата формирования отчета 21.08.2010 (написано на верху)

    «дата»- 14.07-это дата создания накладной

    «дата оплаты» — 28.07 — это дата до которой по договору клиент обязан оплатить накладную в данном случае 14 дней

    «просрочено» 24 с минусом для красного цвета это количество дней прошедших после «даты оплаты»,

    так как обработка называется долги, то соответственно клиент не оплатил накладную на момент формирования отчета, либо не разнесли оплату забывчивые бухгалтера

    а без минуса черным цветом количество дней до «даты оплаты»

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

    Reply
  3. NCCSOFT

    Аналог отчета http://infostart.ru/public/70253/ , хоть и платный 🙂

    Reply
  4. zveruganet

    (3) у меня не столь информативный только необходимое

    платный я скачал но не юзал смутили комментарии и полное отсутствие рейтинга 😉

    Reply
  5. ROM_1C

    (0) Комплексная конфигурация — не работает!!!!!

    Reply
  6. zveruganet

    (5) может быть

    значит там нет регистров не ожидал.

    Reply
  7. ROM_1C

    (6) Ну, в нашом деле ожидать не можно! Нужно действовать и отладчиком пользоваться 😉

    Reply
  8. lemaxs

    нам понравилось

    Reply
  9. nickkey

    Да согласен интересная реализация без регистров но в целом хорошая автору спасибо

    Reply
  10. andyrk1

    очень удобная обработка, всем советую пользоваться

    Reply
  11. CheBurator

    абсолютно нечитабельная разработка, когда надо получить «одним махом» состояние дел по просрочкам…

    в (3) — уже получше… но все равно мне не нравится — попытка в один отчет впихнуть все.

    Но и эти отчеты полезны кому-то…

    тем более что у топикстартера — бесплатно, в(3) — получше но лицензии, привязки, закрытый код скорее всего…

    .

    поэтому предложу что-то среднее: тоже платный, но код открыт, колво пользователей неограничено, поставщики/покупатели/общие долги — в одном флаконе…

    кому понравится — пользуйтесь: http://infostart.ru/public/71643/

    Reply
  12. CheBurator

    ну и вдогонку: обычно с отчетом по просрочкам хорошо идет график платежей как превентивная мера контроля клиентов

    http://infostart.ru/public/16293/

    Reply
  13. NCCSOFT

    (12) А мне нравится моя http://infostart.ru/public/70253/

    но, обладает многими гибкими функциями… и фишками…

    Этот отчет я совершенствовал с 2009 по 2011 год, так как все клиенты довольны и никто не просит что-то еще.

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

    (изучив мою сделали свою, но не факт что лучше 🙂 У вас идея с гибким заданием интервалов просрочки мне тогда понравилась!

    (13) Платежный календарь, это немного не тот отчет — это к отчету ДДС (для фин.директора), а этот отчет меденжерам — по взаиморасчетам.

    Reply
  14. orsprog

    а мне нравится

    Reply
  15. KrakoZyabl

    Спасибо. 🙂

    Reply
  16. zveruganet

    Самое интересное, что господа рекламодатели (3)(12),(13)и(14) даже не скачивали обработку

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

    по поводу (9) используется запрос к регистрам

    Reply
  17. NCCSOFT

    (17) Извиняюсь за рекламу, но я не хотел рекламироваться (правда!), а просто писал сообщение Чебурашке (он начал первым :-).

    Кстати, по поводу (9), мой отчет не использует регистры, в нем реализовано списание долгов по FIFO

    (если нет ссылки на документ основание)

    Поэтому, в случае нарушенной «границы последовательности» (ГП)

    все «регистровые» отчеты могут/будут показывать информацию с ошибками, пока не будет перепроведение документов.

    Автору респект!

    Reply
  18. trioka

    давно искал . спасибо!

    Reply
  19. lemaxs

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

    Reply
  20. HameleonA

    А ведь не плохой отчетик, только выполнен небрежно и некрасиво, больше подойдет программистам, чтобы съэкономить время, лишь доделать под себя этот.

    ТС посоветую поработать над ним, добавить настройки выбора даты, контрагента (конкретного или покупатель/поставщик), поработать немного над внешним видом(интерфейсом и выходной формой, а то сейчас он вообще не читаемый, особенно если контрагентов очень много), и думаю, если стоит у контрагента НЕ КОНТРОЛИРОВАТЬ долги, то выводить такого контра не имеет смысла. и сможете так же его продавать как здесь прокомментировавшие.

    Но для бесплатной версии очень даже хорош. Так что от меня ПЛЮС.

    Reply
  21. zveruganet

    дорабатывается для каждого отдельного случая, есть версии с использованием проектов, отсрочкой в банковских днях, выбором контрагента, даты, ответственного, автора, но это всё весьма специфично и зачастую остается у заказчика. P.S. найду залью

    Reply

Leave a Comment

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