Skip to content

Fund Transfers

Backlog fieldValue
Story IDAP-FIN-003
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 treasury users, I want to move funds between controlled treasury or bank accounts so that both sides of an internal transfer remain balanced.

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, positive amount, different source/target hubs, currencies/rates, sufficient source balance, and Finance Fund Transfer Contra account.
  2. Delegate a source Payment Out: Debit Contra, Credit source Bank/Treasury.
  3. Delegate a destination Payment In: Debit target Bank/Treasury, Credit Contra.
  4. Link both payment and hub-transaction records to the Fund Transfer and mark it Posted.
  5. Both legs commit together and the Contra account nets to zero in local value. Failure of either leg rolls back the other.

General ledger posting

LegDebitCreditEffect
Source Payment OutFund Transfer ContraSource Bank/Treasury GLReduces source hub.
Destination Payment InTarget Bank/Treasury GLFund Transfer ContraIncreases target hub; contra nets to zero in local value.

Other module and document effects

AreaEffectConditional/no effect
Finance hubsCreates linked Payment Out/In and two hub transactions.Neither leg remains if the other fails.
Customer/vendor/inventoryNo party due balance or stock effect.Internal funds movement only.

Core acceptance scenarios

  1. Given a Draft transfer with different valid source/target hubs and a contra account, when the treasury user clicks Post, then source Payment Out and target Payment In are created and the contra nets to zero.
  2. Given either delegated leg fails, when the operation is attempted, then neither leg nor the Fund Transfer is committed.
  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 transfer, date/open period, different From and To destinations, amount greater than zero, currency/rates, payment methods, and source/destination treasury or bank accounts are required. Bank reference is conditional for bank movement; notes/reference are optional.

Clicking Post

Post requires Finance General Settings Fund Transfer Contra Account. It creates the outbound payment side from the source and inbound payment side to the destination, using the contra account between them, creates bank/treasury transaction records, links both results, marks Posted, and commits atomically. Source balance must be sufficient and both destination accounts/currencies must be valid.

GL intent: credit source bank/treasury and debit contra; debit destination bank/treasury and credit contra. Contra must net to zero after currency/local-value handling.

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)FundTransferListComponentList/navigationPermission: AppFinancePermissions.FundTransfer_List; Guards: PolicyAuthGuardExplicit frontend feature ruleapps/finance/src/app/remote-entry/transactions/fund-transfer/fund-transfer-routing.module.ts:28
(module default)MainFundTransferComponentList/navigationPermission: AppFinancePermissions.FundTransfer_List; Guards: PolicyAuthGuardExplicit frontend feature ruleapps/finance/src/app/remote-entry/transactions/fund-transfer/fund-transfer-routing.module.ts:18
addAddFundTransferComponentAddPermission: AppFinancePermissions.FundTransfer_Add; Guards: PolicyAuthGuardExplicit frontend feature ruleapps/finance/src/app/remote-entry/transactions/fund-transfer/fund-transfer-routing.module.ts:39
edit/:idEditFundTransferComponentEditPermission: AppFinancePermissions.FundTransfer_Edit; Guards: PolicyAuthGuard, preventPostedGuardExplicit frontend feature ruleapps/finance/src/app/remote-entry/transactions/fund-transfer/fund-transfer-routing.module.ts:50
fund-transferLazy-loaded routeList/navigationNo route-level permission/guard found in source windowExplicit frontend feature ruleapps/finance/src/app/remote-entry/transactions/transactions.module.ts:171
sequenceSequenceComponentSequenceNo route-level permission/guard found in source windowExplicit frontend feature ruleapps/finance/src/app/remote-entry/transactions/fund-transfer/fund-transfer-routing.module.ts:73
view/:idViewFundTransferComponentView/detailPermission: AppFinancePermissions.FundTransfer_View; Guards: PolicyAuthGuardExplicit frontend feature ruleapps/finance/src/app/remote-entry/transactions/fund-transfer/fund-transfer-routing.module.ts:62

Observed frontend fields and validation

