using System;
namespace FrenchExDev.Net.State.Economy.Dsl;
///
/// Secteur institutionnel au sens SEC 2010 / SCN 2008.
/// Implémenté comme phantom type : la classification d'une unité
/// institutionnelle devient une contrainte générique compile-time,
/// pas un champ string susceptible d'incohérence.
///
public interface IInstitutionalSector
{
/// Code SEC 2010 (ex : "S13", "S1311").
string Code { get; }
}
/// Économie nationale totale (S1 = S11 + S12 + S13 + S14 + S15).
public sealed class S1_NationalEconomy : IInstitutionalSector
{
public string Code => "S1";
public static readonly S1_NationalEconomy Instance = new();
private S1_NationalEconomy() { }
}
/// Sociétés non financières.
public sealed class S11_NonFinancialCorporations : IInstitutionalSector
{
public string Code => "S11";
public static readonly S11_NonFinancialCorporations Instance = new();
private S11_NonFinancialCorporations() { }
}
/// Sociétés financières.
public sealed class S12_FinancialCorporations : IInstitutionalSector
{
public string Code => "S12";
public static readonly S12_FinancialCorporations Instance = new();
private S12_FinancialCorporations() { }
}
///
/// Administrations publiques (APU). Regroupe S1311 (Central),
/// S1313 (Collectivités locales), S1314 (Sécurité sociale).
/// C'est le secteur pour lequel les critères Maastricht s'appliquent.
///
public sealed class S13_GeneralGovernment : IInstitutionalSector
{
public string Code => "S13";
public static readonly S13_GeneralGovernment Instance = new();
private S13_GeneralGovernment() { }
}
/// État central (APUC).
public sealed class S1311_CentralGovernment : IInstitutionalSector
{
public string Code => "S1311";
public static readonly S1311_CentralGovernment Instance = new();
private S1311_CentralGovernment() { }
}
/// Administrations publiques locales (APUL).
public sealed class S1313_LocalGovernment : IInstitutionalSector
{
public string Code => "S1313";
public static readonly S1313_LocalGovernment Instance = new();
private S1313_LocalGovernment() { }
}
/// Administrations de sécurité sociale (ASSO).
public sealed class S1314_SocialSecurityFunds : IInstitutionalSector
{
public string Code => "S1314";
public static readonly S1314_SocialSecurityFunds Instance = new();
private S1314_SocialSecurityFunds() { }
}
/// Ménages.
public sealed class S14_Households : IInstitutionalSector
{
public string Code => "S14";
public static readonly S14_Households Instance = new();
private S14_Households() { }
}
/// Institutions sans but lucratif au service des ménages (ISBLSM).
public sealed class S15_NPISH : IInstitutionalSector
{
public string Code => "S15";
public static readonly S15_NPISH Instance = new();
private S15_NPISH() { }
}
/// Reste du monde.
public sealed class S2_RestOfWorld : IInstitutionalSector
{
public string Code => "S2";
public static readonly S2_RestOfWorld Instance = new();
private S2_RestOfWorld() { }
}