Custom Processor Applet
The monitoring and set-up screen for a hand-off queue to an external processor: a Processor Filter names a sales document type, a company and a posting status, and when a matching document becomes final its header is copied into the Processing Queue for your own integration to pick up through the API. Nothing here changes a document’s status or posts anything; the processing itself happens outside BigLedger. A filter with posting status Draft never fires, and the field cannot be changed after creation, so create each filter as Final, one per company.
Your job, and the screen for it
| The job | Screen or tab | Read |
|---|---|---|
| Queue finalised sales documents for your external processor | Processor Filter › + — Posting Status FINAL; one ACTIVE filter per document type and company, as only the first match queues; a Draft filter never fires | Processor Filter |
| Check what is waiting for the external processor | Processing Queue (read-only, no retry) — a row that vanishes is the normal end state | Document hand-off |
| See what the external processor reported back | Processing History | Processing History (read-only) |
| Check a price reached the shelf labels | Price Tag Sync History — successes only; only the scheme coded PRICE_001 is pushed | Price tag sync |
| Set up the integration and the price-tag sync | Your external processor, reading the queue by API; the De-Tag sync installed by BigLedger and its job scheduled in the Scheduler applet — Settings here configures nothing | Before you can use it |
Overview
The Custom Processor Applet is the monitoring and configuration screen for a hand-off queue between BigLedger and an external processor. You create a Processor Filter that names a sales document type, a company and a posting status; when a matching document reaches FINAL, the backend copies its header into a Processing Queue row. An external integration reads that queue through the API and does its work. While it works it may write its progress and errors onto the queue row; when it reports back, the queue row is deleted and a Processing History entry takes its place. The applet also lists the Price Tag Sync History — the successful pushes of pricing-scheme changes to an electronic-shelf-label (ESL) system.
Nothing in this applet or in the BigLedger backend changes a document’s posting status. The old description “moves documents from DRAFT to FINAL” is not what the code does: the queue is filled because a document became FINAL, and the processing itself happens outside BigLedger.
Where it fits
| Direction | Applet / data | Why |
|---|---|---|
| Upstream (documents that can be queued) | Sales Order (Internal), Sales Invoice (Internal), Sales Return (Internal), Sales Debit Note (Internal), Sales Credit Note (Internal) | The five server document types a Processor Filter can name |
| Upstream (master data) | Organisation | A filter is scoped to one company |
| Upstream (price tags) | Pricebook | Every new or changed pricing-scheme price is queued for the price-tag sync, once the sync is installed |
| Downstream | External processor (customer-specific integration) | Reads custom-processing/queues, writes external status back, posts custom-processing/histories |
| Downstream | External ESL system | Receives price pushes from the scheduled De-Tag syncing job; successes land in Price Tag Sync History |
Screens and menus
Route root applet/tnt/wavelet/erp/custom-processor-applet. The left menu has four listings, all read from the backend with a paginated grid (search, column filters, grid toggle). Only the Processor Filter listing has a create/edit form.
| Menu item | Screen | Backend table |
|---|---|---|
| Processor Filter | Listing (Code, Description, Server Doc Type, Company, Posting Status, Created Date, Status); + opens the create form; a row opens the same form in view mode with EDIT and DELETE (YES / NO confirmation dialog) | The filters |
| Processing Queue | Read-only listing (Filter Code, Posting Status, Server Doc Type, Client Doc Type, Txn Date, Gen-Doc Created Date, Company, Processor, External Process Status / Error, External Response Status / Error, Status), newest first | Documents waiting for, or being handled by, the external processor |
| Processing History | Read-only listing (Company, Processor, Posting Status, Server Doc Type, Client Doc Type, Internal Doc No, External Doc Type / Code / Submission No, Description, Created Date, Status) | What the external processor reported back. External Doc Type is not the processor’s: the server stamps the row with the LHDN e-invoice type code of the document (01 invoice, 02 credit note, 03 debit note, 04 refund note) when the queue row is written |
| Price Tag Sync History | Read-only listing (Item Code, Item Name, Scan Code, Company Code, Store Code, Sales Unit Price, Created Date, Updated Date, NFC URL) | Price changes the shelf-label system accepted |
| Settings | Field Settings, Default Selection, Webhook, Client-Side Permission, Permission Set / User / Team / Role Permission | Shared screens except the first two |
| Personalization | Default Selection (a Field Settings entry is listed in the menu but has no route), Sidebar | Per-user |
The queue, history and price-tag screens have no buttons other than the grid toggle: there is no retry, re-queue or delete from the applet.
The only image under static/images/custom-processor-applet/ is an illustrative infographic; it is not embedded because its “automated processing filters / real-time background queues” story overstates what the applet does.
Configuration
Before you can use it
- The five sales document applets above produce the documents; a document is only considered at the moment it becomes FINAL — from the listing, from inside the document, or through the API.
- The company exists in Organisation; the filter lookup is by tenant, server document type, the document’s company and posting status, so create one filter per company.
- An external processor — your integration, built by you or your integrator — that reads the queue through the API and reports back through the access-key callback
POST …/histories/custom-creation/etl-ep, which permanently deletes the queue row and then writes the Processing History row — so a row that vanishes from the queue is the normal end state, not a fault. The two are separate steps (read from the code, not tried): if the history write fails, the queue row is already gone, so have the integration keep its own record of what it reported. (Before that, the processor can write its status and errors onto the queue row through the queue’s own access-keyetl-ependpoints: a query, a read and two updates.) Without a processor the queue only grows. The integration contract is a developer matter; ask BigLedger for the queue API when you commission one. - For Price Tag Sync History: the shelf-label (De-Tag) sync must be installed on your tenant by BigLedger, and the
PRICING_SCHEME_DE_TAG_SYNCING_PROCESSORjob must be scheduled in the Scheduler with its settings (interval,username,password,company,store). - API permissions:
TNT_DM_ERP_GENERIC_DOC_CUSTOM_PROCESSING_FILTER_{OWNER, ADMIN, CREATE, UPDATE, DELETE, READ}and the matching_QUEUE_*and_HISTORY_*sets.
Applet settings
No setting does anything — nothing in the four listing screens or the filter form uses one:
- Settings › Default Selection shows Default Branch / Default Location under “Applet Default Settings” — the “User Default Settings” copy is commented out of the template — and cannot save: the route mounts the component with no settings input and no save listener, so picking a value throws in the browser (a known issue, reported to engineering). Nothing in this applet asks for a branch or location anyway.
- Settings › Field Settings shows eight toggles (Unit Discount, SST/VAT/GST, WHT, Blanket Order, Segment, G/L Dimension, Profit Center, Project) with a SAVE button that does nothing — a placeholder copied from the document applets.
- Personalization › Default Selection fails when you pick a value.
Configuration is the Processor Filter records themselves (Fields below).
There are no document-behaviour settings: the applet owns no document.
Feature visibility / permissions
The applet has no SHOW_* / HIDE_* client-side permissions of its own. The Client-Side Permission and permission-set screens are the shared ones.
Fields
Processor Filter
| Field | Meaning | Required | Notes / validation |
|---|---|---|---|
| Filter Code | Identifier copied onto every queue row it creates | Not checked | Not checked for uniqueness either |
| Server Doc Type | INTERNAL_SALES_ORDER, INTERNAL_SALES_RETURN, INTERNAL_SALES_DEBIT_NOTE, INTERNAL_SALES_CREDIT_NOTE, INTERNAL_SALES_INVOICE | Marked required in the control list; the reactive form has no validator | Read-only after creation |
| Company | One company from the dropdown | No | Read-only after creation. Part of the backend lookup, so a filter without a company does not match a document that carries one |
| Posting Status | DRAFT or FINAL | Marked required; no validator | Read-only after creation. The backend only looks for filters when a document has just become FINAL, so a DRAFT filter never fires (see Lifecycle) |
| Status | ACTIVE / INACTIVE | Marked required; the create effect defaults to ACTIVE when empty | The only field besides Description that stays editable; the lookup ignores INACTIVE filters |
Processing Queue (read-only)
Each row carries the filter, the document (type, numbers, dates, company) and then what the external processor has written: processor, start and end, process status and error, response status and error, and the external document it created. There is at most one row per tenant, company, processor, posting status and document — a second is refused with GENERIC_DOC_CUSTOM_PROCESSING_QUEUE__UNIQUE_CONSTRAINT_ALREADY_EXIST.
Processing History (read-only)
What the external processor reported: the document, the processor, the external document type, code and submission number and the response. History is append-only — nothing edits an entry once written.
Price Tag Sync History (read-only)
One row per price change the shelf-label system accepted.
Lifecycle and effects
Master-data / monitoring applet: no posting status, no journal, no stock. Filters are created, edited and deleted from the Processor Filter screen.
Document hand-off
- A sales document becomes FINAL — from a screen or through the API.
- BigLedger looks for the first ACTIVE filter matching the tenant, the document type, the document’s company and the document’s posting status. One document therefore creates at most one queue row even if several filters match.
- If one is found, a background job runs at once (with two retries ten seconds apart) and creates the Processing Queue row. It sets no processor and no external status, and does not touch the document.
- Everything after that is the external processor’s job: it reads the queue, may write its status and errors onto the queue row while it works, and finally calls the access-key callback, which deletes the queue row for good and records the Processing History row that carries its status and result. A failure shows on the queue row (External Process Error / External Response Error) only while the processor has written to the row and not yet called back.
Price tag sync
- Once the sync is installed, every new or changed pricing-scheme price is queued for sync.
- The scheduled job
PRICING_SCHEME_DE_TAG_SYNCING_PROCESSOR(settings: interval, username, password, company, store) signs in to the shelf-label vendor and sends each queued price: a price whose pricing scheme is not codedPRICE_001is markedSYNCING_SKIPPED— only that one scheme is ever pushed, so a differently coded scheme never gets a history row; a vendor answer ofSUCCESSadds a Price Tag Sync History row and marks the priceSYNCING_SUCCESSFUL; anything else marks itSYNCING_FAILEDwith the vendor’s text. The NFC URL on the history row is the same fixed value for every item, not one derived from the item. PRICING_SCHEME_DE_TAG_SYNCING_QUEUE_DELETE_PROCESSOR, when scheduled, removes queued prices older than three months. The queue itself is not visible in this applet — only the success history is.
Related applets
- Sales Order (Internal), Sales Invoice (Internal), Sales Return (Internal), Sales Debit Note (Internal), Sales Credit Note (Internal) — the document types a filter can watch; finalising one of them is the only event that fills the queue.
- Organisation — companies used to scope filters.
- Pricebook — pricing-scheme link changes are what the price-tag sync pushes to the shelf labels.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Filter is ACTIVE but nothing appears in Processing Queue | The filter’s Posting Status is DRAFT — the lookup only runs when a document becomes FINAL, and it matches the document’s current status | Recreate the filter with Posting Status FINAL (the field is read-only after creation) |
| Documents of the right type from another company are not queued | The lookup includes the document’s company | Create one filter per company |
| Only one of several matching filters produces a queue row | Only the first matching filter is used | Keep one ACTIVE filter per document type and company |
| Queue rows stay with empty Processor / External Process Status | No external processor is reading the queue; BigLedger itself never fills those columns | Check the integration that should read the queue |
| Queue row shows an error in External Process Error / External Response Error | Written onto the row by the external processor, which has not yet called back (the callback would have removed the row) | Read the text; correct the document in its own applet and let the external side re-process — there is no retry button in this applet |
GENERIC_DOC_CUSTOM_PROCESSING_QUEUE__UNIQUE_CONSTRAINT_ALREADY_EXIST reported by your integration | A row already exists for the same tenant, company, processor code, posting status and document | Update the existing row instead of creating a new one |
| A price change is missing from Price Tag Sync History | Only vendor-confirmed successes are recorded; the price was skipped or failed, or the sync was never installed or scheduled for this tenant | Check the job in the Scheduler applet; re-save the pricing-scheme price to queue it again |
| Filter form accepts an empty Filter Code or duplicate codes | Neither the form nor the server checks the code | Enter a distinct code by convention; the queue only carries the code as a label |
| Default Selection / Field Settings appear to do nothing | Placeholder screens (see Configuration) | Nothing to configure there |
Related documentation
- Pricebook Applet — pricing schemes and links.
- Sales Invoice (Internal) Applet — the posting-status endpoint that triggers the hand-off.