@extends('layouts.dashboard') @section('title', trans('dashboard.inv_detail_title', ['number' => $invoice->invoice_number])) @section('header_title', trans('dashboard.invoice_details')) @php $typeValue = $invoice->type instanceof \App\Enums\InvoiceType ? $invoice->type->value : (string) $invoice->type; $isNote = in_array($typeValue, ['credit_note', 'debit_note'], true); $canIssueNotes = in_array($statusValue, ['cleared', 'reported'], true) && ! $isNote; $sellerAddress = array_filter([ $seller['street'], $seller['building'] ? trans('dashboard.building_number').' '.$seller['building'] : null, $seller['district'], $seller['city'], ]); $buyerAddress = array_filter([$buyer['street'], $buyer['city']]); $statusBadge = match ($statusValue) { 'cleared' => ['label' => trans('dashboard.cleared_by_zatca'), 'class' => 'text-emerald-700 dark:text-emerald-400', 'dot' => 'bg-emerald-600 dark:bg-emerald-400'], 'reported' => ['label' => trans('dashboard.reported_to_zatca'), 'class' => 'text-sky-700 dark:text-sky-400', 'dot' => 'bg-sky-600 dark:bg-sky-400'], 'rejected' => ['label' => trans('dashboard.rejected'), 'class' => 'text-rose-700 dark:text-rose-400', 'dot' => 'bg-rose-600 dark:bg-rose-400'], 'pending' => ['label' => trans('dashboard.pending'), 'class' => 'text-blue-700 dark:text-blue-400', 'dot' => 'bg-blue-600 dark:bg-blue-400 animate-pulse'], 'draft' => ['label' => trans('dashboard.draft'), 'class' => 'text-slate-600 dark:text-slate-400', 'dot' => 'bg-slate-500'], 'failed' => ['label' => trans('dashboard.failed'), 'class' => 'text-amber-700 dark:text-amber-400', 'dot' => 'bg-amber-600 dark:bg-amber-400'], 'cancelled' => ['label' => trans('dashboard.cancelled'), 'class' => 'text-slate-600 dark:text-slate-400', 'dot' => 'bg-slate-500'], default => ['label' => $invoice->status instanceof \App\Enums\InvoiceStatus ? $invoice->status->label() : trans('dashboard.no_data_available'), 'class' => 'text-amber-700 dark:text-amber-400', 'dot' => 'bg-amber-600 dark:bg-amber-400'], }; $toneClass = fn (string $tone) => match ($tone) { 'success' => 'bg-emerald-500', 'danger' => 'bg-red-500', default => 'bg-slate-600', }; $vatSummaryLabel = $vatRates->count() === 1 ? trans('dashboard.vat_with_rate', ['rate' => rtrim(rtrim(number_format((float) $vatRates->first(), 2, '.', ''), '0'), '.')]) : trans('dashboard.vat_amount'); @endphp @push('styles') @endpush @section('content')
{{ trans('dashboard.back_to_invoices') }} / {{ trans('dashboard.invoices_list') }} / {{ $invoice->invoice_number }} {{ $statusBadge['label'] }}
{{ $environmentLabel }}
@if($canIssueNotes) {{ trans('dashboard.debit_note') }} {{ trans('dashboard.credit_note') }} @endif @if($statusValue === 'draft')
@csrf
@endif {{ trans('dashboard.new_invoice') }} @if(filled($invoice->signed_xml)) {{ trans('dashboard.download_xml') }} @endif {{ trans('dashboard.download_pdf') }}
@if($canIssueNotes) @endif
@if($qrPng) {{ trans('dashboard.qr_code') }} @else
{{ trans('dashboard.no_qr_code') }}
@endif

{{ $typeLabel }}

{{ trans('dashboard.invoice_number') }}: {{ $invoice->invoice_number }}
{{ trans('dashboard.invoice_uuid') }}: {{ $invoice->uuid }}
{{ trans('dashboard.issue_date') }}: {{ $issueDate ?? trans('dashboard.not_available') }} @if($supplyDate) {{ trans('dashboard.supply_date') }}: {{ $supplyDate }} @endif @if($dueDate) {{ trans('dashboard.due_date') }}: {{ $dueDate }} @endif

{{ trans('dashboard.buyer') }}

{{ $buyer['name'] }}

@if($buyer['vat'])

{{ trans('dashboard.vat_registration_number') }}: {{ $buyer['vat'] }}

@endif @if($buyer['cr'])

{{ trans('dashboard.commercial_registration_number') }}: {{ $buyer['cr'] }}

@endif @if($buyerAddress)

