espace-paie-odentas/lib/handlebars-helpers.ts
odentas c6faceb038 feat: Préparation migration PDFMonkey vers Gotenberg
- 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
2025-12-27 21:40:27 +01:00

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));
});
}