Advertisement

Desain Database dan API CRUD untuk Aplikasi POS dengan Express.js dan PostgreSQL

 

Pernah kepikiran gimana sistem kasir di minimarket bisa dengan cepat dan akurasi tinggi mencatat transaksi? Jawabannya adalah database yang baik dan API CRUD yang solid!

Di artikel ini, kita akan membangun struktur database optimal untuk aplikasi POS menggunakan PostgreSQL dan membuat API CRUD dengan Express.js.

Siap? Yuk, gaskeun!

1. Desain Database untuk Produk dan Transaksi

Sistem POS membutuhkan minimal dua tabel utama:

  • products → Menyimpan daftar produk.
  • transactions → Menyimpan informasi transaksi (seperti total harga dan metode pembayaran).

Struktur ini memungkinkan kita untuk mengelola stok, mencatat transaksi, dan menampilkan laporan penjualan dengan rapi.

2. Membuat Model dan Skema Tabel di PostgreSQL

2.1. Tabel Produk

Tabel ini akan menyimpan data produk seperti nama, harga, dan stok.

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    price NUMERIC(10,2) NOT NULL,
    stock INT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

 Penjelasan:

  • id → Primary key unik untuk setiap produk.
  • name → Nama produk.
  • price → Harga dalam format desimal (misal: Rp 10.000,50).
  • stock → Jumlah stok tersedia.
  • created_at → Timestamp untuk mencatat kapan produk ditambahkan.

2.2. Tabel Transaksi

Tabel ini menyimpan informasi transaksi.

CREATE TABLE transactions (
    id SERIAL PRIMARY KEY,
    total NUMERIC(10,2) NOT NULL,
    payment_method VARCHAR(50) NOT NULL CHECK (payment_method IN ('cash', 'card', 'ewallet')),
    transaction_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

 Penjelasan:

  • id → Primary key unik untuk setiap transaksi.
  • total → Total harga dari semua produk yang dibeli.
  • payment_method → Metode pembayaran (hanya bisa 'cash', 'card', atau 'ewallet').
  • transaction_date → Timestamp transaksi dilakukan.

3. Membuat API Endpoints untuk Produk

Sekarang, kita buat API untuk menambah, mengambil, mengupdate, dan menghapus produk.

3.1. Menambahkan Produk Baru

Tambahkan endpoint di routes/productRoutes.js:

const express = require("express");
const router = express.Router();
const pool = require("../config/db");

// Menambahkan produk baru
router.post("/", async (req, res) => {
    const { name, price, stock } = req.body;
    try {
        const { rows } = await pool.query(
            "INSERT INTO products (name, price, stock) VALUES ($1, $2, $3) RETURNING *",
            [name, price, stock]
        );
        res.json(rows[0]);
    } catch (error) {
        res.status(500).json({ error: "Gagal menambahkan produk" });
    }
});

module.exports = router;

Coba dengan Postman atau Curl:

curl -X POST http://localhost:3000/products \
     -H "Content-Type: application/json" \
     -d '{"name": "Teh Botol", "price": 5000, "stock": 50}'

3.2. Mengambil Daftar Produk

Tambahkan endpoint GET di routes/productRoutes.js:

// Mengambil daftar produk
router.get("/", async (req, res) => {
    try {
        const { rows } = await pool.query("SELECT * FROM products");
        res.json(rows);
    } catch (error) {
        res.status(500).json({ error: "Gagal mengambil produk" });
    }
});

Coba akses:

http://localhost:3000/products

3.3. Mengupdate dan Menghapus Produk

Update Produk

router.put("/:id", async (req, res) => {
    const { id } = req.params;
    const { name, price, stock } = req.body;
    try {
        const { rows } = await pool.query(
            "UPDATE products SET name = $1, price = $2, stock = $3 WHERE id = $4 RETURNING *",
            [name, price, stock, id]
        );
        res.json(rows[0]);
    } catch (error) {
        res.status(500).json({ error: "Gagal mengupdate produk" });
    }
});

Hapus Produk

router.delete("/:id", async (req, res) => {
    const { id } = req.params;
    try {
        await pool.query("DELETE FROM products WHERE id = $1", [id]);
        res.json({ message: "Produk berhasil dihapus" });
    } catch (error) {
        res.status(500).json({ error: "Gagal menghapus produk" });
    }
});

4. Membuat API Endpoints untuk Transaksi

4.1. Menambahkan Transaksi

Tambahkan endpoint di routes/transactionRoutes.js:

router.post("/", async (req, res) => {
    const { total, payment_method } = req.body;
    try {
        const { rows } = await pool.query(
            "INSERT INTO transactions (total, payment_method) VALUES ($1, $2) RETURNING *",
            [total, payment_method]
        );
        res.json(rows[0]);
    } catch (error) {
        res.status(500).json({ error: "Gagal menambahkan transaksi" });
    }
});

4.2. Mengambil Data Transaksi dan Riwayat Penjualan

Tambahkan endpoint GET di routes/transactionRoutes.js:

router.get("/", async (req, res) => {
    try {
        const { rows } = await pool.query("SELECT * FROM transactions ORDER BY transaction_date DESC");
        res.json(rows);
    } catch (error) {
        res.status(500).json({ error: "Gagal mengambil transaksi" });
    }
});

Coba akses:

http://localhost:3000/transactions

Kesimpulan

 Kita sudah membangun database dan API CRUD untuk aplikasi POS!

  •  Database PostgreSQL sudah dibuat dengan tabel produk dan transaksi.
  •   API CRUD sudah tersedia untuk produk dan transaksi.
  •   Sistem sudah bisa menambah, mengedit, menghapus, dan menampilkan data.

Langkah selanjutnya? Tambahkan autentikasi dan laporan penjualan biar makin keren!

Post a Comment

0 Comments