Skip to content

Purchase Invoice (Internal)

Record the bills your suppliers send you. In the standard purchase flow it is this document, not the GRN, that books the stock in and posts the supplier liability, the purchase and the input tax — and it is the only document that writes an item’s last purchase cost.

Overview

The Purchase Invoice (Internal) applet records the bills your suppliers send you. An accounts-payable clerk opens it to key in a supplier invoice — from scratch or by knocking off (pulling in) a finalised Purchase Order or Purchase GRN — and finalises it. FINAL posts the supplier liability, the purchase and the input tax to the General Ledger and books the invoiced quantities into stock. The invoice is then settled from its own Payment tab, by contra against a supplier deposit or credit document, or later through a Payment Voucher.

In the standard BigLedger purchase flow the invoice is the document that moves stock — and it is the only document type in the platform that writes the item’s last purchase cost. The Purchase GRN (Internal) posts nothing at all: both its signums are zero, so it creates no stock movement, no accrual and no journal, which is why the standard flow has no goods-received/invoice-received clearing account to reconcile (the full comparison). If your business needs stock booked at receipt and invoiced later, use the alternative pair Purchase GRN Stock In (Internal) and Purchase Invoice No Stock In (Internal) instead.

Where it fits

DirectionDocument / appletRelationship
UpstreamPurchase Order (Internal)Knock-off source on the KO For tab: copies supplier, lines and prices into the invoice
UpstreamPurchase GRN (Internal)Knock-off source on the KO For tab; the backend has a dedicated GRN-to-invoice converter
Upstream (indirect)Purchase Requisition (Internal), Supplier Delivery OrderPrecede the PO / GRN. The invoice has no knock-off tab for them in the current build — the eight KNOCK_OFF_BY_* / KNOCK_OFF_FOR_* switches on the unlinked Knock Off Settings screen are read only by that screen, to re-display what you saved, and by nothing else here or in the backend
Master dataSupplier AppletSupplier entity, AR/AP type (decides the creditor account), self-billed e-Invoice flag
DownstreamPayment Voucher (Internal)Settles outstanding invoices in bulk
DownstreamPurchase Return (Internal)Returns goods against the invoice; while the return (or any other document raised from the invoice) is active, VOID is refused
DownstreamPurchase Credit Note (Internal) / Purchase Debit Note (Internal)Adjust a finalised invoice without voiding it
DownstreamMy E-invoice PortalReceives self-billed invoices for MyInvois submission
DownstreamLedger And JournalShows the journal FINAL creates
SiblingPurchase Invoice Supplier Access (Internal)The supplier-facing view of the same documents

Modules: Financial Accounting and Purchasing.

Screens and menus

The applet’s left-hand menu has six workspaces:

Menu itemRouteWhat it is
Internal Purchase Invoiceinternal-purchase-invoiceListing plus the create/edit form
Line Itemsline-itemsOne grid of every invoice line across all invoices, for bulk price/qty/tax review
File Importfile-importUpload CSV/Excel of invoices, run helper checking, fix failed rows in the browser
File Exportfile-exportExport invoice listings and bulk-print
IntercompanyintercompanyInbound / Outbound queues, each split into Unprocessed and Processed
Audit Trailaudit-trailChange history of documents

File Import and File Export are removed from the menu when HIDE_FILE_IMPORT_MENU / HIDE_FILE_EXPORT_MENU are on, unless the user holds the SHOW_FILE_IMPORT_MENU / SHOW_FILE_EXPORT_MENU client-side permission. No other entry is filtered: Intercompany is in the menu for every user. The SHOW_INTERCOMPANY_PI_SCREEN client-side permission does not gate it — it is read only by the older create column, which + no longer opens — so granting or withholding it changes nothing you can see here.

The edit form tabs

Sixteen tabs, in a default order you can change under Settings > Default Selection > Details Tab Ordering, each with its own HIDE_..._TAB switch. Reading left to right they are Search Document, Main Details, E-Invoice, Account, Line Items, KO For, Delivery Details, ARAP, Payment, Department Hdr, Posting, TraceDocument, Contra, Doc Link, Attachment and Export — and most of them hold exactly what their name says. Four are worth knowing something about before you open them.

TabWhat the name does not tell you
Search Document and KO ForBoth pull a source document in, and only on a draft. KO For is the one that writes a knock-off link and consumes the source’s open quantity; Search Document (sub-tabs Search Purchase Order, Search Purchase GRN, Search Purchase Invoice) is a lookup. If the source you want is not listed on KO For, the usual reason is not that it is draft — see What has to be true before a source appears
ARAPRead-only, and it is the one place the invoice shows its own settlement history: Product & Services, Settlement, Contra and Outstanding. Its numbers come from the AR/AP sub-ledger the posting job wrote, not from the Payment tab you keyed — so a payment that is on the Payment tab and not here means the cashbook job has not run or has failed
PostingFive statuses — Journal, Inventory, Membership Points, Cashbook, Tax — one per processor that had something to do with this document. A blank status is not an error: most of the 32 processors subscribed to FINAL look at the document, decide it is none of their business and stop. See What FINAL actually sets off
TraceDocumentThe journal and inventory rows FINAL created. An empty Journal Txn grid on a FINAL invoice is how you see that the journal job failed; this tab shows no job and no reason. The repair is in Financial Report › Error Checking › Trace Document: Missing Journal → Resolve builds the journal once you have fixed the cause, because a second FINAL is refused

Each line on Line Items opens its own sub-tabs — Item Details, Pricing Details, Costing Details (the landed cost and the last price you paid this supplier; needs SHOW_COSTING_DETAILS), Issue Link (ties the line to an issue-tracker ticket) and, with SHOW_BUDGET, Budget Sub Line.

Create Purchase Invoice screen showing the initial data entry form
Create: header details before the supplier and lines are added. Branch and Location are the only unconditionally required fields.
Screenshot withdrawn; a recapture from a demo tenant is on the list.
KO For tab showing source document selection using Purchase Order
KO For tab: only finalised, not fully knocked-off Purchase Orders and GRNs are listed.
Line Items tab of a purchase invoice
Line Items: which price, discount and amount columns appear is decided by the HIDE_* switches in Application Settings.
Payment tab showing payment entry for purchase invoice
Payment tab: settlement methods offered here are the ones assigned to the branch in Branch Settings.
Contra tab workflow for offsetting purchase invoice with existing credit
Contra tab: offsets the invoice against supplier deposits or credit documents.
Self-Billed E-Invoice workflow in purchase invoice
E-Invoice tab: a self-billed invoice is picked up by the My E-invoice Portal after FINAL when the company's e-Invoice status is ENABLED.
File Import workspace for template download and bulk upload
File Import: template download, upload and Helper Checking of failed rows.
Intercompany transactions screen in purchase invoice applet
Intercompany: inbound and outbound queues between companies in the same tenant. The menu entry is always there; no permission hides it.

Top action buttons

