💡 วิธีสร้างตารางใน Supabase: เปิดหน้าโปรเจกต์ Supabase ของคุณ > เข้าเมนู SQL Editor > กด New query > วางโค้ดด้านล่างนี้ลงไปแล้วกดปุ่ม Run (ทำเพียงครั้งแรกครั้งเดียว)
-- ==============================================================================
-- 🚀 PennuengPOS - Supabase PostgreSQL Database Schema (14 Tables Complete)
-- คำแนะนำ: คัดลอกโค้ดทั้งหมดนี้ไปวางในเมนู SQL Editor ของ Supabase แล้วกดปุ่ม RUN
-- ==============================================================================
-- 1. ลบตารางเดิมทั้งหมดทิ้งแบบสะอาด 100% (DROP TABLES CASCADE)
DROP TABLE IF EXISTS sales_details CASCADE;
DROP TABLE IF EXISTS intake_details CASCADE;
DROP TABLE IF EXISTS sales CASCADE;
DROP TABLE IF EXISTS intakes CASCADE;
DROP TABLE IF EXISTS withdrawals CASCADE;
DROP TABLE IF EXISTS quotations CASCADE;
DROP TABLE IF EXISTS expenses CASCADE;
DROP TABLE IF EXISTS promotions CASCADE;
DROP TABLE IF EXISTS products CASCADE;
DROP TABLE IF EXISTS cancelled_logs CASCADE;
DROP TABLE IF EXISTS financial_settings CASCADE;
DROP TABLE IF EXISTS members CASCADE;
DROP TABLE IF EXISTS creditors CASCADE;
DROP TABLE IF EXISTS users CASCADE;
-- 2. สร้างตารางสินค้าในคลัง (Products)
CREATE TABLE products (
barcode TEXT PRIMARY KEY,
product_code TEXT,
name TEXT NOT NULL,
category TEXT DEFAULT 'ทั่วไป',
cost NUMERIC DEFAULT 0,
price1 NUMERIC DEFAULT 0,
price2 NUMERIC DEFAULT 0,
stock NUMERIC DEFAULT 0,
min_stock NUMERIC DEFAULT 0,
unit TEXT DEFAULT 'ชิ้น',
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- 3. สร้างตารางสมาชิกและลูกค้า (Members)
CREATE TABLE members (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
phone TEXT,
price_tier TEXT DEFAULT 'ราคาขายปลีกปกติ',
points NUMERIC DEFAULT 0,
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- 4. สร้างตารางเจ้าหนี้การค้า (Creditors)
CREATE TABLE creditors (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
contact TEXT,
balance NUMERIC DEFAULT 0,
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- 5. สร้างตารางบิลขายสินค้าหน้าร้าน (Sales)
CREATE TABLE sales (
id TEXT PRIMARY KEY,
date TEXT,
member_id TEXT DEFAULT 'M000',
member_name TEXT DEFAULT 'ลูกค้าทั่วไป',
total NUMERIC DEFAULT 0,
discount NUMERIC DEFAULT 0,
profit NUMERIC DEFAULT 0,
payment_type TEXT DEFAULT 'cash',
items_count INTEGER DEFAULT 0,
received_amount NUMERIC DEFAULT 0,
change_amount NUMERIC DEFAULT 0,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 6. สร้างตารางรายละเอียดสินค้าในบิลขาย (SalesDetails)
CREATE TABLE sales_details (
id TEXT PRIMARY KEY,
sale_id TEXT REFERENCES sales(id) ON DELETE CASCADE,
barcode TEXT,
name TEXT,
category TEXT DEFAULT 'ทั่วไป',
qty NUMERIC DEFAULT 1,
unit TEXT DEFAULT 'ชิ้น',
price NUMERIC DEFAULT 0,
total_price NUMERIC DEFAULT 0,
cost NUMERIC DEFAULT 0,
total_cost NUMERIC DEFAULT 0,
profit NUMERIC DEFAULT 0,
member_name TEXT,
payment_type TEXT,
date TEXT
);
-- 7. สร้างตารางบันทึกรับสินค้าเข้าคลัง (Intakes)
CREATE TABLE intakes (
id TEXT PRIMARY KEY,
invoice_no TEXT,
date TEXT,
creditor_id TEXT DEFAULT 'C000',
creditor_name TEXT DEFAULT 'เจ้าหนี้อื่นๆ',
total_cost NUMERIC DEFAULT 0,
vat_type TEXT DEFAULT 'none',
vat_amount NUMERIC DEFAULT 0,
payment_type TEXT DEFAULT 'cash',
extra_charge NUMERIC DEFAULT 0,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 8. สร้างตารางรายละเอียดสินค้าที่รับเข้า (IntakeDetails)
CREATE TABLE intake_details (
id TEXT PRIMARY KEY,
intake_id TEXT REFERENCES intakes(id) ON DELETE CASCADE,
barcode TEXT,
name TEXT,
category TEXT DEFAULT 'ทั่วไป',
qty NUMERIC DEFAULT 1,
unit TEXT DEFAULT 'ชิ้น',
cost NUMERIC DEFAULT 0,
discount NUMERIC DEFAULT 0,
total_cost NUMERIC DEFAULT 0
);
-- 9. สร้างตารางใบเสนอราคา (Quotations)
CREATE TABLE quotations (
id TEXT PRIMARY KEY,
member_id TEXT,
member_name TEXT,
date TEXT,
due_date TEXT,
total NUMERIC DEFAULT 0,
discount NUMERIC DEFAULT 0,
status TEXT DEFAULT 'draft',
note TEXT,
items JSONB DEFAULT '[]'::jsonb,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 10. สร้างตารางบันทึกค่าใช้จ่ายร้าน (Expenses)
CREATE TABLE expenses (
id TEXT PRIMARY KEY,
date TEXT,
title TEXT NOT NULL,
category TEXT DEFAULT 'ทั่วไป',
amount NUMERIC DEFAULT 0,
note TEXT,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 11. สร้างตารางบันทึกการเบิกสินค้าในร้าน (Withdrawals)
CREATE TABLE withdrawals (
id TEXT PRIMARY KEY,
date TEXT,
barcode TEXT,
product_name TEXT,
qty NUMERIC DEFAULT 1,
unit TEXT DEFAULT 'ชิ้น',
reason TEXT,
user_name TEXT,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 12. สร้างตารางโปรโมชั่น & ส่วนลด (Promotions)
CREATE TABLE promotions (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
type TEXT DEFAULT 'percent',
discount_val NUMERIC DEFAULT 0,
min_spend NUMERIC DEFAULT 0,
start_date TEXT,
end_date TEXT,
active BOOLEAN DEFAULT TRUE
);
-- 13. สร้างตารางพนักงานและสิทธิ์การใช้งาน (Users)
CREATE TABLE users (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
role TEXT DEFAULT 'cashier',
pin TEXT DEFAULT '1111',
phone TEXT,
active BOOLEAN DEFAULT TRUE,
permissions JSONB DEFAULT '{}'::jsonb,
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- 14. สร้างตารางประวัติการยกเลิก/ลบรายการ (CancelledLogs)
CREATE TABLE cancelled_logs (
id TEXT PRIMARY KEY,
timestamp TEXT,
menu TEXT,
doc_id TEXT,
title TEXT,
amount NUMERIC DEFAULT 0,
user_name TEXT,
reason TEXT,
stock_impact TEXT,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 15. สร้างตารางการตั้งค่าบัญชีและการเงิน (FinancialSettings)
CREATE TABLE financial_settings (
id TEXT PRIMARY KEY,
initial_cash NUMERIC DEFAULT 0,
initial_bank NUMERIC DEFAULT 0,
initial_capital NUMERIC DEFAULT 0,
retained_earnings NUMERIC DEFAULT 0,
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- ==============================================================================
-- 🔒 เปิดใช้งาน Row Level Security (RLS) และกำหนดสิทธิ์ Public Access ให้ครบทุกตาราง
-- ==============================================================================
DO $$
DECLARE
tbl RECORD;
BEGIN
FOR tbl IN (SELECT tablename FROM pg_tables WHERE schemaname = 'public')
LOOP
EXECUTE format('ALTER TABLE public.%I ENABLE ROW LEVEL SECURITY;', tbl.tablename);
EXECUTE format('DROP POLICY IF EXISTS "Allow All Access" ON public.%I;', tbl.tablename);
EXECUTE format('CREATE POLICY "Allow All Access" ON public.%I FOR ALL USING (true) WITH CHECK (true);', tbl.tablename);
END LOOP;
END $$;
-- ==============================================================================
-- เติมข้อมูลค่าเริ่มต้นที่จำเป็น (Baseline Data)
-- ==============================================================================
INSERT INTO members (id, name, phone, price_tier, points)
VALUES ('M000', 'ลูกค้าทั่วไป', '-', 'ราคาขายปลีกปกติ', 0);
INSERT INTO creditors (id, name, contact, balance)
VALUES ('C000', 'เจ้าหนี้อื่นๆ (ซื้อเงินสด)', '-', 0);
INSERT INTO users (id, name, role, pin, phone, active, permissions)
VALUES
('USR001', 'DEMO (เจ้าของร้าน)', 'admin', '1111', '-', true, '{"pos":true,"inventoryView":true,"inventoryEdit":true,"intakes":true,"voidSales":true,"reportsSales":true,"reportsFinance":true,"settings":true,"promotions":true,"sheetsSync":true}'),
('USR000', 'TaKuMi (ผู้ดูแล)', 'superadmin', '2611', '064-716-6545', true, '{"pos":true,"inventoryView":true,"inventoryEdit":true,"intakes":true,"voidSales":true,"reportsSales":true,"reportsFinance":true,"settings":true,"promotions":true,"sheetsSync":true}');