Кредитный калькулятор (8.1)




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

23 Comments

  1. limbo

    это все таки для 7.7 или 1С8 — уточните в описании

    Reply
  2. Zlodey

    Дорогие Медераторы поменяйте это для 8.1, он почему то не дает мне изменить, не сохраняет выбор.

    Reply
  3. Zlodey

    Медераторы=модераторы

    Reply
  4. Zlodey

    В обработке закралась ошибка, хоть и не большая всеже неточность. И главное не кто не заметил что ли. Внимательно посмотрите на картинку меся платежа 9 и что мы видим. Вот именно после января у нас идет март а это не есть гуд.

    Там, где я увеличиваю месяц необходимо заменить строку МесяцПлатежа=МесяцПлатежа+(60*60*24*31) на МесяцПлатежа=ДобавитьМесяц(МесяцПлатежа,1);

    Reply
  5. bsa1968

    Отличная вещь получилась!

    Reply
  6. whoscare

    Я бы еще посоветовал добавить функцию Печати ТЧ.

    Reply
  7. Dolly_EV

    Хех, я такой-же в Ехеле сделал пару лет назад)) Зачет!

    Reply
  8. Zlodey

    (6) Ок. сделаем

    Reply
  9. Ворона

    ну а предположим,клиент хочет ежемесячно платить фиксированную сумму?!

    Reply
  10. Zlodey

    (9) И это можно реализовать. вообще этот калькулятор я писал для своего взятого кредита, но задачу понял. Ждите :~)

    Reply
  11. Ворона

    да не актуально уже,мне интересно как вы это сделаете.

    Reply
  12. abev

    Довожу до вашего сведения товарищ Zlodey, что ваша обработка рассчитывает график платеже неверно. Обычно при расчете кредитов годовая процентная ставка делится на число месяцев в году (12) а не на количество дней как у вас. Алгоритмы расчета различных видов кредитов и кредитные калькуляторы вы можете посмотреть по адресу:

    http://www.banki.ru/forum/?PAGE_NAME=read&FID=11&TID=1621&MID=88046

    Reply
  13. Zlodey

    (12) У меня кредит взят на 5 лет и эта обработка почему то считает у меня правильно, если ту думаешь что она тебе 100% график платежей выдаст, то уверяю тебе кроме банка не кто не даст её т.к в любом случае будут погрешности с округлением и т.п+возможно еще какие то пени по твоему кредиту о которых ты и сам не знаешь. НО ЕЩЕ РАЗ ПОВТОРЯЮ У МЕНЯ ВЗЯТ КРЕДИТ У СБЕРБАНКА НА 5 ЛЕТ И Я С НИМ СРАВНИВАЛ

    Reply
  14. Zlodey

    (12) Советую прочитать условия вашего договора.

    Reply
  15. Zlodey

    (12) Разница около 60 рублей :~).

    Reply
  16. O-Planet

    А у меня валяется здесь целая конфа «Кредитование». Позволяет автоматизировать работу кредитной конторы. Почему-то не заметили… 🙁

    Reply
  17. Zlodey

    (16) Может хватит одного моего калькулятора

    Reply
  18. O-Planet

    Ну, если не надо получать развернутую статистику по выданным кредитам, иметь возможность работать с разными видами кредитования, предполагать оплату по остатку и пропорционально сумме, рассчитывать пени, делать возможным погашение в разных валютах — то да!

    Reply
  19. abev

    Повторяю: алгоритм этой обработки некорректный и не соответствует алгоритмам расчета ниодного банка (в т.ч. Сбербанка). Действительно, когда сумма и срок кредита небольшие ошибка незаметна. Но допустим берем кредит 1 000 000 руб. на 10 лет под 10% годовых. В результате эта обработка выдаст что выплаты по процентам составят 497 260,28 руб. А по наиболее распространенному алгоритму (используемому в т.ч. Сбербанком) получится 504 166,86. Разница 6 900 руб.

    И это НЕ погрешность с округлением. Рекомендую исправить алгорит на следующий:

    Условные обозначения: T — количество периодов оплаты; Кр — сумма кредита; Ст — процентная ставка, начисляемая на задолженность за период; Плi — размер платежа за i — й период (i принимает значения от 1 до T); ПКр – сумма процентов, выплаченных по кредиту за весь срок кредитования.

    ПКр = Кр*Ст *(Т + 1) / 2

    Плi = Кр / T + Кр*(T-i+1)*Ст / Т

    или уничтожить обработку безвозвратно и не вводить людей в заблуждение

    Reply
  20. Zlodey

    (19) Слушай AbEv если ты думаешь что ты одни такой умный то ошибаешься, я тебя и с первого раза понял на днях выложу обновленную версию. Потерпи чуть чуть.

    Reply
  21. Zlodey

    (19) http://www.ipotek.ru/formuladp.php посмотри какая там формула.

    Reply
  22. DionX

    (19) а как в таком случае расчитать процент за неполный месяц? В том же Сбере, есть разница в платеже в зависомости от того, когда принёс платеж до дня, а не до месяца!

    Reply
  23. ivannn

    Интересная задумка

    Reply

Leave a Comment

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