ButtonShown / enabled when (client-side)What it does
+ (on the listing)AlwaysThere is no Create button. + saves an empty placeholder draft at once (document status TEMP) and opens the edit form on it. The draft turns itself into an ordinary one (ACTIVE, posting status DRAFT) about half a second after Branch, Location, a supplier and at least one line are all present, and that is when the tenant running number is assigned. Nothing is posted. A + you abandon leaves a placeholder behind
SAVEDraft, once it is no longer a placeholder; HIDE_GENDOC_SAVE_BUTTON offSaves edits. Nothing is posted. SAVE (and FINAL) stay greyed out while the draft is still TEMP — fill in the supplier and a line first
FINALDraft with a valid header, a supplier, at least one line, no duplicate serial numbers, document not locked; HIDE_GENDOC_FINAL_BUTTON off or the user holds SHOW_GENDOC_FINAL_BUTTON / SHOW_FINAL_BUTTONSends posting_status: FINAL with the Default Selection date logic; the backend validates and queues journal, inventory, tax and e-Invoice processing; locks the document.
DISCARDDraft (ACTIVE + DRAFT); HIDE_GENDOC_DISCARD_BUTTON off or SHOW_GENDOC_DISCARD_BUTTONMarks the draft DISCARDED.
VOIDFINAL, company e-Invoice status not ENABLED, document not locked; HIDE_GENDOC_VOID_BUTTON off or SHOW_GENDOC_VOID_BUTTONSends the void; the backend queues the reversal (see Lifecycle). Refused while any document raised from this invoice is active — see VOID.
SELF-BILLEDDraftSets einvoice_self_billed on the header. Suppliers with E-Invoice Self-Bill in their profile get it automatically.
BASEAnyToggles display between transaction currency and base currency.
SINGLE / MULTI PRINTAny; needs a printable formatPrints one document, or several in one job, with the default printable (PRINTABLE).
CLONEHIDE_CLONE_BUTTON offCopies the document into a new draft.

Configuration

Before you can use it

PrerequisiteWhereWhy the invoice needs it
Company, branch, locationOrganisation AppletBranch and Location are the only two unconditionally required header fields. Give the branch a MAIN_LOCATION extension so Default Selection can auto-fill the location.
Supplier entity with an AR/AP typeSupplier AppletThe entity’s type decides the payable account: AP_TRADE posts to the company default CREDITOR, AP_OTHER to CREDITOR_NON_TRADE, AP_EMPLOYEE to EMPLOYEE_OTHER_PAYABLE. Set E-Invoice Self-Bill on the supplier if every invoice should be self-billed.
Company default GL codesChart of Account Applet (company GL-code links)The journal posted after FINAL needs the creditor code for the supplier’s type plus PURCHASE and INPUT_TAX, and ROUNDING once the invoice carries a rounding line. FOREX_GAIN / FOREX_LOSS are used by the separate exchange-difference journal a contra writes. A Purchase Discount default is never posted to by this document — a line discount is already inside the line’s net amount and a group discount posts to Purchase — and Purchase Return belongs to the return. A missing purchase or rounding mapping does not fail anything: the line is left out of the journal and the creditor line absorbs the difference (see Posting proof block). A missing creditor mapping does not stop FINAL: FINAL changes the status and enqueues the posting job, and the job then fails with MISSING_DEFAULT_GL_CODE: CREDITOR — the invoice stays FINAL with no journal until the mapping exists and the journal is built from Financial Report › Error Checking › Trace Document (Missing Journal → Resolve).
Item GL overrides (optional)Item maintenance — item-company GL-code link with transaction code PURCHASEA line’s purchase account is resolved in this order: GL code on the line → GL code on the document header → the item’s company link for PURCHASE → company default PURCHASE.
Tax codesTax Configuration AppletLine tax posts to the company default INPUT_TAX. The WHT code picker on a line is hidden by default (HIDE_WHT_CONFIG_SELECTION).
Cashbook and settlement methodsCashbook Applet, then Settings > Branch Settings > Default Settlement MethodThe Payment tab only offers settlement methods assigned to the branch; a settlement item with no cashbook fails posting with MISSING_CASHBOOK: STL_MTHD [code].
Document numberingOrganisation Applet (running numbers)Doc No (Tenant) is assigned when the TEMP placeholder turns into an ACTIVE draft — by itself, once Branch, Location, a supplier and a line are present; Doc No (Company / Branch) are assigned during FINAL.
Printable formatSettings > Printable Format SettingsPrint, bulk print and auto-preview need at least one format marked as default; the Export tab reports No Default Printable Selected otherwise.
PermissionsSettings > Permission Set / User Permission / Team Permission / Role PermissionServer-side: TNT_API_DOC_INTERNAL_PURCHASE_INVOICE_READ_TGT_GUID, ..._CREATE_TGT_GUID, ..._UPDATE_TGT_GUID, ..._DELETE_TGT_GUID (targeted by branch), TNT_API_DOC_INTERNAL_PURCHASE_INVOICE_DELIVERY_BRANCH_READ, or TNT_TENANT_ADMIN / TNT_TENANT_OWNER.
e-Invoice (Malaysia)My E-Invoice AdminThe company’s e-Invoice status must be ENABLED for submission; once it is, this screen hides VOID on finalised invoices — the screen is where that rule lives.
Fiscal periodsFinancial Report (fiscal year / period locks)FINAL is rejected when the transaction date falls in a locked period.

Applet settings

Settings › Application Settings. The screen is the shared field-configuration screen filtered to this applet, and 162 of its 264 keys are a HIDE_ or an EXPAND_ that hides a field, a tab, a button or a price column, or opens a panel — flip one and you can see what it did within two seconds. The seven below are the ones that change what the applet will let you do, and not one of them is obvious from the screen. How settings are stored and who they apply to.

Application settings screen for purchase invoice applet configuration
Application Settings: the shared field-configuration screen, filtered to this applet's switches.
SettingWhat changesDefault when never savedAdvisory or hard
ENABLE_EDITING_UNIT_PRICE_STD — the screen prints the identifier as the labelThe Unit Price box on a line becomes typeable. With it off, the line takes its price from the pricing scheme and nobody can key what the supplier actually charged; the AP clerk reports it as “the price field is read-only and I can’t type in it”. Nothing switches it on for you — check yours before you assume the price box will accept typingRead-only. The settings screen’s own control shows on before the first save, so screen and behaviour disagree until somebody presses SAVEAdvisory — the input is read-only in the browser. The API accepts any price
DATE_TXN_LOGIC — Transaction Date Logic, on Default Selection, not Application SettingsWhich date the server stamps as the document’s transaction date at finalise. Pick Finalized / Created / Updated and the date you keyed on the draft is overwritten when you press FINAL — and the journal, the fiscal period it lands in and the tax period all follow the new date, not the one on the screen you were looking atThe date you keyed (USE_DATE_TXN)Hard, and server-side — the server overwrites the transaction date at finalise; this applet never asks it to keep the keyed date
ENABLE_MULTIPLE_KOThe KO For grid becomes multi-select. Until it is on, one purchase invoice can pull in exactly one GRN or one purchase order — so a month of deliveries settled by a single supplier invoice has to be keyed as one invoice per delivery, and the GR/IR (Goods Received / Invoice Received) clearing never nets to zero in one documentSingle selection, on both the GRN and the purchase-order knock-offAdvisory — it is the grid’s selection mode
ENABLE_DUPLICATE_REFERENCE_CHECKAs you type in Reference (the supplier’s own invoice number), the applet waits half a second and searches every purchase invoice in the tenant for the same reference, then turns the box red and names the other document. It does not filter by supplier, company or posting status — an invoice in VOID or DISCARDED matches too, and so does the invoice you are editing if you retype its own reference — so two suppliers who both number an invoice 1234 flag each other, and nothing stops you saving or finalising the duplicate. If you switched this on to stop paying a bill twice, it does not do thatNo check at allAdvisory — a red field and a message. Neither Save nor FINAL looks at it
DISABLE_EDITING_AMOUNT_TXNLocks the line Amount so it is always quantity × price and cannot be typed over. The reason you have probably never seen this toggle: it is on the settings screen only for a user who holds the client-side permission SHOW_DISABLE_EDITING_AMOUNT_TXN_SETTING. An administrator without that grant looks at the same screen and the control is not thereAmount editableAdvisory — the control is disabled in the browser
CANNOT_EDIT_CURRENCY_RATEThe exchange-rate boxes are read-only on drafts as well as on finalised documents, so the rate BigLedger fetched is the rate that posts — and that decides the ringgit value of the creditor, the purchase and the input tax. There is no per-user exception to grant: a permission called EDIT_CURRENCY_RATE exists and does nothing (see Who can change what)Editable on drafts — the rate is disabled only when the document is final or the key is setAdvisory — the two rate controls are disabled in the browser
ALLOW_DIFFERENT_PAYEE_THAN_SELECTED_ENTITYThe Bill To section on the Account tab stops mirroring the supplier on the document and becomes a supplier picker of its own, so the bill-to name, e-mail and phone can be a different party from the one you bought from — a factored invoice, or a principal billing on a distributor’s behalf. It changes the Bill To section and nothing else, so the payable still posts against the supplier chosen on Entity DetailsBill To mirrors the selected supplierAdvisory — a second picker appears

