Grade bulletins (boletines) are professionally formatted A4 PDF report cards generated on demand by NuestraVoz. Each bulletin summarises a student’s final exam results across every subject in a given career, including the regular/libre status and any recuperatory scores. Admins and preceptors can download a bulletin for any enrolled student in seconds — no manual formatting required.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/Renzo717/Aula-Virtual-Universidad-Radiolocucion/llms.txt
Use this file to discover all available pages before exploring further.
What a Bulletin Contains
The generated PDF is structured in two sections:Student and Career Header
Displays the student’s full name, DNI, email address, the career name, and the academic year (e.g. “1º Año”).
nota_recuperatorio over nota when both exist — and printed below the table. A generation timestamp and branding footer round out the document.
BoletinMateriaFila Type
Each row in the PDF table corresponds to oneBoletinMateriaFila record:
nota_recuperatorio takes precedence over nota when calculating the bulletin’s overall average. If a student passed the recuperatory, that score is what counts towards their GPA.Generating a Bulletin PDF
UUID of the student whose bulletin should be generated.
UUID of the career. Only subjects belonging to this career and for which the student is actively enrolled are included.
What the API Does Internally
Fetch context
Loads the career record (
nombre, anio), the student profile (nombre, apellido, dni, email), and all active subjects for that career — in a single parallel Promise.all.Fetch grade records
Queries
notas_finales for the student across all subject IDs, filtering by anio_academico (derived from carreras.anio).Build row data
Maps each subject to a
BoletinMateriaFila, defaulting libre, regular, nota, and nota_recuperatorio to safe empty values when no grade record exists.Render PDF
Calls
generateBoletinPdf (powered by PDFKit) to produce an A4 document with a header block, the grade table, a GPA line, and a footer timestamp.Access Control
The boletines routes are protected byrequireRole('admin', 'preceptor'):
Admin
Can generate a bulletin for any student in any active career.
Preceptor
Can generate a bulletin for any student in any active career.
Supporting Endpoints
| Method | Path | Description |
|---|---|---|
GET | /api/boletines/carreras | List all active careers (id, nombre, codigo, anio) |
GET | /api/boletines/carrera/:carreraId/alumnos | List enrolled students in a career |
GET | /api/boletines/pdf?estudiante_id=&carrera_id= | Stream the bulletin PDF |
Frontend: BoletinesPage
TheBoletinesPage React component (apps/web/src/components/boletines/BoletinesPage.tsx) provides a two-step workflow for admins and preceptors:
Select a career
A dropdown populated from
GET /api/boletines/carreras lists every active career with its year. Selecting a career immediately loads its enrolled students.Download a student's bulletin
The student list renders a table with Apellido, Nombre, DNI, email, and an Imprimir PDF button per row. Clicking the button calls
GET /api/boletines/pdf with estudiante_id and carrera_id as query parameters, receives the binary response, creates a temporary object URL, and triggers an <a download> click — all without navigating away from the page.