@extends('layouts.enterprise') @section('title', 'Detalle email inbound') @section('content') @php $isAccountant = request()->routeIs('accountant.*'); $detailTitle = $email->subject ?: 'Correo inbound #'.$email->id; $prettyPayload = json_encode($email->raw_payload ?? [], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); $currencySummary = collect([$email->currency_code, $email->payment_terms])->filter()->implode(' - '); $serviceSummary = collect([$email->service_month, $email->service_year])->filter()->implode(' / '); $usageStatus = (string) (($usageSummary['status'] ?? 'available')); $usageFolios = collect($usageSummary['folios'] ?? [])->filter()->values(); $usageJns = collect($usageSummary['jns'] ?? [])->filter()->values(); $groupingPreview = (array) ($groupingPreview ?? []); $linkedGeneratedInvoices = $email->items ->map(fn ($item) => $item->generatedInvoiceItem?->generatedInvoice) ->filter() ->unique('id') ->values(); $suggestionRouteName = $isAccountant ? 'accountant.incomes.emails.items.suggestion' : 'admin.incomes.emails.items.suggestion'; $printRouteName = $isAccountant ? 'accountant.incomes.generate_invoice.print' : 'admin.incomes.generate_invoice.print'; $destroyRoute = $isAccountant ? route('accountant.incomes.emails.destroy', $email) : route('admin.incomes.emails.destroy', $email); @endphp
Volver a Emails

{{ $detailTitle }}

Revisa el correo inbound parseado, sus líneas y los datos que podrán servir para amarrar agrupaciones reales.

{{ strtoupper($email->parse_status ?? 'pending') }} {{ $groupableSiblings->isNotEmpty() ? 'Grupo operativo detectado' : 'Sin grupo operativo' }} {{ $usageSummary['label'] ?? 'Disponible' }}
@csrf @method('DELETE') Eliminar
@if($email->parse_notes)
{{ $email->parse_notes }}
@endif

Correo inbound

Recibido
{{ optional($email->received_at)->format('Y-m-d H:i:s') ?: '-' }}
De
{{ $email->sender_name ?: '-' }} <{{ $email->sender_email ?: '-' }}>
Para
{{ $email->recipient_email ?: '-' }}
Tracking
{{ $email->tracking_id ?: '-' }}
Message ID
{{ $email->message_id ?: '-' }}
References
{{ $email->message_references ?: '-' }}

Datos mapeados

Cliente
{{ $email->client?->name ?: ($email->client_name ?: '-') }}
RFC cliente
{{ $email->client_rfc ?: '-' }}
Cliente ERP
{{ $email->client ? $email->client->name.' ('.$email->client->rfc.')' : 'Sin match' }}
Proveedor
{{ $email->provider_name ?: '-' }}
Tipo de Proyecto
{{ $email->project_type ?: '-' }}
Número de Proyecto
{{ $email->project_number ?: '-' }}
Marketing Cost
{{ $email->marketing_cost ?: '-' }}
Sponsor
{{ $email->sponsor ?: '-' }}
Número de OC
{{ $email->purchase_order_number ?: '-' }}
Fecha OC
{{ $email->purchase_order_date_raw ?: '-' }}
Número de RC
{{ $email->purchase_receipt_number ?: '-' }}
Fecha RC
{{ $email->purchase_receipt_date_raw ?: '-' }}
Tipo RC detectado
{{ $groupingPreview['label'] ?? 'Sin tipo RC detectado' }}
Motor de agrupación
{{ $groupingPreview['engine_label'] ?? 'Sin agrupación' }}
Dirección de Entrega
{{ $email->delivery_address ?: '-' }}
Oficina detectada
{{ $email->office ? (($email->office->office_code ?: 'SIN-COD').' | '.$email->office->name) : 'Sin match' }}
Divisa / términos
{{ $currencySummary !== '' ? $currencySummary : '-' }}
Mes / Año servicio
{{ $serviceSummary !== '' ? $serviceSummary : '-' }}
Elaboró
{{ $email->prepared_by ?: '-' }}
Centro de costos
{{ $email->cost_center ?: '-' }}
Total
{{ $email->total_amount !== null ? '$'.number_format((float) $email->total_amount, 2) : '-' }}

Uso en vista previa

{{ $usageSummary['label'] ?? 'Disponible' }}
Vista(s) previa(s)
{{ $usageFolios->isNotEmpty() ? $usageFolios->implode(', ') : 'Sin vista previa ligada' }}
JN(s) ligados
{{ $usageJns->isNotEmpty() ? $usageJns->implode(', ') : 'Sin JN ligado' }}
Líneas consumidas
{{ (int) ($usageSummary['count_linked'] ?? 0) }} / {{ $email->items->count() }}
Líneas disponibles
{{ (int) ($usageSummary['count_available'] ?? max($email->items->count() - (int) ($usageSummary['count_linked'] ?? 0), 0)) }}
@if($linkedGeneratedInvoices->isNotEmpty())
@foreach($linkedGeneratedInvoices as $linkedInvoice) Abrir vista previa {{ $linkedInvoice->folio ?: '#'.$linkedInvoice->id }} @endforeach
@endif

