{{-- New-Unity ERP | Modules/Billing/Resources/Views/Mexico/invoices/form.blade.php | v3.10 | 05/08/2026 --}} {{-- v3.10 — FIX 2: botón "Editar domicilio" junto al selector de dirección del cliente. Modal #modal-editar-domicilio con AJAX GET/PUT a /sales/customers/{id}/addresses/{id}. Refresca el select de domicilios automáticamente al guardar. --}} {{-- v3.1 — Elimina el modal de clientes INLINE duplicado (id customers-modal repetido); ahora solo vive en el partial modal_customers (v1.1). v3.0 — Botón de edición de datos fiscales del cliente (modal AJAX sin salir de la factura) + variable CsrfToken para los guardados por AJAX. v2.9 — Markup del modal de clientes (#customers-modal) agregado. v2.8 — Campo Company por MODAL propio de clientes (sin select2): input readonly + botón de búsqueda + hidden customer_id (#selCustomerInvoice). Se eliminan los includes de select2 (css/js). v2.7 — JS del módulo servido desde public/modules/billing/ (patrón publishes() del BillingServiceProvider v1.1). Fuente en Resources/Assets/Js del módulo. v2.5 — Scripts: variables (AppUrl, taxObjects, etc.) declaradas ANTES de los includes; select2 css+js agregados; app.billing.js removido (es del índice). v2.4 — Botonera de productos en tercios (Manual Concept centrado exacto). v2.3 — Distribución de Israel: Pay Conditions, Account Number y Observations (ahora textarea) se mueven debajo de la tabla de productos, a la izquierda del bloque de totales. Título Add Products centrado. v2.2 — Totales compactos alineados a la derecha. IDs/names intactos. --}} {{-- v2.1 — Layout compacto: campos cortos reducidos (Number/Date/Stamps/Serie/ Credit Days/Expiration en una sola fila), inputs y selects en tamaño sm, gutters g-2 y márgenes reducidos para un formulario unificado. v2.0 — Refactory completo al diseño New-Unity (BS5, sin App\classes\Form, emisor desde BillingContributor, IDs/names intactos para app.invoice.js) --}} @extends('layouts.vertical') @section('content') @php // Helper local: valor del campo → old() > $row > default $val = fn($field, $default = '') => old($field, $row->{$field} ?? $default); $isEdit = isset($row) && $row && empty($documentId); $isInvoice = Request::segment(1) == 'invoices'; $hasOld = session()->hasOldInput(); $formTitle = $isEdit ? ($isInvoice ? __('invoices.editinvoice') : __('invoices.newcreditnote')) : ($isInvoice ? __('invoices.newinvoice') : __('invoices.newcreditnote')); $formRoute = $isInvoice ? ($isEdit ? route('invoices.update', $row->id) : route('invoices.store')) : ($isEdit ? route('egresos.update', $row->id) : route('egresos.store')); $defaultSerie = $isInvoice ? ($contributor->serie_i ?? '') : ($contributor->serie_e ?? ''); @endphp {{-- Estilos tabla de partidas --}}
{{-- Page Header --}}

{{ $formTitle }}

CFDI 4.0 — {{ $contributor->test_mode ? 'TEST MODE' : 'Production' }}

{{-- Breadcrumbs --}} {{-- Alert: sin timbres o error PAC (null = PAC no consultado al cargar el formulario → no mostrar) --}} @if($availableRfc !== null || ($availableStamps !== null && $availableStamps <= 0)) @endif {{-- Main Card --}}
{{ $formTitle }}
@csrf @if($isEdit) @method('PUT') @endif {{-- Errores de validación front (los llena el JS) --}} {{-- Errores de validación back --}} @if ($errors->any()) @endif {{-- ════════ Section: General Information ════════ --}}
{{ __('invoices.generalinfo') }}

{{-- Fila 1: cliente (prioridad) + campos cortos --}}
{{-- Fila 2: dirección y datos del cliente --}}
{{-- Fila 3: datos fiscales CFDI (prioridad) --}}
{{-- ════════ Section: Additional Data (collapsible) ════════ --}}
{{ __('invoices.additional-data') }}

{{-- ════════ Section: Related CFDIs (collapsible) ════════ --}}
{{ __('invoices.related_payment_documents') }}

@foreach($hasOld ? old('relas', []) : $relas as $idx => $rela) @include('billing::Mexico.invoices.partials.create.cfdi_relacionados', ['empty' => 0]) @endforeach
{{-- ════════ Section: Products ════════ --}}
{{ __('invoices.addproducts') }}

{{-- Manual concept form (collapsible) --}}

{{ __('invoices.manual_concept') }}

{{-- Products table --}}
@foreach($products as $nKey => $product) @endforeach
Code Qty SAT Unit {{ __('invoices.product_name') }} {{ __('invoices.tax_object') }} {{ __('invoices.unitprice') }} {{ __('invoices.discountpercent') }} Total
product_id ? 'id="Code_' . $product->product_id . '"' : '' !!} value="{{ $product->product_id }}"> {{ $product->product_id ?: 'N/A' }} {{ $product->quantity }} {{ $product->tax_code }} {{ $product->unity }} {{ $product->product_name }}
{{ $product->tax_object ?? '02' }}
{{ number_format($product->amount, 2, '.', ',') }}
{{-- ════════ Footer: datos de pago + totales ════════ --}}
{{-- Currency + Exchange Rate --}}
{{ __('invoices.currency') }}
{{ __('invoices.exchange_rate') }}
{{-- Sub Total --}}
{{ __('invoices.subtotal') }}
{{ $currency->symbol }}
{{-- Discount --}}
{{ __('invoices.discount') }}
{{ $currency->symbol }}
{{-- Tax (IVA configurable) --}}
IVA
%
{{ $currency->symbol }}
{{-- Total --}}
{{ __('invoices.total') }}
{{ $currency->symbol }}
{{-- Form actions --}}
{{ __('buttons.cancel') }}
{{-- Modal: buscador de productos (lo inyecta el JS) --}}
@include('billing::Mexico.invoices.partials.create.modal_valid_products') @include('billing::Mexico.invoices.partials.create.modal_customers') @include('billing::Mexico.invoices.partials.create.modal_customer_fiscal')
@include('billing::Mexico.invoices.partials.create.cfdi_relacionados', ['empty' => 1, 'idx' => '{idx}'])
{{-- Modal: Editar domicilio del cliente --}}
@endsection @section('scripts') {{-- Variables ANTES de los includes: los plugins las leen al inicializar --}} @endsection