diff --git a/scripts/seed-demo-data.sh b/scripts/seed-demo-data.sh new file mode 100755 index 00000000..d9949a37 --- /dev/null +++ b/scripts/seed-demo-data.sh @@ -0,0 +1,432 @@ +#!/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 "" diff --git a/services/merchant-service-net/src/MerchantService.API/Application/Queries/Shops/GetShopsQueryHandler.cs b/services/merchant-service-net/src/MerchantService.API/Application/Queries/Shops/GetShopsQueryHandler.cs index 1b9dda7d..5fa1e7fb 100644 --- a/services/merchant-service-net/src/MerchantService.API/Application/Queries/Shops/GetShopsQueryHandler.cs +++ b/services/merchant-service-net/src/MerchantService.API/Application/Queries/Shops/GetShopsQueryHandler.cs @@ -51,11 +51,11 @@ public class GetMyShopsQueryHandler : IRequestHandler