templates/entreprise/detail_entreprise.html.twig line 1

  1. {% extends 'base.html.twig' %}
  2. {% block title %}Marchands{% endblock %}
  3. {% block bodyContent %}
  4.     <div class="content__header content__boxed rounded-0">
  5.         <div class="content__wrap">
  6.             {# ===== Header: breadcrumb + title + back btn ===== #}
  7.             <div class="d-md-flex align-items-start justify-content-between gap-3 mb-3">
  8.                 <div>
  9.                     <nav aria-label="breadcrumb">
  10.                         <ol class="breadcrumb mb-1">
  11.                             <li class="breadcrumb-item"><a href="{{ path('app_dashboard') }}">Tableau de bord</a></li>
  12.                             <li class="breadcrumb-item"><a href="{{ path('app_entreprise') }}">Liste des bailleurs</a></li>
  13.                             <li class="breadcrumb-item"><a href="{{ path('app_entreprise_detail', {code: entreprise.code}) }}">Détail bailleur</a></li>
  14.                         </ol>
  15.                     </nav>
  16.                     <h1 class="page-title h3 fw-bold mb-0">Détail sur le bailleur</h1>
  17.                 </div>
  18.                 <a href="{{ path('app_entreprise') }}" class="btn btn-outline-secondary btn-sm">
  19.                     <i class="mdi mdi-keyboard-return"></i> Retour à la liste
  20.                 </a>
  21.             </div>
  22.             {# ===== Flash messages (dismissible) ===== #}
  23.             {% for message in app.session.flashBag.get('info') %}
  24.                 <div class="alert alert-info alert-dismissible fade show" role="alert">
  25.                     {{ message }}
  26.                     <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Fermer"></button>
  27.                 </div>
  28.             {% endfor %}
  29.             {% for message in app.session.flashBag.get('warning') %}
  30.                 <div class="alert alert-warning alert-dismissible fade show" role="alert">
  31.                     {{ message }}
  32.                     <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Fermer"></button>
  33.                 </div>
  34.             {% endfor %}
  35.             {% for message in app.session.flashBag.get('success') %}
  36.                 <div class="alert alert-success alert-dismissible fade show" role="alert">
  37.                     {{ message }}
  38.                     <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Fermer"></button>
  39.                 </div>
  40.             {% endfor %}
  41.             {% for message in app.session.flashBag.get('error') %}
  42.                 <div class="alert alert-danger alert-dismissible fade show" role="alert">
  43.                     {{ message }}
  44.                     <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Fermer"></button>
  45.                 </div>
  46.             {% endfor %}
  47.         </div>
  48.     </div>
  49.     <div class="content__boxed">
  50.         <div class="content__wrap">
  51.             {# ===== Styles (scoped) ===== #}
  52.             <style>
  53.                 .profile-logo { width: 140px; height: 140px; object-fit: cover; }
  54.                 .info-icon { width: 40px; height: 40px; display: grid; place-items: center; border-radius: 10px; }
  55.                 .kv { margin-bottom: .5rem; }
  56.                 .thead-sticky th { position: sticky; top: 0; z-index: 2; background: var(--bs-body-bg); }
  57.             </style>
  58.             <div class="row justify-content-center mb-3">
  59.                 <div class="col-12 col-xl-10">
  60.                     <div class="card border-0 shadow-sm rounded-4">
  61.                         <div class="card-body p-4 p-lg-5 rounded-4">
  62.                             {# === Header row (name + package + status + logo) === #}
  63.                             <div class="row g-4 align-items-start mb-2">
  64.                                 <div class="col-lg-8">
  65.                                     <div class="d-flex flex-wrap align-items-center gap-2">
  66.                                         <h2 class="h3 mb-0">
  67.                                             {{ entreprise.name }}
  68.                                             {% if entreprise.status %}
  69.                                                 <i class="mdi mdi-check text-success fs-5 ms-1" title="Actif"></i>
  70.                                             {% endif %}
  71.                                         </h2>
  72.                                         {% if entreprise.package != null %}
  73.                                             <span class="badge text-bg-success">{{ entreprise.package.name }}</span>
  74.                                         {% endif %}
  75.                                         {% if entreprise.status %}
  76.                                             <span class="badge text-bg-success">Active</span>
  77.                                         {% else %}
  78.                                             <span class="badge text-bg-danger">Désactivé</span>
  79.                                         {% endif %}
  80.                                     </div>
  81.                                     <p class="text-muted mt-2 mb-0">
  82.                                         Code bailleur : <span class="text-body fw-semibold">{{ entreprise.pseudo }}</span>
  83.                                     </p>
  84.                                 </div>
  85.                                 <div class="col-lg-4 text-lg-end">
  86.                                     {% if entreprise.icon == null %}
  87.                                         <img class="profile-logo rounded-circle border border-4"
  88.                                              src="{{ asset('assets/img/imageIcon.png') }}" alt="Logo entreprise" loading="lazy">
  89.                                     {% else %}
  90.                                         <img class="profile-logo rounded-circle border border-4"
  91.                                              src="{{  entreprise.icon }}" alt="Logo entreprise" loading="lazy">
  92.                                     {% endif %}
  93.                                 </div>
  94.                             </div>
  95.                             <hr class="my-4">
  96.                             {# === Info columns === #}
  97.                             <div class="row g-4">
  98.                                 {# Entreprise #}
  99.                                 <div class="col-lg-4">
  100.                                     <h3 class="h6 text-primary mb-3">ENTREPRISE</h3>
  101.                                     <div class="d-flex align-items-start kv">
  102.                                         <div class="info-icon bg-primary-subtle text-primary me-3">
  103.                                             <i class="mdi mdi-office-building-outline fs-5"></i>
  104.                                         </div>
  105.                                         <div>
  106.                                             <div class="fw-semibold">{{ entreprise.name }}</div>
  107.                                             <div class="text-muted">{{ entreprise.pseudo }}</div>
  108.                                         </div>
  109.                                     </div>
  110.                                     <div class="d-flex align-items-start kv">
  111.                                         <div class="info-icon bg-secondary-subtle text-secondary me-3">
  112.                                             <i class="mdi mdi-map-marker-star fs-5"></i>
  113.                                         </div>
  114.                                         <address class="mb-0">
  115.                                             {{ entreprise.adress }}<br>
  116.                                             {{ entreprise.city }}, {{ entreprise.province }}<br>
  117.                                             {{ entreprise.country.name }}
  118.                                         </address>
  119.                                     </div>
  120.                                     <div class="d-flex align-items-start kv">
  121.                                         <div class="info-icon bg-info-subtle text-info me-3">
  122.                                             <i class="mdi mdi-file-document fs-5"></i>
  123.                                         </div>
  124.                                         <div>
  125.                                             <div class="mb-1">RCCM : <span class="fw-semibold text-body">{{ entreprise.rccm }}</span></div>
  126.                                             <div class="mb-1">ID Nat. : <span class="fw-semibold text-body">{{ entreprise.idnat }}</span></div>
  127.                                             <div>N° impôt : <span class="fw-semibold text-body">{{ entreprise.numeroimpot }}</span></div>
  128.                                         </div>
  129.                                     </div>
  130.                                 </div>
  131.                                 {# Bailleur #}
  132.                                 <div class="col-lg-4">
  133.                                     <h3 class="h6 text-primary mb-3">BAILLEUR</h3>
  134.                                     <div class="d-flex align-items-start kv">
  135.                                         <div class="info-icon bg-success-subtle text-success me-3">
  136.                                             <i class="mdi mdi-human-male-female fs-5"></i>
  137.                                         </div>
  138.                                         <div>
  139.                                             <div class="fw-semibold">{{ bailleur.name }} {{ bailleur.lastname }}</div>
  140.                                             <div class="text-muted">{{ bailleur.email }}</div>
  141.                                         </div>
  142.                                     </div>
  143.                                     <div class="d-flex align-items-start kv">
  144.                                         <div class="info-icon bg-secondary-subtle text-secondary me-3">
  145.                                             <i class="mdi mdi-map-marker-star fs-5"></i>
  146.                                         </div>
  147.                                         <address class="mb-0">
  148.                                             {{ bailleur.adress }}<br>
  149.                                             {{ bailleur.city }}, {{ bailleur.province }}<br>
  150.                                             {{ bailleur.country.name }}
  151.                                         </address>
  152.                                     </div>
  153.                                     <div class="d-flex align-items-center kv">
  154.                                         <div class="info-icon bg-warning-subtle text-warning me-3">
  155.                                             <i class="mdi mdi-phone-check fs-5"></i>
  156.                                         </div>
  157.                                         <div class="fw-semibold text-body">{{ bailleur.phone }}</div>
  158.                                     </div>
  159.                                 </div>
  160.                                 {# Actions #}
  161.                                 <div class="col-lg-4">
  162.                                     <h3 class="h6 text-primary mb-3">ACTIONS</h3>
  163.                                     <div class="d-grid gap-2 gap-lg-3">
  164.                                         <a href="{{ path('app_entreprise_edit', {code: entreprise.code}) }}"
  165.                                            class="btn btn-primary hstack gap-2">
  166.                                             <i class="mdi mdi-pencil fs-5"></i><span class="vr"></span> Modifier les informations
  167.                                         </a>
  168.                                         {% if entreprise.status %}
  169.                                             <a href="{{ path('app_membership', {code: entreprise.code}) }}"
  170.                                                class="btn btn-success hstack gap-2">
  171.                                                 <i class="mdi mdi-medal fs-5"></i><span class="vr"></span> Modifier l’abonnement
  172.                                             </a>
  173.                                         {% else %}
  174.                                             <a href="{{ path('app_membership', {code: entreprise.code}) }}"
  175.                                                class="btn btn-success hstack gap-2">
  176.                                                 <i class="mdi mdi-medal-outline fs-5"></i><span class="vr"></span> Ajouter un abonnement
  177.                                             </a>
  178.                                         {% endif %}
  179.                                         {% if entreprise.status %}
  180.                                             <button class="btn btn-outline-danger hstack gap-2"
  181.                                                     onclick="unableAdmin('{{ entreprise.id }}')"
  182.                                                     data-bs-toggle="modal" data-bs-target="#modalCenter">
  183.                                                 <i class="mdi mdi-account-remove fs-5"></i><span class="vr"></span> Désactiver le compte
  184.                                             </button>
  185.                                         {% endif %}
  186.                                         <a href="{{ path('app_entreprise_edit_bailleur_password', {code: entreprise.code}) }}"
  187.                                            class="btn btn-outline-primary hstack gap-2">
  188.                                             <i class="mdi mdi-security fs-5"></i><span class="vr"></span> Réinitialiser mot de passe bailleur
  189.                                         </a>
  190.                                     </div>
  191.                                 </div>
  192.                             </div>
  193.                         </div>
  194.                     </div>
  195.                 </div>
  196.             </div>
  197.             {# ===== Subscription payments ===== #}
  198.             {% if subscriptionPayments|length > 0 %}
  199.                 <div class="row justify-content-center mt-4">
  200.                     <div class="col-xl-10">
  201.                         <div class="card border-0 shadow-sm rounded-4">
  202.                             <div class="card-body">
  203.                                 <h3 class="h5 fw-bold mb-1">Factures & paiements</h3>
  204.                                 <p class="text-muted small mb-3">Historique des paiements d’abonnement</p>
  205.                                 <div class="table-responsive mt-2">
  206.                                     <table class="table table-hover table-striped table-sm align-middle mb-0">
  207.                                         <thead class="thead-sticky">
  208.                                         <tr>
  209.                                             <th>Date</th>
  210.                                             <th>Référence</th>
  211.                                             <th>Tarif</th>
  212.                                             <th>Mois</th>
  213.                                             <th>Cycle</th>
  214.                                             <th>Période</th>
  215.                                             <th>Montant</th>
  216.                                             <th>Statut</th>
  217.                                             <th>Checkout</th>
  218.                                             <th>Action</th>
  219.                                         </tr>
  220.                                         </thead>
  221.                                         <tbody>
  222.                                         {% for payment in subscriptionPayments %}
  223.                                             {% set rawStatus = payment.status|default('PENDING') %}
  224.                                             {% set status = rawStatus|upper %}
  225.                                             <tr>
  226.                                                 <td>{{ payment.createdAt ? payment.createdAt|date('d/m/Y H:i') : '—' }}</td>
  227.                                                 <td><span class="badge text-bg-light">{{ payment.orderNumber }}</span></td>
  228.                                                 <td>{{ payment.package ? payment.package.name : '—' }}</td>
  229.                                                 <td>{{ payment.monthsCount|default(1) }}</td>
  230.                                                 <td>{{ payment.billingCycle|default('monthly') }}</td>
  231.                                                 <td>
  232.                                                     {% if payment.subscription and payment.subscription.startAt and payment.subscription.endAt %}
  233.                                                         {{ payment.subscription.startAt|date('d/m/Y') }} – {{ payment.subscription.endAt|date('d/m/Y') }}
  234.                                                     {% else %}
  235.                                                         —
  236.                                                     {% endif %}
  237.                                                 </td>
  238.                                                 <td>{{ payment.amount }} {{ payment.currency|default('USD') }}</td>
  239.                                                 <td>
  240.                                                     {% if status in ['APPROVED', 'SUCCESS'] %}
  241.                                                         <span class="badge text-bg-success">{{ rawStatus }}</span>
  242.                                                     {% elseif status in ['FAILED', 'DECLINED'] %}
  243.                                                         <span class="badge text-bg-danger">{{ rawStatus }}</span>
  244.                                                     {% else %}
  245.                                                         <span class="badge text-bg-warning">{{ rawStatus }}</span>
  246.                                                     {% endif %}
  247.                                                 </td>
  248.                                                 <td class="text-nowrap">
  249.                                                     {% if payment.checkoutUrl %}
  250.                                                         <a class="btn btn-sm btn-outline-primary" href="{{ payment.checkoutUrl }}" target="_blank" rel="noopener">
  251.                                                             Lien
  252.                                                         </a>
  253.                                                     {% else %}
  254.                                                         —
  255.                                                     {% endif %}
  256.                                                 </td>
  257.                                                 <td class="text-nowrap">
  258.                                                     {% if payment.paid != true %}
  259.                                                         <form method="post"
  260.                                                               action="{{ path('app_subscription_payment_delete', {id: payment.id}) }}"
  261.                                                               onsubmit="return confirm('Supprimer cette facture non payée ?');">
  262.                                                             <input type="hidden" name="_csrf_token" value="{{ csrf_token('delete_subscription_payment_' ~ payment.id) }}">
  263.                                                             <button type="submit" class="btn btn-sm btn-outline-danger">
  264.                                                                 Supprimer
  265.                                                             </button>
  266.                                                         </form>
  267.                                                     {% else %}
  268.                                                         —
  269.                                                     {% endif %}
  270.                                                 </td>
  271.                                             </tr>
  272.                                         {% endfor %}
  273.                                         </tbody>
  274.                                     </table>
  275.                                 </div>
  276.                             </div>
  277.                         </div>
  278.                     </div>
  279.                 </div>
  280.             {% endif %}
  281.         </div>
  282.     </div>
  283.     <script>
  284.         $.ajaxSetup({
  285.             cache: false
  286.         });
  287.         function unableAdmin(id) {
  288.             let url = replacePlaceholder("{{ path('app_unable_entreprise', {'id': 'placeholder'}) }}", id);
  289.             getContentForModal(url, "Désactivation du compte bailleur", function() {
  290.                 enableEditForm(id);
  291.             });
  292.         }
  293.         function saveUnableEntreprise(id) {
  294.             let url = replacePlaceholder("{{ path('app_unable_entreprise_save_change', {'id': 'placeholder'}) }}", id);
  295.             return _doPost('#entry-form-'+id, url);
  296.         }
  297.     </script>
  298. {% endblock %}