Skip to content

Reimbursement Payment Voucher Applet (Internal)

Overview

The Reimbursement Payment Voucher records money paid back to someone who spent it on the company’s behalf — a staff claim, a petty-cash top-up, an expense a branch manager put on a personal card. You list what was spent on the Expenses tab, record how you paid it back on the Payment tab, and finalise. BigLedger then writes the cashbook transaction and the journal.

It is a near-twin of the Payment Voucher (Internal) and shares its edit form, its settings screen and most of its tabs. The difference that matters is in the backend: this document type is not registered in the journal posting type map, so it never raises a creditor (accounts-payable) control entry. Read Lifecycle and effects before you design a chart of accounts around it.

Where it fits

UpstreamThis appletDownstream
An expense already incurred and evidenced — a receipt, a claim form, a card slipExpenses lines (what was spent, against which GL code) + Payment lines (which cashbook / settlement method paid it back)The cashbook transaction, then bank reconciliation in the Bank Reconciliation Applet
Employee Applet — the people named in Checked By and Approved ByHeader
Supplier Applet — the entity on the Account tabHeader entityLedger and Journal, Chart of Accounts
An open document to be clearedContra tabThe other document’s open amount
Branch intercompany configurationIntercompany queueA mirror document in the counterpart company

Screens and menus

MenuRouteWhat it listsActions
Internal Reimbursement Payment Voucherinternal-reimbursement-payment-voucherThe voucher register — Group, Doc No (Tenant / Company / Branch), Reference, Posting Status, Status, Branch Code, Currency, Entity Name, Payee Name, Amount Txn, the five ARAP figures (PNS, Settlement, Doc Open, Contra, Bal), Transaction / Created / Updated dates, Created by, Updated By, Description and Client Doc Type plus Client Doc 1–5Add, FINAL, Discard, Void, Send Email, Bulk Print
IntercompanyintercompanyTwo tabs. UNPROCESSED = bl_fi_mst_intercompany_processing_queue; PROCESSED = bl_fi_generic_doc_intercompany_link. Both show Source Doc Type / No, Target Doc Type / No, Used Config, Status and datesConfirm Intercompany Transaction on the selected UNPROCESSED rows
File Exportfile-exportbl_fi_generic_doc_file_export — Report Name, Doc Type, Status, Error Message, dates, and a per-row Download / Delete actionGenerate CSV (for document type internal-reimbursement-payment-vouchers)
Settlement Adjustmentsettlement-adjustmentAdjustments made to settlements on already-finalised vouchers — Document Type, Document No, Adjustment Status, Remarks, Posting Journal / Posting Cashbook and their error columns, Settlement Update Status and Error, Created By, Creation DateView
Settingssettings/…Application Settings, Default Selection, Printable Format Settings, Email Template; plus the shared permission screens and Release NotesSee Configuration
Personalizationpersonalization/…Default Selection (per user), Sidebar

Edit-form tabs, in their default order: Main Details · Account · Expenses · ARAP · Payment · Payment Adjustment · Department Hdr · TraceDocument · Contra · Doc Link · Attachments · Export · Sales Commission. The order is configurable (see Default Selection), and the whole form can be rendered as a vertical accordion instead of tabs.

Four routes exist that nothing in the UI links to, so they open only if you type the URL: File Import (file-import — its menu entry is commented out in menu-items.ts), Feature Visibility, Webhook, Team Permission, Client-Side Permission and Applet Log. The last five are not linked because the shared settings navigation has those <li> entries commented out. File Import is also worth knowing about for a second reason: it reads and writes bl_fi_internal_payment_voucher_import_file_hdr — the Payment Voucher import table — not a table of its own.

Screenshots needed

No screenshots exist for this applet. A capture session should take: the voucher listing showing the ARAP columns; Main Details; the Expenses tab with two or three lines; Add Line Item; the Payment tab; the ARAP tab; the Intercompany screen with both tabs; Settings → Application Settings; and Settings → Default Selection with the tab-ordering list. Use a scratch tenant — the listing shows payee names.

Configuration

Before you can use it

