File "InventarioController.php"
Full Path: C:/wamp64/www/AVIDOTAPP/controllers/InventarioController.php
File size: 13.21 KB
MIME-type: text/x-php
Charset: utf-8
<?php
class InventarioController {
private $modelo;
public function __construct() {
require_once 'models/InventarioModel.php';
$this->modelo = new InventarioModel();
}
// ═══════════════════════════════════════════════════════════════
// INVENTARIO PRINCIPAL
// ═══════════════════════════════════════════════════════════════
/**
* Pantalla principal: lista EPPs con checkbox + cantidad para seleccionar
* URL: index.php?controller=Inventario&action=index
* Equivale a: inventario/DOTIN.PHP
*/
public function index() {
$this->verificarSesion();
// Mensajes flash
$msg_ok = $_SESSION['mensaje_exito'] ?? '';
$msg_err = $_SESSION['mensaje_error'] ?? '';
unset($_SESSION['mensaje_exito'], $_SESSION['mensaje_error']);
// POST — seleccionar elementos
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['CONTINUAR'])) {
$seleccionados = $this->procesarSeleccion($_POST);
if (!empty($seleccionados)) {
$_SESSION['elementos_seleccionados'] = $seleccionados;
$_SESSION['inv_tipo'] = 'principal';
header('Location: index.php?controller=Inventario&action=verificar');
exit();
}
$msg_err = 'Debes seleccionar al menos un elemento con cantidad válida.';
}
$epps = $this->modelo->getEPPs();
include 'views/inventario/seleccionar.php';
}
/**
* Verificar / previsualizar antes de confirmar — inventario principal
* URL: index.php?controller=Inventario&action=verificar
* Equivale a: inventario/VERNOEN.PHP (con factura/proveedor/precio)
*/
public function verificar() {
$this->verificarSesion();
// Eliminar elemento de la lista
if (isset($_GET['eliminar'])) {
$this->eliminarDeSession($_GET['eliminar']);
header('Location: index.php?controller=Inventario&action=verificar');
exit();
}
// Guardar info factura/proveedor/precio por elemento (AJAX o POST)
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['guardar_info'])) {
$codigo = $_POST['codigo'];
if (!isset($_SESSION['info_elementos'])) $_SESSION['info_elementos'] = [];
$_SESSION['info_elementos'][$codigo] = [
'nfactura' => trim($_POST['nfactura'] ?? ''),
'provedor' => trim($_POST['provedor'] ?? ''),
'precio' => floatval($_POST['precio'] ?? 0),
];
echo json_encode(['ok' => true]);
exit();
}
// Confirmar ingreso
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['CONFIRMA'])) {
$elementos = $_SESSION['elementos_seleccionados'] ?? [];
$info_elementos = $_SESSION['info_elementos'] ?? [];
$user = $_SESSION['DIGITA'] ?? 'DESCONOCIDO';
// Validar que todos tengan factura y proveedor
$errores = $this->validarInfoElementos($elementos, $info_elementos);
if (!empty($errores)) {
$_SESSION['mensaje_error'] = implode('<br>', $errores);
header('Location: index.php?controller=Inventario&action=verificar');
exit();
}
$resultado = $this->modelo->confirmarIngresoPrincipal($elementos, $info_elementos, $user);
if ($resultado['ok']) {
unset($_SESSION['elementos_seleccionados'], $_SESSION['info_elementos']);
$_SESSION['mensaje_exito'] = 'Inventario actualizado correctamente.';
header('Location: index.php?controller=Inventario&action=index');
} else {
$_SESSION['mensaje_error'] = $resultado['error'];
header('Location: index.php?controller=Inventario&action=verificar');
}
exit();
}
$msg_ok = $_SESSION['mensaje_exito'] ?? '';
$msg_err = $_SESSION['mensaje_error'] ?? '';
unset($_SESSION['mensaje_exito'], $_SESSION['mensaje_error']);
$elementos_session = $_SESSION['elementos_seleccionados'] ?? [];
$info_elementos = $_SESSION['info_elementos'] ?? [];
$elementos_mostrar = $this->prepararElementosVer($elementos_session, 'principal');
include 'views/inventario/verificar.php';
}
/**
* Agregar nuevo EPP al catálogo
* URL: index.php?controller=Inventario&action=agregarEPP
* Equivale a: inventario/AGREGAR.PHP
*/
public function agregarEPP() {
$this->verificarSesion();
$msg_ok = $msg_err = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['guardar'])) {
$codigo = trim($_POST['codigo'] ?? '');
$prenda = trim($_POST['prenda'] ?? '');
if (strlen($codigo) >= 1 && strlen($prenda) >= 1) {
if ($this->modelo->agregarEPP($codigo, $prenda)) {
$msg_ok = 'EPP creado correctamente.';
} else {
$msg_err = 'Error al crear el EPP. Verifique que el código no exista.';
}
} else {
$msg_err = 'Por favor completa todos los campos.';
}
}
include 'views/inventario/agregar_epp.php';
}
/**
* AJAX — actualizar cantidad en inventario principal
* URL: index.php?controller=Inventario&action=ajaxActualizar (POST)
* Equivale a: inventario/BOTON.PHP
*/
public function ajaxActualizar() {
$codigo = $_POST['codigo'] ?? '';
$cantidad = $_POST['cantidad'] ?? 0;
$ok = $this->modelo->actualizarCantidadPrincipal($codigo, (int)$cantidad);
echo $ok ? 'success' : 'error';
exit();
}
/**
* AJAX — eliminar del inventario principal
* URL: index.php?controller=Inventario&action=ajaxEliminar (POST)
* Equivale a: inventario/ELIMINAR.PHP
*/
public function ajaxEliminar() {
$codigo = $_POST['codigo'] ?? '';
$ok = $this->modelo->eliminarItemPrincipal($codigo);
echo $ok ? 'success' : 'Error: ' . 'no se pudo eliminar';
exit();
}
// ═══════════════════════════════════════════════════════════════
// INVENTARIO USADO
// ═══════════════════════════════════════════════════════════════
/**
* Pantalla principal inventario usado
* URL: index.php?controller=Inventario&action=usado
* Equivale a: inventarioUsa/DOTIN.PHP
*/
public function usado() {
$this->verificarSesion();
$msg_ok = $_SESSION['mensaje_exito'] ?? '';
$msg_err = $_SESSION['mensaje_error'] ?? '';
unset($_SESSION['mensaje_exito'], $_SESSION['mensaje_error']);
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['CONTINUAR'])) {
$seleccionados = $this->procesarSeleccion($_POST);
if (!empty($seleccionados)) {
$_SESSION['elementos_seleccionados'] = $seleccionados;
$_SESSION['inv_tipo'] = 'usado';
header('Location: index.php?controller=Inventario&action=verificarUsado');
exit();
}
$msg_err = 'Debes seleccionar al menos un elemento con cantidad válida.';
}
$epps = $this->modelo->getEPPs();
include 'views/inventario/seleccionar_usado.php';
}
/**
* Verificar / previsualizar — inventario usado (sin factura/proveedor)
* URL: index.php?controller=Inventario&action=verificarUsado
* Equivale a: inventarioUsa/VERNOEN.PHP
*/
public function verificarUsado() {
$this->verificarSesion();
if (isset($_GET['eliminar'])) {
$this->eliminarDeSession($_GET['eliminar']);
header('Location: index.php?controller=Inventario&action=verificarUsado');
exit();
}
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['CONFIRMA'])) {
$elementos = $_SESSION['elementos_seleccionados'] ?? [];
$user = $_SESSION['DIGITA'] ?? 'DESCONOCIDO';
$resultado = $this->modelo->confirmarIngresoUsado($elementos, $user);
if ($resultado['ok']) {
unset($_SESSION['elementos_seleccionados']);
$_SESSION['mensaje_exito'] = 'Inventario de usados actualizado correctamente.';
header('Location: index.php?controller=Inventario&action=usado');
} else {
$_SESSION['mensaje_error'] = $resultado['error'];
header('Location: index.php?controller=Inventario&action=verificarUsado');
}
exit();
}
$msg_ok = $_SESSION['mensaje_exito'] ?? '';
$msg_err = $_SESSION['mensaje_error'] ?? '';
unset($_SESSION['mensaje_exito'], $_SESSION['mensaje_error']);
$elementos_session = $_SESSION['elementos_seleccionados'] ?? [];
$elementos_mostrar = $this->prepararElementosVer($elementos_session, 'usado');
include 'views/inventario/verificar_usado.php';
}
/**
* AJAX — actualizar cantidad inventario usado
* URL: index.php?controller=Inventario&action=ajaxActualizarUsado (POST)
*/
public function ajaxActualizarUsado() {
$codigo = $_POST['codigo'] ?? '';
$cantidad = $_POST['cantidad'] ?? 0;
$ok = $this->modelo->actualizarCantidadUsado($codigo, (int)$cantidad);
echo $ok ? 'success' : 'error';
exit();
}
/**
* AJAX — eliminar del inventario usado
* URL: index.php?controller=Inventario&action=ajaxEliminarUsado (POST)
*/
public function ajaxEliminarUsado() {
$codigo = $_POST['codigo'] ?? '';
$ok = $this->modelo->eliminarItemUsado($codigo);
echo $ok ? 'success' : 'Error: no se pudo eliminar';
exit();
}
// ═══════════════════════════════════════════════════════════════
// HELPERS PRIVADOS
// ═══════════════════════════════════════════════════════════════
private function procesarSeleccion(array $post): array {
$seleccionados = [];
foreach ($post as $key => $value) {
if (strpos($key, 'seleccionar_') === 0 && $value === 'on') {
$codigo = substr($key, 12);
$cantidad = isset($post[$codigo]) ? intval($post[$codigo]) : 0;
if ($cantidad > 0) {
$epps = $this->modelo->getEPPs();
$desc = '';
foreach ($epps as $e) {
if ($e['CODIGO'] === $codigo) { $desc = $e['NOMBRE']; break; }
}
$seleccionados[] = ['codigo' => $codigo, 'descripcion' => $desc, 'cantidad' => $cantidad];
}
}
}
return $seleccionados;
}
private function prepararElementosVer(array $elementos, string $tipo): array {
$resultado = [];
foreach ($elementos as $el) {
$actual = $tipo === 'principal'
? $this->modelo->getCantidadActualPrincipal($el['codigo'])
: $this->modelo->getCantidadActualUsado($el['codigo']);
$resultado[] = [
'codigo' => $el['codigo'],
'descripcion' => $el['descripcion'],
'cantidad' => $el['cantidad'],
'cantidad_actual'=> $actual,
'cantidad_total' => $actual + $el['cantidad'],
];
}
return $resultado;
}
private function validarInfoElementos(array $elementos, array $info): array {
$errores = [];
foreach ($elementos as $el) {
$cod = $el['codigo'];
if (!isset($info[$cod])) {
$errores[] = "Falta información de factura/proveedor para: {$el['descripcion']}";
continue;
}
if (empty($info[$cod]['nfactura'])) $errores[] = "Falta N° factura para: {$el['descripcion']}";
if (empty($info[$cod]['provedor'])) $errores[] = "Falta proveedor para: {$el['descripcion']}";
}
return $errores;
}
private function eliminarDeSession(string $codigo) {
if (isset($_SESSION['elementos_seleccionados'])) {
$_SESSION['elementos_seleccionados'] = array_values(
array_filter($_SESSION['elementos_seleccionados'],
fn($el) => $el['codigo'] !== $codigo)
);
}
}
private function verificarSesion() {
if (!isset($_SESSION['DIGITA']) || empty($_SESSION['DIGITA'])) {
header('Location: index.php');
exit();
}
}
}
?>