🏛ïļ SEQUENCE_DIAGRAMS.md - System Sequence Diagrams (āđāļœāļ™āļ āļēāļžāđāļŠāļ”āļ‡āļĨāļģāļ”āļąāļšāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļĢāļ°āļšāļš)

This document contains detailed execution sequence diagrams for key user interactions in SplitDee.
āđ€āļ­āļāļŠāļēāļĢāļ‰āļšāļąāļšāļ™āļĩāđ‰āļŠāļĢāļļāļ›āļœāļąāļ‡āļĨāļģāļ”āļąāļšāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āļāļēāļĢāđ„āļŦāļĨāđ€āļ§āļĩāļĒāļ™āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļŠāļ‡āļŠāļąāļĒ āđāļĨāļ°āļāļīāļˆāļāļĢāļĢāļĄāļ›āļĢāļ°āļŠāļēāļ™āļāļąāļ™āļ‚āļ­āļ‡āđ‚āļĄāļ”āļđāļĨāļĢāļ°āļšāļšāļĒāđˆāļ­āļĒāļŦāļĨāļąāļ


ðŸ‡đ🇭 āļ āļēāļĐāļēāđ„āļ—āļĒ (āļŠāļģāļŦāļĢāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™)

1. āļĨāļģāļ”āļąāļšāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļĨāļ‡āļŠāļĄāļąāļ„āļĢāļŠāļĄāļēāļŠāļīāļāđƒāļŦāļĄāđˆāđāļĨāļ°āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Token (User Registration & Token Generation)

  1. āļœāļđāđ‰āđƒāļŠāđ‰āļāļĢāļ­āļāļŸāļ­āļĢāđŒāļĄ: āļĨāļđāļāļŦāļ™āļĩāđ‰āļŦāļĢāļ·āļ­āđ€āļˆāđ‰āļēāļŦāļ™āļĩāđ‰āļāļ”āļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ­āļĩāđ€āļĄāļĨ āļĢāļŦāļąāļŠāļœāđˆāļēāļ™ āļŠāļ·āđˆāļ­ āđāļĨāļ°āđ€āļšāļ­āļĢāđŒāđ‚āļ—āļĢāļŠāļĄāļąāļ„āļĢāļŠāļĄāļēāļŠāļīāļāļŠāđˆāļ‡āļœāđˆāļēāļ™ POST /auth/signup
  2. āļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļŠāđ€āļ›āļāļŦāļĨāļąāļ‡āļšāđ‰āļēāļ™: FastAPI API Router āđ€āļŠāđ‡āļāļ•āļąāļ§āđāļ›āļĢ JSON Schema āļ›āđ‰āļ­āļ™āļ•āđˆāļ­āđƒāļŦāđ‰āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļŦāļĨāļąāļ RegisterUserUseCase
  3. āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ„āļ§āļēāļĄāđ„āļĄāđˆāļ‹āđ‰āļģ: āļĒāļđāļŠāđ€āļ„āļŠāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ User Repository āļ„āđ‰āļ™āļŦāļēāļ•āļēāļĢāļēāļ‡āđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ PostgreSQL āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§āđˆāļēāļĄāļĩāļ­āļĩāđ€āļĄāļĨāļ™āļĩāđ‰āļ­āļĒāļđāđˆāđāļĨāđ‰āļ§āļŦāļĢāļ·āļ­āđ„āļĄāđˆ
  4. āđāļŪāļŠāļĢāļŦāļąāļŠāļœāđˆāļēāļ™āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ: āļŦāļēāļāđ€āļ›āđ‡āļ™āļœāļđāđ‰āđƒāļŠāđ‰āđƒāļŦāļĄāđˆ āļŠāļąāđˆāļ‡āļ„āļĨāļēāļŠ Hasher āđāļŪāļŠāđ€āļ‚āđ‰āļēāļĢāļŦāļąāļŠ (Hash Password) āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ āļāđˆāļ­āļ™āļĒāļ·āđˆāļ™āđ€āļ‚āļĩāļĒāļ™āļĢāļ°āđ€āļšāļĩāļĒāļ™āđƒāļŦāļĄāđˆāļĨāļ‡ PostgreSQL
  5. āļŠāļĢāđ‰āļēāļ‡āļŠāļīāļ—āļ˜āļīāđŒāļĨāđ‡āļ­āļāļ­āļīāļ™āļŠāļģāđ€āļĢāđ‡āļˆ: āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļĒāļ·āļ™āļĒāļąāļ™āļāļĨāļąāļšāļĄāļēāļ—āļĩāđˆ Router āļˆāļąāļ”āļŠāļĢāđ‰āļēāļ‡āļ•āļąāđ‹āļ§āļŠāļīāļ—āļ˜āļīāđŒ JWT Access Token (āļˆāļģāļāļąāļ”āļŦāļĄāļ”āļ­āļēāļĒāļļ 15 āļ™āļēāļ—āļĩ) āđāļĨāļ°āļ•āļąāđ‹āļ§ Refresh Token āļĒāļīāļ‡āļ•āļ­āļšāļāļĨāļąāļšāđ„āļ›āļĒāļąāļ‡āđ„āļ„āļĨāđ€āļ­āļ™āļ•āđŒāđāļĨāļ°āđāļŠāļ”āļ‡āļŦāļ™āđ‰āļēāļĢāļēāļĒāļ‡āļēāļ™āļ•āļąāļ§āļŠāļģāđ€āļĢāđ‡āļˆ

2. āļĨāļģāļ”āļąāļšāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļŦāļēāļĢāļšāļīāļĨāļ„āđˆāļēāđƒāļŠāđ‰āļˆāđˆāļēāļĒāļ›āļĢāļ°āļˆāļģāļāļĨāļļāđˆāļĄ (Bill Creation & Split Allocation)

  1. āđ€āļˆāđ‰āļēāļŦāļ™āļĩāđ‰āļŠāļĢāđ‰āļēāļ‡āļšāļīāļĨ: āđ€āļˆāđ‰āļēāļŦāļ™āļĩāđ‰āļ„āļĩāļĒāđŒāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļšāļīāļĨāļŦāļēāļĢāđ€āļ‡āļīāļ™ āļĒāļ­āļ”āļĢāļ§āļĄ āđāļĨāļ°āļāļēāļĢāđāļšāđˆāļ‡āļŠāļąāļ”āļŠāđˆāļ§āļ™āļŠāđˆāļ§āļ™āļŦāļ™āļĩāđ‰ āļĒāļīāļ‡āļ„āļģāļ‚āļ­āđ„āļ›āļ—āļĩāđˆāļŦāļĨāļąāļ‡āļšāđ‰āļēāļ™
  2. āļ„āļģāļ™āļ§āļ“āļŠāđ€āļ›āļāļŦāļ™āļĩāđ‰: āļĒāļđāļŠāđ€āļ„āļŠāļ•āļĢāļ§āļˆāđ€āļŠāđ‡āļāļĒāļ­āļ”āļšāļīāļĨāļĢāļ§āļĄāļ•āļĢāļ‡āļāļąāļšāļĒāļ­āļ”āļŠāđˆāļ§āļ™āļŦāļ™āļĩāđ‰āļĢāļēāļĒāļ„āļ™āđ€āļ‰āļĨāļĩāđˆāļĒāļšāļ§āļāļāļąāļ™āļžāļ­āļ”āļĩ ➔ āļĒāļ·āđˆāļ™āđ€āļ‚āļĩāļĒāļ™āļ›āļĢāļ°āļ§āļąāļ•āļīāļ•āļēāļĢāļēāļ‡āļšāļīāļĨāđāļĨāļ°āļĢāļēāļĒāļ•āļąāļ§āļĨāļ‡āļ•āļēāļĢāļēāļ‡ PostgreSQL
  3. āļĒāļīāļ‡āđāļˆāđ‰āļ‡āļ‚āđˆāļēāļ§āđ€āļžāļ·āđˆāļ­āļ™āļĢāđˆāļ§āļĄāļŦāđ‰āļ­āļ‡: āđ€āļĄāļ·āđˆāļ­āđ€āļšāļŠāļĒāļ·āļ™āļĒāļąāļ™āļŠāļģāđ€āļĢāđ‡āļˆ āļŠāļąāđˆāļ‡ Firebase Notification (FCM) āļˆāļąāļ”āļŠāđˆāļ‡ Push āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĢāļīāļāđ€āļāļ­āļĢāđŒāđāļˆāđ‰āļ‡āļ‚āđˆāļēāļ§āļ—āļļāļāļ„āļ™ āđāļĨāļ°āđ‚āļžāļŠāļ•āđŒāļāļēāļĢāđŒāļ”āļšāļīāļĨāļŠāļĩāđ€āļ‚āļĩāļĒāļ§āļĨāļ‡āđƒāļ™āļŠāđˆāļ­āļ‡āđāļŠāļ—āļāļĨāļļāđˆāļĄ

3. āļĨāļģāļ”āļąāļšāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāđāļŠāļāļ™āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļĨāļīāļ›āļœāđˆāļēāļ™ AI āđāļĨāļ°āļ›āļīāļ”āļŦāļ™āļĩāđ‰ (AI Slip Verification & Settlement)

  1. āļĨāļđāļāļŦāļ™āļĩāđ‰āļŠāđˆāļ‡āļŠāļĨāļīāļ›: āļĨāļđāļāļŦāļ™āļĩāđ‰āđāļŠāļ°āđāļ™āļšāļĢāļđāļ›āļ āļēāļžāđƒāļšāļŠāļĨāļīāļ›āļŠāđˆāļ‡ API āļ•āļĢāļ§āļˆāļŠāļ­āļš
  2. AI OCR āļŠāđāļāļ™ Mini-QR: āļĒāļđāļŠāđ€āļ„āļŠāļŠāđˆāļ‡āļĢāļđāļ›āđƒāļŦāđ‰āļ•āļąāļ§āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ OCR āļŠāļāļąāļ”āđāļŠāļāļ™āļŦāļēāļĢāļŦāļąāļŠāļ„āļīāļ§āļ­āļēāļĢāđŒ (Transaction ID)
  3. āļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāđ‚āļāļ‡āđ‚āļ­āļ™āļ‹āđ‰āļģ: āļ•āļĢāļ§āļˆāđƒāļ™ PostgreSQL āļ§āđˆāļēāđ€āļĨāļ‚āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļ™āļĩāđ‰āđ€āļ„āļĒāđ‚āļ­āļ™āļœāđˆāļēāļ™āđ„āļ›āđāļĨāđ‰āļ§āļŦāļĢāļ·āļ­āđ„āļĄāđˆ āļŦāļēāļāđ€āļˆāļ­āļ‹āđ‰āļģ āļ›āļāļīāđ€āļŠāļ˜āđāļĨāļ°āđ€āļ”āđ‰āļ‡āđ€āļ•āļ·āļ­āļ™āļĨāļđāļāļŦāļ™āļĩāđ‰āļ—āļąāļ™āļ—āļĩ
  4. āđ€āļŠāđ‡āļ Statement āļ˜āļ™āļēāļ„āļēāļĢāļˆāļĢāļīāļ‡: āļĒāļīāļ‡āļĢāļŦāļąāļŠāļ‚āļ­ Statement āļˆāļēāļāļ˜āļ™āļēāļ„āļēāļĢāļˆāļĢāļīāļ‡āļœāđˆāļēāļ™āļžāļ­āļĢāđŒāļ•āđ€āļāļ•āđ€āļ§āļĒāđŒāļ āļēāļĒāļ™āļ­āļ āļ•āļĢāļ§āļˆāļŠāļ­āļšāļĒāļ­āļ”āđ€āļ‡āļīāļ™āđ‚āļ­āļ™ āđāļĨāļ°āļ›āļĨāļēāļĒāļ—āļēāļ‡āļœāļđāđ‰āļĢāļąāļšāđ€āļ‡āļīāļ™
  5. āļ­āļąāļ›āđ€āļ”āļ•āđāļĨāļ°āļ›āļīāļ”āļšāļīāļĨ: āļŦāļēāļāļ•āļĢāļ‡āļāļąāļ™ āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļĒāļ­āļ”āļŦāļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āļˆāđˆāļēāļĒāļŠāļģāđ€āļĢāđ‡āļˆ āļ­āļąāļ›āđ€āļ”āļ•āđ€āļĨāđ€āļ§āļĨāđ€āļĨāđ€āļ§āļĨ XP āļŠāļąāļ•āļ§āđŒāđ€āļĨāļĩāđ‰āļĒāļ‡āđ‚āļĄāļˆāļī āđāļĨāļ°āļŠāđˆāļ‡ Push āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ‰āļĨāļ­āļ‡āđāļˆāđ‰āļ‡āđāļŠāļ—āļāļĨāļļāđˆāļĄ