Four more are worth a sentence rather than a row. External Invoice No (one of the hidden-by-default external references) carries a duplicate warning of its own that needs no setting: leave the box and the applet looks for another purchase invoice with the same number and prints invoice already exist in and that document’s number under it — a warning only, like the reference check. SHOW_ITEM_STOCK_BALANCE, on a purchase invoice, does more than show a column: the line-item search then lists only items with stock above zero at the invoice’s location, so the item you are buying because you have run out of it disappears from the search — switch it off on this applet if a clerk reports “the item isn’t in the list”. ALLOW_EDITING_DOC_REF_DATE makes Doc Reference Date typeable — until it is on the date is display-only, which is what “the date is greyed out and the invoice isn’t even finalised” usually turns out to mean. And the eleven MANDATORY_* keys add a required-field validator to the browser form and nothing else: they change who gets stopped at the screen, never what the API will accept, so they are a data-entry discipline rather than a control.

On the screen and doing nothing

  • The SST and WHT enable flags — declared in the model with no control on any screen, and do nothing here. They are the keys a reader hunts for when the question is “how do I switch on withholding tax for supplier invoices?”, and switching them on changes nothing. They are not dead everywhere — a few sales-side applets that carry their own local settings screen do read them — which is how they came to be in a purchase-invoice model at all. What actually controls the withholding-tax picker on a line here is HIDE_WHT_CONFIG_SELECTION, which starts hidden.
  • The whole Knock Off Settings screen. The route renders eight knock-off switches (by and for Purchase GRN, Purchase Order, Purchase Requisition and Supplier Delivery Order); the two Copy From Configuration toggles that belong beside them are commented out of the template. It has no menu entry, and none of the eight switches does anything. KO For offers Purchase GRN and Purchase Order whatever they say. If you were told to “turn on knock-off by requisition”, there is no such switch.

And the reverse case, which is the same trap from the other side. The listing reads HIDE_LISTING_BRANCH, HIDE_EINVOICE_NUMBER and HIDE_EINVOICE_DATE from the stored settings, and none of them is declared in the model or offered on any screen of this applet — they take effect only if something else wrote them. Two more listing keys, HIDE_TRANSACTION_DATE and HIDE_AMOUNT_TXN_MAIN_LISTING, are not in the model either, yet do have a toggle on Application Settings (the screen is shared, and offers them to this applet). The same listing also opts in four analysis columns — dimension, segment, profit centre, project — with SHOW_GL_DIMENSION, SHOW_SEGMENT, SHOW_PROFIT_CENTER and SHOW_PROJECT. The settings model is not the list of this applet’s settings, in either direction.

The other settings screens

Settings is eight screens and Application Settings is only the first of them; what each one is for is set out once in the concepts layer, linked above. Four of them matter here:

  • Default Selection holds the branch and location a new invoice opens with, the unit-price decimal precision (2–4), the transaction-date logic in the table above, and the order of the edit-form tabs. RESET restores the tab order and clears the other values on the screen — including the transaction-date logic, which goes back to the date you keyed. If your company relies on Finalized dating, set it again after a RESET.
  • Personalization › Default Selection is the same idea for you alone — your branch, your location, your horizontal-or-vertical layout. It also offers an item-type filter for the line-item search (DEFAULT_ITEM_SEARCH_ITEM_TYPE) that saves and that no component reads.
  • Branch Settings is per branch, stored on the branch record rather than in the applet’s settings, and one of its six tabs is load-bearing: Default Settlement Method decides which settlement methods the Payment tab offers, and a settlement item whose method has no cashbook fails posting with MISSING_CASHBOOK: STL_MTHD [code]. The others are branch rounding, an item-category filter for the line search, the branch’s menu list, its pricing schemes and its printable format.
  • Printable Format Settings stores the default format’s guid in PRINTABLE. Without one the print buttons are disabled and the Export tab reports No Default Printable Selected.

Settings in other applets that control this applet

Setting / behaviourWhere it is setEffect here
Fiscal year and period locksFinancial ReportFINAL is rejected when the transaction date falls in a locked period — and note the interaction with DATE_TXN_LOGIC above, which can move that date after you have chosen it
Which processors run at FINALCompany record — posting_final_json include/exclude listFilters the subscribers of BLG_ERP_GENERIC_DOCUMENT_PRIMARY_PROCESSOR, so a document can finalise and post nothing
Stock and serial validation at FINALNot an applet setting at allThe backend runs validateGenericDocumentOnFinal with validate_stock_balance defaulting to true and validate_serial_signum_zero to false, and this applet sends neither flag — so stock is validated whatever your settings screen says
Self-billed e-InvoiceSupplier profile E-Invoice Self-Bill in Supplier, or the SELF-BILLED button on the draftStored on the header as einvoice_self_billed
The company’s e-Invoice statusMy E-Invoice AdminOnce ENABLED, this screen hides VOID on finalised invoices regardless of any setting or permission here
Approval before FINALWorkflow DesignNo control in this applet gates FINAL on a workflow status
Webhooks on document eventsSettings › Webhook in this appletFired on document events; not a field setting

Who can change what

Client-side permissions this applet defines: 66 active codes. Almost all of them do one thing — put back, for one user, a field or column that a HIDE_… setting took away from everybody. The ones worth knowing are the four that do something else:

  • SHOW_DISABLE_EDITING_AMOUNT_TXN_SETTING does not affect a document at all. It decides whether the Lock Amount toggle appears on the settings screen — a permission that gates a setting. If you have been told the line amount can be locked and cannot find the switch, this is why.
  • ALLOW_LINE_ITEM_EDIT is the exception to the DISALLOW_LINE_ITEM_EDIT setting: switch the setting on and saved lines go read-only for everyone, then grant this code to the few people who may still correct a line. It is the cleanest setting-and-permission pair on this applet: the setting sets the house rule, the permission names the exceptions. The setting starts off, so saved lines stay editable until somebody turns it on.
  • SHOW_COSTING_DETAILS and SHOW_LAST_PURCHASE_PRICE put back the costing sub-tab and the last price you paid this supplier. Both hide a control, not the data — the figures are already in the browser. Do not use either as a control over who can see margin.
  • SHOW_TRANSACTION_DATE enables the Transaction Date field after finalising — that is the back-dating grant, and it is a permission rather than a setting precisely because you do not want it for everyone.

Dead permission codes: 23 of the 66. Granting any of these does nothing at all: EDIT_CURRENCY_RATE, DISABLE_EMPLOYEE_LOGIN_AUTO_DETECTION, SHOW_CREDIT_LIMIT, SHOW_CREDIT_TERMS, SHOW_CURRENCY, SHOW_BASE_CURRENCY, SHOW_REFERENCE, SHOW_REASON, SHOW_EXTERNAL_REMARKS, SHOW_SOURCE_DOC_NO, SHOW_LOCATION, SHOW_DELIVERY_BRANCH, SHOW_CREATED_BY_DETAILS, SHOW_VALIDITY_DATE, SHOW_SAVE_BUTTON, SHOW_PRINT_BUTTON, SHOW_CLOSE_BUTTON, SHOW_SEND_EMAIL_BUTTON, HIDE_DRAFT_BUTTON, HIDE_CUSTOM_DOC_NO, HIDE_FOREX_DATA_SOURCE, HIDE_EMAIL_PAYMENT_URL_BUTTON, IPI_HIDE_TRACKING_ID_AND_PERMIT_NO.

