ระบบจัดการทัวร์ครบวงจรสำหรับบริษัทท่องเที่ยว ครอบคลุมการจัดการลูกค้า, การจอง, การติดตาม leads, การคำนวณ commission และอื่นๆ
สำหรับรายละเอียด requirements และ specification ของระบบ กรุณาดูที่:
เอกสารนี้ประกอบด้วย:
- Functional Requirements
- System Specifications
- User Stories
- และรายละเอียดอื่นๆ ที่เกี่ยวข้อง
- Requirements
- คุณสมบัติหลัก
- เทคโนโลยีที่ใช้
- การติดตั้ง
- การตั้งค่า
- การใช้งาน
- โครงสร้างโปรเจค
- API Documentation
- การ Deploy
- Workflow
- Troubleshooting
- ระบบ Authentication และ Authorization แบบ Role-based
- รองรับ 4 roles:
SUPER_ADMIN,ADMIN,SALES,STAFF - จัดการผู้ใช้งาน, เปลี่ยนรหัสผ่าน, อัปเดตโปรไฟล์
- Email verification และ password reset
- จัดการข้อมูลลูกค้า (ชื่อไทย/อังกฤษ, วันเกิด, ติดต่อ)
- จัดการ Passport (หลายเล่มต่อลูกค้า)
- จัดการที่อยู่ (Address)
- จัดการ Food Allergies
- จัดการครอบครัว (Families)
- Tag system สำหรับจัดกลุ่มลูกค้า
- ติดตาม Leads จากหลายช่องทาง (Facebook, Website, LINE, etc.)
- Lead status pipeline (INTERESTED, QUOTED, BOOKED, COMPLETED, CANCELLED)
- Auto-sync lead status จาก booking status
- จัดการข้อมูลลูกค้าใหม่และลูกค้าเดิม
- จัดการข้อมูลทริป (ชื่อ, วันที่, ราคา, จำนวนคน)
- จัดการ Airline และ Airport (IATA codes)
- กำหนดราคา standard และ extra prices
- จัดการการจองทริป
- ระบบ Payment แบบ 3 งวด (First, Second, Third Payment)
- Payment status tracking (DEPOSIT_PENDING, DEPOSIT_PAID, FULLY_PAID, CANCELLED)
- จัดการ Companion Customers
- Extra prices (Single Traveller, Bed, Seat, Bag)
- Discount management
- Room type และ Seat class selection
- คำนวณ commission อัตโนมัติเมื่อ booking เป็น FULLY_PAID
- ติดตาม commission ตาม sales user
- Filter และรายงาน commission
- รองรับเฉพาะ ADMIN และ SUPER_ADMIN
- จัดการ Tasks สำหรับติดตามงาน
- Task status (TODO, IN_PROGRESS, COMPLETED, CANCELLED)
- Contact method tracking (CALL, LINE, MESSENGER)
- เชื่อมโยงกับ Customer
- ระบบแจ้งเตือน
- Passport expiry alerts
- Upcoming trip alerts
- Cron job สำหรับ generate alerts
- Tag management
- Airline & Airport (IATA codes) management
- Next.js 16 - React framework with App Router
- React 19 - UI library
- TypeScript - Type safety
- Tailwind CSS - Styling
- Shadcn/ui - UI component library
- TanStack Query - Data fetching และ caching
- React Hook Form - Form management
- Zod - Schema validation
- date-fns - Date manipulation
- Decimal.js - Precise decimal calculations
- Next.js API Routes - Server-side API
- Prisma - ORM
- PostgreSQL - Database
- NextAuth.js - Authentication
- bcryptjs - Password hashing
- Google Drive API - File upload
- Resend - Email service
- Sonner - Toast notifications
- Node.js 18+
- PostgreSQL 14+
- npm, yarn, pnpm หรือ bun
- Clone repository
git clone <repository-url>
cd thai-chinese-talk- Install dependencies
npm install
# หรือ
pnpm install
# หรือ
yarn install- Setup environment variables
cp .env.example .env.localแก้ไข .env.local ตามที่ต้องการ (ดูรายละเอียดใน การตั้งค่า)
- Setup database
# Generate Prisma Client
npm run prisma:generate
# Run migrations
npm run prisma:migrate
# Seed database (optional)
npm run prisma:seed- Run development server
npm run devเปิดเบราว์เซอร์ไปที่ http://localhost:3000
สร้างไฟล์ .env และตั้งค่าตัวแปรต่อไปนี้:
DATABASE_URL="postgresql://user:password@localhost:5432/the_trip?schema=public"NEXTAUTH_URL="http://localhost:3000"
NEXTAUTH_SECRET="your-secret-key-here"RESEND_API_KEY="re_xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
RESEND_FROM_EMAIL="noreply@yourdomain.com"หมายเหตุ:
- สำหรับ development สามารถใช้
onboarding@resend.devได้ - สำหรับ production ต้อง verify domain ก่อน (ดูรายละเอียดใน RESEND_SETUP.md)
GOOGLE_DRIVE_CLIENT_EMAIL="your-service-account-email@project.iam.gserviceaccount.com"
GOOGLE_DRIVE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n"
GOOGLE_DRIVE_PROJECT_ID="your-project-id"
GOOGLE_DRIVE_ROOT_FOLDER_ID="your-shared-folder-id"- Create PostgreSQL database
CREATE DATABASE the_trip;- Run migrations
npm run prisma:migrate- Seed initial data (optional)
npm run prisma:seed# Start development server
npm run dev
# Run Prisma Studio (Database GUI)
npm run prisma:studio
# Run linting
npm run lint# Build for production
npm run build
# Start production server
npm start# Generate Prisma Client
npm run prisma:generate
# Create new migration
npm run prisma:migrate
# Reset database (⚠️ จะลบข้อมูลทั้งหมด)
npm run prisma:reset
# Seed database
npm run prisma:seedthai-chinese-talk/
├── prisma/
│ ├── schema.prisma # Database schema
│ ├── seed.ts # Seed data
│ └── migrations/ # Database migrations
├── src/
│ ├── app/
│ │ ├── api/ # API routes
│ │ │ ├── auth/ # Authentication endpoints
│ │ │ ├── bookings/ # Booking endpoints
│ │ │ ├── customers/ # Customer endpoints
│ │ │ ├── leads/ # Lead endpoints
│ │ │ ├── trips/ # Trip endpoints
│ │ │ ├── tasks/ # Task endpoints
│ │ │ ├── commissions/ # Commission endpoints
│ │ │ └── cron/ # Cron jobs
│ │ ├── dashboard/ # Dashboard pages
│ │ │ ├── bookings/ # Booking management
│ │ │ ├── customers/ # Customer management
│ │ │ ├── leads/ # Lead management
│ │ │ ├── trips/ # Trip management
│ │ │ ├── tasks/ # Task management
│ │ │ ├── commissions/ # Commission reports
│ │ │ └── admin/ # Admin panel
│ │ ├── login/ # Login page
│ │ └── layout.tsx # Root layout
│ ├── components/ # Reusable components
│ │ ├── ui/ # Shadcn/ui components
│ │ └── upload-image/ # File upload component
│ ├── lib/ # Utilities
│ │ ├── prisma.ts # Prisma client
│ │ ├── auth.ts # Auth configuration
│ │ └── services/ # Business logic
│ │ ├── commission-calculator.ts
│ │ └── lead-sync.ts
│ └── navigation/ # Navigation config
├── public/ # Static files
├── package.json
├── tsconfig.json
├── tailwind.config.ts
└── next.config.ts
POST /api/auth/login- LoginPOST /api/auth/logout- LogoutGET /api/auth/me- Get current userPOST /api/auth/reset-password- Request password resetPOST /api/auth/change-password- Change password
GET /api/customers- List customers (with pagination & filters)POST /api/customers- Create customerGET /api/customers/[id]- Get customer detailsPUT /api/customers/[id]- Update customerDELETE /api/customers/[id]- Delete customer
GET /api/bookings- List bookings (with pagination & filters)POST /api/bookings- Create bookingGET /api/bookings/[id]- Get booking detailsPUT /api/bookings/[id]- Update bookingPOST /api/payments- Create payment
GET /api/leads- List leads (with pagination & filters)POST /api/leads- Create leadGET /api/leads/[id]- Get lead detailsPUT /api/leads/[id]- Update lead
GET /api/trips- List trips (with filters)POST /api/trips- Create tripGET /api/trips/[id]- Get trip detailsPUT /api/trips/[id]- Update trip
GET /api/tasks- List tasks (with pagination & filters)POST /api/tasks- Create taskGET /api/tasks/[id]- Get task detailsPUT /api/tasks/[id]- Update taskDELETE /api/tasks/[id]- Delete task
GET /api/commissions- Get commission summary (ADMIN only)GET /api/commissions/[agentId]- Get commission details for agent
GET /api/cron/alerts- Generate alerts (passport expiry, upcoming trips)
- Push code ไปยัง GitHub
- Import project ใน Vercel
- ตั้งค่า Environment Variables
- Deploy
โปรเจคนี้มี docker-compose.yml สำหรับรัน PostgreSQL:
# Start PostgreSQL
docker-compose up -d
# Stop PostgreSQL
docker-compose downสำหรับ production deployment:
# Build image
docker build -t thai-chinese-talk .
# Run container
docker run -p 3000:3000 --env-file .env.local thai-chinese-talkตั้งค่าตัวแปรต่อไปนี้ใน production environment:
DATABASE_URL- Production database URLNEXTAUTH_URL- Production URLNEXTAUTH_SECRET- Strong secret keyRESEND_API_KEY- Email service API key- และตัวแปรอื่นๆ ตามที่ใช้
- Password hashing ด้วย bcryptjs
- Role-based access control (RBAC)
- Session management ด้วย NextAuth
- SQL injection protection ด้วย Prisma
- Environment variables สำหรับ sensitive data
# Run tests (ถ้ามี)
npm test
# Run linting
npm run lintโปรเจคใช้ Prisma ORM สำหรับจัดการ database schema
ดู schema ได้ที่: prisma/schema.prisma
- User - ผู้ใช้งานระบบ
- Customer - ข้อมูลลูกค้า
- Lead - Leads จากช่องทางต่างๆ
- Trip - ข้อมูลทริป
- Booking - การจอง
- Payment - การชำระเงิน
- Commission - Commission
- Task - งานที่ต้องทำ
- Notification - การแจ้งเตือน
- สร้าง Lead จากช่องทางต่างๆ
- Convert Lead เป็น Booking
- สร้าง Payment (First Payment)
- อัปเดต Payment Status
- Commission ถูกคำนวณอัตโนมัติเมื่อ FULLY_PAID
- Lead status จะ sync อัตโนมัติจาก Booking status
- BOOKED: เมื่อมี booking ที่ DEPOSIT_PAID หรือ FULLY_PAID
- COMPLETED: เมื่อ booking ทั้งหมดเป็น FULLY_PAID
- CANCELLED: เมื่อ booking ทั้งหมดเป็น CANCELLED
# ตรวจสอบว่า PostgreSQL ทำงานอยู่
docker-compose ps
# ตรวจสอบ connection string ใน .env.local
DATABASE_URL="postgresql://user:password@localhost:5432/dbname"# Reset Prisma Client
npm run prisma:generate
# Reset database (⚠️ ลบข้อมูลทั้งหมด)
npm run prisma:reset# Clear Next.js cache
rm -rf .next
# Reinstall dependencies
rm -rf node_modules package-lock.json
npm install[ระบุ license ของโปรเจค]
[รายชื่อ contributors]
สำหรับคำถามหรือปัญหา กรุณาเปิด issue ใน repository
Note: โปรเจคนี้ยังอยู่ในระหว่างการพัฒนา อาจมีการเปลี่ยนแปลง API และ schema ได้