@php $money = fn($v, $d = 2) => number_format((float) ($v ?? 0), $d); $date = function($v) { if (!$v) return '—'; try { return ($v instanceof \DateTimeInterface ? \Illuminate\Support\Carbon::instance($v) : \Illuminate\Support\Carbon::parse($v))->format('d/m/Y'); } catch (\Throwable $e) { return '—'; } }; $statusClass = function($status) { $s = function_exists('mb_strtolower') ? mb_strtolower((string) $status, 'UTF-8') : strtolower((string) $status); return str_contains($s, 'liquidado') || str_contains($s, 'aplicado') || str_contains($s, 'pagado') ? 'ok' : (str_contains($s, 'vencido') || str_contains($s, 'cancelado') ? 'bad' : 'blue'); }; $statementRows = collect($statementRows ?? []); $financial = $financial ?? [ 'total' => (float) $account->total_price, 'paid' => (float) $account->paid_amount, 'balance' => max(0, (float) $account->total_price - (float) $account->paid_amount), 'progress' => (float) $account->total_price > 0 ? min(100, (int) round(((float) $account->paid_amount / (float) $account->total_price) * 100)) : 0, ]; $clientName = $clientName ?? $account->client?->name ?? 'Cliente'; $unitLabel = $unitLabel ?? $account->unit_label ?? ('Cuenta #'.$account->id); @endphp
Descargar PDF CSV

{{ $company['brand_name'] ?? $company['name'] }}

{{ $company['brand_subname'] ?? 'Sistema inmobiliario' }}@if(!empty($company['name']) && ($company['name'] !== ($company['brand_name'] ?? null))) · {{ $company['name'] }} @endif
{{ $company['address'] ?: 'Dirección no configurada' }}
Estado de cuenta
Folio EC-{{ str_pad((string) $account->id, 6, '0', STR_PAD_LEFT) }}
Generado: {{ now()->format('d/m/Y H:i') }}
@if(!empty($company['rfc']))
RFC: {{ $company['rfc'] }}
@endif @if(!empty($company['phone']))
Tel: {{ $company['phone'] }}
@endif

Datos del cliente y operación

Cliente
{{ $clientName }}
Teléfono
{{ $account->client?->phone ?: '—' }}
{{-- Celda Correo oculta a peticion --}}
Unidad / inmueble
{{ $unitLabel }}
Ubicación
{{ $account->lote ? ($account->lote->manzana?->project?->name.' · Mz '.$account->lote->manzana?->nombre.' · Lote '.$account->lote->numero) : ($account->property?->location ?: '—') }}
Estado
{{ $account->status ?: '—' }}

Resumen financiero

Precio total
${{ $money($financial['total']) }}
Abonado real
${{ $money($financial['paid']) }}
Saldo pendiente
${{ $money($financial['balance']) }}
Avance
{{ $financial['progress'] }}%
@if((float)($financial['paid'] ?? 0) !== (float)($account->paid_amount ?? 0))
Nota: se detectaron abonos pagados en el plan de pagos que no estaban ligados al historial tradicional de pagos. Se integraron en este estado de cuenta para mostrar el saldo real.
@endif

Historial de movimientos

@forelse($statementRows as $row) @empty @endforelse
FechaConceptoMétodoReferenciaEstadoMontoRecibo
{{ $date($row['date'] ?? null) }} {{ $row['concept'] ?? '—' }}
Origen: {{ $row['source'] ?? '—' }}
{{ $row['method'] ?? '—' }} {{ $row['reference'] ?? '—' }} {{ $row['status'] ?? '—' }} ${{ $money($row['amount'] ?? 0) }} @if(!empty($row['payment_id'])) Ver @elseif(!empty($row['installment_id'])) Ver @else @endif
Sin abonos registrados.
Recibí estado de cuenta
{{ $company['brand_name'] ?? $company['name'] }}
{{ $company['name'] }}{{ !empty($company['rfc']) ? ' · RFC: '.$company['rfc'] : '' }}{{ !empty($company['phone']) ? ' · Tel: '.$company['phone'] : '' }}{{ !empty($company['email']) ? ' · '.$company['email'] : '' }}
Documento administrativo generado por el sistema. Las condiciones finales se rigen por el contrato firmado entre las partes.