mf

@mf/finance (0.1.0)

Published 2026-08-21 11:07:05 +00:00 by lucky

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
Details
npm
2026-08-21 11:07:05 +00:00
0
14 KiB
Assets (1)
Versions (8) View all
0.8.0 2026-08-23
0.7.0 2026-08-23
0.6.0 2026-08-23
0.5.0 2026-08-21
0.4.0 2026-08-21