@extends('layouts.enterprise') @section('title', 'Aprobacion de facturas') @section('content')

Aprobacion de facturas

Vista completa de revisión para contabilidad.

@if(session('ok'))
{{ session('ok') }}
@endif @if($errors->any())
@endif @php $indexRouteName = $indexRouteName ?? 'accountant.invoices.index'; $statusRouteName = $statusRouteName ?? 'accountant.invoices.status'; $isAdminArea = $isAdminArea ?? false; $hasActiveFilters = (($filters['q'] ?? '') !== '') || (($filters['status'] ?? 'all') !== 'all') || (($filters['from'] ?? '') !== '') || (($filters['to'] ?? '') !== ''); $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

Facturas pendientes de aprobacion

@forelse($invoices as $invoice) @php $invoicePdf = $invoice->files->firstWhere('type', \App\Models\InvoiceFile::TYPE_INVOICE_PDF); $invoiceXml = $invoice->files->firstWhere('type', \App\Models\InvoiceFile::TYPE_INVOICE_XML); $purchaseOrder = $invoice->files->firstWhere('type', \App\Models\InvoiceFile::TYPE_PURCHASE_ORDER); $paymentProof = $invoice->files->firstWhere('type', \App\Models\InvoiceFile::TYPE_PAYMENT_PROOF); $rejectionLog = $invoice->logs->first(); $isRejected = $invoice->status === \App\Models\Invoice::STATUS_REJECTED; $providerMatch = (array) data_get($invoice->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; $statusLockedForAccountant = !$isAdminArea && !in_array( (string) $invoice->status, $accountantEditableStatuses ?? [], true ); @endphp @empty @endforelse
ID Proveedor RC JN Number PROJECT NAME Estatus Motivo de cancelación Fecha factura Fecha pago Total Comprobante Documentos Acciones
{{ $invoice->id }} {{ $invoice->company?->legal_name }} {{ $invoice->rc_number }} {{ $invoice->jn_number ?: ($invoice->pipefyRequest?->title ?: '-') }}
{{ $invoice->pipefyRequest?->project_name ?: '-' }}
Proyecto: {{ $invoice->pipefyRequest?->title ?: ($invoice->jn_number ?: '-') }}
{{ $invoice->status }} @if($isPartialForProvider !== null) @if($isPartialForProvider) Parcial (pendientes {{ $providerPendingAfter }}) @else Completa ({{ $providerCoveredAfter }}/{{ $providerTrackableTotal }}) @endif @endif @if($isRejected) {{ $rejectionLog?->note ?: 'Sin motivo registrado.' }} @else - @endif {{ optional($invoice->invoice_date)->format('Y-m-d') }} {{ $isRejected ? '-' : optional($invoice->payment_date)->format('Y-m-d') }} ${{ number_format((float) $invoice->total, 2) }} @if($isRejected) - @elseif($paymentProof) Ver comprobante @else Sin comprobante @endif @if($invoicePdf) Factura PDF @endif @if($invoiceXml) Factura XML @endif @if($purchaseOrder) OC PDF @endif @if(!$invoicePdf && !$invoiceXml && !$purchaseOrder) Sin archivos @endif
@if($statusLockedForAccountant) Solo admin puede cambiar este estatus @else
@csrf
@csrf
@csrf
Cancelar Confirmar rechazo
@endif
No hay facturas pendientes.
{{ $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