@extends('layouts.seller.app', [ 'page' => $menuSeller['pos']['active'] ?? '', 'sub_page' => $menuSeller['pos']['route']['pos_overview']['sub_active'] ?? '', ]) @section('title', __('labels.pos')) @section('header_data') @php $page_title = __('labels.pos'); $page_pretitle = __('labels.seller') . ' ' . __('labels.pos'); @endphp @endsection @section('seller-content')
@if($stores->isEmpty())

No approved store yet

POS will be available once at least one of your stores is approved and visible.

@else @php $defaultStore = $stores->first(); $posCurrencyCode = strtoupper((string) ($defaultStore->currency_code ?? ($systemSettings['currency'] ?? ''))); $posCurrencyLabel = \App\Support\Currency\CurrencyDisplay::label($posCurrencyCode, $systemSettings['currencySymbol'] ?? null); $posZero = \App\Support\Currency\CurrencyDisplay::zero($posCurrencyCode, $systemSettings['currencySymbol'] ?? null); @endphp {{-- ── Sticky toolbar ── --}}
{{-- Secondary actions (Held / Recent / Display) live in a single dropdown so 4 buttons don't crowd the toolbar on 13–14" laptops. IDs are preserved so existing JS click handlers keep working. --}}
{{-- ── Category chips ── --}}
@foreach($categories as $cat) @endforeach
{{-- ── Product grid ── --}}
{{-- Magnifier-with-dots: universal "searched, nothing found". Reads cleaner than the prior building-store-off icon which looked like sunglasses on small renders. --}}

No products to show

Try a different search or category.

{{-- ── Cart ── --}}

Cart

empty
{{-- Customer chip — visible at all times so the cashier can attach a customer BEFORE ringing up items. Drives the same customerState that the checkout modal's Customer pane reads on open, so the two surfaces stay consistent. --}}
Your cart is empty
Tap a product to add it.
{{-- Subtotal / tax / savings / discount summary block. Hidden when cart is empty. Discount input is the cashier's bill-level adjustment — % or fixed. --}}
Subtotal {{ $posZero }}
{{-- Per-rate tax rows (populated by JS). Tax-inclusive prices are the project default — these rows show what's already baked into the subtotal so the cashier and customer can see "Tax @ 5%: ₹X" instead of an opaque combined number. --}}
You saved {{ $posZero }}
Savings shown here come from the item's special price and are already included in the total.
Discount −{{ $posZero }}
Wallet −{{ $posZero }}
{{-- Promo applied row (separate from cashier discount). --}}
Promo −{{ $posZero }}
Re-validated server-side at checkout.
Cashier discount, capped at the subtotal.
{{-- ── Variant + Addon picker modal ── --}} {{-- ── Checkout modal ── --}} {{-- ── Held sales modal ── --}} {{-- POS confirmation modal --}} {{-- POS hold label modal --}} {{-- ── Recent orders modal ── --}} {{-- ── Quick-attach customer modal ── --}} {{-- ── Refund modal ── --}} {{-- ── Refund history modal (read-only audit trail per order) ── --}} @endif
{{-- @endif --}} @endsection @if(!$stores->isEmpty()) @push('scripts') @php $defaultStore = $stores->first(); $storePaymentConfig = $stores->mapWithKeys(function ($s) { $cfg = $s->pos_payment_config ?? []; return [$s->id => [ 'upi_vpa' => $s->pos_upi_vpa, 'upi_payee_name' => $s->pos_upi_payee_name ?: $s->name, 'currency_code' => $s->currency_code, 'currency_symbol'=> \App\Support\Currency\CurrencyDisplay::label($s->currency_code, $systemSettings['currencySymbol'] ?? null), 'cash' => filter_var($cfg['cash'] ?? true, FILTER_VALIDATE_BOOLEAN), 'upi' => filter_var($cfg['upi'] ?? false, FILTER_VALIDATE_BOOLEAN), 'online_qr' => filter_var($cfg['online_qr'] ?? false, FILTER_VALIDATE_BOOLEAN), 'split' => filter_var($cfg['split'] ?? false, FILTER_VALIDATE_BOOLEAN), 'custom_methods' => collect($cfg['custom_methods'] ?? [])->filter(fn($m) => filter_var($m['enabled'] ?? false, FILTER_VALIDATE_BOOLEAN))->values()->all(), ]]; }); $storeDisplayMeta = $stores->mapWithKeys(fn ($s) => [$s->id => [ 'logo' => $s->store_logo, ]]); @endphp @endpush @endif