PrerequisiteWhereWhy
A branch with a Main LocationOrganisation Applet → Branch → extensions (MAIN_LOCATION)Selecting a branch on Main Details sets the company from bl_fi_mst_branch.comp_guid and copies the branch’s MAIN_LOCATION into the Location field. location carries Validators.required, and nothing else fills it — a branch with no Main Location leaves the form permanently invalid with no visible reason.
A cashbook and settlement methodsCashbook AppletPayment lines are STL_MTHD lines; posting resolves their GL from the settlement item’s sub-ledger, and failing that from the cashbook. With neither, FINAL throws MISSING_CASHBOOK: STL_MTHD [<item code>].
A GL code on every expense item, or a header GL codeChart of Accounts and the item’s company GL linkFor this document type the company-default and item-company GL lookups cannot match (see Lifecycle). An expense line with no GL code of its own is silently dropped from the journal.
Employees to name as Checked By / Approved ByEmployee AppletBoth fields open an employee picker; they are free of validators, so they are optional.
Document numbering for the document typeDocument numbering configurationDoc No (Tenant / Company / Branch) are server-assigned.

Applet settings

Settings live on the shared FieldConfigurationComponent from blg-shared-utilities (imported directly in app.routing.ts as Application Settings), plus four applet-local screens: Default Selection, Printable Format Settings, Email Template and Release Notes. Only a tenant administrator with the applet’s settings route open can change them; there is no per-row authority difference.

Measured at commit 8faf206 against blg-shared-utilities HEAD: the shared screen renders 298 controls for this applet code, of which 102 are actually read by this applet. Those 102 are the ones documented below. The remaining 196 render but are inert here.

Application Settings — what the applet reads

