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));
}
}