Skip to content

Payment Out

Backlog fieldValue
Story IDAP-FIN-006
EpicFinance
Story typeBusiness workflow
Review statusDraft - business analyst and business owner review required
Source evidenceAppsPortal.Apis controller, application command/query handlers, validators, domain entities, and matching MFE workflow where available
Last source review2026-07-10

User story

As cashiers, I want to record, allocate, post, print, and reverse outgoing payments so that vendor and account balances reflect paid funds.

Posting reference: AppsPortal Posting Ledger explains debit/credit construction. Delegation and Interaction Contracts explains module ownership, delegated commands, linked records, commit boundaries, and reversal propagation.

Acceptance criteria

  1. Only authorized users can view or execute the feature's actions.
  2. Required business data, active dependencies, tenant/branch scope, and current document state are validated.
  3. Invalid requests return actionable validation errors without applying a partial change.
  4. Search, list, view, print, and export operations use the same authorized business scope.
  5. Material create, edit, status, approval, posting, reversal, and integration actions are auditable where applicable.
  6. Financial or stock effects are applied atomically and no more than once.

Posting details

  1. Validate Draft state, open period, payment hub/method, amount, details, currency/rate, party accounts, and the resulting Bank/Treasury balance.
  2. Debit Customer Receivable, Vendor Payable, or explicit Other GL per detail. Credit the selected Treasury Account or Bank Account GL.
  3. Add configured commission/VAT debits and their Bank/Treasury counterpart, then delegate the journal to Accounting.
  4. Create and link the Bank/Treasury transaction and mark Payment Out Posted.
  5. Journal, hub movement, balances, and status commit together. Unpost requires an open period and reversible journal, then removes the hub movement and posts the accounting reversal.

General ledger posting

ComponentDebitCreditAccount rule
DisbursementCustomer Receivable, Vendor Payable, or Other GLBank/Treasury GLParty account customer/vendor then category; other is explicit.
Commission/feeCommission/fee expenseBank/Treasury GLOnly when configured.
Fee VATConfigured tax accountBank/Treasury GLOnly for taxable configured fee.

Other module and document effects

AreaEffectConditional/no effect
Bank/TreasuryDecreases hub balance and creates linked transaction.Insufficient balance blocks all effects.
Vendor/customerSettles or adjusts eligible party balances.Other-GL payment has no party subledger effect.
InventoryNo stock quantity/valuation effect.Purchase Return stock is handled by its own Stock Out.

Core acceptance scenarios

  1. Given a valid Draft payment with sufficient bank/treasury balance, when the cashier clicks Post, then party/other accounts are debited, the hub is credited, its subledger movement is created, and status becomes Posted.
  2. Given the resulting hub balance is negative or an account is missing, when the operation is attempted, then Post is rejected without a journal or subledger movement.
  3. Given the same Post request is retried after success, when the source is no longer Draft, then no duplicate journal, stock, balance, payment, or lifecycle effect is created.

Required and conditional data

Draft payment, date/open period, hub, amount, currency/rate, at least one detail, and payment method are required. Treasury or bank account is conditional on hub. Cheque/reference, customer/vendor, commission, VAT, and other GL are conditional.

Account resolution and Post effects

  • Credit Treasury account or Bank Account GL for total cash outflow.
  • Debit customer Receivable (customer then category), vendor Payable (vendor then category), or explicit Other GL per detail.
  • Post commission and VAT through payment-method configured accounts with bank/treasury counterpart.
  • Create bank/treasury transaction records and link the journal.

Before Post, the resulting bank/treasury balance is validated; a negative balance is rejected. Post accepts Draft only and commits journal, subledger movement, balances, and Posted status atomically.

Unpost requires an open period and reversible journal, reverses the journal, soft-deletes bank/treasury movements, restores linked balances where applicable, and prevents partial reversal.

Frontend page coverage

The following UI coverage is sourced from the pulled MFE route configuration. A Module-level supporting artifact mapping is evidence of a reachable screen, but requires BA confirmation that it belongs to this story rather than a more specific feature story.

Route/pageComponentModeRoute permission/guardMapping confidenceSource
(module default)PaymentOutListComponentList/navigationPermission: AppFinancePermissions.PaymentOut_List; Guards: PolicyAuthGuardExplicit frontend feature ruleapps/finance/src/app/remote-entry/transactions/transactions.module.ts:110
addAddPaymentOutComponentAddPermission: AppFinancePermissions.PaymentOut_Add; Guards: PolicyAuthGuardExplicit frontend feature ruleapps/finance/src/app/remote-entry/transactions/transactions.module.ts:121
edit/:idEditPaymentOutComponentEditPermission: AppFinancePermissions.PaymentOut_Edit; Guards: PolicyAuthGuard, preventPostedGuardExplicit frontend feature ruleapps/finance/src/app/remote-entry/transactions/transactions.module.ts:132
paymentoutMainPaymentOutComponentList/navigationPermission: AppFinancePermissions.PaymentOut_List; Guards: PolicyAuthGuardExplicit frontend feature ruleapps/finance/src/app/remote-entry/transactions/transactions.module.ts:99
view/:idViewPaymentOutComponentView/detailPermission: AppFinancePermissions.PaymentOut_View; Guards: PolicyAuthGuardExplicit frontend feature ruleapps/finance/src/app/remote-entry/transactions/transactions.module.ts:144

Observed frontend fields and validation

ComponentControlObserved frontend ruleComponent source
AddPaymentOutComponentamountRequired in component validatorapps/finance/src/app/remote-entry/transactions/pages/paymentout/add-payment-out/add-payment-out.component.ts
AddPaymentOutComponentbankAccountIdVisible control; optional or API-dependentapps/finance/src/app/remote-entry/transactions/pages/paymentout/add-payment-out/add-payment-out.component.ts
AddPaymentOutComponentdescriptionVisible control; optional or API-dependentapps/finance/src/app/remote-entry/transactions/pages/paymentout/add-payment-out/add-payment-out.component.ts
AddPaymentOutComponentglAccountIdConditionally required/validated in componentapps/finance/src/app/remote-entry/transactions/pages/paymentout/add-payment-out/add-payment-out.component.ts
AddPaymentOutComponentnotesVisible control; optional or API-dependentapps/finance/src/app/remote-entry/transactions/pages/paymentout/add-payment-out/add-payment-out.component.ts
AddPaymentOutComponentpaidByVisible control; optional or API-dependentapps/finance/src/app/remote-entry/transactions/pages/paymentout/add-payment-out/add-payment-out.component.ts
AddPaymentOutComponentpaidByDetailsIdRequired in component validatorapps/finance/src/app/remote-entry/transactions/pages/paymentout/add-payment-out/add-payment-out.component.ts
AddPaymentOutComponentpaymentHubRequired in component validatorapps/finance/src/app/remote-entry/transactions/pages/paymentout/add-payment-out/add-payment-out.component.ts
AddPaymentOutComponentpaymentHubDetailIdRequired in component validatorapps/finance/src/app/remote-entry/transactions/pages/paymentout/add-payment-out/add-payment-out.component.ts
AddPaymentOutComponentpaymentMethodIdVisible control; optional or API-dependentapps/finance/src/app/remote-entry/transactions/pages/paymentout/add-payment-out/add-payment-out.component.ts
AddPaymentOutComponentpaymentOutDateVisible control; optional or API-dependentapps/finance/src/app/remote-entry/transactions/pages/paymentout/add-payment-out/add-payment-out.component.ts
AddPaymentOutComponentrateRequired in component validatorapps/finance/src/app/remote-entry/transactions/pages/paymentout/add-payment-out/add-payment-out.component.ts
EditPaymentOutComponentamountRequired in component validatorapps/finance/src/app/remote-entry/transactions/pages/paymentout/edit-payment-out/edit-payment-out.component.ts
EditPaymentOutComponentbankAccountIdVisible control; optional or API-dependentapps/finance/src/app/remote-entry/transactions/pages/paymentout/edit-payment-out/edit-payment-out.component.ts
EditPaymentOutComponentdescriptionVisible control; optional or API-dependentapps/finance/src/app/remote-entry/transactions/pages/paymentout/edit-payment-out/edit-payment-out.component.ts
EditPaymentOutComponentglAccountIdConditionally required/validated in componentapps/finance/src/app/remote-entry/transactions/pages/paymentout/edit-payment-out/edit-payment-out.component.ts
EditPaymentOutComponentnotesVisible control; optional or API-dependentapps/finance/src/app/remote-entry/transactions/pages/paymentout/edit-payment-out/edit-payment-out.component.ts
EditPaymentOutComponentpaidByVisible control; optional or API-dependentapps/finance/src/app/remote-entry/transactions/pages/paymentout/edit-payment-out/edit-payment-out.component.ts
EditPaymentOutComponentpaidByDetailsIdRequired in component validatorapps/finance/src/app/remote-entry/transactions/pages/paymentout/edit-payment-out/edit-payment-out.component.ts
EditPaymentOutComponentpaymentHubDetailIdVisible control; optional or API-dependentapps/finance/src/app/remote-entry/transactions/pages/paymentout/edit-payment-out/edit-payment-out.component.ts
EditPaymentOutComponentpaymentMethodIdVisible control; optional or API-dependentapps/finance/src/app/remote-entry/transactions/pages/paymentout/edit-payment-out/edit-payment-out.component.ts
EditPaymentOutComponentpaymentOutDateVisible control; optional or API-dependentapps/finance/src/app/remote-entry/transactions/pages/paymentout/edit-payment-out/edit-payment-out.component.ts
EditPaymentOutComponentrateVisible control; optional or API-dependentapps/finance/src/app/remote-entry/transactions/pages/paymentout/edit-payment-out/edit-payment-out.component.ts
PaymentOutListComponentBankAccountIdVisible control; optional or API-dependentapps/finance/src/app/remote-entry/transactions/pages/paymentout/payment-out-list/payment-out-list.component.ts

Observed frontend actions

ComponentClick action/handlerBusiness review requirementComponent source
AddPaymentOutComponentaddNewRowAdd one initialized detail row without changing existing rows; apply defaults and line validators, preserve stable row identity, and exclude incomplete rows from Save/Post.apps/finance/src/app/remote-entry/transactions/pages/paymentout/add-payment-out/add-payment-out.component.ts
AddPaymentOutComponentcreateVatDocument the enabled state, permission, input context, resulting API or navigation effect, success refresh, and concrete failure behavior for this handler.apps/finance/src/app/remote-entry/transactions/pages/paymentout/add-payment-out/add-payment-out.component.ts
AddPaymentOutComponentdeleteLineAvailable only in deletable states with Delete permission; identify the record in confirmation, call delete once, remove/refresh the list row on success, and retain the row with the API reason on failure.apps/finance/src/app/remote-entry/transactions/pages/paymentout/add-payment-out/add-payment-out.component.ts
AddPaymentOutComponenthandleButtonClickDocument the enabled state, permission, input context, resulting API or navigation effect, success refresh, and concrete failure behavior for this handler.apps/finance/src/app/remote-entry/transactions/pages/paymentout/add-payment-out/add-payment-out.component.ts
AddPaymentOutComponentopenCostPopupDocument the enabled state, permission, input context, resulting API or navigation effect, success refresh, and concrete failure behavior for this handler.apps/finance/src/app/remote-entry/transactions/pages/paymentout/add-payment-out/add-payment-out.component.ts
AddPaymentOutComponentopenDialogSearchOpen the item/lookup/tracking dialog with the current warehouse, item, UOM, and remaining quantity context; accepted values must return to the correct line and cancel must not mutate it.apps/finance/src/app/remote-entry/transactions/pages/paymentout/add-payment-out/add-payment-out.component.ts
EditPaymentOutComponentaddNewRowAdd one initialized detail row without changing existing rows; apply defaults and line validators, preserve stable row identity, and exclude incomplete rows from Save/Post.apps/finance/src/app/remote-entry/transactions/pages/paymentout/edit-payment-out/edit-payment-out.component.ts
EditPaymentOutComponentcreateVatDocument the enabled state, permission, input context, resulting API or navigation effect, success refresh, and concrete failure behavior for this handler.apps/finance/src/app/remote-entry/transactions/pages/paymentout/edit-payment-out/edit-payment-out.component.ts
EditPaymentOutComponenthandleButtonClickDocument the enabled state, permission, input context, resulting API or navigation effect, success refresh, and concrete failure behavior for this handler.apps/finance/src/app/remote-entry/transactions/pages/paymentout/edit-payment-out/edit-payment-out.component.ts
EditPaymentOutComponentonDeleteAvailable only in deletable states with Delete permission; identify the record in confirmation, call delete once, remove/refresh the list row on success, and retain the row with the API reason on failure.apps/finance/src/app/remote-entry/transactions/pages/paymentout/edit-payment-out/edit-payment-out.component.ts
EditPaymentOutComponentopenCostPopupDocument the enabled state, permission, input context, resulting API or navigation effect, success refresh, and concrete failure behavior for this handler.apps/finance/src/app/remote-entry/transactions/pages/paymentout/edit-payment-out/edit-payment-out.component.ts
EditPaymentOutComponentopenDialogSearchOpen the item/lookup/tracking dialog with the current warehouse, item, UOM, and remaining quantity context; accepted values must return to the correct line and cancel must not mutate it.apps/finance/src/app/remote-entry/transactions/pages/paymentout/edit-payment-out/edit-payment-out.component.ts
PaymentOutListComponentnavigateHelpPageComponentDocument the enabled state, permission, input context, resulting API or navigation effect, success refresh, and concrete failure behavior for this handler.apps/finance/src/app/remote-entry/transactions/pages/paymentout/payment-out-list/payment-out-list.component.ts
PaymentOutListComponentonDeleteAvailable only in deletable states with Delete permission; identify the record in confirmation, call delete once, remove/refresh the list row on success, and retain the row with the API reason on failure.apps/finance/src/app/remote-entry/transactions/pages/paymentout/payment-out-list/payment-out-list.component.ts
PaymentOutListComponentonEditOpen the identified editable record only with Edit permission; posted/locked records remain blocked by route or action state and list context must be recoverable on return.apps/finance/src/app/remote-entry/transactions/pages/paymentout/payment-out-list/payment-out-list.component.ts
PaymentOutListComponentonPostAvailable only for a postable Draft and Post permission; confirm the document, prevent a second submission, call the posting API, and refresh status, journal/stock links, and row actions. Failure must keep the pre-post state.apps/finance/src/app/remote-entry/transactions/pages/paymentout/payment-out-list/payment-out-list.component.ts
PaymentOutListComponentonUnPostAvailable only for a postable Draft and Post permission; confirm the document, prevent a second submission, call the posting API, and refresh status, journal/stock links, and row actions. Failure must keep the pre-post state.apps/finance/src/app/remote-entry/transactions/pages/paymentout/payment-out-list/payment-out-list.component.ts
PaymentOutListComponentonViewOpen the authorized record in view mode with its status, totals, lines, source and generated-document links; handle deleted, forbidden, and missing records without exposing stale data.apps/finance/src/app/remote-entry/transactions/pages/paymentout/payment-out-list/payment-out-list.component.ts
PaymentOutListComponentprintoutGenerate the printout for the selected record and authorized branch/tenant; use posted/current values and surface print, template, ZATCA/ETA, or popup failures without changing transaction state.apps/finance/src/app/remote-entry/transactions/pages/paymentout/payment-out-list/payment-out-list.component.ts
PaymentOutListComponentrouteToJournalViewOpen the authorized record in view mode with its status, totals, lines, source and generated-document links; handle deleted, forbidden, and missing records without exposing stale data.apps/finance/src/app/remote-entry/transactions/pages/paymentout/payment-out-list/payment-out-list.component.ts
ViewPaymentOutComponenthandleButtonClickDocument the enabled state, permission, input context, resulting API or navigation effect, success refresh, and concrete failure behavior for this handler.apps/finance/src/app/remote-entry/transactions/pages/paymentout/view-payment-out/view-payment-out.component.ts
ViewPaymentOutComponentopenCostPopupDocument the enabled state, permission, input context, resulting API or navigation effect, success refresh, and concrete failure behavior for this handler.apps/finance/src/app/remote-entry/transactions/pages/paymentout/view-payment-out/view-payment-out.component.ts
ViewPaymentOutComponentrouteToJournalViewOpen the authorized record in view mode with its status, totals, lines, source and generated-document links; handle deleted, forbidden, and missing records without exposing stale data.apps/finance/src/app/remote-entry/transactions/pages/paymentout/view-payment-out/view-payment-out.component.ts