Three of those deserve naming twice, because they are the ones an administrator reaches for and then trusts:

  • EDIT_CURRENCY_RATE looks like the exception to CANNOT_EDIT_CURRENCY_RATE and is not. Lock the rate and it is locked for the treasury team too.
  • SHOW_SAVE_BUTTON, SHOW_PRINT_BUTTON, SHOW_CLOSE_BUTTON, SHOW_SEND_EMAIL_BUTTON are not how the action buttons are governed. The live pairs are HIDE_GENDOC_…_BUTTON settings against SHOW_GENDOC_… permissions, and the registry defines the FINAL, DISCARD and VOID members of that family for this applet — but not SHOW_GENDOC_SAVE_BUTTON. The applet loads that code with the others, but the Save button never consults it: it looks at the hide setting alone. So HIDE_GENDOC_SAVE_BUTTON takes the Save button away from everybody and there is no code in this applet’s permission listing that gives it back to anybody. Hide Save deliberately, or not at all.
  • SHOW_CREDIT_LIMIT and SHOW_CREDIT_TERMS do not reveal the supplier’s limit and terms; HIDE_CREDIT_LIMIT / HIDE_CREDIT_TERMS hide those fields from everybody with no way back for anyone.

Server-side permissions are the ones that can fail with a 403 and are listed under Before you can use it: read, create, update and delete are targeted by branch, so a user can be confined to the invoices of particular branches — the only control on this page that a browser cannot talk its way around.

Fields

Main Details

FieldMeaningRequiredNotes
BranchBuying branchYes (Validators.required)Drives numbering, permissions and Branch Settings
LocationStock location that receives the goodsYes (Validators.required)Defaults from the branch MAIN_LOCATION
Doc No (Tenant / Company / Branch)System running numbersGeneratedThe tenant number appears at Create; the company and branch numbers only at FINAL. A draft with no company document number is not broken — it is a draft
Transaction DateInvoice dateYes (defaults to today)Editable after FINAL only with the SHOW_TRANSACTION_DATE permission — that is the back-dating grant. It may also be overwritten at FINAL by DATE_TXN_LOGIC, and a knock-off resets it to today (see below)
ReferenceSupplier’s invoice numberOnly with MANDATORY_REFERENCEThe number your supplier printed, and the one your AP reports and the e-Invoice match key on. ENABLE_DUPLICATE_REFERENCE_CHECK warns about it and stops nothing
PurchaserBuying employeeAsterisked, no validator — so it is not requiredStored in pic_entity_01, and it is also the switch that decides whether Credit Terms, Credit Limit and Permit No are stored at all (see the callout below)
Base Currency / Currency / RateTransaction currency and exchange rateYesPicking a supplier whose currency differs from the document’s replaces the document currency and resets the rate to zero, which is where The currency rate cannot be ZERO. on SAVE comes from; FINAL is refused on the server with Exchange rate is required for a foreign currency document.
Credit Terms, Credit LimitPayment terms for this invoiceNoNot copied from the supplier and not read-only — two dropdowns fed by the supplier’s own purchase credit-terms and credit-limit lists, editable on a draft and auto-selected when the supplier has exactly one of each (disabled only once the document is FINAL, VOID, DISCARDED or locked)
Remarks, External RemarksInternal and printed notesNoRemarks becomes the description of the journal’s creditor line — and of its tax lines and the journal’s own remarks — so it is the text your accountant reads in the ledger months later. External Remarks prints on the document
Delivery Branch / LocationWhere goods are deliveredNoListing them needs TNT_API_DOC_INTERNAL_PURCHASE_INVOICE_DELIVERY_BRANCH_READ — a separate server-side permission from the invoice’s own read

The rest of the header is references and dimensions, and each is hideable on its own: Custom Document Number (needs SHOW_CUSTOM_DOC_NO), Doc Short Code, Client Doc Short Code and Client Doc 1–5 No, Source Doc No (Tenant) and Source Doc Short Code (written by a knock-off, never by you), Doc Reference Date (typeable only with ALLOW_EDITING_DOC_REF_DATE — the usual meaning of “the date is greyed out and the invoice isn’t even finalised”), the five External Quotation / Order / Delivery Order / Invoice / Others references and their dates, which are hidden by default and stay editable after FINAL when they are shown, and Tracking ID and Permit No.

There is no Due Date on a purchase invoice, and leaving Purchaser blank quietly drops the credit terms.

Two separate things, one cause — a half-removed field.

Due Date. There is no Due Date on this form, and nothing on this applet stores one — the applet works a due date out from the credit terms and then discards it. So the due date stays empty on every purchase invoice you raise here; the sales invoice fills it normally. The consequence you can see: Overdue Documents lists only documents whose due date has passed, and an empty date never has, so a purchase invoice never appears as overdue there. Age your payables on the transaction date and the supplier’s terms instead, or from the Payment Voucher’s outstanding list.

Credit Terms, Credit Limit, Permit No. The block that writes them onto the document is gated on the Purchaser field having a value. Purchaser is asterisked but not actually required, so a clerk who skips it saves an invoice whose stored credit terms are empty, and the printed document — which prints the stored credit terms — prints nothing there. Nothing warns, and blank stored credit terms on an old invoice usually mean Purchaser was blank when it was keyed rather than that the supplier had no terms. Tracking ID is safe — it is saved whatever Purchaser says.

Account

Entity Details (supplier code, name, type, identity type and number, currency, status, description, email, phone), Bill To and Ship To addresses and contacts, and Intercompany (the sister company’s Intercompany Branch and this branch’s purchase-invoice intercompany rules, for a purchase invoice that should raise a sales invoice in that company). In select mode a toggle creates a supplier without leaving the invoice.

Line Items

Item Details holds the item code and name, the quantity in base and in the chosen unit of measure with the ratio between them, serial numbers, bin, batch number, batch issue and expiry dates, item remarks and an item reference. Pricing Details holds the standard unit price (from the pricing scheme, inclusive or exclusive of tax, per unit of measure), unit discount and the multi-level discount block, net and transaction unit prices, the tax code and the withholding-tax code, and the five amount columns — standard, discount, net, tax and transaction. Each line also carries its own optional GL code, branch, the four department dimensions and a delivery instruction. Header adjustment, group discount and rounding lines are written by the applet, not keyed.

Three of those carry consequences the screen does not show:

FieldWhat it decides
Amount (transaction)This, not the net amount, is what the moving average absorbs — see Where the cost on stock comes from. A line with a quantity and a zero amount posts quantity without value and drags the average down
Unit price (net)The first choice for the item’s last purchase cost, and the reason the last purchase cost and the moving average can disagree after the same invoice
Serial numbersThe only thing FINAL genuinely refuses on: a serial already in the company, a serial repeated on the document, or a count that does not match the quantity. The error lists the offending snIds

Payment

Settlement method (from Branch Settings), amount, payment date, reference fields (quotation, order, delivery order, invoice, invoice date, others — hidden by default) and, for card methods, card number, name, issuer, expiry, approval code, batch, card type, CVV as configured.

The payment date you key does not survive the save. ENABLE_EDIT_PAYMENT_DATE / ENABLE_EDIT_SETTLEMENT_DATE make the box typeable, but every save sets each payment line’s date back to the invoice’s transaction date, and the cashbook line always carries the invoice’s date. A supplier paid on the 5th against an invoice dated the 28th of last month shows in the cashbook — and in bank reconciliation — on the 28th. To spot it: the payment date reverts when you reopen the invoice. When the money moves on a different day from the invoice, settle it with a Payment Voucher dated that day instead.

