{{-- Notificaciones --}} @if(session()->has('message'))
{{ session('message') }}
@endif @if(session()->has('error'))
{{ session('error') }}
@endif {{-- Header --}}

Importación Universal de Miembros (CSV)

Volver al listado
{{-- PASO 1: SUBIDA --}} @if($step === 'upload')

Instrucciones de preparado

  • Sube un archivo .csv con la información de los miembros.
  • Mapeo Dinámico: No importa el orden de las columnas, podrás vincularlas en el siguiente paso.
  • Si el sistema detecta un Correo o Cédula existente, te preguntará si deseas actualizar el registro.
@error('csvFile') {{ $message }} @enderror
@endif {{-- PASO 2: MAPEO --}} @if($step === 'mapping')

Vincular Columnas del CSV

@error('mapping')
{{ $message }}
@enderror
@foreach($this->getAppFields() as $key => $field)
@if(isset($columnMapping[$key]) && $columnMapping[$key] !== "") @endif
@endforeach
@endif {{-- PASO 3: PREVIEW --}} @if($step === 'preview' && !$isImporting)

Análisis de Datos Detectados

Analizando {{ $totalCsvRowsCount }} registros en el archivo. Mostrando página {{ $previewPage }} de {{ $totalPages }}.

@foreach($columnMapping as $fieldKey => $headerIdx) @if($headerIdx !== "") @endif @endforeach @foreach($previewRows as $i => $row) @php $val = $rowValidations[$i] ?? []; $isResolved = isset($resolutionPreferences[$i]); $rowClass = ''; if (!$val['valid']) $rowClass = 'bg-red-50/50 dark:bg-red-900/20'; elseif ($val['has_conflict']) { $rowClass = $isResolved ? ($resolutionPreferences[$i]['action'] === 'update' ? 'bg-blue-50/50 dark:bg-blue-900/20' : 'bg-zinc-100/50 dark:bg-zinc-800/50') : 'bg-amber-50/30 dark:bg-amber-900/10'; } @endphp @foreach($columnMapping as $fieldKey => $headerIdx) @if($headerIdx !== "") @php $cellValue = trim($row[$headerIdx] ?? '-'); $needsCheck = false; $mapped = false; if ($fieldKey === 'formacion') { $needsCheck = ($val['needs_formation_check'] ?? false); $mapped = isset($this->formationMapping[strtolower($cellValue)]); } else { $checkKey = "needs_{$fieldKey}_check"; $needsCheck = ($val[$checkKey] ?? false); $mappingProp = "{$fieldKey}Mapping"; $mapped = isset($this->$mappingProp[strtolower($cellValue)]); } @endphp @endif @endforeach @endforeach
Estado {{ $this->getAppFields()[$fieldKey]['label'] }}
@if($val['has_conflict']) EXISTENTE @else NUEVO @endif @if(!$val['valid']) CORREGIR @endif
{{ $cellValue }} @if($needsCheck) @if($fieldKey === 'formacion') @else @endif @elseif($mapped)
Mapeado
@endif
{{-- PAGINACIÓN --}} @if($totalPages > 1)
Página {{ $previewPage }} de {{ $totalPages }} (Total: {{ $totalCsvRowsCount }} registros)
@php $startPage = max(1, $previewPage - 2); $endPage = min($totalPages, $startPage + 4); if ($endPage - $startPage < 4) $startPage = max(1, $endPage - 4); @endphp @for($p = $startPage; $p <= $endPage; $p++) @endfor
@endif

Se procesarán un total de {{ $totalValidRows }} registros válidos.

@endif {{-- PASO 4: PROCESANDO --}} @if($isImporting)

Procesando Archivo Maestro

{{ $processedCount }} / {{ $totalValidRows }}
@foreach($importLogs as $log)
[{{ $log['time'] }}] {{ $log['message'] }}
@endforeach
@endif {{-- RESUMEN FINAL --}} @if(!$isImporting && $importSummary && $step !== 'mapping' && $step !== 'preview')

Resultados de la importación

{{ $importSummary['imported'] }}
Exitosos
{{ $importSummary['skipped'] }}
Omitidos
{{ $importSummary['imported'] + $importSummary['skipped'] }}
Total Matriz
@if(!empty($importSummary['skippedRows']))

Log de Errores y Conflictos

@foreach($importSummary['skippedRows'] as $item) @endforeach
Referencia Estado Motivo / Conflicto
{{ $item['row'][0] ?? 'Registro' }} Fallo Crítico {{ $item['reason'] }}
@endif
@endif {{-- HISTORIAL --}} @if(!$isImporting && $step === 'upload')

Bitácora de Auditoría

Registros de acciones masivas históricas.

{{ $importHistory->total() }} Registros
@forelse($importHistory as $log)
@if($log->is_reverted)
Acción Revertida
@endif
{{ $log->filename }}
{{ $log->created_at->format('d/m/Y H:i') }} #{{ $log->id }}
{{ $log->imported_count }}
Éxito
{{ $log->skipped_count }}
Fallo
@if($log->skipped_count > 0) @endif @if(!$log->is_reverted) @endif
@empty
Sin registros históricos
@endforelse
{{ $importHistory->links() }}
@endif {{-- MODAL RESOLVER CONFLICTO --}} @if($showConflictModal && $currentConflictIndex !== null) @php $targetFields = $this->getAppFields(); $csvData = $previewRows[$currentConflictIndex]; $dbData = $currentConflictData; @endphp

Resolución de Conflicto

Identidad: {{ $dbData['email'] }}

@foreach($columnMapping as $fieldKey => $headerIdx) @if($headerIdx !== "") @php $fieldInfo = $targetFields[$fieldKey]; $dbValue = $dbData[$fieldInfo['db_key'] ?? $fieldKey] ?? '-'; $csvValue = trim($csvData[$headerIdx] ?? '-'); $isSame = strtolower((string)$dbValue) === strtolower((string)$csvValue); @endphp @endif @endforeach
Sync Campo Base de Datos Archivo CSV
@if(!$isSame) @else @endif {{ $fieldInfo['label'] }} {{ $dbValue }} {{ $csvValue }}
@endif {{-- MODAL RESOLVER FORMACIÓN --}} @if($showFormationModal)

Vincular Formación

Valor en CSV: {{ $currentFormationValue }}

@forelse($formationSuggestions as $suggestion) @empty

No se encontraron sugerencias automáticas precisas.

@endforelse
@endif {{-- MODAL RESOLUCIÓN GENÉRICA (Nexo, Rol, Genero, etc) --}} @if($showNexoModal || $showRoleModal || $showGenderModal || $showStatusModal || $showDocTypeModal)

Vincular {{ ucfirst(str_replace('_', ' ', $currentMappingField)) }}

Valor Detectado en CSV: {{ $currentMappingValue }}

@php $options = []; if($showNexoModal) $options = $nexoOptions; elseif($showRoleModal) $options = $roleOptions; elseif($showGenderModal) $options = $genderOptions; elseif($showStatusModal) $options = $statusOptions; elseif($showDocTypeModal) $options = $docTypeOptions; @endphp @foreach($options as $option) @endforeach
@endif {{-- MODAL CONFIRMACIÓN ROLLBACK --}} @if($showRollbackModal)

¿Confirmar Rollback?

Esta acción revertirá TODOS los cambios realizados en este lote.

Las creaciones se eliminarán y las actualizaciones volverán a sus valores previos. Esta operación es irreversible.

@endif {{-- SISTEMA DE NOTIFICACIONES TOAST (ALPINE) --}}