From 3f6037de762053af708a7349b1c22e967fc8c971 Mon Sep 17 00:00:00 2001 From: imnavajas Date: Tue, 15 Jul 2025 15:03:39 +0200 Subject: [PATCH] Creado importador por CLI para actualizar clientes desde el ERP antiguo --- ci4/app/Commands/ClienteImportar.php | 274 +++++++++++++++++++++++++++ 1 file changed, 274 insertions(+) create mode 100644 ci4/app/Commands/ClienteImportar.php diff --git a/ci4/app/Commands/ClienteImportar.php b/ci4/app/Commands/ClienteImportar.php new file mode 100644 index 00000000..a0d08d16 --- /dev/null +++ b/ci4/app/Commands/ClienteImportar.php @@ -0,0 +1,274 @@ +table('lg_provincias') + ->select('id, nombre') + ->get() + ->getResultArray(); + + $provinciaMap = []; + foreach ($provincias as $provincia) { + $clave = trim(mb_strtolower($provincia['nombre'])); + $provinciaMap[$clave] = $provincia['id']; + } + + if (in_array($accion, ['clientes', 'todo'])) { + // ⬅️ aquí va tu bloque actual de importación de clientes + $insertados = 0; + $omitidos = 0; + + CLI::write("Iniciando importación de clientes por ID...", 'yellow'); + + $clientes = $db->table('customers') + ->where('deleted_at', null) + ->get() + ->getResultArray(); + + if (empty($clientes)) { + CLI::write('No se encontraron registros en "customers".', 'red'); + return; + } + + foreach ($clientes as $cliente) { + $id = (int) $cliente['id']; + + // Verifica si ya existe en la tabla destino + $yaExiste = $db->table('clientes')->where('id', $id)->countAllResults(); + + if ($yaExiste) { + $omitidos++; + CLI::write("Cliente ID $id ya existe. Omitido.", 'blue'); + continue; + } + + $datos = [ + 'id' => $id, + 'nombre' => $cliente['name'], + 'alias' => $cliente['alias'], + 'cif' => $cliente['cif'], + 'direccion' => $cliente['direccion'], + 'ciudad' => $cliente['ciudad'], + 'comunidad_autonoma_id' => $cliente['comunidad_autonoma_id'], + 'provincia_id' => $this->getProvinciaId($cliente['provincia'], $provinciaMap), + 'cp' => $cliente['cp'], + 'pais_id' => $cliente['pais_id'], + 'telefono' => $cliente['telefono'], + 'email' => $cliente['email'], + 'comercial_id' => 122, + 'soporte_id' => 122, + 'forma_pago_id' => ($cliente['forma_pago_id'] > 6) ? 1 : $cliente['forma_pago_id'], // Si no se reconoce fijar a transferencias + 'vencimiento' => $cliente['vencimiento'], + 'fecha_vencimiento' => $cliente['fechaVencimiento'], + 'margen' => $cliente['margen'], + 'descuento' => $cliente['descuento'], + 'limite_credito' => $cliente['limite_credito'], + 'limite_credito_user_id' => $cliente['limite_credito_user_id'], + 'limite_credito_change_at' => $cliente['limite_credito_change_at'], + 'credito_asegurado' => $cliente['creditoAsegurado'], + 'ccc' => $cliente['ccc'], + 'ccc_cliente' => $cliente['ccc_customer'], + 'num_cuenta' => $cliente['num_cuenta'], + 'message_tracking' => $cliente['message_tracking'], + 'message_production_start' => $cliente['message_production_start'], + 'tirada_flexible' => $cliente['tirada_flexible'], + 'descuento_tirada_flexible' => $cliente['descuento_tirada_flexible'], + 'comentarios_tirada_flexible' => $cliente['comentarios_tirada_flexible'], + 'margen_plantilla_id' => $cliente['margen_plantilla_id'], + 'comentarios' => $cliente['comentarios'], + 'deleted_at' => null, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + 'user_created_id' => 10, + 'user_update_id' => 10, + 'no_envio_base' => 0, + 'forzar_rotativa_pod' => 0, + ]; + + try { + $db->table('clientes')->insert($datos); + $insertados++; + CLI::write("Cliente ID $id insertado correctamente.", 'green'); + } catch (\Throwable $e) { + CLI::error("❌ Error al insertar cliente ID $id: " . $e->getMessage()); + CLI::error("📦 Datos del cliente: " . json_encode($datos, JSON_PRETTY_PRINT)); + $omitidos++; + continue; + } + } + + CLI::write("Importación completada.", 'green'); + CLI::write("Clientes insertados: $insertados", 'green'); + CLI::write("Clientes ya existentes: $omitidos", 'blue'); + + } + + if (in_array($accion, ['direcciones', 'todo'])) { + // ⬅️ aquí va tu bloque actual de importación de direcciones + CLI::write("Iniciando importación de direcciones...", 'yellow'); + + $direcciones = $db->table('customers_address') + ->where('deleted_at', null) + ->get() + ->getResultArray(); + + $direccionesInsertadas = 0; + $direccionesOmitidas = 0; + + foreach ($direcciones as $dir) { + $clienteId = (int) $dir['customer_id']; + + $clienteExiste = $db->table('clientes') + ->where('id', $clienteId) + ->countAllResults(); + + if (!$clienteExiste) { + CLI::write("⚠️ Dirección ID {$dir['id']} omitida: cliente_id $clienteId no existe.", 'blue'); + $direccionesOmitidas++; + continue; + } + + $direccionExiste = $db->table('cliente_direcciones') + ->where([ + 'cliente_id' => $clienteId, + 'direccion' => $dir['direccion'] ?? '', + 'cp' => $dir['cp'] ?? '0', + 'municipio' => $dir['ciudad'] ?? '', + 'provincia' => $dir['provincia'], + ]) + ->countAllResults(); + + if ($direccionExiste) { + CLI::write("⚠️ Dirección ID {$dir['id']} ya existe para cliente $clienteId. Omitida.", 'blue'); + $direccionesOmitidas++; + continue; + } + + $nuevaDir = [ + 'cliente_id' => $clienteId, + 'alias' => $dir['nombre'] ?? '', + 'att' => $dir['persona_contacto'] ?? '', + 'email' => $dir['email'], + 'direccion' => $dir['direccion'] ?? '', + 'pais_id' => is_numeric($dir['pais_id']) ? (int) $dir['pais_id'] : null, + 'provincia' => $dir['provincia'], + 'municipio' => $dir['ciudad'] ?? '', + 'cp' => $dir['cp'] ?? '0', + 'telefono' => $dir['telefono'], + ]; + + try { + $db->table('cliente_direcciones')->insert($nuevaDir); + $direccionesInsertadas++; + CLI::write("✅ Dirección ID {$dir['id']} insertada para cliente $clienteId", 'green'); + } catch (\Throwable $e) { + CLI::error("❌ Error al insertar dirección ID {$dir['id']} (cliente_id $clienteId): " . $e->getMessage()); + $direccionesOmitidas++; + } + } + + + CLI::write("Importación de direcciones finalizada.", 'green'); + CLI::write("Direcciones insertadas: $direccionesInsertadas", 'green'); + CLI::write("Direcciones omitidas: $direccionesOmitidas", 'blue'); + } + + if (in_array($accion, ['contactos', 'todo'])) { + CLI::write("Iniciando importación de contactos...", 'yellow'); + + $contactos = $db->table('customers_contact') + ->where('deleted_at', null) + ->get() + ->getResultArray(); + + $contactosInsertados = 0; + $contactosOmitidos = 0; + + foreach ($contactos as $contacto) { + $clienteId = (int) $contacto['customer_id']; + + // Verificar si cliente existe + $clienteExiste = $db->table('clientes') + ->where('id', $clienteId) + ->countAllResults(); + + if (!$clienteExiste) { + CLI::write("⚠️ Contacto ID {$contacto['id']} omitido: cliente_id $clienteId no existe.", 'blue'); + $contactosOmitidos++; + continue; + } + + // Validación para evitar duplicados básicos + $yaExiste = $db->table('cliente_contactos') + ->where([ + 'cliente_id' => $clienteId, + 'email' => $contacto['email'], + 'nombre' => $contacto['nombre'] + ]) + ->countAllResults(); + + if ($yaExiste) { + CLI::write("⚠️ Contacto ID {$contacto['id']} ya existe para cliente $clienteId. Omitido.", 'blue'); + $contactosOmitidos++; + continue; + } + + $nuevoContacto = [ + 'cliente_id' => $clienteId, + 'cargo' => $contacto['cargo'], + 'nombre' => $contacto['nombre'], + 'apellidos' => $contacto['apellidos'], + 'telefono' => $contacto['telefono'], + 'email' => $contacto['email'], + 'deleted_at' => null, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + ]; + + try { + $db->table('cliente_contactos')->insert($nuevoContacto); + $contactosInsertados++; + CLI::write("✅ Contacto ID {$contacto['id']} insertado para cliente $clienteId", 'green'); + } catch (\Throwable $e) { + CLI::error("❌ Error al insertar contacto ID {$contacto['id']}: " . $e->getMessage()); + $contactosOmitidos++; + } + } + + CLI::write("Importación de contactos finalizada.", 'green'); + CLI::write("Contactos insertados: $contactosInsertados", 'green'); + CLI::write("Contactos omitidos: $contactosOmitidos", 'blue'); + } + + + + } + + + private function getProvinciaId(?string $nombre, array $map): ?int + { + if ($nombre === null) { + return null; + } + + $clave = trim(mb_strtolower($nombre)); + return $map[$clave] ?? null; + } + + +}