Sebelum mulai coding, kita perlu menyiapkan beberapa software:
Paket lengkap Apache + PHP + MySQL. Download di apachefriends.org
WajibEditor kode terbaik untuk pemula. Download di code.visualstudio.com
WajibSudah termasuk dalam XAMPP. Akses di localhost/phpmyadmin
Sudah Adahttp://localhost/phpmyadmin
Sistem POS kita membutuhkan 5 tabel. Berikut adalah relasi antar tabelnya:
Tabel: users | |||
|---|---|---|---|
| Kolom | Tipe | Keterangan | Contoh |
id | INT AUTO_INCREMENT PK | ID unik pengguna | 1 |
nama | VARCHAR(100) | Nama lengkap | Admin POS |
username | VARCHAR(50) UNIQUE | Username login | admin |
password | VARCHAR(255) | Password terenkripsi | $2y$10$... |
role | ENUM('admin','kasir') | Peran pengguna | admin |
created_at | TIMESTAMP | Waktu dibuat | 2025-01-01 08:00 |
Tabel: produk | |||
|---|---|---|---|
| Kolom | Tipe | Keterangan | Contoh |
id | INT AUTO_INCREMENT PK | ID unik produk | 1 |
kode_produk | VARCHAR(20) UNIQUE | Kode barcode/SKU | PRD001 |
nama_produk | VARCHAR(150) | Nama produk | Indomie Goreng |
harga_beli | DECIMAL(15,2) | Harga beli/modal | 2500.00 |
harga_jual | DECIMAL(15,2) | Harga jual ke customer | 3500.00 |
stok | INT | Jumlah stok | 100 |
id_kategori | INT (FK ke kategori) | Kategori produk | 1 |
created_at | TIMESTAMP | Waktu ditambahkan | 2025-01-01 |
Copy script di bawah ini, buka phpMyAdmin, dan jalankan di tab SQL:
-- ================================================
-- 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;
Buat folder pos_sederhana di dalam C:\xampp\htdocs\ (Windows) atau /var/www/html/ (Linux).
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
cd C:\xampp\htdocs mkdir pos_sederhana cd pos_sederhana mkdir config includes auth produk transaksi laporan
Masukkan data awal agar aplikasi bisa langsung dicoba:
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);
password. Setelah aplikasi selesai, segera ganti password untuk keamanan!
<?php
// Jalankan sekali untuk generate hash
echo password_hash('admin123', PASSWORD_BCRYPT);
// Output: $2y$10$... (copy ke kolom password)
?>
localhost/phpmyadmin โ klik database pos_sederhana โ pastikan terlihat 5 tabel: users, kategori, produk, transaksi, detail_transaksi