Lifecycle and effects

A purchase invoice has a document status (TEMP while the create form is open, then ACTIVE) and a posting status:

Posting statusMeaningAllowed next step
DRAFTSaved, editable, nothing postedFINAL, DISCARD, edit
FINALPosted and lockedVOID (subject to the conditions below), Payment, Contra, Purchase Return, Credit/Debit Note
VOIDReversednone
DISCARDEDAbandoned draftnone

FINAL in the applet is enabled when the header form is valid, a supplier is selected, there is at least one line, no serial number is duplicated within the document, the document is ACTIVE and not locked, and the button is not hidden for this user. These are client-side gates. FINAL in the backend rejects a second FINAL with Generic Document has already been posted to FINAL (HTTP 403), a foreign-currency invoice with no exchange rate (Generic Document exchange rate is required before posting to FINAL), a transaction date in a locked period, serial numbers that already exist in the company or that are duplicated or do not match the line quantity, bin and batch quantities that do not match, and — because this applet never switches it off — a line that would take stock below what the location holds. A missing default GL code is not checked here. The journal and cashbook processors run as queued jobs after the status change, so MISSING_DEFAULT_GL_CODE: <code>, MISSING_CASHBOOK and MISSING_GL_CODE fail the job, not FINAL (see Troubleshooting). A foreign-currency invoice is finalised as a base-currency shadow document that carries the posting.

Contra rows are a second request. A row you add on the Contra tab of a draft is not written when you add it: the applet sends any unsent contra rows after the next successful SAVE, and again after FINAL. If that second request fails you see Documents contra unsuccessfully while the invoice itself has saved — or finalised — without the offset. Check the Contra tab (or the ARAP tab’s Contra column) after a FINAL that carried a contra.

Posting proof block

ItemValue (from the backend)
Server document typeINTERNAL_PURCHASE_INVOICE
DirectionA payable, and stock in — the standard Purchase GRN moves neither
The journalEvery goods line is Dr Purchase at its net amount (line discounts already taken off; a group-discount line posts to Purchase too, reducing it), a rounding line posts to Rounding, each tax line Dr Input Tax, anything on the Payment tab Cr the settlement method’s account, and the supplier line Cr Creditor for whatever balances the rest. No line posts to a purchase-discount account. A contra’s exchange difference is a separate journal, written when the contra is. It uses the ordinary purchase journal mapping — see Which chart of accounts this document type gets.
Which GL code an item line usesGL code on the line → GL code on the document header → the item’s company GL link for PURCHASE (ROUNDING for a rounding line) → company default PURCHASE (ROUNDING). Tax lines use the company default INPUT_TAX. The supplier line uses the company default for the supplier’s AR/AP type and fails with MISSING_DEFAULT_GL_CODE when it is not linked. A goods or rounding line whose account cannot be found by any of those four steps is left out of the journal without an error, and the supplier line, which is the balance, shrinks to match — see the caution below.
StockThe stock job, a follow-on of the main posting job, writes a stock-in line for each goods line and creates the serial numbers. It does not take every line — see Why “stock in” is not enough. This applies to keyed invoices and to knock-offs alike.
What VOID reversesVOID starts the void jobs your tenant has switched on: the journal (a new journal with every line’s debit and credit swapped), the stock (negated stock lines), the knock-offs (removed, reopening the source document), contras, tax, cashbook and membership points. The document is also removed from the e-Invoice queue and from historical aging. A shadow (base-currency) document is voided with its original.

A line with no purchase account is dropped, and the journal still balances.

The journal job does not fail when a goods line’s account cannot be found — no GL code on the line or the header, no item link, no company Purchase default. It leaves that line out, and because the creditor line is computed as whatever balances the rest, the payable shrinks by the same amount. An RM 1,000 + RM 60 tax invoice on an unmapped item posts Dr Input Tax RM 60 / Cr Creditor RM 60 and shows the journal as posted: the purchase and RM 1,000 of the payable are simply missing.

To spot it: compare the journal’s creditor credit (Trace Document → Journal Txn) with the invoice total. They should be equal less anything on the Payment tab. Set the company’s Purchase default (and the item’s link if it should go elsewhere) before the first invoice; for one already posted, correct the mapping, then press Repost beside Posting Journal in Error Checking › Trace Document: it deletes the short journal and builds it again from the invoice. A failed Repost says nothing and leaves the invoice with no journal, so check Journal Txn afterwards; if it is empty, Resolve on Missing Journal posts it or shows why it cannot. A correcting journal is the other way.

The Posting tab shows five statuses (Journal, Inventory, Membership Points, Cashbook, Tax); TraceDocument shows the journal and inventory rows.

VOID and what blocks it

VOID on this screen is offered only on a FINAL document that is not locked, when HIDE_GENDOC_VOID_BUTTON is off or the user has SHOW_GENDOC_VOID_BUTTON, and when the company’s e-Invoice status is not ENABLED. Pressed, it first checks the invoice for an active Purchase Return and stops with The invoice has already been linked with a purchase return. Past that, the server refuses the void while any document raised from this invoice is still active — a debit or credit note, a conversion, a return — and the screen reports every such refusal as The purchase invoice has already been returned., whatever the linked document actually is. Look at the Doc Link tab for the document to void first. The server refuses a self-billed invoice’s void outright (Unable to void because the company has the E-Invoice enabled); for an ordinary purchase invoice under e-Invoice, hiding VOID is the screen’s rule. To correct a finalised invoice under e-Invoice, raise a Purchase Debit Note when it was billed too high (it lowers what you owe) or a Purchase Credit Note when it was billed too low (it raises it), or, for a self-billed invoice, cancel it through the e-Invoice portal within the LHDN window. A self-billed Purchase Debit Note reaches MyInvois as a Self-billed Credit Note, and a Purchase Credit Note as a Self-billed Debit Note: the e-Invoice names follow the invoice, the BigLedger names follow your ledger.

Knock-off writes a document link (txn_type knock-off) between the source and the invoice, and a source that is fully drawn down no longer appears in KO For. A Purchase Return raised against the invoice writes a RETURN link instead. The KO For button and the backend converter PurchaseGRNToPurchaseInvoiceConverter are two different things and only one of them is a button: see Knocking off a purchase order or a goods receipt and A goods receipt can create this invoice by itself.

What FINAL actually sets off

FINAL is not a save. It is a separate step that changes the posting status and then hands the document to the main posting job, which starts every follow-on job your tenant has switched on. That is the reason a document can be FINAL with no journal: the status change succeeded and a job failed afterwards.

Every finalised document of every type goes to every follow-on job, and each one decides for itself whether it has anything to do. That is the single most useful thing to know about the Posting tab: a blank status usually means a job ran, looked at a purchase invoice, and correctly did nothing.

The ones that act on a purchase invoice:

JobWhat it does here
Journal postingWrites the journal — Dr Purchase, Dr Input Tax, Cr Creditor. Fails with MISSING_DEFAULT_GL_CODE and leaves the invoice FINAL and unposted when the creditor is unmapped; a line with no purchase account is dropped instead (see the caution under Posting proof block)
StockWrites the stock-in lines, the serial numbers, the moving average and the last purchase cost
CashbookPosts anything keyed on the Payment tab into the cashbook
Knock-offConsumes the source document’s open quantity when this invoice knocked one off
Document conversionCreates the next document in a configured flow — the one that can turn a goods receipt into this invoice
E-Invoice matchingQueues the invoice to be matched against an incoming supplier e-Invoice — but only if the supplier record carries a tax identification number, silently not otherwise (why)
E-Invoice postingQueues a self-billed invoice for MyInvois
Back-dated agingRebuilds aging when the transaction date is in the past
Budget registerConsumes budget, when the lines carry budget codes
IntercompanyRaises the mirror document in the sister company when the Account tab names one

