ICONNET Finance Dashboard - OPEX, Cash Advance & Contract Monitoring
Internal finance dashboard for PLN Icon Plus that replaced spreadsheet-based reporting with four modules (OPEX monitoring, cash-advance tracking, outsourced-staff contract budgets, and vehicle monitoring) on a Next.js + Express + PostgreSQL stack, hardened after a full penetration test.
Role
Full Stack Developer Intern
Client
PLN Icon Plus (ICONNET) - SBU Sulawesi & IBT I
Team
4-person Intern Team
Timeline
3 months • 2026
Problem
Budget realization, cash advances and outsourced-staff costs were tracked in separate Excel files that finance staff reconciled by hand, which made reporting slow and figures inconsistent between regions.
Solution
Built a monorepo with a Next.js dashboard and an Express API on PostgreSQL: file uploads with a pending-to-confirmed review step, relational models that reconcile transactions against budget references, draggable chart widgets, and CSV / Excel / PDF exports.
Impact
Four reporting workflows moved into one role-based dashboard, deployed on a Hetzner Linux VPS, with manual reconciliation replaced by automated imports and every finding from the penetration test remediated before rollout.
Skills & Tools
Skills Applied
Tools & Software
Project Overview
During my internship at PLN Icon Plus (ICONNET), SBU Sulawesi & IBT I, I worked in a 4-person intern team on an internal dashboard that moves the unit's financial monitoring out of scattered spreadsheets and into a single web application. It covers four areas of operational spending.
Modules
| Module | What it tracks | Key features |
|---|---|---|
| OPEX Monitoring | Operational budget vs. realization | Daily CSV imports, snapshots, budget-reference mapping, trend charts |
| Persekot (Cash Advance) | Cash advances and their settlement per region | Cascading input forms, receipt attachments, admin validation, CSV / Excel export |
| PAGU Non-PO | Outsourced-staff contract budget | Excel upload for overtime, travel and shift allowances; variable cost per section; top-up and relocation log; training and assignment records |
| Vehicle Monitoring | Operational vehicle rentals | CRUD, analytics endpoints, summary charts |
Architecture
A single npm-workspaces monorepo with two apps:
apps/web— Next.js 16 (App Router, TypeScript, Tailwind CSS 4). Charts use ECharts; dashboard widgets can be dragged and resized with react-grid-layout; exports use ExcelJS, PapaParse and jsPDF.apps/api— Express REST API on PostgreSQL, with Redis for server-side caching of heavy summary queries and a client-side page cache on top.
Upload & Reconciliation Flow
Most data arrives as Excel or CSV exports from other systems, so imports were designed to be reviewed before they affect any figure:
Upload .xlsx / .csv (superadmin)
↓
Parse headers → create upload batch (status: pending)
↓
Bulk insert rows, enrich each row from master data (e.g. employee ID → section)
↓
Review → confirm (status: confirmed) → data appears in charts and exports
Rows are joined to reference tables (budget codes, products, staff master data), so each transaction is reconciled against the budget line it belongs to instead of being matched by hand.
Security
The application went through a full penetration-testing cycle before rollout. The fixes included:
- Authentication — JWT with a 24-hour expiry and a server-side blacklist so tokens are revoked on logout; passwords hashed with bcrypt.
- Brute-force protection — login limited to 5 attempts per IP every 15 minutes.
- File uploads — type checked by magic bytes, not just the file extension.
- Input & headers — input sanitization in middleware and security headers handled at the Nginx layer.
- Authorization — four roles (superadmin, admin, staff, viewer) checked on both the web middleware and the API, e.g. only admins validate cash-advance transactions and only superadmins confirm uploads.
Deployment
The first version ran on an office PC for the local network: PostgreSQL in Docker, the API and web app under PM2 with auto-start on boot, and a start script that detects the machine's LAN IP and rebuilds the frontend when it changes, so non-technical staff could keep it running.
It was then moved to a Hetzner Linux VPS behind Nginx, which is where the penetration test and security hardening took place.
Key Takeaways
- Treating every import as a reviewable batch made the dashboard trustworthy for finance users.
- Security has to be designed in for internal tools too; the pentest findings shaped the auth and upload code.
- Piloting on the office LAN first let finance staff validate the workflows before the move to a hardened cloud server.
- Splitting modules across a 4-person team worked because the upload, auth and reference-data patterns were shared.
Company: PLN Icon Plus (ICONNET), SBU Sulawesi & IBT I · Period: February – April 2026 · Source code is private.
Project Metrics
4 modules: OPEX monitoring, cash advance (persekot), outsourced-staff contract budget, vehicle monitoring
Next.js 16 + Express monorepo on PostgreSQL with Redis server-side caching
Excel / CSV uploads with a pending → confirmed review step before data reaches the charts
4 access levels (superadmin, admin, staff, viewer) enforced on both web and API
Security hardening: JWT blacklist on logout, file magic-byte validation, login rate limiting (5 attempts / 15 min), bcrypt hashing
CSV, Excel and PDF exports with configurable column ordering
Draggable, resizable dashboard widgets built with react-grid-layout and ECharts
Piloted on the office LAN, then deployed to a Hetzner Linux VPS (Dockerized PostgreSQL, PM2)
Project Tags
Related Projects
View all projects →Cirebon Kuring Cafe
Next.js 15 · React 19 · TypeScript
Cirebon Kuring Cafe - Cafe Management System
Cafe operating system spanning 4 apps on one Supabase backend: QR table ordering, a Flutter staff tablet for 4 roles, an employee portal, and an owner dashboard, backed by 69 migrations and 15+ edge functions.

Urban Complaint Pattern Mining on NYC 311 Data (21M+ Records)
Data mining of 21.3M NYC 311 requests that found a six-complaint building 'syndrome' (mean lift 8.48) and validated it against 11M inspection records: 12-44x higher violation rates.

Medical Anamnesis Chatbot with NLP (Chatbot PUSTU)
Indonesian medical anamnesis chatbot for Puskesmas reaching 92.61% intent accuracy across 14 classes, trained on 14,000 samples generated with Gemini 2.0 Flash and a custom preprocessing and NER pipeline built from scratch.
