Уже несколько лет использую GnuCash для учета личных финансов. В целом эта программа нравится, но кое-что хотелось бы переработать:
- Поддержка мультивалютности: она есть, но неудобная: все счета привязаны к конкретной валюте (ниже напишу более подробно как я хочу)
- Ввод разделенных транзакций по шаблону: хочется чтобы суммы остальных частей пересчитывались автоматически
- При вводе транзакций/сплитов в дроп-даун попадают скрытые счета
- некоторые прочие мелкие косяки
Наверное некоторые из этих недостатков можно было бы решить в существующем GnuCash, но вот мое представление о мультивалютности (я кстати писал о нем в рассылку gnucash) не очень укладывается в существующую схему базы данных, так что даже если брать gnucash за основу и форкать, перерабатывать все пришлось бы весьма существенно.
Идея с мультивалютностью заключается в том, чтобы отвязать счета от валют: то есть валюта будет указываться в каждом сплите (части транзакции, изменяющей сумму на одном счете). Таким образом на каждом счете смогут одновременно существовать несколько балансов в разных валютах. Это удобно тем, что когда у пользователя много используемых валют, ему не придется дублировать все свои счета под все валюты. Сделал один счет «наличные», и туда можно записывать и рубли, и доллары, и евро и все что угодно. Или другой пример: сделать один счет «брокерский», и на него записать «акции XXXX», «акции YYYY» и т.д. (каждый вид ценных бумаг как отдельная валюта)
>>> подробное описание требований к программе (1 фаза)
Пока что больше думал в сторону того, чтобы сделать это как десктопное приложение с хранением данных в виде базы SQLite, но не уверен в этом решении: в будущем хочется иметь и мобильную версию тоже. Так придется код писать с нуля, и синхронизировать базу каким-то внешним инструментом. Но если делать веб-приложение, то тогда встают более остро вопросы безопасности и хостинга.
Пытался сделать что-то с помощь PyQt и LLM, но видимо не очень хватает компетенции и я сам не до конца понимаю как оно должно работать (в плане архитектуры). Gemini посоветовал Model-View-Presenter, но пока что это выглядит просто как перекладывание данных туда-сюда.
Особую сложность пока что вызывает обработка ввода/изменения данных. С одной стороны, у меня и так реализовано отображение данных, и хочется при изменении просто перезагрузить все. Потому что отобразить выписку по выбранному счету и сплиты по выбранной транзакции – дело пары не очень сложных SQL-запросов. Так не надо дублировать логику, меньше шансов ошибок. Но с другой стороны, не очень понятно, можно ли это реализовать без моргания интерфейса, потери фокуса поля и прочих подобных эффектов. А вот если не перезагружать все, а прицельно изменять – кажется что это потребует весьма глубокого анализа. Например, если пользователь переводит сплит с одного счета на другой, то это отразится на:
- балансах старого и нового счета в валюте сплита
- балансе активного счета после каждой транзакции, которая была сделана после редактируемой (в валюте сплита) А ведь это лишь один пример: пользователь может поменять дату транзакции, сумму или валюту сплита, и на все все такие изменения нужно будет просчитать импакт и реализовать пересчет.
В процессе написания этой темы решил все же залить свои наработки куда-нибудь, а то совсем без кода как-то не очень серьезно. Но пока это очень сырая версия (и не исключено переписывание с нуля).
>>> репозиторий
Предполагается что это будет свободный, скорее всего некоммерческий проект (если будет решено сделать веб-приложение, то возможно будет хранение пользовательских данных за деньги как альтернатива self-hosted).
Оптимистичные планы (фазы проекта):
- Ручной ввод и отображение данных. То что описано в требованиях выше.
- Отчеты, хранение курсов валют (для отчетов)
- Импорт данных (например выписки из банков в CSV)
- Мобильное приложение
Но самому мне с этим похоже что не справиться. Поэтому буду рад, если кто-то сможет помочь в любых формах:
- Советы
- Код-ревью
- Пулл-реквесты
- Переписывание с нуля по требованиям
Не исключаю возможность оплаты (ниже рынка, зато без NDA).