# 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
