# Task H: PDF Generation + Approved Document Persistence ## ALLA OS CRM vNext คุณคือ Senior Full-stack Engineer ให้ implement PDF generation สำหรับ Quotation โดยต่อยอดจาก Task G ## ต้องอ่านก่อน ```txt docs/implementation/task-a-template-audit.md docs/implementation/technical-debt.md docs/adr/0008-attachment-storage-strategy.md src/features/foundation/document-template/** src/features/crm/quotations/document/** src/features/crm/quotations/** src/features/foundation/approval/** src/db/schema.ts ``` ## Goal สร้าง production foundation สำหรับ: ```txt Generate PDF from pdfme template Preview/download PDF Persist approved PDF snapshot Attach generated PDF metadata to quotation ``` ## Scope H1: PDF Generation Service สร้าง service: ```txt src/features/foundation/pdf-generator/** ``` Functions: ```ts generatePdfFromTemplate(input) generateQuotationPdf(quotationId) generateQuotationPreviewPdf(quotationId) generateApprovedQuotationPdf(quotationId) ``` Rules: * ใช้ templateVersion + schemaJson จาก Task G * ใช้ `buildQuotationDocumentData` * ใช้ `mapDocumentDataToTemplateInput` * ห้าม generate จาก client * validate organizationId ทุกครั้ง ## Scope H2: PDF Download APIs เพิ่ม routes: ```txt src/app/api/crm/quotations/[id]/pdf-preview/route.ts src/app/api/crm/quotations/[id]/pdf-download/route.ts src/app/api/crm/quotations/[id]/approved-pdf/route.ts ``` Behavior: ```txt pdf-preview = generate PDF ชั่วคราวจาก current data pdf-download = download quotation PDF approved-pdf = generate/store approved PDF ``` Rules: * preview/download ต้อง check permission * approved-pdf ต้องอนุญาตเฉพาะ approved quotation * response ต้องเป็น application/pdf * filename ใช้ quotation code ## Scope H3: Approved Snapshot Persistence เมื่อ quotation approved แล้ว หรือเมื่อกด generate approved PDF: ให้ persist: ```txt approvedSnapshot approvedPdfUrl approvedAt templateVersionId ``` ถ้า schema ยังไม่มี field บางตัว ให้เพิ่มอย่างระวัง Snapshot ต้องเก็บ: ```txt quotation data items customers topics approval timeline templateVersionId templateInput generatedAt generatedBy ``` ## Scope H4: Attachment Metadata Integration หลัง generate approved PDF ให้สร้าง attachment metadata: ```txt fileName originalFileName filePath fileSize fileType = application/pdf description = Approved quotation PDF uploadedBy uploadedAt ``` ถ้ายังไม่มี storage provider จริง: * ใช้ local/generated path placeholder ได้ * ระบุ technical debt ชัดเจน ## Scope H5: Quotation UI Integration ใน quotation detail: เพิ่ม actions: ```txt Preview PDF Download PDF Generate Approved PDF View Approved PDF ``` Rules: * Preview PDF ใช้ได้กับ draft/pending/approved * Generate Approved PDF ใช้ได้เฉพาะ approved * ถ้ามี approvedPdfUrl แล้ว แสดง View Approved PDF * แสดง template version ที่ใช้ ## Scope H6: Approval Integration หลัง final approval สำเร็จ: ```txt quotation.status = approved ``` ให้เตรียม hook หรือ optional call: ```ts prepareApprovedQuotationSnapshot() ``` ถ้า generate PDF อัตโนมัติยังเสี่ยง ให้ทำ manual action ก่อน Recommendation: ```txt Task H: manual generate approved PDF Future: auto-generate after final approval ``` ## Permissions เพิ่มถ้ายังไม่มี: ```txt crm.quotation.pdf.preview crm.quotation.pdf.download crm.quotation.pdf.generate_approved ``` ## Audit Audit actions: ```txt crm_quotation_pdf_preview optional crm_quotation_pdf_download optional crm_quotation_pdf_generate_approved required ``` Preview/download audit ไม่บังคับ Generate approved PDF ต้อง audit ## ห้ามทำ ```txt Template drag/drop designer Notification Dashboard KPI Report External object storage production Email sending ``` ## Output สรุป: 1. Files Added 2. Files Modified 3. PDF Generator Added 4. API Routes Added 5. UI Actions Added 6. Approved Snapshot Persistence 7. Attachment Metadata Integration 8. Permission Added 9. Audit Integration 10. Remaining Risks 11. Task I Readiness ## Definition of Done Task H ผ่านเมื่อ: ✔ generate PDF จาก pdfme template ได้ ✔ preview/download PDF ได้ ✔ approved quotation generate approved PDF ได้ ✔ approved snapshot ถูก persist ✔ attachment metadata ถูกสร้าง ✔ UI มี PDF actions ✔ permission guard ครบ ✔ audit generate approved PDF ✔ ยังไม่ทำ template designer ✔ ยังไม่ทำ notification/report