# Task F: Approval Production Module ## ALLA OS CRM vNext คุณคือ Senior Full-stack Engineer ให้ implement Approval Production Module โดยต่อยอดจาก: ```txt Task A Task B Task B.1 Task C Task D Task E Task E.1 ``` Approval Module ต้องเป็น Generic Foundation ที่สามารถใช้กับ: ```txt Quotation Enquiry (future) Purchase Request (future) Purchase Order (future) Document Approval (future) ``` ห้ามผูกกับ Quotation เพียงอย่างเดียว --- # ต้องอ่านก่อน ```txt docs/implementation/task-a-template-audit.md docs/implementation/task-b-template-audit.md docs/implementation/task-b1-foundation-stabilization.md docs/implementation/technical-debt.md docs/adr/0007-quotation-revision-strategy.md docs/adr/0008-attachment-storage-strategy.md Layout.md AGENTS.md .agents/skills/kiranism-shadcn-dashboard src/features/foundation/** src/features/crm/customers/** src/features/crm/enquiries/** src/features/crm/quotations/** src/db/schema.ts ``` --- # Goal สร้าง Approval Engine ที่ reusable ได้ รองรับ: ```txt Submit For Approval Approve Reject Request Change Approval Timeline Approval History Current Approval Status ``` เริ่มใช้กับ Quotation ก่อน --- # Approval Workflow Version 1 รองรับ sequential approval ตัวอย่าง: ```txt Step 1 Sales Manager Step 2 Department Manager Step 3 Top Manager ``` Approval ต้องเดินทีละ step --- # Scope F1: Approval Schema เพิ่ม tables ```txt crm_approval_workflows crm_approval_steps crm_approval_requests crm_approval_actions ``` --- ## crm_approval_workflows ```txt id organizationId code name entityType isActive createdAt updatedAt deletedAt ``` entityType ตัวอย่าง ```txt quotation enquiry purchase_request ``` --- ## crm_approval_steps ```txt id organizationId workflowId stepNumber roleCode roleName isRequired createdAt updatedAt deletedAt ``` ตัวอย่าง ```txt sales_manager department_manager top_manager ``` --- ## crm_approval_requests ```txt id organizationId workflowId entityType entityId currentStep status requestedBy requestedAt completedAt createdAt updatedAt deletedAt ``` status ```txt pending approved rejected returned cancelled ``` --- ## crm_approval_actions ```txt id organizationId approvalRequestId stepNumber action remark actedBy actedAt createdAt updatedAt deletedAt ``` action ```txt approve reject return submit ``` --- # Scope F2: Approval Service สร้าง: ```txt src/features/foundation/approval/** ``` ประกอบด้วย ```txt types.ts service.ts queries.ts mutations.ts ``` Functions ```ts submitForApproval() approveApproval() rejectApproval() returnApproval() cancelApproval() getApprovalRequest() getApprovalTimeline() getCurrentApprovalStep() ``` --- # Scope F3: Quotation Integration เชื่อม Approval เข้ากับ Quotation --- ## Submit For Approval จาก: ```txt draft revised ``` ไป: ```txt pending_approval ``` Rules ```txt ต้องมี item อย่างน้อย 1 รายการ ต้องมี customer ต้องไม่ deleted ``` --- ## Approval Success เมื่อทุก step approve เปลี่ยน quotation status ```txt approved ``` --- ## Reject เปลี่ยน quotation status ```txt rejected ``` --- ## Return เปลี่ยน quotation status ```txt draft ``` และเก็บ remark --- # Scope F4: API Routes สร้าง: ```txt src/app/api/crm/approvals/route.ts src/app/api/crm/approvals/[id]/route.ts src/app/api/crm/approvals/[id]/approve/route.ts src/app/api/crm/approvals/[id]/reject/route.ts src/app/api/crm/approvals/[id]/return/route.ts src/app/api/crm/quotations/[id]/submit-approval/route.ts ``` --- # Scope F5: Permission Model เพิ่ม permissions ```txt crm.approval.read crm.approval.submit crm.approval.approve crm.approval.reject crm.approval.return ``` --- # Scope F6: Approval UI แทน placeholder route ```txt / dashboard / crm / approvals ``` --- Approval List ```txt Pending Approved Rejected Returned ``` ใช้ ```txt PageContainer DataTable ``` --- Approval Detail แสดง ```txt Request Information Workflow Current Step Timeline Actions ``` --- # Scope F7: Quotation Detail Integration ใน ```txt / dashboard / crm / quotations / [id] ``` เพิ่ม ```txt Approval Tab ``` แสดง ```txt Current Status Current Step Timeline ``` Actions ```txt Submit For Approval Approve Reject Return ``` ตาม permission --- # Scope F8: Audit Integration ทุก action ต้อง audit entityType ```txt crm_approval_request crm_approval_action ``` --- # Scope F9: Seed Data เพิ่มใน ```txt foundation.seed.ts ``` Workflow เริ่มต้น ```txt Quotation Standard Approval ``` Steps ```txt 1 sales_manager 2 department_manager 3 top_manager ``` Seed แบบ idempotent --- # ห้ามทำ ```txt Email Notification Line Notification Mobile Push PDF Generation Report Dashboard KPI Parallel Approval Conditional Approval Escalation Delegation ``` --- # Output สรุป: 1. Files Added 2. Files Modified 3. Schema Added 4. Approval APIs Added 5. Approval UI Added 6. Quotation Integration 7. Permission Added 8. Audit Integration 9. Seed Added 10. Remaining Risks 11. Task G Readiness --- # Definition of Done Task F ผ่านเมื่อ: ✔ Approval workflow schema พร้อม ✔ Approval request พร้อม ✔ Approval actions พร้อม ✔ Approval timeline พร้อม ✔ Submit For Approval ใช้งานได้ ✔ Approve ใช้งานได้ ✔ Reject ใช้งานได้ ✔ Return ใช้งานได้ ✔ Quotation เชื่อม approval แล้ว ✔ Audit ครบทุก approval action ✔ Approval UI ใช้งานได้ ✔ ไม่ทำ notification ✔ ไม่ทำ PDF ✔ ไม่ทำ report ✔ พร้อมเริ่ม Task G