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

sql
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
<?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
<?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)

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)

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:

  1. Asigna automáticamente al juez con menos casos del mismo tipo

  2. Registra el tipo de solicitud (CON DETENIDO, ORDEN DE APREHENSION, SIN DETENIDO)

  3. Muestra estadísticas de asignación

  4. 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:

  1. Campo "Dirigido": Reemplaza al campo "juez" con funcionalidad mejorada

  2. Asignación automática: Balancea la carga de trabajo entre jueces

  3. Tipos de solicitud: Clasificación específica para mejor control

  4. Estadísticas en tiempo real: Visualización clara de la distribución

  5. Sugerencias de turno: Para mantener equidad en la asignación

Comentarios

Entradas populares de este blog

Libro de gobierno

libros de gobierno por un software.