LTT Expense App — Build Standard & Handoff Kit
A reusable standard for producing a client expense listing, the interactive dashboard
(App.html), and the commission report — consistently, every time.
Kit files
- LTT_ExpenseApp_Template.html — the branded app shell. Reuse as-is; only swap the data block.
- LTT_ExpenseApp_Standard.md — this document (rules + brand + the paste-in prompt).
1. What we produce (deliverables)
<Client>_<Year>_ExpenseListing.xlsx— 4 sheets:1-Expense Listing— every line, coded, with columns: No. | Date | Supplier/Payee | Bill/Ref No. | Description | Amount (RM) | A/C Code | LTT Account Name | Source | Incl? | Flag/Review.2-Summary by A_C Code— SUMIFS/COUNTIFS by code, Incl?=Y only, grand total.3-TNG Transactions— every Touch 'n Go line + toll/parking/reload reconciliation.4-Notes & Review— assumptions, drawings treatment, flags, gaps.App.html— self-contained dashboard (Summary / Listing / TNG / Notes tabs).CommissionReport.html— commission split by purpose, by recipient & year, with source-receipt image previews.
Every deliverable must be self-contained (no internet needed) and carry zero Excel formula errors.
2. Inputs (from the client's Google Drive)
- e-Receipts — digitally-named receipt PDFs. Filename convention encodes everything:
<Client>_Receipt-<ref>-<YYMMDD>-<Vendor>-<optional label>-RM<amount>.pdfParse the filename; do not OCR these. - Scanned hardcopy bills (e.g.
B4Binding-…folder) — batch scans, many receipts per PDF. OCR withread_file_content. - Touch 'n Go statements — one per cardholder/month. OCR every transaction.
- Chart of accounts —
LTTmy_ChartofAC-SP-Imp-220223.xlsx(sole-proprietor). This defines the codes below.
3. LTT account-code map (the standard coding)
| Category | Code | LTT account name |
|---|---|---|
| Food & drink (restaurants, cafes, kopitiam) | 96701000 |
IE - Food, & beverages |
| Bars / alcohol / clubs | 96691000 |
IE - Entertainment |
| Petrol / fuel | 96848100 |
IE - TRV - Petrol |
| Parking / valet | 96848200 |
IE - TRV - Parking fee |
| Touch 'n Go (reloads) | 96848300 |
IE - TRV - Touch N Go |
| Toll | 96848400 |
IE - TRV - Toll charges |
| Grab / taxi / transport | 96848900 |
IE - TRV - Transportation |
| Hotel / Airbnb | 96849200 |
IE - TRV - Hotel accomodation |
| Groceries / household / personal shopping | 96711000 |
PE - General supplies, groceries, & household exp. |
| Pharmacy / medical / clinic / TCM / dental | 96711100 |
PE - Pharmacy items, health, & medical supplies |
| Nails / beauty / spa / other personal | 96791000 |
PE - Other personal general exp. |
| Phone / internet (Maxis, Hotlink, Digi, wifi) | 96841000 |
PE - Telephone, & telecommunication exp. |
| Car service / tyres / windscreen / wiper | 96859000 |
IE - MVE - Upkeep of motor vehicle |
| Donations | 94681000 |
NOE - Donation |
| Software / subscriptions (Zoom, CapCut, etc.) | 92831000 |
IE - Software exp., & subscription |
| Advertising / marketing print (Meta ads, flyers) | 95651000 |
SDE - Advertisement |
| Commission / referral fees | 95671000 |
SDE - Commission |
| Postage / courier (Pos, EasyParcel) | 92802000 |
IE - Postage, & courier |
| Electricity (TNB) | 92691000 |
IE - Electricity |
| Water (Air Selangor / SAJ) | 92871000 |
IE - Water |
| Training / seminar | 92842000 |
IE - Training, & seminar |
| General service / office maintenance | 92713000 |
IE - General exp. |
| S/P Drawings (kept OUT of P&L) | 11210300 |
S/P C/A - Drawings |
4. Processing rules (apply every time)
Include-in-total flag (Incl?) — the P&L total sums only Incl?=Y. Set Incl?=N for:
- TNG reloads (code 96848300) — reloads are funding, not an expense.
- S/P Drawings (code 11210300) — kept out of the P&L (see below).
- Duplicates — a cross-source paper+digital pair of the same item, or duplicate e-Receipts
(e.g. an order-confirmation + a tax receipt for the same purchase).
S/P Drawings (code 11210300, Incl?=N) — money out that is not a P&L expense:
- Income tax (LHDN) and EPF (KWSP) payments.
- Nirvana lot transfer / purchase — payments for buying/transferring memorial lots
(identified from the receipt's Recipient Reference; see commission rules).
Touch 'n Go — list every transaction on sheet 3. In the P&L: - Claim actual toll + parking usage (aggregate lines: Toll → 96848400, Parking → 96848200). - Exclude reloads (funding). Dedupe duplicate statement files by (cardholder, date, time, desc, amount). - Note: TNG parking and paper parking receipts can overlap — flag for reconciliation.
Commission split (95671000) — CIMB/Public Bank transfer slips carry a Recipient Reference
the payer typed. Read it (pdftotext on the PDF, or read_file_content) and split:
- Reference contains lot / subsale / harmony / gracious → Lot transfer/purchase → S/P Drawings (11210300, out of P&L).
- Reference contains referral / referrer / commission (any spelling), or an AIA referrer fee → Referral/commission → 95671000.
- training / party / billing / other → Others — review individually.
USD receipts — keep the original; convert to RM at an estimated rate (state it, e.g. 4.50) and flag "replace with actual payment-date rate".
Flags — always surface, never silently drop: illegible OCR amounts, auto-classified F&B, unknown card-terminal merchants, password-protected/unreadable source files.
5. Brand standard (LTT / client identity)
Palette (CSS variables):
--green:#3E6B51; --green2:#56806A; --sage:#9DB6A3; --sun:#E0703A;
--ink:#2C2925; --bg:#F6F3EE; --card:#ffffff; --line:#E7E0D5; --mut:#857c6e;
--warn:#FBEEDD; --warnln:#E6B877; --excl:#F7E2D2; --good:#E7F0E8;
- Table headers: green
#3E6B51. Active tab underline: sun#E0703A. Header accent bar: green→sun gradient. - Row states: yellow
--warn= needs review; orange--excl= excluded from P&L. - Font: Segoe UI / Arial. Wordmark: 800 weight, charcoal
--ink. Header sits on white; body on warm off-white--bg.
Logo emblem (inline SVG — leaf fan + sunrise):
<svg class="emblem" viewBox="0 0 120 104" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(60,86)">
<path d="M0,0 C-6.5,-13 -6.5,-38 0,-52 C6.5,-38 6.5,-13 0,0 Z" transform="rotate(-46)" fill="#9DB6A3"/>
<path d="M0,0 C-6.5,-13 -6.5,-38 0,-52 C6.5,-38 6.5,-13 0,0 Z" transform="rotate(-23)" fill="#56806A"/>
<path d="M0,0 C-6.5,-13 -6.5,-38 0,-52 C6.5,-38 6.5,-13 0,0 Z" transform="rotate(0)" fill="#3E6B51"/>
<path d="M0,0 C-6.5,-13 -6.5,-38 0,-52 C6.5,-38 6.5,-13 0,0 Z" transform="rotate(23)" fill="#56806A"/>
<path d="M0,0 C-6.5,-13 -6.5,-38 0,-52 C6.5,-38 6.5,-13 0,0 Z" transform="rotate(46)" fill="#9DB6A3"/></g>
<path d="M43,88 A17,17 0 0 1 77,88 Z" fill="#E0703A"/>
<rect x="36" y="88" width="48" height="3.2" rx="1.6" fill="#E0703A"/>
</svg>
(If the client sends a real logo PNG, base64-embed it in the header instead — keep the same palette.)
6. App data schema (what the template expects)
The dashboard reads one JSON block (<script id="DATA">). Produce it from the workbook:
listing[] : {no, date "YYYY-MM-DD", payee, ref, desc, amt (number|null),
code, acct, src, incl ("Y"|"N"), flag}
summary[] : {code, acct, cnt, tot} // Incl=Y rows only, per LTT code
grand : {cnt, tot} // P&L total (Incl=Y only)
drawings : {items, total} // S/P Drawings kept OUT of P&L
tng[] : {card, stmt, date, time, desc,
type ("Toll"|"Parking"|"Reload"|"Purchase"|"Other"), amt}
To reuse the template: open LTT_ExpenseApp_Template.html, replace the JSON in the
DATA block, and change the <h1> wordmark + subtitle to the client/year. Nothing else changes.
7. Copy–paste prompt for the next chat
Build a client expense listing to LTT internal standard, following the LTT Expense App Build Standard.
Client: [name]. Year: [YYYY]. Google Drive source folders: - e-Receipts: [path] - Scanned hardcopy bills: [path] - Touch 'n Go statements: [path] - Chart of accounts:
LTTmy_ChartofAC-SP-Imp-220223.xlsxDo this: 1. Extract — parse e-Receipt filenames (vendor/date/ref/amount; don't OCR them); OCR the scanned bills (many receipts per scan) and every TNG transaction. Use subagents in parallel for the OCR so the raw text stays out of the main context. 2. Code every line to the LTT chart using the standard map (Food 96701000, Petrol 96848100, Parking 96848200, Toll 96848400, TNG reload 96848300, Transport 96848900, Entertainment 96691000, Groceries/household 96711000, Pharmacy 96711100, Personal 96791000, Telco 96841000, Motor-vehicle upkeep 96859000, Donation 94681000, Software 92831000, Advertising 95651000, Commission 95671000, Postage 92802000, Electricity 92691000, Water 92871000, Training 92842000, General 92713000, S/P Drawings 11210300). 3. Apply the rules:
Incl?=Yfeeds the P&L total; setIncl?=Nfor TNG reloads, duplicates, and S/P Drawings. Treat income tax/EPF and Nirvana lot transfers/purchases as S/P Drawings (11210300, out of P&L). For TNG, claim actual toll+parking, exclude reloads, dedupe duplicate statements. For commission payments, read each transfer slip's Recipient Reference and split into lot transfer→drawings, referral/commission→95671000, others→review. Convert USD at a stated estimated rate and flag. Never silently drop anything — flag illegible/duplicate/uncertain items. 4. Build<Client>_<Year>_ExpenseListing.xlsx(4 sheets: Listing, Summary by code [SUMIFS, Incl=Y only], TNG Transactions [+ reconciliation], Notes), then recalculate formulas and confirm zero errors. 5. Build the dashboard by reusingLTT_ExpenseApp_Template.html: emit the DATA JSON (schema in the Build Standard §6) from the workbook, drop it into the template, and set the header to the client/year. Keep the LTT brand (palette + leaf/sunrise logo) unchanged. 6. If commission/lot payments exist, also build a commission report grouped by purpose → recipient → year, with each source receipt rendered to an embedded JPG preview.Ask me to confirm: the nature of any commission/lot payments, income-tax/EPF treatment, and business-use proportion of personal-looking items, before finalising.
Prepared as an internal LTT standard. Review and adapt paths/rates per engagement.