{{ implode(' - ', $buyerAddress) }}

@endif @if($buyer['postal_code'])

{{ trans('dashboard.postal_code') }}: {{ $buyer['postal_code'] }}

@endif

{{ trans('dashboard.seller') }}

{{ $seller['name'] }}

@if($seller['vat'])

{{ trans('dashboard.vat_registration_number') }}: {{ $seller['vat'] }}

@endif @if($seller['cr'])

{{ trans('dashboard.commercial_registration_number') }}: {{ $seller['cr'] }}

@endif @if($sellerAddress)

{{ implode(' - ', $sellerAddress) }}

@endif @if($seller['postal_code'])

{{ trans('dashboard.postal_code') }}: {{ $seller['postal_code'] }}

@endif
@forelse($lineRows as $line) @empty @endforelse
{{ trans('dashboard.description') }} {{ trans('dashboard.quantity') }} {{ trans('dashboard.unit_price') }} {{ trans('dashboard.discount') }} {{ trans('dashboard.taxable_amount') }} {{ trans('dashboard.vat_rate') }} {{ trans('dashboard.vat_amount') }} {{ trans('dashboard.total_including_vat') }}
{{ $line['name'] }} {{ $line['quantity'] }} {{ number_format($line['unit_price'], 2) }} {{ number_format($line['discount'], 2) }} {{ number_format($line['taxable'], 2) }} {{ number_format($line['vat_rate'], 0) }}% {{ number_format($line['vat_amount'], 2) }} {{ number_format($line['total'], 2) }}
{{ trans('dashboard.no_line_items') }}
{{ trans('dashboard.total_before_vat') }} {{ number_format($invoice->subtotal, 2) }}
{{ $vatSummaryLabel }} {{ number_format($invoice->vat_amount, 2) }}
{{ trans('dashboard.total_including_vat') }} {{ number_format($invoice->total, 2) }}

{{ trans('dashboard.invoice_timeline') }}

@if($timelineEvents === [])

{{ trans('dashboard.no_data_available') }}

@else
    @foreach($timelineEvents as $event)
  1. {{ $event['label'] }}

    @if($event['at'])

    {{ $event['at'] }}

    @endif
  2. @endforeach
@endif

{{ trans('dashboard.zatca_information') }}

@foreach([ ['label' => trans('dashboard.invoice_uuid'), 'value' => $invoice->uuid], ['label' => trans('dashboard.invoice_hash'), 'value' => $invoice->invoice_hash], ['label' => trans('dashboard.previous_invoice_hash'), 'value' => $invoice->previous_invoice_hash], ] as $copyRow)
{{ $copyRow['label'] }} @if(filled($copyRow['value']))
{{ $copyRow['value'] }}
@else {{ trans('dashboard.not_available') }} @endif
@endforeach
{{ trans('dashboard.invoice_counter_value') }} {{ is_null($invoice->invoice_counter) ? trans('dashboard.not_available') : $invoice->invoice_counter }}
{{ trans('dashboard.submission_type') }} {{ $submissionType }}
{{ trans('dashboard.zatca_status') }} {{ $statusBadge['label'] }}
@if($invoice->originalInvoice)
{{ trans('dashboard.original_invoice') }} {{ $invoice->originalInvoice->invoice_number }}
@endif @if($validationErrors !== [])
{{ trans('dashboard.validation_errors') }}
    @foreach($validationErrors as $error)
  • {{ $error }}
  • @endforeach
@endif @if($validationWarnings !== [])
{{ trans('dashboard.validation_warnings') }}
    @foreach($validationWarnings as $warning)
  • {{ $warning }}
  • @endforeach
@endif

{{ trans('dashboard.related_documents') }}

@if($relatedDocuments->isEmpty() && ! $invoice->originalInvoice)

{{ trans('dashboard.no_related_documents') }}

@else
    @if($invoice->originalInvoice)
  • {{ $invoice->originalInvoice->invoice_number }} {{ trans('dashboard.original_invoice') }}
  • @endif @foreach($relatedDocuments as $document) @php $documentStatus = $document->status instanceof \App\Enums\InvoiceStatus ? $document->status : \App\Enums\InvoiceStatus::tryFrom((string) $document->status); $documentType = $document->type instanceof \App\Enums\InvoiceType ? $document->type : \App\Enums\InvoiceType::tryFrom((string) $document->type); @endphp
  • {{ $document->invoice_number }} {{ $documentType?->label() ?? trans('dashboard.related_documents') }}
    {{ $documentStatus?->label() ?? trans('dashboard.no_data_available') }}
  • @endforeach
@endif
@endsection