Portal Inventory Management System

A modern, high-performance web application for managing inventory, requests, and structured multi-tier approvals. Built with Next.js, Prisma, and PostgreSQL.


🌟 Key Features

  • Hierarchical Division System: Organize items and users into precise Divisions (e.g., IT, Gudang, Sales) and Categories.
  • Multi-Step Approval Workflow: Automated 2-step approval flow routing requests to the correct Warehouse and Division managers.
  • Real-Time Inventory Tracking: Full visibility into available, borrowed, on-trial, and damaged items.
  • Role-Based Access Control (RBAC): Strict separation of privileges across five different user roles.
  • Comprehensive Activity Logging: Every action, request, and approval is recorded for easy auditing.
  • Enterprise-Ready Deployment: Packaged for Docker Swarm and high availability environments.

👥 User Roles & Permissions

Sistem ini memiliki 5 tingkatan pengguna (roles) dengan hak akses yang berbeda-beda untuk menjaga alur kerja yang terstruktur:

1. User (Karyawan Biasa)

  • Akses: Hanya bisa me-request barang dari divisi manapun.
  • Batasan: Tidak memiliki akses ke manajemen inventaris maupun Approval. Hanya bisa melihat riwayat request milik sendiri.

2. Warehouse (Tim Gudang)

  • Tugas Utama: Mengontrol fisik barang dan memberikan Persetujuan Tahap 1 (Approve 1).
  • Akses:
    • Bisa me-request barang.
    • Menyetujui Tahap 1 untuk SEMUA jenis barang yang di-request, tanpa mempedulikan divisi.
    • Memiliki hak untuk menambah/mengedit master data barang (Items).

3. Approver (Kepala Divisi / Manager)

  • Tugas Utama: Memberikan Persetujuan Tahap 2 (Approve 2).
  • Akses:
    • Bisa me-request barang.
    • Hanya bisa melakukan Approve 2 untuk barang-barang yang kategorinya berada di bawah Divisi mereka sendiri.
    • Bisa melihat riwayat approval untuk divisi mereka.

4. Finance (Tim Keuangan)

  • Tugas Utama: Mengawasi arus barang dan menyetujui barang-barang khusus milik divisi Finance.
  • Akses:
    • Bisa me-request barang.
    • Berfungsi layaknya Approver untuk barang di bawah Divisi Finance.
    • Keistimewaan: Bisa melihat SEMUA riwayat approval dan request dari seluruh divisi untuk kebutuhan audit/laporan.

5. Super Admin

  • Tugas Utama: Manajemen sistem dan infrastruktur.
  • Akses:
    • Tidak ikut serta dalam alur request maupun approval.
    • Akses penuh (CRUD) ke pengaturan master Divisi, Kategori, User, dan Pengaturan Sistem (termasuk notifikasi Telegram/Email).
    • Bisa melihat seluruh log aktivitas dan riwayat persetujuan secara mode baca (read-only).

🚀 Deployment Options

This application supports both Docker Swarm (for clustered environments) and Regular Docker Compose (for single-server deployments).

  1. Create a new Stack in Portainer.
  2. Select Repository and connect to your Git repository.
  3. In the Environment variables section, define:
    • DATABASE_URL: postgresql://USER:PASS@HOST:5432/DB_NAME?schema=public
    • SESSION_SECRET: your_random_secret_string
  4. Click Deploy the stack.

Option 2: Regular Docker Compose (Single Server)

If you prefer running it directly on a single VPS without Swarm:

  1. Clone this repository:
    git clone https://git.proit.id/ypratama/portal-inventory.git
    cd portal-inventory
    
  2. Simply run the application (the database will configure itself automatically):
    docker-compose up -d
    

(Note: If you want to use your own external database instead of the built-in one, simply delete the postgres-db block from docker-compose.yml before running).

Option 3: Raw Docker Run Command

docker run -d --name portal-inventory \
  -p 3000:3000 \
  -e DATABASE_URL="postgresql://USER:PASS@HOST:5432/DB_NAME?schema=public" \
  -e SESSION_SECRET="your_random_secret_string" \
  git.proit.id/ypratama/portal-inventory:latest

⚙️ Initial Setup (Production)

To secure the application, there are no default user credentials provided in the codebase. When deploying for the first time, you must create the initial Super Admin account manually via the database.

Connect to your PostgreSQL database and execute the following SQL command:

INSERT INTO "User" (username, email, password, name, role, "failedLoginAttempts", "updatedAt") 
VALUES ('superadmin', 'admin@super', 'your_secure_password', 'Super Admin', 'super_admin', 0, NOW());

After executing the query, you can log in to the web interface using:

  • Email: admin@super
  • Password: your_secure_password
S
Description
No description provided
Readme
664 KiB
0 Stars 1 Watchers 0 Forks
Languages
TypeScript 95.4%
CSS 3.3%
Dockerfile 1.1%
JavaScript 0.2%