@extends('layouts.app') @section('content') @php $draftColumns = is_array($draft['columns'] ?? null) ? $draft['columns'] : []; $draftPreviewRows = is_array($draft['preview_rows'] ?? null) ? $draft['preview_rows'] : []; $draftTargetMode = old('target_mode', (string) ($draft['target_mode'] ?? 'existing')); $draftListId = (int) old('contact_list_id', (int) ($draft['contact_list_id'] ?? 0)); $draftListName = old('list_name', (string) ($draft['list_name'] ?? '')); @endphp
Mapper y processor en Laravel

Nuevo import

Analiza columnas, define mapping, crea la lista destino si hace falta y procesa por tandas desde Laravel sin tocar el motor legacy actual.

CSV Soportado
XLSX Lectura directa
Destino Lista de contactos
Proceso Por lotes
@if ($draft)

Borrador analizado

Archivo detectado y listo para configurar antes de crear el import real.

{{ $draft['source_name'] ?? 'import.csv' }} {{ strtoupper((string) ($draft['source_kind'] ?? 'csv')) }} {{ !empty($draft['has_header']) ? 'Con encabezados' : 'Sin encabezados' }} {{ count($draftColumns) }} columnas

Muestra del archivo

Esta vista previa ya usa el delimitador y el modo de encabezados detectados.

@foreach ((array) ($draft['headers'] ?? []) as $header) @endforeach @forelse ($draftPreviewRows as $row) @foreach ($row as $value) @endforeach @empty @endforelse
{{ $header }}
{{ $value }}
No hay filas de muestra.

Configurar mapping

Decide que columnas importar, cuales ignorar y que custom fields crear.

@csrf
@forelse ($draftColumns as $column) @php $index = (int) $column['index']; $guess = is_array($column['guess'] ?? null) ? $column['guess'] : []; $postedTarget = old('column_target.' . $index, (string) ($guess['target'] ?? 'ignore')); $postedLabel = old('custom_label.' . $index, (string) ($guess['custom_label'] ?? $column['header'])); $postedKey = old('custom_key.' . $index, (string) ($guess['field_key'] ?? \App\Support\ImportSupport::normalizeCustomFieldKey((string) $postedLabel))); $isCustom = str_starts_with($postedTarget, 'custom_'); $previewPlaceholder = 'No aplica'; if ($postedTarget !== 'ignore') { $previewPlaceholder = $isCustom ? \App\Support\ImportSupport::placeholderForKey(\App\Support\ImportSupport::normalizeCustomFieldKey($postedKey)) : \App\Support\ImportSupport::placeholderForKey($postedTarget); } @endphp @empty @endforelse
Columna Muestra Importar como Custom field Placeholder
{{ $column['header'] }}
Columna {{ $index + 1 }}
@if (!empty($column['samples'])) {{ $column['samples'][0] }} @if (!empty($column['samples'][1]))
{{ $column['samples'][1] }}
@endif @if (!empty($column['samples'][2]))
{{ $column['samples'][2] }}
@endif @else Sin muestra @endif
No aplica
{{ $previewPlaceholder }}
No se detectaron columnas.
@csrf
@else

Import de contactos

Sube CSV o XLSX, detecta columnas, decide el mapping y luego procesa por tandas.

@csrf
@endif @endsection @push('scripts') @endpush