Files
BarevClub/packages/core/src/promo.ts
T
2026-10-17 19:45:51 +04:00

27 lines
1.1 KiB
TypeScript

export interface PromoLike {
kind: 'AGENCY_GIFT' | 'DISCOUNT';
active: boolean;
maxUses: number | null;
usedCount: number;
validFrom: Date | null;
validUntil: Date | null;
}
export type PromoCheck =
| { ok: true }
| { ok: false; reason: 'INACTIVE' | 'NOT_STARTED' | 'EXPIRED' | 'EXHAUSTED' | 'ALREADY_USED_BY_CLIENT' };
export function checkPromo(promo: PromoLike, now: Date, usedByClient: boolean): PromoCheck {
if (!promo.active) return { ok: false, reason: 'INACTIVE' };
if (promo.validFrom && now < promo.validFrom) return { ok: false, reason: 'NOT_STARTED' };
if (promo.validUntil && now > promo.validUntil) return { ok: false, reason: 'EXPIRED' };
if (promo.maxUses !== null && promo.usedCount >= promo.maxUses) return { ok: false, reason: 'EXHAUSTED' };
if (usedByClient) return { ok: false, reason: 'ALREADY_USED_BY_CLIENT' };
return { ok: true };
}
/** Промокод-скидка не суммируется с Barev+: берётся большая из двух */
export function combineDiscounts(barevPlusPct: number, promoPct: number | null): number {
return Math.max(barevPlusPct, promoPct ?? 0);
}