Current File : /var/www/pharmacius/model/pedidos_model.php
<?php
class Pedidos_model
{
    private $db;
    private $datos;

    public function __construct()
    {
        require_once("model/conectar.php");
        $this->db = Conectar::conexion();
        $this->datos = array();
    }

    public function get_pedidos()
    {
        $pedidosAgrupados = [];

        $sql = "SELECT p.*, 
                       pp.IDProducto, pr.Referencia, pr.Nombre, pp.Cantidad, pp.Notas, pp.Recepcionado
                FROM pedidos p
                LEFT JOIN pedido_producto pp ON p.IDPedido = pp.IDPedido
                LEFT JOIN productos pr ON pp.IDProducto = pr.IDProducto
                ORDER BY p.IDPedido DESC";

        $consulta = $this->db->query($sql);

        while ($row = $consulta->fetch_assoc()) {
            $id = $row['IDPedido'];

            if (!isset($pedidosAgrupados[$id])) {
                $pedidosAgrupados[$id] = [
                    'IDPedido' => $row['IDPedido'],
                    'Estado' => $row['Estado'],
                    'ProductosFaltantes' => $row['ProductosFaltantes'],
                    'Observaciones' => $row['Observaciones'],
                    'Incidencias' => $row['Incidencias'],
                    'Seguimiento' => $row['Seguimiento'],
                    'Almacen' => $row['Almacen'],
                    'productos' => []
                ];
            }

            if (!empty($row['IDProducto'])) {
                $pedidosAgrupados[$id]['productos'][] = [
                    'IDProducto' => $row['IDProducto'],
                    'Referencia' => $row['Referencia'],
                    'Nombre' => $row['Nombre'],
                    'Cantidad' => $row['Cantidad'],
                    'Notas' => $row['Notas'],
                    'Recepcionado' => $row['Recepcionado']
                ];
            }
        }

        return array_values($pedidosAgrupados);
    }

    public function get_pedido($IDPedido)
    {
        $sql = "SELECT * FROM pedidos WHERE IDPedido = ?";
        $stmt = $this->db->prepare($sql);
        $stmt->bind_param("i", $IDPedido);
        $stmt->execute();
        $resultado = $stmt->get_result();
        return $resultado->fetch_assoc();
    }

    public function insertar_pedido_con_productos($datosPedido, $productos, $cantidades, $notas, $recepcionado)
    {
        $this->db->begin_transaction();
        try {
            $sql = "INSERT INTO pedidos (IDPedido, Estado, ProductosFaltantes, Observaciones, Incidencias, Seguimiento, Almacen)
                    VALUES (?, ?, ?, ?, ?, ?, ?)";
            $stmt = $this->db->prepare($sql);
            if (!$stmt) throw new Exception("Prepare pedido: " . $this->db->error);
            $stmt->bind_param("issssss",
                $datosPedido['IDPedido'],
                $datosPedido['Estado'],
                $datosPedido['ProductosFaltantes'],
                $datosPedido['Observaciones'],
                $datosPedido['Incidencias'],
                $datosPedido['Seguimiento'],
                $datosPedido['Almacen']
            );
            if (!$stmt->execute()) throw new Exception("Execute pedido: " . $stmt->error);

            if (!is_array($notas)) {
                $notas = array_fill(0, count($productos), null);
            }

            $sqlProd = "INSERT INTO pedido_producto (IDPedido, IDProducto, Cantidad, Notas, Recepcionado) VALUES (?, ?, ?, ?, ?)";
            $stmtProd = $this->db->prepare($sqlProd);
            if (!$stmtProd) throw new Exception("Prepare producto: " . $this->db->error);

            for ($i = 0; $i < count($productos); $i++) {
                $idProducto = $productos[$i];
                $cantidad = $cantidades[$i] ?? 1;
                $nota = isset($notas[$i]) ? $notas[$i] : null;
                $recibido = isset($recepcionado[$i]) && $recepcionado[$i] == '1' ? 1 : 0;

                $stmtProd->bind_param("iiisi", $datosPedido['IDPedido'], $idProducto, $cantidad, $nota, $recibido);
                if (!$stmtProd->execute()) throw new Exception("Execute producto $i: " . $stmtProd->error);
            }

            $this->db->commit();
            return true;
        } catch (Exception $e) {
            $this->db->rollback();
            die("ERROR al insertar pedido: " . $e->getMessage());
        }
    }