The rest — coupons, membership points, commerce orders, sales commission, min/max alerts, Peppol, finance charges — subscribe just as hard and find nothing to do.

The company can narrow the list with an include/exclude list of jobs, set by BigLedger, which is how a document can finalise and post nothing at all by configuration rather than by failure.

Unusually for this family, this document type has a file-import job of its own; the purchase credit note and the sales debit note do not, and their File Import menus use the general import instead.

Which chart of accounts this document type gets

A purchase invoice posts through the ordinary purchase journal mapping — creditor, purchase, purchase discount, purchase return, input tax, forex gain and loss — the same one the purchase credit note, debit note and return use. Not every entry in it is used here: nothing on a purchase invoice posts to the discount entry (a line discount is already inside the line’s net amount), and the return entry is the return’s. So the purchase documents can never drift apart: there is no way to give the credit note a different creditor account by configuration at this level. (GRN Stock In and consignment purchases have their own mapping, with not invoiced accounts.)

The one thing that is not frozen is who you owe. The creditor account comes from the supplier’s AR/AP type, and that type is read live at posting time — not from the snapshot on the document. Change a supplier from AP_TRADE to AP_OTHER and the next journal built for an older invoice — a re-run after a failure, or a Repost — uses the new account. That is the deliberate exception to the snapshot rule below. A void is not a new build: its reversal copies the journal as it was posted, so it reverses the old account.

Where the cost on stock comes from

The question this page exists to answer. There are two cost numbers and one invoice writes both of them differently, which is why they disagree.

The moving average. A purchase invoice is one of nine document types allowed to change the value of stock rather than just relieve it proportionally. For those, the running amount grows by the line’s amount and the unit price is then that amount divided by the new balance quantity. Note which amount: the line’s transaction amount, not its net amount and not its net unit price. When the new balance is zero, or the amount comes out at zero, the previous unit price is carried forward unchanged — a deliberate stickiness, so that selling out does not erase what the item cost you.

The last purchase cost. Written only by this document type, and by no other. The figure is the line’s net unit price if it has one, otherwise net amount ÷ quantity, otherwise transaction amount ÷ quantity, and it is written as both the company-wide and the per-location last purchase cost.

A zero-value line moves the average and leaves the last purchase cost alone.

The last purchase cost is not written at all when the unit price is zero, when the quantity is zero, or when the line is a VOID reversal. The moving average has no such guard: a line with a quantity and no amount adds quantity to the denominator and nothing to the numerator, so the average falls towards zero while Last Purchase Price on the Costing Details sub-tab still shows what you paid last time.

That is the mechanism behind “average cost is drifting down and I can’t see why”. The two numbers disagreeing is the symptom to look for, and the invoice line with a quantity and a blank amount is the cause. A finalised line’s quantity and amount cannot be edited, so the fix is to void and re-key where that is allowed. Where void is not open to you, repair the two halves separately: a Reset MA puts the company average right (location averages stay where they are), and a Purchase Credit Note adds the amount you still owe the supplier. Both post a journal of their own, so agree with whoever keeps the books which account the reset posts against, and the value is counted once.

A Purchase Debit Note is not the repair. Its lines move no stock, so it never reaches the moving average, and it lowers what you owe, when the missing value is money you owe more of.

If you use the Stock In pair instead, you get no last purchase cost at all. A GRN Stock In maintains the moving average — but the last purchase cost is written only by this document, and in that flow the invoice is a Purchase Invoice No Stock In. Two costing columns in the same report, one of them permanently stale, is the price of that configuration and it is worth knowing before you choose it.

Why “stock in” is not enough

The direction of this document is fixed, not suggested. The money direction is checked on create and update — anything else is rejected as an invalid amount sign, so an integration has to send it — and every line is forced to stock in, on create and on update. There is no setting and no integration payload that can leave a purchase-invoice line moving stock any other way: if you find one, it predates this rule rather than being a second behaviour you can choose.

But the stock job asks for two more things before it writes anything:

  1. the line must be a goods line — so header adjustment, group discount, rounding and settlement lines never reach stock, whatever their quantity; and
  2. the item behind the line must be an inventory item. A SERVICE or GL_CODE item is not, and a line on one creates no inventory transaction at all — not a zero one.

So “this document type moves stock” is a statement about the document type, not a promise about your line. An invoice made entirely of service lines posts the payable and the input tax and touches no stock balance, correctly and silently. The Posting tab’s Inventory status is how you tell.

What the invoice keeps of the supplier, and what it looks up later

When you pick a supplier, the applet copies thirteen fields onto the document rather than pointing at the supplier record: the supplier code, the name with the chosen contact’s name appended, the status, e-mail, phone, the entity GL code, the identity number and identity type, the entity type, the description, the currency, the e-Invoice tax identification number and the SST number. It also copies the name, e-mail and phone into the Bill To and Ship To blocks, and takes the supplier’s self-billed e-Invoice flag onto the header.

This is the platform-wide entity snapshot, and it is deliberate: a document is evidence of what was agreed, so a supplier who moves premises or changes bank next month does not retroactively change last month’s invoice. Correcting the copy on one invoice corrects that invoice and nothing else — pushing the change back to the supplier record is a separate act in the Supplier applet.

Three things follow that the screen will not tell you:

  • Credit Terms and Credit Limit are not in that copy. The two lines that would have put them there are commented out; they arrive through the separate, Purchaser-gated block described in the Fields callout above. If the printed document shows no terms, that is where it went.
  • The AR/AP type is not in the copy either, and that is the point. It is read live at posting (see above), so it is the one supplier field whose later value can still change what an older invoice posts to.
  • The e-Invoice supplier block is a snapshot of a snapshot. A self-billed submission takes einvoice_supplier_entity_hdr_json first and falls back to the document’s own entity snapshot field by field. The party you self-bill on behalf of is not required to be the account you posted the payable to, and correcting it is done in the e-Invoice block, not by changing the supplier on the invoice.

Knocking off a purchase order or a goods receipt

What has to be true before a source appears. Not “it is FINAL” — that is necessary and nowhere near sufficient. The invoice’s KO For grids are fed from the source document’s open-queue rows, and those rows exist only when the company has an enabled Knock Off Configuration for that pair. Nothing creates those configurations for you, and Purchase Order → Purchase Invoice and Purchase GRN → Purchase Invoice are configured separately — so an empty KO For grid is far more often a missing configuration than a missing source document, and the screen gives you no way to tell the two apart. Check the configuration first.

The mechanics of the outstanding quantity are the same as on the order, and are set out once on the Purchase Order page rather than restated here. Three of its consequences land on this screen:

  • The source’s outstanding quantity drops when you tick it in KO For, on this draft — worked out from earlier invoice links only, so an invoice still in draft is already holding it. Each later Save or finalise from the edit screen then recomputes it from the ordered quantity plus the signed sum of every link on the line, of any document type. Undoing a knock-off — voiding the invoice — puts it back.
  • A line that reaches zero has its queue row deleted, so a fully invoiced order is recorded by an absence. KO For showing nothing means either “no configuration” or “all done”, and this screen cannot tell you which.
  • A company that configured both PO → GRN and PO → Purchase Invoice gets two different answers: KO For counts invoices only and still offers the full order, while the save-time recompute counts receipts and invoices together and can delete a row the other flow still needed. Configure only the flow you use.

