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. Там все как обычно: таски и доски, а большего мне и не надо.

In Progress пустой, потому что версию 0.2 я еще не начал делать.

Вообще, с этим само-проджект-менеджментом я потихоньку учусь отделять важное от неважного. Например, заполнить базу данных транзакциями мне нужно было для того, чтобы получить более полный набор данных для экспериментов (определение тенденций, прогнозирование, и т. д.). То есть вполне допустимо, если среди этих 9-10 лет истории потеряется пара десятков небольших платежей. А вот если бы мне на работе как программисту дали бы подобную задачу, я бы очень долго корпел, чтобы ни одна транзакция не потерялась, и потратил бы месяц.

Короче, учусь делать "достаточно хорошо", задвигая перфекционизм куда подальше и держа в голове контекст и планы на следующие версии.

Идеи для следующей версии

К версии 0.2 я хочу еще прокачать мобильный интерфейс, потому что там все-таки нет много чего нужного. Изначально Spense задумывался как платформа с разухабистым десктопным интерфейсом, и только пару месяцев назад я понял, что надо это адаптировать для мобилки.

Пока я планирую:

  • добавить страницу со списком кошельков и отображением текущего баланса;
  • хорошо бы на этой странице еще уметь добавлять новые кошельки и редактировать существующие;
  • реализовать добавление доходов, а не только расходов (да, транзакции с зарплатой я себе сейчас добавляю очень витиеватым способом);
  • добавить функцию перемещения денег между счетами и вывода наличных;
  • добавить историю изменения транзакции (потом как-нибудь расскажу, зачем это надо).

Конечно, на уровне бэкенда и базы данных почти все эти фичи уже есть, но надо их довести до мобильного интерфейса, по возможности не превращая его в 1С-Бухгалтерию.

Ну и еще я хочу наконец-то добавить какие-нибудь вменяемые автотесты и кое-что сделать с инфраструктурой, но это больше по айтишной теме. Думаю, кстати, что можно параллельно писать про всякие технические штуки, так что следующий пост будет программистским, про "внутреннюю кухню".

Stay tuned!