The problem
Trips lived in paper, email and separate Excel files. Accounting chased travellers for documents and amounts by hand, could not tell how long anything had waited, had no way to check a trip was on record before paying a cash advance, and managers could not see who went where, when, or for how much.
What I built
A Next.js + ASP.NET Core app where each trip moves planned → travelling → documents → accounting review → approved or returned. Travellers get the trip form, calendar, map and dashboard; Accounting gets an expense-record approval screen with queues by status and month, every decision kept as history and sent out by email.
Key features
- Four trip types (Customer Visiting, Business Trip, Booth, Outstation) with destination, dates, officer, attendees, agenda and budget
- Three required documents: the Business Plan before travelling, the Report and Expense summary after; once all are in with the amount, the trip joins the accounting queue on its own
- Accounting opens and ticks each document, then approves, or returns with a note; approved trips lock
- Accounting queue in tabs (pending, approved, returned, document follow-up), split by month, with totals, the longest wait and anything over seven days
- A “New trips” tab lets Accounting check the budget and Business Plan of trips not yet travelled before paying a cash advance
- Emails tell Accounting when a trip is ready, tell the owner the approve or return result, and remind anyone missing documents, at most once every 24 hours
- Travel calendar, monthly world map, a dashboard of trips, travel days and approved budget against the previous period, and an Excel report by month range
- Admin, Accounting and user roles, with view or approve rights on the expense screen grantable to others; company SSO sign-in, Thai and English
Under the hood
- “Ready for accounting” is derived from the data (three documents, an amount, and the traveller back home), so nobody has to press submit; every approve, return and resubmit is written to its own history table
- “Everyone sees, only the creator edits” and the expense-approval permission are enforced in both UI and API; Accounting reviews trips but cannot edit them
- n8n sends its own reminders but writes to the same send log, so both share one cooldown; admins edit templates and SMTP settings in the app, with the password encrypted by ASP.NET Data Protection