ComponentControlObserved frontend ruleComponent source
AddFundTransferComponentamountRequired in component validatorapps/finance/src/app/remote-entry/transactions/fund-transfer/pages/add-fund-transfer/add-fund-transfer.component.ts
AddFundTransferComponentdateRequired in component validatorapps/finance/src/app/remote-entry/transactions/fund-transfer/pages/add-fund-transfer/add-fund-transfer.component.ts
AddFundTransferComponentdescriptionVisible control; optional or API-dependentapps/finance/src/app/remote-entry/transactions/fund-transfer/pages/add-fund-transfer/add-fund-transfer.component.ts
AddFundTransferComponentrateFromRequired in component validatorapps/finance/src/app/remote-entry/transactions/fund-transfer/pages/add-fund-transfer/add-fund-transfer.component.ts
AddFundTransferComponentreferenceVisible control; optional or API-dependentapps/finance/src/app/remote-entry/transactions/fund-transfer/pages/add-fund-transfer/add-fund-transfer.component.ts
EditFundTransferComponentamountVisible control; optional or API-dependentapps/finance/src/app/remote-entry/transactions/fund-transfer/pages/edit-fund-transfer/edit-fund-transfer.component.ts
EditFundTransferComponentdateVisible control; optional or API-dependentapps/finance/src/app/remote-entry/transactions/fund-transfer/pages/edit-fund-transfer/edit-fund-transfer.component.ts
EditFundTransferComponentdescriptionVisible control; optional or API-dependentapps/finance/src/app/remote-entry/transactions/fund-transfer/pages/edit-fund-transfer/edit-fund-transfer.component.ts
EditFundTransferComponentrateFromVisible control; optional or API-dependentapps/finance/src/app/remote-entry/transactions/fund-transfer/pages/edit-fund-transfer/edit-fund-transfer.component.ts
EditFundTransferComponentreferenceVisible control; optional or API-dependentapps/finance/src/app/remote-entry/transactions/fund-transfer/pages/edit-fund-transfer/edit-fund-transfer.component.ts

Observed frontend actions

ComponentClick action/handlerBusiness review requirementComponent source
AddFundTransferComponentonSelectPaymentHubDocument 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/fund-transfer/pages/add-fund-transfer/add-fund-transfer.component.ts
AddFundTransferComponentonSelectTransferToDocument 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/fund-transfer/pages/add-fund-transfer/add-fund-transfer.component.ts
AddFundTransferComponentonSendToPaymentMethodSelectDocument 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/fund-transfer/pages/add-fund-transfer/add-fund-transfer.component.ts
EditFundTransferComponentonSelectPaymentHubDocument 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/fund-transfer/pages/edit-fund-transfer/edit-fund-transfer.component.ts
EditFundTransferComponentonSelectTransferToDocument 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/fund-transfer/pages/edit-fund-transfer/edit-fund-transfer.component.ts
EditFundTransferComponentonSendToPaymentMethodSelectDocument 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/fund-transfer/pages/edit-fund-transfer/edit-fund-transfer.component.ts
FundTransferListComponentnavigateHelpPageComponentDocument 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/fund-transfer/pages/fund-transfer-list/fund-transfer-list.component.ts
FundTransferListComponentonDeleteAvailable 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/fund-transfer/pages/fund-transfer-list/fund-transfer-list.component.ts
FundTransferListComponentonEditOpen 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/fund-transfer/pages/fund-transfer-list/fund-transfer-list.component.ts
FundTransferListComponentonPostAvailable 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/fund-transfer/pages/fund-transfer-list/fund-transfer-list.component.ts
FundTransferListComponentonRedirectToPaymentInDocument 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/fund-transfer/pages/fund-transfer-list/fund-transfer-list.component.ts
FundTransferListComponentonRedirectToPaymentOutDocument 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/fund-transfer/pages/fund-transfer-list/fund-transfer-list.component.ts
FundTransferListComponentonViewOpen 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/fund-transfer/pages/fund-transfer-list/fund-transfer-list.component.ts
FundTransferListComponentprintRecordGenerate 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/fund-transfer/pages/fund-transfer-list/fund-transfer-list.component.ts
ViewFundTransferComponentcancelLeave or close without persisting; warn when the current form has unsaved changes and restore the prior list/filter context.apps/finance/src/app/remote-entry/transactions/fund-transfer/pages/view-fund-transfer/view-fund-transfer.component.ts
ViewFundTransferComponentonRedirectToPaymentInDocument 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/fund-transfer/pages/view-fund-transfer/view-fund-transfer.component.ts
ViewFundTransferComponentonRedirectToPaymentOutDocument 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/fund-transfer/pages/view-fund-transfer/view-fund-transfer.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.FundTransfer_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.FundTransfer_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.FundTransfer_Edit; Guards: PolicyAuthGuard, preventPostedGuard
  4. fund-transfer - 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: No route-level permission/guard found in source window
  5. sequence - Sequence: Show current numbering scope and permit only authorized, valid sequence configuration without retroactively renumbering posted documents. Security observed: No route-level permission/guard found in source window
  6. 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.FundTransfer_View; Guards: PolicyAuthGuard

Internal Documentation — Microtec