Files
admin-edu-space/frontend/views/schedule/my_grades.html
T

177 lines
8.0 KiB
HTML

{% extends 'base.html' %}
{% block title %}Mis Calificaciones y Estado Académico — Edu-Space{% endblock %}
{% block content %}
<div class="container-fluid py-4">
<!-- Breadcrumb -->
<nav aria-label="breadcrumb" class="mb-3">
<ol class="breadcrumb small">
<li class="breadcrumb-item"><a href="/dashboard">Inicio</a></li>
<li class="breadcrumb-item active">Mis Calificaciones</li>
</ol>
</nav>
<!-- Header Banner -->
<div class="card border-0 shadow-sm mb-4 bg-body">
<div class="card-body p-4">
<div class="d-flex flex-wrap justify-content-between align-items-center gap-3">
<div>
<span class="badge bg-success-subtle text-success border border-success-subtle font-monospace px-2 py-1 mb-2">
<i class="bi bi-mortarboard-fill me-1"></i>Portal del Estudiante
</span>
<h3 class="fw-bold mb-1">Mis Calificaciones y Regularidad</h3>
<p class="text-muted small mb-0">
Consulta oficial de notas por hito evaluativo, estado de cursada y actas selladas por Bedelía.
</p>
</div>
<button type="button" class="btn btn-outline-secondary btn-sm" onclick="window.print()">
<i class="bi bi-printer me-1"></i>Imprimir Certificado de Cursada
</button>
</div>
</div>
</div>
<!-- Subjects Grades Accordion / Cards -->
{% if subjects and subjects|length > 0 %}
<div class="row g-4">
{% for item in subjects %}
<div class="col-12">
<div class="card border-0 shadow-sm">
<div class="card-header bg-body-tertiary border-0 py-3 d-flex justify-content-between align-items-center flex-wrap gap-2">
<div>
<div class="d-flex align-items-center gap-2 mb-1">
<span class="badge bg-primary-subtle text-primary border font-monospace">
{{ item.commission.code }}
</span>
<span class="badge bg-secondary-subtle text-secondary border font-monospace">
{{ item.commission.semester }} {{ item.commission.year }}
</span>
{% if item.acta_number %}
<span class="badge bg-danger-subtle text-danger border border-danger-subtle font-monospace">
<i class="bi bi-lock-fill me-1"></i>Acta Cerrada: {{ item.acta_number }}
</span>
{% else %}
<span class="badge bg-info-subtle text-info border border-info-subtle">
<i class="bi bi-hourglass-split me-1"></i>Cursada en Curso
</span>
{% endif %}
</div>
<h5 class="fw-bold mb-0 text-body">{{ item.subject.name }}</h5>
<small class="text-muted">{{ item.subject.code }} · Carrera: {{ item.subject.career or 'Tecnicatura / Licenciatura' }}</small>
</div>
<div class="d-flex align-items-center gap-3">
<div class="text-end">
<span class="small text-muted d-block">Promedio General</span>
<span class="fw-bold fs-5 font-monospace text-primary">
{{ item.average if item.average is not none else '-' }}
</span>
</div>
<div>
{% if item.academic_condition == 'PROMOCIONADO' %}
<span class="badge bg-success text-white py-2 px-3 fs-6">
<i class="bi bi-award-fill me-1"></i>PROMOCIONADO
</span>
{% elif item.academic_condition == 'REGULAR' %}
<span class="badge bg-primary text-white py-2 px-3 fs-6">
<i class="bi bi-check-circle-fill me-1"></i>REGULAR
</span>
{% elif item.academic_condition == 'LIBRE' %}
<span class="badge bg-danger text-white py-2 px-3 fs-6">
<i class="bi bi-x-circle-fill me-1"></i>LIBRE
</span>
{% else %}
<span class="badge bg-secondary text-white py-2 px-3 fs-6">
PENDIENTE
</span>
{% endif %}
</div>
</div>
</div>
<div class="card-body p-0">
<div class="table-responsive">
<table class="table table-hover align-middle mb-0">
<thead class="table-light small">
<tr>
<th class="ps-3">Hito Evaluativo</th>
<th>Fecha</th>
<th>Tipo</th>
<th class="text-center">Calificación</th>
<th class="text-center">Condición</th>
<th class="pe-3">Observaciones de Cátedra</th>
</tr>
</thead>
<tbody>
{% for g in item.grades %}
<tr>
<td class="ps-3 fw-semibold text-body">
{{ g.milestone_title }}
</td>
<td class="font-monospace text-muted small">
{{ g.milestone_date }}
</td>
<td>
<span class="badge bg-light text-dark border">
{{ g.milestone_type }}
</span>
</td>
<td class="text-center">
{% if g.is_absent %}
<span class="badge bg-warning text-dark font-monospace">AUSENTE</span>
{% elif g.score is not none %}
<span class="font-monospace fw-bold fs-6 {% if g.score >= 7 %}text-success{% elif g.score >= 4 %}text-primary{% else %}text-danger{% endif %}">
{{ g.score }}
</span>
{% else %}
<span class="text-muted">-</span>
{% endif %}
</td>
<td class="text-center">
{% if g.is_absent %}
<span class="badge bg-warning-subtle text-warning border">Ausente</span>
{% elif g.score is not none %}
{% if g.score >= 7 %}
<span class="badge bg-success-subtle text-success border">Aprobado / Promoción</span>
{% elif g.score >= 4 %}
<span class="badge bg-primary-subtle text-primary border">Aprobado</span>
{% else %}
<span class="badge bg-danger-subtle text-danger border">Desaprobado</span>
{% endif %}
{% else %}
<span class="badge bg-secondary-subtle text-secondary border">Sin Calificar</span>
{% endif %}
</td>
<td class="pe-3 small text-muted">
{{ g.feedback or '-' }}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
{% endfor %}
</div>
{% else %}
<div class="card border-0 shadow-sm">
<div class="card-body text-center py-5">
<i class="bi bi-journal-x fs-1 text-muted d-block mb-3"></i>
<h5 class="fw-bold text-muted">Aún no se registran calificaciones cargadas</h5>
<p class="text-muted small">
Tus notas aparecerán aquí a medida que los equipos docentes carguen las evaluaciones de tus materias cursadas.
</p>
<a href="/schedule/today_schedule" class="btn btn-outline-primary btn-sm">
<i class="bi bi-calendar-day me-1"></i>Ver Cartelera de Clases
</a>
</div>
</div>
{% endif %}
</div>
{% endblock %}