GroupKeysWhat they controlDefault
Listing behaviourDISABLE_GEN_DOC_LISTING, DEFAULT_POSTING_STATUS, DEFAULT_STATUS, DEFAULT_TRANSACTION_DATE, SORT_ORDER, DISABLE_DEFAULT_SETTING_ADVANCE_SEARCH, FUZZY_SEARCH_COLUMNS, ENABLE_AUTO_POPUPWhich filters the register opens with, how rows sort, whether the advanced-search defaults apply, which columns fuzzy search coversOff / none
Action buttonsHIDE_GENDOC_SAVE_BUTTON, HIDE_GENDOC_FINAL_BUTTON, HIDE_FINAL_BUTTON, HIDE_GENDOC_DISCARD_BUTTON, HIDE_GENDOC_VOID_BUTTON, HIDE_SEND_EMAIL_BUTTON, SHOW_DOCUMENT_DELETE_BUTTONHide SAVE / FINAL / DISCARD / VOID / Send Email; show the delete button. The three hide-switches for FINAL, DISCARD and VOID are re-openable per role by the client-side permissions SHOW_GENDOC_FINAL_BUTTON, SHOW_GENDOC_DISCARD_BUTTON and SHOW_GENDOC_VOID_BUTTON — but see Feature visibilityOff
Document-number and reference fieldsHIDE_SERVER_DOC_1/2/3, HIDE_CLIENT_DOC_TYPE, HIDE_CLIENT_DOC_1..5, HIDE_REFERENCE_DATE, HIDE_DESCRIPTION, HIDE_TRANSACTION_DATE, HIDE_TRACKING_ID, HIDE_PERMIT_NO, HIDE_VALIDITY_DATE, HIDE_CREATED_BY_DETAILSRemove header fields from Main DetailsOff
CurrencyCANNOT_EDIT_CURRENCY_RATE, SHOW_FOREX_DATA_SOURCELock the rate; swap the plain currency control for the forex data-source controlOff
Account tabHIDE_ACCOUNT_BILLING_CONTACT, ALLOW_DIFFERENT_PAYEE_THAN_SELECTED_ENTITYHide the billing contact block; allow the Payee to differ from the entity being paidOff
Department headerHIDE_SEGMENT, HIDE_DIMENSION, HIDE_PROFIT_CENTER, HIDE_PROJECT, SHOW_SEGMENT, SHOW_GL_DIMENSION, SHOW_PROFIT_CENTER, SHOW_PROJECTWhich analysis dimensions appear. The SHOW_* four are opt-in, not hide switchesOff
Expense-line columnsHIDE_UNIT_PRICE_STD_EXCL_TAX, HIDE_UNIT_PRICE_STD_INCL_TAX, HIDE_UNIT_PRICE_STD_UOM_EXCL_TAX, HIDE_UNIT_PRICE_STD_UOM_INCL_TAX, HIDE_UNIT_PRICE_STD_PRICING_SCHEME, HIDE_UNIT_PRICE_NET_EXCL_TAX, HIDE_UNIT_PRICE_NET_UOM_EXCL_TAX, HIDE_UNIT_PRICE_TXN, HIDE_UNIT_PRICE_TXN_UOM_INCL_TAX, HIDE_UNIT_DISCOUNT, HIDE_UNIT_DISCOUNT_UOM_EXCL_TAX, HIDE_DISCOUNT_AMOUNT_EXCL_TAX, HIDE_AMOUNT_STD_EXCL_TAX, HIDE_AMOUNT_NET_EXCL_TAX, HIDE_AMOUNT_TXN, HIDE_QTY_BASE, HIDE_QTY_UOM, HIDE_UOM_TO_BASE_RATIOTrim the Expenses grid to the columns a claim actually needsOff
Expense-line sub-panelsHIDE_SERIAL_NUMBER, HIDE_BIN_NUMBER, HIDE_BATCH_NUMBER, HIDE_COSTING_DETAILS, HIDE_ISSUE_LINK, HIDE_LAST_PURCHASE_PRICE, HIDE_DELIVERY_DETAILS, HIDE_DELIVERY_INSTRUCTION, HIDE_DELIVERY_TRIPS, HIDE_DOC_LINK, HIDE_DEPARTMENT, HIDE_TAX_CONFIG_SELECTION, HIDE_WHT_CONFIG_SELECTION, DISABLE_ITEM_LISTINGWhich sub-tabs open from a line, and whether the item picker is offered at allOff
Item namingENABLE_ITEM_NAME_MAX_LIMIT, ITEM_NAME_MAX_LIMITCap the editable item-name lengthOff
ARAP figuresHIDE_ARAP_PNS, HIDE_ARAP_SETTLEMENT, HIDE_ARAP_DOC_OPEN, HIDE_ARAP_CONTRA, HIDE_ARAP_BALHide individual ARAP figures on the listing and the ARAP tabOff
ContraHIDE_MAIN_CONTRA_TAB, EDIT_CONTRA_TXN_DATERemove the Contra tab; let the contra date differ from the document dateOff
Tabs that can be hidden from this screenHIDE_ATTACHMENT_TAB, HIDE_EXPORT_TABRemove the Attachments and Export tabsOff
LayoutVERTICAL_ORIENTATION, EXPAND_MAIN_DETAILS, EXPAND_ACCOUNT, EXPAND_LINE_ITEMS, EXPAND_MAIN_ARAP, EXPAND_MAIN_CONTRA, EXPAND_DEPARTMENT_HDR, EXPAND_TRACE_DOCUMENT, EXPAND_DOC_LINK, EXPAND_ATTACHMENT, EXPAND_EXPORT, EXPAND_POSTING, EXPAND_SETTLEMENT, EXPAND_KO_FOR, EXPAND_DELIVERY_DETAILS, EXPAND_DELIVERY_TRIPSRender the form as an accordion instead of tabs, and which panels start openOff

Read at runtime with no control on this applet’s settings screen

These nine keys change what the applet does, but the shared Application Settings screen renders no control for them under the applet code internalReimbursementPaymentVoucherApplet:

