@extends('layouts.dashboard')
@section('content')
@php
/**
* Platform Analytics → Earnings: the platform's own income — subscriptions,
* sponsored placements and the commission accrued on restaurant sales, reported
* both as cash collected and as revenue recognised over the term it buys.
*
* @var array $total @var array $subCash @var array $adCash @var array $comCash
* @var array $recognised @var array $activeSubs @var array $renewalsDue
* @var array $renewals @var array $payments
* @var array $earnChart @var array $earnMeta @var array $earnRanges @var string $earnSelected @var array $earnRangeOpts @var array $cashChart @var array $cashMeta
* @var array $planChart @var array $planMeta @var array $streamChart @var array $streamMeta
* @var array $earnerChart @var array $earnerMeta
* @var int $rangeDays @var string $rangeMode @var array $rangeLinks
*/
// Pre-escaped: callers echo the result directly (no e() wrapper), since the '' case
// needs to emit the canonical dash() markup rather than a plain escaped string.
$methodLabel = static fn (?string $m): string => match ((string) $m) {
'stripe' => 'Stripe', 'paypal' => 'PayPal', 'offline' => e(t_raw('common.payment_card')), 'cod' => e(t_raw('common.cash')), '' => dash(), default => e(ucfirst((string) $m)),
};
// The method as its brand/flat SVG icon (consistent with the orders + billing tables),
// shown next to the amount actually paid; the text label is the fallback when no icon exists.
$methodCell = static function (?string $m) use ($methodLabel, $__env): string {
$ico = payment_method_icon((string) $m);
return $ico !== '' ? $ico : '' . $methodLabel($m) . '';
};
// Movement pill + caption, the description line every KPI on this page carries.
$kpiMeta = static fn (array $m, string $caption): string =>
kpi_trend((int) $m['pct'], (string) $m['dir']) . '' . $caption . '';
// Franchise brands the platform's per-order take as a royalty billed on franchise sales; the
// figures are identical, only the wording changes. Marketplace is the default.
$producesInvoices = $producesInvoices ?? false;
@endphp
@php /* .qm-d2: the dashboard density standard (app.css §35) */
@endphp
{{ t_raw('dashboard.sec.snapshot') }}
{{ t_raw($producesInvoices ? 'admin.analytics.earnings_sub_invoice' : 'admin.analytics.earnings_sub') }}
@foreach ($rangeLinks['options'] as $val => $text)
@php $on = ((string) $val === $rangeLinks['selected']); @endphp
{{ $text }}
@endforeach
@partial('kpi-card', ['variant' => 'panel', 'accent' => 'green', 'icon' => 'fa-coins', 'label' => t_raw('admin.analytics.kpi_platform_earnings'),
'value' => money($total['total']), 'spark' => $total['cur'],
'meta' => $kpiMeta($total, t('admin.analytics.meta_vs_prior'))])
@partial('kpi-card', ['variant' => 'panel', 'accent' => 'teal', 'icon' => 'fa-balance-scale', 'label' => t_raw('admin.analytics.kpi_recognised_revenue'),
'value' => money($recognised['total']), 'spark' => $recognised['cur'],
'meta' => $kpiMeta($recognised, t('admin.analytics.meta_earned_not_billed'))])
@partial('kpi-card', ['variant' => 'panel', 'accent' => 'blue', 'icon' => 'fa-file-invoice-dollar', 'label' => t_raw('common.subscriptions'),
'value' => money($subCash['total']), 'href' => route('admin.subscriptions'), 'spark' => $subCash['cur'],
'meta' => $kpiMeta($subCash, t('admin.analytics.meta_plan_payments'))])
@partial('kpi-card', ['variant' => 'panel', 'accent' => 'violet', 'icon' => 'fa-bullhorn', 'label' => t_raw('common.sponsored_ads'),
'value' => money($adCash['total']), 'href' => route('admin.campaigns'), 'spark' => $adCash['cur'],
'meta' => $kpiMeta($adCash, t('admin.analytics.meta_paid_campaigns'))])
@partial('kpi-card', ['variant' => 'panel', 'accent' => 'amber', 'icon' => 'fa-percentage', 'label' => t_raw($producesInvoices ? 'admin.analytics.kpi_royalty_accrued' : 'admin.analytics.kpi_commission_accrued'),
'value' => money($comCash['total']), 'spark' => $comCash['cur'],
'meta' => $kpiMeta($comCash, t($producesInvoices ? 'admin.analytics.meta_stamped_royalty' : 'admin.analytics.meta_stamped_rate'))])
@partial('kpi-card', ['variant' => 'panel', 'accent' => 'orange', 'icon' => 'fa-sync-alt', 'label' => t_raw('admin.analytics.kpi_active_subs'),
'value' => number_format($activeSubs['total']), 'href' => route('admin.subscriptions'), 'spark' => $activeSubs['cur'],
'meta' => $kpiMeta($activeSubs, t('admin.analytics.meta_currently_running'))])
@partial('kpi-card', ['variant' => 'panel', 'accent' => 'orange', 'icon' => 'fa-hand-holding-usd', 'label' => t_raw('admin.analytics.kpi_renewals_due'),
'value' => number_format($renewalsDue['total']), 'href' => route('admin.subscriptions'), 'spark' => $renewalsDue['cur'],
'meta' => $kpiMeta($renewalsDue, t('admin.analytics.meta_vs_prior'))])
{{ t_raw('dashboard.sec.trends') }}
@partial('chart-card', ['heading' => t_raw('admin.analytics.chart_earnings_over_time'), 'sub' => t_raw('admin.analytics.chart_by_income_stream'), 'cfg' => $earnChart, 'meta' => $earnMeta, 'accent' => 'green', 'opts' => ['id' => 'earnTimeChart', 'url' => route('admin.chart-series', ['chart' => 'earnStreams']), 'selected' => $rangeLinks['selected'], 'options' => $rangeLinks['options'], 'control' => 'compact']])
@partial('chart-card', ['heading' => t_raw('admin.analytics.chart_cash_vs_recognised'), 'sub' => t_raw('admin.analytics.chart_cash_vs_recognised_caption'), 'cfg' => $cashChart, 'meta' => $cashMeta, 'icon' => 'fa-balance-scale', 'accent' => 'teal', 'opts' => ['id' => 'cashChart', 'url' => route('admin.chart-series', ['chart' => 'earnCash']), 'selected' => $rangeLinks['selected'], 'options' => $rangeLinks['options'], 'control' => 'compact']])
{{ t_raw('dashboard.sec.breakdown') }}
@partial('chart-card', ['heading' => t_raw('admin.analytics.chart_active_plan_mix'), 'sub' => t_raw('admin.analytics.chart_subs_by_plan'), 'cfg' => $planChart, 'meta' => $planMeta, 'icon' => 'fa-chart-pie', 'accent' => 'blue'])
@partial('chart-card', ['heading' => t_raw('admin.analytics.chart_income_mix'), 'sub' => t_raw('admin.analytics.chart_income_mix_caption'), 'cfg' => $streamChart, 'meta' => $streamMeta, 'icon' => 'fa-chart-pie', 'accent' => 'violet'])
@partial('chart-card', ['heading' => t_raw($producesInvoices ? 'admin.analytics.chart_royalty_by_partner' : 'admin.analytics.chart_top_earners'), 'sub' => t_raw($producesInvoices ? 'admin.analytics.chart_royalty_by_partner_caption' : 'admin.analytics.chart_top_earners_caption'), 'cfg' => $earnerChart, 'meta' => $earnerMeta, 'icon' => 'fa-chart-bar', 'accent' => 'amber', 'opts' => ['id' => 'admEarnTopChart', 'url' => route('admin.chart-series', ['chart' => 'earnTop']), 'selected' => $rangeLinks['selected'], 'options' => $rangeLinks['options'], 'control' => 'compact']])
{{ t_raw('admin.analytics.caption_active_subs_by_renewal') }}
| {{ t_raw('common.restaurant') }} | {{ t_raw('common.plan') }} | {{ t_raw('admin.analytics.col_renews') }} | {{ t_raw('common.value') }} |
@if ($renewals)
@foreach ($renewals as $rw)
@php $dl = (int) ($rw['days_left'] ?? 0); @endphp
{!! restaurant_logo_html(['logo' => $rw['logo'] ?? '', 'name' => $rw['restaurant'] ?? ''], 'md') !!}
{{ $rw['restaurant'] }}
|
{!! plan_tag((string) ($rw['plan_slug'] ?? ''), (string) $rw['plan']) !!} |
@if ($dl <= 0){{ t_raw('common.today') }}
@elseif ($dl <= 7){!! $dl === 1 ? t('admin.analytics.in_n_days_one') : t('admin.analytics.in_n_days_many', [':n' => $dl]) !!}
@else{!! fmt_day($rw['ends_at']) !!}@endif
|
{{ money($rw['price']) }} |
@endforeach
@else
@partial('table-empty', ['colspan' => 4, 'icon' => 'fa-file-invoice-dollar', 'msg' => t('admin.analytics.empty_no_renewals')])
@endif
@partial('table-toolbar', ['pager' => $renewalsPager, 'base' => '/admin/analytics/earnings'])
{{ t_raw('admin.analytics.caption_latest_payments') }}
| {{ t_raw('common.restaurant') }} | {{ t_raw('common.plan') }} | {{ t_raw('common.paid') }} | {{ t_raw('common.when') }} |
@if ($payments)
@foreach ($payments as $pm)
{!! restaurant_logo_html(['logo' => $pm['logo'] ?? '', 'name' => $pm['restaurant'] ?? ''], 'md') !!}
{{ $pm['restaurant'] }}
|
{!! plan_tag((string) ($pm['plan_slug'] ?? ''), (string) $pm['plan']) !!} |
{{ money($pm['amount_paid']) }}{!! $methodCell($pm['payment_method'] ?? null) !!} |
{!! fmt_day($pm['created_at']) !!} |
@endforeach
@else
@partial('table-empty', ['colspan' => 4, 'icon' => 'fa-coins', 'msg' => t('admin.analytics.empty_no_payments')])
@endif
@partial('table-toolbar', ['pager' => $paymentsPager, 'base' => '/admin/analytics/earnings'])
@php /* /.qm-d2 */
@endphp
@endsection