- Ajout helpers Handlebars pour remplacer filtres Liquid - Conversion template CDDU de Liquid vers Handlebars - Nouvelle API route /api/generate-contract-pdf pour Gotenberg - Configuration Docker Compose pour auto-héberger Gotenberg - Documentation complète de migration - Variables d'environnement exemple Note: Le bouton 'Créer PDF' utilise encore PDFMonkey. Pour activer Gotenberg, modifier l'appel dans ContractEditor.tsx
114 lines
3.5 KiB
TypeScript
114 lines
3.5 KiB
TypeScript
/**
|
|
* Helpers Handlebars personnalisés pour remplacer les filtres Liquid
|
|
* Utilisés pour la génération de contrats PDF avec Gotenberg
|
|
*/
|
|
|
|
import Handlebars from 'handlebars';
|
|
|
|
/**
|
|
* Enregistre tous les helpers Handlebars personnalisés
|
|
*/
|
|
export function registerHandlebarsHelpers() {
|
|
// Helper pour remplacer "remove_first" de Liquid
|
|
Handlebars.registerHelper('removeFirst', function(str: string, pattern: string) {
|
|
if (!str) return '';
|
|
return str.replace(pattern, '');
|
|
});
|
|
|
|
// Helper pour remplacer "contains" de Liquid
|
|
Handlebars.registerHelper('contains', function(str: string, pattern: string) {
|
|
if (!str) return false;
|
|
return str.includes(pattern);
|
|
});
|
|
|
|
// Helper pour remplacer "strip" de Liquid (trim)
|
|
Handlebars.registerHelper('strip', function(str: string) {
|
|
if (!str) return '';
|
|
return str.trim();
|
|
});
|
|
|
|
// Helper pour remplacer "join" de Liquid
|
|
Handlebars.registerHelper('join', function(array: any[], separator: string) {
|
|
if (!Array.isArray(array)) return '';
|
|
return array.join(separator);
|
|
});
|
|
|
|
// Helper pour split (diviser une chaîne)
|
|
Handlebars.registerHelper('split', function(str: string, delimiter: string) {
|
|
if (!str) return [];
|
|
return str.split(delimiter);
|
|
});
|
|
|
|
// Helper pour vérifier l'égalité
|
|
Handlebars.registerHelper('eq', function(a: any, b: any) {
|
|
return a === b;
|
|
});
|
|
|
|
// Helper pour vérifier l'inégalité
|
|
Handlebars.registerHelper('ne', function(a: any, b: any) {
|
|
return a !== b;
|
|
});
|
|
|
|
// Helper pour vérifier >=
|
|
Handlebars.registerHelper('gte', function(a: number, b: number) {
|
|
return a >= b;
|
|
});
|
|
|
|
// Helper pour vérifier >
|
|
Handlebars.registerHelper('gt', function(a: number, b: number) {
|
|
return a > b;
|
|
});
|
|
|
|
// Helper pour vérifier ==
|
|
Handlebars.registerHelper('lte', function(a: number, b: number) {
|
|
return a <= b;
|
|
});
|
|
|
|
// Helper pour vérifier <
|
|
Handlebars.registerHelper('lt', function(a: number, b: number) {
|
|
return a < b;
|
|
});
|
|
|
|
// Helper pour vérifier si une valeur est vide
|
|
Handlebars.registerHelper('isEmpty', function(value: any) {
|
|
return !value || value === '' || value === 'n/a' || value === 0;
|
|
});
|
|
|
|
// Helper pour vérifier si une valeur n'est pas vide
|
|
Handlebars.registerHelper('isNotEmpty', function(value: any) {
|
|
return value && value !== '' && value !== 'n/a' && value !== 0;
|
|
});
|
|
|
|
// Helper OR logique
|
|
Handlebars.registerHelper('or', function(...args: any[]) {
|
|
// Enlever le dernier argument qui est l'objet options de Handlebars
|
|
const values = args.slice(0, -1);
|
|
return values.some(v => !!v);
|
|
});
|
|
|
|
// Helper AND logique
|
|
Handlebars.registerHelper('and', function(...args: any[]) {
|
|
// Enlever le dernier argument qui est l'objet options de Handlebars
|
|
const values = args.slice(0, -1);
|
|
return values.every(v => !!v);
|
|
});
|
|
|
|
// Helper pour formatter un nombre avec virgules
|
|
Handlebars.registerHelper('formatNumber', function(value: number) {
|
|
if (value === null || value === undefined) return '';
|
|
return value.toString().replace('.', ',');
|
|
});
|
|
|
|
// Helper raw pour éviter l'échappement HTML
|
|
Handlebars.registerHelper('raw', function(options) {
|
|
return options.fn();
|
|
});
|
|
|
|
// Helper pour comparer avec plusieurs valeurs (utile pour les CCN)
|
|
Handlebars.registerHelper('includesAny', function(str: string, ...values: any[]) {
|
|
if (!str) return false;
|
|
// Enlever le dernier argument (options de Handlebars)
|
|
const searchValues = values.slice(0, -1);
|
|
return searchValues.some(v => str.includes(v));
|
|
});
|
|
}
|