<?xml version="1.0"?>
<doc>
    <assembly>
        <name>MobileCitoyenExchange</name>
    </assembly>
    <members>
        <member name="T:MyApi.Controllers.AuthController">
            <summary>
            Gestion de l'authentification — login, logout et changement de mot de passe.
            </summary>
        </member>
        <member name="M:MyApi.Controllers.AuthController.Login(LoginModel)">
             <summary>
             Authentifie un utilisateur et retourne un token JWT.
             </summary>
             <param name="model">
             Les identifiants de connexion (nom d'utilisateur et mot de passe).
             </param>
             <returns>
             Un token JWT contenant les informations de l'utilisateur et ses rôles.
             Le token est valide pendant 20 minutes.
             </returns>
             <remarks>
             Endpoint public — aucune authentification requise.
            
             Le token JWT retourné contient les claims suivants :
             - **NameIdentifier** : identifiant unique de l'utilisateur
             - **Name** : nom d'utilisateur
             - **Email** : adresse email
             - **GivenName** : prénom
             - **Surname** : nom de famille
             - **Gender** : sexe (M ou F)
             - **Role** : rôle(s) de l'utilisateur (Admin, RH, GrandCommis, Fonctionnaire)
             - **MinistereId** : identifiant du ministère (si applicable)
             - **SectionId** : identifiant de la section (si applicable)
            
             Après plusieurs tentatives infructueuses, le compte est temporairement
             verrouillé (protection anti-force-brute) et l'endpoint répond 423.
            
             Exemple de requête :
            
                 POST /api/auth/login
                 {
                   "username": "votre_nom_utilisateur",
                   "password": "votre_mot_de_passe"
                 }
            
             Exemple de réponse :
            
                 {
                   "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
                   "expiration": "2024-01-15T10:20:00Z",
                   "username": "jdupont",
                   "prenom": "Jean",
                   "nom": "Dupont",
                   "sexe": "M",
                   "email": "jdupont@mef.gouv.ht",
                   "ministereId": "1112",
                   "sectionId": "1112001",
                   "roles": ["GrandCommis"]
                 }
            
             </remarks>
             <response code="200">Retourne le token JWT avec les informations de l'utilisateur.</response>
             <response code="400">Le corps de la requête est invalide ou manquant.</response>
             <response code="401">Nom d'utilisateur ou mot de passe incorrect.</response>
             <response code="423">Compte temporairement verrouillé suite à trop de tentatives échouées.</response>
        </member>
        <member name="M:MyApi.Controllers.AuthController.ChangePassword(MyApi.Dtos.ChangePasswordDto)">
             <summary>
             Permet à un utilisateur authentifié de changer son mot de passe.
             </summary>
             <param name="model">
             L'ancien mot de passe, le nouveau mot de passe et sa confirmation.
             </param>
             <returns>
             Un message de confirmation si le changement a réussi.
             </returns>
             <remarks>
             Endpoint privé — requiert un token JWT valide (tout rôle accepté).
            
             Règles de validation :
             - L'ancien mot de passe doit être correct
             - Le nouveau mot de passe doit contenir au moins 8 caractères
             - Le nouveau mot de passe et sa confirmation doivent être identiques
             - Le nouveau mot de passe ne peut pas être identique à l'ancien
            
             Exemple de requête :
            
                 POST /api/auth/change-password
                 Authorization: Bearer {token}
                 {
                   "currentPassword": "ancien_mot_de_passe",
                   "newPassword": "nouveau_mot_de_passe",
                   "confirmPassword": "nouveau_mot_de_passe"
                 }
            
             Exemple de réponse :
            
                 {
                   "message": "Mot de passe modifié avec succès.",
                   "reauthenticationRequired": true
                 }
            
             Après un changement réussi, le jeton courant est invalidé (rotation du
             SecurityStamp) : le client doit se reconnecter pour obtenir un nouveau jeton.
             </remarks>
             <response code="200">Mot de passe modifié avec succès.</response>
             <response code="400">Validation échouée — ancien mot de passe incorrect, nouveau invalide ou confirmation non concordante.</response>
             <response code="401">Token JWT manquant ou invalide.</response>
        </member>
        <member name="M:MyApi.Controllers.AuthController.ForgotPassword(MyApi.Dtos.ForgotPasswordDto)">
            <summary>
            Demande de réinitialisation : envoie un code à 6 chiffres par email.
            </summary>
            <remarks>
            Endpoint public. La réponse est toujours identique, que le compte existe ou non
            (on ne révèle jamais l'existence d'un email). Le code expire après quelques minutes.
            </remarks>
        </member>
        <member name="M:MyApi.Controllers.AuthController.ResetPassword(MyApi.Dtos.ResetPasswordDto)">
            <summary>
            Réinitialise le mot de passe à partir du code à 6 chiffres reçu par email.
            </summary>
        </member>
        <member name="M:MyApi.Controllers.DeclarationDefinitiveImpotController.GetDeclarationDefinitiveImpot(System.String,System.String)">
             <summary>
             cette méthode permet de récupérer la déclaration définitive d'impôt pour un contribuable
             donné (identifié par son NIF) et une année fiscale spécifique.
             </summary>
             <param name="nif">
              le NIF au format "XXX-XXX-XXX-X" où chaque "X" représente un chiffre. Par exemple, "003-456-789-0".
             </param>
             <param name="anneeFiscale">
              L'année fiscale au format "AAAA-AAAA" (ex: 2023-2024).
             </param>
             <returns>
              retourne la liste des cheques emis pour le contribuable pendant l'année fiscale spécifiée.
              Si aucune déclaration n'est trouvée, elle retourne une réponse 404 Not Found.
              Sinon, elle retourne les données de la déclaration avec une réponse 200 OK.
             </returns>
            
             <remarks>
             Endpoint privé — requiert le rôle **GrandCommis, Fonctionnaire ou RH**.
            
             Chaque utilisateur ne peut consulter que **sa propre** déclaration : le NIF demandé
             doit correspondre au NIF présent dans son jeton JWT, sinon la requête est refusée (403).
            
             Exemple de requête :
             GET /api/DeclarationDefinitiveImpot/003-456-789-0/2023-2024
            
             Exemple de réponse :
             <code>
             {
               "Nif": "003-456-789-0",
               "Nom": "Doe",
               "Prenom": "John",
               "NoCheque": "CHK-0001",
               "MontantBrut": 10000.00,
               "MontantFDU": 200.00,
               "MontantCAS": 150.00,
               "MontantPension": 300.00,
               "MontantCFGDCT": 50.00,
               "MontantAssurance": 75.00,
               "MontantISR": 1200.00,
               "MontantDGI": 100.00,
               "MontantNet": 8125.00,
               "AnneeFiscale": "2023-2024"
             }
             </code>
             </remarks>
              <response code="200"> Retourne la déclaration définitive d'impôt pour le contribuable et l'année fiscale spécifiés.</response>
              <response code="400"> Le NIF et l'année fiscale sont requis.</response>
              <response code="403"> Le NIF demandé ne correspond pas à celui de l'utilisateur authentifié.</response>
              <response code="404"> Aucune déclaration définitive d'impôt trouvée pour le NIF et l'année fiscale spécifiés.</response>
        </member>
        <member name="T:MyApi.Controllers.DepenseController">
            <summary>
            Gestion des dépenses budgétaires.
            Certains endpoints sont publics, d'autres requièrent le rôle <b>GrandCommis</b>.
            </summary>
        </member>
        <member name="M:MyApi.Controllers.DepenseController.GetDepenseGlobalAnneeFiscaleAsync(System.String)">
             <summary>
             Retourne le total global des dépenses pour une année fiscale.
             </summary>
             <param name="anneeFiscale">
             L'année fiscale au format "AAAA-AAAA" (ex: 2023-2024).
             </param>
             <returns>
             Le montant total alloué et le montant total dépensé pour l'année fiscale,
             tous ministères confondus.
             </returns>
             <remarks>
             Endpoint public — aucune authentification requise.
            
             Exemple de requête :
            
                 GET /api/depense/total/2023-2024
            
             Exemple de réponse :
            
                 {
                   "montantAlloue": 150000000.00,
                   "montantDepense": 120000000.00
                 }
            
             </remarks>
             <response code="200">Retourne le total global des dépenses.</response>
             <response code="400">L'année fiscale est manquante ou invalide.</response>
             <response code="404">Aucune dépense trouvée pour cette année fiscale.</response>
        </member>
        <member name="M:MyApi.Controllers.DepenseController.GetDepensesParMinistereAsync(System.String,System.String)">
             <summary>
             Retourne les dépenses par article budgétaire pour un ministère donné.
             </summary>
             <param name="anneeFiscale">
             L'année fiscale au format "AAAA-AAAA" (ex: 2023-2024).
             </param>
             <param name="ministereId">
             L'identifiant du ministère sur 4 chiffres (ex: 1112).
             </param>
             <returns>
             Une liste regroupant les dépenses du ministère par article budgétaire,
             avec les montants alloués, engagés et dépensés pour chaque article.
             </returns>
             <remarks>
             Endpoint public — aucune authentification requise.
            
             Exemple de requête :
            
                 GET /api/depense/ministere/2023-2024/1112
            
             </remarks>
             <response code="200">Retourne les dépenses groupées par article.</response>
             <response code="400">L'année fiscale ou le ministère est manquant.</response>
             <response code="404">Aucune dépense trouvée pour ce ministère et cette année fiscale.</response>
        </member>
        <member name="M:MyApi.Controllers.DepenseController.GetDepenseTotalParArticleAsync(System.String)">
             <summary>
             Retourne le total des dépenses par article budgétaire pour une année fiscale.
             </summary>
             <param name="anneeFiscale">
             L'année fiscale au format "AAAA-AAAA" (ex: 2023-2024).
             </param>
             <returns>
             Une liste des 9 articles budgétaires avec le total des montants
             alloués, engagés et dépensés sur l'ensemble des ministères.
             </returns>
             <remarks>
             Endpoint public — aucune authentification requise.
            
             Les articles budgétaires sont :
             - 1 : Dépenses de personnel
             - 2 : Services et charges diverses
             - 3 : Achats de biens de consommation
             - 4 : Immobilisation corporelle
             - 5 : Immobilisation incorporelle
             - 6 : Prêts, avances et participations
             - 7 : Subventions et contributions
             - 8 : Amortissement de la dette
             - 9 : Autres dépenses publiques
            
             Exemple de requête :
            
                 GET /api/depense/article/2023-2024
            
             </remarks>
             <response code="200">Retourne les dépenses groupées par article.</response>
             <response code="400">L'année fiscale est manquante ou invalide.</response>
             <response code="404">Aucune dépense trouvée pour cette année fiscale.</response>
        </member>
        <member name="M:MyApi.Controllers.DepenseController.GetDepenseParPeriodeAllocationAsync(System.String)">
             <summary>
             Retourne les dépenses mensuelles par période d'allocation pour une année fiscale.
             </summary>
             <param name="anneeFiscale">
             L'année fiscale au format "AAAA-AAAA" (ex: 2023-2024).
             </param>
             <returns>
             Une liste de 13 périodes (Octobre → Septembre + Correction) avec les montants
             alloués, engagés et dépensés par mois.
             </returns>
             <remarks>
             Endpoint public — aucune authentification requise.
            
             L'année fiscale haïtienne commence en Octobre et se termine en Septembre.
             La période "Correction" (13e mois) correspond aux ajustements de fin d'exercice.
            
             Exemple de requête :
            
                 GET /api/depense/periode/allocation/2023-2024
            
             </remarks>
             <response code="200">Retourne les dépenses par période d'allocation.</response>
             <response code="400">L'année fiscale est manquante ou invalide.</response>
             <response code="404">Aucune dépense trouvée pour cette année fiscale.</response>
        </member>
        <member name="M:MyApi.Controllers.DepenseController.GetDepensesMinistereParAlineaAsync(System.String,System.String)">
             <summary>
             Retourne les dépenses par alinéa budgétaire pour un ministère donné.
             </summary>
             <param name="anneeFiscale">
             L'année fiscale au format "AAAA-AAAA" (ex: 2023-2024).
             </param>
             <param name="ministereId">
             L'identifiant du ministère sur 4 chiffres (ex: 1112).
             </param>
             <returns>
             Une liste regroupant les dépenses du ministère par alinéa budgétaire,
             avec les montants alloués, engagés et dépensés pour chaque alinéa.
             </returns>
             <remarks>
             Endpoint privé — requiert le rôle **GrandCommis**.
            
             L'alinéa est le niveau de détail le plus fin de la nomenclature budgétaire,
             en dessous de l'article et du paragraphe.
            
             Exemple de requête :
            
                 GET /api/depense/ministere/alinea/2023-2024/1112
            
             </remarks>
             <response code="200">Retourne les dépenses groupées par alinéa.</response>
             <response code="400">L'année fiscale ou le ministère est manquant.</response>
             <response code="401">Token d'authentification manquant ou invalide.</response>
             <response code="403">L'utilisateur n'a pas le rôle GrandCommis, ou le ministère demandé n'est pas le sien.</response>
             <response code="404">Aucune dépense trouvée pour ce ministère et cette année fiscale.</response>
        </member>
        <member name="M:MyApi.Controllers.DepenseController.GetDepensesMinistereParSectionAsync(System.String,System.String)">
             <summary>
             Retourne les dépenses par section et par article pour un ministère donné.
             </summary>
             <param name="anneeFiscale">
             L'année fiscale au format "AAAA-AAAA" (ex: 2023-2024).
             </param>
             <param name="ministereId">
             L'identifiant du ministère sur 4 chiffres (ex: 1112).
             </param>
             <returns>
             Une structure hiérarchique : ministère → sections → articles,
             avec les montants alloués, engagés et dépensés à chaque niveau.
             </returns>
             <remarks>
             Endpoint privé — requiert le rôle **GrandCommis**.
            
             Exemple de requête :
            
                 GET /api/depense/ministere/section/2023-2024/1112
            
             </remarks>
             <response code="200">Retourne les dépenses groupées par section et article.</response>
             <response code="400">L'année fiscale ou le ministère est manquant.</response>
             <response code="401">Token d'authentification manquant ou invalide.</response>
             <response code="403">L'utilisateur n'a pas le rôle GrandCommis, ou le ministère demandé n'est pas le sien.</response>
             <response code="404">Aucune dépense trouvée pour ce ministère et cette année fiscale.</response>
        </member>
        <member name="T:MyApi.Controllers.PerspectiveController">
            <summary>
            Analyse budgétaire en perspective — évolution sur plusieurs années fiscales.
            Certains endpoints sont publics, d'autres requièrent le rôle <b>GrandCommis</b>.
            </summary>
        </member>
        <member name="M:MyApi.Controllers.PerspectiveController.GetPerspectiveBudgetTotalParAnneeAsync">
             <summary>
             Retourne l'évolution globale du budget sur toutes les années fiscales disponibles.
             </summary>
             <returns>
             Un objet contenant le nombre d'années fiscales analysées et la liste
             de l'évolution annuelle du budget (alloué, engagé, dépensé) tous
             ministères confondus.
             </returns>
             <remarks>
             Endpoint public — aucune authentification requise.
            
             Exemple de requête :
            
                 GET /api/perspective/annee/global
            
             Exemple de réponse :
            
                 {
                   "nombreAnneeFiscale": 3,
                   "evolutionAnnuelle": [
                     {
                       "anneeFiscale": "2021-2022",
                       "nombreMinistere": 33,
                       "totalMontantAlloue": 140000000.00,
                       "totalMontantEngage": 130000000.00,
                       "totalMontantDepense": 125000000.00
                     }
                   ]
                 }
            
             </remarks>
             <response code="200">Retourne l'évolution globale du budget.</response>
             <response code="404">Aucune donnée budgétaire trouvée.</response>
        </member>
        <member name="M:MyApi.Controllers.PerspectiveController.GetPerspectiveBudgetTotalParArticleAsync(System.String)">
             <summary>
             Retourne l'évolution pluriannuelle du budget pour un article budgétaire donné.
             </summary>
             <param name="articleId">
             L'identifiant de l'article budgétaire (1 seul caractère, de "1" à "9").
             </param>
             <returns>
             Un objet contenant l'identifiant et la désignation de l'article,
             ainsi que la liste de son évolution annuelle (alloué, engagé, dépensé).
             </returns>
             <remarks>
             Endpoint public — aucune authentification requise.
            
             Les articles budgétaires valides sont :
             - "1" : Dépenses de personnel
             - "2" : Services et charges diverses
             - "3" : Achats de biens de consommation
             - "4" : Immobilisation corporelle
             - "5" : Immobilisation incorporelle
             - "6" : Prêts, avances et participations
             - "7" : Subventions et contributions
             - "8" : Amortissement de la dette
             - "9" : Autres dépenses publiques
            
             Exemple de requête :
            
                 GET /api/perspective/article/1
            
             </remarks>
             <response code="200">Retourne l'évolution de l'article budgétaire.</response>
             <response code="400">L'article est manquant ou invalide (doit être un seul caractère).</response>
             <response code="404">Aucune donnée trouvée pour cet article.</response>
        </member>
        <member name="M:MyApi.Controllers.PerspectiveController.GetPerspectiveBudgetAnneeAsync(System.String)">
             <summary>
             Retourne l'évolution pluriannuelle du budget pour un ministère donné.
             </summary>
             <param name="ministereId">
             L'identifiant du ministère sur 4 chiffres (ex: 1112).
             </param>
             <returns>
             Un objet contenant l'identifiant et la désignation du ministère,
             ainsi que la liste de son évolution annuelle (alloué, engagé, dépensé).
             </returns>
             <remarks>
             Endpoint privé — requiert le rôle **GrandCommis**.
            
             Exemple de requête :
            
                 GET /api/perspective/annee/1112
            
             </remarks>
             <response code="200">Retourne l'évolution annuelle du ministère.</response>
             <response code="400">Le ministère est manquant.</response>
             <response code="401">Token d'authentification manquant ou invalide.</response>
             <response code="403">L'utilisateur n'a pas le rôle GrandCommis.</response>
             <response code="404">Aucune donnée trouvée pour ce ministère.</response>
        </member>
        <member name="M:MyApi.Controllers.PerspectiveController.GetPerspectiveBudgetPeriodeAsync(System.String,System.Int32)">
             <summary>
             Retourne l'évolution du budget d'un ministère pour une période mensuelle donnée,
             sur toutes les années fiscales disponibles.
             </summary>
             <param name="ministereId">
             L'identifiant du ministère sur 4 chiffres (ex: 1112).
             </param>
             <param name="periode">
             La période mensuelle (valeur entière correspondant à l'enum PeriodeFiscale) :
             1=Octobre, 2=Novembre, 3=Décembre, 4=Janvier, 5=Février, 6=Mars,
             7=Avril, 8=Mai, 9=Juin, 10=Juillet, 11=Août, 12=Septembre, 13=Correction.
             </param>
             <returns>
             Un objet contenant l'identifiant et la désignation du ministère,
             ainsi que la liste des montants pour ce mois sur chaque année fiscale.
             </returns>
             <remarks>
             Endpoint privé — requiert le rôle **GrandCommis**.
            
             Exemple de requête :
            
                 GET /api/perspective/periode/1112/4
            
             (Retourne les données du mois de Janvier pour le MEF sur toutes les années)
            
             </remarks>
             <response code="200">Retourne l'évolution mensuelle du ministère.</response>
             <response code="400">Le ministère est manquant ou la période est invalide.</response>
             <response code="401">Token d'authentification manquant ou invalide.</response>
             <response code="403">L'utilisateur n'a pas le rôle GrandCommis.</response>
             <response code="404">Aucune donnée trouvée pour ce ministère et cette période.</response>
        </member>
        <member name="M:MyApi.Controllers.PerspectiveController.GetPerspectiveBudgetSectionAsync(System.String)">
             <summary>
             Retourne l'évolution pluriannuelle du budget pour une section administrative donnée.
             </summary>
             <param name="sectionId">
             L'identifiant de la section sur 7 caractères (ex: 1112001).
             </param>
             <returns>
             Un objet contenant l'identifiant et la désignation de la section,
             ainsi que la liste de son évolution annuelle (alloué, engagé, dépensé).
             </returns>
             <remarks>
             Endpoint privé — requiert le rôle **GrandCommis**.
            
             Exemple de requête :
            
                 GET /api/perspective/section/1112001
            
             </remarks>
             <response code="200">Retourne l'évolution annuelle de la section.</response>
             <response code="400">La section est manquante ou n'a pas 7 caractères.</response>
             <response code="401">Token d'authentification manquant ou invalide.</response>
             <response code="403">L'utilisateur n'a pas le rôle GrandCommis.</response>
             <response code="404">Aucune donnée trouvée pour cette section.</response>
        </member>
        <member name="T:MyApi.Controllers.ProjetController">
            <summary>
            Gestion des projets d'investissement public par département géographique.
            Tous les endpoints sont publics — aucune authentification requise.
            </summary>
        </member>
        <member name="M:MyApi.Controllers.ProjetController.GetProjetsParDepartementAsync(System.String,System.String)">
             <summary>
             Retourne la liste des projets d'investissement pour un département géographique donné.
             </summary>
             <param name="departementId">
             L'identifiant du département sur 2 chiffres (l'Id en base, <b>pas</b> le sigle ISO).
             Mapping Id → région :
             00 = National, 01 = Ouest, 02 = Sud-Est, 03 = Nord, 04 = Centre, 05 = Artibonite,
             06 = Sud, 07 = Nord-Est, 08 = Grande-Anse, 09 = Nord-Ouest, 10 = Nippes.
             </param>
             <param name="anneeFiscale">
             L'année fiscale au format "YYYY-YYYY" ou toute autre chaîne identifiant l'exercice (ex: "2024-2025").
             </param>
             <returns>
             Un objet contenant les informations du département (identifiant, sigle, désignation),
             le nombre total de projets, et la liste détaillée de chaque projet avec
             son programme, sa commune, ses coordonnées GPS et son financement.
             </returns>
             <remarks>
             Endpoint public — aucune authentification requise.
            
             Chaque projet retourné inclut :
             - Le programme auquel il appartient
             - La commune d'exécution
             - Les coordonnées GPS (latitude/longitude) si disponibles
             - Le financement (montant alloué, montant autorisé, bailleur)
            
             Exemple de requête :
            
                 GET /api/projet/departement/01/2024-2025
            
             Exemple de réponse :
            
                 {
                   "departementId": "01",
                   "departementSigle": "DDO",
                   "departementDesignation": "Ouest",
                   "nombreProjets": 70,
                   "projets": [
                     {
                       "projetId": "PRJ-001",
                       "projetDesignation": "Construction école nationale",
                       "anneeFiscale": "2024-2025",
                       "programme": { "id": "111200001", "designation": "Programme Éducation" },
                       "commune": { "id": "0101", "designation": "Port-au-Prince" },
                       "latitude": "18.5392",
                       "longitude": "-72.3288",
                       "financement": {
                         "montantAlloue": 5000000.00,
                         "montantAutorise": 4800000.00,
                         "bailleur": {
                           "id": "BM",
                           "designation": "Banque Mondiale",
                           "type": "International",
                           "typeFinancement": "Don"
                         }
                       }
                     }
                   ]
                 }
            
             </remarks>
             <response code="200">Retourne la liste des projets du département.</response>
             <response code="400">Le code département est manquant ou n'a pas 2 caractères.</response>
             <response code="404">Aucun projet trouvé pour ce département.</response>
        </member>
        <member name="T:MyApi.Controllers.ReferentielController">
            <summary>
            Gestion des données de référence (années fiscales, ministères).
            Tous les endpoints sont publics — aucune authentification requise.
            </summary>
        </member>
        <member name="M:MyApi.Controllers.ReferentielController.GetAnneesFiscalesAsync">
             <summary>
             Retourne la liste de toutes les années fiscales disponibles.
             </summary>
             <returns>
             Une liste d'années fiscales avec leur libellé et un indicateur
             précisant laquelle est l'année courante.
             </returns>
             <remarks>
             Endpoint public — aucune authentification requise.
            
             Exemple de requête :
            
                 GET /api/referentiel/annees-fiscales
            
             Exemple de réponse :
            
                 [
                   {
                     "anneeFiscale": "2023-2024",
                     "labelFiscale": "Exercice 2023-2024",
                     "isCurrent": true
                   }
                 ]
            
             </remarks>
             <response code="200">Retourne la liste des années fiscales.</response>
             <response code="404">Aucune année fiscale trouvée en base de données.</response>
        </member>
        <member name="M:MyApi.Controllers.ReferentielController.GetMinisteresAsync(System.String)">
             <summary>
             Retourne la liste des ministères actifs pour une année fiscale donnée.
             </summary>
             <param name="anneeFiscale">
             L'année fiscale au format "AAAA-AAAA" (ex: 2023-2024).
             </param>
             <returns>
             Une liste de ministères avec leur identifiant et leur désignation.
             </returns>
             <remarks>
             Endpoint public — aucune authentification requise.
            
             Exemple de requête :
            
                 GET /api/referentiel/ministeres/2023-2024
            
             Exemple de réponse :
            
                 [
                   {
                     "id": "1112",
                     "designation": "MINISTÈRE DE L'ÉCONOMIE ET DES FINANCES"
                   }
                 ]
            
             </remarks>
             <response code="200">Retourne la liste des ministères.</response>
             <response code="400">L'année fiscale est manquante ou invalide.</response>
             <response code="404">Aucun ministère trouvé pour cette année fiscale.</response>
        </member>
        <member name="M:MyApi.Controllers.ReferentielController.GetTotalMinistereParAnneeFiscaleAsync(System.String)">
             <summary>
             Retourne le nombre total de ministères pour une année fiscale donnée.
             </summary>
             <param name="anneeFiscale">
             L'année fiscale au format "AAAA-AAAA" (ex: 2023-2024).
             </param>
             <returns>
             Un objet contenant le nombre total de ministères actifs.
             </returns>
             <remarks>
             Endpoint public — aucune authentification requise.
            
             Exemple de requête :
            
                 GET /api/referentiel/nombres/ministere/2023-2024
            
             Exemple de réponse :
            
                 {
                   "totalMinistere": 33
                 }
            
             </remarks>
             <response code="200">Retourne le nombre total de ministères.</response>
             <response code="400">L'année fiscale est manquante ou invalide.</response>
             <response code="404">Aucun ministère trouvé pour cette année fiscale.</response>
        </member>
        <member name="M:MyApi.Controllers.ReferentielController.GetMinistereDesignationAsync(System.String)">
             <summary>
             Retourne la désignation d'un ministère à partir de son identifiant.
             </summary>
             <param name="ministereId">L'identifiant du ministère ex. "1311".</param>
             <returns>Un objet contenant la désignation du ministère.</returns>
             <remarks>
             Endpoint public — aucune authentification requise.
            
             Exemple de requête :
            
                 GET /api/referentiel/ministere/designation/1311
            
             Exemple de réponse :
            
                 {
                    "id": "1311",
                   "designation": "Ministère de l'Éducation"
                 }
            
             </remarks>
             <response code="200">Retourne la désignation du ministère.</response>
             <response code="400">L'identifiant du ministère est manquant ou invalide.</response>
             <response code="404">Aucun ministère trouvé avec cet identifiant.</response>
        </member>
        <member name="T:MyApi.Controllers.UserController">
            <summary>
            Gestion des utilisateurs : création, consultation et profil courant.
            </summary>
        </member>
        <member name="M:MyApi.Controllers.UserController.CreateUser(MyApi.Dtos.RegisterModel)">
            <summary>
            Crée un nouvel utilisateur selon les règles de délégation de rôles.
            </summary>
        </member>
        <member name="M:MyApi.Controllers.UserController.GetUsers">
             <summary>
             Liste les utilisateurs visibles par l'appelant (Admin ou RH).
             </summary>
             <remarks>
             - **Admin** : tous les utilisateurs, tous rôles et ministères confondus.
             - **RH** : uniquement les RH et Fonctionnaires de son propre ministère.
            
             Chaque élément retourné contient :
             - **id**, **userName** : identifiants de l'utilisateur
             - **nom**, **prenom**, **sexe**, **email**, **phoneNumber** : informations personnelles
             - **nif**, **ninu** : identifiants fiscaux/nationaux
             - **ministereId**, **sectionId** : rattachement organisationnel
             - **roles** : liste des rôles
             - **creationUser**, **creationDate** : auteur et date de création
             - **updateUser**, **updateDate** : auteur et date de dernière modification (null si jamais modifié)
            
             Exemple de réponse (200) — tableau d'utilisateurs :
            
                 [
                   {
                     "id": "6b66d73a-7bb6-40ee-b6bc-a9d40b8ca5ba",
                     "nom": "Dupont",
                     "prenom": "Jean",
                     "sexe": "M",
                     "email": "jdupont@mef.gouv.ht",
                     "userName": "jdupont",
                     "ministereId": "1112",
                     "sectionId": "1112001",
                     "phoneNumber": "34567890",
                     "nif": "003-456-789-0",
                     "ninu": "1234567890",
                     "creationUser": "admin",
                     "creationDate": "2026-01-15T10:20:00Z",
                     "updateUser": "rh1112",
                     "updateDate": "2026-08-24T09:00:00Z",
                     "roles": ["Fonctionnaire"]
                   }
                 ]
            
             </remarks>
        </member>
        <member name="M:MyApi.Controllers.UserController.UpdateUser(System.String,MyApi.Dtos.UpdateUserModel)">
             <summary>
             Modifie partiellement un utilisateur (Admin ou RH). Les champs non fournis
             restent inchangés. Le rôle et les champs privilégiés (NIF, ministère, section)
             ne sont modifiables que par un Admin.
             </summary>
             <remarks>
             Sémantique PATCH : seuls les champs **fournis** (non null) sont appliqués ;
             les champs absents ou null restent inchangés.
            
             - **Champs personnels** (Admin et RH) : prenom, nom, sexe, email, phoneNumber, ninu
             - **Champs privilégiés** (Admin uniquement, sinon ignorés) : nif, ministerId, sectionId
             - **role** : soumis aux règles de délégation (Admin ne peut pas attribuer « Admin » ;
               RH ne peut attribuer que « Fonctionnaire »)
            
             Exemple de requête :
            
                 PUT /api/user/6b66d73a-7bb6-40ee-b6bc-a9d40b8ca5ba
                 Authorization: Bearer {token}
                 {
                   "prenom": "Jean-Marc",
                   "phoneNumber": "34567891",
                   "nif": "003-456-789-0"
                 }
            
             Exemple de réponse (200) — l'utilisateur à jour :
            
                 {
                   "id": "6b66d73a-7bb6-40ee-b6bc-a9d40b8ca5ba",
                   "nom": "Dupont",
                   "prenom": "Jean-Marc",
                   "sexe": "M",
                   "email": "jdupont@mef.gouv.ht",
                   "userName": "jdupont",
                   "ministereId": "1112",
                   "sectionId": "1112001",
                   "phoneNumber": "34567891",
                   "nif": "003-456-789-0",
                   "ninu": "1234567890",
                   "creationUser": "admin",
                   "creationDate": "2026-01-15T10:20:00Z",
                   "updateUser": "rh1112",
                   "updateDate": "2026-09-08T14:30:00Z",
                   "roles": ["Fonctionnaire"]
                 }
            
             </remarks>
             <response code="200">Retourne l'utilisateur mis à jour.</response>
             <response code="400">Validation échouée (format d'un champ invalide, rôle interdit…).</response>
             <response code="401">Token JWT manquant ou invalide.</response>
             <response code="403">Droits insuffisants (RH ciblant hors de son ministère, etc.).</response>
             <response code="404">Utilisateur introuvable.</response>
        </member>
        <member name="M:MyApi.Controllers.UserController.GetLoggedInUserInfo">
            <summary>
            Retourne les informations de profil de l'utilisateur authentifié.
            </summary>
        </member>
        <member name="M:MyApi.DataRepository.DepenseRepository.GetDepenseGlobalAnneeFiscaleAsync(System.String)">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.DataRepository.DepenseRepository.GetDepensesParMinistereAsync(System.String,System.String)">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.DataRepository.DepenseRepository.GetDepenseTotalParArticleAsync(System.String)">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.DataRepository.DepenseRepository.GetDepenseParPeriodeAllocationAsync(System.String)">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.DataRepository.DepenseRepository.GetDepensesMinistereParAlineaAsync(System.String,System.String)">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.DataRepository.DepenseRepository.GetDepensesMinistereParSectionAsync(System.String,System.String)">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.DataRepository.PerspectiveRepository.GetPerspectiveBudgetTotalParAnneeAsync">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.DataRepository.PerspectiveRepository.GetPerspectiveBudgetTotalParArticleAsync(System.String)">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.DataRepository.PerspectiveRepository.GetPerspectiveBudgetAnneeAsync(System.String)">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.DataRepository.PerspectiveRepository.GetPerspectiveBudgetPeriodeAsync(System.String,System.Int32)">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.DataRepository.PerspectiveRepository.GetPerspectiveBudgetSectionAsync(System.String)">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.DataRepository.ReferentielRepository.GetAnneesFiscalesAsync">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.DataRepository.ReferentielRepository.GetMinisteresAsync(System.String)">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.DataRepository.ReferentielRepository.GetTotalMinistereParAnneeFiscaleAsync(System.String)">
            <inheritdoc/>
        </member>
        <member name="T:MyApi.Dtos.ChangePasswordDto">
            <summary>
            Modèle pour le changement de mot de passe d'un utilisateur authentifié.
            </summary>
        </member>
        <member name="P:MyApi.Dtos.ChangePasswordDto.CurrentPassword">
            <summary>Mot de passe actuel de l'utilisateur.</summary>
        </member>
        <member name="P:MyApi.Dtos.ChangePasswordDto.NewPassword">
            <summary>Nouveau mot de passe souhaité.</summary>
        </member>
        <member name="P:MyApi.Dtos.ChangePasswordDto.ConfirmPassword">
            <summary>Confirmation du nouveau mot de passe — doit être identique à NewPassword.</summary>
        </member>
        <member name="T:MyApi.Dtos.CreatedUserDto">
            <summary>
            Informations retournées après la création réussie d'un utilisateur.
            </summary>
        </member>
        <member name="T:MyApi.Dtos.ForgotPasswordDto">
            <summary>Demande de réinitialisation : l'email du compte.</summary>
        </member>
        <member name="T:MyApi.Dtos.ResetPasswordDto">
            <summary>Réinitialisation via le code à 6 chiffres reçu par email.</summary>
        </member>
        <member name="T:MyApi.Dtos.UpdateUserModel">
            <summary>
            Modification partielle d'un utilisateur (sémantique PATCH).
            Tout champ laissé à <c>null</c> n'est pas modifié ; seuls les champs fournis
            sont appliqués. Le mot de passe n'est pas géré ici (voir /api/auth/change-password).
            </summary>
        </member>
        <member name="T:MyApi.Dtos.UserListItemDto">
            <summary>
            Représentation d'un utilisateur dans les listes administratives
            (endpoint <c>GET /api/user</c>).
            </summary>
        </member>
        <member name="M:MyApi.Helpers.AnneeFiscaleHelper.GetAnneeFiscaleEnCours">
            <summary>
            Retourne l'année fiscale en cours au format "YYYY-YYYY"
            Exemple : "2024-2025" si nous sommes en octobre 2024
            </summary>
        </member>
        <member name="T:MyApi.Helpers.CsvSeed">
            <summary>
            Lecture résiliente de fichiers CSV pour l'amorçage des données (seed).
            Principe : un fichier manquant, illisible ou une ligne invalide
            <b>n'interrompt jamais le démarrage</b> — l'incident est journalisé et
            le traitement continue avec les lignes valides.
            </summary>
        </member>
        <member name="M:MyApi.Helpers.CsvSeed.Read``1(System.String,System.Func{System.String[],``0},Microsoft.Extensions.Logging.ILogger)">
            <summary>
            Lit un CSV (chemin relatif au dossier de l'exécutable), ignore la ligne
            d'en-tête, puis mappe chaque ligne via <paramref name="map"/>.
            Les lignes vides ou invalides sont ignorées et journalisées.
            </summary>
            <typeparam name="T">Type d'entité produit par ligne.</typeparam>
            <param name="relativePath">Chemin relatif, ex. "Data/Seed/ministeres.csv".</param>
            <param name="map">Fonction de mapping colonnes -> entité.</param>
            <param name="logger">Journal pour tracer fichier manquant / lignes ignorées.</param>
        </member>
        <member name="M:MyApi.Helpers.CsvSeed.ParseLine(System.String)">
            <summary>
            Découpe une ligne CSV en champs, en gérant les champs entre guillemets
            (qui peuvent contenir des virgules) et les guillemets échappés ("").
            </summary>
        </member>
        <member name="T:MyApi.IDataRepository.IDepenseRepository">
            <summary>
            Contrat pour l'accès aux données de dépenses budgétaires.
            Regroupe les méthodes publiques et privées liées aux dépenses.
            </summary>
        </member>
        <member name="M:MyApi.IDataRepository.IDepenseRepository.GetDepenseGlobalAnneeFiscaleAsync(System.String)">
            <summary>
            Retourne le total global des dépenses pour une année fiscale.
            </summary>
        </member>
        <member name="M:MyApi.IDataRepository.IDepenseRepository.GetDepensesParMinistereAsync(System.String,System.String)">
            <summary>
            Retourne les dépenses par article budgétaire pour un ministère donné.
            </summary>
        </member>
        <member name="M:MyApi.IDataRepository.IDepenseRepository.GetDepenseTotalParArticleAsync(System.String)">
            <summary>
            Retourne le total des dépenses par article budgétaire pour une année fiscale,
            tous ministères confondus.
            </summary>
        </member>
        <member name="M:MyApi.IDataRepository.IDepenseRepository.GetDepenseParPeriodeAllocationAsync(System.String)">
            <summary>
            Retourne les dépenses mensuelles par période d'allocation pour une année fiscale.
            </summary>
        </member>
        <member name="M:MyApi.IDataRepository.IDepenseRepository.GetDepensesMinistereParAlineaAsync(System.String,System.String)">
            <summary>
            Retourne les dépenses par alinéa budgétaire pour un ministère donné.
            Accès restreint au rôle GrandCommis.
            </summary>
        </member>
        <member name="M:MyApi.IDataRepository.IDepenseRepository.GetDepensesMinistereParSectionAsync(System.String,System.String)">
            <summary>
            Retourne les dépenses par section et par article pour un ministère donné.
            Accès restreint au rôle GrandCommis.
            </summary>
        </member>
        <member name="T:MyApi.IDataRepository.IPerspectiveRepository">
            <summary>
            Contrat pour l'accès aux données d'analyse budgétaire en perspective —
            évolution pluriannuelle du budget.
            Regroupe les méthodes publiques et privées liées aux perspectives.
            </summary>
        </member>
        <member name="M:MyApi.IDataRepository.IPerspectiveRepository.GetPerspectiveBudgetTotalParAnneeAsync">
            <summary>
            Retourne l'évolution globale du budget sur toutes les années fiscales,
            tous ministères confondus.
            </summary>
        </member>
        <member name="M:MyApi.IDataRepository.IPerspectiveRepository.GetPerspectiveBudgetTotalParArticleAsync(System.String)">
            <summary>
            Retourne l'évolution pluriannuelle du budget pour un article budgétaire donné.
            </summary>
        </member>
        <member name="M:MyApi.IDataRepository.IPerspectiveRepository.GetPerspectiveBudgetAnneeAsync(System.String)">
            <summary>
            Retourne l'évolution pluriannuelle du budget pour un ministère donné.
            Accès restreint au rôle GrandCommis.
            </summary>
        </member>
        <member name="M:MyApi.IDataRepository.IPerspectiveRepository.GetPerspectiveBudgetPeriodeAsync(System.String,System.Int32)">
            <summary>
            Retourne l'évolution du budget d'un ministère pour une période mensuelle donnée,
            sur toutes les années fiscales disponibles.
            Accès restreint au rôle GrandCommis.
            </summary>
        </member>
        <member name="M:MyApi.IDataRepository.IPerspectiveRepository.GetPerspectiveBudgetSectionAsync(System.String)">
            <summary>
            Retourne l'évolution pluriannuelle du budget pour une section administrative donnée.
            Accès restreint au rôle GrandCommis.
            </summary>
        </member>
        <member name="T:MyApi.IDataRepository.IProjetRepository">
            <summary>
            Contrat pour l'accès aux données des projets d'investissement public.
            </summary>
        </member>
        <member name="M:MyApi.IDataRepository.IProjetRepository.GetProjetsParDepartementAsync(System.String,System.String)">
            <summary>
            Retourne la liste des projets d'investissement pour un département géographique donné,
            avec les détails de financement et les coordonnées GPS de chaque projet.
            </summary>
        </member>
        <member name="T:MyApi.IDataRepository.IReferentielRepository">
            <summary>
            Contrat pour l'accès aux données de référence :
            années fiscales, ministères et leurs totaux.
            </summary>
        </member>
        <member name="M:MyApi.IDataRepository.IReferentielRepository.GetAnneesFiscalesAsync">
            <summary>
            Retourne la liste de toutes les années fiscales disponibles.
            </summary>
        </member>
        <member name="M:MyApi.IDataRepository.IReferentielRepository.GetMinisteresAsync(System.String)">
            <summary>
            Retourne la liste des ministères actifs pour une année fiscale donnée.
            </summary>
        </member>
        <member name="M:MyApi.IDataRepository.IReferentielRepository.GetTotalMinistereParAnneeFiscaleAsync(System.String)">
            <summary>
            Retourne le nombre total de ministères pour une année fiscale donnée.
            </summary>
        </member>
        <member name="T:MyApi.IService.IDeclarationDefinitiveImpotService">
            <summary>
            Logique métier des déclarations définitives d'impôt.
            Applique la règle d'accès (chacun ne consulte que sa propre déclaration)
            puis délègue la lecture au repository.
            </summary>
        </member>
        <member name="M:MyApi.IService.IDeclarationDefinitiveImpotService.GetDeclarationAsync(System.Security.Claims.ClaimsPrincipal,System.String,System.String)">
            <summary>
            Retourne la déclaration définitive d'impôt du contribuable identifié par
            <paramref name="nif"/> pour l'année fiscale donnée, à condition que le NIF
            corresponde à celui de l'utilisateur authentifié.
            </summary>
        </member>
        <member name="T:MyApi.IService.IDepenseService">
            <summary>
            Logique métier des dépenses budgétaires.
            Valide les entrées, applique la règle d'accès des endpoints privés
            (un GrandCommis ne consulte que son propre ministère), puis délègue
            la lecture au repository.
            </summary>
        </member>
        <member name="T:MyApi.IService.IEmailSender">
            <summary>
            Envoi d'emails transactionnels (réinitialisation de mot de passe, etc.).
            </summary>
        </member>
        <member name="M:MyApi.IService.IEmailSender.SendAsync(System.String,System.String,System.String)">
            <summary>Envoie un email HTML à un destinataire.</summary>
        </member>
        <member name="T:MyApi.IService.IPerspectiveService">
            <summary>
            Logique métier de l'analyse budgétaire en perspective (évolution pluriannuelle).
            Valide les paramètres d'entrée puis délègue la lecture au repository.
            </summary>
        </member>
        <member name="M:MyApi.IService.IPerspectiveService.GetBudgetTotalParAnneeAsync">
            <summary>Évolution globale du budget sur toutes les années fiscales.</summary>
        </member>
        <member name="M:MyApi.IService.IPerspectiveService.GetBudgetTotalParArticleAsync(System.String)">
            <summary>Évolution pluriannuelle du budget pour un article budgétaire.</summary>
        </member>
        <member name="M:MyApi.IService.IPerspectiveService.GetBudgetAnneeAsync(System.String)">
            <summary>Évolution pluriannuelle du budget pour un ministère (GrandCommis).</summary>
        </member>
        <member name="M:MyApi.IService.IPerspectiveService.GetBudgetPeriodeAsync(System.String,System.Int32)">
            <summary>Évolution mensuelle du budget d'un ministère pour une période (GrandCommis).</summary>
        </member>
        <member name="M:MyApi.IService.IPerspectiveService.GetBudgetSectionAsync(System.String)">
            <summary>Évolution pluriannuelle du budget pour une section administrative (GrandCommis).</summary>
        </member>
        <member name="T:MyApi.IService.IProjetService">
            <summary>
            Logique métier des projets d'investissement public.
            Valide les paramètres d'entrée puis délègue la lecture au repository.
            </summary>
        </member>
        <member name="M:MyApi.IService.IProjetService.GetProjetsParDepartementAsync(System.String,System.String)">
            <summary>
            Retourne les projets d'investissement d'un département pour une année fiscale,
            après validation du code département et de l'année.
            </summary>
        </member>
        <member name="T:MyApi.IService.IUserService">
            <summary>
            Logique métier liée aux utilisateurs : création avec règles de rôles,
            consultation filtrée et informations de l'utilisateur connecté.
            Le controller se contente d'appeler ces méthodes et de traduire le
            <see cref="T:MyApi.Shared.ServiceResult`1"/> en réponse HTTP.
            </summary>
        </member>
        <member name="M:MyApi.IService.IUserService.CreateUserAsync(System.Security.Claims.ClaimsPrincipal,MyApi.Dtos.RegisterModel)">
            <summary>
            Crée un utilisateur en appliquant les règles de délégation :
            un Admin ne peut pas créer d'Admin ; un RH ne peut créer que des
            Fonctionnaires de son propre ministère.
            </summary>
            <param name="currentUser">Le principal de l'utilisateur authentifié qui effectue la création.</param>
            <param name="model">Les données du nouvel utilisateur.</param>
        </member>
        <member name="M:MyApi.IService.IUserService.GetUsersAsync(System.Security.Claims.ClaimsPrincipal)">
            <summary>
            Retourne les utilisateurs visibles par l'appelant :
            tous pour un Admin, uniquement RH/Fonctionnaires de son ministère pour un RH.
            </summary>
        </member>
        <member name="M:MyApi.IService.IUserService.GetLoggedInUserInfoAsync(System.Security.Claims.ClaimsPrincipal)">
            <summary>
            Retourne les informations de profil de l'utilisateur authentifié.
            </summary>
        </member>
        <member name="M:MyApi.IService.IUserService.UpdateUserAsync(System.Security.Claims.ClaimsPrincipal,System.String,MyApi.Dtos.UpdateUserModel)">
            <summary>
            Modifie partiellement un utilisateur (sémantique PATCH : seuls les champs fournis
            sont appliqués). Applique les mêmes règles de délégation que la création :
            un Admin modifie tout le monde (y compris les champs privilégiés NIF/Ministère/Section
            et le rôle) ; un RH ne modifie que les Fonctionnaires de son ministère, et uniquement
            les champs personnels.
            </summary>
            <param name="currentUser">Le principal de l'utilisateur authentifié qui effectue la modification.</param>
            <param name="userId">L'identifiant de l'utilisateur à modifier.</param>
            <param name="model">Les champs à mettre à jour (les valeurs null sont ignorées).</param>
        </member>
        <member name="T:MyApi.Migrations.AddTableProjetExercice">
            <inheritdoc />
        </member>
        <member name="M:MyApi.Migrations.AddTableProjetExercice.Up(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder)">
            <inheritdoc />
        </member>
        <member name="M:MyApi.Migrations.AddTableProjetExercice.Down(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder)">
            <inheritdoc />
        </member>
        <member name="M:MyApi.Migrations.AddTableProjetExercice.BuildTargetModel(Microsoft.EntityFrameworkCore.ModelBuilder)">
            <inheritdoc />
        </member>
        <member name="T:MyApi.Migrations.AddDeclaratrionDefinitiveImpotTable">
            <inheritdoc />
        </member>
        <member name="M:MyApi.Migrations.AddDeclaratrionDefinitiveImpotTable.Up(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder)">
            <inheritdoc />
        </member>
        <member name="M:MyApi.Migrations.AddDeclaratrionDefinitiveImpotTable.Down(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder)">
            <inheritdoc />
        </member>
        <member name="M:MyApi.Migrations.AddDeclaratrionDefinitiveImpotTable.BuildTargetModel(Microsoft.EntityFrameworkCore.ModelBuilder)">
            <inheritdoc />
        </member>
        <member name="T:MyApi.Migrations.DeleteDeclaratrionDefinitiveImpotTableIndexNIfAnneeFiscale">
            <inheritdoc />
        </member>
        <member name="M:MyApi.Migrations.DeleteDeclaratrionDefinitiveImpotTableIndexNIfAnneeFiscale.Up(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder)">
            <inheritdoc />
        </member>
        <member name="M:MyApi.Migrations.DeleteDeclaratrionDefinitiveImpotTableIndexNIfAnneeFiscale.Down(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder)">
            <inheritdoc />
        </member>
        <member name="M:MyApi.Migrations.DeleteDeclaratrionDefinitiveImpotTableIndexNIfAnneeFiscale.BuildTargetModel(Microsoft.EntityFrameworkCore.ModelBuilder)">
            <inheritdoc />
        </member>
        <member name="T:MyApi.Service.DeclarationDefinitiveImpotService">
            <inheritdoc cref="T:MyApi.IService.IDeclarationDefinitiveImpotService"/>
        </member>
        <member name="M:MyApi.Service.DeclarationDefinitiveImpotService.GetDeclarationAsync(System.Security.Claims.ClaimsPrincipal,System.String,System.String)">
            <inheritdoc/>
        </member>
        <member name="T:MyApi.Service.DepenseService">
            <inheritdoc cref="T:MyApi.IService.IDepenseService"/>
        </member>
        <member name="M:MyApi.Service.DepenseService.GetGlobalAnneeFiscaleAsync(System.String)">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.Service.DepenseService.GetParMinistereAsync(System.String,System.String)">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.Service.DepenseService.GetTotalParArticleAsync(System.String)">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.Service.DepenseService.GetParPeriodeAllocationAsync(System.String)">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.Service.DepenseService.GetMinistereParAlineaAsync(System.Security.Claims.ClaimsPrincipal,System.String,System.String)">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.Service.DepenseService.GetMinistereParSectionAsync(System.Security.Claims.ClaimsPrincipal,System.String,System.String)">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.Service.DepenseService.EnsureOwnMinistere``1(System.Security.Claims.ClaimsPrincipal,System.String)">
            <summary>
            Vérifie que le <paramref name="ministereId"/> demandé correspond au ministère
            du jeton de l'appelant. Retourne un échec <c>Forbidden</c> si ce n'est pas le cas,
            ou <c>null</c> si l'accès est autorisé.
            </summary>
        </member>
        <member name="T:MyApi.Service.PerspectiveService">
            <inheritdoc cref="T:MyApi.IService.IPerspectiveService"/>
        </member>
        <member name="M:MyApi.Service.PerspectiveService.GetBudgetTotalParAnneeAsync">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.Service.PerspectiveService.GetBudgetTotalParArticleAsync(System.String)">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.Service.PerspectiveService.GetBudgetAnneeAsync(System.String)">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.Service.PerspectiveService.GetBudgetPeriodeAsync(System.String,System.Int32)">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.Service.PerspectiveService.GetBudgetSectionAsync(System.String)">
            <inheritdoc/>
        </member>
        <member name="T:MyApi.Service.ProjetService">
            <inheritdoc cref="T:MyApi.IService.IProjetService"/>
        </member>
        <member name="M:MyApi.Service.ProjetService.GetProjetsParDepartementAsync(System.String,System.String)">
            <inheritdoc/>
        </member>
        <member name="T:MyApi.Service.SmtpEmailSender">
            <inheritdoc cref="T:MyApi.IService.IEmailSender"/>
            <remarks>
            Implémentation via MailKit (client SMTP moderne). Compatible Gmail sur le port 587
            avec STARTTLS. Remplace System.Net.Mail.SmtpClient, dont la validation TLS pose
            problème avec Gmail (RemoteCertificateNameMismatch).
            </remarks>
        </member>
        <member name="T:MyApi.Service.UserService">
            <inheritdoc cref="T:MyApi.IService.IUserService"/>
        </member>
        <member name="M:MyApi.Service.UserService.CreateUserAsync(System.Security.Claims.ClaimsPrincipal,MyApi.Dtos.RegisterModel)">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.Service.UserService.GetUsersAsync(System.Security.Claims.ClaimsPrincipal)">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.Service.UserService.GetLoggedInUserInfoAsync(System.Security.Claims.ClaimsPrincipal)">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.Service.UserService.UpdateUserAsync(System.Security.Claims.ClaimsPrincipal,System.String,MyApi.Dtos.UpdateUserModel)">
            <inheritdoc/>
        </member>
        <member name="M:MyApi.Service.UserService.GenerateTempPassword">
            <summary>Génère un mot de passe temporaire fort conforme à la politique.</summary>
        </member>
        <member name="T:MyApi.Shared.ServiceErrorType">
            <summary>
            Catégorie d'erreur métier retournée par la couche Service.
            Volontairement découplée du HTTP : c'est le controller qui traduit
            chaque catégorie en code de statut (400, 401, 403, ...).
            </summary>
        </member>
        <member name="T:MyApi.Shared.ServiceResult`1">
            <summary>
            Résultat d'une opération de service : soit une valeur en cas de succès,
            soit une catégorie d'erreur accompagnée de messages.
            Permet aux services de rester ignorants du pipeline HTTP tout en
            communiquant clairement l'issue au controller.
            </summary>
        </member>
        <member name="T:MyApi.Shared.ServiceResultControllerExtensions">
            <summary>
            Traduit l'issue d'un <see cref="T:MyApi.Shared.ServiceResult`1"/> en réponse HTTP.
            Centralise le mapping catégorie d'erreur métier → code de statut,
            pour éviter de le dupliquer dans chaque controller.
            </summary>
        </member>
        <member name="T:MyApi.Shared.SmtpSettings">
            <summary>
            Paramètres SMTP liés à la section "Smtp" de la configuration.
            Les valeurs non sensibles (Host, Port, From…) sont dans appsettings.json ;
            User et Password sont des secrets (User Secrets en dev, variables
            d'environnement Smtp__User / Smtp__Password en prod).
            </summary>
        </member>
    </members>
</doc>