    public function actualizar_pedido_con_productos($idOriginal, $datosPedido, $productos, $cantidades, $notas, $recepcionado)
    {
        $this->db->begin_transaction();
        try {
            $sql = "UPDATE pedidos SET 
                        IDPedido = ?, 
                        Estado = ?, 
                        ProductosFaltantes = ?, 
                        Observaciones = ?, 
                        Incidencias = ?, 
                        Seguimiento = ?, 
                        Almacen = ?
                    WHERE IDPedido = ?";
            $stmt = $this->db->prepare($sql);
            if (!$stmt) throw new Exception("Prepare update: " . $this->db->error);
            $stmt->bind_param("issssssi",
                $datosPedido['IDPedido'],
                $datosPedido['Estado'],
                $datosPedido['ProductosFaltantes'],
                $datosPedido['Observaciones'],
                $datosPedido['Incidencias'],
                $datosPedido['Seguimiento'],
                $datosPedido['Almacen'],
                $idOriginal
            );
            if (!$stmt->execute()) throw new Exception("Execute update: " . $stmt->error);

            $sqlDel = "DELETE FROM pedido_producto WHERE IDPedido = ?";
            $stmtDel = $this->db->prepare($sqlDel);
            if (!$stmtDel) throw new Exception("Prepare delete productos: " . $this->db->error);
            $stmtDel->bind_param("i", $idOriginal);
            if (!$stmtDel->execute()) throw new Exception("Execute delete productos: " . $stmtDel->error);

            if (!is_array($notas)) {
                $notas = array_fill(0, count($productos), null);
            }

            $sqlProd = "INSERT INTO pedido_producto (IDPedido, IDProducto, Cantidad, Notas, Recepcionado) VALUES (?, ?, ?, ?, ?)";
            $stmtProd = $this->db->prepare($sqlProd);
            if (!$stmtProd) throw new Exception("Prepare insert productos: " . $this->db->error);

            for ($i = 0; $i < count($productos); $i++) {
                $idProducto = $productos[$i];
                $cantidad = $cantidades[$i] ?? 1;
                $nota = isset($notas[$i]) ? $notas[$i] : null;
                $recibido = isset($recepcionado[$i]) && $recepcionado[$i] == '1' ? 1 : 0;

                $stmtProd->bind_param("iiisi", $datosPedido['IDPedido'], $idProducto, $cantidad, $nota, $recibido);
                if (!$stmtProd->execute()) throw new Exception("Execute producto $i: " . $stmtProd->error);
            }

            $this->db->commit();
            return true;
        } catch (Exception $e) {
            $this->db->rollback();
            error_log("ERROR al actualizar pedido: " . $e->getMessage());
            return false;
        }
    }

    public function existe_id($IDPedido)
    {
        $sql = "SELECT IDPedido FROM pedidos WHERE IDPedido = ?";
        $stmt = $this->db->prepare($sql);
        $stmt->bind_param("i", $IDPedido);
        $stmt->execute();
        $stmt->store_result();
        return $stmt->num_rows > 0;
    }

    public function eliminar_pedido($IDPedido)
    {
        $sql = "DELETE FROM pedidos WHERE IDPedido = ?";
        $stmt = $this->db->prepare($sql);
        $stmt->bind_param("i", $IDPedido);
        return $stmt->execute();
    }

    public function get_productos_de_pedido($IDPedido)
    {
        $sql = "SELECT pp.IDProducto, pp.Cantidad, pp.Notas, pp.Recepcionado, p.Nombre, p.Referencia
                FROM pedido_producto pp
                INNER JOIN productos p ON pp.IDProducto = p.IDProducto
                WHERE pp.IDPedido = ?";
        $stmt = $this->db->prepare($sql);
        $stmt->bind_param("i", $IDPedido);
        $stmt->execute();
        $resultado = $stmt->get_result();
        return $resultado->fetch_all(MYSQLI_ASSOC);
    }
}
?>