{% extends "layouts/base.twig" %} {% block title %}{{ translations.revenue_dashboard_title ?? 'Dashboard przychodów' }}{% endblock %} {% block head %} {% endblock %} {% block page_heading %}

{{ translations.revenue_dashboard_title ?? 'Dashboard przychodów' }}

{{ translations.revenue_dashboard_subtitle ?? 'Analiza sprzedaży, kosztów i rentowności w wybranym okresie' }}

{% endblock %} {% block content %} {# ── Filtry zakresu dat ────────────────────────────────────────────── #}
{# Własny zakres — pokazuje się tylko po kliknięciu "Własny zakres" #}
{# ── Wiersz KPI ────────────────────────────────────────────────────── #}
{{ translations.total_revenue ?? 'Przychód brutto' }}
{{ translations.net_income ?? 'Wynik netto' }} i {{ translations.net_margin_tooltip ?? 'marża netto = wynik netto / przychód' }}
{{ translations.avg_ticket ?? 'Śr. wartość paragonu' }}
{{ translations.avg_daily_transactions ?? 'Śr. transakcji/dzień' }}
{# Iteracja 5 — nota kontekstu czasowego targetu dla widoków zbiorczych #}
{# ── Karta wyceny sklepu (pełna szerokość) ───────────────────────────── #}
{{ translations.shop_valuation ?? 'Wycena sklepu' }} i {{ translations.valuation_tooltip ?? 'Szacunkowa wycena metodą mnożnikową: przychód roczny × marża netto × mnożnik 4,5.' }}
{{ translations.current_valuation ?? 'Wycena bieżąca' }}
{{ translations.target_valuation ?? 'Wycena przy celu 15%' }}
5% 15% 20%
{# ── Pozycja względem targetów (pełna szerokość) ─────────────────────── #}
{{ translations.target_position_title ?? 'Pozycja względem targetów' }} i {{ translations.target_position_tooltip ?? 'Pasek pokazuje strefy oceny (zielona = dobry, żółta = średni, pomarańczowa = średnio zły, czerwona = zły). Igła wskazuje wartość zrealizowaną w wybranym zakresie.' }}
{# Skeleton #} {% for i in 1..7 %}
{% endfor %}
{# ── Wykres przychodów: bieżący rok vs N-1 (pełna szerokość) ────────── #}
{{ translations.revenue_chart_title ?? 'Przychód miesięczny: bieżący rok vs rok poprzedni' }}
{{ current_year }}
{{ prev_year }}
{# ── Tabela szczegółowa ────────────────────────────────────────────── #}
{{ translations.period_detail ?? 'Szczegóły per okres' }}
 {{ translations.costs_ok ?? 'Koszty OK' }}
! {{ translations.costs_limit ?? 'Na granicy' }}
 {{ translations.costs_exceeded ?? 'Przekroczenie' }}
{# Okres #} {# Txn #} {# Śr/d #} {# Retail #} {# B2B rev #} {# Przychód #} {# Śr. paragon #} {# P/t #} {# Food % #} {# Labor % #} {# Shop % #} {# Waste % #} {# Wynik netto #} {# Status #} {# B2B txn #} {# Web pickup #} {# Web delivery #}
{% if b2b_min_transaction_value > 0 %}
⚠ {{ translations.b2b_threshold_banner ?? 'Dane B2B filtrowane przez próg minimalnej wartości transakcji:' }} {{ b2b_min_transaction_value|number_format(2, '.', '') }} {{ currency_symbol }} — {{ translations.b2b_threshold_banner_sub ?? 'transakcje poniżej progu są traktowane jako sprzedaż detaliczna.' }}
{% endif %}
{{ translations.period ?? 'Okres' }} {{ translations.transactions_abbr ?? 'Txn' }} {{ translations.avg_daily_abbr ?? 'Śr/d' }} {{ translations.retail_abbr ?? 'Retail' }}
{{ translations.income ?? 'Przychód' }}
B2B
{{ translations.income ?? 'Przychód' }}
{{ translations.income ?? 'Przychód' }}
{{ translations.delta_mom ?? 'Δ m/m' }}
{{ translations.avg_ticket_abbr ?? 'Śr. paragon' }} {{ translations.avg_products_abbr ?? 'P/t' }} {{ translations.food_cost_pct ?? 'Food %' }} {{ translations.labor_cost_pct ?? 'Labor %' }} {{ translations.shop_cost_pct ?? 'Shop %' }} {{ translations.waste_pct ?? 'Waste %' }} {{ translations.net_income ?? 'Wynik netto' }}
{{ translations.margin ?? 'marża' }}
{{ translations.status ?? 'Status' }} B2B
txn
Web
pickup
Web
delivery
{{ translations.loading ?? 'Ładowanie danych…' }}
{# ── Legenda kolumn ─────────────────────────────────────────────── #}
{{ translations.col_legend_title ?? 'Objaśnienie kolumn' }}
{{ translations.period ?? 'Okres' }} {{ translations.col_desc_period ?? 'Miesiąc, którego dotyczy wiersz (format RRRR-MM).' }}
{{ translations.transactions_abbr ?? 'Txn' }} {{ translations.col_desc_txn ?? 'Łączna liczba transakcji zrealizowanych w danym miesiącu.' }}
{{ translations.avg_daily_abbr ?? 'Śr/d' }} {{ translations.col_desc_avg_daily ?? 'Średnia liczba transakcji na dzień roboczy w miesiącu.' }}
{{ translations.retail_abbr ?? 'Retail' }} {{ translations.col_desc_retail ?? 'Przychód brutto z transakcji niebędących B2B (sprzedaż detaliczna). Obliczany jako przychód łączny minus przychód B2B.' }}
{{ translations.b2b_revenue_label ?? 'B2B Przychód' }} {{ translations.col_desc_b2b_revenue ?? 'Łączny przychód brutto wygenerowany przez transakcje klientów B2B.' }}{% if b2b_min_transaction_value > 0 %} {{ translations.b2b_threshold_active ?? 'Aktywny próg:' }} {{ b2b_min_transaction_value|number_format(2, '.', '') }} {{ currency_symbol }}{% endif %}
{{ translations.income ?? 'Przychód' }} {{ translations.col_desc_income ?? 'Łączny przychód brutto w miesiącu. Δ m/m — zmiana procentowa względem poprzedniego miesiąca.' }}
{{ translations.avg_ticket_abbr ?? 'Śr. paragon' }} {{ translations.col_desc_avg_ticket ?? 'Średnia wartość brutto jednej transakcji (przychód ÷ liczba transakcji).' }}
{{ translations.avg_products_abbr ?? 'P/t' }} {{ translations.col_desc_avg_products ?? 'Średnia liczba produktów sprzedanych w jednej transakcji.' }}
{{ translations.food_cost_pct ?? 'Food %' }} {{ translations.col_desc_food_pct ?? 'Koszt surowców (food cost) jako % przychodu brutto. Próg ostrzegawczy: 40%. Wyświetlany kolor sygnalizuje przekroczenie.' }}
{{ translations.labor_cost_pct ?? 'Labor %' }} {{ translations.col_desc_labor_pct ?? 'Koszt pracowniczy jako % przychodu brutto. Próg ostrzegawczy: 20%.' }}
{{ translations.shop_cost_pct ?? 'Shop %' }} {{ translations.col_desc_shop_pct ?? 'Stałe koszty sklepu (najem, media itp.) jako % przychodu brutto.' }}
{{ translations.waste_pct ?? 'Waste %' }} {{ translations.col_desc_waste_pct ?? 'Koszt odpadów i strat produkcyjnych jako % przychodu brutto. Im niższy, tym lepiej.' }}
{{ translations.net_income ?? 'Wynik netto' }} {{ translations.col_desc_net_income ?? 'Przychód brutto minus podatek VAT, food cost, labor cost i shop cost. Procent pod wartością to marża netto.' }}
{{ translations.status ?? 'Status' }} ✓ OK — {{ translations.col_desc_status_ok ?? 'food i labor w normie.' }} ! — {{ translations.col_desc_status_warn ?? 'jeden lub oba na granicy progu.' }} — {{ translations.col_desc_status_bad ?? 'przekroczenie progu.' }}
{{ translations.b2b_txn_label ?? 'B2B txn' }} {{ translations.col_desc_b2b_txn ?? 'Liczba transakcji zrealizowanych przez klientów B2B. Mniejsza liczba pod spodem (uniq.) to liczba unikalnych klientów B2B.' }}{% if b2b_min_transaction_value > 0 %} {{ translations.b2b_threshold_active ?? 'Aktywny próg:' }} {{ b2b_min_transaction_value|number_format(2, '.', '') }} {{ currency_symbol }}{% endif %}
{{ translations.webshop_pickup_label ?? 'Web pickup' }} {{ translations.col_desc_webshop_pickup ?? 'Zamówienia złożone przez webshop (płatność typ 15) z odbiorem własnym lub spożyciem na miejscu (sposób podania: eat-in / take away).' }}
{{ translations.webshop_delivery_label ?? 'Web delivery' }} {{ translations.col_desc_webshop_delivery ?? 'Zamówienia złożone przez webshop (płatność typ 15) z dostawą do klienta (sposób podania: delivery).' }}
{% endblock %} {% block scripts %} {% endblock %}