LINUX.ORG.RU

Требуется помощь с разработкой приложения для учета личных финансов

 , , ,


1

2

Уже несколько лет использую GnuCash для учета личных финансов. В целом эта программа нравится, но кое-что хотелось бы переработать:

  • Поддержка мультивалютности: она есть, но неудобная: все счета привязаны к конкретной валюте (ниже напишу более подробно как я хочу)
  • Ввод разделенных транзакций по шаблону: хочется чтобы суммы остальных частей пересчитывались автоматически
  • При вводе транзакций/сплитов в дроп-даун попадают скрытые счета
  • некоторые прочие мелкие косяки

Наверное некоторые из этих недостатков можно было бы решить в существующем GnuCash, но вот мое представление о мультивалютности (я кстати писал о нем в рассылку gnucash) не очень укладывается в существующую схему базы данных, так что даже если брать gnucash за основу и форкать, перерабатывать все пришлось бы весьма существенно.

Идея с мультивалютностью заключается в том, чтобы отвязать счета от валют: то есть валюта будет указываться в каждом сплите (части транзакции, изменяющей сумму на одном счете). Таким образом на каждом счете смогут одновременно существовать несколько балансов в разных валютах. Это удобно тем, что когда у пользователя много используемых валют, ему не придется дублировать все свои счета под все валюты. Сделал один счет «наличные», и туда можно записывать и рубли, и доллары, и евро и все что угодно. Или другой пример: сделать один счет «брокерский», и на него записать «акции XXXX», «акции YYYY» и т.д. (каждый вид ценных бумаг как отдельная валюта)

>>> подробное описание требований к программе (1 фаза)

Пока что больше думал в сторону того, чтобы сделать это как десктопное приложение с хранением данных в виде базы SQLite, но не уверен в этом решении: в будущем хочется иметь и мобильную версию тоже. Так придется код писать с нуля, и синхронизировать базу каким-то внешним инструментом. Но если делать веб-приложение, то тогда встают более остро вопросы безопасности и хостинга.

Пытался сделать что-то с помощь PyQt и LLM, но видимо не очень хватает компетенции и я сам не до конца понимаю как оно должно работать (в плане архитектуры). Gemini посоветовал Model-View-Presenter, но пока что это выглядит просто как перекладывание данных туда-сюда.

Особую сложность пока что вызывает обработка ввода/изменения данных. С одной стороны, у меня и так реализовано отображение данных, и хочется при изменении просто перезагрузить все. Потому что отобразить выписку по выбранному счету и сплиты по выбранной транзакции – дело пары не очень сложных SQL-запросов. Так не надо дублировать логику, меньше шансов ошибок. Но с другой стороны, не очень понятно, можно ли это реализовать без моргания интерфейса, потери фокуса поля и прочих подобных эффектов. А вот если не перезагружать все, а прицельно изменять – кажется что это потребует весьма глубокого анализа. Например, если пользователь переводит сплит с одного счета на другой, то это отразится на:

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

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

>>> репозиторий

Предполагается что это будет свободный, скорее всего некоммерческий проект (если будет решено сделать веб-приложение, то возможно будет хранение пользовательских данных за деньги как альтернатива self-hosted).

Оптимистичные планы (фазы проекта):

  1. Ручной ввод и отображение данных. То что описано в требованиях выше.
  2. Отчеты, хранение курсов валют (для отчетов)
  3. Импорт данных (например выписки из банков в CSV)
  4. Мобильное приложение

Но самому мне с этим похоже что не справиться. Поэтому буду рад, если кто-то сможет помочь в любых формах:

  • Советы
  • Код-ревью
  • Пулл-реквесты
  • Переписывание с нуля по требованиям

Не исключаю возможность оплаты (ниже рынка, зато без NDA).

★★★★★
Ответ на: комментарий от Stanson

Кстати, для упрощения этого процесса, можно в учитывалку прикрутить, например, распознавалку чеков - OCR с парсингом.

Зачем парсить чеки?
Если у тебя есть более-менее стабильная потребительская корзина, то достаточно подтягивать актуальные цены из интернета. И вот тут уже можно строить историю цены/наличия в разных магазинах.

С т.з. ведения хозяйства я бы вообще строил учёт не от денег, а от остатков условного продукта (в холодильнике) по результатам его поступления/расхода. Учёт денежных затрат как побочный эффект.

