Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🏥 SIMRS FEFO - Backend Module

Backend REST API untuk Sistem Manajemen Stok & Kedaluwarsa Obat Rumah Sakit (SIMRS) berbasis logika FEFO (First Expired, First Out).

Project ini dibangun menggunakan Go (Golang), Gin Web Framework, GORM ORM, PostgreSQL, dan JWT Authentication.


🔗 Modul Terkait


🛠️ Teknologi & Tools

  • Bahasa Pemrograman: Go 1.26+
  • Framework Web: Gin Web Framework
  • Database & ORM: PostgreSQL & GORM
  • Autentikasi: JWT (github.com/golang-jwt/jwt/v5) & bcrypt
  • Konfigurasi Environment: github.com/joho/godotenv

📁 Struktur Direktori Backend

server/
├── config/
│   ├── db.go            # Koneksi PostgreSQL & inisialisasi GORM
│   └── seed.go          # Seeder data dummy Obat & Batch FEFO otomatis
├── handlers/
│   ├── auth_handlers.go     # Handler registrasi & login user
│   └── medicine_handlers.go # Handler CRUD Obat & Pemotongan Stok FEFO
├── middleware/
│   ├── auth.go          # Middleware verifikasi JWT Bearer Token (RequireAdmin)
│   └── cors.go          # Middleware Cross-Origin Resource Sharing (CORS)
├── models/
│   ├── User.go          # Struct data User (Admin/Staff)
│   ├── Medicine.go      # Struct data Master Obat
│   └── medicineBatch.go # Struct data Batch Stok & Expired Date
├── routes/
│   └── route.go         # Router API Gin (/api/v1) & proteksi JWT
├── services/
│   └── medicine_service.go # Logika bisnis pemotongan stok FEFO (DB Transaction & Lock)
├── utils/
│   ├── jwt.go           # Generasi token JWT
│   └── password.go      # Hashing & verifikasi password bcrypt
├── .env                 # File environment variabel database & JWT
├── go.mod               # File definisi Go Module
├── go.sum               # File checksum dependency Go
└── main.go              # Entry point aplikasi server

💡 Konsep Logika FEFO (First Expired, First Out)

Prinsip FEFO memastikan bahwa obat dengan tanggal kedaluwarsa (expired date) paling dekat akan selalu diambil/dipotong terlebih dahulu.

Logika pemotongan berada di services/medicine_service.go:

  1. Membuka transaksi database (tx := config.DB.Transaction).
  2. Mengambil batch obat yang aktif (stock > 0 dan expired_date > NOW()).
  3. Mengurutkan batch berdasarkan tanggal expired secara ascending (ORDER BY expired_date ASC).
  4. Mengunci baris data menggunakan SELECT FOR UPDATE (clause.Locking{Strength: "UPDATE"}) untuk mencegah data race akibat permintaan bersamaan.
  5. Memotong jumlah stok berurutan hingga kuantitas yang diminta terpenuhi.

⚙️ Konfigurasi Environment (.env)

Buat file .env di dalam folder server/:

PORT=8080
DB_HOST=localhost
DB_USER=postgres
DB_PASSWORD=123
DB_NAME=sistem-obat
DB_PORT=5432
JWT_SECRET=supersecretkey_simrs_123

🚀 Langkah-Langkah Instalasi & Jalankan Server

1. Prerequisites

  • Go 1.26+ terinstall.
  • Database PostgreSQL sudah berjalan dan database bernama sistem-obat telah dibuat.

2. Download Dependencies & Tidy Module

cd server
go mod tidy

3. Jalankan Server Go

go run main.go

Server akan otomatis melakukan Auto-Migrate tabel database dan menjalankan Seeder data dummy obat jika database masih kosong. HTTP Server berjalan pada http://localhost:8080.


📑 Dokumentasi API Endpoint (/api/v1)

🔓 Public Endpoints (Tanpa Auth)

