namespace ManagerService.Helpers { /// /// Seule source de vérité pour « quel quota de stockage s'applique à cette instance ». /// /// Les deux lectures divergeaient : le pré-vol du téléversement lisait le quota du /// **plan**, l'écran de quota lisait celui de l'**instance** avec le plan en repli. /// Une instance dont le quota a été surchargé — le mécanisme même de l'add-on — /// affichait donc un chiffre et se faisait bloquer sur un autre. /// public static class StorageQuota { /// /// La surcharge portée par l'instance l'emporte ; 0 veut dire « pas de surcharge » /// et renvoie au plan. ⚠️ Au niveau du plan, 0 garde son autre sens : illimité. /// L'asymétrie est volontaire et documentée au §1quinquies — ne pas l'harmoniser /// sans repasser dans CheckQuota, AiController et SectionIndexingInterceptor. /// public static long Resolve(long instanceQuotaBytes, long planQuotaBytes) => instanceQuotaBytes != 0 ? instanceQuotaBytes : planQuotaBytes; /// /// Un quota résolu à 0 est illimité : rien ne dépasse. C'est le cas d'Enterprise, /// et c'est aussi ce qui protège une instance sans plan d'être bloquée à zéro octet. /// public static bool Exceeds(long usedBytes, long incomingBytes, long quotaBytes) => quotaBytes > 0 && usedBytes + incomingBytes > quotaBytes; } }