@extends('layouts.mz') @use('App\Http\Controllers\Panel\SettingsController') @php $options = [ 'display.money_unit' => ['toman' => 'تومان', 'rial' => 'ریال'], 'display.weight_unit' => ['g' => 'گرم', 'mg' => 'میلی‌گرم'], 'trade.rounding_step' => ['1' => '۱ ریال', '10' => '۱۰ ریال', '100' => '۱۰۰ ریال', '1000' => '۱٬۰۰۰ ریال'], 'trade.price_poll_seconds' => ['2' => '۲ ثانیه', '3' => '۳ ثانیه', '5' => '۵ ثانیه', '10' => '۱۰ ثانیه', '15' => '۱۵ ثانیه', '30' => '۳۰ ثانیه'], 'trade.quote_seconds' => ['0' => 'بدون قفل', '10' => '۱۰ ثانیه', '15' => '۱۵ ثانیه', '20' => '۲۰ ثانیه', '30' => '۳۰ ثانیه', '60' => '۶۰ ثانیه'], 'trade.decide_seconds' => ['30' => '۳۰ ثانیه', '45' => '۴۵ ثانیه', '60' => '۱ دقیقه', '90' => '۹۰ ثانیه', '120' => '۲ دقیقه', '150' => '۱۵۰ ثانیه', '180' => '۳ دقیقه'], // slice 5ج۲ (owner plan #7): a list, not a checkbox — an unticked box is never posted, and this form writes only // the keys that arrive, so a checkbox could never be switched off 'trade.note_enabled' => ['on' => 'روشن', 'off' => 'خاموش'], 'trade.stale_seconds' => ['60' => '۱ دقیقه', '90' => '۹۰ ثانیه', '120' => '۲ دقیقه', '180' => '۳ دقیقه', '300' => '۵ دقیقه'], ]; // a whole number typed in a short field (slice 5ج۲); a key in neither list is a multi-line text $numbers = ['trade.note_max' => 'نویسه']; $hints = [ 'display.money_unit' => 'مبلغ‌ها همیشه به ریال ذخیره می‌شوند؛ این فقط واحد نمایش است.', 'display.weight_unit' => 'وزن‌ها همیشه به میلی‌گرم ذخیره می‌شوند؛ این فقط واحد نمایش است.', 'trade.rounding_step' => 'مبلغ هر معامله با روش نیم به بالا به این گام گرد می‌شود.', 'trade.price_poll_seconds' => 'اپ همکار هر چند ثانیه قیمت‌ها را دوباره بخواند، تا بستن خرید یا فروش یک کالا زود به همکاران برسد.', 'trade.quote_seconds' => 'با زدن دکمهٔ قیمت، قیمت این مدت برای مشتری قفل می‌شود. «بدون قفل» یعنی سفارش فقط وقتی ثبت می‌شود که قیمت تا لحظهٔ ثبت عوض نشده باشد.', 'trade.decide_seconds' => 'سفارشی که در این مدت تأیید یا رد نشود، منقضی می‌شود و دیگر تأییدشدنی نیست. تغییر این تنظیم مهلت سفارش‌هایی را که همین حالا در صف‌اند عوض نمی‌کند.', 'trade.reject_reasons' => 'هر دلیل در یک خط (حداکثر ۲۰ دلیل، هر کدام تا ۱۰۰ نویسه). رد سفارش فقط با یکی از همین دلیل‌ها ممکن است و مشتری همان را می‌بیند. ویرایش این فهرست دلیل سفارش‌های ردشدهٔ پیشین را عوض نمی‌کند.', 'trade.note_enabled' => 'روشن یعنی مشتری روی برگهٔ سفارش یک خانهٔ «توضیح برای فروشنده» دارد و شما توضیح را روی کارت صف، «سفارش‌های امروز» و صفحهٔ ابطال می‌بینید. خاموش یعنی این خانه نیست و توضیحی ذخیره نمی‌شود.', 'trade.note_max' => 'عددی بین ۱۰ و ۱٬۰۰۰. توضیح بلندتر بریده نمی‌شود؛ به مشتری گفته می‌شود کوتاه‌ترش کند. توضیح سفارش‌های پیشین دست نمی‌خورد.', 'trade.stale_seconds' => 'فقط برای کالاهایی که «قیمت مرکزی» می‌گیرند: اگر آخرین قیمت سالم از این مدت قدیمی‌تر شود، خرید و فروش آن کالا بسته می‌شود و همکار «قیمت در حال به‌روزرسانی است» می‌بیند؛ با رسیدن قیمت تازه خودش باز می‌شود. مرکز هر چند ثانیه یک بار قیمت می‌گیرد.', ]; @endphp @section('title', 'تنظیمات') @section('credit', '1') @section('nav') @include('panel._nav') @endsection @section('content')

تنظیمات

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

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

@endif @if ($errors->any()) @endif
@csrf

نمایش و معامله

@foreach ($values as $key => $value) @php $field = SettingsController::field($key); $current = old($field, $value); @endphp
@if (isset($options[$key])) @elseif (isset($numbers[$key])) @else @endif {{ $hints[$key] }} @error($field)

{{ $message }}

@enderror
@endforeach
{{-- slice 5ب (PRD §4 «حدهای سراسری هر خانواده», debt 16): its own form, so a refusal here never touches the settings above; posts exactly the three fields it renders (+PARTIAL-SAVE). slice 5د۱: one form per family (melted gold, silver), each with its own error bag, anchor and saved notice; the typed values come back only into the form that was refused --}} @foreach ($familyForms as $family => $form) @php($bag = $errors->getBag($form['bag']))
@csrf

حدهای سراسری {{ $form['word'] }} ({{ $form['unitWord'] }})

@if (session($form['saved']))

{{ session($form['saved']) }}

@endif @if ($bag->any()) @endif {{-- slice 5ه۲ (decision 110): the coin form says its unit and that every coin counts one --}}

برای همهٔ کالاهای {{ $form['word'] }} و همهٔ مشتریان. خالی یعنی بی‌حد. کنار حد هر کالا و حدهای دستهٔ مشتری برقرارند و سخت‌ترینِ آن‌ها حکم می‌کند. @if ($family === 'coin') حدها به تعداد سکه است و اعشار پذیرفته نمی‌شود. سقف روزانه جمع تعداد سفارش‌های امروز هر مشتری در هر طرف، در همهٔ سکه‌هاست و هر عدد سکه، هر نوعی که باشد، یکی شمرده می‌شود. @else سقف روزانه جمع وزن سفارش‌های امروز هر مشتری در هر طرف، در همهٔ کالاهای {{ $form['word'] }} است. @endif

@foreach (['trade_min' => 'کمترین مقدار هر معامله', 'trade_max' => 'بیشترین مقدار هر معامله', 'daily_cap' => 'سقف روزانهٔ هر مشتری'] as $limit => $limitLabel) @php($fieldId = $form['prefix'] . $limit)
has($limit)) aria-invalid="true" @endif> @if ($bag->has($limit))

{{ $bag->first($limit) }}

@endif
@endforeach
@endforeach {{-- slice 5ج۱ (PRD §4 «محتوا: پیغام عمومی و مدتش», پ۵-۳, flow ج۷): its own form and error bag, the two fields it renders and nothing else (+PARTIAL-SAVE). no maxlength on the text: a pasted text over the cap is refused with its length, never cut by the browser (+SILENT-DISCARD) --}}
@csrf

پیغام عمومی

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

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

@endif @if ($errors->message->any()) @endif

@switch($general['state']) @case('none') پیغامی نیست مشتریان بالای قیمت‌ها پیغامی نمی‌بینند. @break @case('over') مدتش گذشته این پیغام تا پایان {{ \App\Support\Display::date($general['last_day']) }} نشان داده شد و مشتریان دیگر آن را نمی‌بینند. برای نشان دادن دوباره، «نمایش تا» را عوض یا خالی کنید. @break @default نشان داده می‌شود {{ $general['last_day'] ? 'تا پایان روز ' . \App\Support\Display::date($general['last_day']) . '.' : 'بی‌پایان، تا وقتی آن را پاک کنید.' }} @if ($reach) {{ \App\Support\Display::number($reach[0]) }} از {{ \App\Support\Display::number($reach[1]) }} مشتری آن را دیده و «متوجه شدم» زده‌اند. @endif @endswitch

حداکثر ۱٬۰۰۰ نویسه، متن ساده؛ شکست خط‌ها می‌ماند. هر مشتری آن را یک بار به‌صورت پنجره و از آن پس به‌صورت کادر جمع‌شدنی بالای قیمت‌ها می‌بیند؛ با هر تغییر متن دوباره یک بار پنجره می‌شود. اعضای دسته‌ای که پیام اختصاصی دارد، به‌جای این، پیام دستهٔ خود را می‌بینند. خالی کردن متن پیغام را پاک می‌کند. @if ($errors->message->has('message'))

{{ $errors->message->first('message') }}

@endif
message->has('until')) aria-invalid="true" @endif> آخرین روزی که پیغام نشان داده می‌شود، به شکل سال/ماه/روز؛ تا پایان همان روز به وقت تهران دیده می‌شود. خالی یعنی بی‌پایان. عوض کردن فقط این تاریخ، پیغام را دوباره پنجره نمی‌کند. @if ($errors->message->has('until'))

{{ $errors->message->first('until') }}

@endif
{{-- slice 8 (PRD §2 «پیامک به مشتری», §4; پ۸-۱): one switch and one text per notice, on their own form and error bag. each switch is a list, never a checkbox (an unticked box is not posted and the form only writes what arrived). the preview is the SAVED text with a sample order; on a pattern line the text field is replaced by the reason. no maxlength on a text: a longer one is refused with its length, never cut by the browser (+SILENT-DISCARD) --}}
@csrf

پیامک به مشتری

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

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

@endif @if ($errors->sms->any()) @endif

کد ورود همیشه فرستاده می‌شود و اینجا نیست. هر پیامک دیگر جدا روشن می‌شود و همه در آغاز خاموش‌اند. پیامک پس از کار فرستاده می‌شود و اگر سرویس نپذیرفت، دو بار دیگر امتحان می‌شود؛ نتیجه در گزارش پیامک است.

@foreach ($notices as $purpose => $notice) @php($switch = 'sms_' . $purpose) @php($field = $switch . '_text')
پیامک {{ $notice['label'] }}
@if ($errors->sms->has($switch))

{{ $errors->sms->first($switch) }}

@endif
@if ($notice['pattern'])

متن این پیامک را الگوی تأییدشدهٔ پنل پیامک مظنه تعیین می‌کند و از اینجا عوض نمی‌شود.

@else
حداکثر {{ \App\Support\Display::number(\App\Sms\Notices::TEXT_MAX) }} نویسه. جای‌خالی‌ها: {{ '{' . implode('} {', $notice['placeholders']) . '}' }} @if ($errors->sms->has($field))

{{ $errors->sms->first($field) }}

@endif

مشتری با متن ذخیره‌شده این را می‌خواند ({{ \App\Support\Display::number($notice['parts']) }} پیامک برای هر ارسال):

{{ $notice['preview'] }}

@endif
@endforeach
گزارش پیامک
{{-- slice 9 (flow م۱۲ «حسابداری»): the group lives on its own page — the keys are shown once there, beside the queue --}}

حسابداری

ارسال به حسابداری {{ $accountingPush ? 'روشن' : 'خاموش' }} است. نشانی ارسال، کلید امضا، کلید رابط خواندن و صف رخدادها در صفحهٔ حسابداری‌اند.

حسابداری

با این تنظیم، مثال عددی این می‌شود

خرید طلای آبشده، با قیمت مرجع ۲۶٬۰۸۰٬۰۰۰ تومان و اختلاف فروش ۳۰٬۰۰۰ تومان برای هر گرم ۷۵۰.

وزن
{{ $example['weight'] }}
عیار
{{ $example['purity'] }}
قیمت هر گرم ۷۵۰
{{ $example['price'] }}
مبلغ معامله
{{ $example['amount'] }}
ماندهٔ طلای ۷۵۰
{{ $example['equivalent'] }}
@endsection