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




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

18 Comments

  1. KurchataD

    Здорово, классная вещь. Вот бы такое для 7.7 Бух сделать.

    Reply
  2. wguki@yandex.ru

    «Сумма по кредиту гаситЬся равными суммами» 😮

    Reply
  3. AnryMc

    (2) А можно подробней — где именно лишнее или не хватает (Ь)

    «Всю жизнь не может смириться с тем, что ветер ГАСИТ огонь надежды.»

    Из греческих тетрадей. Записки детского поэта / Агния Барто

    «электромагнитные волны могут, накладываясь, усиливать или ослаблять и даже полностью «ГАСИТЬ» друг друга (интерференция волн)…»

    Квантовая теория поля — Большая Советская Энциклопедия

    + см. рис. прикрепл. файл

    Reply
  4. Abadonna

    (3)

    А можно подробней — где именно лишнее или не хватает (Ь)

    Да запросто! Проверка: кредит что делаеТ? — га’сиТСя.

    Что будет делатьТЬ кредит? — гаси’ТЬся

    На вскидку не скажу в каком именно классе начальной школы…

    На форме отчета — АБСОЛЮТНО ВЕРНО написано.

    Reply
  5. AnryMc

    (5) Так в каком месте ошибка? Не могу найти.

    Reply
  6. Abadonna

    (6) Непонятки возникают в связи с глюками сайта 😉

    НЕТ ОШИБКИ.

    Reply
  7. AnryMc

    (5) Мне уже 25 минут назад пришло на почту сообщение № 6, а я его пока не вижу на сайте 🙁

    Какое тут живое общение?

    Reply
  8. wguki@yandex.ru

    Откройте прикрепленное изображение на этой страничке в описании обработки. Там в отчете написано следующее:

    «Основной долг по кредиту гаситься равными суммами, на остаток начисляются проценты» — зеленым шрифтом.

    Читаем дальше:

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

    Понимаю, что это не грамота.ру, но знание азов грамматики никто не отменял 🙂

    Reply
  9. wguki@yandex.ru

    Повторю изображение 🙂

    Reply
  10. Abadonna

    (10) Прикольно, но та версия, которую я скачал (4 апреля, утром по Москве)

    НЕ СОДЕРЖИТ ошибок

    Reply
  11. Amedis

    Вопрос автору:

    скажите для кого предназначается эта разработка?

    Для обычного человека, желающего расчитать, например, потребительский кредит сроком 10 месяцев? Но даже в этом случае пользователю придется напрягать могз и думать, а что же за период №8???? Какой это месяц???? А попробуйте расчитать например ипотечный кредит на 25 лет или 300 месяцев!!!!! Вобщем я бы заменил номер периода на дату или представление месяца (апрель 2010)… Кроме того мне как человеку взявшему кредит наверняка понадобится сделать перерасчет и посмотреть что же будет если я заплачу больше чем рекомендует банк. Неплохо было бы так же учитывать возможность изменения процентной ставки.

    Что касается предприятий, то подобные кредиты там вообще редкость. В основном открываются возобновляемые кредитные линии и процентов одних там видов пять….

    Сейчас сам пишу подобную штуковину для расчета процентов по кредитным линиям.

    Reply
  12. AnryMc

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

    Можно вычислять Процентные расходы по кредиту, Средневзвешенную сумму кредита, Эффективную ставку, Пеню за просрочку…

    Но как писалось в сказках — это уже другая история

    И если ваша разработка появиться в свободном доступе с удовольствием ею воспользуюсь

    Reply
  13. AhtungG

    .. аннуИтетные 😐

    Reply
  14. AnryMc

    (14) Спасибо — исправил

    Reply
  15. RayCon

    (6)

    >Так в каком месте ошибка? Не могу найти.

    На верхнем скриншоте в двух местах:

    Основной долг по кредиту гаситЬся равными суммами… (зелёный шрифт в шапке)

    Сумма долга по кредиту гаситЬся равными сумммами (нижняя строка в заголовке)

    (13) Я бы рекомендовал дополнить сию полезную разработку пакетным формированием документов по автоматическому начислению процентов с одной стороны и платёжных поручений по погашению кредита — с другой. Вся информация для этого есть: график платежей, суммы процентов и основного долга, наименования контрагентов, договоров и т.д.

    Reply
  16. mctsimco
    KurchataD пишет:

    Здорово, классная вещь. Вот бы такое для 7.7 Бух сделать.

    //*****************************

    Процедура СформироватьАннуитет()

    тз.видимостьколонки(«Комиссия»,?(КомиссияМес=0,0,1));

    Форма.фКомиссия.Видимость(?(КомиссияМес=0,0,1));

    Форма.сКомиссия.Видимость(?(КомиссияМес=0,0,1));

    НачСумма = СуммаКредита;

    ставкаМес = (ставкаГод / 12) / 100;

    Игого = 0;

    ИгогоПроц = 0;

    суммаМесВсего = СуммаКредита *(ставкаМес)/(1-1/вСТЕПЕНЬ((1+ставкаМес), срокКредита));

    Для й = 1 По СрокКредита Цикл

    суммаПроцентов = НачСумма * ставкаМес;

    СуммаМес = суммаМесВсего — суммаПроцентов;

    НачСумма = НачСумма — суммаМес;

    Игого = Игого + суммаМесВсего;

    ИгогоПроц = ИгогоПроц + суммаПроцентов;

    //Таб.ВывестиСекцию(«Строка»);

    тз.НоваяСтрока();

    тз.Мес= й;

    тз.СуммаОсн = СуммаМес;

    тз.СуммаПроц = суммаПроцентов;

    тз.комиссия = суммакредита / 100 * комиссияМес;

    тз.Сумма = суммаМесВсего + тз.комиссия;

    КонецЦикла;

    Переплата = Игого — СуммаКредита;

    сПРЦ = тз.Итог(«СуммаПроц»);

    сВсего = тз.Итог(«Сумма»);

    скомиссия = тз.итог(«Комиссия»);

    КонецПроцедуры

    //*****************************

    Процедура СформироватьСтандартный()

    Перем МесячнаяСумма;

    тз.видимостьколонки(«Комиссия»,?(КомиссияМес=0,0,1));

    Форма.фКомиссия.Видимость(?(КомиссияМес=0,0,1));

    Форма.сКомиссия.Видимость(?(КомиссияМес=0,0,1));

    НачСумма = СуммаКредита;

    ставкаМес = (ставкаГод / 12) / 100;

    Игого = 0;

    ИгогоПроц = 0;

    ИгогоОсн = 0 ;

    МесячнаяСумма = Окр(СуммаКредита / срокКредита,2);

    Для й = 1 По СрокКредита Цикл

    Если й = срокКредита Тогда

    НачСумма = СуммаКредита — ИгогоОсн;

    СуммаМес = НачСумма;

    Иначе

    СуммаМес = МесячнаяСумма;

    КонецЕсли;

    суммаПроцентов = НачСумма * ставкаМес;

    СуммаМесВсего = СуммаМес + суммаПроцентов;

    НачСумма = НачСумма — суммаМес;

    Игого = Игого + суммаМесВсего;

    ИгогоПроц = ИгогоПроц + суммаПроцентов;

    ИгогоОсн = ИгогоОсн + СуммаМес;

    тз.НоваяСтрока();

    тз.Мес= й;

    тз.СуммаОсн = СуммаМес;

    тз.СуммаПроц = суммаПроцентов;

    тз.комиссия = суммакредита / 100 * комиссияМес;

    тз.Сумма = суммаМесВсего + тз.комиссия;

    КонецЦикла;

    Переплата = Игого — СуммаКредита;

    сПРЦ = тз.Итог(«СуммаПроц»);

    сВсего = тз.Итог(«Сумма»);

    скомиссия = тз.итог(«Комиссия»);

    КонецПроцедуры

    //*****************************

    Reply
  17. freek

    Отличная штука

    Reply
  18. Гость

    Рекомендую

    Reply

Leave a Comment

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