@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())
@foreach($errors->all() as $error)
{{ $error }}
@endforeach
@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
ID
Proveedor
RC
JN
Estatus
Motivo de cancelación
Fecha pago
Comprobante
Acciones
@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
{{ $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)
@if($canMarkPaid)
@endif
Rechazar con motivo
Cancelar
Confirmar rechazo
@if($canUploadProof)
@csrf
Subir comprobante y pagar
@elseif($paymentProof)
Comprobante ya cargado
@else
Disponible después de aprobar
@endif
@else
Solo lectura
@endif
@empty
No hay facturas para mostrar.
@endforelse
{{ $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