功能
SMS 與通知解析
透過 `SmsReceiver` 與 `NotificationListenerService` 接收銀行簡訊、LINE Pay、Richart、台灣企銀等交易通知。
交易重複處理
同一筆交易若同時來自銀行 App 與 SMS,會用時間、金額、卡號末四碼與 merchant(商家)判斷並合併。
Google Sheets 同步
以 `transaction_id` 定位列,`CREATE`、`UPDATE`、`MERGE` 走 upsert(存在更新,不存在新增),避免重複 append(追加)。
商家學習
手動修正分類後,App 會記住同商家的分類;需要合併 momo / 富邦媒這類不同名稱時,再新增 alias(別名)。
Bottom navigation(底部導覽)
App 內固定使用「首頁 / 分析 / 預算 / 設定」四個 tab(分頁)。首頁看最近交易、同步狀態與本月預算剩餘,分析頁獨立提供多期間統計。
多期間分析
分析頁預設顯示近七天,並支援近一個月、日期區間、近半年、本年至今與其他年份,提供摘要、趨勢、分類分布甜甜圈、商家、帳戶 / 付款方式、固定支出比例、可能續扣與未分類提醒。預算頁可設定本月總預算與分類預算,先用 App 內狀態提示接近上限或超支。
外觀切換與 B 風格
設定頁可選跟隨系統、淺色或深色。淺色模式採米白背景、白卡片、森林綠主色與淡彩分類 icon(圖示),深色模式保留原本夜間可讀性。
完整交易編輯
交易詳情先顯示摘要與快速分類 / 帳戶操作;找不到分類時可用「搜尋 / 新增」直接套用新分類。單邊待判斷轉帳可直接選付款支出、自己帳戶互轉或家人帳戶互轉;完整欄位收在「更多編輯」。
交易篩選與規則管理
首頁搜尋改為收合式,進階篩選移到 bottom sheet(底部面板);設定頁分區管理商家學習、我的帳戶與內部轉帳對象,工程式規則預設收合。
保留手機資料上版
升級 APK 時優先使用 `adb install -r`,避免 uninstall(解除安裝)或清除 App 本機資料。
現行辨識規則
交易解析、轉帳配對、去重合併、分類與 Google Sheets(Google 試算表)同步都有明確規則。這些規則會影響 App 如何判斷收入、支出、自己的帳戶互轉,以及什麼時候顯示「待配對」。
內部轉帳
未判斷且只抓到一邊時顯示「Richart帳戶 → 待配對」;若確認是自己或家人帳戶,可記住為內部轉帳對象,之後相同對象自動排除支出。信用卡帳單月繳款也會排除統計。
去重合併
一般消費使用 5 分鐘時間窗;轉帳使用 60 分鐘時間窗。同 raw text(原始文字)或同金額同帳戶會合併。
技術架構
使用技術
| 領域 | 技術 | 用途 |
|---|---|---|
| App | Kotlin + Jetpack Compose | Android 原生 UI 與畫面狀態 |
| 資料庫 | Room | 交易、同步狀態、商家分類規則 |
| 設定 | DataStore | Spreadsheet ID 等本機設定 |
| 背景同步 | WorkManager | 排程同步、retry(重試)、failed(失敗)狀態 |
| 雲端 | Google Sheets API v4 + OAuth | 把交易寫入 Google Sheets |
| 測試 | JUnit, Room testing, Android test | Parser、merge、sync、DAO、row mapping 驗證 |
| 建置 | Gradle, AGP, KSP | Android build、Room schema 匯出 |
用法
- 在 Google Drive(雲端硬碟)建立 Google Sheets,開啟 Google Sheets API。
- 在 App 設定貼上 Sheets URL 或 Spreadsheet ID。
- 按 Google 授權,授權 App 寫入該試算表。
- 開啟 SMS(簡訊)與 notification access(通知存取)權限。
- 刷卡或收到通知後,確認交易出現在 App 與 Google Sheets。
- 首頁查看最近交易與同步狀態,分析 tab 依近七天、近一個月、日期區間、近半年、本年至今或其他年份查看圖表。
- 點鉛筆 Edit(編輯)修正分類,App 會學習該商家的分類規則。
- 切到「分析」查看支出/收入摘要、支出趨勢、分類排行、商家排行、帳戶 / 付款方式與未分類提醒。
- 若同步失敗,使用手動同步或重試。
Windows PowerShell(命令殼層)建議先固定 Gradle cache(快取)位置,避開中文使用者路徑問題。
$env:GRADLE_USER_HOME='D:\gradle-home'
.\gradlew.bat test compileDebugAndroidTestKotlin assembleDebug
adb install -r app\build\outputs\apk\debug\app-debug.apk
Google Sheets 欄位
| 欄 | 名稱 | 說明 |
|---|---|---|
| A | transaction_id | 跨裝置/試算表定位用 UUID |
| B | timestamp | 交易時間,Asia/Taipei |
| C | amount | 金額,支出為正、收入為負 |
| D | merchant | 商家或帳戶遮罩 |
| E | category | 分類,例如餐飲、網購、收入 |
| F-L | card/source/raw/sync/notes/deleted | 卡號末四碼、來源、原始文字、同步時間、備註與刪除標記 |
| M-Q | transaction_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