Spense.app v0.1
Выкатил версию 0.1 своего "приложения" для учета денег, решил отчитаться о прогрессе. "Приложения" - потому что это не настоящее приложение, а Progressive Web App - по сути веб-сайт, который можно открыть в телефоне, добавить на Home Screen, и он будет открываться на весь экран, без панелей браузера. Настоящие приложения я пока делать не умею, но и в текущем виде оно уже неплохо работает.
Кстати, даже иконка уже есть, нарисовал в ChatGPT/DALL-E:
Как вы уже поняли, свою поделку я назвал Spense. Это название я придумал когда-то давным давно, подрезав слово "expense", и тогде же купил домен, который вот только сейчас более-менее стал мной использоваться.
Сейчас там из пользователей только я, регистрации нет, и, думаю, как минимум до версии 1.0 всё будет закрыто, но я с удовольствием покажу, как там сейчас обстоят дела и что изменилось.
Изменения в 0.1
Формат отображения валют
По умолчанию все деньги отображались в виде €12345.67
. Меня бесило, что значок валюты спереди (особенно когда это рубли, очень дико выглядит), поэтому переделал на 12,345.67 €
.
Вообще, в разных странах знак валюты то спереди, то сзади, и десятичные разделители разные, поэтому возни там будет еще порядочно.
"Мягкое" удаление кошельков и транзакций
Раньше кошельки и транзакции удалялись по-настоящему при нажатии на "крестик". Теперь они просто отовсюду скрываются, но запись в базе данных остается, чтобы можно было потом обратно восстановить. В целом, не удалять данные - хорошая практика при разработке, но к ней нужно привыкнуть.
Дата добавляемой транзакции
Раньше поле "Date" было просто редактируемой датой, которая была сегодняшней по умолчанию:
Выглядело это логичным и удобным примерно до следующего дня, когда я решил записать очередную трату, открыл страницу, а дата там висела со вчерашнего дня, потому что приложение не перезапускалось. Пришлось руками перетыкивать на сегодняшнюю дату, было тупо.
Теперь вместо даты там "now", и в этом случае транзакция всегда создается с текущей датой, но опционально можно ее поменять:
Кстати, в одном из популярных приложений видел отдельную кнопку "Yesterday". Можно тоже как-нибудь добавить, потому что это второй по популярности юзкейс.
Список транзакций
Как ни странно, списка всех транзакций в интерфейсе до сих пор не было, только во внутренней админке. Мне оно нужно редко, но для порядку добавил этот раздел, с разбивкой на страницы и с фильтром по кошельку и дате:
В интерфейсе добавления, кстати, тоже отображается несколько последних транзакций, но этот список в основном используется для исправления недавних ошибок:
Пополнение базы транзакций историческими данными
Если вкратце, это была каторга. Последний раз я импортировал транзакции в Spense из своих табличек около двух лет назад, и сейчас, когда я вернулся обратно к разработке, нужно было эти данные "догнать". За эти два года у меня произошло много интересного, поэтому пришлось перелопатить большое количество выписок с новых счетов и синхронизировать данные из своих последних табличек.
Универсальный инструмент для импорта истории транзакций - это отдельный большой проект, поэтому вместо этого я написал некоторое количество скриптов для каждого формата данных. Самая засада там в том, чтобы превратить назначение платежа в нормальный тег в Spense, и это заняло большую часть времени. Например:
- назначение платежа
BOLT.EU/O/123456...
- это на самом делетакси
; BOLT.EU/R/56789...
-самокат
;BOLT.EU/D/24679...
- это Bolt Food, доставка на дом, которую я приравниваю ккафе
.
Теперь представьте, что у вас таких транзакций несколько тысяч :-)
Но в общем и целом получилось неплохо, я не жалуюсь. Хотя по дороге потерялось где-то 20-30 некритичных транзакций, и я совсем забыл о транзакциях вида "снятие наличных" и "перевод между счетами", мне пока хватит. Закину эти недочеты в задачи на будущее.
Кстати о задачах!
Ведение проекта
Помню, около месяца назад вылез один баг, и в тот момент я понял, что надо бы все баги, идеи и прочие задачи куда-нибудь складывать, чтобы они не терялись и в конечном счете реализовывались. А так как репозиторий с кодом лежит на Гитхабе, я решил далеко не ходить и завел проект в GitHub Projects. Там все как обычно: таски и доски, а большего мне и не надо.
Вообще, с этим само-проджект-менеджментом я потихоньку учусь отделять важное от неважного. Например, заполнить базу данных транзакциями мне нужно было для того, чтобы получить более полный набор данных для экспериментов (определение тенденций, прогнозирование, и т. д.). То есть вполне допустимо, если среди этих 9-10 лет истории потеряется пара десятков небольших платежей. А вот если бы мне на работе как программисту дали бы подобную задачу, я бы очень долго корпел, чтобы ни одна транзакция не потерялась, и потратил бы месяц.
Короче, учусь делать "достаточно хорошо", задвигая перфекционизм куда подальше и держа в голове контекст и планы на следующие версии.
Идеи для следующей версии
К версии 0.2 я хочу еще прокачать мобильный интерфейс, потому что там все-таки нет много чего нужного. Изначально Spense задумывался как платформа с разухабистым десктопным интерфейсом, и только пару месяцев назад я понял, что надо это адаптировать для мобилки.
Пока я планирую:
- добавить страницу со списком кошельков и отображением текущего баланса;
- хорошо бы на этой странице еще уметь добавлять новые кошельки и редактировать существующие;
- реализовать добавление доходов, а не только расходов (да, транзакции с зарплатой я себе сейчас добавляю очень витиеватым способом);
- добавить функцию перемещения денег между счетами и вывода наличных;
- добавить историю изменения транзакции (потом как-нибудь расскажу, зачем это надо).
Конечно, на уровне бэкенда и базы данных почти все эти фичи уже есть, но надо их довести до мобильного интерфейса, по возможности не превращая его в 1С-Бухгалтерию.
Ну и еще я хочу наконец-то добавить какие-нибудь вменяемые автотесты и кое-что сделать с инфраструктурой, но это больше по айтишной теме. Думаю, кстати, что можно параллельно писать про всякие технические штуки, так что следующий пост будет программистским, про "внутреннюю кухню".
Stay tuned!
Абстракции и наследование в Си - стреляем по ногам красиво
TL;DR Иногда нет-нет да и хочется что-нибудь абстрагировать и обобщить в коде на Си. К примеру, хочешь ты принтануть содержимо...
Медовый месяц в Беларуси: Дорога и первый день в Минске
До Жуковского аэропорта от Москвы можно доехать на Рутакси за косарь и час-полтора. Жуковский аэропорт - маленький, тихий, спок...
Учим немецкий
Герц (Гц) - это единица измерения частоты, сколько раз в секунду происходит какое-то событие. Названа в честь Генриха Герца ( He...
Дилемма об отношении к курьерам
Курьерам Деливери клаба, Яндекс.Еды, Яндекс.Лавки, Самоката и прочим пешевелосипедным трудягам зимой объективно тяжело работать ...
Не прокатило
Звонок программисту (П) от рекрутера (HR). HR: Ало, привет, я Маша из агентства "Олег и таланты", у меня есть классная вакансия...
Spense.app "под капотом". Код.
Пока Spense v0.2 в разработке, хочу рассказать о внутренней организации приложения с технической точки зрения. Статья эта в осно...