What the button does. KO For is a whole-document knock-off, not a line picker: you tick a source document and the applet posts its header guid — a list of them, when ENABLE_MULTIPLE_KO is on — to the backend knock-off endpoint with this document type’s signums. Two details you will otherwise discover the hard way:

  • The transaction date is set to today by the knock-off, overwriting the date you keyed on the draft. Combine that with DATE_TXN_LOGIC and the date on the journal can differ twice from the date you typed.
  • The lines appear about two seconds after you click, on a fixed timer in the applet, not when the response arrives. A screen that looks like it did nothing usually has not finished.
  • The first source’s header replaces the draft’s. The knock-off copies the first ticked document’s company, branch, location, supplier with its billing and delivery details, references 1 to 5 and reference number, currency, remarks, profit centre, segment, project and dimension over whatever you had keyed on the draft, and copies every source’s attachments onto the invoice. Pick the source first and key your own references afterwards, or re-check them before you finalise.
  • Several sources must share the supplier and the branch. With ENABLE_MULTIPLE_KO on, ticking two orders or receipts from different suppliers or different branches is refused with The selected documents contain different entities or branches — one invoice per supplier per branch.

When the invoice and the receipt disagree. Nothing blocks it. There is no over-invoicing guard on this screen: the arithmetic simply drives the outstanding quantity to zero or below and the queue row disappears. On price there is no comparison at all — the knock-off copies the source’s prices in and you retype them, and the difference shows up as the moving average moving, not as a warning. If you need a three-way match, it is a report you run, not a control this applet enforces.

There is no GR/IR accrual in the standard pair

The question every accountant asks about a purchase flow, and the answer is unexpected.

The standard Purchase GRN (Internal) has amount signum 0 and quantity signum 0. The journal builder skips every line whose amount signum is zero and the stock processor skips every line whose quantity signum is zero. So the standard goods receipt posts nothing — no stock, no accrual, no journal. It is a record that the goods arrived. There is nothing for the invoice to clear, which is why you will find no goods-received/invoice-received clearing account in the standard flow and should not go looking for one.

Goods received / invoice received exists in BigLedger, in the other pair:

DocumentAmount / quantity signumWhat it posts
Purchase GRN (Internal)0 / 0Nothing
Purchase Invoice (Internal) — this applet−1 / +1Dr Purchase, Dr Input Tax, Cr Creditor, and the stock in
Purchase GRN Stock In (Internal)−1 / +1Dr INVENTORY_NOT_INVOICED, Cr CREDITOR_NOT_INVOICED, and the stock in — the accrual, registered explicitly in JournalPostingTypeHandler
Purchase Invoice No Stock In (Internal)−1 / 0The payable, plus a clearing pair that reverses the accrual, only when the invoice is linked to a source document and the total is non-zero
Purchase Order (Internal)0 / 0Nothing

Read that table before choosing a flow, because the choice is not reversible per document. If you need the liability recognised at receipt — because the gap between delivery and the supplier’s invoice spans month-end, and you do not want a month’s purchases missing from the accounts — you need the Stock In pair, and you accept the stale last purchase cost noted above. If receipt and invoice arrive together, the standard pair is simpler and posts once.

A goods receipt can create this invoice by itself

Separately from the KO For button, a company can configure a document flow that turns a finalised goods receipt straight into a purchase invoice: after every FINAL, the conversion job looks for an active, enabled AUTO document-flow configuration from that source type, and creates the invoice.

The generated invoice is created already FINAL, without the checks the FINAL button runs.

The configuration’s second posting status decides DRAFT or FINAL, and it falls back to FINAL when it is not set. On that path the invoice is not finalised the way a keyed one is — it is saved with its posting status already FINAL, then numbered and handed to the main posting job, so the payable, the input tax, the stock-in and the moving average all land with no human looking at the invoice. None of the checks FINAL normally makes are run against the new invoice: no fiscal-period lock check of its own, no serial, bin, batch or stock-balance check, no exchange-rate check. It takes the goods receipt’s transaction date — your Transaction Date Logic setting does not apply — and it records no finalised date. Only an explicit DRAFT in the configuration produces something for someone to review.

How to recognise one: an invoice that appears in the listing already FINAL, that nobody keyed or finalised, with the goods receipt on its Doc Link tab and the receipt’s date as its own. Its date was checked against the period lock only when the receipt was finalised; if you lock periods between receiving and invoicing, set the flow to DRAFT. If you rely on serial or stock checks at invoicing, the same applies.

AUTO on a Purchase GRN → Purchase Invoice flow is a normal way to set up high-volume receiving, and it means the receiving clerk finalising a GRN is — in effect — approving the bill. Make sure your receiving staff know that is what their FINAL does. This is today’s behaviour.

When the configuration asks for a stock check and the check fails, the document is not converted and not dropped — it is parked for an automatic-conversion retry job to try again.

A sister company’s sale can create this invoice

In a group, a purchase invoice can arrive without anyone keying it: when a sister company finalises a sales invoice that names an intercompany rule, the pairing builds this invoice in your company. You meet it as a document whose description begins Auto Created From and the seller’s invoice number, and it lists under Intercompany › Inbound › Processed beside the sale it came from. The setup that makes it happen is on the Organisation applet.

What it copies. The seller’s goods and service lines, line for line — item, quantity, unit prices, discounts, tax code and tax amount — and the totals, currency, reference and remarks. The supplier is the selling company’s own record, and the branch is the one whose Default Entity Branch is the Intercompany Branch the seller chose. A payment taken on the sale is not carried. Nothing here prices it again: the cost of the goods to you is exactly what the seller typed, so an RM 20,000 sale keyed as RM 2,000 arrives as an RM 2,000 purchase. Check the figures before you finalise.

Its date is when the pairing ran, not the sale’s date. An AUTO rule dates it the moment the sale is finalised; a MANUAL rule dates it the moment somebody confirms the row. A sale dated 31 March and finalised on 2 April arrives dated 2 April — in the next month, on the other side of your month-end. Correct the Transaction Date on the draft before you finalise, bearing in mind that this applet’s transaction-date setting can overwrite it at Final (see Applet settings).

It arrives as a draft unless the rule has Auto Final Target Doc ticked. Until someone finalises it, your company has neither the payable nor the stock, while the seller already shows the receivable — the first thing to look for when the two companies’ balances disagree at month-end. With the box ticked it is marked final at once and handed straight to the posting, without the checks the Final button runs; a missing account then fails the posting and leaves it final with no journal.

Once created it stands on its own. Voiding the sale leaves this invoice where it is, and voiding this one leaves the sale. If the seller takes the sale back to Draft and finalises it again — possible through the API — a second purchase invoice arrives, because nothing looks for the first. If you find two Auto Created From invoices for the same sale number, only one of them belongs in your books.

What this applet will not do

  • It will not give you a due date. There is no Due Date field, the column is never written, and Overdue Documents cannot see purchase invoices. See the callout under Fields.
  • It will not stop you paying the same bill twice. ENABLE_DUPLICATE_REFERENCE_CHECK turns the Reference box red across the whole tenant, ignores supplier and company, and blocks neither Save nor FINAL.
  • It will not enforce a three-way match. No quantity and no price comparison against the order or the receipt happens at knock-off or at FINAL.
  • It will not gate FINAL on an approval. Nothing in this applet or in the backend consults a workflow status before finalising; taking the FINAL button away with HIDE_GENDOC_FINAL_BUTTON and withholding the update permission is the only mechanism that works.
  • It will not let you undo a FINAL once e-Invoice is enabled. This screen hides VOID from then on (and the server itself refuses to void a self-billed invoice); the correction is a Purchase Debit Note for an invoice billed too high (a Purchase Credit Note raises what you owe, so it fits only one billed too low), or, for a self-billed invoice, a cancellation through the portal inside the LHDN window.
  • It will not switch on withholding tax from the settings screen. the SST and WHT enable flags do nothing. The withholding-tax picker on a line is governed by HIDE_WHT_CONFIG_SELECTION, which starts hidden.

