-- ===========================================
-- Migration 007 : Enregistrement des event types don.recu.demande / don.recu
-- ===========================================
-- Ticket #1146 (QALIOPI) : un virement recu peut etre un DON (et non un paiement
-- de formation). Un don ne suit pas la facturation formation : l'Ecole genere un
-- RECU FISCAL (RF-AAAA-NNNNN, CGI art. 200 / 238 bis), pas une facture.
--
-- Contrat dedie sur le bus (2 sens, calque sur le flux virement) :
--   - don.recu.demande : QALIOPI emet --> bus --> Ecole (consommateur)
--   - don.recu         : Ecole  emet --> bus --> QALIOPI (consommateur)
--
-- Cause traitee : le bus rejetait `don.recu.demande` en 403 « Type d'evenement
--   inconnu » (EventBus::publish), faute d'entree dans event_types. Le don #1146
--   restait donc bloque cote QALIOPI (jamais pousse a l'Ecole). Le retour
--   `don.recu` n'avait par ailleurs aucune subscription pour atteindre QALIOPI,
--   dont le CentralWebhookController gere pourtant deja le cas 'don.recu'.
--
-- Emetteurs / consommateurs verifies dans le code (07/2026) :
--   - QALIOPI VirementsController::publishDonRecuDemande -> 'don.recu.demande'
--   - QALIOPI CentralWebhookController case 'don.recu'    -> handleDonRecu()
--   - Ecole   CentralWebhookController : ajoutera le case 'don.recu.demande'
--     (handler reçu fiscal). Tant qu'il est absent, l'Ecole repond 200
--     « Type d'evenement non gere » (default case) : la delivery est marquee
--     delivered cote bus, pas de retry parasite.
--
-- payload_schema : documentaire (NON valide par le bus). Schemas figes dans
--   QALIOPI docs/api-centrale/virement-facturation.md.
--
-- /!\ PRE-REQUIS SECRET HMAC (cf. migration 006) : la subscription Ecole creee
--   ici herite du secret d'un abonnement Ecole existant. Si les abonnements
--   `ecole` portent encore le placeholder `CHANGE_ME...` en prod, la livraison
--   don.recu.demande -> Ecole echouera en 401 (comme virement.ligne). Appliquer
--   le fix secret Ecole (UPDATE ... WHERE a.slug='ecole') APRES cette migration.
-- ===========================================

-- -------------------------------------------
-- 1. Types d'evenements (allowlist du bus)
-- -------------------------------------------
INSERT IGNORE INTO event_types (slug, description, source_app_id, payload_schema) VALUES
('don.recu.demande',
 'Don confirme a transmettre a l Ecole pour emission du recu fiscal (emis par QALIOPI)',
 (SELECT id FROM apps WHERE slug = 'qaliopi'),
 JSON_OBJECT(
   'allocation_ref', 'string  requis  ref de la ligne (virement-{id})',
   'virement_id',    'number  requis  id du virement QALIOPI',
   'date_don',       'string  requis  date du don (YYYY-MM-DD)',
   'montant_ttc',    'number  requis  montant du don',
   'devise',         'string  requis  code devise (EUR)',
   'mode',           'string  requis  mode de versement (virement)',
   'donateur',       'object  requis  type/email/nom/prenom/adresse/code_postal/ville/pays + raison_sociale/siret si morale',
   'intention',      'string  optionnel  message libre du donateur',
   'statut',         'string  requis  confirme'
 )
);

INSERT IGNORE INTO event_types (slug, description, source_app_id, payload_schema) VALUES
('don.recu',
 'Recu fiscal du don emis par l Ecole, en retour vers QALIOPI',
 (SELECT id FROM apps WHERE slug = 'ecole'),
 JSON_OBJECT(
   'allocation_ref', 'string  requis  ref de la ligne (virement-{id})',
   'recu_numero',    'string  requis  numero du recu fiscal (RF-AAAA-NNNNN)',
   'recu_date',      'string  requis  date d emission du recu (YYYY-MM-DD)',
   'recu_pdf_url',   'string  optionnel  lien de telechargement du recu (Ecole)'
 )
);

-- -------------------------------------------
-- 2. Subscription : Ecole consomme don.recu.demande
--    (secret repris d'un abonnement Ecole actif — cf. avertissement en tete)
-- -------------------------------------------
SET @ecole_secret := (
  SELECT s.secret
  FROM subscriptions s
  JOIN apps a ON a.id = s.app_id
  WHERE a.slug = 'ecole' AND s.is_active = 1
  ORDER BY s.id
  LIMIT 1
);

INSERT IGNORE INTO subscriptions (app_id, event_type_id, callback_url, secret) VALUES
((SELECT id FROM apps WHERE slug = 'ecole'),
 (SELECT id FROM event_types WHERE slug = 'don.recu.demande'),
 'https://ecole.altheaprovence.com/api/webhook/central',
 COALESCE(@ecole_secret, 'CHANGE_ME_subscription_secret_ecole_64chars_00000000000000000'))
;

-- -------------------------------------------
-- 3. Subscription : QALIOPI consomme don.recu (retour)
--    (secret repris d'un abonnement QALIOPI actif — vrai secret en prod)
-- -------------------------------------------
SET @qaliopi_secret := (
  SELECT s.secret
  FROM subscriptions s
  JOIN apps a ON a.id = s.app_id
  WHERE a.slug = 'qaliopi' AND s.is_active = 1
  ORDER BY s.id
  LIMIT 1
);

INSERT IGNORE INTO subscriptions (app_id, event_type_id, callback_url, secret) VALUES
((SELECT id FROM apps WHERE slug = 'qaliopi'),
 (SELECT id FROM event_types WHERE slug = 'don.recu'),
 'https://gestion.altheaprovence.com/api/webhook/central',
 COALESCE(@qaliopi_secret, 'CHANGE_ME_subscription_secret_qaliopi_64chars_0000000000000000'))
;
