/** * invoice_pdf — génération de PDF pour les factures natives. * * **Phase 1 stub.** L'implémentation réelle (templates @react-pdf/renderer * + upload MinIO) arrive en Phase 2 avec packages/ui/invoice-templates/. * Pour l'instant, `generateInvoicePdf` renvoie `null` (= pas de PDF stocké) * et `previewInvoicePdf` throw `not_implemented` (501). * * Le contrat de l'interface est figé pour que la Phase 2 soit un drop-in * remplacement sans toucher au controller : on remplace le corps de ces * fonctions par l'appel à `@react-pdf/renderer.renderToBuffer(...)` puis * `media_storage.uploadBuffer(...)`. */ import type Invoice from '#models/invoice' import { Exception } from '@adonisjs/core/exceptions' export interface InvoiceRenderContext { /** L'invoice complet, snapshots compris. */ invoice: Invoice /** Settings résolus (themeSlug, accentColor, issuer, rib…). */ // Le type complet est dans #services/invoice_settings → ResolvedInvoiceSettings, // mais comme c'est un stub on garde unknown pour ne pas créer de couplage // que Phase 2 devra de toute façon retravailler. resolvedSettings: unknown } export interface GeneratedPdf { /** Clé MinIO sous laquelle le PDF est stocké. */ storageKey: string /** Taille du PDF en bytes. */ bytes: number } /** * Génère le PDF de la facture et l'upload sur MinIO. Stub Phase 1. * * Phase 2 : renderToBuffer() → uploadBuffer → storageKey. */ export async function generateInvoicePdf(_ctx: InvoiceRenderContext): Promise { // Phase 1 : pas de génération. Le controller persiste l'invoice avec // pdfStorageKey=null et l'UI affichera "PDF en cours de génération" // (ou un placeholder). La Phase 2 active la vraie génération. return null } /** * Renvoie un buffer PDF pour preview (sans persister). Stub Phase 1. * * Phase 2 : même rendu que generateInvoicePdf, mais retourne le buffer * directement au lieu d'uploader. */ export async function previewInvoicePdf(_ctx: InvoiceRenderContext): Promise { throw new Exception('PDF preview not yet implemented (Phase 2)', { status: 501, code: 'not_implemented', }) }