fix(subscriptions): un compte ADMIN dispose de l offre Platinium

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018BAUeCFpDkRD6tU5wGsc1C
This commit is contained in:
David 2026-09-07 21:40:51 +02:00
parent 14558d8747
commit 86564f1041
2 changed files with 36 additions and 3 deletions

View File

@ -22,6 +22,10 @@ import { Subscription } from '@domain/entities/subscription.entity';
import { License } from '@domain/entities/license.entity'; import { License } from '@domain/entities/license.entity';
import { SubscriptionPlan, SubscriptionPlanType } from '@domain/value-objects/subscription-plan.vo'; import { SubscriptionPlan, SubscriptionPlanType } from '@domain/value-objects/subscription-plan.vo';
import { SubscriptionStatus } from '@domain/value-objects/subscription-status.vo'; import { SubscriptionStatus } from '@domain/value-objects/subscription-status.vo';
import {
PLATFORM_ADMIN_ROLE,
effectivePlan as resolveEffectivePlan,
} from '@domain/services/subscription-access';
import { import {
NoLicensesAvailableException, NoLicensesAvailableException,
LicenseAlreadyAssignedException, LicenseAlreadyAssignedException,
@ -83,9 +87,10 @@ export class SubscriptionService {
subscription.id subscription.id
); );
// ADMIN users always have PLATINIUM plan with no expiration // ADMIN users always have PLATINIUM plan with no expiration.
const isAdmin = userRole === 'ADMIN'; // La regle vit dans le domaine : l'assistant la lit au meme endroit.
const effectivePlan = isAdmin ? SubscriptionPlan.platinium() : subscription.plan; const isAdmin = userRole === PLATFORM_ADMIN_ROLE;
const effectivePlan = resolveEffectivePlan(userRole, subscription.plan);
const maxLicenses = effectivePlan.maxLicenses; const maxLicenses = effectivePlan.maxLicenses;
const availableLicenses = effectivePlan.isUnlimited() const availableLicenses = effectivePlan.isUnlimited()
? -1 ? -1

View File

@ -0,0 +1,28 @@
import { SubscriptionPlan } from '../value-objects/subscription-plan.vo';
export const PLATFORM_ADMIN_ROLE = 'ADMIN';
/**
* Offre effective d'un utilisateur.
*
* Un compte ADMIN dispose de l'offre Platinium quelle que soit celle de son
* organisation : c'est deja ce que renvoie l'apercu d'abonnement, donc ce que
* lit toute l'interface (badge d'offre, licences illimitees, absence
* d'echeance).
*
* Cette regle vivait uniquement dans `SubscriptionService`. L'assistant, qui
* lisait l'abonnement brut, appliquait donc le quota Bronze de l'organisation a
* un administrateur a qui le produit affichait « Platinium » partout ailleurs.
* La regle est ici pour qu'un seul endroit la porte et que les deux lectures ne
* puissent plus diverger.
*
* @param role Role de l'utilisateur, tel qu'il figure dans le JWT.
* @param plan Offre de l'organisation, ou `null` sans abonnement exploitable.
*/
export function effectivePlan(
role: string | undefined,
plan: SubscriptionPlan | null
): SubscriptionPlan {
if (role === PLATFORM_ADMIN_ROLE) return SubscriptionPlan.platinium();
return plan ?? SubscriptionPlan.bronze();
}