FieFie Coffee
SudirmanKatalog Menu Kontainer
Pilih pesanan pelanggan FieFie Coffee
Keranjang Transaksi
Riwayat Transaksi
Daftar transaksi penjualan
| No. Nota | Cabang | Tanggal / Waktu | Tipe Order | Metode Bayar | Total Transaksi | Aksi |
|---|
Dashboard Performa Penjualan
Data penjualan harian
Rp 0
Hari ini
0
Nota berhasil dicetak
Rp 0
Pembelian per pelanggan
Take-Away
Volume order tertinggi
FieFie AI Advisor (Kontainer Bisnis)
Didukung oleh Gemini 2.5 Flash
Produk Paling Laris
Metode Pembayaran Terfavorit
Katalog Menu Global (Owner)
Tambah, perbarui, dan hapus menu FieFie Coffee secara global
| Gambar | Nama Produk | Kategori | Harga Jual | Status | Aksi |
|---|
Pengaturan Akun & Cabang Kontainer
Daftar lokasi kontainer aktif dan kredensial kasir FieFie Coffee
1. Daftar Lokasi Cabang
| ID | Nama | Alamat |
|---|
2. Akun Login Petugas Kasir
| Username | Role | Cabang |
|---|
Integrasi Database Multi-Cabang v2
Petunjuk migrasi skema database untuk mendukung sistem login owner, kasir, dan penugasan per cabang kontainer.
1. Skema Database v2 (Relasional Multi-Cabang)
Eksekusi skema relasional ini di database Anda lonn7846_coffee-shop untuk membuat tabel cabang, user petugas, dan menyelaraskan transaksi.
-- 1. TABEL CABANG KONTAINER
CREATE TABLE IF NOT EXISTS `branches` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(100) NOT NULL,
`address` VARCHAR(255) NOT NULL,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 2. TABEL AKUN USER (OWNER & KASIR)
CREATE TABLE IF NOT EXISTS `users` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`username` VARCHAR(50) NOT NULL UNIQUE,
`password` VARCHAR(255) NOT NULL, -- Simpan hash password aman
`role` ENUM('owner', 'cashier') NOT NULL DEFAULT 'cashier',
`branch_id` INT NULL, -- NULL jika owner, terikat ke cabang jika kasir
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`branch_id`) REFERENCES `branches`(`id`) ON DELETE SET NULL
);
-- 3. TABEL MENU PRODUK
CREATE TABLE IF NOT EXISTS `products` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(150) NOT NULL,
`category` VARCHAR(50) NOT NULL,
`price` DECIMAL(10,2) NOT NULL,
`is_available` TINYINT(1) DEFAULT 1,
`image_emoji` VARCHAR(10) DEFAULT '☕'
);
-- 4. TABEL ORDERS (TERKAIT KE CABANG DAN KASIR)
CREATE TABLE IF NOT EXISTS `orders` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`order_number` VARCHAR(50) UNIQUE NOT NULL,
`branch_id` INT NOT NULL, -- Cabang pembuat pesanan
`user_id` INT NOT NULL, -- Kasir yang melayani
`order_type` VARCHAR(50) NOT NULL, -- Take-Away, Dine-In, GoFood, dll.
`subtotal` DECIMAL(10,2) NOT NULL,
`tax` DECIMAL(10,2) NOT NULL,
`discount` DECIMAL(10,2) NOT NULL,
`total_price` DECIMAL(10,2) NOT NULL,
`payment_method` VARCHAR(50) NOT NULL,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`branch_id`) REFERENCES `branches`(`id`),
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`)
);
-- DATA AWAL DEMO UNTUK PENGUJIAN
INSERT INTO `branches` (`id`, `name`, `address`) VALUES
(1, 'Sudirman Container', 'Jl. Jend. Sudirman Kav 12, Jakarta'),
(2, 'Kemang Box', 'Jl. Kemang Raya No. 45, Jakarta Selatan');
INSERT INTO `users` (`username`, `password`, `role`, `branch_id`) VALUES
('owner', 'fiefie123', 'owner', NULL),
('fiefie.sudirman', 'sudirman123', 'cashier', 1),
('fiefie.kemang', 'kemang123', 'cashier', 2);
2. File Koneksi API Multi-Cabang (api.php)
Letakkan file ini di direktori root server coffeeshop.longalfasalam.id Anda. Menyediakan endpoint autentikasi dan pemisahan data per cabang.
<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Content-Type");
header("Content-Type: application/json; charset=UTF-8");
$db_config = [
'host' => 'localhost',
'port' => 3306,
'name' => 'lonn7846_coffee-shop',
'user' => 'lonn7846_coffee-shop',
'pass' => 'Og^e~a6kDE-yUfd[',
'charset' => 'utf8mb4'
];
try {
$dsn = "mysql:host=" . $db_config['host'] . ";dbname=" . $db_config['name'] . ";charset=" . $db_config['charset'];
$pdo = new PDO($dsn, $db_config['user'], $db_config['pass'], [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
} catch (PDOException $e) {
echo json_encode(["status" => "error", "message" => "Database connection failed"]);
exit;
}
$action = $_GET['action'] ?? '';
// API AUTHENTICATION & LOGIN
if ($action === 'login' && $_SERVER['REQUEST_METHOD'] === 'POST') {
$data = json_decode(file_get_contents("php://input"), true);
$username = $data['username'] ?? '';
$password = $data['password'] ?? '';
$stmt = $pdo->prepare("SELECT u.*, b.name as branch_name FROM users u LEFT JOIN branches b ON u.branch_id = b.id WHERE u.username = ?");
$stmt->execute([$username]);
$user = $stmt->fetch();
// Verifikasi password sederhana (Saran: ganti dengan password_verify() di produksi)
if ($user && $password === $user['password']) {
echo json_encode([
"status" => "success",
"user" => [
"id" => $user['id'],
"username" => $user['username'],
"role" => $user['role'],
"branch_id" => $user['branch_id'],
"branch_name" => $user['branch_name'] ?? 'Pusat (Owner)'
]
]);
} else {
echo json_encode(["status" => "error", "message" => "Kredensial tidak valid"]);
}
exit;
}
// GET DATA WITH BRANCH RESTRICTION
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
$branch_id = $_GET['branch_id'] ?? null;
$role = $_GET['role'] ?? 'cashier';
if ($action === 'get_orders') {
if ($role === 'owner') {
// Owner can see all branch orders
$stmt = $pdo->query("SELECT o.*, b.name as branch_name FROM orders o JOIN branches b ON o.branch_id = b.id ORDER BY o.id DESC");
} else {
// Cashier can only see their branch orders
$stmt = $pdo->prepare("SELECT o.*, b.name as branch_name FROM orders o JOIN branches b ON o.branch_id = b.id WHERE o.branch_id = ? ORDER BY o.id DESC");
$stmt->execute([$branch_id]);
}
echo json_encode($stmt->fetchAll());
exit;
}
}