{% extends 'base.html.twig' %} {% block title %}Contrats{% endblock %} {% block body %}
{# ================================================================ HEADER ================================================================ #}
{% include '_molecules/page-header/page-header.html.twig' with { title: 'Contrats', subtitle: isAdmin ? 'Consultez et gérez l\'ensemble des contrats de la plateforme.' : 'Consultez les contrats de votre entreprise.', icon: 'file-text', backHref: path('app_dashboard'), backLabel: 'Retour au dashboard' } only %} {% if isAdmin %}
{% include '_atoms/button/button.html.twig' with { label: 'Nouveau contrat', variant: 'primary', size: 'lg', icon: 'plus', attr: { onclick: "document.getElementById('modal-new-contract').classList.add('active');", type: 'button' } } only %}
{% endif %}
{# ================================================================ STATISTIQUES ================================================================ #}
{% include '_molecules/stat-card/stat-card.html.twig' with { label: 'Total', value: stats.total, icon: 'file-text', variant: 'primary', size: 'sm', layout: 'horizontal' } only %} {% include '_molecules/stat-card/stat-card.html.twig' with { label: 'Actifs', value: stats.active, icon: 'check-circle', variant: 'success', size: 'sm', layout: 'horizontal' } only %} {% include '_molecules/stat-card/stat-card.html.twig' with { label: 'Expirent bientôt', value: stats.expiringSoon, icon: 'clock', variant: 'warning', size: 'sm', layout: 'horizontal' } only %} {% include '_molecules/stat-card/stat-card.html.twig' with { label: 'Expirés', value: stats.expired, icon: 'x', variant: 'error', size: 'sm', layout: 'horizontal' } only %}
{# ================================================================ TABLEAU DES CONTRATS ================================================================ #}
{# Header avec filtres #}

Liste des contrats ({{ pagination.totalItems }})

{# Filtres inline #}
{% if isAdmin %} {% endif %} {% if filters.company or filters.status %} {% include '_atoms/icon/icon.html.twig' with { name: 'x', size: 'sm' } only %} {% endif %}
{# Tableau #} {% if contracts|length > 0 %}
{% for contract in contracts %} {# Nom du contrat #} {# Entreprise #} {# Période #} {# Utilisateurs max #} {# Tarif #} {# Tokens mensuels #} {# SAM #} {# Statut #} {% endfor %}
Contrat Statut
{{ contract.name }} {% if not contract.isActive %} {% include '_atoms/badge/badge.html.twig' with { label: 'Désactivé', variant: 'neutral', size: 'sm' } only %} {% elseif contract.isExpired %} {% include '_atoms/badge/badge.html.twig' with { label: 'Expiré', variant: 'error', dot: true, size: 'sm' } only %} {% elseif contract.isUpcoming %} {% include '_atoms/badge/badge.html.twig' with { label: 'À venir', variant: 'info', dot: true, size: 'sm' } only %} {% elseif contract.isExpiringSoon(30) %} {% include '_atoms/badge/badge.html.twig' with { label: 'Expire bientôt', variant: 'warning', dot: true, size: 'sm' } only %} {% else %} {% include '_atoms/badge/badge.html.twig' with { label: 'Actif', variant: 'success', dot: true, size: 'sm' } only %} {% endif %}
{# Pagination #} {% if pagination.total > 1 %}
Page {{ pagination.current }} sur {{ pagination.total }} ({{ pagination.totalItems }} contrats) {% set paginationFilters = {} %} {% if filters.company %}{% set paginationFilters = paginationFilters|merge({company: filters.company}) %}{% endif %} {% if filters.status %}{% set paginationFilters = paginationFilters|merge({status: filters.status}) %}{% endif %} {% include '_molecules/pagination/pagination.html.twig' with { currentPage: pagination.current, totalPages: pagination.total, baseUrl: path('admin_contract_list', paginationFilters), size: 'sm', showInfo: false, showFirstLast: true } only %}
{% endif %} {% else %}
{% include '_molecules/empty-state/empty-state.html.twig' with { title: 'Aucun contrat trouvé', description: 'Aucun contrat ne correspond aux critères sélectionnés.', icon: 'file-text', variant: 'minimal', actions: (not filters.company and not filters.status) ? [{ label: 'Créer un contrat', onclick: "document.getElementById('modal-new-contract').classList.add('active');", variant: 'primary', icon: 'plus' }] : [] } only %}
{% endif %}
{% if isAdmin %} {# ================================================================ MODAL NOUVEAU CONTRAT (Admin uniquement) ================================================================ #} {% endif %} {% endblock %}