{% extends 'admin/layout.html.twig' %} {% block title %}Tableau de bord — WTL{% endblock %} {% block admin_body %} {% set dashboardActions = [{label:'Manuel utilisateur',href:'#userManualModal',icon:'bi-book',attributes:{'data-bs-toggle':'modal','data-bs-target':'#userManualModal'}}] %} {% if can_permission('VENUE_CONTACT',2) %}{% set dashboardActions = dashboardActions|merge([{label:'Nouveau contact terrain',href:path('admin_field_contact_new'),icon:'bi-lightning-charge',primary:true}]) %}{% endif %} {% include 'admin/ui/_page_header.html.twig' with { page_eyebrow: 'Pilotage quotidien', page_title: 'Bonjour ' ~ (app.user.displayName ?? app.user.userIdentifier), page_subtitle: 'Commencez par les actions à réaliser maintenant. Les indicateurs détaillés restent disponibles plus bas.', page_actions: dashboardActions } %} {% if can_permission('TASKS') %}

Aujourd’hui

{{ stats.late }} en retard · {{ stats.next7 }} à traiter dans la fenêtre courante

Tout voir
{% for p in toProcess|slice(0,5) %} {% set late = p.nextActionDate and p.nextActionDate < today %} {% set contact = p.targetContact ?: (p.venueEntity ? p.venueEntity.primaryContact : null) %}
{{ late ? 'En retard' : (p.nextActionDate == today ? 'Aujourd’hui' : 'À venir') }}

{{ p.nextAction ?: 'Premier contact' }}

{{ p.venueEntity ? p.venueEntity.name : p.venue }}{{ p.venueEntity ? p.venueEntity.city : p.city }}{% if contact %} · {{ contact.name }}{% endif %}

Traiter maintenant
{% else %}

Rien d’urgent

Aucune action n’est attendue dans la fenêtre actuelle.

{% endfor %}
{% endif %} {% if analyticsConfigured %}
Google Analytics
Trafic du site public — 7 derniers jours.
Paramètres Analytics
{% if analyticsData %}
{% set analyticsCards = [ {label:'Utilisateurs actifs', value:analyticsData.activeUsers}, {label:'Sessions', value:analyticsData.sessions}, {label:'Pages vues', value:analyticsData.pageViews}, {label:'Taux d’engagement', value:analyticsData.engagementRate ~ ' %'} ] %} {% for item in analyticsCards %}
{{ item.label }}
{{ item.value }}
{% endfor %}
Pages les plus consultées
{% for page in analyticsData.topPages %}
{{ page.title ?: page.path }} {% if page.title %}{{ page.path }}{% endif %}
Vues
{{ page.views }}
Utilisateurs
{{ page.users }}
{% else %}

Aucune donnée disponible pour cette période.

{% endfor %}
{% for page in analyticsData.topPages %}{% else %}{% endfor %}
PageVuesUtilisateurs
{{ page.title ?: page.path }}
{% if page.title %}
{{ page.path }}
{% endif %}
{{ page.views }}{{ page.users }}
Aucune donnée disponible pour cette période.
{% else %}
Données Analytics indisponibles.
{{ analyticsError ?: 'Vérifiez la propriété, le compte de service et l’accès Lecteur dans Google Analytics.' }}
{% endif %}
{% endif %} {% if can_permission('INVOICE') and unpaidInvoices is defined and unpaidInvoices %}
Factures à encaisser
Factures non réglées ou partiellement réglées pour le projet actif.
{{ unpaidInvoices|length }}
{% for invoice in unpaidInvoices %} {% set paymentStatus = paymentService.status(invoice) %}
{{ invoice.number }} · {{ invoice.issueDate|date('d/m/Y') }}
{% if invoice.prospection and invoice.prospection.venueEntity %}{{ invoice.prospection.venueEntity.name }}{% elseif invoice.prospection %}{{ invoice.prospection.venue }}{% else %}Client non renseigné{% endif %}
{% if paymentStatus == 'PARTIAL' %}Paiement partiel{% else %}À encaisser{% endif %}
Reste à encaisser{{ paymentService.remaining(invoice)|number_format(2,',',' ') }} €
{% if can_permission('PAYMENT',2) %} {% else %}
Consultation uniquement
{% endif %}
{% endfor %}
{% for invoice in unpaidInvoices %} {% set paymentStatus = paymentService.status(invoice) %} {% endfor %}
FactureClient / lieuÉmise leStatutReste à encaisserAction
{{ invoice.number }} {% if invoice.prospection and invoice.prospection.venueEntity %}{{ invoice.prospection.venueEntity.name }}{% elseif invoice.prospection %}{{ invoice.prospection.venue }}{% else %}—{% endif %} {{ invoice.issueDate|date('d/m/Y') }} {% if paymentStatus == 'PARTIAL' %}Partiellement payée{% else %}À encaisser{% endif %} {{ paymentService.remaining(invoice)|number_format(2,',',' ') }} € {% if can_permission('PAYMENT',2) %}{% else %}Lecture seule{% endif %}
{% if can_permission('PAYMENT',2) %} {% for invoice in unpaidInvoices %} {% endfor %} {% endif %} {% endif %} {% if can_permission('PROSPECTION') %}
Suggestions de prospection
Des lieux à prospecter ou recontacter selon leur historique, leurs contacts et leur potentiel.
{{ prospectionSuggestions|length }}
{% for suggestion in prospectionSuggestions %} {% set venue = suggestion.venue %}