Page-specific frontend acceptance criteria

  1. (module default) - List/navigation: Load an authorized paged/searchable list or navigation page; preserve filters/sort/paging and expose only permitted row and bulk actions. Security observed: Permission: AppFinancePermissions.PaymentOut_List; Guards: PolicyAuthGuard
  2. add - Add: Render permitted fields, required indicators, defaults, dependent lookups, validation, Save/Cancel, loading, success, and API-error states. Security observed: Permission: AppFinancePermissions.PaymentOut_Add; Guards: PolicyAuthGuard
  3. edit/:id - Edit: Load the identified record, enforce state/permission field locks, preserve concurrency identity, validate changes, and return without losing filters. Security observed: Permission: AppFinancePermissions.PaymentOut_Edit; Guards: PolicyAuthGuard, preventPostedGuard
  4. paymentout - List/navigation: Load an authorized paged/searchable list or navigation page; preserve filters/sort/paging and expose only permitted row and bulk actions. Security observed: Permission: AppFinancePermissions.PaymentOut_List; Guards: PolicyAuthGuard
  5. view/:id - View/detail: Load an authorized immutable/detail representation with status-aware actions, linked records, print/export where exposed, and not-found/forbidden handling. Security observed: Permission: AppFinancePermissions.PaymentOut_View; Guards: PolicyAuthGuard

Internal Documentation — Microtec