{# ---- ONGLET STOCK AMÉLIORÉ ---- #} {% if "STOCK" in arrayRight or is_granted('ROLE_SUPER_ADMIN') %}
{% if "STOCK" in rights %} {# ===== Cas 1 : stock par déclinaisons ===== #} {% if produit.produitDeclinationValues %} {% set total = 0 %} {% set reserved = 0 %} {% for dv in produit.produitDeclinationValues %} {% for s in dv.stocks %} {% set total = total + s.qtStock %} {% set reserved = reserved + s.qtReserved %} {% endfor %} {% endfor %} {% set dispo = total - reserved %} {# Synthèse #} {% set total = 0 %} {% set reserved = 0 %} {% set dispo = 0 %} {% set saleTva = produit.tva ? produit.tva.number : 0 %} {% set buyTva = produit.tvaBuy ? produit.tvaBuy.number : 0 %} {% set valAchatTtc = 0 %} {% set valAchatHt = 0 %} {% set valVenteHt = 0 %} {% set valVenteTtc = 0 %} {% for dv in produit.produitDeclinationValues %} {% for s in dv.stocks %} {% set total = total + s.qtStock %} {% set reserved = reserved + s.qtReserved %} {% set achatTtcLigne = s.qtStock * (dv.buyingPriceTtc ?? 0) %} {% set achatHtLigne = buyTva > 0 ? (achatTtcLigne / (1 + buyTva / 100)) : achatTtcLigne %} {% set venteHtLigne = s.qtStock * (dv.priceHt ?? 0) %} {% set venteTtcLigne = saleTva > 0 ? (venteHtLigne * (1 + saleTva / 100)) : venteHtLigne %} {% set valAchatTtc = valAchatTtc + achatTtcLigne %} {% set valAchatHt = valAchatHt + achatHtLigne %} {% set valVenteHt = valVenteHt + venteHtLigne %} {% set valVenteTtc = valVenteTtc + venteTtcLigne %} {% endfor %} {% endfor %} {% set dispo = total - reserved %}
Tableau de bord

Synthèse du stock

Qté en stock
{{ total }}
Qté réservée
{{ reserved }}
Qté disponible
{{ dispo }}
{% if is_granted('ROLE_SUPER_ADMIN') %}
Achat HT
{{ valAchatHt|number_format(3,'.',',') }} TND
Achat TTC
{{ valAchatTtc|number_format(3,'.',',') }} TND
{% endif %}
Vente HT
{{ valVenteHt|number_format(3,'.',',') }} TND
Vente TTC
{{ valVenteTtc|number_format(3,'.',',') }} TND
{# Détail par entrepôt #}
Suivi opérationnel

Détail par entrepôt

{% if "STOCK_UPDATE" in rights %} Historique des mouvements du produit {% endif %}
Filtres
Seuil global
{% set saleTva = produit.tva ? produit.tva.number : 0 %} {% set buyTva = produit.tvaBuy ? produit.tvaBuy.number : 0 %}
{% if is_granted('ROLE_SUPER_ADMIN') %} {% endif %} {% for dv in produit.produitDeclinationValues|sort((a, b) => a.reference <=> b.reference) %} {% set selectedPic = dv.picture|filter(p => p.isSelected)|first %} {% if not selectedPic %} {% set selectedPic = dv.picture|first %} {% endif %} {% for s in dv.stocks %} {% set dispo = s.qtStock - s.qtReserved %} {% set seuil = dv.alertStockMin ?? 3 %} {% set achatTtc = (s.qtStock * (dv.buyingPriceTtc ?? 0)) %} {% set achatHt = buyTva > 0 ? (achatTtc / (1 + buyTva / 100)) : achatTtc %} {% set venteHt = (s.qtStock * (dv.priceHt ?? 0)) %} {% set venteTtc = saleTva > 0 ? (venteHt * (1 + saleTva / 100)) : venteHt %} {% if is_granted('ROLE_SUPER_ADMIN') %} {% endif %} {% endfor %} {% endfor %} {% if is_granted('ROLE_SUPER_ADMIN') %} {% endif %}
Photo Entrepôt Référence Qté stock Qté réservée Qté dispo Alerte SeuilValor. Achat HT Valor. Achat TTCValor. Vente HT Valor. Vente TTC Actions
{% if selectedPic %} {% else %}
{% endif %}
{{ s.storehouse ?: 'Principal' }} {{ dv.reference }} {{ s.qtStock }} {{ s.qtReserved }} {{ dispo }} {% if dispo < seuil %} {% elseif dispo == seuil %} {% else %} {% endif %}
{{ achatHt|number_format(3,'.',',') }} TND {{ achatTtc|number_format(3,'.',',') }} TND{{ venteHt|number_format(3,'.',',') }} TND {{ venteTtc|number_format(3,'.',',') }} TND {% if "STOCK_UPDATE" in rights %} {% endif %}
Totaux:0.000 TND 0.000 TND0.000 TND 0.000 TND
{# ===== Cas 2 : stock produit simple ===== #} {% elseif produit.stocks %} {% set totalStock = 0 %} {% set reservedStock = 0 %} {% for s in produit.stocks %} {% set totalStock = totalStock + s.qtStock %} {% set reservedStock = reservedStock + s.qtReserved %} {% endfor %} {% set dispoStock = totalStock - reservedStock %}
Tableau de bord

Synthèse du stock

{% if is_granted('ROLE_SUPER_ADMIN') %}
Valorisation: {{ (totalStock * produit.buyingPriceTtc)|number_format(3,'.',',') }} TND
{% endif %}
Qté en stock
{{ totalStock }}
Qté réservée
{{ reservedStock }}
Qté disponible
{{ dispoStock }}
Suivi opérationnel

Détail par entrepôt

{% if "STOCK_UPDATE" in rights %} Historique des mouvements du produit {% endif %}
{% for s in produit.stocks %} {% set d = s.qtStock - s.qtReserved %} {% endfor %}
Entrepôt Total Réservée Disponible
Entrepôt {{ s.storehouse }} {{ s.qtStock }} {{ s.qtReserved }} {{ d }}
{# ===== Cas 3 : aucun stock ===== #} {% else %}
Tableau de bord

Synthèse du stock

Qté en stock
0
Qté réservée
0
Qté disponible
0
Entrepôt Total Réservée Disponible
Entrepôt Principal 0 0 0
{% endif %} {% endif %}
{% endif %} {# --- Modale Historique stock declinaisons --- #} {# --- Modale Historique stock produit --- #}