01
About this portlet
Shows Expense reports awaiting approval or payment on a NetSuite home dashboard as a table of ten rows per page, with the report, employee, status, date, days waiting and total. Sort by Days waiting to find reports that are stuck.
After import, give the report an audience. Then, on a NetSuite dashboard, choose Personalize and add a Custom Portlet. On the new portlet, choose Set Up and pick Advanced Report - Expense reports awaiting approval or payment. The portlet shows only to people who can open the report.
02
What it carries
The portlet reads 1 report. They travel in the same file, so the import creates them first.
03
Sample preview
Fictional figures in the shape you will see. Yours come from your account.
| Expense report | Employee | Status | Date | Days waiting | Purpose | Currency | Total (report currency) | Total |
|---|---|---|---|---|---|---|---|---|
| EXP1182 | Dana Whitfield | Expense Report : Pending Supervisor Approval | 2026-09-05 | 19 | Client visit, Denver | US Dollar | 1,240.80 | 1,240.80 |
| EXP1190 | Marco Ruiz | Expense Report : Pending Accounting Approval | 2026-09-12 | 12 | Trade show booth | US Dollar | 3,875 | 3,875 |
| EXP1194 | Priya Natarajan | Expense Report : Approved by Accounting | 2026-09-16 | 8 | Training course | Canadian Dollar | 950 | 693.50 |
04
The SuiteQL
This is the query each report runs. Read it, copy it, or change it after import.
SELECT t.id AS report__id,
NVL(t.tranid, t.transactionnumber) AS report_no,
BUILTIN.DF(t.entity) AS employee,
BUILTIN.DF(t.status) AS status,
TO_CHAR(t.trandate, 'YYYY-MM-DD') AS report_date,
TRUNC(SYSDATE) - TRUNC(t.trandate) AS days_waiting,
t.memo AS purpose,
BUILTIN.DF(t.currency) AS currency,
ABS(t.foreigntotal) AS total_fx,
ABS(t.foreigntotal) * t.exchangerate AS total
FROM transaction t
WHERE t.type = 'ExpRept'
AND t.status IN ('ExpRept:B', 'ExpRept:C', 'ExpRept:F', 'ExpRept:G', 'B', 'C', 'F', 'G')
ORDER BY t.trandate