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: ClienteController.php
<?php namespace App\Http\Controllers; use App\Models\Cliente; use Illuminate\Http\Request; class ClienteController extends Controller { /** * Buscar cliente por cédula (para check-in hotel) */ public function buscarPorCedula(Request $request) { $cedula = $request->get('cedula'); if (!$cedula) { return response()->json(['success' => false, 'message' => 'Cédula requerida']); } $cliente = Cliente::where('cedula', $cedula)->first(); if ($cliente) { return response()->json([ 'success' => true, 'cliente' => $cliente ]); } return response()->json([ 'success' => false, 'message' => 'Cliente no encontrado' ]); } public function index(Request $request) { $query = Cliente::query(); if ($request->filled('search')) { $search = $request->search; $query->where(function($q) use ($search) { $q->where('nombres', 'LIKE', "%{$search}%") ->orWhere('apellidos', 'LIKE', "%{$search}%") ->orWhere('cedula', 'LIKE', "%{$search}%"); }); } $clientes = $query->latest()->paginate(10)->appends($request->query()); return view('clientes.index', compact('clientes')); } public function create() { return view('clientes.create'); } public function store(Request $request) { $request->validate([ 'nombres' => 'required', 'apellidos' => 'required', 'cedula' => 'required|unique:clientes', 'telefono' => 'nullable', 'email' => 'nullable|email|unique:clientes', 'direccion' => 'nullable', 'ciudad' => 'nullable', 'departamento' => 'nullable', 'tipo_documento' => 'nullable', 'tipo_persona' => 'nullable|in:PERSON_ENTITY,LEGAL_ENTITY', 'regimen' => 'nullable|in:SIMPLIFIED_REGIME,COMMON_REGIME,SPECIAL_REGIME,NATIONAL_CONSUMPTION_TAX' ]); try { $cliente = Cliente::create($request->all()); // Intentar sincronizar con Alegra si la facturación electrónica está habilitada $empresa = \App\Models\Empresa::first(); if ($empresa && $empresa->factura_electronica_habilitada) { $resultado = $cliente->syncToAlegra(); if (!$resultado['success']) { \Log::warning('No se pudo sincronizar el cliente con Alegra', [ 'cliente_id' => $cliente->id, 'error' => $resultado['error'] ?? 'Error desconocido' ]); } } // Si es petición AJAX, devolver JSON if ($request->ajax() || $request->wantsJson()) { return response()->json([ 'success' => true, 'message' => 'Cliente registrado exitosamente', 'cliente' => $cliente ]); } return redirect()->route('clientes.index') ->with('success', 'Cliente registrado exitosamente'); } catch (\Exception $e) { \Log::error('Error al registrar cliente', [ 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); // Si es petición AJAX, devolver JSON con error if ($request->ajax() || $request->wantsJson()) { return response()->json([ 'success' => false, 'message' => 'Error al registrar el cliente: ' . $e->getMessage() ], 422); } return back()->with('error', 'Error al registrar el cliente: ' . $e->getMessage())->withInput(); } } public function show(Cliente $cliente) { $cliente->load('ventas'); return view('clientes.show', compact('cliente')); } public function edit(Cliente $cliente) { return view('clientes.edit', compact('cliente')); } public function update(Request $request, Cliente $cliente) { $request->validate([ 'nombres' => 'required', 'apellidos' => 'required', 'cedula' => 'required|unique:clientes,cedula,' . $cliente->id, 'telefono' => 'nullable', 'email' => 'nullable|email|unique:clientes,email,' . $cliente->id, 'direccion' => 'nullable', 'ciudad' => 'nullable', 'departamento' => 'nullable', 'tipo_documento' => 'nullable', 'tipo_persona' => 'nullable|in:PERSON_ENTITY,LEGAL_ENTITY', 'regimen' => 'nullable|in:SIMPLIFIED_REGIME,COMMON_REGIME,SPECIAL_REGIME,NATIONAL_CONSUMPTION_TAX', 'estado' => 'required|boolean' ]); try { $cliente->update($request->all()); // Intentar sincronizar con Alegra si la facturación electrónica está habilitada $empresa = \App\Models\Empresa::first(); if ($empresa && $empresa->factura_electronica_habilitada) { $resultado = $cliente->syncToAlegra(); if (!$resultado['success']) { \Log::warning('No se pudo sincronizar el cliente con Alegra', [ 'cliente_id' => $cliente->id, 'error' => $resultado['error'] ?? 'Error desconocido' ]); } } return redirect()->route('clientes.index') ->with('success', 'Cliente actualizado exitosamente'); } catch (\Exception $e) { \Log::error('Error al actualizar cliente', [ 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); return back()->with('error', 'Error al actualizar el cliente: ' . $e->getMessage())->withInput(); } } public function destroy(Cliente $cliente) { try { $cliente->delete(); return redirect()->route('clientes.index') ->with('success', 'Cliente eliminado exitosamente'); } catch (\Exception $e) { return back()->with('error', 'Error al eliminar el cliente'); } } /** * Mostrar formulario de importación */ public function importar() { return view('clientes.importar'); } /** * Procesar archivo Excel de importación */ public function procesarImportacion(Request $request) { $request->validate([ 'archivo' => 'required|file|mimes:xlsx,xls,csv|max:10240' ]); try { $archivo = $request->file('archivo'); $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($archivo->getPathname()); $worksheet = $spreadsheet->getActiveSheet(); $rows = $worksheet->toArray(); // Primera fila son los encabezados $headers = array_map('strtolower', array_map('trim', $rows[0])); // Mapeo de columnas esperadas $columnMap = [ 'nombres' => ['nombres', 'nombre', 'name', 'nombres_cliente'], 'apellidos' => ['apellidos', 'apellido', 'lastname', 'apellidos_cliente'], 'cedula' => ['cedula', 'documento', 'identificacion', 'nit', 'cc', 'numero_documento'], 'telefono' => ['telefono', 'celular', 'phone', 'tel', 'movil'], 'email' => ['email', 'correo', 'mail', 'correo_electronico'], 'direccion' => ['direccion', 'address', 'dir'], 'ciudad' => ['ciudad', 'city', 'municipio'], 'departamento' => ['departamento', 'state', 'depto'], 'tipo_documento' => ['tipo_documento', 'tipo_doc', 'document_type'], 'tipo_persona' => ['tipo_persona', 'person_type'], 'regimen' => ['regimen', 'regime'] ]; // Encontrar índices de columnas $indices = []; foreach ($columnMap as $field => $possibleNames) { foreach ($possibleNames as $name) { $index = array_search($name, $headers); if ($index !== false) { $indices[$field] = $index; break; } } } // Verificar columnas requeridas if (!isset($indices['cedula'])) { return back()->with('error', 'El archivo debe contener una columna de cédula/documento'); } $importados = 0; $actualizados = 0; $errores = []; // Procesar filas (omitir encabezado) for ($i = 1; $i < count($rows); $i++) { $row = $rows[$i]; // Obtener cédula $cedula = isset($indices['cedula']) ? trim($row[$indices['cedula']] ?? '') : ''; if (empty($cedula)) { continue; // Saltar filas sin cédula } // Preparar datos $data = [ 'cedula' => $cedula, 'nombres' => isset($indices['nombres']) ? trim($row[$indices['nombres']] ?? '') : '', 'apellidos' => isset($indices['apellidos']) ? trim($row[$indices['apellidos']] ?? '') : '', 'telefono' => isset($indices['telefono']) ? trim($row[$indices['telefono']] ?? '') : null, 'email' => isset($indices['email']) ? trim($row[$indices['email']] ?? '') : null, 'direccion' => isset($indices['direccion']) ? trim($row[$indices['direccion']] ?? '') : null, 'ciudad' => isset($indices['ciudad']) ? trim($row[$indices['ciudad']] ?? '') : null, 'departamento' => isset($indices['departamento']) ? trim($row[$indices['departamento']] ?? '') : null, 'tipo_documento' => isset($indices['tipo_documento']) ? trim($row[$indices['tipo_documento']] ?? '') : 'CC', 'tipo_persona' => isset($indices['tipo_persona']) ? trim($row[$indices['tipo_persona']] ?? '') : 'PERSON_ENTITY', 'regimen' => isset($indices['regimen']) ? trim($row[$indices['regimen']] ?? '') : 'SIMPLIFIED_REGIME', ]; // Si no hay nombres, usar la cédula como nombre if (empty($data['nombres'])) { $data['nombres'] = 'Cliente ' . $cedula; } try { // Buscar si ya existe $cliente = Cliente::where('cedula', $cedula)->first(); if ($cliente) { // Actualizar solo campos no vacíos $updateData = array_filter($data, fn($v) => !empty($v)); $cliente->update($updateData); $actualizados++; } else { // Crear nuevo Cliente::create($data); $importados++; } } catch (\Exception $e) { $errores[] = "Fila " . ($i + 1) . ": " . $e->getMessage(); } } $mensaje = "Importación completada: {$importados} nuevos, {$actualizados} actualizados."; if (count($errores) > 0) { $mensaje .= " " . count($errores) . " errores."; } return redirect()->route('clientes.index') ->with('success', $mensaje) ->with('errores_importacion', $errores); } catch (\Exception $e) { \Log::error('Error en importación de clientes', [ 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); return back()->with('error', 'Error al procesar el archivo: ' . $e->getMessage()); } } /** * Descargar plantilla de importación */ public function descargarPlantilla() { $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); // Encabezados $headers = ['cedula', 'nombres', 'apellidos', 'telefono', 'email', 'direccion', 'ciudad', 'departamento', 'tipo_documento', 'tipo_persona', 'regimen']; $sheet->fromArray($headers, null, 'A1'); // Ejemplo $ejemplo = ['1234567890', 'Juan', 'Pérez', '3001234567', 'juan@email.com', 'Calle 123', 'Bogotá', 'Cundinamarca', 'CC', 'PERSON_ENTITY', 'SIMPLIFIED_REGIME']; $sheet->fromArray($ejemplo, null, 'A2'); // Ajustar ancho de columnas foreach (range('A', 'K') as $col) { $sheet->getColumnDimension($col)->setAutoSize(true); } // Estilo encabezados $sheet->getStyle('A1:K1')->getFont()->setBold(true); $sheet->getStyle('A1:K1')->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setRGB('4CAF50'); $sheet->getStyle('A1:K1')->getFont()->getColor()->setRGB('FFFFFF'); $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet); $filename = 'plantilla_clientes.xlsx'; $temp = tempnam(sys_get_temp_dir(), 'excel'); $writer->save($temp); return response()->download($temp, $filename, [ 'Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ])->deleteFileAfterSend(true); } }
Coded With 💗 by
0x6ick