taks-p.4.3
This commit is contained in:
582
plans/task-p.4-discovery-report.md
Normal file
582
plans/task-p.4-discovery-report.md
Normal file
@@ -0,0 +1,582 @@
|
||||
# Task P.4 Discovery Report
|
||||
|
||||
## Scope
|
||||
|
||||
This report documents the mandatory discovery phase for `task-p.4.md` before any implementation begins.
|
||||
|
||||
Task P.4 requires:
|
||||
|
||||
- introducing a dedicated Product Item page between the existing Customer Detail page and Condition + Signature page
|
||||
- using the existing CRM template management workflow
|
||||
- creating new template versions only
|
||||
- preserving backward compatibility for existing quotation template versions
|
||||
|
||||
No implementation has been performed at the time of writing this report.
|
||||
|
||||
---
|
||||
|
||||
## 1. Existing Architecture
|
||||
|
||||
### 1.1 CRM Template Module
|
||||
|
||||
The CRM template settings page is served by:
|
||||
|
||||
- [src/app/dashboard/crm/settings/templates/page.tsx](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/app/dashboard/crm/settings/templates/page.tsx:9)
|
||||
|
||||
This page:
|
||||
|
||||
- checks access with `crmDocumentTemplateRead`
|
||||
- prefetches quotation PDFMe templates via `documentTemplatesQueryOptions({ documentType: 'quotation', fileType: 'pdfme' })`
|
||||
- renders the admin UI through `TemplateSettings`
|
||||
|
||||
The main template admin UI lives in:
|
||||
|
||||
- [src/features/foundation/document-template/components/template-settings.tsx](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/foundation/document-template/components/template-settings.tsx:720)
|
||||
|
||||
This module already supports:
|
||||
|
||||
- template metadata CRUD
|
||||
- template version CRUD
|
||||
- raw `schemaJson` editing
|
||||
- mapping CRUD
|
||||
- version activation
|
||||
- template detail inspection
|
||||
|
||||
Important internal UI areas:
|
||||
|
||||
- template metadata dialog: [template-settings.tsx](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/foundation/document-template/components/template-settings.tsx:241)
|
||||
- version dialog: [template-settings.tsx](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/foundation/document-template/components/template-settings.tsx:292)
|
||||
- version JSON editing: [template-settings.tsx](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/foundation/document-template/components/template-settings.tsx:360)
|
||||
- template detail card and version tabs: [template-settings.tsx](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/foundation/document-template/components/template-settings.tsx:527)
|
||||
|
||||
### 1.2 Template APIs
|
||||
|
||||
Template/version/mapping APIs already exist and are reused by the CRM settings route group:
|
||||
|
||||
- [src/app/api/crm/document-templates/[id]/versions/route.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/app/api/crm/document-templates/[id]/versions/route.ts:1)
|
||||
- [src/app/api/crm/settings/document-templates/versions/[id]/route.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/app/api/crm/settings/document-templates/versions/[id]/route.ts:1)
|
||||
- [src/app/api/crm/settings/document-templates/versions/[id]/mappings/route.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/app/api/crm/settings/document-templates/versions/[id]/mappings/route.ts:1)
|
||||
|
||||
### 1.3 Document Template Foundation
|
||||
|
||||
The main document-template business logic is centralized in:
|
||||
|
||||
- [src/features/foundation/document-template/server/service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/foundation/document-template/server/service.ts:1)
|
||||
|
||||
Important responsibilities already covered:
|
||||
|
||||
- template resolution for runtime documents
|
||||
- version resolution
|
||||
- mapping resolution
|
||||
- mapping-to-input transformation
|
||||
- active/default template handling
|
||||
|
||||
Key functions:
|
||||
|
||||
- `resolveTemplateMappings`: [service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/foundation/document-template/server/service.ts:168)
|
||||
- `createDocumentTemplateVersion`: [service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/foundation/document-template/server/service.ts:424)
|
||||
- `updateDocumentTemplateVersion`: [service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/foundation/document-template/server/service.ts:449)
|
||||
- `setDocumentTemplateVersionActive`: [service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/foundation/document-template/server/service.ts:474)
|
||||
- `resolveTemplateForDocument`: [service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/foundation/document-template/server/service.ts:612)
|
||||
- `mapDocumentDataToTemplateInput`: [service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/foundation/document-template/server/service.ts:745)
|
||||
|
||||
### 1.4 Quotation Document Runtime
|
||||
|
||||
Quotation document runtime logic is handled in:
|
||||
|
||||
- [src/features/crm/quotations/document/server/service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/crm/quotations/document/server/service.ts:263)
|
||||
|
||||
Key functions:
|
||||
|
||||
- `buildQuotationDocumentData`: [service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/crm/quotations/document/server/service.ts:263)
|
||||
- `getQuotationDocumentPreviewData`: [service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/crm/quotations/document/server/service.ts:661)
|
||||
- `prepareApprovedQuotationSnapshot`: [service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/crm/quotations/document/server/service.ts:718)
|
||||
|
||||
Topic-based dynamic layout is currently handled by:
|
||||
|
||||
- [src/features/crm/quotations/document/server/pdf-topic-engine.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/crm/quotations/document/server/pdf-topic-engine.ts:66)
|
||||
|
||||
Formatting helpers are in:
|
||||
|
||||
- [src/features/crm/quotations/document/server/pdfme-transforms.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/crm/quotations/document/server/pdfme-transforms.ts:86)
|
||||
|
||||
### 1.5 PDF Generation Foundation
|
||||
|
||||
PDF generation is centralized in:
|
||||
|
||||
- [src/features/foundation/pdf-generator/server/service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/foundation/pdf-generator/server/service.ts:99)
|
||||
|
||||
Important capabilities already provided:
|
||||
|
||||
- font loading
|
||||
- PDFMe plugin registration
|
||||
- preview PDF generation
|
||||
- download PDF generation
|
||||
- approved PDF artifact generation and persistence
|
||||
|
||||
Key functions:
|
||||
|
||||
- `getPdfPlugins`: [service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/foundation/pdf-generator/server/service.ts:44)
|
||||
- `resolvePdfFonts`: [service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/foundation/pdf-generator/server/service.ts:53)
|
||||
- `generatePdfFromTemplate`: [service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/foundation/pdf-generator/server/service.ts:99)
|
||||
- `generateQuotationPdf`: [service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/foundation/pdf-generator/server/service.ts:300)
|
||||
- `generateQuotationPreviewPdf`: [service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/foundation/pdf-generator/server/service.ts:317)
|
||||
- `generateApprovedQuotationPdf`: [service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/foundation/pdf-generator/server/service.ts:321)
|
||||
|
||||
---
|
||||
|
||||
## 2. Dependency Graph
|
||||
|
||||
### 2.1 Runtime Flow
|
||||
|
||||
Quotation to PDF currently flows as:
|
||||
|
||||
1. quotation APIs request document data or document preview
|
||||
2. quotation server service builds normalized `documentData`
|
||||
3. runtime resolves the active template and active version
|
||||
4. runtime resolves mappings for the selected version
|
||||
5. document data is transformed into PDFMe `templateInput`
|
||||
6. topic engine clones and expands the topic page dynamically
|
||||
7. merged template plus merged inputs are passed to PDFMe generator
|
||||
8. resulting PDF is returned as preview, download, or approved artifact
|
||||
|
||||
### 2.2 Route-Level Graph
|
||||
|
||||
- document data route: [src/app/api/crm/quotations/[id]/document-data/route.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/app/api/crm/quotations/[id]/document-data/route.ts:15)
|
||||
- calls `buildQuotationDocumentData`
|
||||
- document preview route: [src/app/api/crm/quotations/[id]/document-preview/route.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/app/api/crm/quotations/[id]/document-preview/route.ts:15)
|
||||
- calls `getQuotationDocumentPreviewData`
|
||||
- PDF preview route: [src/app/api/crm/quotations/[id]/pdf-preview/route.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/app/api/crm/quotations/[id]/pdf-preview/route.ts:15)
|
||||
- calls `generateQuotationPreviewPdf`
|
||||
- PDF download route: [src/app/api/crm/quotations/[id]/pdf-download/route.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/app/api/crm/quotations/[id]/pdf-download/route.ts:15)
|
||||
- calls `generateQuotationPdf`
|
||||
- approved PDF route: [src/app/api/crm/quotations/[id]/approved-pdf/route.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/app/api/crm/quotations/[id]/approved-pdf/route.ts:20)
|
||||
- calls approved artifact retrieval/generation flow
|
||||
|
||||
### 2.3 UI Preview Graph
|
||||
|
||||
Client document preview uses:
|
||||
|
||||
- [src/features/crm/quotations/document/service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/crm/quotations/document/service.ts:1)
|
||||
- [src/features/crm/quotations/document/queries.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/crm/quotations/document/queries.ts:1)
|
||||
- [src/features/crm/quotations/components/quotation-document-preview.tsx](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/crm/quotations/components/quotation-document-preview.tsx:1)
|
||||
|
||||
This preview currently renders document data and item summaries for inspection, but it is not the PDF layout engine itself.
|
||||
|
||||
---
|
||||
|
||||
## 3. Current Template Lifecycle
|
||||
|
||||
### 3.1 Storage Model
|
||||
|
||||
Template entities are stored in:
|
||||
|
||||
- `crm_document_templates`: [schema.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/db/schema.ts:880)
|
||||
- `crm_document_template_versions`: [schema.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/db/schema.ts:909)
|
||||
- `crm_document_template_mappings`: [schema.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/db/schema.ts:933)
|
||||
- `crm_document_template_table_columns`: [schema.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/db/schema.ts:957)
|
||||
|
||||
### 3.2 Lifecycle Rules
|
||||
|
||||
Observed lifecycle:
|
||||
|
||||
1. create template metadata
|
||||
2. create template version with raw `schemaJson`
|
||||
3. add/update mappings for placeholders
|
||||
4. activate the desired version
|
||||
5. runtime automatically resolves the active version
|
||||
|
||||
### 3.3 Selection Rules at Runtime
|
||||
|
||||
Runtime template resolution is implemented in:
|
||||
|
||||
- [resolveTemplateForDocument](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/foundation/document-template/server/service.ts:612)
|
||||
|
||||
Selection behavior:
|
||||
|
||||
- only active templates are considered
|
||||
- product-type-specific match is preferred
|
||||
- default product type fallback exists
|
||||
- active versions are filtered
|
||||
- the latest active version by creation order is selected
|
||||
|
||||
### 3.4 Activation and Default Handling
|
||||
|
||||
- default template normalization is handled by `normalizeDefaultTemplate`
|
||||
- version activation is handled by `setDocumentTemplateVersionActive`
|
||||
- inactive versions remain stored for traceability
|
||||
|
||||
### 3.5 Template Source / Seed Coupling
|
||||
|
||||
Current template source loading in seeds and audit utilities still points to:
|
||||
|
||||
- `ALLA_template_pdfme_fainal3.json`
|
||||
- `ONVALLA_template_pdfme_fainal3.json`
|
||||
|
||||
References:
|
||||
|
||||
- [src/db/seeds/foundation.seed.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/db/seeds/foundation.seed.ts:854)
|
||||
- [scripts/pdf-audit-utils.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/scripts/pdf-audit-utils.ts:667)
|
||||
- [scripts/reseed-pdf-template-version.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/scripts/reseed-pdf-template-version.ts:1)
|
||||
|
||||
This means any new product-item template version likely needs seed/audit support updates.
|
||||
|
||||
---
|
||||
|
||||
## 4. Runtime Rendering Flow
|
||||
|
||||
### 4.1 Current Preview Builder
|
||||
|
||||
`getQuotationDocumentPreviewData` currently does the following:
|
||||
|
||||
1. builds quotation document data
|
||||
2. resolves the active quotation PDFMe template
|
||||
3. resolves version mappings
|
||||
4. maps document data to template inputs
|
||||
5. normalizes aliases between field names and placeholder tokens
|
||||
6. runs the topic engine
|
||||
7. returns merged template input plus rendered schema
|
||||
|
||||
Reference:
|
||||
|
||||
- [src/features/crm/quotations/document/server/service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/crm/quotations/document/server/service.ts:661)
|
||||
|
||||
### 4.2 Topic Engine Behavior
|
||||
|
||||
The existing topic engine:
|
||||
|
||||
- clones template pages
|
||||
- assumes the dynamic topic page is at `targetPageIndex: 1`
|
||||
- looks for `topic` and `data_topic`
|
||||
- inserts repeated topic blocks
|
||||
- moves signature/keep-together fields to the last generated page when needed
|
||||
|
||||
Key implementation details:
|
||||
|
||||
- default options: [pdf-topic-engine.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/crm/quotations/document/server/pdf-topic-engine.ts:14)
|
||||
- target page lookup: [pdf-topic-engine.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/crm/quotations/document/server/pdf-topic-engine.ts:76)
|
||||
- dynamic field lookup: [pdf-topic-engine.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/crm/quotations/document/server/pdf-topic-engine.ts:83)
|
||||
- page break behavior: [pdf-topic-engine.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/crm/quotations/document/server/pdf-topic-engine.ts:147)
|
||||
- keep-together footer/signature handling: [pdf-topic-engine.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/crm/quotations/document/server/pdf-topic-engine.ts:169)
|
||||
|
||||
### 4.3 PDF Generator Runtime
|
||||
|
||||
The generator currently registers these PDFMe plugins:
|
||||
|
||||
- `text`
|
||||
- `image`
|
||||
- `line`
|
||||
- `table`
|
||||
|
||||
Reference:
|
||||
|
||||
- [src/features/foundation/pdf-generator/server/service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/foundation/pdf-generator/server/service.ts:44)
|
||||
|
||||
This is important because Product Item page support should reuse the existing official PDFMe `table` plugin instead of introducing a custom renderer.
|
||||
|
||||
---
|
||||
|
||||
## 5. Existing PDF Templates
|
||||
|
||||
### 5.1 Located Template Files
|
||||
|
||||
Current PDFMe template assets found in the repository:
|
||||
|
||||
- [src/pdfme_template/ALLA_template_pdfme_fainal3.json](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/pdfme_template/ALLA_template_pdfme_fainal3.json)
|
||||
- [src/pdfme_template/ONVALLA_template_pdfme_fainal3.json](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/pdfme_template/ONVALLA_template_pdfme_fainal3.json)
|
||||
|
||||
### 5.2 Current Page Count
|
||||
|
||||
Both templates currently contain exactly 2 pages.
|
||||
|
||||
### 5.3 Page Purposes
|
||||
|
||||
For `ALLA_template_pdfme_fainal3.json`:
|
||||
|
||||
- Page 1
|
||||
- company header
|
||||
- customer detail
|
||||
- quotation meta
|
||||
- project fields
|
||||
- quotation price summary table
|
||||
- Page 2
|
||||
- dynamic topic label/table placeholders
|
||||
- closing message
|
||||
- signature blocks
|
||||
|
||||
Observed markers from template JSON:
|
||||
|
||||
- page 1 price table field `quotation_price_data`
|
||||
- page 2 dynamic topic fields `topic` and `data_topic`
|
||||
- page 2 static closing/signature fields `Please_do_not`, `yours_faithfuly`, `app1`, `app2`, `app3`
|
||||
|
||||
Relevant references:
|
||||
|
||||
- quotation price table marker: [ALLA template](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/pdfme_template/ALLA_template_pdfme_fainal3.json:345)
|
||||
- topic marker: [ALLA template](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/pdfme_template/ALLA_template_pdfme_fainal3.json:962)
|
||||
- topic data marker: [ALLA template](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/pdfme_template/ALLA_template_pdfme_fainal3.json:1031)
|
||||
|
||||
### 5.4 Base PDF Structure
|
||||
|
||||
The current templates use PDFMe object-style `basePdf` with width/height/padding and static schema, not an imported fixed PDF file path.
|
||||
|
||||
This is favorable for dynamic table layout and page growth.
|
||||
|
||||
---
|
||||
|
||||
## 6. Product Item Flow
|
||||
|
||||
### 6.1 Data Origin
|
||||
|
||||
Quotation product items originate from:
|
||||
|
||||
- `crm_quotation_items`: [schema.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/db/schema.ts:613)
|
||||
|
||||
Current persisted fields include:
|
||||
|
||||
- `itemNumber`
|
||||
- `productType`
|
||||
- `description`
|
||||
- `quantity`
|
||||
- `unit`
|
||||
- `unitPrice`
|
||||
- `discount`
|
||||
- `discountType`
|
||||
- `taxRate`
|
||||
- `totalPrice`
|
||||
- `notes`
|
||||
|
||||
### 6.2 Server Mapping
|
||||
|
||||
Quotation item records are normalized in:
|
||||
|
||||
- [src/features/crm/quotations/server/service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/crm/quotations/server/service.ts:208)
|
||||
|
||||
Quotation document data currently exposes item fields in:
|
||||
|
||||
- [src/features/crm/quotations/document/server/service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/crm/quotations/document/server/service.ts:564)
|
||||
|
||||
Currently exposed document item fields:
|
||||
|
||||
- `itemNumber`
|
||||
- `productTypeCode`
|
||||
- `productTypeLabel`
|
||||
- `description`
|
||||
- `quantity`
|
||||
- `unitCode`
|
||||
- `unitLabel`
|
||||
- `unitPrice`
|
||||
- `discount`
|
||||
- `discountTypeCode`
|
||||
- `taxRate`
|
||||
- `totalPrice`
|
||||
- `notes`
|
||||
|
||||
### 6.3 Existing Table Mapping Support
|
||||
|
||||
There is already existing seed/audit support for an `items_table` mapping:
|
||||
|
||||
- [scripts/pdf-audit-utils.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/scripts/pdf-audit-utils.ts:312)
|
||||
|
||||
Current seeded columns:
|
||||
|
||||
- `Item` → `itemNumber`
|
||||
- `Description` → `description`
|
||||
- `Qty` → `quantity`
|
||||
- `Unit` → `unitLabel`
|
||||
- `Unit Price` → `unitPrice`
|
||||
- `Total` → `totalPrice`
|
||||
|
||||
This suggests the architecture already anticipated table-based quotation item rendering, even though the currently active production template files are still only 2 pages.
|
||||
|
||||
### 6.4 Gaps Against P.4 Requirements
|
||||
|
||||
Task P.4 requires these columns or concepts:
|
||||
|
||||
- product code
|
||||
- description
|
||||
- specification
|
||||
- quantity
|
||||
- unit
|
||||
- unit price
|
||||
- discount
|
||||
- amount
|
||||
- remark
|
||||
|
||||
Observed current gap:
|
||||
|
||||
- no dedicated `specification` field was found in `crm_quotation_items`
|
||||
- `remark` appears to correspond most closely to `notes`, unless business rules say otherwise
|
||||
|
||||
This is a discovery risk and must be resolved before final implementation behavior is locked in.
|
||||
|
||||
---
|
||||
|
||||
## 7. Layout Engine Assessment
|
||||
|
||||
### 7.1 What Already Exists
|
||||
|
||||
The current layout foundation already supports:
|
||||
|
||||
- page cloning
|
||||
- dynamic page generation
|
||||
- page splitting based on vertical overflow
|
||||
- repeated topic block creation
|
||||
- keep-together footer/signature placement
|
||||
|
||||
This is provided by:
|
||||
|
||||
- [src/features/crm/quotations/document/server/pdf-topic-engine.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/crm/quotations/document/server/pdf-topic-engine.ts:66)
|
||||
|
||||
### 7.2 What Does Not Yet Exist Explicitly
|
||||
|
||||
No dedicated runtime was found yet for:
|
||||
|
||||
- dynamic product item page insertion between page 1 and topic/signature page
|
||||
- generic dynamic page marker resolution
|
||||
- generalized page numbering helper
|
||||
- product-table-specific pagination layer separate from topic engine
|
||||
|
||||
### 7.3 Key Constraint
|
||||
|
||||
The existing topic engine is hard-wired to `targetPageIndex: 1`, which currently means:
|
||||
|
||||
- it expects the dynamic topic page to be page 2
|
||||
- it expects signature fields on that same logical target page
|
||||
|
||||
If a new Product Item page is inserted between the current page 1 and current page 2 without changing runtime behavior, the topic engine will target the wrong page.
|
||||
|
||||
This is the most important architecture finding of the discovery phase.
|
||||
|
||||
---
|
||||
|
||||
## 8. Files Expected to Be Modified
|
||||
|
||||
Likely implementation touchpoints:
|
||||
|
||||
- [src/features/crm/quotations/document/server/pdf-topic-engine.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/crm/quotations/document/server/pdf-topic-engine.ts:66)
|
||||
- [src/features/crm/quotations/document/server/service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/crm/quotations/document/server/service.ts:661)
|
||||
- [src/features/foundation/document-template/server/service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/foundation/document-template/server/service.ts:612)
|
||||
- [scripts/pdf-audit-utils.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/scripts/pdf-audit-utils.ts:312)
|
||||
- [scripts/reseed-pdf-template-version.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/scripts/reseed-pdf-template-version.ts:1)
|
||||
- possibly [src/db/seeds/foundation.seed.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/db/seeds/foundation.seed.ts:854)
|
||||
|
||||
Possible UI/admin edits may be needed only if additional metadata or better preview labeling is required, but no mandatory UI gap was found yet for basic version creation and activation.
|
||||
|
||||
---
|
||||
|
||||
## 9. New Files Expected to Be Created
|
||||
|
||||
Expected new template assets:
|
||||
|
||||
- `src/pdfme_template/ALLA_template_pdfme_product_v1.json`
|
||||
- `src/pdfme_template/ONVALLA_template_pdfme_product_v1.json`
|
||||
|
||||
No separate parallel rendering pipeline should be created.
|
||||
|
||||
---
|
||||
|
||||
## 10. Backward Compatibility Analysis
|
||||
|
||||
Backward compatibility is achievable if the implementation follows these rules:
|
||||
|
||||
1. do not modify existing `*_fainal3.json` template files
|
||||
2. create new template versions only
|
||||
3. keep runtime able to render both old and new version structures
|
||||
4. make topic-page resolution robust enough to support the new page sequence
|
||||
5. avoid changing existing approved PDF artifact behavior
|
||||
|
||||
Why compatibility is realistic:
|
||||
|
||||
- runtime already resolves active versions dynamically
|
||||
- template mappings are version-specific
|
||||
- old versions remain stored
|
||||
- admin UI already supports multiple versions and activation switching
|
||||
|
||||
Main compatibility risk:
|
||||
|
||||
- current topic engine assumes old page order and must be generalized without breaking old templates
|
||||
|
||||
---
|
||||
|
||||
## 11. Risk Assessment
|
||||
|
||||
### 11.1 High Risk
|
||||
|
||||
- topic engine currently assumes page 2 is the dynamic topic/signature page
|
||||
- inserting a new middle page will break runtime unless page targeting becomes marker-based or otherwise dynamic
|
||||
|
||||
### 11.2 Medium Risk
|
||||
|
||||
- current quotation item payload does not clearly expose a standalone `specification` field
|
||||
- page numbering requirement exists in Task P.4, but current templates do not expose obvious page-number fields
|
||||
- reseed/audit utilities still point to legacy file names and will need alignment for new template assets
|
||||
|
||||
### 11.3 Lower Risk
|
||||
|
||||
- CRM settings workflow itself is already sufficient for version CRUD
|
||||
- PDF generator already registers the official PDFMe `table` plugin
|
||||
- template storage model already supports table mappings
|
||||
|
||||
---
|
||||
|
||||
## 12. Migration Strategy
|
||||
|
||||
Recommended migration path:
|
||||
|
||||
1. generalize runtime topic page detection so it is not tied to fixed page index 1
|
||||
2. create new Product Item template JSON files for ALLA and ONVALLA
|
||||
3. add or update mappings for the product item table placeholders
|
||||
4. ensure new versions can be created and activated through the existing template settings flow
|
||||
5. update reseed/audit helpers to recognize the new product template source files where needed
|
||||
6. verify all runtime modes
|
||||
|
||||
Required verification modes:
|
||||
|
||||
- document preview route
|
||||
- PDF preview route
|
||||
- PDF download route
|
||||
- approved PDF generation
|
||||
- old template version behavior
|
||||
- new template version behavior
|
||||
|
||||
---
|
||||
|
||||
## 13. Final Discovery Conclusion
|
||||
|
||||
Task P.4 should proceed by extending the current document-template and quotation-document runtime foundations, not by creating a new rendering path.
|
||||
|
||||
The critical architecture change is:
|
||||
|
||||
- make the topic/signature dynamic-page resolution independent from the old hardcoded second-page layout
|
||||
|
||||
Once that is in place, the new Product Item page can be introduced as a new template version while preserving existing templates unchanged.
|
||||
|
||||
---
|
||||
|
||||
## References Reviewed
|
||||
|
||||
### Governance and Standards
|
||||
|
||||
- [AGENTS.md](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/AGENTS.md)
|
||||
- [docs/standards/project-foundations.md](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/docs/standards/project-foundations.md)
|
||||
- [docs/standards/architecture-rules.md](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/docs/standards/architecture-rules.md)
|
||||
- [docs/standards/ui-ux-rules.md](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/docs/standards/ui-ux-rules.md)
|
||||
- [docs/standards/task-catalog.md](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/docs/standards/task-catalog.md)
|
||||
- [docs/standards/task-review-checklist.md](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/docs/standards/task-review-checklist.md)
|
||||
|
||||
### ADRs and Business Docs
|
||||
|
||||
- [docs/adr/0008-attachment-storage-strategy.md](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/docs/adr/0008-attachment-storage-strategy.md)
|
||||
- [docs/adr/0009-approved-document-storage-lifecycle.md](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/docs/adr/0009-approved-document-storage-lifecycle.md)
|
||||
- [docs/adr/0012-approval-signature-strategy.md](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/docs/adr/0012-approval-signature-strategy.md)
|
||||
- [docs/adr/0013-pdf-visual-parity-strategy.md](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/docs/adr/0013-pdf-visual-parity-strategy.md)
|
||||
- [docs/business/pdf-mapping-registry.md](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/docs/business/pdf-mapping-registry.md)
|
||||
- [docs/business/pdf-placeholder-registry.md](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/docs/business/pdf-placeholder-registry.md)
|
||||
|
||||
### Implementation Lineage
|
||||
|
||||
- [docs/implementation/task-g-document-preview-foundation.md](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/docs/implementation/task-g-document-preview-foundation.md)
|
||||
- [docs/implementation/task-h-pdf-generation-persistence.md](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/docs/implementation/task-h-pdf-generation-persistence.md)
|
||||
- [docs/implementation/pdfme-runtime-audit.md](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/docs/implementation/pdfme-runtime-audit.md)
|
||||
- [docs/implementation/pdfme-legacy-audit.md](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/docs/implementation/pdfme-legacy-audit.md)
|
||||
Reference in New Issue
Block a user