Tiktok Sales Order Applet
Overview
The Tiktok Sales Order Applet is a marketplace-oriented build of
Sales Order (Internal). It opens the same
INTERNAL_SALES_ORDER documents, in the same listing and the same create / edit form, and it is meant
for the person who works marketplace orders rather than the whole sales desk: the sidebar keeps the
order listing, the line-item listing, the SO Detailed Report and the Ecomsync dashboards, and drops
everything else.
The name needs saying plainly. The registry calls it Tiktok Sales Order Applet (its own note reads
“previously called Shopee Sales Order”), but its code is shopee_sales_order_applet, its route root
is …/shopee-sales-order-applet, and the source refers to Shopee 136 times and Lazada 65 times against
one mention of TikTok — the applet’s display name. Nothing in it is TikTok-specific: the dashboards it
ships are the Lazada and Shopee dashboards, the marketplace-status tab knows Shopee’s shipping
statuses, and the scheduler offers only the Lazada and Shopee order jobs. Treat it as the Lazada /
Shopee order desk with a newer label.
INTERNAL_SALES_ORDER, amount signum 0, quantity signum 0.
An order finalised here posts nothing and moves no stock, exactly as in Sales Order (Internal). Every
field, validation and knock-off rule on that page applies here unchanged; this page documents only
what differs.The repository is one applet split out of a larger multi-applet build in November 2025; the split history shows the display name being changed in December 2025 and a sub-query clean-up in September 2026, and nothing else.
Where it fits
| Direction | Applet / document | How it connects |
|---|---|---|
| Same records | Sales Order (Internal) | An order created or edited in either applet is visible in both; there is one document table |
| Upstream | Organisation — Branch → Marketplace | The marketplace branch whose orders the ingestion jobs create; its stock rule and settlement method |
| Upstream | Doc Item Maintenance — Marketplace tab | The listings the marketplace order lines resolve to |
| Downstream | Receipt Voucher (Internal) | The Receipt Voucher tab on an order; marketplace payouts land there through the EcomSync jobs |
| Index | EcomSync related applets | Which applet owns each marketplace step and which background jobs run |
Modules: E-Commerce (primary), Sales & POS.
Screens and menus
Route root: applet/tnt/wavelet/erp/shopee-sales-order-applet/. The sidebar is defined in
menu-items.ts; the route table in app.routing.ts is wider than the sidebar, so the second column
below matters.
| Screen | Route | In this applet’s sidebar | In Sales Order (Internal)’s sidebar |
|---|---|---|---|
| Sales Order listing | internal-sales-order | Yes | Yes |
| Line Items | line-items | Yes | Yes |
| SO Detailed Report | sales-order-detailed-report | Yes | Yes |
| Ecomsync › Dashboard | ecomsync-dashboard | Yes | Yes |
| Ecomsync › Reply To Review, Replied Review | ecomsync-reply-to-review, ecomsync-replied-review | Yes | Yes |
| Ecomsync › Scheduler | ecomsync-scheduler | No — route only | Yes |
| Pick Pack Queue | pick-pack-queue | No — route only | Yes |
| Delivery Items | delivery-items | No — route only | Yes |
| Batch Printing | batch-printing | No — route only | Yes |
| Delivery Plan, Calendar | delivery-plan, delivery-plan-calendar | No — route only | Yes |
| File Export | file-export | No — route only | Yes |
| SO Line with SI KO | — | No route | Yes |
| File Import | — | No route | Yes |
| Approval | — | No route | Yes |
| Intercompany | — | No route | Yes |
| Audit Trail | — | No route | Yes |
| Settings, Personalization | — | No route | Yes |
“Route only” means the screen is compiled in and opens if the URL is typed, but no menu, button or
routerLink in the applet leads to it. Nothing in the applet navigates to settings/… either — see
Configuration.
The create / edit form
The create form has ten tabs — Search, Main Details, Account, Line Items, Delivery Details, Settlement, Department Hdr, KO For, Contra, Attachments — and the view form twenty-one: Main, Account, Line Items, ARAP, Delivery Details, Delivery Trips, Delivery Plans, Settlement, KO For, Receipt Voucher, Department Hdr, Trace Document, Contra, Doc Link, Attachments, Export, Convert, Ecomsync, Status, Events, Email. The tab order is fixed; there is no Details tab ordering setting because there is no Default Selection screen.
The Ecomsync tab on a FINAL order is the marketplace desk: sub-tabs Marketplace Status (set the order to Pending, To Pack or Ready To Ship; for Shopee, Ready To Ship or Processed, with the shipping method dropoff, pickup or non-integrated and a pick-up address and time slot fetched from Shopee), Detail, Printables and Line Item ToPack Batch Update.
Inside a line the tabs are Item Details, Grouped Item, Serial Number, Batches, Bin, Stock Availability, Costing Details, Pricing Details, Issue Link, Attachment, the four KO By / KO For Jobsheet and Job Order tabs, KO By / KO For Sales Quotation Item, Doc Link, Ecom Sync and MRP — the Sales Order (Internal) set minus Reserved Stock, Sales History and Membership Points.
The Ecomsync dashboard
Two tabs, Lazada Dashboard and Shopee Dashboard, each with Dashboard Main, Dashboard Total Orders and Dashboard Total Sales, plus an order listing whose detail view has Detail, Item, Customer Details, Processing Flow and Shipping Carrier. These are the same components as in Sales Order (Internal); the index page describes what feeds them.
Configuration
Before you can use it
The same prerequisites as Sales Order (Internal):
company, branch and location; customers with credit terms; items; a pricing scheme and pricebook;
and the API permissions TNT_API_DOC_INTERNAL_SALES_ORDER_{CREATE,READ,UPDATE}_TGT_GUID,
TNT_API_DOC_INTERNAL_RECEIPT_VOUCHER_{CREATE,READ}_TGT_GUID and
TNT_API_DOC_INTERNAL_SALES_ORDER_DELIVERY_BRANCH_READ, which are the eight permission definitions the
applet enquires about at start-up (app.component.ts). For marketplace orders, a marketplace branch
set up in Organisation and the Lazada / Shopee order jobs
scheduled — see the EcomSync index.
Applet settings
There is no settings screen in this applet. app.routing.ts (commit af9f967) declares no
settings or personalization route; the sidebar has no settings group; and no component navigates
to one. The settings components are nevertheless compiled in — app.module.ts imports
AppletSettingsModule and AppletPersonalizationModule, and components/settings-container/ holds
Default Selection, Field Configuration, Custom Status, Branch Settings, Workflow Settings, Email
Template, Sales Order Status, Printables and Printable Format Settings, Audit Trail, Release Notes and
Applet Log, each of which would save through saveMasterSettingsInit — but nothing routes to them.
What this means in practice:
- The applet reads its settings exactly as Sales Order (Internal) does: every component that
subscribes to
selectMasterSettings(the line editor, the customer editor, pick-pack queue, delivery details, contra and receipt-voucher forms) applies whatever is stored against this applet’s code. - Nothing in this applet writes them. A tenant that has never saved settings for
shopee_sales_order_appletruns on the empty set — everyHIDE_*toggle off, no default branch, no default pricebook, no custom statuses, no printable formats. - Settings saved in Sales Order (Internal) are stored against
erp_internal_sales_order_applet_v2and are not read here. The two applets can therefore show the same order with different columns and defaults.
Given that, the four-proof table below is short. Every key in applet-settings.model.ts is
declared; none is rendered by a reachable screen; none is persisted from this applet; the ones
listed are consumed.
| Setting (key) | Consumed by | Effect when a stored value is true |
|---|---|---|
HIDE_BATCHES, HIDE_BIN | add- and edit-line-item templates | Hide the Batches / Bin tab of a line. Sales Order (Internal) uses the four finer keys HIDE_BATCH_NUMBER, HIDE_BATCH_ISSUE_DATE, HIDE_BATCH_EXPIRY_DATE, HIDE_BIN_NUMBER instead |
HIDE_PAYMENT_CONFIG, HIDE_TAX, HIDE_CONTACT, HIDE_BRANCH, HIDE_ITEM_PRICING, HIDE_REMARK, HIDE_CREDIT_TERM_AND_LIMIT | the customer editor opened from the Account tab (customer-edit.component.html) | Hide the matching tab when a customer is created or edited from inside the order. Sales Order (Internal)’s customer editor reads the same keys, but its settings model declares only HIDE_PAYMENT_CONFIG and HIDE_ENTITY_CATEGORY; here all seven are declared |
GL_CODE_CHECK_FILTER | — | Declared only; consumed by nothing in this applet |
Everything else in the model (DEFAULT_BRANCH / DEFAULT_LOCATION / DEFAULT_COMPANY, DEFAULT_PRICEBOOK, DEFAULT_CURRENCY, the HIDE_* column and tab toggles, ENABLE_SERIAL_NUMBER_VALIDATION_FINAL, DISALLOW_SELL_BELOW_*, SHOW_DRAFT_BUTTON, FINAL_STATUS_GUID, the custom-status arrays, the credit-card HIDE_* / MANDATORY_* pairs) | the same components as in Sales Order (Internal) | As documented on that page’s Applet settings, if a value has been stored for this applet’s code by some other means |
Keys present in Sales Order (Internal)’s model and absent here: DEFAULT_PACKING_LOCATION_GUID,
PRICING_RETAIL_GUID, DEFAULT_ORIENTATION, DEFAULT_DECIMAL_PRECISION / DEFAULT_DECIMAL_STEP,
HIDE_TRACKING_ID_LISTING, HIDE_TRACKING_ID_GEN_DOC, HIDE_STATUS_GEN_DOC, HIDE_DOCUMENT_LINKS,
HIDE_SALES_HISTORY, HIDE_RESERVED_STOCK, HIDE_SEARCH_DOCUMENT, and the HIDE_*_MENU family. So
the sidebar cannot be trimmed per tenant — it is already trimmed in code — and there is no default
pricing scheme; unit prices come from the pricebook rules evaluated client-side
(components/utilities/pricebook-calculator.ts, a file this build carries and Sales Order (Internal)
does not).
Document behaviour settings
No workflow, custom-status, sales-order-status, printable or email-template screen is reachable (see above). Status flow is the backend’s: DRAFT → FINAL → VOID, with Discard on a draft, and the per-line Close. The marketplace status pushed back to Lazada / Shopee is set from the order’s Ecomsync › Marketplace Status tab, not from a setting.
Feature visibility / permissions
The applet checks fifteen client-side permission codes: SHOW_GENDOC_FINAL_BUTTON,
SHOW_GENDOC_VOID_BUTTON, SHOW_GENDOC_DISCARD_BUTTON, SHOW_DOC_NO_TENANT, SHOW_DOC_NO_COMPANY,
SHOW_DOC_NO_BRANCH, SHOW_CLIENT_DOC_TYPE, SHOW_TRANSACTION_DATE, SHOW_LISTING_BRANCH,
SHOW_ARAP_PNS, SHOW_ARAP_SETTLEMENT, SHOW_ARAP_DOC_OPEN, SHOW_ARAP_CONTRA, SHOW_ARAP_BAL and
SHOW_MARKETPLACE_STATUS_UPDATE_PAGE. Whether any of them is registered in
bl_applet_client_side_perm_dfn for shopee_sales_order_applet could not be confirmed on
2026-09-15 (registry tunnel down); the page will be corrected when it can be queried. The Feature
Visibility and permission-listing screens exist in the route table of Sales Order (Internal) but not
here, so client-side permissions for this applet can only be assigned from the shared permission
tooling, not from inside the applet.
Fields
Identical to Sales Order (Internal) › Fields for Main Details, Account, Lines, Settlement, Contra and Delivery Plan. Differences:
| Area | Sales Order (Internal) | This applet |
|---|---|---|
| Line tabs | includes Reserved Stock, Sales History, Membership Points | not present |
| Line tabs | Batches and Bin hidden by four keys | hidden by HIDE_BATCHES / HIDE_BIN |
| Unit price default | pricing scheme from PRICING_RETAIL_GUID | pricebook rules only (pricebook-calculator.ts); no scheme default |
| Customer editor (Account tab) | same hide keys read, two declared | Payment Config, Tax, Contact, Branch, Item Pricing, Remark, Credit Term and Limit each hideable, and all seven keys declared in the model |
| Ecomsync tab | Marketplace Status, Detail, Printables, Line Item ToPack Batch Update | identical |
Lifecycle and effects
Posting proof, taken from Sales Order (Internal) and re-verified against the backend at
blg-akaun-platform-java commit c4a3545d7c:
| Server document type | INTERNAL_SALES_ORDER (AppletConstants.docType; ServerDocTypes.java line 49) |
| Amount signum | 0 (ServerDocTypes.INTERNAL_SALES_ORDER(0,0); AppletConstants.amount_signum = 0) |
| Quantity signum | 0 (AppletConstants.quantity_signum = 0) |
| Dr / Cr equation | none — JournalPostingTypeHandler has no handler for a signum-0 sales order; JournalPostingService is never entered |
| GL precedence | not applicable; no journal is built |
| Stock processor | none — InventoryTransactionLineProcessorService writes no inventory transaction for quantity signum 0; the order only reduces available quantity in StockAvailabilityService |
| What VOID reverses | nothing posted; VOID releases document links and reservations (same void processor as Sales Order (Internal)) |
Statuses TEMP → DRAFT → FINAL → VOID, FINAL validation (exchange rate, blacklist, serial / batch
quantities when ENABLE_SERIAL_NUMBER_VALIDATION_FINAL is stored, locked period) and knock-off into
a Sales Invoice are as on Sales Order (Internal) › Lifecycle and posting
— it is the same InternalSalesOrderDataConsistencyObject.
Marketplace orders arrive in TEMP from the Lazada / Shopee order-ingestion jobs; a user opens and saves one before it gets a running number. The status pushed back to the marketplace from the Ecomsync tab is recorded per order as a fulfilment record, as described on the EcomSync index.
Related applets
- Sales Order (Internal) — the full applet this one is cut from; read it for fields, settings and posting.
- EcomSync related applets — the index of which applet holds each marketplace step, and the background jobs that do the syncing.
- Organisation — the marketplace branch.
- Doc Item Maintenance — the marketplace listings and the Scheduler that creates the Lazada / Shopee jobs.
- Receipt Voucher (Internal) — where marketplace payouts land.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Columns, defaults or hidden tabs differ from Sales Order (Internal) for the same order | Settings are stored per applet code and this applet has no screen to set its own | Expected; there is nothing to configure here. Use Sales Order (Internal) when a configured view is needed |
Typing …/settings after the route root shows the applet’s 404 page | No settings route exists in this build | Not a fault; see Configuration |
| Pick Pack Queue, Delivery Items, Batch Printing, Delivery Plan, File Export or the Ecomsync Scheduler cannot be found | Compiled in but absent from the sidebar | Type the route (pick-pack-queue, delivery-items, batch-printing, delivery-plan, file-export, ecomsync-scheduler) after the route root, or use Sales Order (Internal) |
| Error updating the marketplace status | The marketplace rejected the status push from the Ecomsync tab; the toast carries the marketplace’s message | Read the message; for Shopee, make sure a shipping method and, for pick-up, an address and time slot are chosen |
| Please Select a Mode or Select at least One Data from Listing / Error mode being selected for lazada (or shopee) | Bulk marketplace update run with no mode, no rows, or a mode that does not match the order’s marketplace | Filter to one marketplace, tick rows, pick its mode |
| Customer not linked to branch | The customer chosen on the Account tab has no link to the order’s branch | Link the customer to the branch in Customer |
| There is no GL Code linked to this item | Item has no GL code and the line editor requires one | Set it in Doc Item Maintenance |
| Only maximum quantity of N is allowed for this component | Grouped-item component quantity exceeds its ratio | Reduce the quantity |
| Delivery Branch And Location Do Not Match / Delivery Types Do Not Match | Delivery Details disagree with the Main Details branch or with the delivery type of other lines | Align the branch, location and delivery type |
| Please refine your search as only 10 records … are being showed | Customer search returned more than ten matches | Narrow the search |
| Marketplace order stuck in TEMP with no running number | Created by the ingestion job; the number is assigned when a user saves it | Open the order and save |