KeyWhat it does when setWhy there is no control
HIDE_EXPENSES_TAB, HIDE_MAIN_PAYMENT_TAB, HIDE_MAIN_ARAP_TAB, HIDE_DEPARTMENT_HDR_TAB, HIDE_TRACE_DOCUMENT_TAB, HIDE_DOC_LINK_TAB, HIDE_SALES_COMMISSION_TABRemoves that tab from the edit form — the applet reads all seven in its panels listFieldConfigurationComponent.getTabValue() renders each tab toggle only when the registry code appears in its tabMappings map. internalReimbursementPaymentVoucherApplet is not in that map; internal-payment-voucher-applet and payment_voucher_applet both are.
HIDE_CLONE_BUTTONHides CLONE on the edit formIts control is gated to a list of applet codes that does not include this one
EXPAND_EXPENSES, EXPAND_PAYMENT, EXPAND_SALES_COMMISSIONWhich accordion panels open in vertical modeThe key does not appear in the shared template at all
ENABLE_EDIT_SETTLEMENT_FINALCombined with the client-side permission SHOW_EDIT_SETTLEMENT_FINAL and a posting status of FINAL, turns on the Payment Adjustment tabThe shared template declares this toggle in four places, and every one of them is gated out for this applet code — three by explicit applet-code lists (payment_voucher_applet, internal-payment-voucher-applet, posGeneral, internal-receipt-voucher-applet, salesInvoiceApplet, the two sales-return codes) and the fourth by an enclosing tab gate
PRINTABLEThe default printable formatWritten by Settings → Printable Format Settings (tick Default Selection on a row), read back by that same listing
REIMBURSEMENT_PAYMENT_VOUCHER_DETAILS_TAB_ORDERThe edit form’s tab orderWritten by Settings → Default Selection
MANDATORY_SEGMENT, MANDATORY_DIMENSION, MANDATORY_PROFIT_CENTER, MANDATORY_PROJECTMakes an analysis dimension compulsoryThe keys do not appear in the shared template at all

Default Selection (applet) and Default Selection (personal)

SettingWhat it controlsDefault
Default BranchPre-selects the branch on a new voucher, and with it the companynone
Default LocationPre-selects the location; choosing a branch overwrites it with that branch’s MAIN_LOCATIONnone
DEFAULT_COMPANYDerived, not chosen — set from the selected branch’s comp_guidnone
Details Tab OrderingDrag-order of the edit-form tabs, stored as REIMBURSEMENT_PAYMENT_VOUCHER_DETAILS_TAB_ORDERthe order listed under Screens and menus
DEFAULT_ORIENTATION (personal screen only)Whether this user gets tabs or the vertical accordionnone

Both screens have a RESET button that writes nulls back. The applet screen dispatches saveMasterSettingsInit; the personal screen dispatches savePersonalSettingsInit.

Printable Format Settings and Email Template

Printable Format Settings lists bl_prt_printable_format_hdr (Default Selection tick, Format Code, Format Name, File Name, File Size, Uploaded Date, Uploaded By) and stores the ticked row’s GUID as PRINTABLE. Email Template lists bl_applet_notification_template_hdr (Template Code, Status, Created Date, Created By); templates created here are bound to the print service class PAYMENT_RECEIPT_VOUCHER_PRINT_SERVICE.

Document behaviour settings

FINAL is offered only when all of the following hold (showFinal()):

  • the document is not inside a locked financial filing period;
  • HIDE_GENDOC_FINAL_BUTTON is off, or the user holds the client-side permission SHOW_GENDOC_FINAL_BUTTON;
  • header status is ACTIVE and posting status is empty or DRAFT;
  • there is at least one payment line;
  • the document’s open amount is exactly zero — that is, the payment lines fully clear the expense lines.

The last two are the ones that surprise people: a voucher with expenses and no payment, or with a part payment, simply has no FINAL button and no message explaining why.

Feature visibility / permissions

bl_applet_client_side_perm_dfn holds zero rows for internalReimbursementPaymentVoucherApplet (checked 2026-09-14). The applet checks four client-side permission codes — SHOW_GENDOC_FINAL_BUTTON, SHOW_GENDOC_DISCARD_BUTTON, SHOW_GENDOC_VOID_BUTTON, SHOW_EDIT_SETTLEMENT_FINAL — and none of them can ever be true on a live tenant until those definitions are seeded. In practice that means every HIDE_* button switch above is an all-or-nothing tenant-wide switch with no per-role exception, and the Payment Adjustment tab cannot be turned on at all.

