Aller au contenu principal

Patterns

Branding multi-tenant des emails et PDF

Logo, couleur primaire et pied de page par tenant et sub-tenant

Le branding (`branding`) personnalise le logo, la couleur primaire et les textes (footer, signature) appliqués aux emails transactionnels et aux PDF émis, par tenant ET par sub-tenant. Le toggle `brand_email_enabled` active/désactive le branding sur les emails ; `computed_email_footer` expose le pied de page effectivement rendu (fallback calculé si vide). L'upload du logo email se fait via un endpoint multipart dédié (`uploadLogo`/`uploadLogoFile`), stocké séparément du logo de facture (invoice templates). Pattern clé : un aperçu HTML/PDF avec overrides NON persistés (`preview(overrides)`) permet de tester une couleur ou un footer avant de sauvegarder. Les couleurs peuvent être dérivées automatiquement du logo email (`POST /invoice-templates/derive-colors-from-email-logo`). Le sous-chemin `branding.subTenants.*` applique le même contrat à un sub-tenant (anti-IDOR par scope).

À retenir

  • Branding par tenant ET par sub-tenant (scope anti-IDOR)
  • `brand_email_enabled` toggle + `computed_email_footer` (lecture seule)
  • Logo email stocké séparément du logo facture (templates)
  • Aperçu HTML/PDF avec overrides non persistés : `preview(overrides)`
  • Couleurs dérivables du logo : `derive-colors-from-email-logo`
  • Endpoints : `/api/v1/branding/tenant/*` et `/branding/sub-tenants/{id}/*`

Exemple de code

import { ScellApiClient } from '@scell/sdk'; // v3.5.0

const client = new ScellApiClient({ apiKey: process.env.SCELL_API_KEY! });

// 1. Lire la configuration de marque du tenant
const branding = await client.branding.tenant.get();
console.log('Footer rendu :', branding.computed_email_footer);

// 2. Uploader un logo email (presigned S3, séparé du logo facture)
const { url, public_url } = await client.branding.tenant.uploadLogo('image/png');
// PUT le binaire vers `url` côté client, puis :
await client.branding.tenant.update({ brand_logo_url: public_url, brand_primary_color: '#0066FF' });

// 3. Aperçu HTML AVANT de sauvegarder (overrides non persistés)
const draftHtml = await client.branding.tenant.preview({
  brand_primary_color: '#10B981',
  brand_email_footer: 'Brouillon — Ma SAS, SIRET 12345678901234',
});

// 4. Désactiver le branding sur les emails transactionnels
await client.branding.tenant.update({ brand_email_enabled: false });

// 5. Brander un sub-tenant (même contrat, scope isolé)
await client.branding.subTenants.update('sub-tenant-uuid', { brand_primary_color: '#2E7D32' });

Voir aussi

Vos préférences cookies

Nous utilisons des cookies pour améliorer votre expérience. Les cookies essentiels sont toujours actifs. Politique cookies.