Net vs Target
iMenu Engineering Matrix
Qty Sold vs Gross Profit per category · baselines = average across categories 100%Hiding a category only removes its dot; the quadrant baseline stays the same.
Ticked menus are removed from both rankings.
Top 20 Menu
| Menu | Portion | Volume (Rp) |
|---|
20 Worst Menu
| Menu | Portion | Volume (Rp) |
|---|
Branch Performance Ranking
| Branch | Net Sales | Gross Sales |
|---|
Sales Contribution by Visit Purpose
Visit Purpose Ranking
| Visit Purpose | Net Sales | Share |
|---|
Top Promotion
| Promotion Name | Generated Gross Sales | Total Discount (Rp) | Total Voucher Discount (Rp) | Expected Net Earning (Rp) |
|---|
Sales Peak Hour
captured from first order time| Section | Time Window | Bills | Net Sales |
|---|
Hourly Traffic Heatmap
visits by day & hour, from Sales Date InTop 20 Void / Cancel Approvers
iGenerated Bill & Pax (month to date)
Branch Performance Overview
Yearly Targets: Company → Brand → Branch
Computed bottom-up: fill each branch's months in “Monthly Target per Branch” below, and these Brand and Company totals roll up automatically. Names come from your Mapping Template Report groupings.
Monthly Target per Branch
Daily Target per Branch
Set Auto by Percent (%)
Spreads the monthly target across the dates by day-of-week weight. Dates already passed keep their value; the remaining target is spread over the remaining days.
Sales Peak Hour: Time Windows
These sections drive the Sales Peak Hour table on the Sales Panel. Give each window a title and an hour range (24h HH:MM). A window may wrap past midnight (e.g. 22:00 – 06:59). Bills are bucketed by the HOUR of their Sales Date In.
| Title | From | To |
|---|
General Ledger
Stock Movement
Profit Loss Report
Chart of Accounts: Mapping COA
The COA master mirrors ESB’s Master Charts Of Account Management. Upload the ESB export and it is matched to the right company automatically (cell A2 is verified). Only level 4 accounts take a Mapping, exactly like ESB; refreshing the master never touches it.
| Coa No | Level | Description | Branch | Memorial | Mapping |
|---|
Product Average Cost
| Seq | Product Name | Unit | COGS Avg (Amount) | %Diff |
|---|
Item Journal
Cost by Branch
| # | Branch | Location | Total Cost |
|---|
Cost by Purpose
| # | Purpose | Total Cost | % COGS Contribution | % Sales Comparison |
|---|
Cost by Category
| # | Category | Total Cost |
|---|
Cost by Sub Category
| # | Sub Category | Total Cost |
|---|
Daily Value Cost
Item Journal Detail
Void / Cancel
Source: ESB API (auto); an uploaded Cancel Menu Detail report replaces it for the period it covers. Void = the bill was already paid (the system had detected payment) and was then voided. Cancel = no payment was detected yet (bill unpaid) when the menu / bill was cancelled. Staff from the ESB API are shown by name once their POS user code is known (Menu Mapping ▸ POS User Names), else by code.
By Approver
iBy Order Staff
iBy Branch
iBy Reason
iDaily Void / Cancel
iVoid / Cancel Detail
iOutstanding PO to GR
Period selects Purchase Orders by Purchase Date (statuses Rejected / Waiting For Approval never count); every Goods Receipt of those POs counts, even when received after the period. Only GR lines of Transaction Type "Purchase Order" exist here; Goods Delivery / Simple Transfer are internal moves and are never stored. Source: Purchase Recapitulation + Goods Receipt Recap (With Value) uploads in Data Import, or the ESB Core API pull; the last load wins for its period, never both.
Received Value vs PO Value
iReceived Qty by Supplier
iPO to GR Detail
iOutstanding PR to PO / GTR / GD
Each stage selects its documents by its own date: PRs by PR Date, GTRs by Transfer Date, GDs by GD Date; follow-up documents count whatever their date, and Close Deliveries follow their GD. Branch = the PR's branch for stage 1 and the destination (the requester waiting for the goods) for GTR / GD / Closed. Source: the four uploads in Data Import (Purchase Request Realization, Transfer Report Flow, Goods Delivery Recap With Value, Close Delivery Value), or the ESB Core API pull; the last load wins for its period, never both.
PR not processed
iGTR not delivered
iGD not received
iClosed: Return / Cost
iOutstanding Lines by Branch
iOutstanding Detail
iOutstanding GR to Invoice
Period selects Goods Receipts by GR Date (statuses Rejected / New never count). A GR line is invoiced by the Purchase Invoice lines with the same GR number + product code + unit (the product name when there is no code), whatever the invoice date; uninvoiced qty = GR qty − returned qty − Σ Invoice Qty, never below 0; over-invoiced lines are flagged, never netted. Source: the Goods Receipt Recap upload or purchase pull (v1.45) plus the Purchase Invoice Report upload in Data Import, or the payables Pull from ESB.
GR not fully invoiced
iUninvoiced value
iOldest waiting GR
iPartly / over-invoiced
iUninvoiced Value by Branch
iUninvoiced Value by Supplier
iGR to Invoice Detail
iOutstanding Invoice / Disbursement to Payment
Period selects invoices and disbursements by their document date; open / overdue is read as of today. A document is PAID only when its payment voucher's release has a released date (an advance used inside a voucher counts when that voucher is released); ESB's own invoice status (Full Paid / Half Paid) only means a voucher exists and is shown as "ESB status". A Payment Method CREDIT disbursement is a payable; its due date is the document date. One document = one payable, whatever the source. Source: the Purchase Invoice / Disbursement / Purchase Payment / Release Payment uploads in Data Import, or the payables Pull from ESB.
Open documents
iIn payment process vs no voucher
iOverdue
iNot yet overdue
iAging of the Open Amount
iOpen Amount by Supplier
iOpen Documents Detail
iOutstanding Payment to Released
Period selects payment vouchers (VS) by their Doc. Date (the day the voucher was submitted to finance). Not yet released = no released date as of today; days waiting = today − the voucher date. Released: gap days = released date − voucher date (a voucher released in parts uses the last part's date). Only Purchase Payment vouchers appear here; Cash Payment (CO) releases are stored but never shown. Source: the Purchase Payment + Release Payment uploads in Data Import, or the payables Pull from ESB.
Not yet released
iWaiting time
iReleased
iRelease Gap Distribution
iAverage Gap by Supplier
iVoucher Detail
iSupplier Payable
No period here: everything is computed from the beginning of the stored data up to ONE as-of date. Advance = opening balance + released Advance Purchase documents − advance used by released vouchers (its own column, never netted against Payable). Payable Suspense = goods received but not invoiced (the GR to Invoice rule as of the date). Payable = the open amount of invoices and CREDIT disbursements; Not Yet Overdue + Overdue = Payable on every row. The view is only right when the stored history reaches back to go-live; watch the coverage line below.
Advance
iPayable Suspense
iPayable
iOverdue
iPayable by Supplier
iProjection (Preview 1)
| GROUPING | Projected Qty |
|---|
Selling History (Preview 2)
| GROUPING | Sales Date | Qty Sold |
|---|
Menu Item HPP Costing Configuration
Standard Cost (Manual HPP): edit with your known recipe cost per unit. System Cost (API-filled): sourced automatically from connected SaaS systems; shows '—' until a source provides it.
| Seq. # | Menu Item Name | Category | Standard Cost (Manual HPP) | System Cost (API-filled) |
|---|
User Access & Login Maintenance
| Username | Full name | Role | Status | Last login | Actions |
|---|
ESB API: Realtime Sales Sync
Loading status…
Data Source
Choose how SALESDASHBOARD receives transactions. Whichever source is active, raw rows are stored first, validated against the Mapping Template Report below, and only then shown on the dashboard.
Import ESB Data
Upload the three ESB exports as CSV or Excel. Columns are matched by header name, so column order does not matter. Each upload is recorded below and can be removed as a unit. The Cancel Menu Detail report (Excel, Type "Cancel / Void (Default)") replaces its own period on every upload, so re-uploading never duplicates. It is optional: Void / Cancel comes from the ESB API sync automatically; an uploaded report replaces the API figures for the period it covers and teaches the staff names behind the POS user codes.
Mapping Template Report
Reports are ingested raw; nothing in the source file is edited. This mapping decides how each file is validated and how its rows roll up on the dashboard. A Sales Recapitulation upload is rejected if its Company (cell B8), or any row's Brand or Branch, is not listed here.
Organization Structure
Company → Brand → Branch (consolidation)Built from the groupings and aliases above. Each brand belongs to exactly one company; each branch to exactly one brand. Reports (Sales Year, Target Ops) consolidate using this structure.
| Company | Brand | Branch |
|---|
Recent Imports
| When | Type | File | Rows | By | Actions |
|---|
Browser Tab Title
Shown in the browser tab. Recommended: keep it under 60 characters so it isn't truncated.
Icon Logo
Replaces the flame logo on the login page, the sidebar, and the browser favicon.
Recommended: square PNG or SVG with transparent background, 512 × 512 px (min 128 × 128). Max 30 MB.
Login Background
Full-screen image behind the login card (a dark overlay is applied for readability).
Recommended: landscape JPG or WEBP, 1920 × 1080 px (16:9), under ~2 MB for fast loads. Max 30 MB.
ESB API Connection
Connect this dashboard to ESB OMS and Core: two APIs with two base URLs. OMS (static token from your ESB PIC) pulls sales and the General Ledger automatically; Core (Core username/password) feeds Stock Movement, Item Journal and System Cost. Leave a base URL blank to use the default shown. Full setup guide: see ESB-API-MANUAL.md in the release.
One row per company, each with its own Bearer token from ESB. Companies come from Data Import › Mapping Template (the raw Company, not the grouping). Leave a token blank when saving to keep the stored one.
| Company | Static token (OMS) | Branch codes | Core username | Core password |
|---|
Core username/password are the ESB Core login for that company, needed for Stock Movement, Item Journal and System Cost (menu HPP via BOM lastHpp). Blank keeps the stored password.
A Core API login logs out any other session using the same Core user: use a dedicated API user, not someone's daily login.
Same rules as the sales sync, on their own schedules. General Ledger pulls the last N days for every connected company (replacing matching date + account + branch rows) and feeds the Profit Loss Report. System Cost refreshes the menu HPP from the BOM (needs Core username/password above).
Key Color
The accent color used across the dashboard: buttons, highlights, active menu, and charts. Pick with the color picker or type a hex code (e.g. #E8622C). Default is the ember orange.
Changes apply after a refresh (the logo, title, favicon and key color are set when the page loads).