Skip to main content

SIL Transactions — Overview

All financial commands flow through ISITPostingService.PostAsync, which:

  1. Validates the account against the Active rule.
  2. Validates the counterparty for transfers.
  3. Checks idempotency by (tenant, transactionReference).
  4. Routes to approval if the SIL debit/credit limit is breached, otherwise applies the balance impact.
  5. Writes a balanced double-entry (SITTransactionEntry).
  6. Enqueues a SITSyncQueue row for the hosted worker to replay to core.

Commands

CommandPurpose
SITDepositToTillCommandCash / cheque deposit into a till
SITWithdrawFromTillCommandCash withdrawal from a till
SITWithdrawFromTillForClosureCommandWithdrawal as part of an account-closure flow
SITLoanRepaymentCommandLoan repayment received over the till
SITTransferCommandAccount-to-account transfer (no till impact)
SITReverseTransactionCommandReverse an unsynced SIL transaction
SITCancelTransactionCommandInitiating teller cancels a pending-approval transaction
GetSITTransactionListQueryFilterable / exportable list of SIL transactions
GetSITTransactionDetailQueryFull details of a single SIL transaction

Enums & Status Codes

All status fields in SIL responses are returned as string names. See the SIL Enums Reference for the full list of values for:

Common request fields

Every financial command shares this base payload:

FieldRequiredNotes
transactionReferenceyesUnique per tenant. Used as the idempotency key.
accountNumberyesPrimary SIL account
amountyesMust be > 0
currencynoDefaults to "NGN"
narrationnoFree-text description
tellerUserId / initiatorUserIdnoStamped on the transaction for audit
tillIdyes for till-based commandsLinked till
cashOrChequenoCash (default) or Cheque. Cheque does not move the till.
chequeNumberconditionalRequired when cashOrCheque = Cheque
idempotencyKeynoDefaults to transactionReference

Common response

All commands return the platform CommandExecutionResponse wrapping a SITPostingResult:

{
"isSuccessful": true,
"message": "Posted to SIT.",
"data": {
"sitTransactionId": "<guid>",
"transactionReference": "M226E1M2269165431",
"status": "Posted",
"approvalStatus": "NotRequired",
"amount": 40.00,
"currency": "NGN",
"newAvailableBalance": 154300.00,
"newLedgerBalance": 154300.00,
"wasDuplicate": false
}
}

When the limit is breached, status = "Pending" and approvalStatus = "PendingApproval". No balance is applied until the transaction is approved.

Status & error codes

HTTP / statusMeaning
200 / 00Posted, or held for approval
400Bad payload (missing reference, amount ≤ 0, idempotency mismatch)
409State conflict — account frozen, closed, dormant, PND/PNC, insufficient funds