Android native accounting assistant

AccountingApp

AccountingApp 是一個 Android(安卓)原生自動記帳工具,目標是在 S25 Ultra 上接收銀行 SMS(簡訊)與 payment notification(付款通知),解析交易、合併重複紀錄、同步到 Google Sheets(Google 試算表),並在 App 內提供首頁、分析、預算與設定導覽。

自動記帳 ↻ ⚙
今日支出 NT$ 901 2 筆交易 · 已同步
本月支出
NT$ 1,697
本月收入
+NT$ 1,500
近七天 近一個月
Analytics(分析)
支出NT$ 4,190
商家排行早餐店 / 網購
帳戶 / 付款方式台新 / LINE Pay

功能

自動擷取

SMS 與通知解析

透過 `SmsReceiver` 與 `NotificationListenerService` 接收銀行簡訊、LINE Pay、Richart、台灣企銀等交易通知。

去重合併

交易重複處理

同一筆交易若同時來自銀行 App 與 SMS,會用時間、金額、卡號末四碼與 merchant(商家)判斷並合併。

同步

Google Sheets 同步

以 `transaction_id` 定位列,`CREATE`、`UPDATE`、`MERGE` 走 upsert(存在更新,不存在新增),避免重複 append(追加)。

學習

商家學習

手動修正分類後,App 會記住同商家的分類;需要合併 momo / 富邦媒這類不同名稱時,再新增 alias(別名)。

Dashboard

Bottom navigation(底部導覽)

App 內固定使用「首頁 / 分析 / 預算 / 設定」四個 tab(分頁)。首頁看最近交易、同步狀態與本月預算剩餘,分析頁獨立提供多期間統計。

Analytics

多期間分析

分析頁預設顯示近七天,並支援近一個月、日期區間、近半年、本年至今與其他年份,提供摘要、趨勢、分類分布甜甜圈、商家、帳戶 / 付款方式、固定支出比例、可能續扣與未分類提醒。預算頁可設定本月總預算與分類預算,先用 App 內狀態提示接近上限或超支。

Phase 4A

外觀切換與 B 風格

設定頁可選跟隨系統、淺色或深色。淺色模式採米白背景、白卡片、森林綠主色與淡彩分類 icon(圖示),深色模式保留原本夜間可讀性。

Phase 2

完整交易編輯

交易詳情先顯示摘要與快速分類 / 帳戶操作;找不到分類時可用「搜尋 / 新增」直接套用新分類。單邊待判斷轉帳可直接選付款支出、自己帳戶互轉或家人帳戶互轉;完整欄位收在「更多編輯」。

搜尋

交易篩選與規則管理

首頁搜尋改為收合式,進階篩選移到 bottom sheet(底部面板);設定頁分區管理商家學習、我的帳戶與內部轉帳對象,工程式規則預設收合。

安全策略

保留手機資料上版

升級 APK 時優先使用 `adb install -r`,避免 uninstall(解除安裝)或清除 App 本機資料。

架構導覽

動態水管圖

以開發架構與使用者運作兩種視角,說明資料如何從通知進入 App,經過解析、整理、同步並回到畫面。

開啟動態水管圖

現行辨識規則

交易解析、轉帳配對、去重合併、分類與 Google Sheets(Google 試算表)同步都有明確規則。這些規則會影響 App 如何判斷收入、支出、自己的帳戶互轉,以及什麼時候顯示「待配對」。

TRANSFER

內部轉帳

未判斷且只抓到一邊時顯示「Richart帳戶 → 待配對」;若確認是自己或家人帳戶,可記住為內部轉帳對象,之後相同對象自動排除支出。信用卡帳單月繳款也會排除統計。

MERGE

去重合併

一般消費使用 5 分鐘時間窗;轉帳使用 60 分鐘時間窗。同 raw text(原始文字)或同金額同帳戶會合併。

RULES

獨立規則頁

規則頁列出目前判斷方式,並連到對應 source files(原始碼檔案),方便你隨時要求修正。

開啟現行交易辨識規則

技術架構

InputSMS / Notification / Manual
ParserTaishin, TBB, LINE Pay, Richart
CoreCategoryResolver, Merger, Rules, Analytics
StorageRoom Database v8 + DataStore
Sync & UIWorkManager + Google Sheets + Compose

使用技術

領域技術用途
AppKotlin + Jetpack ComposeAndroid 原生 UI 與畫面狀態
資料庫Room交易、同步狀態、商家分類規則
設定DataStoreSpreadsheet ID 等本機設定
背景同步WorkManager排程同步、retry(重試)、failed(失敗)狀態
雲端Google Sheets API v4 + OAuth把交易寫入 Google Sheets
測試JUnit, Room testing, Android testParser、merge、sync、DAO、row mapping 驗證
建置Gradle, AGP, KSPAndroid build、Room schema 匯出

用法

  1. 在 Google Drive(雲端硬碟)建立 Google Sheets,開啟 Google Sheets API。
  2. 在 App 設定貼上 Sheets URL 或 Spreadsheet ID。
  3. 按 Google 授權,授權 App 寫入該試算表。
  4. 開啟 SMS(簡訊)與 notification access(通知存取)權限。
  5. 刷卡或收到通知後,確認交易出現在 App 與 Google Sheets。

Google Sheets 欄位

名稱說明
Atransaction_id跨裝置/試算表定位用 UUID
Btimestamp交易時間,Asia/Taipei
Camount金額,支出為正、收入為負
Dmerchant商家或帳戶遮罩
Ecategory分類,例如餐飲、網購、收入
F-Lcard/source/raw/sync/notes/deleted卡號末四碼、來源、原始文字、同步時間、備註與刪除標記
M-Qtransaction_kind / transfer metadata交易種類、轉出帳戶、轉入帳戶、轉帳群組、轉帳配對狀態

開發檢查清單

0 / 5 完成

專案樹狀架構

完整整理請看 docs/PROJECT_STRUCTURE.md

AccountingApp/
├─ app/
│  ├─ src/main/java/tw/hsing/accounting/
│  │  ├─ data/       Room entities, DAO, merge, category rules
│  │  ├─ parser/     Bank, LINE Pay, Richart parser
│  │  ├─ service/    SMS receiver, notification listener
│  │  ├─ settings/   DataStore sync settings
│  │  ├─ sync/       Google Sheets sync, WorkManager
│  │  ├─ ui/         Compose screens, dialogs, dashboard
│  │  └─ viewmodel/  Home UI state and actions
│  ├─ src/test/      Unit tests
│  ├─ src/androidTest/ Instrumented tests
│  └─ schemas/       Room schema snapshots
├─ docs/
│  ├─ archive/
│  ├─ PROJECT_STRUCTURE.md
│  ├─ rules/transactions.html
│  ├─ setup/windows.md
│  ├─ showcase/index.html
│  └─ testing/
├─ scripts/
│  ├─ android/
│  └─ windows/
├─ gradle/
└─ README.md