Jump to main content
Back to Projects
Internal Business DashboardProject20263 months

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

Full-Stack DevelopmentDatabase DesignData ReconciliationFinancial ReportingRole-Based Access ControlApplication SecurityLinux DeploymentTeam Collaboration

Tools & Software

Next.js 16React 19TypeScriptTailwind CSSExpress.jsPostgreSQLRedisDockerPM2EChartsExcelJSPapaParsejsPDFreact-grid-layout

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

ModuleWhat it tracksKey features
OPEX MonitoringOperational budget vs. realizationDaily CSV imports, snapshots, budget-reference mapping, trend charts
Persekot (Cash Advance)Cash advances and their settlement per regionCascading input forms, receipt attachments, admin validation, CSV / Excel export
PAGU Non-POOutsourced-staff contract budgetExcel upload for overtime, travel and shift allowances; variable cost per section; top-up and relocation log; training and assignment records
Vehicle MonitoringOperational vehicle rentalsCRUD, 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 →