Version v0.23.0
Backend
- fix(public): logo de la clinique en URL signée sur avis et référés (TRE-1992)
- feat(ops): déplacer les pièces du jour d’une visite (TRE-1983)
- fix(hospit): soin ad hoc récurrent généré avec sa composition (TRE-1979)
- fix(communication): une campagne n’envoie que les modèles du groupe ou de son site (TRE-1978)
- fix(vaccination): l’acte vaccinal facturé crédite ses valences (TRE-1980)
- docs(api): référence régénérée depuis le code (f952ab5)
- feat(hospit): soin ad hoc en dose calculée ou quantité fixe (TRE-1979)
- docs(api): référence régénérée depuis le code (39185bf)
- fix(envoi): confrère seul salué sans le nom du propriétaire (TRE-1976)
- docs(migration): Fournas — historique vaccinal réparé (1997 → 2026) (#689)
- chore(api-reference): catalogue MCP — paramètre resetOnly d’ops_vaccination_replay (#688)
- docs(api): référence régénérée depuis le code (babbd0e)
- fix(delivrance): report d’ordonnance couvert par la visite (TRE-1977)
- feat(vaccination): rejeu — option resetOnly (effacer les gestes de reprise sans reprojeter) (#687)
- feat(hospit): facturer un montant fixe en € HT par déclenchement (TRE-1971)
- feat(communication): ouvrir un envoi tel qu’il est parti (TRE-1969)
- docs(migration): Fournas — contrôle des actes, facettes vaccin, incident rejeu vaccinal, DPE (#686)
- docs(api): référence régénérée depuis le code (b218974)
- test(hospit): témoin e2e des heures par jour, modèle → feuille de soins (TRE-1968)
- fix(hospit): heures par jour non renvoyées tombent au changement de fréquence (TRE-1968)
- feat(hospit): heure d’un soin réglée jour par jour dans un modèle, V1949 (TRE-1968)
- docs(migration): Fournas — Bruno Real rattaché au compte repris (#685)
- docs(migration): Fournas — direction de la clinique invitée (#684)
- docs(migration): Fournas — équipe Treats invitée (#683)
- feat(hospit): mémoire des notes lues, par personne (TRE-1974)
- docs(migration): Fournas — réindexation, centrale Centravet, TVA confirmée, audit client (#682)
- docs(migration): Fournas — cause et traitement des écarts de prix (#681)
- docs(pitfalls): les modules qui vivent par leurs gestes ne sont pas vides à la clôture
- refactor(consultation): un seul constructeur, requête des gestes neutre dans les tests
- fix(consultation): un module Vaccination/Antiparasitaires/Identification qui porte un geste n’est pas vide à la clôture
- test(hospit): copie de cages sur services actifs seulement (TRE-1963)
- fix(hospit): copies de réglages sans service archivé (TRE-1963)
- fix(hospit): supprimer un service le supprime, ses cages libérées (TRE-1963)
- fix(consultation): un document, un fichier ou un devis compte à la clôture (TRE-1961)
- docs(migration): journal Fournas — chargement prod HEALTHY, catalogue, vaccins, antiparasitaires, reste à faire
- refactor(caisse): contre-passation sortie dans PaymentReversals (garde R2), référence API régénérée
- feat(caisse): contre-passer un encaissement (erreur de saisie ou chèque impayé)
- docs(migration): journal de bascule de la Clinique du Fournas
- docs(migration): runbook VetoPartner — reprendre une autre base que celle de MY VET
- refactor(cremation): un seul constructeur public (garde R1)
- fix(migration): VetoPartner — une base dont le site n’est pas le « 2 » se reprend (Clinique du Fournas)
- docs(api): référence régénérée (petIncCode du préremplissage de crémation)
- feat(cremation): n° INC repris de la zone Décès et tenu à jour par la demande
- docs(api): référence régénérée après fusion de main
- docs(api): référence régénérée depuis le code (f491ae8)
- docs(api): référence régénérée depuis le code (73164c0)
- docs(api): référence régénérée depuis le code (f497524)
- fix(salle-attente): la note À facturer n’est pas un reste de Terminer (TRE-1958)
- test(hospitalisation): sortie proposée à l’encaissement dans l’e2e salle d’attente (TRE-1957)
- fix(ordonnance): dose de référence de la fiche d’acte, sans repli (TRE-1956)
- docs(encaissement): sortie proposée à la confirmation (TRE-1957)
- feat(salle-attente): note du passage À facturer sur la carte (TRE-1958)
- feat(hospitalisation): séjours en cours d’une facture soldée, pour la sortie à l’encaissement (TRE-1957)
- docs(ordonnance): route act-recommendation au guide front (TRE-1956)
- feat(ordonnance): texte de la fiche d’un acte pour sa recommandation (TRE-1956)
- feat(deces): n° INC de l’animal sur patient_profile, V1947 (TRE-1955)
- fix(consultation): Interprétation dès l’acte posé dans les 9 analyses spécialisées (TRE-1950)
- fix(horiba): numéro de demande d’un compte rendu au nommage KALLITE (
.pdf) - refactor(lab): gardes d’architecture et multi-site vertes pour les demandes Horiba
- fix(passeports): refuser un animal non identifié hors consultation (TRE-1948)
- feat(ops): fichier de repasse des e-mails VetoPartner (TRE-1946)
- fix(ops): revert ne vise que les cases écrites (TRE-1946)
- fix(passeports): délivrer un passeport du registre depuis la fiche (TRE-1948)
- fix(reprise): e-mail pro VetoPartner repris en secondaire (TRE-1946)
- test(consultation): témoin TRE-1945, fixtures suivies et retirées, jeton préprod
- fix(consultation): le modèle du motif du RDV s’applique sans templateSlug (TRE-1945)
- docs(api): référence régénérée depuis le code (f0dfa85)
- docs(horiba): contrat du relais v2 (demandes d’analyse) et README à jour
- feat(horiba): demandes d’analyse Treats → Vetlink par la file du relais (V1946)
- refactor(scribe): le module Vaccination sorti de ScribeApplier (TRE-1927)
- refactor(dossier): liste des consultations hors du builder (TRE-1929)
- fix(clients): un secondaire en texte libre devient principal tel quel (TRE-1936)
- docs(api): référence régénérée depuis le code (cbdf412)
- refactor(rdv-en-ligne): fiche connue et saisies hors du service (TRE-1922)
- feat(dossier): export limité aux consultations choisies (TRE-1929)
- refactor(clients): échange des téléphones hors de ClientService (TRE-1936)
- test(hospit): créneau du soir retenté s’il est pris (TRE-1921)
- perf(stock): le détail d’un BL calcule les ventes en un passage indexé (22 s → 0,3 s)
- docs(api): référence et catalogue MCP régénérés (crémation Veternity, ops_cremation_veternity_set)
- fix(rdv-en-ligne): compte supprimé, inscription sans suite (TRE-1922)
- feat(ops): rejeu vaccinal borné à des animaux (TRE-1927)
- fix(scribe): les vaccins posés créditent leurs valences (TRE-1927)
- docs(api): référence régénérée depuis le code (682581f)
- refactor(hospit): règle de sortie prévue hors des services (TRE-1921)
- docs(api): référence régénérée depuis le code (48bac99)
- feat(clients): échanger téléphone principal et secondaire (TRE-1936)
- fix(rdv-en-ligne): aucun mot de passe posé sur un compte existant (TRE-1922)
- feat(cremation): Veternity selon les règles du 04/11 — prestations par marque, n° INC, restitution des cendres, Espace Pro et PDF
- test(devis): témoin e2e recherche, TTC, favoris (TRE-1931, TRE-1932, TRE-1933)
- fix(devis): « Ajouter à la facturation » remplace « Convertir » (TRE-1930)
- feat(devis): modèles de devis favoris, par personne (TRE-1932)
- feat(devis): prix d’une ligne saisi en TTC, comme la facture (TRE-1933)
- feat(devis): recherche dans la liste des devis (TRE-1931)
- docs(stock): format réel du BL Centravet (sans en-tête, 22 colonnes, aaaammjj)
- fix(patient): supprimer un animal né d’un RDV en ligne (TRE-1934)
- chore(formation): mur RLS en enforce sur formation.treats.vet (TRE-1539)
- docs(api): référence régénérée depuis le code (9069858)
- fix(stock): les BL Centravet réels (sans en-tête) sont lus au dépôt et au FTP
- docs(pitfalls): rattachement de la fiche connue après le code (TRE-1922)
- fix(rdv-en-ligne): rattacher la fiche connue après le code SMS (TRE-1922)
- fix(taches): la prochaine occurrence d’une série toujours posée (TRE-1928)
- fix(hospit): sortie prévue jamais avant l’admission (TRE-1921)
- fix(formation): copie du modèle en périmètre système sous RLS (TRE-1539)
- refactor(agenda): types proposés hors d’AppointmentService (TRE-1446)
- refactor(auth): lignes de la personne sans grossir le service (TRE-1879)
- docs(api): référence régénérée depuis le code (a49843b)
- fix(rdv-en-ligne): reprendre la fiche connue du groupe (TRE-1922)
- test(agenda): constructeur unique d’AppointmentService (TRE-1446)
- test(agenda): créneau du script témoin tiré au hasard (TRE-1446)
- test(agenda): script témoin du type externe rejoué sur pile (TRE-1446)
- fix(agenda): types proposés par la même lecture qu’avant (TRE-1446)
- feat(agenda): type de RDV « Rendez-vous externe » activable (TRE-1446)
- test(mcp): constructeur unique d’OAuthService (TRE-1879)
- test(mcp): refus nommés comparés par leur code (TRE-1879)
- fix(mcp): bascule sous second facteur, retrait d’accès suivi (TRE-1879)
- test(mcp): script de bascule rejoué sur pile, bash 3 (TRE-1879)
- docs(mcp): bascule de contexte et son script témoin (TRE-1879)
- feat(mcp): changer de site ou d’organisation sans reconnexion (TRE-1879)
- fix(reprise): delta des notes sans faux écart d’ordre, CONFLICT dès le plan (TRE-1923)
- test(formation): V1940 et V1941 lues comme du texte (TRE-1733)
- refactor(documents): variables de montant sorties de DocumentService (TRE-1808)
- fix(oxane): un seul constructeur pour SiteIntegrationConfigService (TRE-1833)
- feat(formation): fiches pratiques déposées dans la console (TRE-1733)
- fix(stock): un produit jamais reçu se sort en négatif (TRE-1918)
- docs(api): référence régénérée depuis le code (65281c8)
- fix(migration): V1850 en NUMERIC(15,3), la prod porte une quantité à 2 147 483 647
- test(documents): témoin des variables facture.* sous bash 3.2 (TRE-1808)
- test(oxane): témoin des deux environnements, refus clinique et verrou (TRE-1833)
- docs(compte-client): doublon de reprise mesuré par organisation (TRE-1861)
- docs(api): référence régénérée depuis le code (7a5d02e)
- test(encaissement): PDF des listes vérifié pour l’ASV (TRE-1869)
- fix(encaissement): chèque impayé refusé sur une facture annulée (TRE-1862)
- fix(caisse): pas de clôture vide avant le premier jour de caisse (TRE-1870)
- fix(facturation): PDF des listes ouvert à INVOICE_READ (TRE-1869)
- test(caisse): témoin du premier jour de caisse rejouable (TRE-1870)
- fix(compte-client): régler une ardoise sans facture, reçu REG- (TRE-1861)
- feat(encaissement): enregistrer un chèque revenu impayé (TRE-1862)
- fix(encaissement): PDF du Détail ouvert à PAYMENT_READ (TRE-1869)
- fix(caisse): clôtures exigées dès le premier jour de caisse (TRE-1870)
- merge: main dans la refonte des quantités (TRE-1916, TRE-1871, TRE-1882)
- docs(pitfalls): 43 fiches hors de leur dernière activité (TRE-1882)
- docs(api): référence régénérée depuis le code (57e3ec2)
- fix(lab): Horiba durci — bon animal, une notification, clé du relais, pause (TRE-1307)
- fix(mcp): un scopeId de réglage hors de l’organisation du principal est refusé
- docs(api): référence régénérée depuis le code (34d55c6)
- fix(reprise): apply refuse un plan qui a ignoré sourceIds (TRE-1917)
- fix(reprise): notes VetoPartner sans « ) ) n n 0 8 0 0 » ni ligne « ) » (TRE-1916)
- fix(ops): alléger aussi les PDF rendus sans document_link (TRE-1871)
- fix(reprise): clinique de suivi VetoPartner sur la dernière activité (TRE-1882)
- refactor(ordonnance): règles de quantité facture ↔ ordonnance dans le paquet medication
- fix(ordonnance): corrections des relectures de la refonte des quantités, cas limites e2e
- docs(api): référence régénérée depuis le code (eae35aa)
- fix(documents): facture choisie bornée à l’organisation du site (TRE-1808)
- fix(oxane): environnement figé après le premier échange, file rendue sans essai (TRE-1833)
- feat(reprise): delta à lignes choisies, sourceIds (TRE-1917)
- feat(documents): variables d’une facture choisie dans les modèles (TRE-1808)
- docs(oxane): environnement par site, passage de la prod en live (TRE-1833)
- feat(oxane): environnement Oxane par site, préprod ou prod (TRE-1833)
- docs(lab): contrat du relais Horiba, README rétablie, référence d’API (TRE-1307)
- test(lab): témoin e2e du relais Horiba et fichiers d’exemple (TRE-1307)
- feat(lab): retour de la réception Horiba Vetlink, durcie, V1900 (TRE-1307)
- fix(hospit): dose « + » au poids du jour, la prise faite en dernier recours (TRE-1914)
- feat(ordonnance): complément facturé, outil de reprise, doc et piège de la refonte des quantités
- fix(support-agent): code HTTP aussi sur les écritures Crisp en échec (TRE-1781)
- docs(catalogue): suggestion de module, liste sans ordre (TRE-1842)
- fix(catalogue): périmètre d’un module avec sa catégorie par défaut, modules triés (TRE-1842)
- feat(ordonnance): stock réservé au délivré, ordonnancier écrit à l’émission, fractions, complément
- feat(support): le site de la personne dans le nom Crisp et en segment (TRE-1864)
- fix(facture): un acte de vaccination facturé une fois par consultation (TRE-1867)
- fix(hospit): la dose « + » garde son volume en mL et sa trace (TRE-1914)
- fix(agenda): « Sortie d’hospit · animal · cage », jamais avant l’admission (TRE-1874)
- fix(support-agent): veille économe en appels Crisp, code HTTP au journal (TRE-1781)
- test(ordonnance): témoin e2e des quantités décimales et liens par identifiant ; TRE-1448 à la règle D3
- feat(ordonnance): quantités décimales et liens item ↔ ordonnance par identifiant
- fix(inbox): récapitulatif du matin coupé par défaut (STAFF_DIGEST_ENABLED=true pour l’ouvrir)
- docs(api): référence régénérée depuis le code (4d6d48c)
- feat(hospit): reprendre la consultation déjà facturée au devis (TRE-1899)
- docs(api): référence régénérée depuis le code (ff87959)
- feat(clients): typologie, profil et note importante pour la carte et Ctrl+K (TRE-1913)
- fix(hospit): la seconde route de reconduction garde aussi le volume (TRE-1910)
- docs(hospit): piège du soin reconduit sans son volume (TRE-1910)
- fix(hospit): un soin reconduit garde sa dose en mL (TRE-1910)
- fix(inbox): événements de la boîte de réception déclarés au registre de l’outbox
- docs(api): référence régénérée avec les routes /inbox
- docs(structuration): le run complet ne prend que les consultations reprises
- fix(structuration): les lots de reprise ne prennent que les consultations reprises
- fix(satisfaction): en-têtes de l’export exposés au CORS ; e2e v1 au site sans fausser la résolution
- docs(satisfaction): référence API et catalogue MCP régénérés après rebase et corrections
- test(satisfaction): jeu de cas partagé de la logique, e2e des corrections de relecture
- fix(satisfaction): corrections des relectures — logique (D3-D6), app propriétaire (D7), appels (D8-D10), brouillon (D11, D12), résultats et export (D1, D13), textes v3 (D14)
- docs(satisfaction): § 12.16, décisions des relectures (D1-D14)
- docs(satisfaction): référence API et catalogue MCP régénérés ; e2e v2 lançable seul
- fix(satisfaction): alerte déclenchée supprimable, version propre au-dessus de la version lue, e2e MCP
- test(satisfaction): e2e du format v2 (types, logique, brouillon, versions, alertes, email, résultats, export, IA)
- feat(satisfaction): MCP du questionnaire — réglages, gabarits question par question, logique, alertes, résultats
- feat(satisfaction): questionnaires riches — format v2, logique, brouillon, versions, alertes, résultats, export
- docs(satisfaction): contrat du format v2 des questionnaires (types, logique, brouillon, alertes, résultats, MCP)
- fix(inbox): retours des trois relectures (sources reprises, doublons, perf, envois coupés)
- feat(inbox): boîte de réception de l’équipe — « À faire », notifications, rappels, email (V1780)
- refactor(services): OAuthService et CampaignPublishService n’ont plus qu’un constructeur
- refactor(hospitalisation): HospitalizationProtocolTemplateService n’a plus qu’un constructeur
- refactor(agenda): AppointmentService n’a plus qu’un constructeur
- refactor(pricing): PricingAlertService n’a plus qu’un constructeur
- refactor(billing): InvoiceLineUseCase, la facture vue des autres domaines
- refactor(services): un seul constructeur pour 11 services dont les relais combinaient leurs paramètres
- refactor(services): un seul constructeur pour 31 services dont les relais posaient une valeur par défaut
- refactor(services): les setters chaînés à la construction passent par le constructeur
- refactor(billing): les politiques de sortie de stock et de chiffre d’affaires passent par le constructeur
- refactor(services): un seul constructeur pour les 45 derniers services à relais purs
- refactor(catalogue): un seul constructeur pour 35 services du catalogue et du stock
- refactor(clinique): un seul constructeur pour 60 services cliniques
- refactor(billing): un seul constructeur pour 21 services de facturation et de prix
- refactor(consultation): ConsultationService n’a plus qu’un constructeur
- refactor(onboarding): les sections « protocoles » de l’import de l’assistant sortent de WizardConfigImporter
- refactor(onboarding): les sections « clinique » de l’import de l’assistant sortent de WizardConfigImporter
- refactor(catalogue): les écrivains des facettes médicales sortent de FacetCardService
- refactor(catalogue): l’écrivain de la facette Hospitalisation sort de FacetCardService
- refactor(patient): la frise chronologique d’un animal sort de PatientRecordService
- refactor(hospit): l’admission, l’annulation et la mise à jour d’un séjour sortent de HospitalizationService
- refactor(hospit): les lectures et gestes courants d’un séjour sortent de HospitalizationService
- refactor(hospit): la sortie d’hospitalisation sort de HospitalizationService
- refactor(hospit): le socle des séjours et la vue des cages sortent de HospitalizationService
- refactor(hospit): les lectures des soins sortent de HospitalizationCareService
- refactor(hospit): le socle des soins et les constantes sortent de HospitalizationCareService
- refactor(ordonnance): renouvellement, duplication et dose au poids sortent de PrescriptionService
- refactor(ordonnance): l’édition des lignes sort de PrescriptionService
- refactor(ordonnance): la signature, l’annulation et le document sortent de PrescriptionService
- refactor(ordonnance): le socle commun des ordonnances sort de PrescriptionService
- refactor(ordonnance): le moteur posologique sort de PrescriptionService
- refactor(consultation): la validation et le déverrouillage sortent de ConsultationService
- refactor(consultation): l’enregistrement d’un module sort de ConsultationService
- refactor(consultation): l’édition des modules sort de ConsultationService
- refactor(consultation): le démarrage et la duplication sortent de ConsultationService
- refactor(consultation): le socle commun des consultations sort de ConsultationService
- refactor(consultation): les modèles de consultation sortent de ConsultationService
- refactor(consultation): les effets de la validation sur l’animal sortent de ConsultationService
- refactor(consultation): les règles des données d’un module sortent de ConsultationService
- refactor(consultation): les réservations de stock des modules sortent de ConsultationService
- refactor(consultation): la synchronisation modules → ordonnance sort de ConsultationService
- refactor(billing): l’avancement d’un devis d’hospitalisation sort de son service
- refactor(billing): le calcul des lignes d’un devis d’hospitalisation sort de son service
- refactor(billing): les calculs des lignes d’un avoir sortent de CreditNoteService
- refactor(billing): la restitution d’un avoir sort de CreditNoteService
- refactor(billing): les lectures des avoirs sortent de CreditNoteService
- refactor(billing): l’envoi et les documents d’un devis sortent de QuoteService
- refactor(billing): l’édition des lignes de devis sort de QuoteService
- refactor(billing): le socle des devis sort de QuoteService
- refactor(billing): la conversion d’un devis en facture sort de QuoteService
- refactor(billing): l’encaissement groupé sort de PaymentService
- refactor(billing): report, remboursement et date d’encaissement sortent de PaymentService
- refactor(billing): le compte client et la correction de mode sortent de PaymentService
- refactor(billing): les lectures de l’encaissement sortent de PaymentService
- refactor(billing): les lectures sortent d’InvoiceService, qui ne porte plus que délégations et câblage
- refactor(billing): la création et les ajustements sortent d’InvoiceService
- refactor(billing): l’annulation et le remplacement sortent d’InvoiceService
- refactor(billing): la validation d’un brouillon sort d’InvoiceService
- refactor(billing): le reste du tiers payant sort d’InvoiceService
- refactor(billing): l’édition des lignes sort d’InvoiceService
- refactor(billing): l’ajout de ligne et sa tarification sortent d’InvoiceService
- refactor(billing): la reconstruction du brouillon et le recalcul sortent d’InvoiceService
- refactor(billing): les lignes tirées des modules de consultation sortent d’InvoiceService
- refactor(billing): un seul chemin d’écriture des lignes résolues par le moteur (ChargeLineWriter)
- refactor(billing): la réécriture du module de consultation sort d’InvoiceService
- refactor(billing): les lectures de la liste des factures sortent d’InvoiceService (InvoiceQueries)
- refactor(billing): la réponse d’une facture sort d’InvoiceService (InvoiceViewAssembler)
- refactor(billing): tiers payant, la règle d’impact d’une annulation et la vue sortent d’InvoiceService
- fix(billing): un report au compte client est strictement positif
- fix(billing): retirer PUT /invoices/{id}/pay, qui soldait une facture sans règlement
- fix(billing): le devis s’arrondit comme la facture issue de sa conversion
- docs(architecture): identifiants légaux par pays, reporté (motif et garde-fou en place)
- refactor(country): numéros de téléphone par pays (PhoneNumberPolicy, FrPhoneNumbers)
- docs(architecture): relecture du 01/11 du refacto, corrigé, vérifié, reporté
- feat(country): le pays devient une donnée, pack pays par site (V1620)
- refactor(time): le fuseau des cliniques en un seul endroit (ClinicTime.DEFAULT_ZONE)
- refactor(billing): règle de statut selon l’encaissé dans le domaine (Invoice.statusForPaidAmount)
- refactor(billing): un seul grand livre du compte client (ClientAccountLedger)
- refactor(billing): sceau fiscal derrière un port, cachet d’émission extrait (InvoiceIssuance)
- refactor(billing): une seule ventilation de TVA (VatBreakdown) pour la facture et le devis d’hospitalisation
- refactor(billing): numérotation des pièces en un seul endroit, derrière une politique par pays
- refactor(billing): CreditNoteService, QuoteService, PaymentService à constructeur unique
- refactor(billing): InvoiceService à constructeur unique, code mort retiré
- fix(hospitalisation): numéro de devis d’hospitalisation atomique par organisation (V1610)
- chore(architecture): garde en cliquet et campagne e2e différentielle du refacto