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);
}
}
?>