@extends('layouts.app') @section('title', 'Cash registers') @section('content')

Cash registers

Tills for walk-in payments, and the shifts run on them.

All shifts
@include('components.kpi', ['label' => 'Registers', 'value' => (string) $totals['registers'], 'variant' => 'info']) @include('components.kpi', ['label' => 'Shifts open now', 'value' => (string) $totals['open'], 'variant' => $totals['open'] ? 'warn' : 'good']) @include('components.kpi', ['label' => 'Net variance (closed)', 'value' => money($totals['variance']), 'variant' => $totals['variance'] < 0 ? 'bad' : 'good'])

Add a register

@csrf
@error('name'){{ $message }}@enderror
@error('opening_balance'){{ $message }}@enderror

How a shift works

Open
Start a shift with a counted float. One open shift per register.
Sync
Pulls the cash payments that user has taken since the shift opened, so expected is float plus takings.
Close
Enter the physical count. Variance = counted − expected.
Variance
Negative means the drawer was short. That is the control figure — it is the only thing that proves the drawer matched the system.

Registers

@if ($registers->isEmpty()) @include('components.empty-state', [ 'icon' => '💰', 'title' => 'No cash registers', 'message' => 'Create a till above to start tracking walk-in cash and shift variances.', ]) @else @foreach ($registers as $register) @php $last = $register->shifts->first(); $open = $last && $last->status === 'open'; @endphp @endforeach
RegisterBranchFloat Last shiftStatusOpen a shift
{{ $register->name }} {{ $register->branch?->name ?: '—' }} {{ money($register->opening_balance) }} @if ($last) {{ $last->opened_at?->format('d M H:i') }} @if ($last->status === 'closed')
variance {{ money($last->variance) }}
@endif @else — @endif
@if ($open) Open @else Closed @endif @if (! $open)
@csrf
@else Go to shift @endif
@csrf @method('DELETE')
@endif
@endsection