"""Seat-limit helpers for tier-based team size enforcement."""
from __future__ import annotations
from app.models import Company, UserCompany
# Tier → maximum allowed team members (seats)
TIER_SEAT_LIMITS: dict[str, int] = {
'launch': 5,
'growth': 25,
'command': 100,
'starter': 2,
}
def get_company_seat_usage(company_id: str | int) -> dict:
"""Return seat usage info for a company.
Returns
-------
{
'used': int, # current member count
'limit': int, # max seats for current tier
'tier': str, # current tier slug
'company_name': str,
}
"""
company = Company.query.get(company_id)
if not company:
return {'used': 0, 'limit': 2, 'tier': 'starter', 'company_name': 'Unknown'}
tier = (company.settings_json or {}).get('tier', 'starter')
limit = TIER_SEAT_LIMITS.get(tier, 2) # default to 2 for unknown tiers
used = UserCompany.query.filter_by(company_id=company_id).count()
return {
'used': used,
'limit': limit,
'tier': tier,
'company_name': company.name,
}
def check_seat_limit(company_id: str | int) -> tuple:
"""Check whether a company can add another seat.
Returns
-------
(error_response, seat_info) tuple.
If within limit, error_response is None.
If over, returns (jsonify(...), 400), None.
"""
from flask import jsonify
usage = get_company_seat_usage(company_id)
if usage['used'] >= usage['limit']:
return (jsonify({
'error': f'Company has reached its seat limit of {usage["limit"]}. Upgrade to add more seats.',
'errorCode': 'SEAT_LIMIT_EXCEEDED',
'seatUsage': usage,
}), 400), None
return None, usage