@extends('layouts.enterprise')
@section('title', 'Vista previa')
@section('content')
Vista previa
Arma una vista previa desde artículos de solicitudes. Según la configuración del cliente, la compatibilidad puede validarse con reglas RC , con el RC cliente capturado por artículo o con recibos inbound ligados al RC solicitud.
@if(session('ok'))
{{ session('ok') }}
@endif
@unless(($hasSatCatalog ?? false) && ($hasSatItemColumns ?? false))
La columna SAT se activara en cuanto corras las migraciones del catalogo SAT.
@endunless
@if($errors->any())
@foreach($errors->all() as $error)
{{ $error }}
@endforeach
@endif
@php
$pageRoute = request()->routeIs('accountant.*') ? route('accountant.incomes.generate_invoice') : route('admin.incomes.generate_invoice');
$storeRoute = request()->routeIs('accountant.*') ? route('accountant.incomes.generate_invoice.store') : route('admin.incomes.generate_invoice.store');
$printRouteName = request()->routeIs('accountant.*')
? 'accountant.incomes.generate_invoice.print'
: 'admin.incomes.generate_invoice.print';
$issueRouteName = request()->routeIs('accountant.*')
? 'accountant.incomes.generate_invoice.issue'
: 'admin.incomes.generate_invoice.issue';
$destroyRouteName = request()->routeIs('accountant.*')
? 'accountant.incomes.generate_invoice.destroy'
: 'admin.incomes.generate_invoice.destroy';
$historyRoute = request()->routeIs('accountant.*')
? route('accountant.incomes.generated_invoices')
: route('admin.incomes.generated_invoices');
$selectedClient = collect($clients)->firstWhere('id', $selectedClientId);
$hasSatCatalogFeature = (bool) (($hasSatCatalog ?? false) && ($hasSatItemColumns ?? false));
$hasOldItemSelection = session()->hasOldInput('item_ids');
$oldSelectedItemIds = collect(old('item_ids', []))->map(fn ($value) => (int) $value)->values()->all();
$oldItemRcs = old('item_rcs', []);
$oldSelectedSatCatalogItemIds = collect(old('sat_catalog_item_ids', []))
->mapWithKeys(fn ($value, $key) => [(int) $key => (int) $value])
->all();
$defaultAdditionalRequestIds = collect(old('additional_request_ids', ($selectedAdditionalRequestIds ?? collect())->all()))
->map(fn ($value) => (int) $value)
->values();
$defaultRequestOfficeIds = collect(old('request_office_ids', $selectedRequestOfficeIds ?? []))
->mapWithKeys(fn ($value, $key) => [(int) $key => (int) $value])
->filter(fn ($value, $key) => $key > 0 && (int) $value > 0)
->all();
$selectedRequestIdsSummary = collect([$selectedRequest?->id])->filter()->merge($defaultAdditionalRequestIds)->unique()->values();
$savedSelectedItemIds = collect($selectedItems ?? collect())
->pluck('id')
->map(fn ($value) => (int) $value)
->filter(fn ($value) => $value > 0)
->values()
->all();
$savedItemRcs = collect($selectedItems ?? collect())
->filter(fn ($item) => filled($item['item_rc'] ?? null))
->mapWithKeys(fn ($item) => [(int) ($item['id'] ?? 0) => (string) ($item['item_rc'] ?? '')])
->all();
$savedInboundMatches = collect($selectedItems ?? collect())
->filter(fn ($item) => filled($item['matched_inbound'] ?? null))
->mapWithKeys(fn ($item) => [(int) ($item['id'] ?? 0) => $item['matched_inbound']])
->all();
$savedSatCatalogItemIds = collect($selectedItems ?? collect())
->filter(fn ($item) => filled($item['sat_catalog_item_id'] ?? null))
->mapWithKeys(fn ($item) => [(int) ($item['id'] ?? 0) => (int) ($item['sat_catalog_item_id'] ?? 0)])
->all();
$defaultSatCatalogItemId = collect($satCatalogItems ?? collect())->firstWhere('is_default', true)?->id
?: collect($satCatalogItems ?? collect())->firstWhere('is_active', true)?->id;
$draftIssueDate = $currentDraftInvoice?->issue_date ? $currentDraftInvoice->issue_date->format('Y-m-d') : now()->toDateString();
$draftTaxRate = ($currentDraftInvoice && (float) $currentDraftInvoice->subtotal > 0)
? round(((float) $currentDraftInvoice->tax / (float) $currentDraftInvoice->subtotal) * 100, 2)
: 16;
$selectedClientUsesInboundGrouping = $selectedClient
? \App\Support\ClientRequestGrouping::usesInboundReceiptEngine($selectedClient)
: false;
$selectedClientRulesSummary = $selectedClient
? \App\Support\ClientRequestGrouping::configurationSummary($selectedClient)
: null;
$itemColumnCount = $hasSatCatalogFeature ? 11 : 10;
@endphp
1
Agregar solicitudes
Cliente, oficina y solicitudes una a una
2
Captura fiscal
Clave SAT, RC y artículos incluidos
3
Guardar borrador
Notas, fecha e IVA
4
Finalizar vista previa
Generar e imprimir PDF
5
Crear factura
Timbrado en Facturama
@if(!$selectedRequest)
Agregar solicitudes a la agrupación
@endif
@if($selectedRequest)
@if($selectedRequestHasGeneratedInvoice ?? false)
Solicitud ya con vista previa
La solicitud #{{ $selectedRequest->id }} ({{ $selectedRequest->project_name ?: 'Sin PROJECT NAME' }}) ya cuenta con una vista previa guardada.
@if($selectedRequestLatestGeneratedInvoice)
Folio: {{ $selectedRequestLatestGeneratedInvoice->folio }}
Fecha: {{ optional($selectedRequestLatestGeneratedInvoice->issue_date)->format('Y-m-d') ?: '-' }}
Total: ${{ number_format((float) $selectedRequestLatestGeneratedInvoice->total, 2) }}
@if($selectedRequestLatestGeneratedInvoice->facturama_cfdi_id)
Factura creada
@endif
@if(($hasFacturamaPaymentComplementColumns ?? false) && $selectedRequestLatestGeneratedInvoice->facturama_payment_complement_cfdi_id)
Complemento creado
@endif
@if($selectedRequestLatestGeneratedInvoice->id)
Abrir vista previa
@if(($hasFacturamaColumns ?? false) && !$selectedRequestLatestGeneratedInvoice->facturama_cfdi_id)
@elseif(($hasFacturamaColumns ?? false) && $selectedRequestLatestGeneratedInvoice->facturama_cfdi_id)
@if($selectedRequestLatestGeneratedInvoice->facturama_pdf_path)
PDF Facturama
@endif
@if(($hasFacturamaPaymentComplementColumns ?? false) && !$selectedRequestLatestGeneratedInvoice->facturama_payment_complement_cfdi_id)
Registrar pago
@elseif(($hasFacturamaPaymentComplementColumns ?? false) && $selectedRequestLatestGeneratedInvoice->facturama_payment_complement_pdf_path)
PDF complemento
@endif
@endif
@else
PDF no disponible
@endif
@endif
@else
Vista previa en 5 pasos
Solicitud inicial #{{ $selectedRequest->id }} | {{ $selectedRequest->project_name ?: 'Sin PROJECT NAME' }} | JN {{ $selectedRequest->title ?: '-' }} | RC solicitud (Pipefy): {{ $selectedRequest->rc_list ?: '-' }}
@if($currentDraftInvoice)
@csrf
@method('DELETE')
@endif
@endif
@endif
@if(($hasStatusColumn ?? false) && isset($draftInvoices) && $draftInvoices->isNotEmpty())
Borradores activos
Estos borradores ya tienen guardada la información capturada por artículo. Puedes retomarlos para revisar la selección de solicitudes, ajustar RC/SAT y solo al final imprimir la vista previa.
Borrador
Actualizado
Cliente
Solicitudes
Notas internas
Subtotal
Total
Acción
@foreach($draftInvoices as $draftInvoice)
@php
$draftRequests = ($hasGroupingPivot ?? false)
? ($draftInvoice->pipefyRequests ?? collect())
: collect();
if ($draftRequests->isEmpty() && $draftInvoice->pipefyRequest) {
$draftRequests = collect([$draftInvoice->pipefyRequest]);
}
@endphp
Borrador #{{ $draftInvoice->id }}
{{ optional($draftInvoice->updated_at)->format('Y-m-d H:i') ?: '-' }}
{{ $draftInvoice->client?->name ?: '-' }}
{{ $draftRequests->count() }} solicitud(es)
@foreach($draftRequests->take(3) as $draftRequest)
#{{ $draftRequest->id }} | {{ $draftRequest->title ?: '-' }} | RC solicitud (Pipefy): {{ $draftRequest->rc_list ?: '-' }}
@endforeach
@if($draftRequests->count() > 3)
+{{ $draftRequests->count() - 3 }} más
@endif
@if(filled($draftInvoice->notes))
{{ $draftInvoice->notes }}
@else
Sin notas
@endif
${{ number_format((float) $draftInvoice->subtotal, 2) }}
${{ number_format((float) $draftInvoice->total, 2) }}
Continuar borrador
@csrf
@method('DELETE')
Eliminar
@endforeach
@endif
@endsection
@push('styles')
@endpush
@push('scripts')
@endpush