@php use App\Support\InvoiceDomain; $ledgerSimulationStatuses = [ 'Invoice approved.', 'Invoice paid from mandate earnings.', 'Payment request submitted. Company treasury will process settlement.', 'Reimbursement claim approved and posted.', ]; $suppressPayablesLedgerSim = session('status') && in_array(session('status'), $ledgerSimulationStatuses, true); $statusLabel = static function (string $status): string { return match ($status) { 'received' => 'Pending', 'under_review' => 'Processing', 'approved' => 'Approved · ready to pay', 'payment_requested' => 'Processing', 'treasury_settlement_pending' => 'Processing', 'partially_paid' => 'Processing', 'scheduled' => 'Scheduled', 'overdue' => 'Restricted', 'paid' => 'Paid', 'disputed' => 'Restricted', default => ucfirst(str_replace('_', ' ', $status)), }; }; $invoiceActionLabel = static function (array $row): string { if (! empty($row['can_pay_earnings'])) { return 'Pay invoice'; } if (! empty($row['can_submit_operational_request'])) { return 'Submit payment request'; } if (! empty($row['can_approve'])) { return 'Approve for settlement'; } return 'View status'; }; $invoiceRows = $operationalInvoices->concat($earningsInvoices)->map(function ($i) use ($statusLabel): array { $meta = $i->meta ?? []; $issuer = $meta['issuer_display'] ?? $i->counterparty?->name ?? '—'; $categoryLabel = $meta['category_label'] ?? ucwords(str_replace('_', ' ', (string) $i->category)); return [ 'id' => $i->id, 'invoice_number' => $i->invoice_number, 'invoice_domain' => $i->invoice_domain, 'domain_label' => InvoiceDomain::label($i->invoice_domain), 'issuer' => $issuer, 'category_label' => $categoryLabel, 'category_code' => $i->category, 'amount' => round((float) $i->amount, 2), 'status' => $i->status, 'status_label' => $statusLabel($i->status), 'is_paid' => $i->status === 'paid', 'due_date' => $i->due_date?->format('Y-m-d'), 'can_approve' => in_array($i->status, ['received', 'under_review'], true), 'can_pay_earnings' => $i->invoice_domain === InvoiceDomain::EARNINGS_PAYABLE && in_array($i->status, ['approved', 'scheduled', 'overdue'], true), 'can_submit_operational_request' => $i->invoice_domain === InvoiceDomain::OPERATIONAL_PAYABLE && $i->status === 'approved', 'approve_url' => route('invoices.approve', $i), 'pay_url' => route('invoices.pay', $i), 'submit_payment_request_url' => route('invoices.submit-payment-request', $i), ]; })->values()->all(); @endphp @include('partials.html-root-open') @include('partials.head-meta', ['pageTitle' => 'Invoice queue']) @include('partials.ledger-settlement-simulation-script') @include('partials.desktop-required-notice') @include('partials.workspace-lg-only-wrap-start') @include('partials.activity-drawer')
@include('partials.workspace-shell-operator-chrome')
@include('partials.control-preview-shell-banner')

Invoice queue

Operational and earnings-domain invoices. Complete actions here; use Task queue when the same invoice is listed there.

Showing

@include('partials.stripe-powered-financial-rail', ['class' => 'max-w-xl']) @if (session('status') && ! $suppressPayablesLedgerSim)

{{ session('status') }}

@endif @if ($errors->has('invoice'))

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

@endif

Operational / company payables

Request company treasury settlement. Does not debit mandate earnings allocation.

@forelse($operationalInvoices as $invoice) @php $badge = \App\Support\InvoiceDomain::label($invoice->invoice_domain); $badgeClass = 'bg-slate-50 text-slate-800 border-slate-200'; $inTaskQueue = ! empty($taskQueueInvoiceIds[$invoice->id]); $actionLabel = $invoiceActionLabel([ 'id' => $invoice->id, 'can_pay_earnings' => false, 'can_submit_operational_request' => $invoice->status === 'approved', 'can_approve' => in_array($invoice->status, ['received', 'under_review'], true), ]); @endphp
{{ $badge }}

{{ $invoice->invoice_number }}

{{ strtoupper($invoice->category) }} · {{ strtoupper($invoice->status) }}

{{ $invoice->counterparty?->name ?? (data_get($invoice->meta, 'issuer_display') ?? '—') }} · Due {{ $invoice->due_date?->format('Y-m-d') }}

@unless($inTaskQueue)

Not listed in Task queue for this status — complete the action on this page.

@endunless

${{ number_format((float) $invoice->amount, 2) }}

{{ $statusLabel($invoice->status) }}

@if($inTaskQueue) Open in task queue @endif
@empty

No operational invoices in queue.

@endforelse

Earnings-domain payables

Debit mandate earnings when processed. Affects withdrawable balance and settlement history.

@forelse($earningsInvoices as $invoice) @php $badge = \App\Support\InvoiceDomain::label($invoice->invoice_domain); $badgeClass = 'bg-violet-50 text-violet-800 border-violet-200'; $inTaskQueue = ! empty($taskQueueInvoiceIds[$invoice->id]); $actionLabel = $invoiceActionLabel([ 'id' => $invoice->id, 'can_pay_earnings' => in_array($invoice->status, ['approved', 'scheduled', 'overdue'], true), 'can_submit_operational_request' => false, 'can_approve' => in_array($invoice->status, ['received', 'under_review'], true), ]); @endphp
{{ $badge }}

{{ $invoice->invoice_number }}

{{ strtoupper($invoice->category) }} · {{ strtoupper($invoice->status) }}

{{ $invoice->counterparty?->name ?? (data_get($invoice->meta, 'issuer_display') ?? '—') }} · Due {{ $invoice->due_date?->format('Y-m-d') }}

@unless($inTaskQueue)

Not listed in Task queue for this status — complete the action on this page.

@endunless

${{ number_format((float) $invoice->amount, 2) }}

{{ $statusLabel($invoice->status) }}

@if($inTaskQueue) Open in task queue @endif
@empty

No earnings-domain invoices in queue.

@endforelse
@include('partials.task-queue-dialog') @include('partials.task-queue-ledger-simulation-overlay')
@include('partials.workspace-lg-only-wrap-end') @include('partials.task-queue-workspace-script')