Но это уже ближе к asset management, inventory (склад) и т.п. Не бухгалтерия.

MirandaUser2
()
Последнее исправление: MirandaUser2 (всего исправлений: 1)
Ответ на: комментарий от MirandaUser2

Зачем парсить чеки?

Затем, чтобы точно знать что куплено и почём.

Если у тебя есть более-менее стабильная потребительская корзина,

Она может быть относительно стабильна в смысле типов продуктов, но нестабильна в смысле производителей и соответственно цены.

то достаточно подтягивать актуальные цены из интернета.

В интернетах цены не всегда актуальны, и далеко не все отовариваются в магазинах у которых есть сайты с ценами.

С т.з. ведения хозяйства я бы вообще строил учёт не от денег, а от остатков условного продукта (в холодильнике) по результатам его поступления/расхода. Учёт денежных затрат как побочный эффект.

Да, как-то так. Но знать сколько надо денег чтобы поддерживать необходимое количество еды и пр. необходимых вещей всё-же полезно.

Stanson ★★★★★
()
Ответ на: комментарий от MirandaUser2

Продукты это настолько малая часть расходов, 5, максимум 10% от дохода и то я не какой-то буржуй, а обычный наемный раб, что высчитывать копейки за сахар, соль и стиральный пороше, это бред, имхо.

masa ★★
()
Ответ на: комментарий от Stanson

Она может быть относительно стабильна в смысле типов продуктов, но нестабильна в смысле производителей и соответственно цены.

Хз, на дистанции цена за еду в месяц у меня лично стабильна, магазины и экономика так устроены, чтобы в месяц человек тратил X денег на еду. Ну от качества зависит условный множитель, закупаешься ты в пятерке, перекрестке или Азбуке вкуса.

masa ★★
()
Ответ на: комментарий от masa

Хз, на дистанции цена за еду в месяц у меня лично стабильна,

Такое может быть если питаться только товарами цена которых специально удерживается на неизменно низком уровне любыми возможными способами.

магазины и экономика так устроены, чтобы в месяц человек тратил X денег на еду.

Нет, экономика устроена так, чтобы у человеков не оставалось свободного времени.

Ну от качества зависит условный множитель, закупаешься ты в пятерке, перекрестке или Азбуке вкуса.

Вообще-то качество не особо зависит от того, где закупаешься. Качество зависит от поставщика товара. В пятёрке яблоки запросто могут быть намного качественнее и при этом намного дешевле чем в азбуке.

Инфляция может быть хорошо спрятанной. Вчера ты покупал качественные сосиски из свинины с говядиной по 200 рублей, а завтра, в тех же самых сосисках, того же самого производителя за ту же самую цену будет «мясо птицы». Формально - сосиски не подорожали. Реально - приходится искать другого производителя который пока ещё не опустился до «мяса птицы» в сосисках. И эти сосиски, с большой вероятностью, будут дороже. Как бы инфляции нет, и цены на сосиски не поменялись, но в то же самое время ты тратишь на ту же самую жратву больше.

Stanson ★★★★★
()
Ответ на: комментарий от MirandaUser2

Но это уже ближе к asset management, inventory (склад) и т.п. Не бухгалтерия.

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

Cergoo
()
Ответ на: комментарий от Stanson

Нет, экономика устроена так, чтобы у человеков не оставалось свободного времени.

вообще-то в европах уже на 4х дневку переходят

Cergoo
()
Ответ на: комментарий от masa

я собственно о том же. Что важнее знать остатки «на складе», чтобы планировать покупки, а учет расходов это уже побочный эффект.
И не только продуктов, а в принципе всего (одежды, обуви, железа).

MirandaUser2
()
Ответ на: комментарий от hobbit

А GnuCash, как и большинство других подобных программ вроде KMyMoney, на мой взгляд, скорее для небольшого ИП или самозанятого, чем для личных финансов.

Для личных финансов достаточно vi + hledger

Turbid ★★★★★
()
Ответ на: комментарий от Turbid

Для личных финансов достаточно vi + hledger

не сравнивайте свои личные финансы с чужими

Cergoo
()
Ответ на: комментарий от Cergoo

вообще-то в европах уже на 4х дневку переходят

