Skip to content

Latest commit

 

History

162 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CreditCalc — кредитный график

Pull request checks Release version Release Version License Demo RuStore APK

Бесплатное веб- и Android-приложение для расчёта кредитного графика, сверки с банковским графиком и планирования досрочных погашений. В приложении нет рекламы и аналитики. Расчёты выполняются локально, данные сохраняются на устройстве.

Веб-версия публикуется через GitHub Pages и устанавливается как PWA. Android-версия собирается через Capacitor и предназначена для распространения подписанным APK через GitHub Releases и RuStore.

Установка

Что умеет приложение

  • считать аннуитетные и дифференцированные платежи;
  • учитывать ежедневное или периодическое начисление процентов;
  • для метода фактических дней настраивать базу года: Actual/360, Actual/365, Actual/366 или Actual/Actual; при периодическом методе база года явно не применяется;
  • хранить несколько кредитов с отдельными параметрами, платежами, льготными периодами, темой и настройками интерфейса;
  • быстро переключаться между кредитами, переименовывать, создавать и удалять кредиты;
  • строить банковский график платежей с первой строкой выдачи кредита;
  • выбирать, добавляется ли первый платёж только процентами к договорному сроку или входит в него;
  • показывать колонки “по кредиту”, “по процентам”, “итого” и остаток задолженности;
  • скрывать колонку “комиссия”, если комиссий в расчёте нет;
  • считать итоги по кредиту, процентам, комиссиям и общей сумме за весь срок;
  • добавлять разовые досрочные платежи в любую дату;
  • указывать разовый досрочный платёж как сумму сверх платежа или как общую сумму списания с комиссией досрочного погашения в дату регулярного платежа;
  • временно отключать разовый досрочный платёж отдельным переключателем без удаления записи;
  • добавлять регулярные досрочные платежи: раз в неделю, каждый месяц, раз в 2 месяца, квартал, полгода, год, ежегодная премия, процент от регулярного платежа или общий ежемесячный платёж в дату списания;
  • задавать дату окончания регулярного платежа и пропускать отдельные месяцы;
  • временно отключать регулярное правило отдельным переключателем без удаления записи;
  • выбирать стратегию операции: сократить срок, снизить платёж или закрыть кредит полностью;
  • сравнивать сценарии: без досрочных, сокращение срока, снижение платежа и “по операциям”;
  • подбирать минимальный план для закрытия на 6 месяцев, 1, 2, 3, 5 или 10 лет раньше, к выбранной дате, в заданном ежемесячном бюджете или с ограничением общей переплаты;
  • сравнивать ежемесячный, общий, разовый и комбинированный варианты рядом с кнопкой расчёта, скрывать результаты, просматривать новый график и атомарно добавлять выбранный план в кредит;
  • пересчитывать будущие платежи и проценты после досрочных погашений;
  • раскрывать формулу строки графика: период начисления, число дней, база года, остаток для процентов, проценты до округления, округление и порядок операций;
  • учитывать льготные периоды: полная отсрочка, только проценты, уменьшенный или индивидуальный платёж, начисление процентов и капитализацию;
  • показывать остаток долга на текущий день: тело кредита, проценты и общую сумму;
  • показывать ближайший платёж: дату, итог, тело кредита, проценты, комиссию при наличии и остаток после платежа;
  • показывать прогресс погашения и понятное сокращение срока;
  • быстро переходить в графике к дате, месяцу или году;
  • фильтровать график по году, искать строку по сумме и сворачивать месяцы;
  • переключать график на мобильных устройствах между карточками и компактной таблицей без горизонтальной прокрутки;
  • настраивать тему, акцентный цвет, ночной режим и точность отображения сумм;
  • экспортировать график в CSV или HTML-таблицу для Excel, сохранять кредит в JSON и загружать JSON обратно;
  • предварительно просматривать JSON перед загрузкой и выбирать действие: создать новый кредит или заменить текущий;
  • создавать ссылку на расчёт и восстанавливать кредит из такой ссылки;
  • проверять обязательные параметры перед созданием JSON, ссылки или кода параметров;
  • печатать воспроизводимый отчёт с ключевыми настройками расчёта, сохранять его в PDF средствами браузера или открывать системную печать Android;
  • показывать версию приложения и страницу “Что изменилось”;
  • устанавливаться как отдельное приложение, запускаться офлайн, показывать состояние сети и предлагать новую версию без принудительной перезагрузки; напоминание об установке можно отложить на неделю или отключить;
  • хранить историю изменения процентной ставки, применять её со следующего платёжного периода или точно с даты изменения и показывать историю ставок в печати, импорте и ссылках.

