Personal Finance Ledger App
git clone https://github.com/expo-cbt/app.git
cd apppnpm install
npx expo start
# npx expo start -c --webeas build --profile development --platform android
npx expo start --dev-clientEntity Relationship Diagram (ERD)
erDiagram
TRANSACTION {
string type
number amount
string narration
date entryDate
binary receipt
boolean isDraft
boolean isIncognito
boolean isTemp
%% Foreign Keys (FK)
string contactId FK
string[] categoryIds FK
string walletId FK
string projectId FK
}
CONTACT {
binary avatar
string name
string displayName
string tel
string email
string notes
boolean isFavorite
boolean isTemp
}
TRANSACTION ||--o| CONTACT : "paid to/from"
TRANSACTION ||--o| WALLET : "paid to/from"
TRANSACTION ||--o| PROJECT : "belongs to"
TRANSACTION }|--o{ CATEGORY : "belongs to"
Flowchart
flowchart TD
Start(Start)
Step1Ref((Goto: Step 1))
Step1{{Step 1: Fetch contacts}}
AddContact[[Add contact]]
Contact[/Select contact/]
Step1Next{Continue}
Step2Ref((Goto: Step 2))
Step2{{Step 2: Fetch categories}}
History[[Transaction history]]
Step2Form[/Type Amount Narration Categories Date/]
AddCategory[[Add category]]
Step2Next{Continue}
Step3Ref((Goto: Step 3))
Step3{{Step 3: Fetch wallets, projects}}
Step3Form[/Wallet Project Receipt/]
AddWallet[[Add wallet]]
AddProject[[Add project]]
Step3Next{Save}
Step4[Step 4: Preview]
Step4Form[/Draft Incognito/]
Step4Next{Confirm}
Storage>Upload receipt]
Database[(Save transaction)]
Step5{Step 5: Success}
Step5Next1[/Select contact/]
Step5Next2[/Enter amount/]
Step5Next3[/Done/]
End(End)
Start --> Step1
Step1 --> AddContact
Step1 --> Contact
AddContact --> Step1Next
Contact --> Step1Next
Step1Next -- Yes --> Step2
Step1Next -- No --> Start
Step2 --> Step2Form
Step2 --> History
History --> Step2
Step2Form --> Step2Next
Step2Form --> AddCategory
AddCategory --> Step2Form
Step2Next -- Yes --> Step3
Step2Next -- No --> Step1
Step3 --> Step3Form
Step3Form --> Step3Next
Step3Form --> AddWallet
AddWallet --> Step3Form
Step3Form --> AddProject
AddProject --> Step3Form
Step3Next -- Yes --> Step4
Step3Next -- No --> Step2
Step4 --> Step4Form
Step4Form --> Step4Next
Step4Next -- Yes --> Storage
Step4Next -- No --> Step3Ref
Storage -- Uploaded --> Database
Database -- Saved --> Step5
Step5 --> Step5Next1
Step5 --> Step5Next2
Step5 --> Step5Next3
Step5Next1 --> Step1Ref
Step5Next2 --> Step2Ref
Step5Next3 --> End
A few structural issues:
- Inconsistent node shapes: Step1–3 use hexagons
{{}}, but Step4 uses a rectangle[]and Step5 uses a decision diamond{}— same conceptual role (process steps), different shapes. - Step5 diamond has 3 unlabeled edges: A decision node (
{}) implies mutually exclusive branching, but Step5→Next1/Next2/Next3 have no labels, implying they all fire at once — contradicts diamond semantics. Should either be a rectangle (process) fanning out to options, or the edges need labels. - Inconsistent back-navigation pattern: Step4Next "No" routes through
Step3Ref(goto anchor), but Step2Next "No" and Step3Next "No" jump directly toStep1/Step2nodes — pick one pattern.
MVP
- Contacts
- Transactions (Ledger)
-
- Categories
-
- Wallets
- Projects
- Settings
- Analytics
V1
- Timesheet
- Incognito
- GroceryList
- Invoice
- Auth
-
- Log in
-
- Forgot Password
- Home (Dashboard)
- Analytics
- CRUD Modules
- Toggle Mask Balance
- Toggle Debug Mode
- Manage Categories
- Manage Wallets
- Set Default Wallet
- Manage Amount Options
-
- 2k | 5k | 10k
-
- 18k | 20k | 50k
-
- 200k | 400k | 800k
- Manage Narration Options
-
- %month Salary
-
- %month Tithe
-
- %month Market
- Clear TempData (isTemp)
MVP
# Form Sheet
- Type
- Contact
- Amount
- Narration
- Categories
- Date (calendar)
- [Back|Reset][Save]
# Bottom Sheet
- Wallet
- Project
- Receipt
- Mark as Draft
- Mark as Incognito
- [Back][Confirm]
# Modal
- [Back][Close]V1
# Step 1 (form)
/ Add Contact
- Select Contact
- Recent | Favorites
- [Back][Continue]
# Step 2 (form)
/ Transaction History
- Type (sheet)
- Amount
- - Amount Options (chips)
- Narration
- - Narration Options (chips)
- Categories (sheet)
- Date (calendar)
- [Back|Reset]][Save]
# Step 3 (sheet)
- Wallet (sheet)
- Project (sheet)
- Attach Receipt
- Mark as Draft
- Mark as Incognito
- [Cancel][Confirm]
# Step 5 (modal)
- [Select Contact]
- [Enter Amount]
- [Done]