@mf/finance (0.1.0)
Installation
@mf:registry=npm install @mf/finance@0.1.0"@mf/finance": "0.1.0"About this package
@mf/finance — домен и расчёты раздела «Финансы»
Ни сети, ни криптографии, ни DOM. Сервер не видит сумм и ничего не считает
(ADR-0002), поэтому весь расчёт живёт здесь — и должен работать в тестах
и в локальной песочнице (ADR-0013). Индекс и синхронизация — отдельная точка
входа @mf/finance/store (ADR-0023 §6), её ещё нет.
Экраны собираем в mf/web; сюда не попадает ничего про интерфейс.
Что внутри
| Модуль | Что делает |
|---|---|
day |
календарная дата без времени и поясов; целая арифметика, прижатие к последнему дню месяца |
money |
деньги как целые минорные единицы; деление без потери копеек; комиссии путей ввода и вывода |
recurrence |
двенадцать правил повторения из исходного проекта, состояние плана, догоняющее применение |
amortization |
графики кредита: аннуитет и дифференцированные платежи по фактическим дням |
Откуда взялись правила
Раздел переносится из старого проекта (docs/legacy-budget/), где логика была
обкатана на живых людях. Инварианты из инвентаризации — прямо тест-кейсы:
каждый значимый тест назван тем правилом, которое он защищает.
Исправленные по ходу дефекты источника:
- 31 января плюс месяц уезжало в март — теперь прижимается к 28/29 февраля;
- «ежемесячно 31-го» после февраля навсегда становилось 28-м, потому что вхождения считались прокруткой предыдущего. Теперь — от начала сетки, и 31-е возвращается;
- «каждые N месяцев M-го» не работало вовсе: цикл инициализации не выполнялся ни разу;
- квартальный аннуитет делил ставку на 12 вместо 4;
- подсказка «последний платёж» считалась как
платёж·n − платёж·(n−1), то есть всегда показывала сам платёж; - копейки терялись: суммы позиций чека складывались через
parseInt; - итоги по валютам складывались в одно число — рубли с долларами.
Что выяснилось на тестах
Дифференцированные платежи убывают не монотонно. При начислении по фактическим дням после короткого февраля идёт длинный март, и лишние три дня процентов перебивают уменьшение тела: платёж вырастает. Арифметика верна, но привычная формулировка «дальше только меньше» в интерфейсе будет неправдой раз в год. Закреплено тестом, чтобы не выглядело ошибкой.
Разработка
npm install
npm test # 63 теста
npm run typecheck
npm run build
Публикация в npm-реестр Gitea — release-CI монорепы, идемпотентно по версии.
Новая версия = bump в package.json → пуш в main → bump зависимости в mf/web.
Dependencies
Development Dependencies
| ID | Version |
|---|---|
| @types/node | ^22.0.0 |
| typescript | ^5.6.0 |
| vitest | ^2.1.0 |