Líneas del recibo

Total líneas: {{ $email->items->count() }}
@forelse($email->items as $item) @php $generatedItem = $item->generatedInvoiceItem; $generatedInvoice = $generatedItem?->generatedInvoice; $linkedRequest = $generatedItem?->pipefyRequestItem?->request; $suggestion = $itemSuggestions[(int) $item->id] ?? null; @endphp @empty @endforelse
# Línea Descripción Cantidad Unidad Precio Unitario Total Estado JN / Vista previa
{{ $item->position }} {{ $item->line_number ?: '-' }} {{ $item->description ?: '-' }} {{ $item->quantity !== null ? number_format((float) $item->quantity, 2) : '-' }} {{ $item->unit ?: '-' }} {{ $item->unit_price !== null ? '$'.number_format((float) $item->unit_price, 2) : '-' }} {{ $item->total !== null ? '$'.number_format((float) $item->total, 2) : '-' }} @if($generatedItem && $generatedInvoice) {{ $generatedInvoice->status === \App\Models\GeneratedInvoice::STATUS_DRAFT ? 'Reservado' : 'Quemado' }} @elseif($item->selectedPipefyRequestItem) JN elegido @elseif(($suggestion['type'] ?? null) === 'candidate') Disponible @else Sin match @endif @if($generatedItem && $generatedInvoice)
Vista previa: {{ $generatedInvoice->folio ?: '-' }}
JN: {{ $linkedRequest?->title ?: '-' }}
Solicitud: #{{ $linkedRequest?->id ?: '-' }}
Abrir vista previa
@elseif($item->selectedPipefyRequestItem?->request)
JN elegido: {{ $item->selectedPipefyRequestItem->request->title ?: '-' }}
Solicitud: #{{ $item->selectedPipefyRequestItem->request->id ?: '-' }}
{{ $item->selectedPipefyRequestItem->description ?: ($item->selectedPipefyRequestItem->product_name ?: '-') }}
@elseif(($suggestion['type'] ?? null) === 'candidate')
Sugerido JN: {{ $suggestion['jn'] ?: '-' }}
Solicitud: #{{ $suggestion['request_id'] ?: '-' }}
RC solicitud: {{ $suggestion['request_rc_list'] ?: '-' }}
@else Sin vínculo todavía @endif @if(!$generatedItem) @php $candidateOptions = collect($itemCandidateOptions[(int) $item->id] ?? [])->values(); @endphp
@csrf @method('PATCH') Guardar JN
@endif
No se detectaron líneas del recibo en este correo.

Agrupación potencial

Tipo RC
{{ $groupingPreview['label'] ?? 'Sin tipo RC detectado' }}
Motor
{{ $groupingPreview['engine_label'] ?? 'Sin agrupación' }}
Correos hermanos
{{ $groupableSiblings->count() }}
@if($groupableSiblings->isEmpty())

No hay otros correos activos en el mismo grupo de agrupación para este cliente.

@else

Se encontraron correos hermanos dentro del mismo tipo de RC y moneda para este cliente.

@foreach($groupableSiblings as $sibling) @php $siblingGrouping = (array) ($sibling->grouping_preview ?? []); @endphp @endforeach
ID Recibido Proveedor OC RC Tipo RC Asunto
{{ $sibling->id }} {{ optional($sibling->received_at)->format('Y-m-d H:i') ?: '-' }} {{ $sibling->provider_name ?: '-' }} {{ $sibling->purchase_order_number ?: '-' }} {{ $sibling->purchase_receipt_number ?: '-' }} {{ $siblingGrouping['label'] ?? 'Sin tipo RC detectado' }} {{ $sibling->subject ?: '-' }}
@endif

Adjuntos

@php $attachments = collect($email->attachments ?? []); @endphp @if($attachments->isEmpty())

Este correo no trajo adjuntos mapeados.

@else
    @foreach($attachments as $attachment)
  • {{ $attachment['filename'] ?? 'archivo' }} · {{ $attachment['content_type'] ?? 'sin tipo' }} · {{ isset($attachment['size']) ? number_format((float) $attachment['size']) . ' bytes' : 'sin tamaño' }}
  • @endforeach
@endif
Body text y payload

Body text

{{ $email->body_text ?: 'Sin body text' }}

Payload sanitizado

{{ $prettyPayload ?: '{}' }}
@endsection @push('styles') @endpush