2. Functional Journeys

NLZ pipeline, queue processing, and OLZ vs NLZ step comparison

NLZ ACH Transaction Pipeline (AvAchService — 10 Steps)

Key differences from OLZ: parallel fetch in Step 1, inline eligibility/compliance (no FICO), fire-and-forget notifications, Kafka events, audit at every step.

flowchart TD REQ(["POST /ach/transaction"]) V["FluentValidation"] R{"Route by OriginId"} AV["AvAchService"] SCA["ScaAchService"] S1["Step 1: PARALLEL fetch
AccountDetails + Restrictions
+ Transfers + Beta Instructions"] S1V["Validate account details
+ instruction match"] S2["Step 2: Map AchTransactionRequest
Insert to DB via cam-system-api
Status = Received"] S3["Step 3: Enqueue notification
fire-and-forget BackgroundQueue"] S4["Step 4: RTT → Submitted
via IRttClient"] S5A["Step 5a: EligibilityService
INLINE — no FICO
Acct class · BORD · House acct · High $"] S5AX(["NIGO: RTT + notification"]) S5B["Step 5b: ComplianceService
INLINE — no FICO
Reg type · Employee class code"] S5BX(["NIGO: RTT + notification"]) S6["Status → Approved
Audit logged"] S7{"Beta off-hours?"} S7Q(["Queue for next business day"]) S8["Step 7: PostBetaAsync
via cam-system-api → BETA"] S9["Step 8: Patch Beta identifiers"] S10["Step 9: Status → Completed"] S11["Step 10: RTT → Completed
Kafka event published"] END(["Return TransactionResponse"]) REQ --> V --> R R -->|AccountView| AV R -->|SCA| SCA AV --> S1 --> S1V --> S2 --> S3 --> S4 --> S5A S5A -->|Ineligible| S5AX S5A -->|Eligible| S5B S5B -->|Non-compliant| S5BX S5B -->|Compliant| S6 --> S7 S7 -->|Off-hours| S7Q S7 -->|Business hours| S8 --> S9 --> S10 --> S11 --> END style REQ fill:#e8ecff,stroke:#4f6bed style END fill:#e6faf5,stroke:#00b894 style S5AX fill:#fde8e6,stroke:#e74c3c style S5BX fill:#fde8e6,stroke:#e74c3c style S7Q fill:#fff8ec,stroke:#f39c12 style S1 fill:#e3f0ff,stroke:#1e88e5 style S8 fill:#f0eeff,stroke:#6c5ce7 style R fill:#fff8ec,stroke:#f39c12

Background Queue Processing (cam-mm-backgroundservice-api)

Timer-based .NET BackgroundService replaces OLZ Quartz cron. Checks business hours/holidays, fetches queued records via MediatR, calls cam-movemoney-process-api for each.

flowchart TD TIMER(["BackgroundService Timer Loop"]) BH{"Business hours
+ business day?"} SKIP(["Skip: off-hours / holiday / weekend"]) QUERY["MediatR: GetQueuedTransactionRequestsQuery"] EMPTY{"Records found?"} NONE(["No queued transactions — wait"]) PROC["For each queued transaction"] CALL["POST cam-movemoney-process-api
/ach/queueprocess"] OK{"Success?"} PASS["Success count++"] FAIL["Failure count++"] NEXT{"More records?"} DONE(["Log totals — wait interval"]) WAIT["Wait configurable interval
default 60 min"] TIMER --> BH BH -->|No| SKIP --> WAIT --> TIMER BH -->|Yes| QUERY --> EMPTY EMPTY -->|No| NONE --> WAIT EMPTY -->|Yes| PROC --> CALL --> OK OK -->|Yes| PASS --> NEXT OK -->|No| FAIL --> NEXT NEXT -->|Yes| PROC NEXT -->|No| DONE --> WAIT style TIMER fill:#f0eeff,stroke:#6c5ce7 style SKIP fill:#fff8ec,stroke:#f39c12 style DONE fill:#e6faf5,stroke:#00b894 style CALL fill:#e3f0ff,stroke:#1e88e5 style FAIL fill:#fde8e6,stroke:#e74c3c

NLZ vs OLZ: Step-by-Step Comparison

StepNLZ (cam-movemoney-process-api)OLZ (investor-ach-api)Change
1PARALLEL: AccountDetails + Restrictions + Transfers + Beta InstructionsSequential: LplSqlDb → BodsDb → WwsClientImproved
2Map + insert to DB via cam-system-api (Status=Received)CmRequestFactory → CashMgmtDb.InsertCmRequestRefactored
3Enqueue notification (fire-and-forget BackgroundQueue)NotificationClient.InsertSingleNotification (sync)Improved
4RTT → Submitted via IRttClient + cam-system-apiRttDirector.UpdateRequestStatus (direct HTTP)Refactored
5aInline EligibilityService: acct class, BORD, house acct, high-dollarFICO external HTTP: BetaLookup + EligibilityReplaced
5bInline ComplianceService: reg type, employee class codeFICO external HTTP: ComplianceReplaced
6Status → Approved (audit logged)No separate approved stepNew
7Check Beta off-hours → queue if neededPostAchContribution checks inlineRefactored
8PostBetaAsync via cam-system-api → BETA (Refit)BetaDirector.PostAchContribution (HttpClient)Refactored
9Patch Beta identifiers + audit trailNo explicit patch stepNew
10Status → Completed, RTT → Completed, Kafka eventRTT → Completed (no Kafka)New