ventaKey])) { $_SESSION[$this->ventaKey] = []; } if (!isset($_SESSION[$this->pedidoKey])) { $_SESSION[$this->pedidoKey] = []; } if (!isset($_SESSION[$this->servicioKey])) { $_SESSION[$this->servicioKey] = []; } } // MÉTODO PARA OBTENER ERRORES Y MANEJARLOS EN CONTROLLER public function getError(): ?string { return $this->error; } // <---------------------------------- MANEJO DE CAJA PARA VENTA ----------------------------------> // AGREGAR PRODUCTO public function agregarProducto(array $producto, int $cantidad): bool { if ($cantidad <= 0 || empty($producto['id'])) { $this->error = 'Datos inválidos del producto.'; return false; } $id = $producto['id']; $stockDisponible = $producto['stock']; // Si el producto ya se encuentra agregado if (isset($_SESSION[$this->ventaKey][$id])) { if ($cantidad > $stockDisponible) { $this->error = 'La cantidad supera el stock disponible.'; return false; } $_SESSION[$this->ventaKey][$id]['cantidad'] = $cantidad; return true; } // Si aún no existe en el array continua la ejecución if ($cantidad > $stockDisponible) { $this->error = 'La cantidad supera el stock disponible.'; return false; } // Cálculos $descuentoTotal = $producto['descuento_producto'] + $producto['descuento_categoria']; $precioFinal = ((100 - $descuentoTotal) * $producto['precio'] / 100); // PRECIO UNITARIO MENOS EL DESCUENTO // Se guardan los datos en el array $_SESSION[$this->ventaKey][$id] = [ 'id_producto' => $id, 'marca' => $producto['marca'], 'modelo' => $producto['modelo'], 'precio' => $producto['precio'], 'descuento_total' => $descuentoTotal, 'cantidad' => $cantidad, 'stock' => $producto['stock'], 'precio_final' => $precioFinal ]; return true; } // ELIMINAR PRODUCTO public function eliminarProducto(int $id): bool { if (!isset($_SESSION[$this->ventaKey][$id])) { $this->error = 'El producto no existe en la caja.'; return false; } else{ unset($_SESSION[$this->ventaKey][$id]); } return true; } // EDITAR CANTIDAD DE PRODUCTO public function editarCantidad(int $id, int $nuevaCantidad): bool { if (!isset($_SESSION[$this->ventaKey][$id])) { $this->error = 'Producto inexistente en la caja.'; return false; } if ($nuevaCantidad <= 0) { $this->error = 'La cantidad debe ser mayor a cero.'; return false; } if ($nuevaCantidad > $_SESSION[$this->ventaKey][$id]['stock']) { $this->error = 'La cantidad supera el stock disponible.'; return false; } $_SESSION[$this->ventaKey][$id]['cantidad'] = $nuevaCantidad; return true; } // LISTAR PRODUCTOS public function listarProductos(): array { return $_SESSION[$this->ventaKey]; } // CALCULAR SUBTOTAL public function calcularSubtotal(): float { $total = 0; foreach ($_SESSION[$this->ventaKey] as $item) { $precio = (float) $item['precio']; $total += $precio * $item['cantidad']; } return round($total, 2); } // CALCULAR PRECIO TOTAL public function calcularPrecioTotal(): float { $total = 0; foreach ($_SESSION[$this->ventaKey] as $item) { $precio = (float) $item['precio']; if (!empty($item['descuento_total'])) { $precio -= ($item['descuento_total'] * $precio / 100); } $total += $precio * $item['cantidad']; } return round($total, 2); } // CALCULAR DESCUENTO TOTAL public function calcularDescuentoTotal(): float { $total = 0; foreach ($_SESSION[$this->ventaKey] as $item) { $precio = (float) $item['precio']; $descuento = 0; if (!empty($item['descuento_total'])) { $descuento += ($item['descuento_total'] * $precio / 100); } $total += $descuento * $item['cantidad']; } return round($total, 2); } // VACIAR CAJA DE PRODUCTOS public function vaciarCajaVenta(): bool { $_SESSION[$this->ventaKey] = []; return true; } // <---------------------------------- MANEJO DE CAJA PARA PEDIDO ----------------------------------> // AGREGAR PRODUCTO PARA PEDIDO public function agregarProductoPedido(array $producto, float $costo, int $cantidad): bool { if ($cantidad <= 0 || $costo <= 0 || empty($producto['id'])) { $this->error = 'Datos inválidos del producto.'; return false; } $id = $producto['id']; $ganancia = (float) ($producto['porcentaje_ganancia'] ?? 0); $precio = (100 + $ganancia) * $costo / 100; $stockfinal = $producto['stock'] + $cantidad; // Si el producto se encuentra en el array if (isset($_SESSION[$this->pedidoKey][$id])) { $_SESSION[$this->pedidoKey][$id]['costo'] = $costo; $_SESSION[$this->pedidoKey][$id]['precio'] = $precio; $_SESSION[$this->pedidoKey][$id]['cantidad'] = $cantidad; $_SESSION[$this->pedidoKey][$id]['stock_final'] = $stockfinal; return true; } // Caso contrario se guarda en el arreglo $_SESSION[$this->pedidoKey][$id] = [ 'id_producto' => $id, 'marca' => $producto['marca'], 'modelo' => $producto['modelo'], 'costo' => $costo, 'precio' => $precio, 'cantidad' => $cantidad, 'stock' => $producto['stock'], 'stock_final' => $stockfinal, 'porcentaje_ganancia' => $ganancia ]; return true; } // CALCULAR TOTAL DE PEDIDO public function calcularPrecioTotalPedido(): float { $total = 0; if (empty($_SESSION[$this->pedidoKey])) { return 0; } foreach ($_SESSION[$this->pedidoKey] as $item) { $costo = (float) $item['costo']; $total += $costo * $item['cantidad']; } return round($total, 2); } // LISTAR PRODUCTOS PARA PEDIDO public function listarProductosPedido(): array { return $_SESSION[$this->pedidoKey] ?? []; } // ELIMINAR PRODUCTO PARA PEDIDO DE LA CAJA public function eliminarProductoPedido($id): bool { if (!isset($_SESSION[$this->pedidoKey][$id])) { $this->error = 'El producto no existe en el pedido.'; return false; } else { unset($_SESSION[$this->pedidoKey][$id]); } return true; } // VACIAR CAJA DE PRODUCTOS PARA PEDIDO public function vaciarCajaPedido(): bool { $_SESSION[$this->pedidoKey] = []; return true; } // EDITAR DATOS DE PRODUCTO PARA PEDIDO public function editarDatosProductoPedido(int $id, $nuevoCosto, $nuevaCantidad): bool { if ($nuevoCosto <= 0 || $nuevaCantidad <= 0) { $this->error = 'Costo o cantidad inválidos.'; return false; } if (!isset($_SESSION[$this->pedidoKey][$id])) { return false; } else { $_SESSION[$this->pedidoKey][$id]['costo'] = $nuevoCosto; $_SESSION[$this->pedidoKey][$id]['cantidad'] = $nuevaCantidad; // Actualización de otro datos $precio = (100 + $_SESSION[$this->pedidoKey][$id]['porcentaje_ganancia']) * $nuevoCosto / 100; $stockfinal = $_SESSION[$this->pedidoKey][$id]['stock'] + $nuevaCantidad; $_SESSION[$this->pedidoKey][$id]['precio'] = $precio; $_SESSION[$this->pedidoKey][$id]['stock_final'] = $stockfinal; } return true; } // <---------------------------------- MANEJO DE CAJA PARA SERVICIO ----------------------------------> // LISTAR INSUMOS SERVICIO public function listarInsumos(): array { return $_SESSION[$this->servicioKey]; } // CALCULAR EL TOTAL DEL SERVICIO public function calcularPrecioTotalServicio(): float { $total = 0; if (empty($_SESSION[$this->servicioKey])) { return 0; } foreach ($_SESSION[$this->servicioKey] as $item) { $precio = (float) $item['precio']; $total += $precio * $item['cantidad']; } return round($total, 2); } // AGREGAR INSUMO A LA CAJA public function agregarInsumo(array $insumo, int $cantidad): bool { if ($cantidad <= 0 || empty($insumo['id'])) { $this->error = 'Datos inválidos del insumo.'; return false; } $id = $insumo['id']; $stockDisponible = $insumo['stock']; // Si el insumo ya existe en el array if (isset($_SESSION[$this->servicioKey][$id])) { if ($cantidad > $stockDisponible) { $this->error = 'La cantidad supera el stock disponible.'; return false; } $_SESSION[$this->servicioKey][$id]['cantidad'] = $cantidad; return true; } // Si no se encuentra en el array, lo inserta if ($cantidad > $stockDisponible) { $this->error = 'La cantidad supera el stock disponible.'; return false; } $_SESSION[$this->servicioKey][$id] = [ 'id_producto' => $id, 'marca' => $insumo['marca'], 'modelo' => $insumo['modelo'], 'precio' => $insumo['precio'], 'cantidad' => $cantidad, 'stock' => $insumo['stock'], ]; return true; } // VACIAR CAJA DE INSUMOS PARA SERVICIO public function vaciarCajaServicio(): bool { $_SESSION[$this->servicioKey] = []; return true; } // ELIMINAR INSUMO PARA SERVICIO DE LA CAJA public function eliminarInsumoServicio($id): bool { if (!isset($_SESSION[$this->servicioKey][$id])) { $this->error = 'El insumo no existe en el pedido.'; return false; } else { unset($_SESSION[$this->servicioKey][$id]); } return true; } // EDITAR CANTIDAD DE INSUMO public function editarCantidadInsumo(int $id, int $nuevaCantidad): bool { if (!isset($_SESSION[$this->servicioKey][$id])) { $this->error = 'Insumo inexistente en la caja.'; return false; } if ($nuevaCantidad <= 0) { $this->error = 'La cantidad debe ser mayor a cero.'; return false; } if ($nuevaCantidad > $_SESSION[$this->servicioKey][$id]['stock']) { $this->error = 'La cantidad supera el stock disponible.'; return false; } $_SESSION[$this->servicioKey][$id]['cantidad'] = $nuevaCantidad; return true; } }