🇎🇧 English (For AI Agents)

🔑 1. User Registration & Token Generation

sequenceDiagram
    autonumber
    actor User as User Client
    participant Router as API Router (FastAPI)
    participant UC as RegisterUser UseCase
    participant Repo as User Repository
    participant Hasher as Security Hasher
    participant DB as PostgreSQL DB

    User->>Router: POST /auth/signup {email, password, name, phone}
    Note over Router: Validates request payload schemas
    Router->>UC: execute(email, password, name, phone)
    UC->>Repo: get_by_email(email)
    Repo->>DB: query User table
    DB-->>Repo: return user/null
    
    alt User Already Exists
        Repo-->>UC: return UserEntity
        UC-->>Router: raise EmailAlreadyExistsException
        Router-->>User: return 400 Bad Request
    else New User
        Repo-->>UC: return null
        UC->>Hasher: hash_password(password)
        Hasher-->>UC: return password_hash
        UC->>Repo: create(UserEntity)
        Repo->>DB: INSERT INTO users
        DB-->>Repo: return inserted record
        Repo-->>UC: return UserEntity
        UC-->>Router: return UserEntity
        Note over Router: Generate JWT access token
        Router-->>User: return 201 Created {access_token, user_details}
    end

ðŸ’ĩ 2. Bill Creation & Split Allocation

sequenceDiagram
    autonumber
    actor Creator as Bill Creator
    participant Router as API Router (FastAPI)
    participant UC as CreateBill UseCase
    participant DB as PostgreSQL DB
    participant FCM as Firebase Notification

    Creator->>Router: POST /api/v1/groups/{id}/bills {title, amount, shares}
    Router->>UC: execute(group_id, creator_id, title, amount, shares)
    Note over UC: Validate sum(shares) == total_amount
    UC->>DB: INSERT INTO bills (id, group_id, creator_id, total_amount, title, category)
    UC->>DB: INSERT INTO expense_shares (multiple rows user_id, share_amount, status='unpaid')
    DB-->>UC: return success
    UC->>FCM: send_notification_to_members(group_id, payload)
    FCM-->>UC: return status
    UC-->>Router: return bill_details
    Router-->>Creator: return 201 Created {bill_details}

ðŸĪ– 3. AI Slip Verification & Settlement

sequenceDiagram
    autonumber
    actor Debtor as Bill Debtor
    participant Router as API Router (FastAPI)
    participant UC as VerifySlip UseCase
    participant OCR as OCR Service
    participant Bank as Bank Partner API
    participant DB as PostgreSQL DB
    participant Redis as Redis Cache
    participant Pet as Pet Update UseCase
    participant FCM as Firebase Notification

    Debtor->>Router: POST /api/v1/bills/{id}/payments {slip_image}
    Router->>UC: execute(bill_id, debtor_id, slip_image)
    UC->>OCR: extract_mini_qr(slip_image)
    OCR-->>UC: return transaction_ref_id
    
    UC->>DB: SELECT payment WHERE slip_trans_id == ref_id
    alt Slip Already Used (Double-Spend)
        DB-->>UC: return existing payment
        UC-->>Router: raise DuplicateSlipException
        Router-->>Debtor: return 400 Bad Request
    else Unique Slip
        DB-->>UC: return null
        UC->>Bank: GET /verify/{transaction_ref_id}
        Bank-->>UC: return transfer_details {amount, receiver_name, timestamp}
        Note over UC: Check amount matches share_amount & receiver matches creator
        UC->>DB: UPDATE expense_shares SET status='paid', paid_at=now
        UC->>DB: INSERT INTO payments (bill_id, payer_id, amount, slip_trans_id, status='verified')
        UC->>Pet: reward_group_pet_xp(group_id, speed_bonus)
        Pet->>DB: UPDATE group_pets SET xp = xp + bonus
        UC->>FCM: dispatch_notification(group_id, "Paid!")
        UC-->>Router: return 200 OK {"status": "verified"}
        Router-->>Debtor: return 200 OK {"status": "verified"}
    end