Расчет процентов пени по просроченной задолженности




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

38 Comments

  1. Доня

    Конфигурация???

    Reply
  2. Altez

    Тис 9.2

    Reply
  3. barsuk

    не работает -незачетЪ

    Reply
  4. Flashlike

    Вывалилось кучей ошибок.

    «Нижнейшими уровнями..» по русски «Последними уровнями». по умолчанию их надо поставить так.

    Если Запрос2.Выполнить(ТекстЗапроса2) = 0 Тогда

    {C:ВЕДОМОСТЬПОДОЛГАМ%.ERT(1145)}: <<?>> Период с ДатаНачала по ДатаКонца;

    и т.д.

    Reply
  5. Altez

    (3)логи плз

    Группировки Контрагент и Договор выставлены?

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

    Reply
  6. barsuk

    (5) смотри (4) — вывалились точно такие де ошибки. Да база обрезанная. Что надо сделать чтоб заработало под нее?

    Reply
  7. Altez

    (4) А можно скриншот с настройками на dailapu*inbox.ru пжл

    Строка 1137 кода гласит:

    ТекстЗапроса2=СтрЗаменить(ТекстЗапроса2,»ДатаНачала по ДатаКонца»,»Дата0 по Дата1″);

    Оставтье пока вид отчета «Общие взаиморасчеты» (по умолчанию),

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

    Скачайте последнюю версию с сайта(с)

    Не рейтинга ради, праздника для

    русский язык верну в свои права при 1 случае:)/,

    Reply
  8. Altez

    (6)эврика, щас все будет,

    с отбором по контрагенту без группировки

    Кредитный документ работает?

    Reply
  9. rodin

    Очень просто рассчитывается кол-во дней просрочки (ДнейПроср=?(ПосДата=’..’,0,ТекДата-ПосДата);)… в реале данный отчет не подходит… это скажет любой юрист.

    И причем тут ДатаНачала ??? Отчет должен работать НА ДАТУ т.к. данный очет должен оперировать исключительно оборотами с начала взаиморасчетов с контрагентом ИМХО

    Reply
  10. Altez

    (9) Написана сия штука была для имплантации в ТИС функционала шаровары ЮристРасчетЭксперт, вся методическая основа «Как там», и Астраханским клиентам подходит.

    Решена задача прикида наценок/отсрочек платежа для покупателя на основе анализа его платежной дисциплины.

    Оч.хотелось бы, чтобы «Любой Юрист» указал на обсуждение причины, по которой «Очень просто рассчитывается кол-во дней просрочки» является проблемой

    (ДнейПроср=?(ПосДата=’..’,0,ТекДата-ПосДата)… говорит о том что фирма молодая, ввод остатков пени не сложно дописать, надо?

    Reply
  11. rodin

    (10) «Очень просто рассчитывается кол-во дней просрочки» … извини, не правильно выразился, скорее так «Не верно рассчитывается кол-во дней просрочки»

    Reply
  12. rodin

    Будет время — подробно обосную….

    Reply
  13. Altez

    (12) Буду рад новой методике, на тек.момент известна проблема пересекающихся дат, когда в накладных одного контрагента разное число дней отсрочки, что приводит к отрицательным процентам пени; будет время — починим;)

    Reply
  14. Altez

    Замечания (3),(4) учтены в новой версии, отбор по контрагенту оставим обязательным или норм.?

    Reply
  15. iov

    Прошу пардон.

    Пару вопросов (посмотреть обработку не смог)

    как расчитываются пени? от суммы документа или от суммы без НДС?

    обычно по доковору клиент платит не за документ а по договору.

    Следовательно стоит иметь подробную расшифровку по документам и «оплатам » этих документов с указанием документов оплаты (с датами).

    соответственно неплохо бы все завернуть в типовую бумажку с грозными словами типа суд и больше не играем 😀 чтобы осчастливить юриста или его заменяющего. Крайне рекомендую сделать возможность распечатки реестра документов по месяцам крупно , для поиска оригиналов по архивам. И также добавить информацию о том сколько дней отсрочки у клиента по договору и фактически.фактически разница между датой документа и датой оплаты с учетом того что механизм движения даты оплаты отлажен для указания на то что может случится что дата оплаты по каким либо причинам была установлена меньше чем дней отсрочки по договору и данные документы нельзя принимать к рассмотрению без пересчета даты оплаты.

    Хорошая идея только в прошлом месяце закончил реализацию комплекса юриста по даннному вопросу.

    Итак автоматизацию в массы!

    Reply
  16. iov

    ПРОшу пардон второй раз

    ВСЕХ С НОВЫМ ГОДОМ!!!

    Reply
  17. Sk0rp

    А как все это с частичными оплатами до документу заработает?

    Например должен 10 000,

    просрочил 2 дня (пеня за 2 дня с 10 000)

    оплатил 8 000

    через 20 дней (еще пеня за 20 дней, но уже с 2з тысяч)

    оплатил еще 1 000

    и т.д.

    Что будет происходить если при оплате по договору после перепроведении погашения разнесутся по другим документам и подтвердить изначальную бумажку с расчетом будет нечем?

    Reply
  18. barsuk

    Если поставить группировку по контрагенту — то вываливается вот такая ошибка — Запрос2.Получить(ЗнчИзм(Запрос,СписокГруппировок,Ном),)//);

    {E:PENNI.ERT(725)}: Слишком много параметров передано при вызове функции/процедуры объекта

    Reply
  19. Altez

    (18)Это когда отсутствует отбор по контрагенту(ам)?

    Починим, пока логичней оттточить методику согласно (9)

    пока

    «Отбор по контрагенту(ам) обязателен»

    (15),(17) Оплатой «по документу»(кстати откуда необходимость?) и выделением НДС не озадачивались, можно над этим поработать, особенно если выделить комплекс юриста в 1с-совместимую шаровару)

    Reply
  20. iov

    (19) комплекс юриста «встроил» в торговлю. Выделять нет смысла.

    Необходимости всплывают в суде… Сумма без ндс должна быть и точные расчеты по срокам договора и установленым в документе…

    Вобщем советую «потрепать» юриста.

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

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

    Reply
  21. Altez

    (20)задача обры лишь прикид наценок..

    Коль до суда дойдет, конечно, знаем теперь к кому за сорцом идти)

    Reply
  22. iov

    (21) Дык не в укор, а пользы для, писал сию поэму я.

    Коль для наценок был урок, тогды оброк считаем впрок.

    С бояр по рубь, с крестьян копейка, глядишь получится ПРЕМИЯ (ну не придумал я рифму зато правда).

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

    Reply
  23. iov

    Блин ну не научили меня думать с запятыми.

    Reply
  24. Altez

    Добавился Коэффициент оборачиваемости дебиторской задолженности (Receivables Turnover, RT) — отношение оборота компании к среднегодовой величине дебиторской задолженности.

    (22)

    Если (%наценки+%штраф.наценки)=(%наценки+%пени) легко добавить расчет %штрафной наценки

    Себестоимость подтянуть осталось..

    Reply
  25. iov

    (24) вот смотри какой инструмент вырастает.

    (будешь делать платным вспомни про старого еврея 😉 )

    Reply
  26. Altez

    (25)Чтовы что вы) Ещё дядька Норбеков грил евреи не бывают старыми и новыми — они всегда свежие)

    обновил

    всем спасибо

    будут бонусы поделим

    Reply
  27. iov

    (27) Ну что вы какая дележка. Я согласен просто на бесплатный продукт.

    Reply
  28. Altez

    Исправлены косые «Отсрочка»(теперь не захватывает платежки) и строка Итогов(считает пеню до даты конца отчета).

    Вывод строки итогов после каждой группировки по контрагенту.

    Начиная с 1.0 Нач.ост пени в заголовке группировки по контрагенту не отображается-там итог пени.

    Reply
  29. elya020580

    А для 8.1 торговли можете выложить этот же отчет? Очень нужно для суда.

    Reply
  30. Altez

    (29) 22 пост утверждает отсутствие необходимой закону точности в данном инструменте, его ниша скорее расчет менеджером скидки

    Reply
  31. iw6

    нужная вещь

    Reply
  32. ASSuk

    Доброго дня! Отчет хороший, но если (ДатаКонца + Отсрочка)>ТекДата тогда считает пеню на дату больше ТекДата, что в свою очередь приводит к минусовой дате задолженности и пене для (ДатаКонца + Отсрочка) > ТекДат. Или это гениальная задумка разработчика?)

    Reply
  33. Altez

    (33) Доброго и вам! За время эксплуатации руководителя это устраивало, а с переходом на 8ку стало неактуально. Есть готовые предложения? С радостью внесу в алгоритм

    Reply
  34. ASSuk

    Altez, понял вас! Был бы вам очень признателен($m ) за доработку данной обработки. Хочется иметь возможность(галочка) не выводить в таблицу если текдата> преддата. То есть если сегодня 09.11.2015 , мы выбираем период по 08.11.2015 контрагента с отсрочкой в 7-мь дней то выводить в таблицу только задолженность по 08.11.2015, просчитывать до 16.11.2015 не надо. Соответственно в таблице не будет к-во дней с «-» и сумма пени будет тоже положительная)

    Ну а если галку не ставить-изначальный вариант. Сможете доработать? Со своей стороны скачивание за $m гарантирую)

    Reply
  35. Altez

    (35) ASSuk, на днях скачаю ТиС поправлю

    Reply
  36. ASSuk

    (36) спасибо! Жду!

    Reply
  37. ASSuk

    (36) вы про меня не забыли?)

    Reply
  38. Altez

    (38) ASSuk, выслал, работает?

    Reply

Leave a Comment

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