using System; namespace FrenchExDev.Net.State.Economy.Dsl; /// /// Triptyque budgétaire LOLF (FR) / OMB A-11 (US). La hiérarchie générique /// IMission → IProgram<TMission> → IAction<TProgram> est calquée /// sur le pattern Feature<TParent> de FrenchExDev.Net.Requirements : /// la parenté est portée par un paramètre de type, donc vérifiable à la /// compilation par simple substitution générique plutôt que par une chaîne /// de caractères dans un dictionnaire. /// public interface IMission { string Designation { get; } } /// Programme LOLF rattaché à une mission parente typée. public interface IProgram where TMission : IMission { string Designation { get; } int ProgramNumber { get; } } /// Action LOLF rattachée à un programme parent typé. public interface IAction { string Designation { get; } } /// /// Marque une propriété ou un champ comme dépense budgétaire imputable. /// L'analyzer ECO002 vérifie que chaque [Expenditure] est portée par /// une classe implémentant IAction<TProgram> — une dépense orpheline /// échoue la compilation. /// [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false, Inherited = false)] public sealed class ExpenditureAttribute : Attribute { /// Titre LOLF (1 à 7) ou équivalent OMB pour la classification économique. public int Titre { get; } public ExpenditureAttribute(int titre) { if (titre < 1 || titre > 7) throw new ArgumentOutOfRangeException(nameof(titre), "Titre LOLF attendu entre 1 et 7."); Titre = titre; } } /// /// Atteste qu'une loi de règlement (FR) ou un acte de clôture budgétaire /// (US) a été soumis à l'avis de la Cour des comptes. Sans cet attribut (ou /// l'équivalent US ), l'analyzer ECO004 émet /// un diagnostic warning. /// [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] public sealed class CourDesComptesOpinionAttribute : Attribute { public string ReportReference { get; } public string IssueDate { get; } public CourDesComptesOpinionAttribute(string reportReference, string issueDate) { ReportReference = reportReference ?? throw new ArgumentNullException(nameof(reportReference)); IssueDate = issueDate ?? throw new ArgumentNullException(nameof(issueDate)); } } /// Pendant US : audit de la Government Accountability Office. [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] public sealed class GaoAuditAttribute : Attribute { public string ReportReference { get; } public string IssueDate { get; } public GaoAuditAttribute(string reportReference, string issueDate) { ReportReference = reportReference ?? throw new ArgumentNullException(nameof(reportReference)); IssueDate = issueDate ?? throw new ArgumentNullException(nameof(issueDate)); } } /// /// Marque une classe comme loi de règlement (FR) / financial closure act (US). /// L'analyzer ECO004 exige ensuite la présence d'un attribut d'audit /// ( ou ). /// [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] public sealed class ClosureActAttribute : Attribute { public int FiscalYear { get; } public ClosureActAttribute(int fiscalYear) { FiscalYear = fiscalYear; } } /// /// Marque une propriété ou un champ comme observation d'opération SEC 2010 /// sur un secteur institutionnel donné. L'analyzer ECO003 lit /// et et rejette les couples /// incompatibles (ex : B1g × S14). /// [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false, Inherited = false)] public sealed class SectorOperationAttribute : Attribute { public Type Sector { get; } public Type Operation { get; } public SectorOperationAttribute(Type sector, Type operation) { Sector = sector ?? throw new ArgumentNullException(nameof(sector)); Operation = operation ?? throw new ArgumentNullException(nameof(operation)); } }