253 lines
17 KiB
HTML
253 lines
17 KiB
HTML
{% extends "base.html" %}
|
|
|
|
{% block title %}{% trans %}Gestión de Ciclo Lectivo{% endtrans %} - Edu-Space Admin{% endblock %}
|
|
|
|
{% block content %}
|
|
<div class="container-fluid pt-5 mt-4">
|
|
<!-- Header -->
|
|
<div class="d-flex flex-column flex-md-row justify-content-between align-items-md-center gap-3 mb-4">
|
|
<div>
|
|
<h1 class="h3 fw-bold mb-1">
|
|
<i class="bi bi-calendar-range text-primary me-2"></i>{% trans %}Gestión de Ciclo Lectivo y Períodos Académicos{% endtrans %}
|
|
</h1>
|
|
<p class="text-muted mb-0 small">
|
|
{% trans %}Administración de cuatrimestres, años académicos, fechas de inicio/fin y selección del ciclo lectivo activo.{% endtrans %}
|
|
</p>
|
|
</div>
|
|
<div class="d-flex gap-2">
|
|
{% if can_edit %}
|
|
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#modalAddTerm">
|
|
<i class="bi bi-plus-lg me-1"></i>{% trans %}Nuevo Ciclo Lectivo{% endtrans %}
|
|
</button>
|
|
{% endif %}
|
|
<a href="{{ url_for('schedule.commissions_view') }}" class="btn btn-outline-secondary">
|
|
<i class="bi bi-diagram-3 me-1"></i>{% trans %}Ver Cursadas{% endtrans %}
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Academic Terms Table -->
|
|
<div class="card border-0 shadow-sm">
|
|
<div class="table-responsive">
|
|
<table class="table table-hover align-middle mb-0">
|
|
<thead class="table-light">
|
|
<tr>
|
|
<th>{% trans %}Código{% endtrans %}</th>
|
|
<th>{% trans %}Nombre del Ciclo Lectivo{% endtrans %}</th>
|
|
<th>{% trans %}Año{% endtrans %}</th>
|
|
<th>{% trans %}Período / Modalidad{% endtrans %}</th>
|
|
<th>{% trans %}Fechas del Período{% endtrans %}</th>
|
|
<th>{% trans %}Comisiones{% endtrans %}</th>
|
|
<th>{% trans %}Estado Institucional{% endtrans %}</th>
|
|
{% if can_edit %}
|
|
<th class="text-end">{% trans %}Acciones{% endtrans %}</th>
|
|
{% endif %}
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for term in terms %}
|
|
{% set t_stat = stats.get(term.id, {'commissions_count': 0}) %}
|
|
<tr class="{% if term.is_current %}table-primary-subtle{% endif %}">
|
|
<td>
|
|
<span class="badge font-monospace bg-primary-subtle text-primary border fs-6">{{ term.code }}</span>
|
|
</td>
|
|
<td>
|
|
<div class="fw-bold text-body">{{ term.name }}</div>
|
|
<small class="text-muted">ID: #{{ term.id }}</small>
|
|
</td>
|
|
<td>
|
|
<span class="fw-semibold text-body">{{ term.year }}</span>
|
|
</td>
|
|
<td>
|
|
<span class="badge bg-secondary-subtle text-secondary border">
|
|
{{ term.period_type }}
|
|
</span>
|
|
</td>
|
|
<td>
|
|
{% if term.start_date and term.end_date %}
|
|
<small class="text-body font-monospace">
|
|
<i class="bi bi-calendar3 me-1 text-primary"></i>{{ term.start_date.strftime('%d/%m/%Y') }} - {{ term.end_date.strftime('%d/%m/%Y') }}
|
|
</small>
|
|
{% else %}
|
|
<small class="text-muted">{% trans %}Sin fechas fijadas{% endtrans %}</small>
|
|
{% endif %}
|
|
</td>
|
|
<td>
|
|
<span class="badge bg-info-subtle text-info border">
|
|
<i class="bi bi-diagram-3 me-1"></i>{{ t_stat.commissions_count }} {% trans %}comisiones{% endtrans %}
|
|
</span>
|
|
</td>
|
|
<td>
|
|
{% if term.is_current %}
|
|
<span class="badge bg-success text-white px-2 py-1 shadow-sm">
|
|
<i class="bi bi-check-circle-fill me-1"></i>{% trans %}Ciclo Activo Actual{% endtrans %}
|
|
</span>
|
|
{% else %}
|
|
<span class="badge bg-secondary-subtle text-secondary border">
|
|
{% if term.is_active %}{% trans %}Habilitado{% endtrans %}{% else %}{% trans %}Archivado{% endtrans %}{% endif %}
|
|
</span>
|
|
{% endif %}
|
|
</td>
|
|
{% if can_edit %}
|
|
<td class="text-end">
|
|
<div class="btn-group btn-group-sm">
|
|
{% if not term.is_current %}
|
|
<form method="POST" action="{{ url_for('admin.academic_term_set_current', id=term.id) }}" class="d-inline"
|
|
onsubmit="return confirm('{% trans %}¿Desea establecer este ciclo lectivo como el Activo para todo el sistema?{% endtrans %}');">
|
|
<button type="submit" class="btn btn-outline-success py-0 px-2" title="{% trans %}Establecer como Ciclo Activo{% endtrans %}">
|
|
<i class="bi bi-check2-circle me-1"></i>{% trans %}Activar{% endtrans %}
|
|
</button>
|
|
</form>
|
|
{% endif %}
|
|
<button type="button" class="btn btn-outline-secondary py-0 px-2"
|
|
data-bs-toggle="modal" data-bs-target="#modalEditTerm{{ term.id }}"
|
|
title="{% trans %}Editar Ciclo Lectivo{% endtrans %}">
|
|
<i class="bi bi-pencil"></i>
|
|
</button>
|
|
</div>
|
|
|
|
<!-- Modal Editar Ciclo Lectivo -->
|
|
<div class="modal fade text-start" id="modalEditTerm{{ term.id }}" tabindex="-1" aria-hidden="true">
|
|
<div class="modal-dialog">
|
|
<div class="modal-content">
|
|
<form method="POST" action="{{ url_for('admin.academic_term_edit', id=term.id) }}">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title h6 fw-bold">
|
|
<i class="bi bi-pencil-square text-primary me-2"></i>{% trans %}Editar Ciclo Lectivo{% endtrans %}
|
|
</h5>
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
</div>
|
|
<div class="modal-body">
|
|
<div class="row g-2 mb-3">
|
|
<div class="col-md-5">
|
|
<label class="form-label small fw-semibold">{% trans %}Código{% endtrans %} *</label>
|
|
<input type="text" name="code" class="form-control form-control-sm font-monospace" value="{{ term.code }}" required>
|
|
</div>
|
|
<div class="col-md-7">
|
|
<label class="form-label small fw-semibold">{% trans %}Año Calendario{% endtrans %} *</label>
|
|
<input type="number" name="year" class="form-control form-control-sm" value="{{ term.year }}" min="2020" max="2050" required>
|
|
</div>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label class="form-label small fw-semibold">{% trans %}Nombre Descriptivo{% endtrans %} *</label>
|
|
<input type="text" name="name" class="form-control form-control-sm" value="{{ term.name }}" required>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label class="form-label small fw-semibold">{% trans %}Tipo de Período{% endtrans %}</label>
|
|
<select name="period_type" class="form-select form-select-sm">
|
|
<option value="Primer Cuatrimestre" {% if term.period_type == 'Primer Cuatrimestre' %}selected{% endif %}>Primer Cuatrimestre</option>
|
|
<option value="Segundo Cuatrimestre" {% if term.period_type == 'Segundo Cuatrimestre' %}selected{% endif %}>Segundo Cuatrimestre</option>
|
|
<option value="Anual" {% if term.period_type == 'Anual' %}selected{% endif %}>Anual</option>
|
|
<option value="Curso de Verano" {% if term.period_type == 'Curso de Verano' %}selected{% endif %}>Curso de Verano</option>
|
|
</select>
|
|
</div>
|
|
<div class="row g-2 mb-3">
|
|
<div class="col-md-6">
|
|
<label class="form-label small fw-semibold">{% trans %}Fecha Inicio{% endtrans %}</label>
|
|
<input type="date" name="start_date" class="form-control form-control-sm" value="{{ term.start_date.strftime('%Y-%m-%d') if term.start_date else '' }}">
|
|
</div>
|
|
<div class="col-md-6">
|
|
<label class="form-label small fw-semibold">{% trans %}Fecha Fin{% endtrans %}</label>
|
|
<input type="date" name="end_date" class="form-control form-control-sm" value="{{ term.end_date.strftime('%Y-%m-%d') if term.end_date else '' }}">
|
|
</div>
|
|
</div>
|
|
<div class="form-check mb-2">
|
|
<input class="form-check-input" type="checkbox" name="is_current" id="isCurr{{ term.id }}" {% if term.is_current %}checked{% endif %}>
|
|
<label class="form-check-label small fw-semibold text-primary" for="isCurr{{ term.id }}">
|
|
{% trans %}Establecer como Ciclo Lectivo Activo Actual{% endtrans %}
|
|
</label>
|
|
</div>
|
|
<div class="form-check">
|
|
<input class="form-check-input" type="checkbox" name="is_active" id="isAct{{ term.id }}" {% if term.is_active %}checked{% endif %}>
|
|
<label class="form-check-label small" for="isAct{{ term.id }}">{% trans %}Habilitado en el Sistema{% endtrans %}</label>
|
|
</div>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-sm btn-secondary" data-bs-dismiss="modal">{% trans %}Cancelar{% endtrans %}</button>
|
|
<button type="submit" class="btn btn-sm btn-primary">{% trans %}Guardar Cambios{% endtrans %}</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</td>
|
|
{% endif %}
|
|
</tr>
|
|
{% else %}
|
|
<tr>
|
|
<td colspan="8" class="text-center py-5 text-muted">
|
|
<i class="bi bi-calendar-range fs-1 d-block mb-2"></i>
|
|
{% trans %}No se encontraron ciclos lectivos registrados.{% endtrans %}
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Modal Nuevo Ciclo Lectivo -->
|
|
{% if can_edit %}
|
|
<div class="modal fade" id="modalAddTerm" tabindex="-1" aria-hidden="true">
|
|
<div class="modal-dialog">
|
|
<div class="modal-content">
|
|
<form method="POST" action="{{ url_for('admin.academic_term_add') }}">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title h6 fw-bold">
|
|
<i class="bi bi-calendar-plus text-primary me-2"></i>{% trans %}Nuevo Ciclo Lectivo / Período Académico{% endtrans %}
|
|
</h5>
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
</div>
|
|
<div class="modal-body">
|
|
<div class="row g-2 mb-3">
|
|
<div class="col-md-5">
|
|
<label class="form-label small fw-semibold">{% trans %}Código{% endtrans %} *</label>
|
|
<input type="text" name="code" class="form-control form-control-sm font-monospace" placeholder="ej. 2027-1" required>
|
|
</div>
|
|
<div class="col-md-7">
|
|
<label class="form-label small fw-semibold">{% trans %}Año Calendario{% endtrans %} *</label>
|
|
<input type="number" name="year" class="form-control form-control-sm" value="2026" min="2020" max="2050" required>
|
|
</div>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label class="form-label small fw-semibold">{% trans %}Nombre Descriptivo{% endtrans %} *</label>
|
|
<input type="text" name="name" class="form-control form-control-sm" placeholder="ej. Ciclo Lectivo 2027 - 1º Cuatrimestre" required>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label class="form-label small fw-semibold">{% trans %}Tipo de Período{% endtrans %}</label>
|
|
<select name="period_type" class="form-select form-select-sm">
|
|
<option value="Primer Cuatrimestre">Primer Cuatrimestre</option>
|
|
<option value="Segundo Cuatrimestre" selected>Segundo Cuatrimestre</option>
|
|
<option value="Anual">Anual</option>
|
|
<option value="Curso de Verano">Curso de Verano</option>
|
|
</select>
|
|
</div>
|
|
<div class="row g-2 mb-3">
|
|
<div class="col-md-6">
|
|
<label class="form-label small fw-semibold">{% trans %}Fecha Inicio{% endtrans %}</label>
|
|
<input type="date" name="start_date" class="form-control form-control-sm">
|
|
</div>
|
|
<div class="col-md-6">
|
|
<label class="form-label small fw-semibold">{% trans %}Fecha Fin{% endtrans %}</label>
|
|
<input type="date" name="end_date" class="form-control form-control-sm">
|
|
</div>
|
|
</div>
|
|
<div class="form-check">
|
|
<input class="form-check-input" type="checkbox" name="is_current" id="addIsCurr">
|
|
<label class="form-check-label small fw-semibold text-primary" for="addIsCurr">
|
|
{% trans %}Establecer de inmediato como Ciclo Lectivo Activo Actual{% endtrans %}
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-sm btn-secondary" data-bs-dismiss="modal">{% trans %}Cancelar{% endtrans %}</button>
|
|
<button type="submit" class="btn btn-sm btn-primary">{% trans %}Crear Ciclo Lectivo{% endtrans %}</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
{% endblock %}
|