Approval Workflow
Every financial transaction posted to SIL is checked against the account's SIL debit limit and SIL credit limit. A breach does not reject the transaction — it is held for supervisor approval.
When approval kicks in​
| Condition | Result |
|---|---|
Debit > SITDebitLimit | Held: Status = Pending, ApprovalStatus = PendingApproval |
Credit > SITCreditLimit | Held: Status = Pending, ApprovalStatus = PendingApproval |
| Within limits | Posted: Status = Posted, ApprovalStatus = NotRequired |
While held:
- No balance impact is applied to the primary or counterparty accounts.
- The double-entry rows are written but
RunningBalanceisnull. - No
SITSyncQueuerow is created — the transaction is not visible to the replay worker.
Lifecycle​
SITApproveTransactionCommand​
Approve a held transaction. The handler:
- Re-loads the transaction and validates it is still
Status = Pending/ApprovalStatus = PendingApproval. - Re-validates the primary account is not currently
Frozen,ClosedorDormant— the account state may have changed since the transaction was held. - Recomputes the leg impact directly from the persisted
SITTransactionEntryrows (deterministic, no re-derivation fromTransactionType). - Re-checks sufficient funds for debits at approval time.
- Applies balance to primary + counterparty; backfills
RunningBalanceon every entry. - Sets
Status = Posted,ApprovalStatus = Approved. - Inserts the
SITSyncQueuerow so the hosted worker now replays it to core.
Cmd: SITApproveTransactionCommand
Request​
Provide one of:
{ "data": { "sitTransactionId": "<guid>" } }
{ "data": { "transactionReference": "WDR-20260427-0001" } }
Response​
{
"isSuccessful": true,
"message": "SIT transaction approved.",
"data": {
"sitTransactionId": "...",
"transactionReference": "WDR-20260427-0001",
"status": "Posted",
"approvalStatus": "Approved",
"newAvailableBalance": 149300.00,
"newLedgerBalance": 149300.00
}
}
Error cases​
| Status | Cause |
|---|---|
400 | Neither sitTransactionId nor transactionReference supplied |
404 | Transaction not found |
409 | Transaction is not awaiting approval (already approved, rejected, or pending) |
409 | Account is now Frozen, Closed or Dormant |
409 | Insufficient SIT available balance at approval time |
SITRejectTransactionCommand​
Reject a held transaction. Sets Status = Rejected,
ApprovalStatus = Rejected. No balance impact, no replay queued.
Cmd: SITRejectTransactionCommand
Request​
{
"cmd": "SITRejectTransactionCommand",
"data": {
"transactionReference": "WDR-20260427-0001",
"reason": "Customer not at counter"
}
}
The optional reason is appended to the transaction narration for audit.
Response​
{
"isSuccessful": true,
"message": "SIT transaction rejected.",
"data": {
"sitTransactionId": "...",
"transactionReference": "WDR-20260427-0001",
"status": "Rejected",
"approvalStatus": "Rejected"
}
}
SITCancelTransactionCommand​
Cancel a held transaction. This is the initiator self-service action —
only the teller who created the transaction may cancel it. A supervisor
must use SITRejectTransactionCommand instead.
Sets Status = Cancelled, ApprovalStatus = Cancelled.
No balance impact, no replay queued.
Permission: bnk_sit_cancel_transaction
Cmd: SITCancelTransactionCommand
Request​
{
"cmd": "SITCancelTransactionCommand",
"data": {
"transactionReference": "WDR-20260427-0001",
"reason": "Customer changed mind"
}
}
Accepts sitTransactionId (GUID) or transactionReference. The optional
reason is appended to the narration for audit.
Response​
{
"isSuccessful": true,
"message": "SIT transaction cancelled.",
"data": {
"sitTransactionId": "...",
"transactionReference": "WDR-20260427-0001",
"status": "Cancelled",
"approvalStatus": "Cancelled"
}
}
Error cases​
| Status | Cause |
|---|---|
400 | Neither sitTransactionId nor transactionReference supplied |
403 | Caller is not the teller who initiated the transaction |
404 | Transaction not found |
409 | Transaction is not awaiting approval (already approved, rejected, cancelled, or posted) |
Use Cancel when the initiating teller wants to withdraw their own submission.
Use Reject when a supervisor declines a pending transaction.
Listing pending-approval transactions​
Use GetSITTransactionListQuery with a filter:
{
"cmd": "GetSITTransactionListQuery",
"data": {
"filters": [
{ "field": "ApprovalStatus", "operator": "equals", "value": "PendingApproval" }
]
}
}
This is the standard backing query for a "Pending SIL approvals" supervisor screen.