Migrations : - plans (uuid id, organization_id FK CASCADE, slug nullable, name, description, is_default). Unique (organization_id, slug) — un slug max par org. - plan_steps (uuid id, plan_id FK CASCADE, order, offset_days, tone ENUM PG natif, subject, body, requires_manual_validation). Schema rules : override du tone (introspection PG → 'any', on précise l'union). Modèles Plan (belongsTo Organization, hasMany PlanStep) et PlanStep (belongsTo Plan). Décision : plans dupliqués par organisation au signup (pas de table globale partagée). Permet l'édition isolée par org sans toucher aux templates des autres tenants. Le service `provisionDefaultPlans(orgId, trx)` est idempotent et appelé depuis NewAccountController dans la transaction de création. Source de vérité des 4 plans (Standard B2B, Rapide, Patient, Ferme) dans app/services/default_plans.ts — alignée sur apps/web/src/mocks/seed.ts. Endpoints : - GET /plans : liste enrichie avec usageCount (à 0 tant qu'Invoice n'est pas câblé). - GET /plans/:slug : détail (lookup par slug pour URL stable côté SPA). - PATCH /plans/:slug : édition partielle. Les steps sont remplacés en bloc dans une transaction (pas de diff fin id-par-id, plus simple et prévisible). POST plan custom = V2 (cf. backend.md §5.5).
18 lines
444 B
TypeScript
18 lines
444 B
TypeScript
import { type SchemaRules } from '@adonisjs/lucid/types/schema_generator'
|
|
|
|
/**
|
|
* Override de types pour les colonnes que Lucid n'arrive pas à inférer
|
|
* depuis l'introspection PG (ex. ENUMs natifs → tapés `any` par défaut).
|
|
*/
|
|
export default {
|
|
tables: {
|
|
plan_steps: {
|
|
columns: {
|
|
tone: {
|
|
tsType: "'amical' | 'courtois' | 'ferme' | 'mise_en_demeure'",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
} satisfies SchemaRules
|