@extends('layouts.app') @section('title','Payroll') @section('content') @if($page==='overview')
@foreach($stats as $label=>$count)
{{ $label }}{{ $count }}
@endforeach
@elseif(in_array($page,['runs','wps'])) @if($page==='runs')@can('payroll.manage')Create Payroll Run@endcan @else

SIF downloads require released payroll, independently approved payee details and a validated WPS profile. Files are generated on demand.

WPS profilesBank details
@endif
@forelse($runs as $run)@empty@endforelse
MonthStatusGrossDeductionsNetActions
{{ $run->period }}{{ $run->status }}{{ \App\Domain\Payroll\Money::format($run->gross_cents) }}{{ \App\Domain\Payroll\Money::format($run->deduction_cents) }}{{ $run->currency }} {{ \App\Domain\Payroll\Money::format($run->net_cents) }}View / Actions@if($page==='wps' && $run->status==='released')@can('payroll.export') Generate SIF@endcan @endif
No matching payroll runs.
@if($page==='wps')

SIF generation audit

@forelse($exports as $event)

{{ $event->created_at }} · {{ $event->subject }} · {{ $event->metadata['format'] ?? '' }}

@empty

No recorded SIF exports.

@endforelse
@endif @elseif(in_array($page,['components','allowances']))@can('payroll.manage')Add component version@endcan @php($componentRows=\App\Support\ListView::rows($components,'salary_components'))

Allowances & deductions

Dated recurring compensation components

@foreach($componentRows as $component)@endforeach
EmployeeCodeKindMonthly amountEffective
{{ $component->employee?->full_name }}
{{ $component->employee?->employee_number }}
{{ $component->code }}{{ ucfirst($component->kind) }}{{ $component->currency }} {{ \App\Domain\Payroll\Money::format($component->amount_cents) }}{{ $component->effective_on->format('d M Y') }}

Components are employee-specific dated versions. Post a zero-amount version to stop one; use approved requests for one-off adjustments.

@can('requests.view')Financial requests@endcan @elseif($page==='policies')@can('payroll.manage')Create dated policy@endcan @php($policyRows=\App\Support\ListView::rows($policies,'payroll_policies'))

Payroll policy history

Effective company rules, preserved by version

@foreach($policyRows as $policy)@endforeach
PolicyEffectiveCurrencyHours divisorAttendanceValidation reference
{{ $policy->name }}{{ $policy->effective_on->format('d M Y') }}{{ $policy->currency }}{{ $policy->monthly_hours }}{{ $policy->attendance_required?'Required':'Optional' }}{{ $policy->jurisdiction_note }}
@elseif($page==='profiles')@can('payroll.manage')Submit WPS profile@endcan
@php($listprofiles=\App\Support\ListView::rows($profiles,'wps_profiles'))@foreach($listprofiles as $profile)

{{ $profile->format_version }} · {{ $profile->status }}

{{ $profile->validation_reference }}

Review bank-validation evidence@can('payroll.approve')@if($profile->status==='pending')
@csrf
@endif @endcan
@endforeach
@elseif($page==='bank-details')@can('payroll.manage')Enter bank details@endcan
@php($listpayees=\App\Support\ListView::rows($payees,'payroll_payees'))@foreach($listpayees as $payee)

{{ $payee->employee->employee_number }} · Account ending {{ substr($payee->details['account'],-4) }} · {{ $payee->status }}

@can('payroll.approve')@if($payee->status==='pending')
Review full submitted bank details

Employee WPS ID: {{ $payee->details['employee_wps_id'] }} · Agent: {{ $payee->details['routing_code'] }}

Account: {{ $payee->details['account'] }} · {{ $payee->details['account_kind'] }}

@csrf
@endif @endcan
@endforeach
@elseif($page==='settlement')Back to settlements

{{ $settlement->employee->employee_number }} · Settlement #{{ $settlement->id }} / revision {{ $settlement->revision }} · {{ $settlement->status }}

{{ $settlement->basis }}

@foreach($settlement->lines as $line)@endforeach
ComponentKindAmount
{{ $line['code'] }}{{ $line['kind'] }}{{ \App\Domain\Payroll\Money::format($line['cents']) }}
Net settlement{{ $settlement->currency }}{{ \App\Domain\Payroll\Money::format($settlement->net_cents) }}
@can('payroll.approve')@if($settlement->status==='pending')@include('operations.decision',['action'=>$base.'/payroll/settlements/'.$settlement->id.'/decide'])@endif @endcan @if($settlement->decision_note)

{{ $settlement->decision_note }}

@endif @can('payroll.manage')@if($settlement->status==='approved')
@csrf@endif @endcan @if($settlement->payment_reference)

Payment reference: {{ $settlement->payment_reference }}

@endif
@elseif(in_array($page,['settlements','payments'])) @if($page==='payments')

Verified external payment references recorded on final settlements. This register does not represent general payment reconciliation or initiate payments.

@else @can('payroll.manage')Prepare final settlement@endcan @endif
@forelse($settlements as $settlement)@empty@endforelse
EmployeeStatusRevisionNetPayment referenceActions
{{ $settlement->employee?->full_name }}{{ $settlement->status }}{{ $settlement->revision }}{{ $settlement->currency }} {{ \App\Domain\Payroll\Money::format($settlement->net_cents) }}{{ $settlement->payment_reference ?? 'Not recorded' }}View / Actions
No matching settlements.
@elseif($page==='salaries')
@forelse($employees as $employee)@empty@endforelse
EmployeeActions
{{ $employee->employee_number }} · {{ $employee->full_name }}Salary details & history
No permitted employees.
@elseif($page==='salary')Back to salaries
@forelse($employee->contracts->sortByDesc('starts_on') as $contract)@empty@endforelse
ContractStartsEndsSalary
{{ $contract->reference }}{{ $contract->starts_on?->toDateString() }}{{ $contract->ends_on?->toDateString() }}{{ $contract->currency }} {{ $contract->salary }}
No contract salary recorded.
@php($componentRows=\App\Support\ListView::rows($components,'salary_components'))

Allowances & deductions

Dated recurring compensation components

@foreach($componentRows as $component)@endforeach
EmployeeCodeKindMonthly amountEffective
{{ $component->employee?->full_name }}
{{ $component->employee?->employee_number }}
{{ $component->code }}{{ ucfirst($component->kind) }}{{ $component->currency }} {{ \App\Domain\Payroll\Money::format($component->amount_cents) }}{{ $component->effective_on->format('d M Y') }}
@elseif($page==='payslips')
@forelse($items as $item)@empty@endforelse
EmployeePeriodNetActions
{{ $item->employee?->full_name }}{{ $item->run?->period }}{{ $item->run?->currency }} {{ \App\Domain\Payroll\Money::format($item->net_cents) }}View / Print payslip
No released payslips.
@elseif($page==='adjustments')

Existing approved attendance overtime is included by payroll calculation. Financial requests retain their independent approval workflow.

@forelse($requests as $request)@empty@endforelse
EmployeeKindStatusEffective
{{ $request->employee?->full_name }}{{ $request->kind }}{{ $request->status }}{{ $request->effective_on?->toDateString() }}
No financial requests.
@can('requests.view')Open financial requests@endcan @elseif($page==='settings')

Existing payroll configuration

Policies retain existing hours, overtime, attendance, absence, tax and pension settings. Independent approval requirements remain in force.

@elseif($page==='reports')

Payroll registers

Open a register to filter and preview existing records. Payslip print and authorized SIF generation retain their existing formats.

@foreach(['runs'=>'Run summary','salaries'=>'Salary history','components'=>'Component history','payslips'=>'Released payslips','payments'=>'Settlement payments'] as $path=>$label){{ $label }}@endforeach
@endif @endsection