# Task D: Enquiry Production Module ## ALLA OS CRM vNext คุณคือ Senior Full-stack Engineer ให้ implement Enquiry production module โดยต่อยอดจาก Task A, B, B.1, C ## ต้องอ่านก่อน ```txt 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 สำหรับ: ```txt Enquiry Enquiry Follow-up / Activity Customer + Contact linkage ``` ยังไม่ทำ: ```txt Quotation production Approval production PDF Generator Report Dashboard KPI จริง ``` ## Core Rules ```txt organizationId = tenant boundary branchId = business sub-scope ``` ทุก enquiry ต้องมี `organizationId` `branchId` ใช้เป็น optional business/document scope ห้ามใช้ mock CRM service ห้าม import จาก: ```txt src/features/crm-demo/** src/constants/mock-api* ``` ## Business Flow Enquiry คือ Sales Opportunity ก่อนออกใบเสนอราคา ```txt 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` ตารางหลัก: ```txt crm_enquiries ``` Fields ขั้นต่ำ: ```txt 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: * `organizationId` required * `customerId` required * `contactId` optional * `code` unique ภายใน organization * `status`, `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: ```txt crm_enquiry_followups ``` Fields ขั้นต่ำ: ```txt 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: ```txt 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 ``` รองรับ: ```txt 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 แนะนำ: ```txt 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 สร้าง: ```txt 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 จาก: ```txt src/features/products/** src/features/users/** src/features/crm/customers/** ``` ## Scope D5: Enquiry UI แทน placeholder routes: ```txt /dashboard/crm/enquiries /dashboard/crm/enquiries/[id] ``` List page ต้องมี: ```txt 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: ```txt Overview Follow-ups Activity Related Quotations Placeholder ``` ## Scope D6: Enquiry Form ใช้: ```txt useAppForm Zod Sheet/Dialog pattern React Query mutation ``` Create/Edit fields: ```txt 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 ต้องมี: ```txt 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` ใช้: ```txt 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 ```txt Quotation schema Quotation API Approval schema Approval workflow PDF generation Report Dashboard KPI จริง Notification ``` ## Output หลังทำเสร็จ สรุป: 1. Files Added 2. Files Modified 3. Schema Added 4. API Routes Added 5. UI Routes Completed 6. Permissions Used 7. Audit Integration 8. Document Sequence Integration 9. Customer/Contact Integration 10. Remaining Risks 11. 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