File "Registrocontroller.php"
Full Path: C:/wamp64/www/AVIDOTAPP/uploads/docs/Registrocontroller.php
File size: 23.9 KB
MIME-type: text/x-php
Charset: utf-8
<?php
class RegistroController {
private $modelo;
public function __construct() {
require_once 'models/EmpleadoModel.php';
require_once 'models/EntregaModel.php';
$this->modelo = new EmpleadoModel();
}
// ════════════════════════════════════════════════════════════
// 1. FORMULARIO EMPLEADO (con autocompletar por cédula)
// URL: index.php?controller=Registro&action=index
// ════════════════════════════════════════════════════════════
public function index() {
$this->verificarSesion();
$centrosCosto = $this->modelo->getCentrosCosto();
$areas = $this->modelo->getAreas();
$cargos = $this->modelo->getCargos();
$errores = $_SESSION['errores_registro'] ?? [];
unset($_SESSION['errores_registro']);
include 'views/registro/formulario_empleado.php';
}
// ════════════════════════════════════════════════════════════
// 2. AJAX — autocompletar campos por cédula
// URL: index.php?controller=Registro&action=buscarCedulaAjax
// Responde JSON con los datos del último registro
// ════════════════════════════════════════════════════════════
public function buscarCedulaAjax() {
header('Content-Type: application/json; charset=utf-8');
$cedula = trim($_GET['cedula'] ?? '');
if (empty($cedula)) { echo json_encode(['ok' => false]); exit(); }
$emp = $this->modelo->buscarUltimoRegistroPorCedula($cedula);
echo $emp
? json_encode(['ok' => true, 'data' => $emp])
: json_encode(['ok' => false]);
exit();
}
// ════════════════════════════════════════════════════════════
// 3. GUARDAR EMPLEADO EN SESIÓN → redirige a formulario EPP
// URL: index.php?controller=Registro&action=guardarEmpleadoYMostrarEPP (POST)
// ════════════════════════════════════════════════════════════
public function guardarEmpleadoYMostrarEPP() {
$this->verificarSesion();
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
header('Location: index.php?controller=Registro&action=index');
exit();
}
$errores = $this->modelo->validarDatosEmpleado($_POST);
if (!empty($errores)) {
$_SESSION['errores_registro'] = $errores;
header('Location: index.php?controller=Registro&action=index');
exit();
}
$_SESSION['empleado_data'] = [
'fingreso' => $_POST['fingreso'],
'ident' => strtoupper(trim($_POST['ident'])),
'nombre' => strtoupper(trim($_POST['nombre'])),
'ccosto' => $_POST['ccosto'],
'area' => $_POST['area'],
'cargo' => $_POST['cargo'],
'tallaPant' => strtoupper(trim($_POST['tallaPant'])),
'tallaCami' => strtoupper(trim($_POST['tallaCami'])),
'tallaBot' => strtoupper(trim($_POST['tallaBot'])),
'tallaChaq' => strtoupper(trim($_POST['tallaChaq'])),
'tallaImp' => strtoupper(trim($_POST['tallaImp'])),
'tpEntrega' => $_POST['tpEntrega'],
'tpContrato' => $_POST['tpContrato'],
];
header('Location: index.php?controller=Registro&action=formularioEPP');
exit();
}
// ════════════════════════════════════════════════════════════
// 4. FORMULARIO EPP INDEPENDIENTE (con búsqueda por cédula)
// URL: index.php?controller=Registro&action=formularioEPP
// ════════════════════════════════════════════════════════════
public function formularioEPP() {
$this->verificarSesion();
$empleado_data = $_SESSION['empleado_data'] ?? null;
$empleado_buscado = null;
$error_busqueda = '';
// Búsqueda directa por cédula (sin venir del flujo normal)
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['buscar_cedula_epp'])) {
$cedula = trim($_POST['cedula_busqueda'] ?? '');
if ($cedula) {
$emp = $this->modelo->buscarUltimoRegistroPorCedula($cedula);
if ($emp) {
$empleado_buscado = $emp;
// ✅ FIX: Guardar en sesión para que procesarRegistroCompleto lo encuentre
$_SESSION['empleado_data'] = [
'fingreso' => $emp['fingreso'] ?? $emp['FINGRESO'] ?? date('Y-m-d'),
'ident' => $emp['cedula'] ?? $emp['CEDULA'] ?? '',
'nombre' => $emp['nombre'] ?? $emp['NOMBRE'] ?? '',
'ccosto' => $emp['ccosto'] ?? $emp['CCOSTO'] ?? '',
'area' => $emp['area'] ?? $emp['AREA'] ?? '',
'cargo' => $emp['cargo'] ?? $emp['CARGO'] ?? '',
'tallaPant' => $emp['tallaPant'] ?? $emp['TALLAPANT'] ?? 'NO APLICA',
'tallaCami' => $emp['tallaCami'] ?? $emp['TALLACAMI'] ?? 'NO APLICA',
'tallaBot' => $emp['tallaBot'] ?? $emp['TALLABOT'] ?? 'NO APLICA',
'tallaChaq' => $emp['tallaChaq'] ?? $emp['TALLACHAQ'] ?? $emp['tallachaq'] ?? 'NO APLICA',
'tallaImp' => $emp['tallaImp'] ?? $emp['TALLAIMP'] ?? $emp['tallaimp'] ?? 'NO APLICA',
'tpEntrega' => $emp['tpEntrega'] ?? $emp['TPENTREGA'] ?? 'Primera Entrega',
'tpContrato' => $emp['tpContrato'] ?? $emp['TPCONTRATO'] ?? 'DIRECTO',
];
} else {
$error_busqueda = 'No se encontró empleado registrado con cédula: '
. htmlspecialchars($cedula);
}
} else {
$error_busqueda = 'Ingrese una cédula para buscar.';
}
}
$inventario = $this->modelo->getInventarioDisponible();
include 'views/registro/formulario_epp.php';
}
// ════════════════════════════════════════════════════════════
// 5. PROCESAR REGISTRO COMPLETO
// URL: index.php?controller=Registro&action=procesarRegistroCompleto (POST)
// ✅ FIX: Detecta si el empleado ya existe (viene de búsqueda EPP)
// o es nuevo (viene del flujo normal de registro)
// ════════════════════════════════════════════════════════════
public function procesarRegistroCompleto() {
$this->verificarSesion();
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
header('Location: index.php?controller=Registro&action=index');
exit();
}
if (!isset($_SESSION['empleado_data'])) {
$_SESSION['error_mensaje'] = 'No se encontraron datos del empleado.';
header('Location: index.php?controller=Registro&action=index');
exit();
}
$empleado_data = $_SESSION['empleado_data'];
$cedula = $empleado_data['ident'];
// Preparar dotaciones (ahora incluye códigos)
$dotaciones = [];
foreach ($_POST['epp_seleccionados'] ?? [] as $idx => $desc) {
$cant = intval($_POST['cantidades'][$idx] ?? 0);
$codigo = trim($_POST['codigos'][$idx] ?? '');
if (!empty($desc) && $cant > 0) {
$dotaciones[] = [
'codigo' => $codigo,
'descripcion' => $desc,
'cantidad' => $cant
];
}
}
// Verificar si existe un registro PENDIENTE para este empleado en BD interna.
// - Si hay uno Pendiente → agregar EPP al registro existente (no crear nuevo)
// - Si no hay Pendiente → crear registro nuevo, aunque existan registros Entregados
$empPendiente = $this->modelo->buscarEmpleadoPendienteEnBDInterna($cedula);
if ($empPendiente) {
// Registro Pendiente existente → solo agregar dotaciones al pendiente
$resultado = $this->modelo->agregarDotacionesSoloEPP($cedula, $dotaciones);
} else {
// No hay Pendiente (o todos están Entregados) → crear registro nuevo
$resultado = $this->modelo->insertarEmpleadoConDotacion($empleado_data, $dotaciones);
}
unset($_SESSION['empleado_data'], $_SESSION['errores_registro']);
if ($resultado['success']) {
$_SESSION['success_mensaje'] = $resultado['entregas_realizadas'] > 0
? "Registro completado: {$resultado['nombre']}. EPP entregados: {$resultado['entregas_realizadas']}"
: "Empleado registrado: {$resultado['nombre']}. Sin EPP entregados.";
} else {
$_SESSION['error_mensaje'] = "Error: {$resultado['error']}";
}
header('Location: index.php?controller=Dashboard&action=index');
exit();
}
// ════════════════════════════════════════════════════════════
// 6. CONSULTA REGISTRO POR CÉDULA
// URL: index.php?controller=Registro&action=consultaRegistro
// FIX: el formulario_empleado tenía &action=consulta_registro (incorrecto)
// La URL correcta es &action=consultaRegistro
// ════════════════════════════════════════════════════════════
public function consultaRegistro() {
$this->verificarSesion();
$registros = [];
$mensaje_error = '';
$cedula_buscar = '';
$epp_disponibles = $this->modelo->getEPPDisponiblesParaAgregar();
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['buscar_cedula'])) {
$cedula_buscar = trim($_POST['cedula_consulta'] ?? '');
if ($cedula_buscar) {
$registros = $this->modelo->obtenerRegistrosPorCedula($cedula_buscar);
if (empty($registros))
$mensaje_error = 'No se encontraron registros para la cédula: '
. htmlspecialchars($cedula_buscar);
}
}
include 'views/registro/consulta_registro.php';
}
// ════════════════════════════════════════════════════════════
// 7. CARGA MASIVA CSV
// URL: index.php?controller=Registro&action=cargaMasiva
// ════════════════════════════════════════════════════════════
public function cargaMasiva() {
$this->verificarSesion();
$resultados = [];
$procesados = 0;
$errores = [];
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['archivo_csv'])) {
$file = $_FILES['archivo_csv'];
if ($file['error'] !== UPLOAD_ERR_OK) {
$errores[] = 'Error al subir el archivo.';
} elseif (strtolower(pathinfo($file['name'], PATHINFO_EXTENSION)) !== 'csv') {
$errores[] = 'Solo se aceptan archivos .csv';
} else {
$handle = fopen($file['tmp_name'], 'r');
// Eliminar BOM UTF-8 si lo hubiera
$bom = fread($handle, 3);
if ($bom !== "\xEF\xBB\xBF") rewind($handle);
$header = fgetcsv($handle, 0, ',');
$header = array_map(fn($h) => strtolower(trim($h)), $header);
$lineNum = 1;
while (($row = fgetcsv($handle, 0, ',')) !== false) {
$lineNum++;
if (count($row) < 2) continue;
$data = @array_combine($header, $row);
if (!$data) { $errores[] = "Línea $lineNum: columnas no coinciden."; continue; }
$emp = [
'fingreso' => $data['fingreso'] ?? date('Y-m-d'),
'ident' => strtoupper(trim($data['cedula'] ?? '')),
'nombre' => strtoupper(trim($data['nombre'] ?? '')),
'ccosto' => $data['ccosto'] ?? '',
'area' => $data['area'] ?? '',
'cargo' => $data['cargo'] ?? '',
'tallaPant' => strtoupper(trim($data['tallapant'] ?? 'NO APLICA')),
'tallaCami' => strtoupper(trim($data['tallacami'] ?? 'NO APLICA')),
'tallaBot' => strtoupper(trim($data['tallabot'] ?? 'NO APLICA')),
'tallaChaq' => strtoupper(trim($data['tallachaq'] ?? 'NO APLICA')),
'tallaImp' => strtoupper(trim($data['tallaimp'] ?? 'NO APLICA')),
'tpEntrega' => $data['tpentrega'] ?? 'Primera Entrega',
'tpContrato' => $data['tpcontrato'] ?? 'DIRECTO',
];
$err = $this->modelo->validarDatosEmpleado($emp);
if (!empty($err)) {
$errores[] = "Línea $lineNum ({$emp['ident']}): " . implode(', ', $err);
$resultados[] = ['cedula'=>$emp['ident'],'nombre'=>$emp['nombre'],'ok'=>false,'error'=>implode(', ',$err)];
continue;
}
$res = $this->modelo->insertarEmpleadoConDotacion($emp, []);
if ($res['success']) {
$procesados++;
$resultados[] = ['cedula'=>$emp['ident'],'nombre'=>$emp['nombre'],'ok'=>true];
} else {
$errores[] = "Línea $lineNum ({$emp['ident']}): {$res['error']}";
$resultados[] = ['cedula'=>$emp['ident'],'nombre'=>$emp['nombre'],'ok'=>false,'error'=>$res['error']];
}
}
fclose($handle);
}
}
include 'views/registro/carga_masiva.php';
}
// ════════════════════════════════════════════════════════════
// 8. DESCARGAR PLANTILLA CSV
// URL: index.php?controller=Registro&action=descargarPlantilla
// ════════════════════════════════════════════════════════════
public function descargarPlantilla() {
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=plantilla_empleados.csv');
$out = fopen('php://output', 'w');
fputs($out, "\xEF\xBB\xBF"); // BOM para Excel
fputcsv($out, ['fingreso','cedula','nombre','ccosto','area','cargo',
'tallaPant','tallaCami','tallaBot','tallaChaq','tallaImp',
'tpEntrega','tpContrato']);
fputcsv($out, ['2024-01-15','12345678','JUAN PEREZ','LOGISTICA','BODEGAS',
'AUXILIAR BODEGA','M','M','38','M','M','Primera Entrega','DIRECTO']);
fputcsv($out, ['2024-02-01','98765432','MARIA LOPEZ','PRODUCCION','MANUFACTURA',
'OPERARIO','S','S','36','S','S','Ingreso','TEMPORAL']);
fclose($out);
exit();
}
// ════════════════════════════════════════════════════════════
// 9. CANCELAR
// ════════════════════════════════════════════════════════════
public function cancelar() {
unset($_SESSION['empleado_data'], $_SESSION['errores_registro']);
header('Location: index.php?controller=Dashboard&action=index');
exit();
}
// ════════════════════════════════════════════════════════════
// 10. AGREGAR EPP
// URL: index.php?controller=Registro&action=agregarEPP (POST)
// ════════════════════════════════════════════════════════════
public function agregarEPP() {
$this->verificarSesion();
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
$_SESSION['error_mensaje'] = '❌ Método no permitido';
header('Location: index.php?controller=Registro&action=consultaRegistro');
exit();
}
$empleado_id = intval($_POST['empleado_id'] ?? 0);
$codigo_epp = trim($_POST['codigo_epp'] ?? '');
$nombre_epp = trim($_POST['nombre_epp'] ?? '');
$cantidad = intval($_POST['cantidad'] ?? 1);
if (!$empleado_id || empty($nombre_epp) || $cantidad <= 0) {
$_SESSION['error_mensaje'] = '❌ Datos inválidos para agregar EPP';
header('Location: index.php?controller=Registro&action=consultaRegistro');
exit();
}
// Verificar que el registro al que se agrega EPP esté en estado Pendiente
$registro = $this->modelo->buscarEmpleadoPorId($empleado_id);
if (!$registro || strtolower($registro['ESTADO'] ?? '') !== 'pendiente') {
$_SESSION['error_mensaje'] = '❌ Solo se puede agregar EPP a registros en estado Pendiente. Este registro ya fue Entregado.';
header('Location: index.php?controller=Registro&action=consultaRegistro');
exit();
}
$resultado = $this->modelo->agregarEPPADotacion($empleado_id, $codigo_epp, $nombre_epp, $cantidad);
if ($resultado['success']) {
$_SESSION['success_mensaje'] = '✅ ' . $resultado['mensaje'];
} else {
$_SESSION['error_mensaje'] = '❌ Error: ' . $resultado['error'];
}
header('Location: index.php?controller=Registro&action=consultaRegistro');
exit();
}
// ════════════════════════════════════════════════════════════
// 11. ELIMINAR EPP
// URL: index.php?controller=Registro&action=eliminarEPP (GET)
// ════════════════════════════════════════════════════════════
public function eliminarEPP() {
$this->verificarSesion();
$empleado_id = intval($_GET['empleado_id'] ?? 0);
$nombre_epp = trim($_GET['nombre_epp'] ?? '');
if (!$empleado_id || !$nombre_epp) {
$_SESSION['error_mensaje'] = '❌ Parámetros inválidos';
header('Location: index.php?controller=Registro&action=consultaRegistro');
exit();
}
$resultado = $this->modelo->eliminarEPPDeDotacion($empleado_id, $nombre_epp);
if ($resultado['success']) {
$_SESSION['success_mensaje'] = '✅ ' . $resultado['mensaje'];
} else {
$_SESSION['error_mensaje'] = '❌ Error: ' . $resultado['error'];
}
header('Location: index.php?controller=Registro&action=consultaRegistro');
exit();
}
// ════════════════════════════════════════════════════════════
// 12. ACTUALIZAR CANTIDAD EPP
// URL: index.php?controller=Registro&action=actualizarCantidadEPP (POST)
// ════════════════════════════════════════════════════════════
public function actualizarCantidadEPP() {
$this->verificarSesion();
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
$_SESSION['error_mensaje'] = '❌ Método no permitido';
header('Location: index.php?controller=Registro&action=consultaRegistro');
exit();
}
$empleado_id = intval($_POST['empleado_id'] ?? 0);
$nombre_epp = trim($_POST['nombre_epp'] ?? '');
$cantidad = intval($_POST['cantidad'] ?? 1);
if (!$empleado_id || !$nombre_epp || $cantidad <= 0) {
$_SESSION['error_mensaje'] = '❌ Datos inválidos';
header('Location: index.php?controller=Registro&action=consultaRegistro');
exit();
}
$resultado = $this->modelo->actualizarCantidadEPP($empleado_id, $nombre_epp, $cantidad);
if ($resultado['success']) {
$_SESSION['success_mensaje'] = '✅ ' . $resultado['mensaje'];
} else {
$_SESSION['error_mensaje'] = '❌ Error: ' . $resultado['error'];
}
header('Location: index.php?controller=Registro&action=consultaRegistro');
exit();
}
// ════════════════════════════════════════════════════════════
// 13. ELIMINAR REGISTRO COMPLETO
// URL: index.php?controller=Registro&action=eliminarRegistro (GET)
// ════════════════════════════════════════════════════════════
public function eliminarRegistro() {
$this->verificarSesion();
$id = intval($_GET['id'] ?? 0);
if (!$id) {
$_SESSION['error_mensaje'] = '❌ ID de registro inválido';
header('Location: index.php?controller=Registro&action=consultaRegistro');
exit();
}
$resultado = $this->modelo->eliminarRegistroCompleto($id);
if ($resultado['success']) {
$_SESSION['success_mensaje'] = '✅ ' . $resultado['mensaje'];
} else {
$_SESSION['error_mensaje'] = '❌ Error: ' . $resultado['error'];
}
header('Location: index.php?controller=Registro&action=consultaRegistro');
exit();
}
private function verificarSesion() {
if (!isset($_SESSION['DIGITA'])) {
header('Location: index.php');
exit();
}
}
}
?>