flowchart TD
%% =========================
%% USER REGISTRATION / PROFILE
%% =========================
subgraph U["User"]
direction LR
U1[Registration form]
U2[Save draft]
U3[Submit registration]
U4["POST /user {submit:false}"]
U5["POST or PUT /user/{user_id} {submit:true}"]
U6[(DB User)]
U7[(S3 documents store)]
U8[ComplyAdvantage background check]
U9{Preliminary approval?}
U10[Remediation based on reason]
U11[Final approval]
U12[Registration completed]
U13[Registration rejected]
U14[Cognito group remitter]
U15[User profile edit form]
U16["PUT /me {...}"]
U17[(DB Change Request)]
U18[User edit approved]
U19[User edit rejected]
U20[Notify user]
U1 --> U2 --> U4
U1 --> U3 --> U5 --> U6
U5 --> U7
U6 --> U8 --> U9
U9 -- Yes --> U11 --> U12 --> U14
U9 -- No --> U10 --> U13 --> U20
U15 --> U16 --> U17
U17 --> U18 --> U20
U17 --> U19 --> U20
end
%% =========================
%% BENEFICIARY
%% =========================
subgraph B["Beneficiary"]
direction LR
B1[Beneficiary creation form]
B2[Save draft]
B3[Submit beneficiary]
B4["POST /me/beneficiary"]
B5[(DB Beneficiary)]
B6[ID and background check]
B7{Approved?}
B8[Beneficiary created]
B9[Creation rejected]
B10[Notify user]
B11[7-year interval expiry routine]
B12[Beneficiary edit form]
B13["PUT /me/beneficiary/{beneficiary_id}"]
B14[Beneficiary edited]
B15[Edit rejected]
B16["Unique phone/email collision → return existing beneficiary"]
B1 --> B2
B1 --> B3 --> B4 --> B5
B5 --> B6 --> B7
B7 -- Yes --> B8 --> B10
B7 -- No --> B9 --> B10
B5 --> B11
B4 --> B16
B12 --> B13 --> B5
B13 --> B14 --> B10
B13 --> B15 --> B10
end
%% =========================
%% TRANSACTION / REMITTANCE
%% =========================
subgraph T["Transaction / Remittance"]
direction LR
T1[Remittance estimate form]
T2["GET /me/beneficiaries"]
T3[Select beneficiary]
T4[Pre-populate exchange based on corridor]
T5["GET /exchange/latest?from_currency=XXX&to_currency=YYY"]
T6[(DB Exchange)]
T7[(DB Beneficiary)]
T8[(DB User)]
T9[Submit transaction]
T10["POST /transaction"]
T11[(DB Remittance)]
T12{"User approved + beneficiary approved + user verified?"}
T13[status = quoted]
T14[Transactions view]
T15["GET /me/transactions"]
T16[Admin review quoted transactions]
T17{Propose modification?}
T18[Remittance edit form]
T19[status = adjusted]
T20[Notify user]
T21{User accepts adjusted rate?}
T22["POST /transaction/{transaction_id}/approve"]
T23[status = approved]
T24[status = cancelled]
T25[Admin approve transaction]
T26[Verify with external party]
T27{Verified?}
T28[status = sent]
T29[Fulfill to foreign bank]
T30[Check received / deposit]
T31["Process refund of pending transactions"]
T1 --> T2 --> T3 --> T4 --> T5 --> T6
T3 --> T7
T3 --> T8
T1 --> T9 --> T10 --> T11 --> T12
T12 -- Yes --> T13
T12 -- No --> T24
T14 --> T15 --> T11
T13 --> T16 --> T17
T17 -- Yes --> T18 --> T19 --> T20 --> T21
T21 -- Yes --> T25
T21 -- No --> T24
T17 -- No --> T25
T25 --> T22 --> T23 --> T26 --> T27
T27 -- Yes --> T28 --> T29 --> T30
T27 -- No --> T24
T24 --> T31
end
%% =========================
%% EXCHANGE RATE
%% =========================
subgraph X["Exchange Rate"]
direction LR
X1[New exchange form]
X2["POST /exchange"]
X3[(DB Exchange)]
X4[(DB Corridor)]
X5[(DB Currency)]
X6[Exchange rate offer]
X1 --> X2 --> X3
X3 --> X4
X3 --> X5
X3 --> X6
end
%% =========================
%% VENDOR / PERIODIC PROCESSES
%% =========================
subgraph V["Vendor / Scheduled Processes"]
direction LR
V1["AusTrack verify once daily where status = sent"]
V2{Verified by vendor?}
V3["Set is_verified = true, store ref"]
V4[Cancel with vendor reason]
V5[Fulfill once daily offset from verify]
V6[Global IME deposit]
V7[ZAI decision]
V1 --> V2
V2 -- Yes --> V3 --> V5 --> V6
V2 -- No --> V4
V5 --> V7
end
%% cross-links
U12 --> T1
B8 --> T1
X6 --> T4
T28 --> V1