Files
alla-allaos-fullstack/plans/task-d.md
phaichayon 8148850fda tsk-C
compleate
2026-06-15 13:20:39 +07:00

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:

  • 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:

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 หลังทำเสร็จ

สรุป:

  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