Как я создавал калькулятор займов для микрокредитных организаций

Меня зовут Антон , я fullstack-разработчик. Сегодня расскажу, как создавал калькулятор микрокредитов для финансовых организаций. Проект оказался сложнее, чем казалось изначально — но результат того стоил.

Зачем это нужно?

Микрокредитная организация (МФО) столкнулась с проблемой: клиенты не понимали условий займа. Требовался инструмент, который:

  • Рассчитывает платежи с учётом сложных процентов
  • Адаптируется под мобильные устройства (70% трафика МФО — смартфоны)
  • Необходимо интегрировать в разные CMS системы, в данном случае в Bitrix CMS.

Стек технологий

  • Backend: PHP 8.1
  • Frontend: HTML/CSS/JS . Интеграция в Bitrix CMS.

Создал 3 различных варианта калькулятора:

Первый калькулятор

Второй калькулятор

Третий калькулятор

Затем произвел финансовое тестирование , по требованиям заказчика.

Что получилось:
Калькулятор работает пока в 1 МФО.

Изначально уже был код одного из готовых калькуляторов на Bitrix CMS.

C помощью Deepseek сделал обратный промт инжиниринг из готового калькулятора :

Создай PHP/HTML/CSS/JS виджет калькулятора займов со следующими характеристиками:
Базовые требования:
Получение данных о продуктах через PHP-функцию getProducts()
Адаптивный дизайн с брендовым цветом #4BB725
Интеграция библиотеки noUiSlider для ползунков
Поддержка Яндекс.Метрики (цель IRK_ORDER)
Функциональные блоки:
Скрытый селектор продуктов (с возможностью активации)
Два слайдера:
Сумма займа: диапазон 3 000 - 100 000 ₽, шаг 1 000
Срок займа: диапазон 7-168 дней, отображение в днях/неделях
Динамический расчет:
Автоматический пересчет суммы возврата
Обновление даты погашения
Логика 0% для первого займа (≤15 дней, ≤15 000 ₽)
Кнопка получения денег с динамическим временем
Информационный блок (паспорт, дата возврата, процентная ставка)
Особенности логики:
Автокоррекция значений:
Сумма >30 000 → срок = 168 дней
Срок >30 дней → сумма = 100 000 ₽
Процентная ставка:
0% для сумм ≤15 000 и сроков ≤15 дней
0.8% в остальных случаях
Фиксированные суммы возврата для длительных периодов
Технические требования:
Использование PHP для инициализации данных
Чистый CSS для стилизации ползунков
JavaScript-логика с:
Обработчиками событий ползунков
Динамическими расчетами
Автообновлением времени на кнопке
Поддержка склонений числительных (день/дня/дней)
Адаптивная верстка
Визуальные элементы:
Стилизованные ползунки с градиентным handle
Четкая типографика с акцентами
Иконки для информационного блока
Интерактивные элементы с hover-эффектами
Дополнительно: реализуй механизм сохранения выбранных значений при повторном открытии и обеспечь корректную работу при отключенном JavaScript.

Затем по этому коду был написан основной код калькулятора , примерно 600 строчек.

Код выложил на GitHub: https://github.com/Progaem-com/MFO_calculator

Вывод : Если создаёте финансовые инструменты — дважды тестируйте их выполнение ! У кого есть опыт — делитесь кейсами в комментариях.

Хотите, создать калькулятор займов для микрокредитных организаций ? Обратитесь по контактным данным на этом сайте.


Bitrix CMS : Автоматическое добавление номеров страниц пагинации

Чтобы автоматически добавлять номера страниц пагинации в мета-теги на CMS Битрикс, можно использовать следующие подходы:

1. Решение через обработчик события (глобально для всех страниц)

Добавьте код в /bitrix/php_interface/init.php:

