{# Bloc "Dernières opérations SSA" d'un adhérent. Variables attendues : - ssa (SolidoumeParameter) : la caisse SSA courante - operations (optionnel) : liste d'opérations pré-calculée (Operation[]) ; si absente, les opérations eMLc de la caisse sont chargées automatiquement via getLastOperations(). Ce bloc affiche deux types d'entrées dans le même tableau, triés par date décroissante : 1. Opérations SSA eMLc (prélèvements sur achats, remboursements) → objets Operation, avec operation.flux pour les métadonnées. → chargées via getLastOperations() avec filtre CURRENCY_EMLC + ssa. 2. Cotisations SSA de l'adhérent (paiement mensuel vers la caisse) → objets CotisationSsaAdherent (sous-classe de Flux), accédés directement. → chargées et fusionnées via getLastSsaAllEntriesForCurrentAdherent(). → IMPORTANT : les cotisations en euros (CB, HelloAsso, SEPA, virement, espèces, chèque) ne génèrent qu'une opération côté prestataire (caisse), et aucune opération côté adhérent. Sans cette section, elles seraient invisibles ici. → Les cotisations eMLc sont exclues (elles apparaissent déjà en section 1). La liste finale est triée par date décroissante (la plus récente en premier), quel que soit le type de l'entrée, grâce à getLastSsaAllEntriesForCurrentAdherent(). #} {% set operations = operations|default(getLastOperations(app.request, app.user, constant('App\\Enum\\CurrencyEnum::CURRENCY_EMLC'), ssa)) %} {% set title = title|default('%name% : Dernières opérations'|trans({'%name%': ssa.name})) %} {# Liste unifiée eMLc + cotisations euros, triée par date décroissante (plus récent en premier). getLastSsaAllEntriesForCurrentAdherent() fusionne et trie les deux sources en PHP. Retourne [] si l'utilisateur n'est pas un adhérent connecté. Chaque entrée : { 'isOperation': bool, 'date': DateTime, 'object': Operation|Flux } #} {% set allEntries = getLastSsaAllEntriesForCurrentAdherent(ssa, operations) %} {% extends '@kohinos/block/block_collapse.html.twig' %} {% block blocktitle %} {{ title }} {% endblock blocktitle %} {% block blocksubtitle %} {% endblock blocksubtitle %} {% block blockcontent %} {% if allEntries|length > 0 %}
{# ── Liste unifiée eMLc + cotisations euros, triée par date décroissante ── #} {% for entry in allEntries %} {% if entry.isOperation %} {# ── Opération SSA eMLc (prélèvement, redistribution, cotisation eMLc) ── #} {% set operation = entry.object %} {# ── Ligne de données ── #} {# ── Ligne de détail (colspan=4, pas de décalage de colonnes) ── #} {% else %} {# ── Cotisation SSA euros (CB, HelloAsso, SEPA, virement, espèces, chèque) ── #} {# CotisationSsaAdherent : objet Flux accédé directement, sans Operation intermédiaire. Les cotisations eMLc sont filtrées côté PHP (elles apparaissent déjà en tant qu'opération eMLc ci-dessus). La devise est donc toujours Euro ici. #} {% set cotisation = entry.object %} {# ── Ligne de données ── #} {# Montant : toujours un débit pour l'adhérent. Devise toujours Euro. #} {# ── Ligne de détail (colspan=4, pas de décalage de colonnes) ── #} {% endif %} {% endfor %}
Date Type Opération Montant
{{ operation.createdAt|date('d/m/Y') }} {{ ((isCurrentAccountable(app.user, operation.flux.expediteur) ? 'exp' : 'des')~'_'~operation.flux.parenttype)|trans({}, 'flux') }} {{ (operation.montant < 0)? '- ':'+ ' }} {{ operation.montant|abs|number_format(2) }} {{ getCurrencyName(operation.currency) }}
{{ 'Référence'|trans }} : {{ operation.flux.reference }}   ·   {{ 'Moyen'|trans }} : {{ operation.flux.moyen|trans }} {% if operation.flux.moyen == constant('App\\Enum\\MoyenEnum::MOYEN_HELLOASSO') %} {% set urlTicket = getPaymentReceiptUrlFromFlux(operation.flux) %} {% if urlTicket is not empty %}   ·   {{ 'Ticket CB'|trans }} {% endif %} {% endif %}
{{ cotisation.createdAt|date('d/m/Y') }} {{ 'exp_cotisation_ssa'|trans({}, 'flux') }} - {{ cotisation.montant|abs|number_format(2) }} {{ getCurrencyName(constant('App\\Enum\\CurrencyEnum::CURRENCY_EURO')) }}
{{ 'Référence'|trans }} : {{ cotisation.reference }}   ·   {{ 'Moyen'|trans }} : {{ cotisation.moyen|trans }} {% if cotisation.moyen == constant('App\\Enum\\MoyenEnum::MOYEN_HELLOASSO') %} {# getPaymentReceiptUrlFromFlux accepte tout objet Flux #} {% set urlTicket = getPaymentReceiptUrlFromFlux(cotisation) %} {% if urlTicket is not empty %}   ·   {{ 'Ticket CB'|trans }} {% endif %} {% endif %}
{% else %}
{{ 'Aucune opération SSA pour le moment !'|trans }}
{% endif %} {% if allEntries|length > 0 %} {# Lien vers la page dédiée qui combine opérations eMLc ET cotisations euros pour cette caisse #} {{ 'Voir toutes les opérations SSA'|trans }}
{#
#} {% endif %} {% endblock blockcontent %}