Мобильные приложения

Траты — Android

Учёт денег по категориям с прогнозом на следующий месяц — и справочник цен, который показывает, где что дешевле.

Год
2026
Роль
Автор проекта
  • Kotlin
  • Android SDK
  • ViewBinding
  • Gradle
  • R8

Галерея

О проекте

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

Отдельная страница собирает цены в магазинах, чтобы понимать, что и где выгоднее закупать. Таблица «товар × магазин» пересчитывает все цены на одну единицу. Пачка 900 грамм за 11,70 считается так, как если бы в ней был целый килограмм, и выходит 13. Килограмм в соседнем магазине стоит 11,10, так что брать надо там. Клетки покрашены по выгоде, от зелёной к красной. Магазин выбирается один раз и запоминается, в зале не нужно каждый раз показывать, где вы стоите.

Все данные лежат в обычном файле на телефоне. Интернет приложению не нужен, разрешения на него в манифесте нет.

Что внутри

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