Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/AngelZurita28/VeranoRegional/llms.txt

Use this file to discover all available pages before exploring further.

Verano Regional uses a MySQL (or MariaDB-compatible) relational schema named verano. The schema is shipped as schema.sql in the repository root and uses utf8mb4 collation throughout to support full Unicode. All tables follow a consistent soft-delete convention: a status tinyint column where 0 means inactive and 1 means active. Audit columns (createDate, updateDate, idUserCreate, idUserUpdate) appear on most entities.

Tables

Every person who logs in to the platform has a row here, regardless of role. Role-specific data lives in the corresponding profile table (student, researcher, or coordinator).
ColumnTypeNotes
idintPrimary key
idUserTypeintFK → usertype.id
emailvarchar(100)Login credential
passwordvarchar(255)bcrypt hash
namevarchar(255)Given name
paternalLastNamevarchar(50)
maternalLastNamevarchar(50)
birthDatedate
genrevarchar(20)masculino, femenino, otro
phonevarchar(20)
street, zone, number, zipCodevarcharAddress fields
idCampusintFK → campus.id
isValidtinyint(1)0 = pending validation, 1 = validated
idUserValidateintFK → user.id (coordinator who validated)
validateDatedatetime
statustinyint0 inactive / 1 active
Defines the five roles in the platform. The id value is used throughout controllers in requireRole() calls.
idDescription
1Admin (super-admin)
2Institutional coordinator
3Campus coordinator
4Researcher
5Student
Extends user for students. One row per student per summer program period.
ColumnTypeNotes
idintPrimary key
codevarchar(20)Student ID number
CURPvarchar(18)Mexican personal ID code
semesterintCurrent semester
noteAveragedecimal(4,2)Grade average, base 100
careerProgressPercentageintMust be ≥ the summer program minimum
idCareerintFK → career.id
idResearcherRecommendsintFK → researcher.id (nullable)
idUserintFK → user.id
idSummerintFK → summer.id
Extends user for researchers. SNI and PRODEP are national research recognition flags.
ColumnTypeNotes
idintPrimary key
titlevarchar(50)Academic title (e.g., Dr., M.C.)
departmentvarchar(100)Department or lab name
SNILeveltinyint0=No SNI, 1=I, 2=II, 3=III
PRODEPtinyint0=No, 1=Yes
idUserintFK → user.id (unique)
Extends user for both campus and institutional coordinators.
ColumnTypeNotes
idintPrimary key
positionvarchar(50)Job title or position
itsInstitutionalCoordinatortinyint(1)1 = institutional, 0 = campus
idUserintFK → user.id (unique)
Each project is proposed by a researcher and goes through a validation flow before students can apply to it.
ColumnTypeNotes
idintPrimary key
titlevarchar(255)Project title
profiletextDesired student profile
activitytextDescription of activities
skillstextRequired skills
modalitytextIn-person, remote, etc.
observationstextAdditional notes
studentAmountintMax students accepted
careerProgressPercentageintMinimum career progress required
isValidtinyint(1)0 = pending, 1 = validated by coordinator
idUserResearcherintFK → user.id (nullable)
idCampusintFK → campus.id
idInstitutionintFK → institution.id
idSummerintFK → summer.id
idAreaintFK → area.id
careervarchar(255)Target career (free text)
imagetextOptional image path
Records a student’s application to a project. A student may apply to up to five projects, each with a distinct priority number.
ColumnTypeNotes
idintPrimary key
idProjectintFK → project.id
idUserStudentintFK → user.id
idSummerintFK → summer.id
prioritytinyintApplication rank (1 = top choice)
isAcceptedtinyint(1)1 after allocation algorithm runs
commenttextOptional student comment
lapNumberintProgram lap, ≥ 1
statustinyint0 inactive / 1 active
A unique index on (idProject, idUserStudent, priority) prevents duplicate priority assignments.
Defines a single summer program instance with all date windows for each phase of the program.
ColumnTypeNotes
idintPrimary key
descriptionvarchar(300)e.g., “Verano 2026”
summerStartDate / summerEndDatedatetimeOverall program dates
startDate / endDatedatetimeRegistration window
startValidateResearcherDate / endValidateResearcherDatedatetimeResearcher validation window
startCreateApplicationDate / endCreateApplicationDatedatetimeStudent application window
startValidateApplicationDate / endValidateApplicationDatedatetimeCoordinator validation window
startCreateReportDate / endCreateReportDatedatetimeReport submission window
startValidateReportDate / endValidateReportDatedatetimeReport validation window
studentApplicationintMax applications per student
studentPerProjectintMax students per project
studentProgressMinPercentageintMinimum career progress to apply
A campus belongs to an institution and is located in a city.
ColumnTypeNotes
idintPrimary key
descriptionvarchar(100)Campus name
campusAbbreviationvarchar(20)Short code
idInstitutionintFK → institution.id
idCityintFK → city.id
Top-level academic institution. Campuses and users belong to institutions.
ColumnTypeNotes
idintPrimary key
descriptionvarchar(255)Full institution name (unique)
abbreviationvarchar(20)Short name
idStateintFK → state.id
institutional_emailvarchar(255)Official contact email
domainvarchar(255)Email domain for OTP validation
A career (degree programme) belongs to a campus. Students register under a specific career.
ColumnTypeNotes
idintPrimary key
descriptionvarchar(100)Career name
idCampusintFK → campus.id
A taxonomy of research areas that projects are tagged with.
ColumnTypeNotes
idintPrimary key
descriptionvarchar(300)Area name
Tracks a report file uploaded by a student for their assigned project.
ColumnTypeNotes
idintPrimary key
idUserintFK → user.id (student)
idProjectintFK → project.id
updateDatedatetimeLast upload timestamp
statustinyint(1)Validation status
document defines required document types (e.g., CURP, KARDEX) identified by a unique prefix. studentdocument records which documents a student has uploaded; the uploaded file is stored on disk under uploads/student_documents/{studentId}/{prefix}.pdf.A unique index on (idDocument, idStudent) in studentdocument ensures one upload per document type per student.
Stores the hashed OTP sent during pre-registration email verification. The is_used flag is set to 1 after the student completes registration.
ColumnTypeNotes
idintPrimary key
emailvarchar(100)Unique — one active OTP per address
otp_hashvarchar(255)bcrypt hash of the OTP
expires_atdatetimeExpiry timestamp
is_usedtinyint(1)1 after successful verification
Stores the hashed OTP issued during the forgot-password flow.
ColumnTypeNotes
idintPrimary key
emailvarchar(100)Target address (indexed)
otp_hashvarchar(255)bcrypt hash of the OTP
expires_atdatetimeExpiry timestamp
Contains registration keys (e.g., employee IDs) that must be presented during sign-up to verify eligibility for a given role.
ColumnTypeNotes
idintPrimary key
registration_keyvarchar(50)Unique key (e.g., institutional ID)
id_user_typeintFK → usertype.id — role this key grants

