task-p.4.4

This commit is contained in:
phaichayon
2026-06-29 14:47:24 +07:00
parent 39bcfe2817
commit aa73b9aed2
11 changed files with 1143 additions and 45 deletions

View File

@@ -1,15 +1,13 @@
import type { Template } from '@pdfme/common';
import type {
DocumentTemplateMappingWithColumns,
ResolvedDocumentTemplate,
} from '@/features/foundation/document-template/types';
import type { DocumentTemplateMappingWithColumns, ResolvedDocumentTemplate } from '@/features/foundation/document-template/types';
import type { QuotationDocumentData } from '../types';
import { buildPdfTopicPages } from './pdf-topic-engine';
import { resolveTemplatePages } from './page-resolver';
import { buildProductItemSectionModel } from './product-item-engine';
import { createRenderContext, resolveRenderPolicies } from './render-context';
import { resolveQuotationStaticTemplateInputs } from './static-input-resolver';
import type {
BuiltSection,
ProductItemSection,
QuotationPdfRuntimeResult,
RenderContext,
ResolvedTemplate,
@@ -23,7 +21,7 @@ function cloneTemplate<T>(value: T): T {
return JSON.parse(JSON.stringify(value)) as T;
}
function createCustomerSectionBuilder(): SectionBuilder {
export function createCustomerSectionBuilder(): SectionBuilder {
return {
role: 'customer',
build(context: RenderContext): BuiltSection<'customer'> {
@@ -61,7 +59,32 @@ function createCustomerSectionBuilder(): SectionBuilder {
};
}
function createTopicSectionBuilder(): SectionBuilder {
export function createProductItemSectionBuilder(): SectionBuilder {
return {
role: 'product_items',
build(context: RenderContext): ProductItemSection {
const built = buildProductItemSectionModel({
items: context.documentData.items,
currencyCode: context.documentData.quotation.currencyCode,
});
return {
role: 'product_items',
enabled: true,
rendered: false,
anchorPageIndex: null,
pages: [],
templateInputPatch: {},
issues: built.issues,
rows: built.rows,
tableModel: built.tableModel,
pagination: built.pagination,
};
},
};
}
export function createTopicSectionBuilder(): SectionBuilder {
return {
role: 'topics',
build(context: RenderContext): BuiltSection<'topics'> {
@@ -103,21 +126,23 @@ function createTopicSectionBuilder(): SectionBuilder {
};
}
function getQuotationSectionBuilders(): SectionBuilder[] {
return [createCustomerSectionBuilder(), createTopicSectionBuilder()];
export function getQuotationSectionBuilders(): SectionBuilder[] {
return [
createCustomerSectionBuilder(),
createProductItemSectionBuilder(),
createTopicSectionBuilder(),
];
}
function createResolvedTemplate(
template: ResolvedDocumentTemplate,
): ResolvedTemplate {
function createResolvedTemplate(template: ResolvedDocumentTemplate): ResolvedTemplate {
return {
documentTemplate: template,
schema: cloneTemplate(template.version.schemaJson as Template),
schema: cloneTemplate(template.version.schemaJson as import('@pdfme/common').Template),
};
}
function createRuntimeErrorMessage(): string {
return 'Quotation PDF runtime is invalid for the active document template.';
return 'Quotation PDF runtime invalid active document template.';
}
export async function buildQuotationPdfRuntime(args: {