Траты — Android
Учёт денег по категориям с прогнозом на следующий месяц — и справочник цен, который показывает, где что дешевле.
Галерея
-
Отображается остаток. Он равномерно распределяется на оставшиеся дни в месяце -
Записи группируются по дням, у каждого дня своя сумма. Трата в чужой валюте показывает исходную сумму рядом с категорией — 550 ₽ превратились в 18,70 ₾ по курсу, который вы вписали при записи -
Каждая категория сравнивается со своим средним значением и показывает превышение. Чем больше месяцев заполнено, тем точнее цифры -
Прогноз разделяет обычные траты и запас. Светлая тема идёт за системной настройкой, но её можно выбрать и вручную -
Все цены приведены к одной единице, поэтому колонки сравнимы между собой. Зелёная клетка — где дешевле всего, розовая — где дороже; под ценой стоит фасовка, из которой пересчёт и сделан -
Два смысла цены разведены: слева то, что написано на ценнике, справа — за килограмм и за сто граммов. Видно и разницу между фасовками одного магазина: 500 г выходят дороже килограмма на 17% -
Магазин выбирается один раз и запоминается. Список показывает, что выгодно брать именно здесь, и где дешевле по остальным позициям — с ценой соседа рядом -
Единица выбирается под товар — граммы, килограммы, миллилитры, литры или штуки. Пересчёт считается прямо во время ввода, а цена без скидки хранится рядом, чтобы акция не выдавала себя за обычную цену
О проекте
Приложение я написал для себя, после переезда стало нужно считать деньги внимательнее. Оно складывает расходы по категориям, помнит заработок и показывает, сколько можно тратить в день, чтобы дожить до конца месяца. Есть и прогноз на следующий месяц, он считается по вашим же записям за прошлые месяцы.
Отдельная страница собирает цены в магазинах, чтобы понимать, что и где выгоднее закупать. Таблица «товар × магазин» пересчитывает все цены на одну единицу. Пачка 900 грамм за 11,70 считается так, как если бы в ней был целый килограмм, и выходит 13. Килограмм в соседнем магазине стоит 11,10, так что брать надо там. Клетки покрашены по выгоде, от зелёной к красной. Магазин выбирается один раз и запоминается, в зале не нужно каждый раз показывать, где вы стоите.
Все данные лежат в обычном файле на телефоне. Интернет приложению не нужен, разрешения на него в манифесте нет.
Что внутри
- Норма по категории — медиана за шесть месяцев, а не среднее: один месяц с гостями не переписывает норму на полгода
- Тренд — медиана попарных наклонов, вдвое ослабленная и зажатая в ±30 % от базы, чтобы всплеск не разогнал прогноз
- Сезонность включается только после года записей: месяц сравнивается с собой же год назад относительно медианы своего года, чтобы инфляция не сошла за сезон
- Крупная разовая покупка не попадает в норму, а превращается в резерв: ноутбук раз в восемь месяцев — это одна восьмая каждый месяц
- Заработок и запас разделены: траты сначала съедают заработок и трогают запас, только когда он кончился; остаток и перерасход переносятся в следующий месяц
- Отдельный счёт для аренды: платёж остаётся в тратах месяца, но вычитается не из заработка, а из счёта, который гасят заказы
- Мультивалютность без обращения к сети: курс вводится вручную, подставляется из прошлой записи и сохраняется вместе с тратой — задним числом ничего не пересчитывается
- Все суммы — целые копейки в Long, ни одного double в деньгах; хранение — JSON во внутренней памяти, запись атомарная через временный файл и в фоновом потоке
- В манифесте нет доступа в интернет: только уведомления и будильники для напоминаний о платежах, которые переживают перезагрузку телефона
- Release-сборка 1,5 МБ: R8, вырезание ресурсов, Views и ViewBinding вместо Compose, только два языка в сборке
- Цены сравниваются в пересчёте на единицу, а не по ценнику: 900 г за 11,70 дороже килограмма за 11,10, и в таблице это видно без калькулятора
- Карточка товара разводит два смысла цены: «на полке» — то, что написано на ценнике, «в пересчёте» — за килограмм и за сто граммов
- Вид одного магазина отвечает на вопрос «что брать здесь»: по каким позициям он дешевле всех, а по каким дешевле сосед и на сколько
- Единица у каждого товара своя: яйца поштучно, жидкости в миллилитрах и литрах, вес в граммах и килограммах — пересчёт считается прямо во время ввода
- Выгрузка в таблицу: девятнадцать колонок, строки отсортированы по цене за единицу, рядом — сколько магазинов знают товар и насколько эта цена хуже лучшей