Документация

Передача расчёта ссылкой

В разделе “Импорт/экспорт” можно создать ссылку на полный расчёт кредита, выбранного в шапке приложения. В ссылку попадают:

  • название кредита;
  • параметры кредита;
  • история изменения ставки;
  • разовые и регулярные досрочные платежи;
  • льготные периоды;
  • выбранный сценарий;
  • настройки интерфейса.

График платежей и сравнение сценариев в ссылке не сохраняются. Они пересчитываются локально после открытия.

При открытии ссылки приложение предложит:

  1. создать новый кредит из данных ссылки;
  2. заменить текущий кредит;
  3. отказаться от загрузки.

Важно: любой человек, получивший ссылку, сможет увидеть параметры расчёта. Если операций много и ссылка становится слишком большой, используйте JSON-экспорт. Старые ссылки и JSON-файлы без новых необязательных полей продолжают открываться: приложение подставляет документированные значения по умолчанию. Отсутствующая валюта получает RUB, legacy-код RUR мигрирует в RUB с предупреждением, а другие явно неизвестные валюты отклоняются; суммы не конвертируются.

Локальный запуск

Требования:

  • Node.js 22;
  • pnpm через Corepack.
corepack enable
pnpm install
pnpm dev

После запуска Vite покажет локальный адрес приложения в терминале. В production-режиме расчёт выполняется в Web Worker, чтобы большие графики не блокировали интерфейс; в тестовой среде, старых браузерах, при повреждённом ответе или тайм-ауте Worker используется синхронный fallback.

Локальная Android-сборка

Для Android дополнительно требуются JDK 21, Android Studio и Android SDK 36:

pnpm android:sync
pnpm android:open

Готовый debug APK создаётся командой pnpm android:apk:debug в android/app/build/outputs/apk/debug/app-debug.apk. Он подписан отладочным ключом и предназначен только для локальной проверки. Подробности выпуска подписанного APK приведены в Android-инструкции.

Проверки перед публикацией

pnpm lint:workflows
pnpm lint
pnpm typecheck
pnpm test
pnpm test:coverage
pnpm build
pnpm test:pwa
pnpm test:e2e
pnpm audit --prod

Что проверяется:

  • TypeScript-компиляция;
  • статический анализ TypeScript и React Hooks через ESLint;
  • тесты расчётного ядра, импорта, экспорта, ссылок и базовых UI-сценариев;
  • пороги покрытия Vitest;
  • production-сборка;
  • состав PWA precache, изоляция scope/Cache Storage и реальный автономный запуск в Chromium;
  • известные уязвимости production-зависимостей.

Версия приложения берётся из package.json, дата сборки и commit SHA добавляются при production-сборке, а список изменений читается из CHANGELOG.md.

Для двухнедельных и квартальных графиков срок в месяцах переводится в ближайшее целое количество платёжных периодов. Например, 1 месяц при двухнедельном графике даёт 2 платежа, а 12 месяцев — 26 платежей.

Если браузер не даёт сохранить данные в localStorage (приватный режим, переполненная квота или запрет хранилища), приложение показывает предупреждение, что последние изменения не сохранены. В этом случае можно сразу скачать JSON или повторить сохранение после освобождения места.

Установка PWA не создаёт резервную копию финансовых данных. Кнопка «Повысить надёжность» запрашивает у браузера persistent storage и может уменьшить риск автоматической очистки origin, но не защищает от ручной очистки профиля, повреждения устройства или удаления данных пользователем. Для восстановления используйте JSON-экспорт.

Предложение установить PWA появляется только при поддержке браузером. Его можно отложить на семь дней или отключить; доступная системная кнопка установки при этом остаётся в разделе «Параметры». В нативной Android-версии браузерные PWA-уведомления и запрос persistent storage не показываются.

