Skip to content

Конверты, итерация 2: периметр обязательств, знак валюты, курс словами - #63

Open
Tarasusrus wants to merge 6 commits into
mainfrom
feature/envelope-iter2
Open

Конверты, итерация 2: периметр обязательств, знак валюты, курс словами#63
Tarasusrus wants to merge 6 commits into
mainfrom
feature/envelope-iter2

Conversation

@Tarasusrus

Copy link
Copy Markdown
Owner

Три правки по живой выдаче бота.

Обязательства считаются только за период конверта

Окно финансирования регулярных платежей было месяцем вперёд — аренда 10.09 при периоде до 06.09 резервировалась уже сейчас. На эталоне это запирало 18 671 ฿ из 128 000 под платежи, до которых придёт свой приход.

Приход дважды в месяц, период конверта совпадает с ритмом прихода, поэтому платёж следующего периода финансируется приходом того периода. Окно теперь равно периоду конверта, обе границы включительно.

Отсечённые платежи не исчезают — уходят блоком «Впереди, из следующего прихода» с суммой и датой. Иначе аренда будет съедена как свободные деньги.

Знак валюты у каждой суммы

В моноблоке конвертов колонка сумм печаталась голыми числами — нельзя было сказать, баты там или рубли. В safe-to-spend знак рубля был прибит к формату руками, местами рядом с суммой, уже переведённой в баты.

Все суммы идут через Display: он держит валюту и курс вместе. Тест разбирает собранный ответ регекспом и падает на любом числе без знака, так что новый Fprintf мимо Display тоже поймается.

Курс задаётся словами

Автокурс приходит из open.er-api.com — межбанк, расходится с обменником, и повлиять на него было нельзя ничем, включая рестарт.

курс 2,7 ставит вручную, курс авто возвращает автоматический, какой сейчас курс показывает действующий и его происхождение.

Ручной курс живёт в отдельной колонке: положить его туда же, куда пишет воркер, значит потерять через сутки. Воркер продолжает обновлять автокурс и под override'ом.

Курс выше 10 ₽/฿ отклоняется с переспросом — «курс 27» почти наверняка сказано без запятой.

Проверено

go build ./... && go test ./... зелёное, с базой и без. Каждый гейт проверен мутацией: return nil в раскладке обязательств, снятие знака валюты, затирание ручного курса воркером — все краснеют.

Живой прогон на реплике через botclient: приход 128 000 ₽ раскладывается, аренда уходит в «Впереди», знак стоит у каждой суммы в обеих таблицах, курс переключается в обе стороны.

Заодно починен TestStartEnvelope, который был красным до этих задач — он ждал формат ответа, отменённый в прошлой итерации.

Окно финансирования регулярных платежей было месяцем вперёд (sinking fund):
аренда 10.09 при периоде до 06.09 резервировалась уже сейчас. На эталоне
оператора это запирало 18 671 из 128 000 под платежи, до которых придёт
свой приход — свободный остаток читался как заниженный.

Приход дважды в месяц, период конверта совпадает с ритмом прихода, поэтому
платёж следующего периода финансируется приходом того периода. Окно теперь
равно периоду конверта, обе границы включительно.

Отсечённые платежи не исчезают: уходят в EnvelopePlan.Upcoming и печатаются
блоком «Впереди, из следующего прихода» — иначе аренда будет съедена как
свободные деньги.

simpleAI-agz4
В моноблоке конвертов колонка сумм печаталась голыми числами — по ней
нельзя было сказать, баты это или рубли. В safe-to-spend знак рубля был
прибит к формату руками, местами рядом с суммой, уже переведённой в баты.

Все суммы идут через Display: он держит валюту и курс вместе, разъехаться
им нечем. Добавлены Display.Signed для уже округлённых чисел моноблока и
FmtAmount для сумм в своей валюте без перевода (подтверждение лимита).

Колонка суммы расширена до 10 знаков под знак валюты.

Тест currency_sign_test.go разбирает СОБРАННЫЙ ответ регекспом и падает на
любом числе без знака — так он поймает и новый Fprintf мимо Display.

simpleAI-302i
Автокурс приходит из open.er-api.com раз в сутки — это межбанк, а меняют
наличными по другому курсу. Повлиять на цифру было нельзя ничем, включая
рестарт бота, и все конверты считались по ней.

«курс 2,7» ставит ручной курс, «курс авто» возвращает автоматический,
«какой сейчас курс» показывает действующий и его происхождение.

Ручной курс живёт в отдельной колонке exchange_rate.manual_rate_to_rub:
положить его туда же, куда пишет воркер, значит потерять через сутки.
Воркер продолжает обновлять автокурс и под override'ом. Чтение выбирает
ручной через COALESCE — «какой курс действует» имеет один ответ.

Курс выше 10 ₽/฿ отклоняется с переспросом: «курс 27» почти наверняка
сказано без запятой, а принять его молча значит раздуть конверты вдесятеро.

Заодно: знак валюты в показе конвертов (две колонки печатались голыми
числами — нашлось живым прогоном) и починен TestStartEnvelope, который
ждал формат ответа, отменённый до этих задач.

simpleAI-su6l
По findings ревью.

Курс печатался двумя форматтерами: FmtRate до двух знаков и decimalComma
с жёстким %.1f. Одна и та же строка «курс X ₽/฿» выходила как 2,54 в
ответе про курс и 2,5 в раскладке конвертов. decimalComma удалён.

Окно блока «Впереди, из следующего прихода» было 31 день от конца периода.
Приход дважды в месяц — в блок затягивало платежи периода ПОСЛЕ следующего
и подписывало их деньгами, которых к тому моменту ещё нет. Окно теперь
равно длине самого периода.

simpleAI-agz4 simpleAI-su6l
Lint красный на main с прошлого мержа. Разгребено целиком, а не только
свои строки: красный CI перестаёт быть сигналом, если к нему привыкнуть.

Своё: непроверенные ошибки восстановления реплики в тестах курса,
дублирующийся пробел в классе символов, срез по Index без проверки на -1
(вернул бы панику вместо внятного сообщения).

Долг прошлой итерации: min и close затеняли встроенные имена, ошибка
определения чата глоталась молча, switch с одной веткой, неиспользуемые
константа и параметр.

Чужое: непроверенные Write и type assertion в тестах телеграма — пустая
строка молча проходила мимо Contains и тест зеленел ни на чём.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant