# 🔄 Registration System Flow

```mermaid
flowchart TD
    Start([User Starts Registration]) --> Draft[Status: DRAFT]
    Draft --> Submit[User Submits]
    
    Submit --> CheckSeats{Limited Seats?}
    
    CheckSeats -->|No| PendingUnlimited[Status: PENDING<br/>No seat allocated]
    CheckSeats -->|Yes| CheckWaitlist{Waitlist<br/>Applicable?}
    
    CheckWaitlist -->|Yes| CheckTriggered{Waitlist<br/>Triggered?}
    CheckTriggered -->|Yes| Waitlisted[Status: WAITLISTED<br/>Assign sequence<br/>No seat allocated]
    CheckTriggered -->|No| CheckFull{Seats<br/>Available?}
    
    CheckFull -->|Yes| PendingSeatsAvail[Status: PENDING<br/>No seat allocated]
    CheckFull -->|No| BelowTrigger{Below<br/>Trigger?}
    BelowTrigger -->|Yes| Waitlisted
    BelowTrigger -->|No| PendingExceeded[Status: PENDING<br/>isRegistrationsExceeded=TRUE<br/>No seat allocated]
    
    CheckWaitlist -->|No| CheckFullNoWL{Seats<br/>Full?}
    CheckFullNoWL -->|Yes| PendingExceeded
    CheckFullNoWL -->|No| PendingSeatsAvail
    
    PendingUnlimited --> RequiresApproval{Requires<br/>Approval?}
    PendingSeatsAvail --> RequiresApproval
    PendingExceeded --> RequiresApproval
    
    RequiresApproval -->|No| PaymentFlow[Payment Flow]
    RequiresApproval -->|Yes| ApprovalStage[Admin Reviews]
    
    ApprovalStage --> ApprovalDecision{Admin<br/>Decision}
    
    ApprovalDecision -->|APPROVED| AllocateSeats[Allocate Seats<br/>seatAllocated=TRUE<br/>filledSeats++]
    ApprovalDecision -->|REJECTED| RejectedStatus[Status: REJECTED<br/>No seats<br/>Terminal State]
    ApprovalDecision -->|ON_HOLD| OnHoldStatus[Status: ON_HOLD<br/>No seats<br/>Can reactivate]
    
    AllocateSeats --> CheckApprovedStatus{Already<br/>APPROVED?}
    CheckApprovedStatus -->|First Time| IncrementSeats[INCREMENT seats]
    CheckApprovedStatus -->|Reallocation| SwapSeats[DECREMENT old<br/>INCREMENT new]
    
    IncrementSeats --> PaymentFlow
    SwapSeats --> PaymentFlow
    
    OnHoldStatus --> ReactivateDecision{Admin<br/>Reactivates?}
    ReactivateDecision -->|Yes| ApprovalStage
    ReactivateDecision -->|No| OnHoldStatus
    
    PaymentFlow --> PaymentType{Payment<br/>Type?}
    
    PaymentType -->|Online| OnlinePayment[Payment: ONLINE_COMPLETED<br/>Allocate seats if not allocated]
    PaymentType -->|Offline| CheckOfflineFlag{allocateSeatIf<br/>OfflinePending?}
    
    CheckOfflineFlag -->|TRUE| OfflinePending[Payment: OFFLINE_PENDING<br/>Allocate seats immediately]
    CheckOfflineFlag -->|FALSE| OfflinePendingNoSeat[Payment: OFFLINE_PENDING<br/>Wait for completion]
    
    OfflinePendingNoSeat --> OfflineCompleted[Payment: OFFLINE_COMPLETED<br/>Allocate seats now]
    
    OnlinePayment --> CheckComplete{All Requirements<br/>Met?}
    OfflinePending --> CheckComplete
    OfflineCompleted --> CheckComplete
    
    CheckComplete -->|Yes| BlockedCheck{Status is<br/>WAITLISTED/CANCELLED/<br/>REJECTED?}
    CheckComplete -->|No| StayPending[Status: PENDING/APPROVED<br/>Wait for requirements]
    
    BlockedCheck -->|Yes| StayInStatus[Cannot auto-complete<br/>Status remains as-is]
    BlockedCheck -->|No| Completed[Status: COMPLETED<br/>Registration done]
    
    Waitlisted --> SeatFreed{Seat<br/>Available?}
    SeatFreed -->|Yes| NotifyWaitlist[Notify first in waitlist<br/>Move to PENDING]
    NotifyWaitlist --> ApprovalStage
    SeatFreed -->|No| Waitlisted
    
    Completed --> CancelOption{User/Admin<br/>Cancels?}
    StayPending --> CancelOption
    AllocateSeats --> CancelOption
    
    CancelOption -->|Yes| CancelRegistration[Status: CANCELLED<br/>DECREMENT seats if allocated<br/>Terminal State]
    CancelOption -->|No| Completed
    
    RejectedStatus --> CheckWasApproved{Was Previously<br/>APPROVED?}
    CheckWasApproved -->|Yes| DecrementSeats[DECREMENT seats<br/>Free to pool]
    CheckWasApproved -->|No| NoSeatsToDecrement[No seat changes<br/>Never allocated]
    
    OnHoldStatus --> CheckOnHoldSeats{Was Previously<br/>APPROVED?}
    CheckOnHoldSeats -->|Yes| DecrementOnHold[DECREMENT seats<br/>Free to pool]
    CheckOnHoldSeats -->|No| NoSeatsOnHold[No seat changes<br/>Never allocated]
    
    style Completed fill:#90EE90
    style Waitlisted fill:#FFD700
    style RejectedStatus fill:#FF6B6B
    style CancelRegistration fill:#FF6B6B
    style AllocateSeats fill:#87CEEB
    style IncrementSeats fill:#87CEEB
    style DecrementSeats fill:#FFA500
    style DecrementOnHold fill:#FFA500
    style PendingExceeded fill:#FFB6C1
```

## Key Points

**Seat Allocation Stages:**
1. **Registration**: No seats allocated, just status check
2. **Approval**: Seats allocated if APPROVED
3. **Payment**: Seats allocated if not already allocated (based on offline flag)

**Seat Decrement Rules:**
- Seats ONLY decremented if previously APPROVED
- Direct PENDING → REJECTED/ON_HOLD = No decrement
- APPROVED → REJECTED/ON_HOLD = Decrement seats

**Status Never Auto-Rejected:**
- Registrations stay PENDING when full (no waitlist)
- `isRegistrationsExceeded` flag indicates capacity issue
- Admin manually decides to REJECT if needed

**Waitlist Sequence:**
- Generated once, never overwritten
- Preserved across payment/status updates
- First in waitlist gets seat when available
