# Task P.7 - Document Assembly Framework ## Objective Build a generic Document Assembly Framework that can merge generated CRM PDFs with static PDF documents from the Document Library. Primary use case: ```text Quotation PDF + SLA PDF + Warranty PDF + Datasheet PDF = Final Customer PDF ``` This task must be generic and reusable for future document types. --- # Prerequisites Completed: * P.4 PDF Runtime * P.5 Document Template Management * P.5.1 Production Hardening * P.6 Document Library Foundation * P.6.1 Document Sequence Scope Refactor --- # Scope Included: * Generic assembly engine * PDF merge using pdfme manipulator or approved merge library * Assembly policy model * Document source resolution * Document ordering * Storage of final assembled artifact * Quotation integration * Audit and regression checks Excluded: * Render Configuration UI * User-selectable append options * Template Designer * New PDF template design * Editing SLA/Warranty contents --- # Core Concept The framework must not be hardcoded to Quotation only. Design around: ```text Input Documents ↓ Assembly Policy ↓ Assembly Engine ↓ Merged PDF ↓ Final Artifact ``` --- # Supported Input Sources The assembly engine must support these sources: ## 1. Generated Document Example: * Quotation PDF generated from PDF Runtime ## 2. Document Library PDF Example: * SLA * Warranty * Company Profile * Datasheet * Drawing * Certificate ## 3. Future External Attachment Reserved for later phases. --- # Assembly Policy Create an assembly policy model. Example: ```ts interface AssemblyPolicy { documentType: string; organizationId: string; productType?: string; brand?: string; language?: string; sources: AssemblySourcePolicy[]; } ``` ```ts interface AssemblySourcePolicy { sourceType: 'generated' | 'document_library'; role: 'main' | 'sla' | 'warranty' | 'datasheet' | 'drawing' | 'appendix'; required: boolean; order: number; libraryCode?: string; } ``` --- # Default Quotation Assembly Initial quotation policy: ```text 1. Generated Quotation PDF 2. SLA PDF 3. Warranty PDF 4. Datasheet / Drawing if configured ``` Do not make append documents user-selectable yet. Use default policy only. --- # Document Resolution The engine must resolve Document Library versions by: * organization * brand * product type * language * document type * active version Resolution must be deterministic. If multiple candidates exist, apply clear priority rules. --- # Missing Document Behavior If a required append document is missing: * assembly must fail with a business-readable error If an optional append document is missing: * skip and record warning --- # PDF Merge Use pdfme manipulator merge capability or an approved server-side PDF merge utility. Requirements: * preserve page order * preserve all pages * support multiple input PDFs * return final merged PDF bytes * avoid mutating source PDFs --- # Final Artifact Store the assembled PDF as a new artifact. Metadata should include: * id * organizationId * sourceDocumentType * sourceDocumentId * sourceDocumentCode * assemblyPolicy * sourceArtifacts * finalFileName * storageKey * checksum * fileSize * pageCount * generatedAt * generatedBy Do not overwrite approved quotation PDF artifact. The assembled artifact is a separate output. --- # Quotation Integration Add quotation-level service support: ```text generate quotation PDF ↓ resolve assembly policy ↓ resolve append documents ↓ merge ↓ persist final assembled artifact ↓ return preview/download ``` Recommended API endpoints: ```text GET /api/crm/quotations/[id]/assembled-pdf POST /api/crm/quotations/[id]/assembled-pdf/generate GET /api/crm/quotations/[id]/assembled-pdf/download ``` --- # Storage Reuse existing storage abstraction. Do not store merged PDF binary in database. Store: * storage key * checksum * file size * page count * metadata --- # Audit Logging Record audit logs for: * assembly started * source document resolved * source document missing * merge completed * artifact stored * assembly failed * assembled artifact downloaded --- # Validation Validate before merge: * generated main PDF exists * append PDF exists * file is PDF * file can be read * page count can be determined * source order is valid * required source documents exist --- # Testing Requirements Add tests for: * generated-only assembly * quotation + SLA * quotation + SLA + Warranty * optional missing document * required missing document * invalid source PDF * page order * page count * checksum generation * artifact persistence metadata Run: ```bash npm run typecheck npm run build npm run audit:pdf ``` --- # Regression Requirements Verify: * legacy quotation PDF still works * approved quotation PDF still works * Document Library preview/download still works * product template PDF still works * assembled PDF does not replace source PDF * assembled PDF artifact is stored separately --- # Acceptance Criteria * Generic assembly engine exists. * Engine supports generated PDF + Document Library PDFs. * Quotation can generate assembled PDF. * SLA can be appended after quotation. * Document order is deterministic. * Missing required documents fail clearly. * Missing optional documents warn and continue. * Final merged artifact is stored through storage abstraction. * Source PDFs are not mutated. * Existing PDF runtime remains unchanged. * System is ready for future Render Configuration. --- # Out of Scope ## P.8 * User-selectable append documents * Optional section UI * Per-customer render preferences * Per-quotation assembly choices ## P.9 * Template Designer * Visual PDF editor * Upload/import template designer --- # Final Success Condition Task P.7 is complete when ALLA OS can generate a final assembled quotation PDF by merging the generated quotation PDF with active Document Library PDFs such as SLA or Warranty, store the merged result as a separate artifact, and keep all existing PDF runtime behavior unchanged.