Server-side, the document type is guarded by its own four target permissions (TNT_API_DOC_INTERNAL_REIMBURSEMENT_PAYMENT_VOUCHER_CREATE/READ/UPDATE/DELETE_TGT_GUID), registered in GenericDocumentTypeHandler against the endpoint path internal-reimbursement-payment-vouchers. The listing’s Add button and the edit form’s SAVE button are additionally disabled when the user’s resolved create / update permission targets are empty. Note that the descriptions on all four permission constants read “internal payment voucher” — they are the reimbursement ones despite the wording.

Fields

Main Details

FieldMeaningRequiredNotes
Doc Short Code, Doc TypeDocument identificationRead-only; server-assigned
Doc No (Tenant / Company / Branch)The three document numbersServer-assigned; Doc No (Company) is disabled on edit
BranchThe branch raising the voucherYesSets Company and Location
CompanyOwning companyYesDerived from the branch; no control of its own
LocationStock / operating locationYesFilled from the branch’s MAIN_LOCATION
CurrencyDocument currencyYes
Base CurrencyCompany base currencyAlways disabled
Currency RateRate to baseSet to 1 when document and base currency match; locked by CANNOT_EDIT_CURRENCY_RATE
Transaction DateAccounting dateNoDate picker; read-only text, opens on click
Checked By, Approved ByEmployeesNoOpen the Select Checked By Employee / Select Approved By Employee pickers
Client Document Type, Client Doc 1–5Your own reference numbersNoEach hideable individually
Reference, Description, RemarksFree textNo

Account — picks the entity being paid, through the Select Supplier listing, with billing-address and shipping sub-panels.

Expenses — the line grid. Each line carries an item, quantity, prices, discount, tax configuration and, critically, its own GL code; sub-panels cover serial, bin and batch numbers, costing details, issue link, pricing details, delivery details and department.

Payment — the settlement lines (STL_MTHD): which settlement method and cashbook paid the claim back, and how much.

ARAP — five read-only figures: PNS, Settlement, Doc Open, Contra, Bal.

Contra — select another open document and clear part or all of it against this one.

Payment Adjustment — only present when ENABLE_EDIT_SETTLEMENT_FINAL, the SHOW_EDIT_SETTLEMENT_FINAL permission and posting status FINAL all hold.

Lifecycle and effects

Posting proof

Server document typeINTERNAL_REIMBURSEMENT_PAYMENT_VOUCHER
Amount signum+1InternalReImbursementPaymentVoucherDataConsistencyObject.correctAmountSignum = BigDecimal.ONE, checked on create and update (checkAmountSignum), so a document sent with any other value is rejected
Quantity signum0correctQuantitySignum = BigDecimal.ZERO, written onto every line unconditionally by fillQuantitySignumAndAmountSignumForLine on create and update. This document never moves stock.
Dr/Cr equationPer line: finalSign = amount_signum × amount_txn.signum(); negative → debit, otherwise → credit. Expense lines debit their GL code; settlement lines credit the cashbook GL.
GL precedenceLine guid_glcode → header guid_glcode → item-company GL link for the sub-ledger txn code → company default GL for that txn code. The last two cannot resolve for this document type — see below.
Stock processorNone
What VOID reversesgetReverseJournalContainer writes a mirror journal with amt_debit and amt_credit swapped on every line, the same GL and sub-ledger GUIDs, and posting_status = VOID. It re-checks that debits equal credits and refuses an empty reversal.