1. Registrasi User Baru

  • Endpoint: POST /api/v1/auth/register
  • Request Body:
    {
      "username": "admin_farmasi",
      "password": "password123"
    }
  • Response (201 Created):
    { "message": "Registrasi pengguna berhasil" }

2. Login User (Mendapatkan Token JWT)

  • Endpoint: POST /api/v1/auth/login
  • Request Body:
    {
      "username": "admin_farmasi",
      "password": "password123"
    }
  • Response (200 OK):
    { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." }

🔒 Protected Endpoints (Wajib Header Authorization: Bearer <TOKEN>)

3. Get All Medicines / Search

  • Endpoint: GET /api/v1/medicines
  • Query Parameter (Opsional): ?search=paracetamol
  • Response (200 OK):
    {
      "data": [
        {
          "ID": 1,
          "name": "Paracetamol 500mg",
          "code": "OBT-PCT-500",
          "batches": [
            {
              "ID": 1,
              "batch_number": "PCT-2026-B1",
              "stock": 40,
              "expired_date": "2026-10-01T00:00:00Z"
            }
          ]
        }
      ]
    }

4. Get Medicine By ID

  • Endpoint: GET /api/v1/medicines/:id
  • Response (200 OK):
    {
      "data": {
        "ID": 1,
        "name": "Paracetamol 500mg",
        "code": "OBT-PCT-500",
        "batches": [...]
      }
    }

5. Tambah Master Obat Baru

  • Endpoint: POST /api/v1/medicines
  • Request Body:
    {
      "name": "Paracetamol 500mg",
      "code": "OBT-PCT-500",
      "batches": [
        {
          "batch_number": "BATCH-202608-01",
          "stock": 50,
          "expired_date": "2026-10-31T00:00:00Z"
        }
      ]
    }
  • Response (201 Created):
    { "data": { "ID": 1, "name": "Paracetamol 500mg", "code": "OBT-PCT-500" } }

6. Update Master Data Obat

  • Endpoint: PUT /api/v1/medicines/:id
  • Request Body:
    {
      "name": "Paracetamol Forte 650mg",
      "code": "OBT-PCT-650"
    }
  • Response (200 OK):
    { "message": "Data obat berhasil diperbarui", "data": { ... } }

7. Hapus Master Data Obat

  • Endpoint: DELETE /api/v1/medicines/:id
  • Response (200 OK):
    { "message": "Obat berhasil dihapus" }

8. Eksekusi Pemotongan Stok FEFO

  • Endpoint: POST /api/v1/medicines/deduct-fefo
  • Request Body:
    {
      "medicine_id": 1,
      "quantity": 30
    }
  • Response (200 OK):
    { "message": "Pemotongan stok FEFO berhasil dilaksanakan!" }

📦 Data Seeder Otomatis (config/seed.go)

Ketika server pertama kali dinyalakan dan tabel medicines kosong, seeder akan memasukkan data awal secara otomatis:

  • Paracetamol 500mg (OBT-PCT-500) — 3 Batch (Stok: 40, 100, 150)
  • Amoxicillin 500mg (OBT-AMX-500) — 2 Batch (Stok: 30, 80)
  • Cefadroxil 500mg (OBT-CFD-500) — 1 Batch (Stok: 60)
  • Ibuprofen 400mg (OBT-IBU-400) — 1 Batch (Stok: 90)
  • Vitamin C 1000mg (OBT-VTC-1000) — 1 Batch (Stok: 200)

💻 Pengujian Terhubung dengan Frontend

Untuk menjalankan antarmuka pengguna berbasis React, silakan buka dokumentasi frontend: ➡️ Instruksi Jalankan Frontend Module

About

Backend REST API untuk Sistem Manajemen Stok & Kedaluwarsa Obat Rumah Sakit (SIMRS) berbasis logika FEFO (First Expired, First Out) menggunakan Go, Gin, GORM, dan PostgreSQL.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages