๐Ÿ—„๏ธ Modul 1: Database & Struktur Proyek

Langkah pertama: siapkan database MySQL dan folder proyek

1. Persiapan Tools

Sebelum mulai coding, kita perlu menyiapkan beberapa software:

๐Ÿ–ฅ๏ธ
XAMPP

Paket lengkap Apache + PHP + MySQL. Download di apachefriends.org

Wajib
๐Ÿ“
VS Code

Editor kode terbaik untuk pemula. Download di code.visualstudio.com

Wajib
๐ŸŒ
phpMyAdmin

Sudah termasuk dalam XAMPP. Akses di localhost/phpmyadmin

Sudah Ada
๐Ÿ’ก Langkah Setup XAMPP:
1. Install XAMPP โ†’ 2. Start Apache & MySQL di Control Panel โ†’ 3. Buka browser ke http://localhost/phpmyadmin
2. Desain Database POS

Sistem POS kita membutuhkan 5 tabel. Berikut adalah relasi antar tabelnya:

ERD
๐Ÿ‘ค users
id, nama, username
password, role
โ†’
๐Ÿท๏ธ kategori
id, nama_kategori
โ†’
๐Ÿ“ฆ produk
id, kode, nama
harga, stok, id_kategori
โ†“
๐Ÿงพ transaksi
id, no_transaksi, tgl
total, bayar, kembalian, id_user
1โ†’N
๐Ÿ“‹ detail_transaksi
id, id_transaksi
id_produk, qty, harga, subtotal
Detail Setiap Tabel:
Tabel: users
KolomTipeKeteranganContoh
idINT AUTO_INCREMENT PKID unik pengguna1
namaVARCHAR(100)Nama lengkapAdmin POS
usernameVARCHAR(50) UNIQUEUsername loginadmin
passwordVARCHAR(255)Password terenkripsi$2y$10$...
roleENUM('admin','kasir')Peran penggunaadmin
created_atTIMESTAMPWaktu dibuat2025-01-01 08:00
Tabel: produk
KolomTipeKeteranganContoh
idINT AUTO_INCREMENT PKID unik produk1
kode_produkVARCHAR(20) UNIQUEKode barcode/SKUPRD001
nama_produkVARCHAR(150)Nama produkIndomie Goreng
harga_beliDECIMAL(15,2)Harga beli/modal2500.00
harga_jualDECIMAL(15,2)Harga jual ke customer3500.00
stokINTJumlah stok100
id_kategoriINT (FK ke kategori)Kategori produk1
created_atTIMESTAMPWaktu ditambahkan2025-01-01
3. Script SQL Lengkap

Copy script di bawah ini, buka phpMyAdmin, dan jalankan di tab SQL:

๐Ÿ“„ database.sql Jalankan di phpMyAdmin
-- ================================================
-- SCRIPT DATABASE POS SEDERHANA
-- Jalankan di phpMyAdmin โ†’ tab SQL
-- ================================================

-- 1. Buat dan gunakan database
CREATE DATABASE IF NOT EXISTS pos_sederhana 
  CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

USE pos_sederhana;

-- ================================================
-- 2. Tabel USERS (pengguna/kasir)
-- ================================================
CREATE TABLE users (
    id          INT AUTO_INCREMENT PRIMARY KEY,
    nama        VARCHAR(100) NOT NULL,
    username    VARCHAR(50) NOT NULL UNIQUE,
    password    VARCHAR(255) NOT NULL,
    role        ENUM('admin', 'kasir') DEFAULT 'kasir',
    created_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

-- ================================================
-- 3. Tabel KATEGORI
-- ================================================
CREATE TABLE kategori (
    id              INT AUTO_INCREMENT PRIMARY KEY,
    nama_kategori   VARCHAR(100) NOT NULL,
    created_at      TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

-- ================================================
-- 4. Tabel PRODUK
-- ================================================
CREATE TABLE produk (
    id              INT AUTO_INCREMENT PRIMARY KEY,
    kode_produk     VARCHAR(20) NOT NULL UNIQUE,
    nama_produk     VARCHAR(150) NOT NULL,
    harga_beli      DECIMAL(15, 2) DEFAULT 0,
    harga_jual      DECIMAL(15, 2) NOT NULL,
    stok            INT DEFAULT 0,
    id_kategori     INT,
    created_at      TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (id_kategori) REFERENCES kategori(id) 
        ON DELETE SET NULL
) ENGINE=InnoDB;

-- ================================================
-- 5. Tabel TRANSAKSI (header transaksi)
-- ================================================
CREATE TABLE transaksi (
    id              INT AUTO_INCREMENT PRIMARY KEY,
    no_transaksi    VARCHAR(30) NOT NULL UNIQUE,
    tanggal         DATETIME DEFAULT CURRENT_TIMESTAMP,
    total           DECIMAL(15, 2) NOT NULL DEFAULT 0,
    bayar           DECIMAL(15, 2) NOT NULL DEFAULT 0,
    kembalian       DECIMAL(15, 2) NOT NULL DEFAULT 0,
    id_user         INT,
    FOREIGN KEY (id_user) REFERENCES users(id) 
        ON DELETE SET NULL
) ENGINE=InnoDB;

-- ================================================
-- 6. Tabel DETAIL_TRANSAKSI (item per transaksi)
-- ================================================
CREATE TABLE detail_transaksi (
    id              INT AUTO_INCREMENT PRIMARY KEY,
    id_transaksi    INT NOT NULL,
    id_produk       INT,
    nama_produk     VARCHAR(150),  -- disimpan untuk histori
    harga_satuan    DECIMAL(15, 2) NOT NULL,
    qty             INT NOT NULL DEFAULT 1,
    subtotal        DECIMAL(15, 2) NOT NULL,
    FOREIGN KEY (id_transaksi) REFERENCES transaksi(id) 
        ON DELETE CASCADE,
    FOREIGN KEY (id_produk) REFERENCES produk(id) 
        ON DELETE SET NULL
) ENGINE=InnoDB;
โœ… Penjelasan SQL di atas:
  • ENGINE=InnoDB โ†’ Mendukung FOREIGN KEY (relasi antar tabel)
  • AUTO_INCREMENT โ†’ ID otomatis bertambah setiap ada data baru
  • DECIMAL(15,2) โ†’ Angka desimal untuk harga (15 digit, 2 dibelakang koma)
  • FOREIGN KEY โ†’ Menghubungkan tabel, menjaga integritas data
  • ON DELETE CASCADE โ†’ Jika transaksi dihapus, detail-nya ikut terhapus
  • ON DELETE SET NULL โ†’ Jika produk dihapus, referensi jadi NULL (tidak error)
4. Struktur Folder Proyek

Buat folder pos_sederhana di dalam C:\xampp\htdocs\ (Windows) atau /var/www/html/ (Linux).

๐Ÿ“ Buat folder & file kosong ini
htdocs/
โ””โ”€โ”€ pos_sederhana/        โ† Folder utama proyek
    โ”œโ”€โ”€ config/
    โ”‚   โ””โ”€โ”€ database.php
    โ”œโ”€โ”€ includes/
    โ”‚   โ”œโ”€โ”€ header.php
    โ”‚   โ”œโ”€โ”€ footer.php
    โ”‚   โ””โ”€โ”€ functions.php
    โ”œโ”€โ”€ auth/
    โ”‚   โ”œโ”€โ”€ login.php
    โ”‚   โ””โ”€โ”€ logout.php
    โ”œโ”€โ”€ produk/
    โ”‚   โ”œโ”€โ”€ index.php
    โ”‚   โ”œโ”€โ”€ tambah.php
    โ”‚   โ”œโ”€โ”€ edit.php
    โ”‚   โ””โ”€โ”€ hapus.php
    โ”œโ”€โ”€ transaksi/
    โ”‚   โ”œโ”€โ”€ index.php
    โ”‚   โ”œโ”€โ”€ proses.php
    โ”‚   โ””โ”€โ”€ detail.php
    โ”œโ”€โ”€ laporan/
    โ”‚   โ””โ”€โ”€ index.php
    โ””โ”€โ”€ dashboard.php
๐Ÿ’ก Cara cepat membuat folder di Windows:
Buka Command Prompt, ketik:
cd C:\xampp\htdocs
mkdir pos_sederhana
cd pos_sederhana
mkdir config includes auth produk transaksi laporan
5. Data Dummy (Sample Data)

Masukkan data awal agar aplikasi bisa langsung dicoba:

๐Ÿ“„ data_dummy.sql โ€” Jalankan setelah database.sql
USE pos_sederhana;

-- Data user (password: admin123 โ€” sudah di-hash)
INSERT INTO users (nama, username, password, role) VALUES
('Administrator', 'admin', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'admin'),
('Kasir 1', 'kasir1', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'kasir');
-- Password untuk keduanya: password

-- Data kategori
INSERT INTO kategori (nama_kategori) VALUES
('Makanan'),
('Minuman'),
('Snack'),
('Rokok'),
('Kebutuhan Rumah');

-- Data produk
INSERT INTO produk (kode_produk, nama_produk, harga_beli, harga_jual, stok, id_kategori) VALUES
('PRD001', 'Indomie Goreng', 2500.00, 3500.00, 100, 1),
('PRD002', 'Indomie Kuah', 2500.00, 3500.00, 100, 1),
('PRD003', 'Aqua 600ml', 2000.00, 3000.00, 200, 2),
('PRD004', 'Teh Botol 350ml', 2500.00, 4000.00, 150, 2),
('PRD005', 'Chitato 68gr', 7000.00, 10000.00, 50, 3),
('PRD006', 'Taro 65gr', 6000.00, 9000.00, 50, 3),
('PRD007', 'Gudang Garam 12', 20000.00, 25000.00, 30, 4),
('PRD008', 'Sabun Lifebuoy', 4000.00, 6000.00, 40, 5),
('PRD009', 'Shampo Pantene', 8000.00, 12000.00, 30, 5),
('PRD010', 'Beras 1kg', 12000.00, 15000.00, 80, 1);
โš ๏ธ Perhatian: Password di data dummy adalah password. Setelah aplikasi selesai, segera ganti password untuk keamanan!
๐Ÿ’ก Cara membuat password hash di PHP:
<?php
// Jalankan sekali untuk generate hash
echo password_hash('admin123', PASSWORD_BCRYPT);
// Output: $2y$10$... (copy ke kolom password)
?>
6. Latihan & Verifikasi
โœ… Checklist Modul 1
๐Ÿ” Verifikasi di phpMyAdmin:
Buka localhost/phpmyadmin โ†’ klik database pos_sederhana โ†’ pastikan terlihat 5 tabel: users, kategori, produk, transaksi, detail_transaksi