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!
0 Comments