{{ venue.name }}

{{ venue.city }}{% if venue.venueType %} · {{ venue.venueType.name }}{% endif %}
Priorité {{ suggestion.level|lower }}
{% if venue.approximateBudget %}
Budget indicatif : {{ venue.approximateBudget|number_format(0,',',' ') }} €
{% endif %}
{% for reason in suggestion.reasons %}{{ reason }}{% endfor %}
{% if suggestion.lastProspection or suggestion.lastConcert %}
{% if suggestion.lastProspection %}Dernière prospection : {{ suggestion.lastProspection|date('d/m/Y') }}{% endif %} {% if suggestion.lastConcert %}Dernier concert : {{ suggestion.lastConcert|date('d/m/Y') }}{% endif %}
{% endif %} {% if can_permission('PROSPECTION',2) %}
Prospecter
{% endif %}
{% else %} {% include 'admin/ui/_empty_state.html.twig' with {empty_title:'Aucune suggestion',empty_text:'Aucun lieu pertinent à prospecter ou recontacter pour le moment.'} only %} {% endfor %}
{% for suggestion in prospectionSuggestions %} {% set venue = suggestion.venue %} {% else %} {% endfor %}
Lieu Pourquoi maintenant ? Priorité Actions
{{ venue.name }}
{{ venue.city }}{% if venue.venueType %} · {{ venue.venueType.name }}{% endif %}
{% if venue.approximateBudget %}
Budget indicatif : {{ venue.approximateBudget|number_format(0,',',' ') }} €
{% endif %}
{% for reason in suggestion.reasons %}{{ reason }}{% endfor %} {% if suggestion.lastProspection %}
Dernière prospection : {{ suggestion.lastProspection|date('d/m/Y') }}
{% endif %} {% if suggestion.lastConcert %}
Dernier concert : {{ suggestion.lastConcert|date('d/m/Y') }}
{% endif %}
{{ suggestion.level }} {% if can_permission('PROSPECTION',2) %}Prospecter {% endif %}
Aucune suggestion pertinente pour le moment.
{% if can_permission('PROSPECTION',2) %} {% for suggestion in prospectionSuggestions %} {% set venue = suggestion.venue %} {% endfor %} {% endif %}
Tunnel historique : chaque jalon reste compté même si le dossier a ensuite été annulé. Stock courant : état présent des représentations.
{% set cards=[{label:'Prospections',value:stats.total,icon:'bi-geo-alt'},{label:'Contacts envoyés · historique',value:stats.contacted,icon:'bi-send'},{label:'Propositions envoyées · historique',value:stats.proposals,icon:'bi-file-earmark-text'},{label:'Accords obtenus · historique',value:stats.agreements,icon:'bi-hand-thumbs-up'},{label:'Dates programmées · historique',value:stats.scheduledMilestones,icon:'bi-calendar-check'},{label:'Dates programmées · stock',value:stats.currentlyScheduled,icon:'bi-calendar-event'},{label:'Dates annulées · stock',value:stats.currentlyCancelled,icon:'bi-calendar-x'},{label:'Dates jouées · stock',value:stats.currentlyPerformed,icon:'bi-check2-circle'}] %} {% for card in cards %}
{{ card.label }}
{{ card.value }}
{% endfor %}

Progression commerciale

Répartition par statut

Répartition par statut

{% for row in stats.byStatus %}
{{ row.label }}{{ row.total }}
{% else %}

Aucune donnée

{% endfor %}
{% for row in stats.byStatus %} {% else %} {% endfor %}
{{ row.label }} {{ row.total }}
Aucune donnée

Répartition par type de lieu

{% for row in stats.byType %}
{{ row.label }}{{ row.total }}
{% else %}

Aucune donnée

{% endfor %}
{% for row in stats.byType %} {% else %} {% endfor %}
{{ row.label }} {{ row.total }}
Aucune donnée
{% endif %} {% include 'admin/_user_manual_modal.html.twig' %} {% endblock %} {% block javascripts %}{{ parent() }} {% endblock %}