Files
pos-system/scripts/seed-demo-data.sh
Ho Ngoc Hai 4e91c96c97 feat(multi-vertical): phase 0 — seed data script + fix GetShopsQueryHandler NullRef
- Add scripts/seed-demo-data.sh: creates user, merchant, 5 shops, 47 products, 15 categories, 18 tables/rooms, 13 booking resources
- Fix NullReferenceException in GetShopsQueryHandler (null-safe Enumeration access)
- Default account: hongochai10@icloud.com / Velik@2026
2026-02-28 22:32:51 +07:00

433 lines
24 KiB
Bash
Executable File

#!/bin/bash
# ═══════════════════════════════════════════════════════════════════════
# EN: Seed demo data for all GoodGo Multi-Vertical POS services.
# VI: Seed dữ liệu demo cho tất cả services GoodGo POS đa ngành.
#
# Default account: hongochai10@icloud.com / Velik@2026
# Creates: 5 shops (Café, Restaurant, Karaoke, Spa, Beauty)
# Products, Categories, Tables, Rooms, Resources, Appointments
# ═══════════════════════════════════════════════════════════════════════
set -e
# ─── Service URLs ───
IAM_URL="http://localhost:5001"
MERCHANT_URL="http://localhost:5005"
CATALOG_URL="http://localhost:5016"
ORDER_URL="http://localhost:5017"
INVENTORY_URL="http://localhost:5018"
FNB_URL="http://localhost:5019"
BOOKING_URL="http://localhost:5020"
# ─── Colors ───
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
CYAN='\033[0;36m'
NC='\033[0m'
log_step() { echo -e "${CYAN}$1${NC}"; }
log_ok() { echo -e "${GREEN}$1${NC}"; }
log_warn() { echo -e "${YELLOW}$1${NC}"; }
log_err() { echo -e "${RED}$1${NC}"; }
log_head() { echo -e "\n${YELLOW}═══ $1 ═══${NC}"; }
# ═══════════════════════════════════════════════════════════════════════
# STEP 1: Register User + Get Token
# ═══════════════════════════════════════════════════════════════════════
log_head "STEP 1: Register User & Get Token"
log_step "Registering user hongochai10@icloud.com..."
REG_RESP=$(curl -s -w "\n%{http_code}" -X POST "${IAM_URL}/api/v1/auth/register" \
-H 'Content-Type: application/json' \
-d '{"email":"hongochai10@icloud.com","password":"Velik@2026","firstName":"Ho Ngoc","lastName":"Hai"}')
REG_CODE=$(echo "$REG_RESP" | tail -1)
if [ "$REG_CODE" = "201" ]; then
log_ok "User registered successfully"
elif [ "$REG_CODE" = "409" ]; then
log_warn "User already exists (409) — using existing account"
else
log_warn "Registration returned HTTP $REG_CODE — continuing"
fi
log_step "Getting access token..."
TOKEN_RESP=$(curl -s -X POST "${IAM_URL}/connect/token" \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d 'grant_type=password&client_id=password-client&client_secret=password-client-secret&username=hongochai10@icloud.com&password=Velik@2026&scope=api')
TOKEN=$(echo "$TOKEN_RESP" | python3 -c "import sys,json; print(json.load(sys.stdin).get('access_token',''))" 2>/dev/null || echo "")
if [ -z "$TOKEN" ]; then
log_err "Failed to get token. Response: $TOKEN_RESP"
exit 1
fi
log_ok "Token obtained (${#TOKEN} chars)"
# ═══════════════════════════════════════════════════════════════════════
# STEP 2: Register Merchant
# ═══════════════════════════════════════════════════════════════════════
log_head "STEP 2: Register Merchant"
log_step "Registering merchant..."
MERCH_RESP=$(curl -s -w "\n%{http_code}" -X POST "${MERCHANT_URL}/api/v1/merchants/register" \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $TOKEN" \
-d '{"businessName":"GoodGo Demo Business","type":"Individual"}')
MERCH_CODE=$(echo "$MERCH_RESP" | tail -1)
if [ "$MERCH_CODE" = "201" ] || [ "$MERCH_CODE" = "200" ]; then
log_ok "Merchant registered"
else
log_warn "Merchant returned HTTP $MERCH_CODE (may already exist)"
fi
# ═══════════════════════════════════════════════════════════════════════
# STEP 3: Create 5 Shops
# ═══════════════════════════════════════════════════════════════════════
log_head "STEP 3: Create 5 Shops"
# Function to create shop and extract ID
create_shop() {
local name="$1" slug="$2" category="$3" desc="$4" phone="$5" email="$6"
local resp_body
resp_body=$(curl -s -X POST "${MERCHANT_URL}/api/v1/shops" \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $TOKEN" \
-d "{\"name\":\"$name\",\"slug\":\"$slug\",\"type\":\"PhysicalOnly\",\"category\":\"$category\",\"description\":\"$desc\",\"phone\":\"$phone\",\"email\":\"$email\"}")
# Extract shop ID from response
local shop_id
shop_id=$(echo "$resp_body" | python3 -c "
import sys, json
try:
d = json.load(sys.stdin)
if isinstance(d, dict):
for key in ['data', 'Data']:
if key in d and isinstance(d[key], dict):
for k in ['shopId', 'shop_id', 'id', 'Id']:
if k in d[key]: print(d[key][k]); exit()
for k in ['shopId', 'shop_id', 'id', 'Id']:
if k in d: print(d[k]); exit()
except: pass
" 2>/dev/null)
if [ -n "$shop_id" ]; then
log_ok "Shop '$name' → $shop_id"
else
log_warn "Shop '$name' failed — response: $(echo "$resp_body" | head -c 200)"
fi
# Return ONLY the ID via a temp file to avoid stdout pollution
echo "$shop_id"
}
SHOP_CAFE=$(create_shop "Cà Phê GoodGo" "ca-phe-goodgo" "Cafe" "Quán cà phê đặc sản Việt Nam" "0901234501" "cafe@goodgo.vn" 2>/dev/null)
# Remove any non-UUID chars (color codes etc)
SHOP_CAFE=$(echo "$SHOP_CAFE" | grep -oE '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}' | head -1)
log_ok "Café: $SHOP_CAFE"
SHOP_RESTAURANT=$(create_shop "Nhà Hàng GoodGo" "nha-hang-goodgo" "Restaurant" "Nhà hàng ẩm thực Việt hiện đại" "0901234502" "restaurant@goodgo.vn" 2>/dev/null)
SHOP_RESTAURANT=$(echo "$SHOP_RESTAURANT" | grep -oE '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}' | head -1)
log_ok "Restaurant: $SHOP_RESTAURANT"
SHOP_KARAOKE=$(create_shop "Karaoke GoodGo" "karaoke-goodgo" "Karaoke" "Karaoke VIP - Hệ thống phòng hiện đại" "0901234503" "karaoke@goodgo.vn" 2>/dev/null)
SHOP_KARAOKE=$(echo "$SHOP_KARAOKE" | grep -oE '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}' | head -1)
log_ok "Karaoke: $SHOP_KARAOKE"
SHOP_SPA=$(create_shop "Spa GoodGo" "spa-goodgo" "Spa" "Spa và Wellness cao cấp" "0901234504" "spa@goodgo.vn" 2>/dev/null)
SHOP_SPA=$(echo "$SHOP_SPA" | grep -oE '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}' | head -1)
log_ok "Spa: $SHOP_SPA"
SHOP_BEAUTY=$(create_shop "Thẩm Mỹ GoodGo" "tham-my-goodgo" "Beauty" "Thẩm mỹ viện công nghệ cao" "0901234505" "beauty@goodgo.vn" 2>/dev/null)
SHOP_BEAUTY=$(echo "$SHOP_BEAUTY" | grep -oE '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}' | head -1)
log_ok "Beauty: $SHOP_BEAUTY"
# If shops already exist, try to fetch existing
if [ -z "$SHOP_CAFE" ]; then
log_step "Loading existing shops..."
SHOPS_JSON=$(curl -s "${MERCHANT_URL}/api/v1/shops" -H "Authorization: Bearer $TOKEN")
eval $(echo "$SHOPS_JSON" | python3 -c "
import sys, json
try:
d = json.load(sys.stdin)
items = d if isinstance(d, list) else d.get('data', d.get('items', []))
if isinstance(items, list):
for s in items:
cat = (s.get('category','') or '').lower()
sid = s.get('id', s.get('shopId', ''))
if 'cafe' in cat: print(f'SHOP_CAFE=\"{sid}\"')
elif 'restaurant' in cat: print(f'SHOP_RESTAURANT=\"{sid}\"')
elif 'karaoke' in cat: print(f'SHOP_KARAOKE=\"{sid}\"')
elif 'spa' in cat and 'beauty' not in cat: print(f'SHOP_SPA=\"{sid}\"')
elif 'beauty' in cat: print(f'SHOP_BEAUTY=\"{sid}\"')
except: pass
" 2>/dev/null)
log_ok "Loaded existing shop IDs"
fi
echo ""
echo " Café: $SHOP_CAFE"
echo " Restaurant: $SHOP_RESTAURANT"
echo " Karaoke: $SHOP_KARAOKE"
echo " Spa: $SHOP_SPA"
echo " Beauty: $SHOP_BEAUTY"
# ═══════════════════════════════════════════════════════════════════════
# Helper: authenticated POST
# ═══════════════════════════════════════════════════════════════════════
api_post() {
curl -s -w "\n%{http_code}" -X POST "$1" \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $TOKEN" \
-d "$2"
}
check_result() {
local label="$1" resp="$2"
local code=$(echo "$resp" | tail -1)
if [ "$code" = "201" ] || [ "$code" = "200" ]; then
log_ok "$label"
else
log_warn "$label — HTTP $code"
fi
}
# ═══════════════════════════════════════════════════════════════════════
# STEP 4: Create Categories
# ═══════════════════════════════════════════════════════════════════════
log_head "STEP 4: Create Categories"
cat_create() {
local r=$(api_post "${CATALOG_URL}/api/v1/categories" \
"{\"shopId\":\"$1\",\"name\":\"$2\",\"description\":\"$3\",\"displayOrder\":$4}")
check_result "[$5] $2" "$r"
}
[ -n "$SHOP_CAFE" ] && {
cat_create "$SHOP_CAFE" "Cà phê" "Các loại cà phê" 1 "Café"
cat_create "$SHOP_CAFE" "Trà" "Trà xanh, trà đào" 2 "Café"
cat_create "$SHOP_CAFE" "Sinh tố" "Sinh tố trái cây" 3 "Café"
cat_create "$SHOP_CAFE" "Bánh ngọt" "Bánh mì, croissant" 4 "Café"
}
[ -n "$SHOP_RESTAURANT" ] && {
cat_create "$SHOP_RESTAURANT" "Khai vị" "Món khai vị" 1 "Restaurant"
cat_create "$SHOP_RESTAURANT" "Món chính" "Món chính" 2 "Restaurant"
cat_create "$SHOP_RESTAURANT" "Tráng miệng" "Tráng miệng" 3 "Restaurant"
cat_create "$SHOP_RESTAURANT" "Đồ uống" "Nước, bia, rượu" 4 "Restaurant"
}
[ -n "$SHOP_KARAOKE" ] && {
cat_create "$SHOP_KARAOKE" "Bia" "Các loại bia" 1 "Karaoke"
cat_create "$SHOP_KARAOKE" "Rượu" "Rượu vang, whisky" 2 "Karaoke"
cat_create "$SHOP_KARAOKE" "Cocktail" "Cocktail pha chế" 3 "Karaoke"
cat_create "$SHOP_KARAOKE" "Đồ ăn nhẹ" "Snack, trái cây" 4 "Karaoke"
}
[ -n "$SHOP_SPA" ] && {
cat_create "$SHOP_SPA" "Massage" "Dịch vụ massage" 1 "Spa"
cat_create "$SHOP_SPA" "Chăm sóc da" "Facial, skincare" 2 "Spa"
cat_create "$SHOP_SPA" "Gói combo" "Combo dịch vụ" 3 "Spa"
}
[ -n "$SHOP_BEAUTY" ] && {
cat_create "$SHOP_BEAUTY" "Tiêm filler" "Filler, botox" 1 "Beauty"
cat_create "$SHOP_BEAUTY" "Laser" "Trị nám, trẻ hóa" 2 "Beauty"
cat_create "$SHOP_BEAUTY" "Phẫu thuật" "Nâng mũi, cắt mí" 3 "Beauty"
cat_create "$SHOP_BEAUTY" "Sản phẩm" "Mỹ phẩm, kem dưỡng" 4 "Beauty"
}
# ═══════════════════════════════════════════════════════════════════════
# STEP 5: Create Products
# ═══════════════════════════════════════════════════════════════════════
log_head "STEP 5: Create Products"
prod_create() {
local r=$(api_post "${CATALOG_URL}/api/v1/products" \
"{\"shopId\":\"$1\",\"name\":\"$2\",\"price\":$3,\"type\":\"$4\",\"description\":\"$5\",\"sku\":\"$6\"}")
check_result "$2 (${3}₫)" "$r"
}
[ -n "$SHOP_CAFE" ] && {
log_step "Café products..."
prod_create "$SHOP_CAFE" "Cà phê sữa đá" 35000 "PreparedFood" "Cà phê phin truyền thống" "CAFE-001"
prod_create "$SHOP_CAFE" "Cà phê đen đá" 29000 "PreparedFood" "Cà phê đen đậm đà" "CAFE-002"
prod_create "$SHOP_CAFE" "Bạc xỉu" 39000 "PreparedFood" "Cà phê sữa nhẹ" "CAFE-003"
prod_create "$SHOP_CAFE" "Espresso" 45000 "PreparedFood" "Espresso đậm vị" "CAFE-004"
prod_create "$SHOP_CAFE" "Latte" 55000 "PreparedFood" "Latte kem sữa" "CAFE-005"
prod_create "$SHOP_CAFE" "Cappuccino" 55000 "PreparedFood" "Cappuccino bọt sữa" "CAFE-006"
prod_create "$SHOP_CAFE" "Trà đào cam sả" 45000 "PreparedFood" "Trà trái cây tươi" "CAFE-007"
prod_create "$SHOP_CAFE" "Trà sen vàng" 49000 "PreparedFood" "Trà hoa sen thơm" "CAFE-008"
prod_create "$SHOP_CAFE" "Sinh tố bơ" 55000 "PreparedFood" "Sinh tố bơ tươi" "CAFE-009"
prod_create "$SHOP_CAFE" "Croissant bơ" 35000 "PreparedFood" "Croissant nướng giòn" "CAFE-010"
prod_create "$SHOP_CAFE" "Bánh mì Việt Nam" 30000 "PreparedFood" "Bánh mì thịt nguội" "CAFE-011"
prod_create "$SHOP_CAFE" "Matcha Latte" 59000 "PreparedFood" "Matcha Nhật Bản" "CAFE-012"
}
[ -n "$SHOP_RESTAURANT" ] && {
log_step "Restaurant products..."
prod_create "$SHOP_RESTAURANT" "Gỏi cuốn tôm" 65000 "PreparedFood" "Gỏi cuốn tôm tươi" "REST-001"
prod_create "$SHOP_RESTAURANT" "Chả giò" 75000 "PreparedFood" "Chả giò giòn rụm" "REST-002"
prod_create "$SHOP_RESTAURANT" "Phở bò tái" 89000 "PreparedFood" "Phở bò tái nạm gầu" "REST-003"
prod_create "$SHOP_RESTAURANT" "Bún chả Hà Nội" 95000 "PreparedFood" "Bún chả kèm nem rán" "REST-004"
prod_create "$SHOP_RESTAURANT" "Cơm tấm sườn" 85000 "PreparedFood" "Cơm tấm sườn bì chả" "REST-005"
prod_create "$SHOP_RESTAURANT" "Bò lúc lắc" 185000 "PreparedFood" "Bò Úc lúc lắc rau sống" "REST-006"
prod_create "$SHOP_RESTAURANT" "Cá kho tộ" 145000 "PreparedFood" "Cá lóc kho tộ đất" "REST-007"
prod_create "$SHOP_RESTAURANT" "Gà nướng mật ong" 165000 "PreparedFood" "Nửa con gà nướng" "REST-008"
prod_create "$SHOP_RESTAURANT" "Canh chua cá" 95000 "PreparedFood" "Canh chua cá lóc" "REST-009"
prod_create "$SHOP_RESTAURANT" "Chè khúc bạch" 45000 "PreparedFood" "Chè trái cây khúc bạch" "REST-010"
prod_create "$SHOP_RESTAURANT" "Bia Sài Gòn" 25000 "PreparedFood" "Bia Sài Gòn lon 330ml" "REST-011"
prod_create "$SHOP_RESTAURANT" "Nước mía" 20000 "PreparedFood" "Nước mía tươi" "REST-012"
}
[ -n "$SHOP_KARAOKE" ] && {
log_step "Karaoke menu..."
prod_create "$SHOP_KARAOKE" "Bia Tiger" 30000 "PreparedFood" "Tiger lon 330ml" "KTV-001"
prod_create "$SHOP_KARAOKE" "Bia Heineken" 35000 "PreparedFood" "Heineken lon 330ml" "KTV-002"
prod_create "$SHOP_KARAOKE" "Rượu vang Chile" 350000 "PreparedFood" "Rượu vang đỏ Chile" "KTV-003"
prod_create "$SHOP_KARAOKE" "Whisky Black Label" 1200000 "PreparedFood" "Johnnie Walker Black" "KTV-004"
prod_create "$SHOP_KARAOKE" "Mojito" 85000 "PreparedFood" "Cocktail Mojito" "KTV-005"
prod_create "$SHOP_KARAOKE" "Long Island" 95000 "PreparedFood" "Long Island Iced Tea" "KTV-006"
prod_create "$SHOP_KARAOKE" "Trái cây tổng hợp" 150000 "PreparedFood" "Đĩa trái cây mix" "KTV-007"
prod_create "$SHOP_KARAOKE" "Khoai tây chiên" 65000 "PreparedFood" "Khoai tây chiên giòn" "KTV-008"
prod_create "$SHOP_KARAOKE" "Gà rán" 89000 "PreparedFood" "Gà rán sốt cay" "KTV-009"
prod_create "$SHOP_KARAOKE" "Nước suối" 15000 "PreparedFood" "Nước suối Aquafina" "KTV-010"
}
[ -n "$SHOP_SPA" ] && {
log_step "Spa services..."
prod_create "$SHOP_SPA" "Massage body" 350000 "Service" "Massage toàn thân 60 phút" "SPA-001"
prod_create "$SHOP_SPA" "Massage chân" 200000 "Service" "Massage chân thư giãn 45 phút" "SPA-002"
prod_create "$SHOP_SPA" "Facial cơ bản" 300000 "Service" "Chăm sóc da mặt cơ bản" "SPA-003"
prod_create "$SHOP_SPA" "Facial cao cấp" 550000 "Service" "Chăm sóc da mặt chuyên sâu" "SPA-004"
prod_create "$SHOP_SPA" "Xông hơi thảo dược" 180000 "Service" "Xông hơi thảo dược 30 phút" "SPA-005"
prod_create "$SHOP_SPA" "Tắm trắng body" 450000 "Service" "Tắm trắng phi thuyền" "SPA-006"
prod_create "$SHOP_SPA" "Stone massage" 450000 "Service" "Massage đá nóng 75 phút" "SPA-007"
prod_create "$SHOP_SPA" "Combo VIP" 850000 "Service" "Massage + Facial + Xông hơi" "SPA-008"
prod_create "$SHOP_SPA" "Tinh dầu massage" 120000 "Physical" "Tinh dầu oải hương 100ml" "SPA-P01"
prod_create "$SHOP_SPA" "Kem dưỡng ẩm" 280000 "Physical" "Kem dưỡng da mặt 50g" "SPA-P02"
}
[ -n "$SHOP_BEAUTY" ] && {
log_step "Beauty services..."
prod_create "$SHOP_BEAUTY" "Tiêm filler môi" 3500000 "Service" "Filler môi HA 1ml" "BTY-001"
prod_create "$SHOP_BEAUTY" "Botox trán" 2500000 "Service" "Botox giảm nếp nhăn trán" "BTY-002"
prod_create "$SHOP_BEAUTY" "Laser trị nám" 1800000 "Service" "Laser Pico trị nám 1 lần" "BTY-003"
prod_create "$SHOP_BEAUTY" "Trẻ hóa Thermage" 8000000 "Service" "Thermage nâng cơ mặt" "BTY-004"
prod_create "$SHOP_BEAUTY" "Nâng mũi S-line" 15000000 "Service" "Nâng mũi sụn tự thân" "BTY-005"
prod_create "$SHOP_BEAUTY" "Cắt mí Hàn Quốc" 12000000 "Service" "Cắt mí mắt công nghệ Hàn" "BTY-006"
prod_create "$SHOP_BEAUTY" "Mesotherapy" 2000000 "Service" "Meso trắng sáng da" "BTY-007"
prod_create "$SHOP_BEAUTY" "Serum HA" 450000 "Physical" "Serum Hyaluronic Acid 30ml" "BTY-P01"
prod_create "$SHOP_BEAUTY" "Kem chống nắng" 350000 "Physical" "Kem chống nắng SPF50 50ml" "BTY-P02"
}
# ═══════════════════════════════════════════════════════════════════════
# STEP 6: Create Tables (Restaurant) + Rooms (Karaoke)
# ═══════════════════════════════════════════════════════════════════════
log_head "STEP 6: Create Tables & Rooms"
table_create() {
local r=$(api_post "${FNB_URL}/api/v1/tables" \
"{\"shopId\":\"$1\",\"tableNumber\":\"$2\",\"capacity\":$3,\"zone\":\"$4\"}")
check_result "$2 ($4)" "$r"
}
[ -n "$SHOP_RESTAURANT" ] && {
log_step "Restaurant tables..."
table_create "$SHOP_RESTAURANT" "A1" 2 "Tầng 1"
table_create "$SHOP_RESTAURANT" "A2" 2 "Tầng 1"
table_create "$SHOP_RESTAURANT" "A3" 4 "Tầng 1"
table_create "$SHOP_RESTAURANT" "A4" 4 "Tầng 1"
table_create "$SHOP_RESTAURANT" "A5" 6 "Tầng 1"
table_create "$SHOP_RESTAURANT" "B1" 4 "Tầng 2"
table_create "$SHOP_RESTAURANT" "B2" 6 "Tầng 2"
table_create "$SHOP_RESTAURANT" "B3" 8 "Tầng 2"
table_create "$SHOP_RESTAURANT" "VIP1" 10 "VIP"
table_create "$SHOP_RESTAURANT" "VIP2" 12 "VIP"
}
[ -n "$SHOP_KARAOKE" ] && {
log_step "Karaoke rooms..."
table_create "$SHOP_KARAOKE" "P01" 6 "Standard"
table_create "$SHOP_KARAOKE" "P02" 6 "Standard"
table_create "$SHOP_KARAOKE" "P03" 8 "Standard"
table_create "$SHOP_KARAOKE" "P04" 8 "Standard"
table_create "$SHOP_KARAOKE" "P05" 10 "Deluxe"
table_create "$SHOP_KARAOKE" "P06" 10 "Deluxe"
table_create "$SHOP_KARAOKE" "V01" 15 "VIP"
table_create "$SHOP_KARAOKE" "V02" 20 "Party"
}
# ═══════════════════════════════════════════════════════════════════════
# STEP 7: Create Resources (Spa + Beauty)
# ═══════════════════════════════════════════════════════════════════════
log_head "STEP 7: Create Spa/Beauty Resources"
res_create() {
local r=$(api_post "${BOOKING_URL}/api/v1/resources" \
"{\"shopId\":\"$1\",\"name\":\"$2\",\"resourceType\":\"$3\",\"capacity\":$4}")
check_result "$2 ($3)" "$r"
}
[ -n "$SHOP_SPA" ] && {
log_step "Spa resources..."
res_create "$SHOP_SPA" "Phòng VIP 1" "Room" 1
res_create "$SHOP_SPA" "Phòng VIP 2" "Room" 1
res_create "$SHOP_SPA" "Phòng nhóm" "Room" 3
res_create "$SHOP_SPA" "Giường massage 1" "Bed" 1
res_create "$SHOP_SPA" "Giường massage 2" "Bed" 1
res_create "$SHOP_SPA" "Giường massage 3" "Bed" 1
res_create "$SHOP_SPA" "Phòng xông hơi" "Equipment" 4
}
[ -n "$SHOP_BEAUTY" ] && {
log_step "Beauty resources..."
res_create "$SHOP_BEAUTY" "Phòng phẫu thuật 1" "Room" 1
res_create "$SHOP_BEAUTY" "Phòng phẫu thuật 2" "Room" 1
res_create "$SHOP_BEAUTY" "Phòng laser" "Room" 1
res_create "$SHOP_BEAUTY" "Phòng tư vấn" "Room" 2
res_create "$SHOP_BEAUTY" "Giường tiêm filler" "Bed" 1
res_create "$SHOP_BEAUTY" "Máy Thermage" "Equipment" 1
}
# ═══════════════════════════════════════════════════════════════════════
# STEP 8: Create Appointments
# ═══════════════════════════════════════════════════════════════════════
log_head "STEP 8: Create Appointments"
TODAY=$(date +%Y-%m-%d)
TOMORROW=$(date -v+1d +%Y-%m-%d 2>/dev/null || date -d "+1 day" +%Y-%m-%d 2>/dev/null || echo "2026-03-01")
DUMMY_SVC="00000000-0000-0000-0000-000000000001"
appt_create() {
local r=$(api_post "${BOOKING_URL}/api/v1/appointments" \
"{\"shopId\":\"$1\",\"serviceId\":\"$DUMMY_SVC\",\"startTime\":\"$2\",\"endTime\":\"$3\",\"status\":\"$4\"}")
check_result "Appt $2 ($4)" "$r"
}
[ -n "$SHOP_SPA" ] && {
log_step "Spa appointments..."
appt_create "$SHOP_SPA" "${TODAY}T09:00:00" "${TODAY}T10:00:00" "Confirmed"
appt_create "$SHOP_SPA" "${TODAY}T10:30:00" "${TODAY}T11:30:00" "Confirmed"
appt_create "$SHOP_SPA" "${TODAY}T14:00:00" "${TODAY}T15:30:00" "Pending"
appt_create "$SHOP_SPA" "${TOMORROW}T09:00:00" "${TOMORROW}T10:00:00" "Scheduled"
appt_create "$SHOP_SPA" "${TOMORROW}T11:00:00" "${TOMORROW}T12:00:00" "Scheduled"
}
[ -n "$SHOP_BEAUTY" ] && {
log_step "Beauty appointments..."
appt_create "$SHOP_BEAUTY" "${TODAY}T10:00:00" "${TODAY}T11:00:00" "Confirmed"
appt_create "$SHOP_BEAUTY" "${TODAY}T13:00:00" "${TODAY}T14:30:00" "Pending"
appt_create "$SHOP_BEAUTY" "${TOMORROW}T09:00:00" "${TOMORROW}T10:30:00" "Scheduled"
}
# ═══════════════════════════════════════════════════════════════════════
# DONE
# ═══════════════════════════════════════════════════════════════════════
log_head "SEED COMPLETE"
echo ""
echo -e "${GREEN}═══════════════════════════════════════════════════${NC}"
echo -e "${GREEN} ✓ Demo data seeded successfully!${NC}"
echo -e "${GREEN}═══════════════════════════════════════════════════${NC}"
echo ""
echo " Login:"
echo " Email: hongochai10@icloud.com"
echo " Password: Velik@2026"
echo ""
echo " Admin: http://localhost:3001/admin"
echo " Stores: http://localhost:3001/admin/stores"
echo ""