7.3 KiB
Task D: Enquiry Production Module
ALLA OS CRM vNext
คุณคือ Senior Full-stack Engineer ให้ implement Enquiry production module โดยต่อยอดจาก Task A, B, B.1, C
ต้องอ่านก่อน
docs/implementation/task-a-template-audit.md
docs/implementation/task-b-template-audit.md
docs/implementation/task-b1-foundation-stabilization.md
Layout.md
AGENTS.md
.agents/skills/kiranism-shadcn-dashboard
src/db/schema.ts
src/features/foundation/**
src/features/crm/customers/**
src/app/dashboard/crm/**
เป้าหมาย
สร้าง production module สำหรับ:
Enquiry
Enquiry Follow-up / Activity
Customer + Contact linkage
ยังไม่ทำ:
Quotation production
Approval production
PDF Generator
Report
Dashboard KPI จริง
Core Rules
organizationId = tenant boundary
branchId = business sub-scope
ทุก enquiry ต้องมี organizationId
branchId ใช้เป็น optional business/document scope
ห้ามใช้ mock CRM service
ห้าม import จาก:
src/features/crm-demo/**
src/constants/mock-api*
Business Flow
Enquiry คือ Sales Opportunity ก่อนออกใบเสนอราคา
Customer
└─ Contact
└─ Enquiry
└─ Quotation ใน Task ถัดไป
1 Customer มีหลาย Enquiry ได้ 1 Enquiry อ้างอิง Contact ได้ 1 Enquiry ต่อไปจะมีหลาย Quotation ได้ แต่ Task D ยังไม่ต้องสร้าง Quotation
Scope D1: Enquiry Schema
เพิ่ม production schema ใน src/db/schema.ts
ตารางหลัก:
crm_enquiries
Fields ขั้นต่ำ:
id
organizationId
branchId
code
customerId
contactId
title
description
requirement
projectName
projectLocation
productType
status
priority
leadChannel
estimatedValue
chancePercent
expectedCloseDate
competitor
source
notes
isHotProject
isActive
createdAt
updatedAt
deletedAt
createdBy
updatedBy
Rules:
organizationIdrequiredcustomerIdrequiredcontactIdoptionalcodeunique ภายใน organizationstatus,productType,priority,leadChannelใช้ master options- code ใช้ document sequence
enquiry -> ENQ - create/update/delete ต้อง audit log
- ห้ามสร้าง quotation table ใน Task D
Scope D2: Enquiry Follow-up Schema
เพิ่ม table:
crm_enquiry_followups
Fields ขั้นต่ำ:
id
organizationId
enquiryId
followupDate
followupType
contactId
outcome
notes
nextFollowupDate
nextAction
createdAt
updatedAt
deletedAt
createdBy
updatedBy
Rules:
- follow-up ต้องอยู่ใน organization เดียวกับ enquiry
- mutation ต้อง audit
- ใช้สำหรับ activity timeline ของ enquiry
Scope D3: Enquiry API
สร้าง route handlers:
src/app/api/crm/enquiries/route.ts
src/app/api/crm/enquiries/[id]/route.ts
src/app/api/crm/enquiries/[id]/followups/route.ts
src/app/api/crm/enquiries/[id]/followups/[followupId]/route.ts
รองรับ:
GET list
POST create
GET detail
PATCH update
DELETE soft delete
GET followups
POST followup
PATCH followup
DELETE followup
Rules:
- ใช้
requireOrganizationAccess - ใช้ permission helper
- filter ด้วย organizationId เสมอ
- customer/contact ต้องอยู่ใน organization เดียวกัน
- create enquiry ต้อง generate code
- ทุก mutation ต้อง audit
Permissions แนะนำ:
crm.enquiry.read
crm.enquiry.create
crm.enquiry.update
crm.enquiry.delete
crm.enquiry.followup.read
crm.enquiry.followup.create
crm.enquiry.followup.update
crm.enquiry.followup.delete
Scope D4: Enquiry Feature Layer
สร้าง:
src/features/crm/enquiries/api/types.ts
src/features/crm/enquiries/api/service.ts
src/features/crm/enquiries/api/queries.ts
src/features/crm/enquiries/api/mutations.ts
src/features/crm/enquiries/schemas/enquiry.schema.ts
src/features/crm/enquiries/server/service.ts
src/features/crm/enquiries/components/**
ใช้ pattern จาก:
src/features/products/**
src/features/users/**
src/features/crm/customers/**
Scope D5: Enquiry UI
แทน placeholder routes:
/dashboard/crm/enquiries
/dashboard/crm/enquiries/[id]
List page ต้องมี:
PageContainer
DataTable
search
status filter
product type filter
priority filter
branch filter
customer filter
create button
edit action
view action
soft delete action
Detail page ใช้ Layout.md Template A
Tabs:
Overview
Follow-ups
Activity
Related Quotations Placeholder
Scope D6: Enquiry Form
ใช้:
useAppForm
Zod
Sheet/Dialog pattern
React Query mutation
Create/Edit fields:
customerId
contactId
title
description
requirement
projectName
projectLocation
branchId
productType
status
priority
leadChannel
estimatedValue
chancePercent
expectedCloseDate
competitor
source
isHotProject
notes
Rules:
- customer dropdown ดึงจาก production customer API
- contact dropdown filter ตาม customer ที่เลือก
- status/productType/priority/leadChannel ดึงจาก master options
- branch ดึงจาก branch scope/master options
- ห้าม hardcode option ใน form
Scope D7: Follow-up UI
ใน Enquiry Detail tab: Follow-ups
ต้องมี:
followup list
create followup
edit followup
delete followup
next followup date
next action
outcome
ใช้ Sheet/Dialog pattern
Scope D8: Activity Timeline
ใน Enquiry Detail เพิ่ม Activity tab
อ่าน audit log จาก tr_audit_logs
ใช้:
entityType = crm_enquiry
entityId = enquiry.id
และ follow-up audit ถ้าเหมาะสม
Scope D9: Customer Detail Integration
ใน Customer Detail page เพิ่ม section/tab หรือ related placeholder ให้เห็น Enquiry ที่เกี่ยวข้องกับ customer
ยังไม่ต้องทำ dashboard KPI
ห้ามทำใน Task D
Quotation schema
Quotation API
Approval schema
Approval workflow
PDF generation
Report
Dashboard KPI จริง
Notification
Output หลังทำเสร็จ
สรุป:
- Files Added
- Files Modified
- Schema Added
- API Routes Added
- UI Routes Completed
- Permissions Used
- Audit Integration
- Document Sequence Integration
- Customer/Contact Integration
- Remaining Risks
- Task E Readiness
Definition of Done
Task D ผ่านเมื่อ:
- Enquiry schema พร้อม
- Enquiry follow-up schema พร้อม
- Enquiry list ใช้ production data
- Enquiry detail ใช้ production data
- Enquiry create/edit/delete ใช้งานได้
- Follow-up create/edit/delete ใช้งานได้
- ใช้ organizationId ทุก query
- customer/contact ต้องอยู่ organization เดียวกัน
- ใช้ master options ใน status/productType/priority/leadChannel
- ใช้ document sequence ตอนสร้าง enquiry
- ใช้ audit log ทุก mutation
- ไม่ import mock CRM
- ไม่ทำ Quotation/Approval