Database views

The schema ships eight pre-built views that join the normalised tables into flat, query-friendly result sets. Controllers and models read from these views instead of writing multi-table joins inline.
ViewDescription
vw_projectdetailsProjects joined with researcher name and title, area, campus, and institution
vw_studentdetailsStudents joined with career, campus, and institution
vw_researcherdetailsResearchers joined with campus and institution
vw_coordinatordetailsCoordinators joined with campus and institution; includes coordinatorType label
vw_projectapplicationsApplications joined with vw_studentdetails — used by researchers to see who applied
vw_studentapplicationsApplications joined with vw_projectdetails — used by students to see their applications
vw_campusdetailsCampus joined with institution name and a city - state location string
vw_careerdetailsCareers joined with campus and institution

Key relationships

user         → usertype       (user.idUserType)
user         → campus         (user.idCampus)
student      → user           (student.idUser)
student      → career         (student.idCareer)
student      → summer         (student.idSummer)
researcher   → user           (researcher.idUser)
coordinator  → user           (coordinator.idUser)
project      → user           (project.idUserResearcher)
project      → campus         (project.idCampus)
project      → institution    (project.idInstitution)
project      → summer         (project.idSummer)
project      → area           (project.idArea)
application  → project        (application.idProject)
application  → user           (application.idUserStudent)
application  → summer         (application.idSummer)
campus       → institution    (campus.idInstitution)
campus       → city           (campus.idCity)
career       → campus         (career.idCampus)
studentdocument → document    (studentdocument.idDocument)
studentdocument → student     (studentdocument.idStudent)
The status column follows a consistent convention across all tables: 0 = inactive (soft-deleted), 1 = active. Queries should always filter on status = 1 unless you intentionally need to retrieve inactive records.

Build docs developers (and LLMs) love