AddEventHandler('main', 'OnBeforeProlog', 'modifyMetaForPagination');
function modifyMetaForPagination() {
    global $APPLICATION;

    foreach ($_GET as $key => $value) {
        if (strpos($key, 'PAGEN_') === 0) {
            $pageNumber = (int)$value;
            if ($pageNumber > 1) {
                // Обработка Title
                $currentTitle = $APPLICATION->GetTitle();
                if ($currentTitle) {
                    $APPLICATION->SetTitle($currentTitle . ' - Страница ' . $pageNumber);
                }

                // Обработка Description
                $currentDesc = $APPLICATION->GetPageProperty('description');
                if ($currentDesc) {
                    $APPLICATION->SetPageProperty('description', $currentDesc . ' - Страница ' . $pageNumber);
                }
            }
            break;
        }
    }
}

Преимущества:

  • Работает для всех страниц с пагинацией.
  • Не требует изменения шаблонов компонентов.

2. Решение через шаблон компонента (например, для catalog.section)

Добавьте код в начале шаблона компонента (например, /bitrix/templates/ваш_шаблон/components/bitrix/catalog.section/your_template/template.php):

if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();

global $APPLICATION;

$pageNumber = (int)$_GET['PAGEN_1'];
if ($pageNumber > 1) {
    // Обновляем Title
    $originalTitle = $APPLICATION->GetTitle();
    $APPLICATION->SetTitle($originalTitle . ' - Страница ' . $pageNumber);

    // Обновляем Description
    $originalDesc = $APPLICATION->GetPageProperty('description');
    $APPLICATION->SetPageProperty('description', $originalDesc . ' - Страница ' . $pageNumber);
}

// Далее идет стандартный код шаблона

Преимущества:

  • Локальное изменение только для конкретного компонента.
  • Позволяет гибко настраивать формат для разных разделов.

Важные замечания:

  1. Проверка номера страницы: Код добавляет номер только если > 1 (чтобы избежать “Страница 1”).
  2. Кодировка и SEO: Убедитесь, что мета-теги не обрезаются (проверьте максимальную длину).
  3. Множественная пагинация: Если на странице несколько пагинаций (например, PAGEN_1 и PAGEN_2), код обработает первый найденный параметр.

Пример результата для PAGEN_1=2:

<title>Каталог напольных покрытий - Страница 2</title>
<meta name="description" content="Широкий выбор напольных покрытий. Страница 2">

Если есть вопросы задавайте в комментариях.


Google Apps Script: Мощный инструмент для автоматизации в Google

Сегодня поговорим о Google Apps Script — инструменте, который позволяет превратить рутину в магию автоматизации, расширяя возможности Google Workspace. Если вы ещё не знакомы с ним, эта статья станет вашим гидом в мир скриптов, триггеров и бесшовной интеграции с сервисами Google.

Что такое Google Apps Script?

Google Apps Script — это облачная платформа для написания скриптов на основе JavaScript, созданная Google для автоматизации задач и разработки кастомных решений внутри их экосистемы. Это как «волшебная палочка» для тех, кто работает с Google Таблицами, Документами, Gmail, Диском и другими сервисами.

GAS не требует настройки серверов, IDE или сложных инструментов. Всё делается прямо в браузере через встроенный редактор.

Зачем он нужен?

Автоматизация рутины:

  • Отправка писем при изменении данных в таблице.
  • Генерация отчётов в Docs на основе шаблонов.
  • Синхронизация данных между Google Sheets и внешними API.

Расширение функционала Google-сервисов:

  • Создание кастомных функций в Таблицах (например, =GET_WEATHER(“Москва”)).
  • Разработка аддонов для Google Workspace.

Быстрое прототипирование:

  • За час можно создать MVP веб-приложения, которое работает с вашими данными из Google Drive.

Основные возможности

1. JavaScript + Google API

GAS использует синтаксис JavaScript, но с добавлением специальных классов для работы с Google-сервисами. Например:

// Отправить email через Gmail
function sendEmail() {
  const subject = "Привет из Apps Script!";
  const body = "Это тестовое письмо.";
  GmailApp.sendEmail("[email protected]", subject, body);
}

2. Встроенные сервисы

  • SpreadsheetApp: Чтение/запись данных в Google Таблицы.
  • DocumentApp: Создание и редактирование Google Документов.
  • DriveApp: Управление файлами на Google Диске.
  • UrlFetchApp: Отправка HTTP-запросов к внешним API.

3. Триггеры

Скрипты могут запускаться автоматически:

  • По событию: Например, при отправке формы или изменении ячейки в Таблице.
  • По расписанию: Каждый день в 9:00, раз в час и т.д.

