@extends('layouts.enterprise') @section('title', 'Facturas Admin') @section('content')

{{ $canManage ? 'Facturas (Admin)' : 'Mis facturas' }}

{{ $canManage ? 'Gestión de estatus y comprobantes de pago.' : 'Consulta de estatus y comprobantes de pago de tus facturas.' }}

@if(session('ok'))
{{ session('ok') }}
@endif @if($errors->any())
@endif @php $hasActiveFilters = (($filters['q'] ?? '') !== '') || (($filters['status'] ?? 'all') !== 'all') || !empty($filters['date_from'] ?? null) || !empty($filters['date_to'] ?? null); $rejectReasonOptions = [ 'RFC inválido o no coincide con el proveedor.', 'RC no existe o no coincide con la solicitud.', 'Monto total no coincide con la solicitud.', 'Conceptos/COD no coinciden con la solicitud.', 'XML inválido o estructura incorrecta.', 'Faltan documentos obligatorios (PDF/XML/OC).', 'Datos fiscales incompletos o incorrectos.', 'Factura duplicada.', ]; @endphp
Filtros @if($hasActiveFilters) Activos @endif
Limpiar Resultados: {{ $invoices->total() }}
@forelse($invoices as $inv) @php $paymentProof = $inv->files->first(); $rejectionLog = $inv->logs->first(); $isRejected = $inv->status === \App\Models\Invoice::STATUS_REJECTED; $providerMatch = (array) data_get($inv->pipefy_payload, 'provider_match', []); $providerTrackableTotal = (int) ($providerMatch['provider_trackable_items_total'] ?? 0); $providerCoveredAfter = (int) ($providerMatch['provider_items_covered_after'] ?? 0); $providerPendingAfter = (int) ($providerMatch['provider_items_pending_after'] ?? max($providerTrackableTotal - $providerCoveredAfter, 0)); $isPartialForProvider = $providerTrackableTotal > 0 ? (bool) ($providerMatch['is_partial_for_provider'] ?? false) : null; $canUploadProof = in_array($inv->status, [ \App\Models\Invoice::STATUS_APPROVED, \App\Models\Invoice::STATUS_SCHEDULED, \App\Models\Invoice::STATUS_PAID, ], true) && !$paymentProof; $canMarkPaid = in_array($inv->status, [ \App\Models\Invoice::STATUS_APPROVED, \App\Models\Invoice::STATUS_SCHEDULED, ], true) && $paymentProof; $statusOptions = array_values(array_filter( \App\Models\Invoice::STATUSES, fn ($status) => !in_array($status, [ \App\Models\Invoice::STATUS_REJECTED, \App\Models\Invoice::STATUS_PAID, ], true) )); @endphp @empty @endforelse
ID Proveedor RC JN Estatus Motivo de cancelación Fecha pago Comprobante Acciones
{{ $inv->id }} {{ $inv->company?->legal_name }} {{ $inv->rc_number }} {{ $inv->pipefyRequest?->title ?: ($inv->jn_number ?: '-') }} @if($inv->pipefyRequest?->project_name)
{{ $inv->pipefyRequest->project_name }} @endif
{{ $inv->status }} @if($isPartialForProvider !== null) @if($isPartialForProvider) Parcial (pendientes {{ $providerPendingAfter }}) @else Completa ({{ $providerCoveredAfter }}/{{ $providerTrackableTotal }}) @endif @endif @if($isRejected) {{ $rejectionLog?->note ?: 'Sin motivo registrado.' }} @else - @endif {{ $isRejected ? '-' : optional($inv->payment_date)->format('Y-m-d') }} @if($isRejected) - @elseif($paymentProof) Ver comprobante @else Sin comprobante @endif @if($canManage)
@csrf
@if($canMarkPaid)
@csrf
@endif
@csrf
Cancelar Confirmar rechazo
@if($canUploadProof)
@csrf
@elseif($paymentProof) Comprobante ya cargado @else Disponible después de aprobar @endif @else Solo lectura @endif
No hay facturas para mostrar.
{{ $invoices->onEachSide(1)->links('vendor.pagination.enterprise') }}
@endsection @push('scripts') @if($errors->any() && old('status') === \App\Models\Invoice::STATUS_REJECTED && old('reject_invoice_id')) @endif @endpush @push('styles') @endpush