Конверты, итерация 2: периметр обязательств, знак валюты, курс словами - #63
Open
Tarasusrus wants to merge 6 commits into
Open
Конверты, итерация 2: периметр обязательств, знак валюты, курс словами#63Tarasusrus wants to merge 6 commits into
Tarasusrus wants to merge 6 commits into
Conversation
Окно финансирования регулярных платежей было месяцем вперёд (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 и тест зеленел ни на чём.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Три правки по живой выдаче бота.
Обязательства считаются только за период конверта
Окно финансирования регулярных платежей было месяцем вперёд — аренда 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, который был красным до этих задач — он ждал формат ответа, отменённый в прошлой итерации.