Пример триггера для ежедневного отчёта:

function createDailyReport() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet();
  const data = sheet.getRange("A1:B10").getValues();
  // ... логика формирования отчёта ...
}

4. Веб-приложения

С помощью GAS можно развернуть веб-приложение, которое будет доступно по URL. Пример:

function doGet() {
  return HtmlService.createHtmlOutput("<h1>Hello World!</h1>");
}

Примеры использования

Кейс 1: Персонализированная рассылка из Google Sheets

  1. В таблице есть столбцы: Email, Имя, Дата подписки.
  2. Скрипт ежедневно проверяет, кому нужно отправить письмо.
  3. Использует шаблон из Google Docs для генерации текста.
function sendPersonalizedEmails() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("Contacts");
  const data = sheet.getRange("A2:C").getValues();

  data.forEach(row => {
    const [email, name, date] = row;
    const template = DocumentApp.openById("ID_ШАБЛОНА").getBody().getText();
    const message = template.replace("{{name}}", name);
    GmailApp.sendEmail(email, "Ваш персональный отчёт", message);
  });
}

Кейс 2: Интеграция с внешним API

Получение курса валют и запись в Google Таблицу:

function fetchCurrencyRates() {
  const response = UrlFetchApp.fetch("https://api.exchangerate-api.com/v4/latest/USD");
  const data = JSON.parse(response.getContentText());
  const rate = data.rates.RUB;

  const sheet = SpreadsheetApp.getActive().getSheetByName("Rates");
  sheet.getRange("A1").setValue(`Курс USD/RUB: ${rate}`);
}

Как начать? Пошагово

  1. Откройте редактор скриптов:
    В Google Таблицах или Документах: Расширения → Apps Script.
  2. Напишите первую функцию:
    Например, скрипт, который добавляет текущую дату в ячейку:
<!-- wp:code -->
<pre class="wp-block-code"><code></code></pre>
<!-- /wp:code -->
  1. Запустите скрипт:
    Нажмите ▶️ в редакторе и разрешите доступ к данным.
  2. Добавьте триггер:
    В редакторе: Триггеры → Добавить триггер → Выберите функцию и условия.

Ограничения

  • Время выполнения: 6 минут для триггеров, 30 минут для ручного запуска (бесплатный аккаунт).
  • Квоты: Ограничения на количество писем (100/день), запросов к API (20 000/день).
  • Сложные вычисления: Не подходит для ресурсоёмких задач (лучше использовать Cloud Functions).

Советы для разработчиков

Используйте кэширование:

<!-- wp:code -->
<pre class="wp-block-code"><code></code></pre>
<!-- /wp:code -->

Работайте с библиотеками:
Подключайте сторонние JS-библиотеки через Resources → Libraries.

Дебаггинг:
Используйте Logger.log() и просматривайте логи в View → Logs.

Оптимизируйте запросы:
Читайте/пишите данные диапазонами, а не по ячейкам:

// Плохо:
sheet.getRange("A1").setValue("1");
sheet.getRange("A2").setValue("2");

// Хорошо:
sheet.getRange("A1:A2").setValues([["1"], ["2"]]);

Почему стоит попробовать Apps Script?

  • Low-code: Даже новички смогут автоматизировать задачи за пару часов.
  • Интеграция без боли: Не нужно настраивать OAuth для Google-сервисов.
  • Бесплатно: Для старта хватит обычного аккаунта Google.
  • Мощь JavaScript: Под капотом — знакомый язык с асинхронными возможностями (ES6+).

Заключение

Google Apps Script — это идеальный инструмент для тех, кто хочет выжать максимум из Google Workspace без лишних сложностей. Он подходит для:

  • Маркетологов: Автоматизация отчётов и рассылок.
  • Разработчиков: Быстрое прототипирование интеграций.
  • Админов: Управление документами и правами в компании.

Попробуйте прямо сейчас: Откройте Google Таблицы, создайте скрипт, который добавляет текущую дату в ячейку при открытии файла. Вы удивитесь, насколько это просто!

А вы уже используете Apps Script в своих проектах? Делитесь кейсами в комментариях!