make a contrat template

This commit is contained in:
Marshal
2026-07-09 21:13:07 +00:00
parent e4429592d3
commit 3443b79644
26 changed files with 3243 additions and 41 deletions

View File

@@ -3,6 +3,11 @@ import * as fs from 'fs';
import * as path from 'path';
import Handlebars from 'handlebars';
import {
interpolateTemplateText,
parseArticleBody,
RenderedArticle,
} from './contract-article.util';
import { ContractViewModel } from './contract-view-model.builder';
@Injectable()
@@ -31,9 +36,40 @@ export class ContractRendererService implements OnModuleInit {
return template({
...view,
paymentArticle: view.pricing.currency === 'ETB' ? 'ETB' : 'USD',
...this.buildDynamicSections(view),
});
}
/**
* Turn the DB-backed dynamic template (when present) into render-ready data:
* interpolate placeholders against the view model, then parse each article
* body into numbered clauses with nested bullets.
*/
private buildDynamicSections(view: ContractViewModel): {
dynamicDocumentTitle?: string;
dynamicWhereas?: string[];
dynamicArticles?: RenderedArticle[];
} {
const dyn = view.dynamicTemplate;
if (!dyn || dyn.articles.length === 0) return {};
const articles = [...dyn.articles]
.sort((a, b) => (a.order ?? 0) - (b.order ?? 0))
.map((article, index) => ({
number: index + 1,
title: interpolateTemplateText(article.title, view),
...parseArticleBody(interpolateTemplateText(article.body, view)),
}));
return {
dynamicDocumentTitle: interpolateTemplateText(dyn.documentTitle, view),
dynamicWhereas: dyn.whereasClauses.map((clause) =>
interpolateTemplateText(clause, view),
),
dynamicArticles: articles,
};
}
private getCompiled(fileName: string): Handlebars.TemplateDelegate {
const cached = this.compiled.get(fileName);
if (cached) return cached;