Skip to content

Repository files navigation

Fedora

Personal Finance Ledger App

TypeScript React Expo

Expo Firebase

Setup

git clone https://github.com/expo-cbt/app.git
cd app
pnpm install
npx expo start
# npx expo start -c --web

Build

EAS Development Build (Android)

eas build --profile development --platform android
npx expo start --dev-client

Documentation

Data Model

Entity 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"
Loading

Data Flow

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
Loading

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 to Step1/Step2 nodes — pick one pattern.

Modules

MVP

  • Contacts
  • Transactions (Ledger)
    • Categories
    • Wallets
  • Projects
  • Settings
  • Analytics

V1

  • Timesheet
  • Incognito
  • GroceryList
  • Invoice

App Screens

  • Auth
    • Log in
    • Forgot Password
  • Home (Dashboard)
  • Analytics
  • CRUD Modules

App Settings

  • 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)

Transaction Wizard

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]

Resources

About

Personal Finance Ledger App

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Contributors

Languages