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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *