@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')
@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')