Sistema de Juzgado con Asignación Equitativa de Turnos
Sistema de Juzgado con Asignación Equitativa de Turnos
Implementaré el sistema con los cambios solicitados: campo "dirigido" en lugar de "juez" y funcionalidad para asignación equitativa de turnos a jueces. Aquí está la estructura completa actualizada:
1. Estructura de la Base de Datos
CREATE TABLE IF NOT EXISTS solicitudes ( id INT AUTO_INCREMENT PRIMARY KEY, prefolio VARCHAR(20) UNIQUE, folio VARCHAR(20) DEFAULT NULL, carpeta VARCHAR(50) DEFAULT NULL, dirigido VARCHAR(100) DEFAULT NULL COMMENT 'Juez asignado', tipo_solicitud ENUM('CON_DETENIDO', 'ORDEN_APREHENSION', 'SIN_DETENIDO') NOT NULL, fecha_registro DATETIME DEFAULT CURRENT_TIMESTAMP, registro VARCHAR(100) DEFAULT NULL, promovente VARCHAR(100), solicitud TEXT, archivo VARCHAR(255), estado ENUM('ENVIADA','VALIDADA','RECHAZADA','CADUCADA') DEFAULT 'ENVIADA', observaciones TEXT, tiene_vencimiento BOOLEAN DEFAULT 0, fecha_vencimiento DATE DEFAULT NULL, resolvio VARCHAR(100) DEFAULT NULL, fecha_contesto DATE DEFAULT NULL ); CREATE TABLE IF NOT EXISTS jueces ( id INT AUTO_INCREMENT PRIMARY KEY, nombre VARCHAR(100) NOT NULL, activo BOOLEAN DEFAULT 1 ); INSERT INTO jueces (nombre) VALUES ('LIC. ERICK SERRANO AGUIRRE'), ('LIC. PATRICIA LOZANO HERNANDEZ');
2. Modelo Actualizado (SolicitudModel.php)
<?php
class SolicitudModel {
private $db;
public function __construct() {
$this->db = (new Database())->connect();
}
public function getAll() {
$query = "SELECT s.*, j.nombre AS nombre_juez
FROM solicitudes s
LEFT JOIN jueces j ON s.dirigido = j.id
ORDER BY s.fecha_registro DESC";
$stmt = $this->db->prepare($query);
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
public function create($data) {
// Asignar turno automáticamente
$juez_id = $this->asignarTurno($data['tipo_solicitud']);
$query = "INSERT INTO solicitudes (
prefolio, promovente, tipo_solicitud, solicitud, archivo,
tiene_vencimiento, fecha_vencimiento, registro, dirigido
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
$stmt = $this->db->prepare($query);
return $stmt->execute([
$data['prefolio'],
$data['promovente'],
$data['tipo_solicitud'],
$data['solicitud'],
$data['archivo'],
$data['tiene_vencimiento'],
$data['fecha_vencimiento'],
$data['registro'] ?? 'Sistema',
$juez_id
]);
}
private function asignarTurno($tipoSolicitud) {
// Obtener conteo actual por juez y tipo de solicitud
$query = "SELECT j.id, j.nombre, COUNT(s.id) as conteo
FROM jueces j
LEFT JOIN solicitudes s ON j.id = s.dirigido AND s.tipo_solicitud = ?
WHERE j.activo = 1
GROUP BY j.id
ORDER BY conteo ASC";
$stmt = $this->db->prepare($query);
$stmt->execute([$tipoSolicitud]);
$jueces = $stmt->fetchAll(PDO::FETCH_ASSOC);
return $jueces[0]['id'] ?? null; // Asignar al juez con menos casos
}
public function getEstadisticas() {
$query = "SELECT
s.tipo_solicitud,
SUM(IF(j.nombre = 'LIC. ERICK SERRANO AGUIRRE', 1, 0)) as erick,
SUM(IF(j.nombre = 'LIC. PATRICIA LOZANO HERNANDEZ', 1, 0)) as patricia
FROM solicitudes s
LEFT JOIN jueces j ON s.dirigido = j.id
GROUP BY s.tipo_solicitud";
$stmt = $this->db->prepare($query);
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
}
?>3. Controlador Actualizado (SolicitudesController.php)
<?php
require_once '../models/SolicitudModel.php';
class SolicitudesController {
private $model;
public function __construct() {
$this->model = new SolicitudModel();
}
public function index() {
$solicitudes = $this->model->getAll();
$estadisticas = $this->model->getEstadisticas();
require_once '../views/solicitudes/index.php';
}
public function create() {
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$data = $this->prepareData($_POST, $_FILES);
if ($this->model->create($data)) {
header('Location: /solicitudes?success=1');
exit();
} else {
header('Location: /solicitudes?error=1');
exit();
}
}
}
private function prepareData($post, $files) {
$prefolio = 'P-' . date('YmdHis') . '-' . rand(100,999);
$archivo_nombre = $files['archivo']['name'];
$archivo_ruta = 'archivos/' . $prefolio . '-' . basename($archivo_nombre);
move_uploaded_file($files['archivo']['tmp_name'], $archivo_ruta);
return [
'prefolio' => $prefolio,
'promovente' => $post['promovente'],
'tipo_solicitud' => $post['tipo_solicitud'],
'solicitud' => $post['solicitud'],
'archivo' => $archivo_ruta,
'tiene_vencimiento' => isset($post['tiene_vencimiento']) ? 1 : 0,
'fecha_vencimiento' => $post['fecha_vencimiento'] ?? null,
'registro' => $post['registro'] ?? 'Sistema'
];
}
}
?>4. Vista Actualizada (index.php)
<!-- Sección de Estadísticas --> <div class="card mb-4 shadow"> <div class="card-header bg-primary text-white"> <h5>Reporte de Solicitudes por Juez y Tipo de Solicitud</h5> </div> <div class="card-body"> <table class="table table-bordered"> <thead class="table-dark"> <tr> <th>Tipo de Solicitud</th> <th>LIC. ERICK SERRANO AGUIRRE</th> <th>LIC. PATRICIA LOZANO HERNANDEZ</th> <th>Sugerencia de Turno</th> </tr> </thead> <tbody> <?php foreach ($estadisticas as $est): ?> <tr> <td><?= $this->traducirTipoSolicitud($est['tipo_solicitud']) ?></td> <td><?= $est['erick'] ?></td> <td><?= $est['patricia'] ?></td> <td> <?= $this->sugerirTurno($est['tipo_solicitud'], $est['erick'], $est['patricia']) ?> </td> </tr> <?php endforeach; ?> </tbody> </table> </div> </div> <!-- En la tabla principal, cambiar "Juez" por "Dirigido" --> <thead class="table-dark"> <tr> <th>Prefolio</th> <th>Promovente</th> <th>Tipo</th> <th>Dirigido</th> <th>Registró</th> <th>Estado</th> <th>Vence</th> <th>Alerta</th> <th>Acciones</th> </tr> </thead> <!-- Helper functions para la vista --> <?php function traducirTipoSolicitud($tipo) { $traducciones = [ 'CON_DETENIDO' => 'CON DETENIDO', 'ORDEN_APREHENSION' => 'ORDEN DE APREHENSION', 'SIN_DETENIDO' => 'SIN DETENIDO' ]; return $traducciones[$tipo] ?? $tipo; } function sugerirTurno($tipo, $erick, $patricia) { $sugerencias = [ 'CON_DETENIDO' => $erick > $patricia ? 'LIC. PATRICIA LOZANO HERNANDEZ' : 'LIC. ERICK SERRANO AGUIRRE', 'ORDEN_APREHENSION' => $erick < $patricia ? 'LIC. ERICK SERRANO AGUIRRE' : 'LIC. PATRICIA LOZANO HERNANDEZ', 'SIN_DETENIDO' => $erick > $patricia ? 'LIC. PATRICIA LOZANO HERNANDEZ' : 'LIC. ERICK SERRANO AGUIRRE' ]; return "Sugerido: " . ($sugerencias[$tipo] ?? ''); } ?>
5. Formulario de Registro Actualizado (_form_registro.php)
<div class="modal-body"> <input type="hidden" name="registro" value="Sistema"> <div class="row"> <div class="col-md-6 mb-3"> <label for="promovente" class="form-label">Promovente</label> <input type="text" class="form-control" id="promovente" name="promovente" required> </div> <div class="col-md-6 mb-3"> <label for="tipo_solicitud" class="form-label">Tipo de Solicitud</label> <select class="form-select" id="tipo_solicitud" name="tipo_solicitud" required> <option value="CON_DETENIDO">CON DETENIDO</option> <option value="ORDEN_APREHENSION">ORDEN DE APREHENSION</option> <option value="SIN_DETENIDO">SIN DETENIDO</option> </select> </div> </div> <!-- Resto del formulario... --> </div>
6. Funcionalidad de Asignación Automática
El sistema ahora:
Asigna automáticamente al juez con menos casos del mismo tipo
Registra el tipo de solicitud (CON DETENIDO, ORDEN DE APREHENSION, SIN DETENIDO)
Muestra estadísticas de asignación
Sugiere a qué juez asignar el próximo caso para mantener equilibrio
7. Reporte de Asignaciones
El reporte muestra:
Cantidad de casos por juez y tipo de solicitud
Sugerencia para el próximo turno basado en el balance actual
Datos actualizados en tiempo real
Características Clave:
Campo "Dirigido": Reemplaza al campo "juez" con funcionalidad mejorada
Asignación automática: Balancea la carga de trabajo entre jueces
Tipos de solicitud: Clasificación específica para mejor control
Estadísticas en tiempo real: Visualización clara de la distribución
Sugerencias de turno: Para mantener equidad en la asignación
Comentarios
Publicar un comentario