На первом запуске приложение до ввода параметров предупреждает, что GitHub Pages использует общий origin ant-m13.github.io. Кнопка «Работать без сохранения» и переключатель в настройках удаляют persisted-кредит и оставляют дальнейшие изменения только в памяти текущей вкладки; перед её закрытием такой расчёт нужно экспортировать в JSON.

При восстановлении старых данных приложение нормализует формат, мигрирует legacy-режим amountMode: "total" в amountMode: "totalWithFee" и помещает повреждённые кредиты в карантин с отчётом в интерфейсе.

Отключённые разовые платежи и регулярные правила остаются в списках, выделяются приглушённым видом и не попадают в расчёт. Старые записи с нулевой суммой или нулевым процентом также считаются временно отключёнными для совместимости.

Публикация на GitHub Pages

Основная публикация GitHub Pages выполняется внутри .github/workflows/auto-release.yml вместе с созданием релиза.

Он выполняет:

  1. использует уже проверенные исходники версии;
  2. собирает сайт с repository scope;
  3. проверяет состав PWA-сборки;
  4. запускает production E2E, включая автономный запуск;
  5. публикует папку dist через GitHub Pages после создания тега и GitHub Release.

Для первого запуска в GitHub откройте Settings → Pages и выберите источник GitHub Actions. После этого публикация будет выполняться при успешном выпуске версии. .github/workflows/deploy-pages.yml оставлен только для ручной повторной публикации уже существующего release-тега.

Адрес опубликованного сайта обычно выглядит так:

https://<owner>.github.io/<repository>/

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

Релизы с готовым сайтом

Для релизов, публикации и обслуживания используются:

  • .github/workflows/auto-release.yml — единственный автоматический release-процесс: проверяет проект, создаёт git-тег vX.Y.Z и GitHub Release, публикует Pages и запускает подписанную Android-сборку;
  • .github/workflows/deploy-pages.yml — вручную повторно публикует GitHub Pages из уже существующего release-тега;
  • .github/workflows/release-dist.yml — вручную пересобирает архив сайта по уже существующему release-тегу;
  • .github/workflows/android-release.yml — автоматически использует результаты проверки основного release-процесса или при ручном запуске повторяет проверки и собирает подписанный APK для существующего release-тега;
  • .github/dependabot.yml — еженедельно проверяет обновления npm-зависимостей и GitHub Actions.

Обычный выпуск версии:

pnpm lint:workflows
pnpm lint
pnpm typecheck
pnpm test
pnpm test:coverage
pnpm build
pnpm test:pwa
pnpm test:e2e
pnpm audit --prod
git add package.json CHANGELOG.md README.md docs src .github
git commit -m "chore(release): prepare 1.8.0"
git push origin release/1.8.0

После merge release-ветки в main workflow сам создаст тег и GitHub Release, запустит публикацию GitHub Pages и добавит в тот же релиз подписанный Android APK с SHA-256. Ручной запуск release-dist.yml, deploy-pages.yml или android-release.yml остаётся доступен для существующего тега, например v1.8.0; для Android должны быть настроены секреты release-подписи.

Архив релиза содержит готовую папку dist и подходит для размещения на любом статическом хостинге.

Ограничения

Расчёт является справочной финансовой моделью. Фактический график банка может отличаться из-за условий договора, операционного дня, правил округления, внутренних банковских правил и особенностей проведения платежей.

Для сверки с банком используйте раскрываемую формулу строки графика и настройки начисления процентов.

Для защиты браузера от ошибочных или чрезмерно больших данных действуют технические лимиты: срок до 1200 месяцев, до 1000 изменений ставки, до 5000 досрочных операций в расчётном ядре, до 5000 правил досрочных платежей, до 100 льготных периодов и до 10000 строк графика.

Технологии

  • React
  • TypeScript
  • Vite
  • Zustand
  • Decimal.js
  • Recharts
  • Capacitor
  • Vitest

Расчётное ядро находится в src/loanEngine, состояние — в src/store.ts, нормализация и миграции — в src/storeNormalization.ts, запуск синхронного и Worker-расчёта — в src/loanCalculationRunner.ts, основные разделы интерфейса — в src/components, прикладные сценарии вынесены в src/hooks, а src/App.tsx связывает маршрутизацию разделов и общую компоновку приложения.

About

Браузерный кредитный калькулятор с досрочными платежами, льготными периодами и переменной ставкой

Topics

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Used by

Contributors

Languages