Related applets

Troubleshooting

SymptomCauseFix
Invoice is FINAL and Trace Document → Journal Txn is empty. The reason BigLedger support reads is MISSING_DEFAULT_GL_CODE: CREDITOR (or CREDITOR_NON_TRADE, EMPLOYEE_OTHER_PAYABLE); no screen shows it until the posting is re-run: Resolve in Trace Document shows the full reason, and CREATE on Ledger And Journal’s Missing Journal shows only its codeThe company has no default GL code linked for the supplier’s AR/AP type; FINAL succeeded and the journal job failed afterwardsAdd the mapping under the company’s default GL codes in the Chart of Account applet, then Financial Report › Error Checking › Trace Document → Missing Journal → Resolve (a second FINAL is refused). Resolve, pressed while the cause is still there, posts nothing and shows the reason in the check’s message, so it doubles as the diagnosis
Invoice is FINAL and Trace Document → Journal Txn is empty; the reason BigLedger support reads is MISSING_CASHBOOK: STL_MTHD [code] or MISSING_GL_CODE: STL_MTHD [code]A settlement method on the Payment tab has no cashbook, or its cashbook has no GL codeLink the settlement item to a cashbook with a GL code in the Cashbook applet, then Missing Journal → Resolve in Financial Report’s Trace Document. Where your company also writes cashbook lines for this document’s payment lines, that line is missing too, and Trace Document does not restore it for this document type: ask BigLedger support.
FINAL fails because the date is in a locked fiscal periodThe transaction date falls in a closed fiscal periodChange the date, or reopen the period, then FINAL
Generic Document has already been posted to FINALA second FINAL request reached the backend (double click, or a stale tab)Refresh; the document is already FINAL
Journal shows a different supplier from the invoiceThe journal’s creditor line is taken from the supplier at FINAL time; the supplier on the document was changed afterwards by a data fix or ETLDo not edit the journal. Press Repost beside Posting Journal in Error Checking › Trace Document: it rebuilds the journal from the invoice as it stands now. A failed Repost says nothing and leaves no journal, so check Journal Txn afterwards
Line posted to the generic PURCHASE account instead of the item’s expense accountNo GL code on the line or header, and the item has no company GL-code link with transaction code PURCHASESet the item’s purchase GL link, or switch HIDE_LINE_ITEMS_GL_CODE off and choose the code per line; documents already finalised keep their journal
Average cost drops towards zero after invoices, while Last Purchase Price still looks rightA line with a quantity and a zero or blank transaction amount. The moving average absorbs it; the last purchase cost writer skips a zero unit price, so the two numbers diverge — the mechanismEnter the value before FINAL; a finalised line’s quantity and amount cannot be edited, so void the invoice where permitted and re-key it. Otherwise correct the company average with a Reset MA and put the amount still owed on a Purchase Credit Note. A Purchase Debit Note moves no stock and lowers what you owe, so it repairs neither
FINAL rejected for serial numbersA serial on the invoice already exists in the company, is duplicated within the document, or the serial count differs from the quantityRemove or correct the serial; the error lists the offending snIds
VOID button missing on a finalised invoiceCompany e-Invoice status is ENABLED, the document is locked, or HIDE_GENDOC_VOID_BUTTON is on without SHOW_GENDOC_VOID_BUTTONRaise a Purchase Debit Note if the invoice was too high (a Purchase Credit Note if too low), or cancel a self-billed invoice via the e-Invoice portal; otherwise grant the permission
The invoice has already been linked with a purchase return on VOIDAn active Purchase Return references this invoice (checked by this screen before it sends the void)Void the return first, or correct the balance with a Purchase Debit Note (lowers what you owe); a Purchase Credit Note raises it
The purchase invoice has already been returned. on VOID, with no return in sightThe server found an active document raised from this invoice — a debit or credit note, a conversion, a return — and the screen words every such refusal as a returnOpen the Doc Link tab, void (or discard) the document listed there first, then void the invoice
Journal posted, but the creditor credit is smaller than the invoice total and there is no Purchase debitA goods line’s purchase account could not be resolved — no line or header GL code, no item link, no company Purchase default — so the line was left out and the creditor balanced the restSet the company Purchase default (or the item’s link). Then open the invoice in Error Checking › Trace Document and press Repost beside Posting Journal: it deletes the short journal and builds it again from the invoice. Repost successful means it worked. A failed Repost shows nothing, and it has already deleted the old journal, so open the Journal Txn grid afterwards: if it is empty, press Resolve on the Missing Journal check, which posts the journal or shows why it cannot. Or post a correcting journal. See the caution
A FINAL purchase invoice nobody keyed, dated with a goods receipt’s dateAn enabled automatic Purchase GRN → Purchase Invoice document flow with no posting status set creates the invoice already FINALSet the flow’s second posting status to DRAFT if invoices should be reviewed; see A goods receipt can create this invoice by itself
Payment date on the Payment tab reverts after saving; the cashbook shows the invoice dateEvery save sets payment-line dates to the invoice’s transaction datePay with a Payment Voucher dated the day the money left
Item missing from the line-item searchSHOW_ITEM_STOCK_BALANCE is on, so the search lists only items with stock above zero at the invoice’s locationSwitch it off in Application Settings for this applet
The currency rate cannot be ZERO.No rate was fetched for the chosen currencyEnter the rate manually (unless CANNOT_EDIT_CURRENCY_RATE is on) or configure the currency’s rates
No Default Printable Selected when printingNo printable format, or none marked as Default SelectionCreate one under Printable Format Settings and mark it as default; set the branch default in Branch Settings
Source document not found on KO ForMost often no enabled Knock Off Configuration for that document pair, which creates no open-queue rows and makes every source invisible. Otherwise the source is still draft, is for another branch or currency than the invoice (the grid shows only the invoice’s own), or it is fully drawn down — and a fully drawn line has its queue row deleted, so “done” and “never configured” look identicalCheck the company’s Knock Off Configuration for the pair first — PO → Purchase Invoice and GRN → Purchase Invoice are separate entries and each has to be enabled; then finalise the source; then check the invoice’s branch and currency against the source’s; then check the remaining quantity on the source document
File Import / File Export menu missingHIDE_FILE_IMPORT_MENU / HIDE_FILE_EXPORT_MENU onGrant SHOW_FILE_IMPORT_MENU / SHOW_FILE_EXPORT_MENU to the user or switch the setting off
Contra document listed twiceContra listing pagination returned the same link on two pages (reported and closed in 2026)Refresh the listing; verify on TraceDocument that the contra was posted once
Listing shows posting status DRAFT for invoices believed finalDocuments were created by an ETL/migration in DRAFT and never finalised. A migration writes the document without pressing FINAL, so nothing posted and nothing warned — a residue of old drafts after a data load is expected, not a faultOpen each and FINAL it, or ask support to bulk-finalise
Duplicate invoice after migrationA migrated GRN was invoiced twiceVoid the duplicate if possible; otherwise correct stock with a stock adjustment
Line-item price columns missing for everyoneThe hidden-by-default line columns (HIDE_UNIT_PRICE_STD_EXCL_TAX, HIDE_AMOUNT_NET_EXCL_TAX, HIDE_TAX_CONFIG_SELECTION, …) were persisted by the first save of Application SettingsSwitch the columns off under Application Settings > Line Items, or grant the matching SHOW_… permission per role
User cannot open the applet at allNo TNT_API_DOC_INTERNAL_PURCHASE_INVOICE_READ_TGT_GUID for the branchGrant read (and create/update) for the required branches under Permission Set

Related documentation

Video overview

Last updated on