С их налоговой системой выгоднее получать чуть меньше пороговой суммы, чем чуть больше, из-за хреново продуманной системы налогообложения. Из-за инфляции зарплаты чуть повышаются, и порог превышается. Поэтому многие отказываются от одного рабочего дня, чтобы зарплата оказалась ниже налогового порога. Но из-за инфляции денег всё равно не хватает, поэтому приходится изобретать всякие халтуры, причём такие, чтобы не спалиться перед налоговой. Cash only и всё такое.

Stanson ★★★★★
()
Ответ на: комментарий от Cergoo

Ну чисто в теории мою систему можно использовать и как складской учет: завести валюты типа «картошка (кг)», «яйца (шт)» и так далее, сделать счёт «активы:холодильник». Но тогда траты денег на еду будут проходить как обмен валюты, а расходы на еду будут номинированы в килограмах картошки. Мне такой подход не особо нравится, но технически так сделать можно если хочется.

Klymedy ★★★★★
() автор топика
Последнее исправление: Klymedy (всего исправлений: 1)
Ответ на: комментарий от Klymedy

Хотя в принципе если сделать отдельные счета для расхода (съедения, списания) и покупки (аналогичный trading в gnucash) еды, и в отчёт о расходах включать счёт покупки еды, но не включать счёт списания, то в принципе отчёт о расходах может даже выглядеть адекватно.

Klymedy ★★★★★
() автор топика
Ответ на: комментарий от masa

Ты наверно из России

Не угадал, уже 5 лет как живу в другой стране. Но тут точно также используется местная валюта для оплаты всюду (и у тебя никто не примет в условном супермаркете валюту отличную от местной), кроме онлайн платежей на иностранных (относительно страны проживания) сайтов.

Я концептуально знаю, что есть страны со слабой банковской системой, где в ходу бакс параллельно с местной валютой (соответственно, имеет практический смысл носить с собой несколько валют), однако конвертация валют не бесплатна вообще нигде в силу самой идеи курсов валют и их обмена.

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

В общем, спонтанный необдуманный обмен валюты приводит к финансовым потерям (что противоречит идее ведения учёта финансов). Так что человек, по-хорошему, должен иметь представление сколько каждой конкретной валюты у него есть. Если у меня есть тысяча единиц валюты Х и мне надо совершить покупку в ней же, то её можно совершить сразу. А если мне надо совершить покупку в валюте X, а у меня на счету валюта Y, то к самой покупке добавляется упущенная выгода/потенциальный профит от того, что валюта больше не будет лежать на счету и менять свой курс (это могут быть копейки, но тем не менее в сумме за расчётный период могут выйти уже не копейки). Плюс комиссия обменника (как минимум неявная заложенная в разницу курсов).

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 3)
Ответ на: комментарий от KivApple

В общем, спонтанный необдуманный обмен валюты приводит к финансовым потерям (что противоречит идее ведения учёта финансов).

В моем понимании, финансовый учёт это не про то чтобы избегать потерь, а про то чтобы знать где, сколько и каких денег у тебя есть, кому ты должен, откуда получил и куда потратил. А тратить можно хоть на казино в кредит, если правильно вносить эти операции.

Уже далее эта информация может использоваться для планирования, принятия решений об оптимизации и т.д.

Klymedy ★★★★★
() автор топика
Ответ на: комментарий от dicos

Посмотрел про паттерны observer и mediator, хотя пока не до конца понимаю, как их можно было бы применить.

В существующем прототипе для таких сущностей как транзакция, сплит, счет даже классов нет. Просто берем данные из базы, форматируем как надо и засовываем в табличку. Если применять например observer, получается что каждая строка таблицы должна быть отдельным объектом, и наблюдать за всеми предыдущими? Звучит как нечто что будет иметь квадратичную сложность по памяти. А еще, если мы в транзакции поменяем дату (допустим на более позднюю), то надо будет каким-то образом отписать от этой транзакции те транзакции, которые были между старой и новой датами, и подписать перенесенную транзакцию на эти промежуточные.

Klymedy ★★★★★
() автор топика
Ответ на: комментарий от Klymedy

Посмотрел про паттерны observer и mediator, хотя пока не до конца понимаю, как их можно было бы применить.

Если хочешь сделать так, чтобы при обновлении одного поля, сразу обновлялись другие, то придется заморочиться. Например, на основе коллбеков полей ввода.

Да, можно что-то свое наклепать, но в какой-то момент окажется так, что ты переизобретешь уже готовый паттерн.

dicos ★★☆
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.