@extends('layouts.mz') @use('App\Support\Display') @section('title', 'کنسول پلتفرم') @section('credit', '1') @section('content')

کنسول پلتفرم

@if (session('mz.saved'))

{{ session('mz.saved') }}

@endif @if (session('mz.warning')) @endif @if (session('mz.history')) @endif

فروشنده‌ها

فروشندهٔ تازه
@if ($sellers->isEmpty())

هنوز فروشنده‌ای پذیرفته نشده است. با «فروشندهٔ تازه» اولین فروشنده را بسازید.

@else
@foreach ($sellers as $row) @php $admin = $row->admins->first(); // slice 12: the state is computed from the date, never read from a column (Subscription) $sub = \App\Subscriptions\Subscription::of($row); $quota = \App\Subscriptions\SmsQuota::shape((int) ($quotaUsed[$row->id] ?? 0), $row->sms_quota); @endphp @endforeach
نام وضعیت اشتراک پیامک این ماه مدیر نسخهٔ پایگاه
{{ $row->name }} @if ($row->isPurged()) دادهٔ پاک‌شده @else {{ $row->status === 'active' ? 'فعال' : 'معلق' }} @endif @php $state = $sub->state(); @endphp {{ $sub->stateWord() }} @if ($sub->lastDay()) تا {{ Display::date($sub->lastDay()) }} @endif {{ Display::number($quota['used']) }} @if ($quota['quota'] !== null) از {{ Display::number((int) $quota['quota']) }} @if ($quota['over']) بیرون از سهمیه @endif @endif @if ($admin) {{ $admin->username }}
@else — @endif
@if ($row->isPurged()) — @elseif ($row->code_version === $codeVersion) {{ $row->code_version }} @elseif ($row->update_error) {{-- «پویش تجربه» 0.35.3: the reason is on the seller's page, one click away --}} به‌روزرسانی شکست خورد؛ هر دقیقه دوباره امتحان می‌شود. علت @else در صف به‌روزرسانی @endif
{{-- slice 12: the quota figure is about a JALALI month, so the month is said next to it --}}

ستون پیامک، پیامک‌های این فروشنده به مشتریانش در {{ $quotaMonth }} است؛ کد ورود و رمز اولیه در آن نیستند. نام هر فروشنده به صفحهٔ خودش می‌رود: اشتراک، پرداخت‌ها، تمدید، تعلیق و رمز اولیهٔ تازه.

@endif
{{-- slice 4ب (پ۴-۴, plan q2): the nightly «مانده = جمع دفتر» check lands HERE. a mismatch is a defect of OUR code, so the alarm is ours; a check that stopped running is flagged as stale, never shown as «سالم». --}} {{-- slice 6الف (پ۹): the central price feed at a glance, with the way to its page --}}

منبع قیمت

جزئیات منبع قیمت
@if ($prices['stale'] === 0 && !$prices['aside'])

سالم هر {{ Display::number($prices['items']) }} قلم قیمت تازه دارند.

@else

نیاز به توجه @if ($prices['stale'] > 0) {{ Display::number($prices['stale']) }} قلم از {{ Display::number($prices['items']) }} قیمت تازه ندارند و کالاهای وابسته به آن‌ها بسته‌اند. @endif @if ($prices['aside']) یک منبع پس از خطاهای پیاپی کنار گذاشته شده است. @endif

@endif {{-- slice 6ب: our manual price holds for every seller — said on the first page, so it is never forgotten --}} @if ($prices['manual'] > 0)

قیمت دستی ما {{ Display::number($prices['manual']) }} قلم با قیمت دستی مرکزی معامله می‌شود؛ مدت و خاموش کردنش در «جزئیات منبع قیمت».

@endif

بررسی شبانهٔ دفتر (مانده = جمع دفتر)

@php $alarm = collect($checks)->contains(fn ($c) => $c['run'] !== null && in_array($c['run']->status, ['mismatch', 'failed'], true)); @endphp @if ($alarm) @endif @if ($sellers->isEmpty())

هنوز فروشنده‌ای نیست.

@else
@foreach ($sellers as $row) @php $check = $checks[$row->id] ?? ['run' => null, 'stale' => true]; $run = $check['run']; @endphp @endforeach
فروشنده آخرین اجرا نتیجه
{{ $row->name }} @if ($run) {{ Display::date($run->started_at) }} ساعت {{ Display::clock($run->started_at) }} @else — @endif @if ($check['stale']) {{ $run ? 'کهنه: بیش از ' . Display::number(\App\Models\LedgerCheck::STALE_HOURS) . ' ساعت پیش' : 'هنوز اجرا نشده' }} @endif @if (!$run) — @elseif ($run->status === 'ok') سالم {{ Display::number($run->customers) }} مشتری سنجیده شد @elseif ($run->status === 'running') در حال اجرا @elseif ($run->status === 'failed') شکست {{ $run->error }} @else مغایرت {{ Display::number($run->mismatches) }} مشتری از {{ Display::number($run->customers) }}
    @foreach ($run->detail ?? [] as $p)
  • {{-- slice 5ه۱: outside a seller's database a coin has no title here — «سکهٔ کالای n» --}} مشتری شمارهٔ {{ Display::number((int) $p['customer_id']) }}، {{ \App\Ledger\Ledger::isCoin((string) $p['asset']) ? 'سکهٔ کالای ' . Display::number((int) \App\Ledger\Ledger::coinProductId((string) $p['asset'])) : \App\Ledger\Ledger::label((string) $p['asset']) }}: جمع دفتر {{ $p['asset'] === 'rial' ? Display::money((int) $p['ledger'], 'rial') : \App\Ledger\Ledger::quantity((string) $p['asset'], (int) $p['ledger'], 'mg') }}، ماندهٔ ذخیره‌شده {{ $p['asset'] === 'rial' ? Display::money((int) $p['stored'], 'rial') : \App\Ledger\Ledger::quantity((string) $p['asset'], (int) $p['stored'], 'mg') }} @if ($p['chain_break']) — زنجیرهٔ «مانده پس از ردیف» از سند {{ Display::number((int) $p['chain_break']) }} می‌شکند @endif
  • @endforeach
@endif

هر شب ساعت ۳:۳۰ به وقت تهران اجرا می‌شود. اجرای دستی: فرمان php artisan mz:ledger-check.

@endif

پیامک در ۲۴ ساعت گذشته

فرستاده شد
{{ Display::number($smsSent) }}
ناموفق
{{ Display::number($smsFailed) }} @if ($smsLastError) — آخرین خطا: {{ $smsLastError }} @endif
گرداننده
@if ($smsDriver === 'melli') ملی پیامک @elseif ($smsDriver === 'log') فقط لاگ (ریگ) — پیامکی واقعاً نمی‌رود @else تنظیم نشده @endif
{{-- slice 8 (debt 7): the credit the provider reported, with its time — kept 10 minutes, never read per page view --}}
اعتبار ملی پیامک
@if ($smsCredit['value'] !== null) {{ Display::number((int) $smsCredit['value']) }} (به واحد پنل ملی پیامک) @else سنجیده نشد — {{ $smsCredit['error'] }} @endif — سنجش ساعت {{ Display::clock(\Carbon\CarbonImmutable::createFromTimestamp($smsCredit['at'])) }}
{{-- slice 8 (debt 29): where the nightly ledger alarm goes --}}
پیامک هشدار بررسی شبانه
@if ($alertMobile !== '') {{ \App\Support\Digits::toPersian($alertMobile) }} @else {{-- «پویش تجربه» 0.35.3: the place to set it is «تنظیمات پلتفرم» since debt 8 (0.32.0), not an .env variable — on a host with no SSH the old pointer named a file the owner cannot edit --}} شماره‌ای تنظیم نشده؛ هشدار فقط در همین کنسول است. گذاشتن موبایل هشدار در تنظیمات پلتفرم @endif
@csrf
{{-- debt 8, slice 8الف (0.32.0) --}}

تنظیمات پلتفرم

باز کردن تنظیمات

حدهای ورود همهٔ حساب‌ها، و حساب مرکزی ملی پیامک با شمارهٔ پشتیبانی و موبایل هشدار.

نسخه‌ها

{{-- debt 78 (0.31.0): the rig's settings on a host — debug mode above all — named with their fix (App\Support\HostSafety) --}} @if ($hostProblems !== []) @endif
نسخهٔ کد
{{ $codeVersion }}
پایگاه مرکزی
@if ($centralVersion === $codeVersion) {{ $centralVersion }} @else عقب‌تر از کد؛ زمان‌بند در دقیقهٔ بعد به‌روزش می‌کند @endif
{{-- debt 87 (0.34.0): «حالت تعمیر برای بارگذاری» (App\Support\UploadMaintenance). on: only this browser (its bypass cookie) sees this page; everyone else is served the pre-rendered «در حال به‌روزرسانی» --}} @if ($uploadMaintenance)

حالت تعمیر روشن است از ساعت {{ \App\Support\Display::clock($uploadMaintenance['since']) }}. همه صفحهٔ «در حال به‌روزرسانی» را می‌بینند و فقط این مرورگر کنسول را دارد.

پس از بارگذاری، زمان‌بند نسخهٔ تازه را کوچ می‌دهد و خودش خاموشش می‌کند. اگر نسخهٔ تازه‌ای نرسد، ساعت {{ \App\Support\Display::clock($uploadMaintenance['endsAt']) }} خاموش می‌شود.

@csrf
@else

پیش از بارگذاری زیپ به‌روزرسانی، سایت را برای همه ببندید تا در چند ثانیهٔ باز شدن زیپ کسی کد نیمه‌کاره نبیند. این مرورگر کنسول را نگه می‌دارد.

@csrf
@endif
@endsection