@lambda-development/erp-core 1.3.3 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -299,6 +299,15 @@ export declare const api: {
299
299
  }>;
300
300
  createMaster: (type: string, data: any) => Promise<any>;
301
301
  updateMaster: (type: string, name: string, data: any) => Promise<any>;
302
+ /** A PDF template's working copy (or published layout) rendered against a
303
+ * document; resolves to the PDF and the document it was rendered with. */
304
+ pdfTemplatePreview: (template: string, source: "draft" | "live", document?: string, doctype?: string) => Promise<{
305
+ blob: Blob;
306
+ document: string;
307
+ blocked: string;
308
+ }>;
309
+ uploadPdfTemplateAsset: (template: string, file: File) => Promise<any>;
310
+ pdfTemplateAssetUrl: (template: string, filename: string) => string;
302
311
  runAction: (action: string, data: Record<string, any>) => Promise<any>;
303
312
  deleteMaster: (type: string, name: string) => Promise<any>;
304
313
  trialBalance: (params?: Record<string, string>) => Promise<{
@@ -0,0 +1,6 @@
1
+ export declare function PdfLayoutSelect({ doctype, value, onChange, label }: {
2
+ doctype: string;
3
+ value: string;
4
+ onChange: (value: string) => void;
5
+ label: string;
6
+ }): import("react/jsx-runtime").JSX.Element;
@@ -10,6 +10,8 @@ interface SelectProps {
10
10
  className?: string;
11
11
  required?: boolean;
12
12
  disabled?: boolean;
13
+ /** The empty first option; false when an option already means "none". */
14
+ placeholder?: string | false;
13
15
  }
14
- export declare function Select({ label, options, value, onChange, className, required, disabled }: SelectProps): import("react/jsx-runtime").JSX.Element;
16
+ export declare function Select({ label, options, value, onChange, className, required, disabled, placeholder }: SelectProps): import("react/jsx-runtime").JSX.Element;
15
17
  export {};
@@ -0,0 +1,90 @@
1
+ /** Document types with PDF templates (api/pdf_templates.py DOCTYPES), by slug. */
2
+ export declare const PDF_TEMPLATE_DOCTYPES: readonly [{
3
+ readonly slug: "quotation";
4
+ readonly doctype: "Quotation";
5
+ readonly texts: true;
6
+ }, {
7
+ readonly slug: "sales-order";
8
+ readonly doctype: "Sales Order";
9
+ readonly texts: true;
10
+ }, {
11
+ readonly slug: "sales-invoice";
12
+ readonly doctype: "Sales Invoice";
13
+ readonly texts: true;
14
+ }, {
15
+ readonly slug: "purchase-order";
16
+ readonly doctype: "Purchase Order";
17
+ readonly texts: true;
18
+ }, {
19
+ readonly slug: "delivery-note";
20
+ readonly doctype: "Delivery Note";
21
+ readonly texts: true;
22
+ }, {
23
+ readonly slug: "proposal";
24
+ readonly doctype: "Proposal";
25
+ readonly texts: false;
26
+ }, {
27
+ readonly slug: "reservation";
28
+ readonly doctype: "Reservation";
29
+ readonly texts: false;
30
+ }];
31
+ export type PdfTemplateDoctype = (typeof PDF_TEMPLATE_DOCTYPES)[number];
32
+ export declare function pdfTemplateDoctype(value: string | null | undefined): PdfTemplateDoctype | undefined;
33
+ /** One PDF layout, as list_pdf_templates returns it (api/pdf_templates.py). */
34
+ export interface PdfTemplateSummary {
35
+ template: string;
36
+ title: string;
37
+ doctype: string;
38
+ description: string;
39
+ standard: boolean;
40
+ default: boolean;
41
+ archived: boolean;
42
+ published: boolean;
43
+ unpublished_changes: boolean;
44
+ used_by_documents: number;
45
+ /** Submittable types pin and archive the layout they were issued with. */
46
+ issued?: boolean;
47
+ draft_modified?: string;
48
+ published_at?: string | null;
49
+ }
50
+ export interface PdfTemplateVersion {
51
+ version: string;
52
+ label: string;
53
+ first_used: string;
54
+ documents: number;
55
+ example_document: string | null;
56
+ }
57
+ export interface PdfTemplateDetail extends PdfTemplateSummary {
58
+ html?: string;
59
+ draft_html?: string;
60
+ live_html?: string | null;
61
+ versions: PdfTemplateVersion[];
62
+ assets: {
63
+ filename: string;
64
+ content_type: string | null;
65
+ size_bytes: number;
66
+ }[];
67
+ context_reference: string;
68
+ required?: {
69
+ field: string;
70
+ variable: string;
71
+ label: string;
72
+ }[];
73
+ draft_modified_by?: string | null;
74
+ published_by?: string | null;
75
+ }
76
+ export declare const PDF_TEMPLATES_KEY: readonly ["pdf-templates"];
77
+ /** Templates of one document type (`doctype`), or of all types. */
78
+ export declare function usePdfTemplates(includeArchived?: boolean, enabled?: boolean, doctype?: string): import('@tanstack/react-query').UseQueryResult<{
79
+ templates: PdfTemplateSummary[];
80
+ defaults: Record<string, string>;
81
+ }, Error>;
82
+ export interface PdfTextDefaults {
83
+ doctype: string;
84
+ intro_text: string;
85
+ remarks: string;
86
+ placeholders: string[];
87
+ }
88
+ export declare function usePdfTextDefaults(enabled?: boolean, doctype?: string): import('@tanstack/react-query').UseQueryResult<PdfTextDefaults, Error>;
89
+ /** One template; for the built-in "standard" one, `doctype` picks the type's layout. */
90
+ export declare function usePdfTemplate(template: string | undefined, doctype?: string): import('@tanstack/react-query').UseQueryResult<PdfTemplateDetail, Error>;
@@ -270,6 +270,10 @@ declare const _default: {
270
270
  "pricing-rule": {
271
271
  "one": "Preisregel",
272
272
  "other": "Preisregeln"
273
+ },
274
+ "reservation": {
275
+ "one": "Reservation",
276
+ "other": "Reservationen"
273
277
  }
274
278
  },
275
279
  "masters": {
@@ -354,7 +358,8 @@ declare const _default: {
354
358
  "Fleet Calendar": "Flottenkalender",
355
359
  "Fleet (Assets)": "Flotte (Geräte)",
356
360
  "Reservations": "Reservationen",
357
- "Menu": "Menü"
361
+ "Menu": "Menü",
362
+ "PDF Templates": "PDF-Vorlagen"
358
363
  }
359
364
  },
360
365
  "login": {
@@ -655,7 +660,10 @@ declare const _default: {
655
660
  "Purpose": "Zweck",
656
661
  "Purchase Date": "Kaufdatum",
657
662
  "Notes": "Notizen",
658
- "Printed notes / terms": "Gedruckte Notizen / Konditionen"
663
+ "Printed notes / terms": "Gedruckte Notizen / Konditionen",
664
+ "PDF Layout": "PDF-Layout",
665
+ "Intro text": "Einleitungstext",
666
+ "Closing text / terms": "Schlusstext / Konditionen"
659
667
  },
660
668
  "tables": {
661
669
  "items": "Positionen",
@@ -934,7 +942,29 @@ declare const _default: {
934
942
  "item_code": "Pool-Reservation ('ein 1.7t-Bagger'): Artikel + Depot + Menge setzen. Für eine bestimmte Maschine stattdessen Gerät setzen.",
935
943
  "asset": "Eine bestimmte Maschine buchen. Eine Einheiten-Buchung belegt auch einen Platz im Artikel+Depot-Pool.",
936
944
  "from_datetime": "Genauer Beginn — Datum und Uhrzeit (z. B. 14:27). Ein reines Datum bedeutet 00:00.",
937
- "to_datetime": "Genaues Ende. Fenster sind halboffen [von, bis): eine Miete, die um 09:00 endet, und die nächste um 09:00 beginnende, kollidieren NICHT."
945
+ "to_datetime": "Genaues Ende. Fenster sind halboffen [von, bis): eine Miete, die um 09:00 endet, und die nächste um 09:00 beginnende, kollidieren NICHT.",
946
+ "pdf_template": "Wie die Reservationsbestätigung aussieht."
947
+ },
948
+ "quotation": {
949
+ "pdf_template": "Wie das PDF der Offerte aussieht. Wird beim Buchen der Offerte festgehalten.",
950
+ "intro_text": "Wird über den Positionen gedruckt (wo genau, bestimmt das PDF-Layout). Neue Offerten starten mit dem Standardtext aus Einstellungen → PDF-Vorlagen.",
951
+ "remarks": "Wird nach den Summen gedruckt (wo genau, bestimmt das PDF-Layout). Neue Offerten starten mit dem Standardtext aus Einstellungen → PDF-Vorlagen."
952
+ },
953
+ "sales-order": {
954
+ "pdf_template": "Wie das PDF aussieht. Wird beim Buchen festgehalten.",
955
+ "intro_text": "Wird über den Positionen gedruckt (wo genau, bestimmt das PDF-Layout). Neue Belege starten mit dem Standardtext aus Einstellungen → PDF-Vorlagen."
956
+ },
957
+ "sales-invoice": {
958
+ "pdf_template": "Wie das PDF aussieht. Wird beim Buchen festgehalten.",
959
+ "intro_text": "Wird über den Positionen gedruckt (wo genau, bestimmt das PDF-Layout). Neue Belege starten mit dem Standardtext aus Einstellungen → PDF-Vorlagen."
960
+ },
961
+ "purchase-order": {
962
+ "pdf_template": "Wie das PDF aussieht. Wird beim Buchen festgehalten.",
963
+ "intro_text": "Wird über den Positionen gedruckt (wo genau, bestimmt das PDF-Layout). Neue Belege starten mit dem Standardtext aus Einstellungen → PDF-Vorlagen."
964
+ },
965
+ "delivery-note": {
966
+ "pdf_template": "Wie das PDF aussieht. Wird beim Buchen festgehalten.",
967
+ "intro_text": "Wird über den Positionen gedruckt (wo genau, bestimmt das PDF-Layout). Neue Belege starten mit dem Standardtext aus Einstellungen → PDF-Vorlagen."
938
968
  }
939
969
  },
940
970
  "companyTax": {
@@ -1042,6 +1072,90 @@ declare const _default: {
1042
1072
  "drag": "{{name}} ziehen, um die Reihenfolge zu ändern (oder auswählen und Pfeiltasten nutzen)",
1043
1073
  "discard": "Änderungen verwerfen",
1044
1074
  "unsaved": "Nicht gespeicherte Änderungen"
1075
+ },
1076
+ "pdfTemplates": {
1077
+ "title": "PDF-Vorlagen",
1078
+ "intro": "Die Layouts, mit denen Belege gedruckt werden: Offerten, Aufträge, Rechnungen, Bestellungen, Lieferscheine, Sammelofferten und Reservationsbestätigungen, jeder Typ mit eigenen Vorlagen und eigenem Standard. Bearbeite eine Vorlage so oft du willst: Speichern ändert nur den Entwurf, Veröffentlichen macht ihn zum Layout der Belege. Ein gebuchter Beleg behält das Layout und das PDF, mit dem er ausgestellt wurde.",
1079
+ "chatHint": "Du kannst auch den Chat fragen, z. B. „setz unser Logo oben rechts und nimm eine grössere Schrift in der Positionstabelle“.",
1080
+ "new": "Neue Vorlage",
1081
+ "newTitle": "Neue PDF-Vorlage",
1082
+ "newBody": "Startet als Kopie von {{name}}.",
1083
+ "copyOf": "Kopie von {{name}}",
1084
+ "create": "Erstellen",
1085
+ "standard": "Standard",
1086
+ "standardDescription": "Das eingebaute Layout. Nur lesbar: dupliziere es, um das Aussehen zu ändern.",
1087
+ "default": "Standardvorlage",
1088
+ "builtIn": "Eingebaut",
1089
+ "notPublished": "Nicht veröffentlicht",
1090
+ "unpublishedChanges": "Unveröffentlichte Änderungen",
1091
+ "archived": "Archiviert",
1092
+ "usedBy_one": "Von {{count}} Offerte verwendet",
1093
+ "usedBy_other": "Von {{count}} Offerten verwendet",
1094
+ "makeDefault": "Als Standard setzen",
1095
+ "duplicate": "Duplizieren",
1096
+ "archive": "Archivieren",
1097
+ "restore": "Wiederherstellen",
1098
+ "deleteTitle": "{{name}} löschen?",
1099
+ "deleteBody": "Keine Offerte hat diese Vorlage verwendet, es hängt also nichts davon ab.",
1100
+ "showArchived": "Archivierte Vorlagen anzeigen",
1101
+ "name": "Name",
1102
+ "editHint": "Speichere so oft du willst: Es ändert sich nur der Entwurf. Veröffentliche, wenn die Vorschau stimmt; Belege drucken mit dem veröffentlichten Layout.",
1103
+ "publish": "Veröffentlichen",
1104
+ "revert": "Unveröffentlichte Änderungen verwerfen",
1105
+ "revertTitle": "Unveröffentlichte Änderungen verwerfen?",
1106
+ "revertBody": "Der Entwurf wird auf das veröffentlichte Layout zurückgesetzt.",
1107
+ "publishedNotice": "Veröffentlicht. Geprüft mit {{document}}.",
1108
+ "source": "HTML und CSS",
1109
+ "lines_one": "{{count}} Zeile",
1110
+ "lines_other": "{{count}} Zeilen",
1111
+ "preview": "Vorschau",
1112
+ "previewWith": "Vorschau mit Beleg",
1113
+ "refresh": "Aktualisieren",
1114
+ "show_draft": "Entwurf",
1115
+ "show_live": "Veröffentlicht",
1116
+ "previewShowsSaved": "Die Vorschau zeigt den zuletzt gespeicherten Stand.",
1117
+ "blocked": "Nicht geladen (nur hochgeladene Dateien sind erlaubt): {{urls}}",
1118
+ "assets_one": "Bilder und Schriften ({{count}})",
1119
+ "assets_other": "Bilder und Schriften ({{count}})",
1120
+ "assetsHint": "Verweise auf eine hochgeladene Datei mit ihrem Namen, z. B. <img src=\"logo.png\">. Links auf andere Websites werden blockiert.",
1121
+ "upload": "Datei hochladen",
1122
+ "versions_one": "Ausgestellte Versionen ({{count}})",
1123
+ "versions_other": "Ausgestellte Versionen ({{count}})",
1124
+ "versionsHint": "Eine Version entsteht, wenn ein Beleg mit einem Layout gebucht wird. Belege behalten die Version, mit der sie ausgestellt wurden.",
1125
+ "noVersions": "Mit dieser Vorlage wurde noch keine Offerte ausgestellt.",
1126
+ "firstUsed": "zuerst verwendet am {{date}}",
1127
+ "reference": "Verfügbare Felder",
1128
+ "standardEditHint": "Um dieses Layout zu ändern, dupliziere es auf der Seite",
1129
+ "defaultOption": "Standard ({{name}})",
1130
+ "textDefaults": "Standardtexte für Offerten",
1131
+ "textDefaultsIntro": "Neue Offerten starten mit diesen Texten; sie lassen sich pro Offerte ändern. Eine Änderung hier ändert bestehende Offerten nicht.",
1132
+ "textDefaultsPlaceholders": "Platzhalter, beim Drucken ersetzt: {{placeholders}}",
1133
+ "saveTexts": "Texte speichern",
1134
+ "textsSaved": "Gespeichert.",
1135
+ "publishWarnings": "Hinweis: {{warnings}}",
1136
+ "uploading": "Wird hochgeladen…",
1137
+ "dropHint": "oder Bilder und Schriften hierher ziehen (PNG, JPG, SVG, WebP, GIF, TTF, OTF, WOFF, WOFF2)",
1138
+ "textDefaultsFor": "Standardtexte für {{type}}",
1139
+ "textDefaultsIntroFor": "Neue {{type}} starten mit diesen Texten; sie lassen sich pro Beleg ändern. Eine Änderung hier ändert bestehende Belege nicht.",
1140
+ "newTitleFor": "Neue PDF-Vorlage ({{type}})",
1141
+ "newFor": "Neue Vorlage: {{type}}",
1142
+ "fromOtherType": "Aus Vorlage eines anderen Typs…",
1143
+ "usedByIssued_one": "Von {{count}} gebuchten Beleg verwendet",
1144
+ "usedByIssued_other": "Von {{count}} gebuchten Belegen verwendet"
1145
+ },
1146
+ "documentWarnings": {
1147
+ "pdf_intro_text_not_printed": "Das PDF-Layout «{{template}}» druckt den Einleitungstext nicht; das PDF erscheint ohne ihn.",
1148
+ "pdf_remarks_not_printed": "Das PDF-Layout «{{template}}» druckt den Schlusstext / die Konditionen nicht; das PDF erscheint ohne sie.",
1149
+ "pdf_line_deduction_not_printed": "Das PDF-Layout «{{template}}» druckt keine Abzüge auf Positionen; diese Positionen erscheinen nur mit dem Nettobetrag.",
1150
+ "pdf_variable_not_printed": "Das PDF-Layout «{{template}}» druckt {{label}} nicht; das PDF erscheint ohne."
1151
+ },
1152
+ "deductions": {
1153
+ "defaultLabel": "Abzug",
1154
+ "add": "+ Abzug",
1155
+ "remove": "Abzug entfernen",
1156
+ "label": "Text des Abzugs",
1157
+ "labelPlaceholder": "z. B. Abzüglich bereits verrechnet (Rechnung SINV-0003)",
1158
+ "perUnit": "Abzug pro Einheit, wird unter der Position gedruckt; die Position zählt den Rest."
1045
1159
  }
1046
1160
  }
1047
1161
  ;
@@ -270,6 +270,10 @@ declare const _default: {
270
270
  "pricing-rule": {
271
271
  "one": "Pricing Rule",
272
272
  "other": "Pricing Rules"
273
+ },
274
+ "reservation": {
275
+ "one": "Reservation",
276
+ "other": "Reservations"
273
277
  }
274
278
  },
275
279
  "masters": {
@@ -354,7 +358,8 @@ declare const _default: {
354
358
  "Fleet Calendar": "Fleet Calendar",
355
359
  "Fleet (Assets)": "Fleet (Assets)",
356
360
  "Reservations": "Reservations",
357
- "Menu": "Menu"
361
+ "Menu": "Menu",
362
+ "PDF Templates": "PDF Templates"
358
363
  }
359
364
  },
360
365
  "login": {
@@ -697,7 +702,10 @@ declare const _default: {
697
702
  "Purpose": "Purpose",
698
703
  "Purchase Date": "Purchase Date",
699
704
  "Notes": "Notes",
700
- "Printed notes / terms": "Printed notes / terms"
705
+ "Printed notes / terms": "Printed notes / terms",
706
+ "PDF Layout": "PDF Layout",
707
+ "Intro text": "Intro text",
708
+ "Closing text / terms": "Closing text / terms"
701
709
  },
702
710
  "tables": {
703
711
  "accounts": "accounts",
@@ -934,7 +942,29 @@ declare const _default: {
934
942
  "item_code": "Pooled booking ('a 1.7t excavator'): set Item + Yard + Qty. For a specific machine, set Asset instead.",
935
943
  "asset": "Book one specific machine. A unit booking also consumes a slot of its Item+Yard pool.",
936
944
  "from_datetime": "Exact start — date and time (e.g. 14:27). A bare date means 00:00.",
937
- "to_datetime": "Exact end. Windows are half-open [from, to): a hire ending 09:00 and the next starting 09:00 do NOT clash."
945
+ "to_datetime": "Exact end. Windows are half-open [from, to): a hire ending 09:00 and the next starting 09:00 do NOT clash.",
946
+ "pdf_template": "How the reservation confirmation looks."
947
+ },
948
+ "quotation": {
949
+ "pdf_template": "How the offer's PDF looks. Fixed when the offer is submitted.",
950
+ "intro_text": "Printed above the line items (where exactly is up to the PDF layout). New offers start with the default from Settings → PDF Templates.",
951
+ "remarks": "Printed after the totals (where exactly is up to the PDF layout). New offers start with the default from Settings → PDF Templates."
952
+ },
953
+ "sales-order": {
954
+ "pdf_template": "How the PDF looks. Fixed when the document is submitted.",
955
+ "intro_text": "Printed above the line items (where exactly is up to the PDF layout). New documents start with the default from Settings → PDF Templates."
956
+ },
957
+ "sales-invoice": {
958
+ "pdf_template": "How the PDF looks. Fixed when the document is submitted.",
959
+ "intro_text": "Printed above the line items (where exactly is up to the PDF layout). New documents start with the default from Settings → PDF Templates."
960
+ },
961
+ "purchase-order": {
962
+ "pdf_template": "How the PDF looks. Fixed when the document is submitted.",
963
+ "intro_text": "Printed above the line items (where exactly is up to the PDF layout). New documents start with the default from Settings → PDF Templates."
964
+ },
965
+ "delivery-note": {
966
+ "pdf_template": "How the PDF looks. Fixed when the document is submitted.",
967
+ "intro_text": "Printed above the line items (where exactly is up to the PDF layout). New documents start with the default from Settings → PDF Templates."
938
968
  }
939
969
  },
940
970
  "companyTax": {
@@ -1042,6 +1072,90 @@ declare const _default: {
1042
1072
  "drag": "Drag to reorder {{name}} (or focus it and use the arrow keys)",
1043
1073
  "discard": "Discard changes",
1044
1074
  "unsaved": "Unsaved changes"
1075
+ },
1076
+ "pdfTemplates": {
1077
+ "title": "PDF templates",
1078
+ "intro": "The layouts documents print with: offers, sales orders, invoices, purchase orders, delivery notes, proposals and reservation confirmations, each type with its own templates and default. Edit a template as often as you like: saving only changes its working copy, and publishing makes it the layout documents print with. A submitted document keeps the layout and the PDF it was issued with.",
1079
+ "chatHint": "You can also ask the chat, e.g. \"put our logo top right and use a larger font in the item table\".",
1080
+ "new": "New template",
1081
+ "newTitle": "New PDF template",
1082
+ "newBody": "Starts as a copy of {{name}}.",
1083
+ "copyOf": "Copy of {{name}}",
1084
+ "create": "Create",
1085
+ "standard": "Standard",
1086
+ "standardDescription": "The built-in layout. Read-only: duplicate it to change the look.",
1087
+ "default": "Default",
1088
+ "builtIn": "Built-in",
1089
+ "notPublished": "Not published",
1090
+ "unpublishedChanges": "Unpublished changes",
1091
+ "archived": "Archived",
1092
+ "usedBy_one": "Used by {{count}} offer",
1093
+ "usedBy_other": "Used by {{count}} offers",
1094
+ "makeDefault": "Make default",
1095
+ "duplicate": "Duplicate",
1096
+ "archive": "Archive",
1097
+ "restore": "Restore",
1098
+ "deleteTitle": "Delete {{name}}?",
1099
+ "deleteBody": "No offer has used this template, so nothing depends on it.",
1100
+ "showArchived": "Show archived templates",
1101
+ "name": "Name",
1102
+ "editHint": "Save as often as you like: only the working copy changes. Publish when the preview looks right; documents print with the published layout.",
1103
+ "publish": "Publish",
1104
+ "revert": "Discard unpublished changes",
1105
+ "revertTitle": "Discard unpublished changes?",
1106
+ "revertBody": "The working copy goes back to the published layout.",
1107
+ "publishedNotice": "Published. Checked against {{document}}.",
1108
+ "source": "HTML and CSS",
1109
+ "lines_one": "{{count}} line",
1110
+ "lines_other": "{{count}} lines",
1111
+ "preview": "Preview",
1112
+ "previewWith": "Preview with document",
1113
+ "refresh": "Refresh",
1114
+ "show_draft": "Working copy",
1115
+ "show_live": "Published",
1116
+ "previewShowsSaved": "The preview shows the last saved version.",
1117
+ "blocked": "Not loaded (only uploaded assets are allowed): {{urls}}",
1118
+ "assets_one": "Images and fonts ({{count}})",
1119
+ "assets_other": "Images and fonts ({{count}})",
1120
+ "assetsHint": "Reference an uploaded file by its name, e.g. <img src=\"logo.png\">. Links to other websites are blocked.",
1121
+ "upload": "Upload file",
1122
+ "versions_one": "Issued versions ({{count}})",
1123
+ "versions_other": "Issued versions ({{count}})",
1124
+ "versionsHint": "A version is recorded when a document is submitted with a layout. Documents keep the version they were issued with.",
1125
+ "noVersions": "No offer has been issued with this template yet.",
1126
+ "firstUsed": "first used {{date}}",
1127
+ "reference": "Available fields",
1128
+ "standardEditHint": "To change this layout, duplicate it on the",
1129
+ "defaultOption": "Default ({{name}})",
1130
+ "textDefaults": "Default texts for offers",
1131
+ "textDefaultsIntro": "New offers start with these texts; they can be changed on each offer. Changing a default doesn’t change existing offers.",
1132
+ "textDefaultsPlaceholders": "Placeholders, filled in when the PDF prints: {{placeholders}}",
1133
+ "saveTexts": "Save texts",
1134
+ "textsSaved": "Saved.",
1135
+ "publishWarnings": "Note: {{warnings}}",
1136
+ "uploading": "Uploading…",
1137
+ "dropHint": "or drag images and fonts here (PNG, JPG, SVG, WebP, GIF, TTF, OTF, WOFF, WOFF2)",
1138
+ "textDefaultsFor": "Default texts for {{type}}",
1139
+ "textDefaultsIntroFor": "New {{type}} start with these texts; they can be changed on each document. Changing them here doesn’t change existing documents.",
1140
+ "newTitleFor": "New PDF template ({{type}})",
1141
+ "newFor": "New template: {{type}}",
1142
+ "fromOtherType": "Start from another type’s template…",
1143
+ "usedByIssued_one": "Used by {{count}} issued document",
1144
+ "usedByIssued_other": "Used by {{count}} issued documents"
1145
+ },
1146
+ "documentWarnings": {
1147
+ "pdf_intro_text_not_printed": "The PDF layout “{{template}}” doesn’t print the intro text; the PDF shows it without.",
1148
+ "pdf_remarks_not_printed": "The PDF layout “{{template}}” doesn’t print the closing text / terms; the PDF shows it without.",
1149
+ "pdf_line_deduction_not_printed": "The PDF layout “{{template}}” doesn’t print line deductions; those lines show only their net amount.",
1150
+ "pdf_variable_not_printed": "The PDF layout “{{template}}” doesn’t print the {{label}}; the PDF shows it without."
1151
+ },
1152
+ "deductions": {
1153
+ "defaultLabel": "Deduction",
1154
+ "add": "+ Deduction",
1155
+ "remove": "Remove deduction",
1156
+ "label": "Deduction text",
1157
+ "labelPlaceholder": "e.g. Less already invoiced (invoice SINV-0003)",
1158
+ "perUnit": "Deduction per unit, printed under the line; the line counts the rest."
1045
1159
  }
1046
1160
  }
1047
1161
  ;
@@ -270,6 +270,10 @@ declare const _default: {
270
270
  "pricing-rule": {
271
271
  "one": "Règle de prix",
272
272
  "other": "Règles de prix"
273
+ },
274
+ "reservation": {
275
+ "one": "Réservation",
276
+ "other": "Réservations"
273
277
  }
274
278
  },
275
279
  "masters": {
@@ -354,7 +358,8 @@ declare const _default: {
354
358
  "Fleet Calendar": "Calendrier de flotte",
355
359
  "Fleet (Assets)": "Flotte (matériel)",
356
360
  "Reservations": "Réservations",
357
- "Menu": "Menu"
361
+ "Menu": "Menu",
362
+ "PDF Templates": "Modèles PDF"
358
363
  }
359
364
  },
360
365
  "login": {
@@ -655,7 +660,10 @@ declare const _default: {
655
660
  "Purpose": "Objet",
656
661
  "Purchase Date": "Date d'achat",
657
662
  "Notes": "Notes",
658
- "Printed notes / terms": "Notes / conditions imprimées"
663
+ "Printed notes / terms": "Notes / conditions imprimées",
664
+ "PDF Layout": "Mise en page PDF",
665
+ "Intro text": "Texte d'introduction",
666
+ "Closing text / terms": "Texte final / conditions"
659
667
  },
660
668
  "tables": {
661
669
  "items": "Lignes",
@@ -934,7 +942,29 @@ declare const _default: {
934
942
  "item_code": "Réservation de pool ('une pelle de 1,7 t') : renseigner Article + Dépôt + Qté. Pour une machine précise, renseigner Équipement.",
935
943
  "asset": "Réserver une machine précise. Une réservation d'unité consomme aussi une place du pool Article+Dépôt.",
936
944
  "from_datetime": "Début exact — date et heure (p. ex. 14:27). Une date seule signifie 00:00.",
937
- "to_datetime": "Fin exacte. Les fenêtres sont semi-ouvertes [de, à) : une location finissant à 09:00 et la suivante commençant à 09:00 ne se chevauchent PAS."
945
+ "to_datetime": "Fin exacte. Les fenêtres sont semi-ouvertes [de, à) : une location finissant à 09:00 et la suivante commençant à 09:00 ne se chevauchent PAS.",
946
+ "pdf_template": "L’aspect de la confirmation de réservation."
947
+ },
948
+ "quotation": {
949
+ "pdf_template": "L'apparence du PDF de l'offre. Figée lorsque l'offre est validée.",
950
+ "intro_text": "Imprimé au-dessus des positions (l'emplacement exact dépend de la mise en page PDF). Les nouvelles offres reprennent le texte par défaut de Paramètres → Modèles PDF.",
951
+ "remarks": "Imprimé après les totaux (l'emplacement exact dépend de la mise en page PDF). Les nouvelles offres reprennent le texte par défaut de Paramètres → Modèles PDF."
952
+ },
953
+ "sales-order": {
954
+ "pdf_template": "L’aspect du PDF. Fixé lors de la validation du document.",
955
+ "intro_text": "Imprimé au-dessus des lignes (l’endroit exact dépend de la mise en page PDF). Les nouveaux documents commencent avec le texte par défaut des Paramètres → Modèles PDF."
956
+ },
957
+ "sales-invoice": {
958
+ "pdf_template": "L’aspect du PDF. Fixé lors de la validation du document.",
959
+ "intro_text": "Imprimé au-dessus des lignes (l’endroit exact dépend de la mise en page PDF). Les nouveaux documents commencent avec le texte par défaut des Paramètres → Modèles PDF."
960
+ },
961
+ "purchase-order": {
962
+ "pdf_template": "L’aspect du PDF. Fixé lors de la validation du document.",
963
+ "intro_text": "Imprimé au-dessus des lignes (l’endroit exact dépend de la mise en page PDF). Les nouveaux documents commencent avec le texte par défaut des Paramètres → Modèles PDF."
964
+ },
965
+ "delivery-note": {
966
+ "pdf_template": "L’aspect du PDF. Fixé lors de la validation du document.",
967
+ "intro_text": "Imprimé au-dessus des lignes (l’endroit exact dépend de la mise en page PDF). Les nouveaux documents commencent avec le texte par défaut des Paramètres → Modèles PDF."
938
968
  }
939
969
  },
940
970
  "companyTax": {
@@ -1042,6 +1072,90 @@ declare const _default: {
1042
1072
  "drag": "Glisser pour déplacer {{name}} (ou le sélectionner et utiliser les flèches)",
1043
1073
  "discard": "Annuler les modifications",
1044
1074
  "unsaved": "Modifications non enregistrées"
1075
+ },
1076
+ "pdfTemplates": {
1077
+ "title": "Modèles PDF",
1078
+ "intro": "Les mises en page utilisées pour imprimer les documents : offres, commandes, factures, commandes fournisseur, bons de livraison, propositions et confirmations de réservation, chaque type avec ses modèles et son modèle par défaut. Modifiez un modèle autant que vous voulez : enregistrer ne change que le brouillon, publier en fait la mise en page des documents. Un document validé conserve la mise en page et le PDF avec lesquels il a été émis.",
1079
+ "chatHint": "Vous pouvez aussi demander au chat, p. ex. « mets notre logo en haut à droite et agrandis la police du tableau des articles ».",
1080
+ "new": "Nouveau modèle",
1081
+ "newTitle": "Nouveau modèle PDF",
1082
+ "newBody": "Commence comme copie de {{name}}.",
1083
+ "copyOf": "Copie de {{name}}",
1084
+ "create": "Créer",
1085
+ "standard": "Standard",
1086
+ "standardDescription": "La mise en page intégrée. Lecture seule : dupliquez-la pour changer l'apparence.",
1087
+ "default": "Par défaut",
1088
+ "builtIn": "Intégré",
1089
+ "notPublished": "Non publié",
1090
+ "unpublishedChanges": "Modifications non publiées",
1091
+ "archived": "Archivé",
1092
+ "usedBy_one": "Utilisé par {{count}} offre",
1093
+ "usedBy_other": "Utilisé par {{count}} offres",
1094
+ "makeDefault": "Définir par défaut",
1095
+ "duplicate": "Dupliquer",
1096
+ "archive": "Archiver",
1097
+ "restore": "Restaurer",
1098
+ "deleteTitle": "Supprimer {{name}} ?",
1099
+ "deleteBody": "Aucune offre n'a utilisé ce modèle, rien n'en dépend.",
1100
+ "showArchived": "Afficher les modèles archivés",
1101
+ "name": "Nom",
1102
+ "editHint": "Enregistrez autant que vous voulez : seul le brouillon change. Publiez quand l’aperçu convient ; les documents s’impriment avec la mise en page publiée.",
1103
+ "publish": "Publier",
1104
+ "revert": "Annuler les modifications non publiées",
1105
+ "revertTitle": "Annuler les modifications non publiées ?",
1106
+ "revertBody": "Le brouillon revient à la mise en page publiée.",
1107
+ "publishedNotice": "Publié. Vérifié avec {{document}}.",
1108
+ "source": "HTML et CSS",
1109
+ "lines_one": "{{count}} ligne",
1110
+ "lines_other": "{{count}} lignes",
1111
+ "preview": "Aperçu",
1112
+ "previewWith": "Aperçu avec le document",
1113
+ "refresh": "Actualiser",
1114
+ "show_draft": "Brouillon",
1115
+ "show_live": "Publié",
1116
+ "previewShowsSaved": "L'aperçu montre la dernière version enregistrée.",
1117
+ "blocked": "Non chargé (seuls les fichiers téléversés sont autorisés) : {{urls}}",
1118
+ "assets_one": "Images et polices ({{count}})",
1119
+ "assets_other": "Images et polices ({{count}})",
1120
+ "assetsHint": "Référencez un fichier téléversé par son nom, p. ex. <img src=\"logo.png\">. Les liens vers d'autres sites sont bloqués.",
1121
+ "upload": "Téléverser un fichier",
1122
+ "versions_one": "Versions émises ({{count}})",
1123
+ "versions_other": "Versions émises ({{count}})",
1124
+ "versionsHint": "Une version est enregistrée lorsqu’un document est validé avec une mise en page. Les documents conservent la version avec laquelle ils ont été émis.",
1125
+ "noVersions": "Aucune offre n'a encore été émise avec ce modèle.",
1126
+ "firstUsed": "utilisé pour la première fois le {{date}}",
1127
+ "reference": "Champs disponibles",
1128
+ "standardEditHint": "Pour modifier cette mise en page, dupliquez-la sur la page",
1129
+ "defaultOption": "Par défaut ({{name}})",
1130
+ "textDefaults": "Textes par défaut des offres",
1131
+ "textDefaultsIntro": "Les nouvelles offres commencent avec ces textes, modifiables sur chaque offre. Les modifier ne change pas les offres existantes.",
1132
+ "textDefaultsPlaceholders": "Variables, remplacées à l'impression : {{placeholders}}",
1133
+ "saveTexts": "Enregistrer les textes",
1134
+ "textsSaved": "Enregistré.",
1135
+ "publishWarnings": "Remarque : {{warnings}}",
1136
+ "uploading": "Envoi…",
1137
+ "dropHint": "ou glissez des images et des polices ici (PNG, JPG, SVG, WebP, GIF, TTF, OTF, WOFF, WOFF2)",
1138
+ "textDefaultsFor": "Textes par défaut : {{type}}",
1139
+ "textDefaultsIntroFor": "Les nouveaux documents ({{type}}) commencent avec ces textes ; ils peuvent être modifiés sur chaque document. Les modifier ici ne change pas les documents existants.",
1140
+ "newTitleFor": "Nouveau modèle PDF ({{type}})",
1141
+ "newFor": "Nouveau modèle : {{type}}",
1142
+ "fromOtherType": "Partir d’un modèle d’un autre type…",
1143
+ "usedByIssued_one": "Utilisé par {{count}} document émis",
1144
+ "usedByIssued_other": "Utilisé par {{count}} documents émis"
1145
+ },
1146
+ "documentWarnings": {
1147
+ "pdf_intro_text_not_printed": "La mise en page PDF « {{template}} » n'imprime pas le texte d'introduction ; le PDF s'affiche sans.",
1148
+ "pdf_remarks_not_printed": "La mise en page PDF « {{template}} » n'imprime pas le texte final / les conditions ; le PDF s'affiche sans.",
1149
+ "pdf_line_deduction_not_printed": "La mise en page PDF « {{template}} » n'imprime pas les déductions de ligne ; ces lignes n'affichent que leur montant net.",
1150
+ "pdf_variable_not_printed": "La mise en page PDF « {{template}} » n’imprime pas : {{label}} ; le PDF s’affiche sans."
1151
+ },
1152
+ "deductions": {
1153
+ "defaultLabel": "Déduction",
1154
+ "add": "+ Déduction",
1155
+ "remove": "Retirer la déduction",
1156
+ "label": "Texte de la déduction",
1157
+ "labelPlaceholder": "p. ex. Moins déjà facturé (facture SINV-0003)",
1158
+ "perUnit": "Déduction par unité, imprimée sous la ligne ; la ligne compte le reste."
1045
1159
  }
1046
1160
  }
1047
1161
  ;