The missing sub-ledger map. JournalPostingTypeHandler.handlers contains seven document types: SALES, PURCHASE, INTERNAL_PURCHASE_GRN_STOCK_IN, INTERNAL_RECEIPT_VOUCHER, INTERNAL_PAYMENT_VOUCHER, PURCHASE_CONSIGNMENT and INTERNAL_STOCK_ADJUSTMENT. INTERNAL_REIMBURSEMENT_PAYMENT_VOUCHER is not among them, and the fallback in JournalPostingService only rescues a type whose name contains the substring SALES or PURCHASE. So every sub-ledger code — pns, pnsTax, pnsReturn, pnsDiscount, pnsEntity, pnsStock — resolves to the empty string (getSubLedgerCode returns "" when the handler list is empty). Three consequences:

  1. No creditor line. The debtor/creditor journal line is written only if (StringUtils.isNotBlank(pnsEntity) && StringUtils.isNotBlank(arap)). With pnsEntity empty it is never written, so the voucher raises no accounts-payable balance. That is consistent with what a reimbursement is — you are paying, not accruing — but it also means the creditor line cannot absorb any imbalance the way it does on a Payment Voucher.
  2. No tax line. The tax journal line is written only if (StringUtils.isNotBlank(pnsTax)). SST or withholding tax captured on an expense line does not reach the general ledger from this document.
  3. Expense lines need their own GL code. When a PNS line has no guid_glcode, posting falls back to the item-company link and then the company default, both filtered on the (empty) txn code, so neither matches. If the header carries no GL code either, the line ends with no sub-ledger and Optional.ofNullable(line.getSub_ledger_guid()).ifPresent(...) drops it from the journal without a word.

At FINAL, the generic-document primary processor fans out to whichever subscriber job processors are enabled for the tenant, filtered by the company’s posting_final_json (includeJobProcessorCode / excludeJobProcessorCode) and by each subscriber’s own server-doc-type constraint. Before the journal is saved, lines are merged by sub-ledger + branch + dimension + profit centre + project + description, rounded to two decimals, and checked: unequal debits and credits throw TOTAL_DEBITS_AND_TOTAL_CREDITS_NOT_BALANCES with both totals in the message; a journal with nothing in it throws NO_JOURNAL_CREATED.

Intercompany. A finalised voucher that matches a branch intercompany configuration lands in bl_fi_mst_intercompany_processing_queue. It stays there until either the processor runs or someone selects it on the Intercompany screen and presses Confirm Intercompany Transaction; the resulting pair is then visible as a bl_fi_generic_doc_intercompany_link row on the PROCESSED tab.

Related applets

Troubleshooting

SymptomCauseFix
The form will not save and nothing is marked redlocation is required and is filled only from the branch’s MAIN_LOCATION extension. A branch without one leaves an invalid control that has no visible error.Set a Main Location on the branch in the Organisation Applet, then re-select the branch.
There is no FINAL buttonOne of the five conditions in Document behaviour settings fails — most often no payment line, or an open amount that is not zero.Add or correct the payment lines until the ARAP Doc Open figure reads zero.
FINAL fails with TOTAL_DEBITS_AND_TOTAL_CREDITS_NOT_BALANCESAn expense line was dropped from the journal because it had no GL code of its own and the header had none either — there is no creditor line to absorb the difference on this document type.Put a GL code on every expense item (or on the document header) and finalise again.
FINAL fails with NO_JOURNAL_CREATEDEvery line was dropped — typically a voucher whose expense lines have no GL codes and whose settlement item resolves to nothing.Same fix, plus check the settlement method.
FINAL fails with MISSING_CASHBOOK: STL_MTHD [<code>]The settlement item on the payment line has no sub-ledger and no cashbook behind it.Link the settlement method to a cashbook in the Cashbook Applet.
SST captured on an expense line never appears in the ledgerNo tax journal line is written for this document type (pnsTax is empty).Use a Payment Voucher or a purchase invoice where the tax must be recovered.
A tenant-wide HIDE_GENDOC_VOID_BUTTON cannot be reopened for a supervisorThe matching SHOW_GENDOC_VOID_BUTTON client-side permission has no definition row for this applet, so it can never evaluate true.Leave the hide switch off until the definitions are seeded.
The Expenses or Payment tab cannot be hidden from Application SettingsThe applet’s registry code is absent from tabMappings, so those tab toggles do not render for it.The keys work if written directly; there is no UI path today.
The Payment Adjustment tab never appearsIt needs ENABLE_EDIT_SETTLEMENT_FINAL (no control on the settings screen for this applet) and the SHOW_EDIT_SETTLEMENT_FINAL permission (no definition row) and posting status FINAL.Not reachable on a stock tenant today.
A finalised voucher never reaches the counterpart companyIt is sitting on the Intercompany screen’s UNPROCESSED tab.Select it and press Confirm Intercompany Transaction.

Related documentation

Last updated on