Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/Nieto2020/portalhub/llms.txt

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

The PortalHub database uses a single schema named consultoria. Every table is created with the InnoDB storage engine, utf8mb4 character set, and utf8mb4_general_ci collation, ensuring full Unicode support including emoji and special characters used in Spanish-language content. All foreign keys use the default RESTRICT behaviour unless otherwise noted.
The complete DDL is in database/schema.sql. Initial seed data — default roles, service catalogs, document-type catalogs, and the first admin account — is in database/seed.sql.

Catalog Tables

Catalog tables hold reference data that other tables reference via foreign keys. They are populated once by seed.sql and rarely change at runtime.

cat_roles

Defines the three user roles available in the system.
ColumnTypeNullableDescription
id_rolint(11)NOAuto-increment primary key
nombre_rolvarchar(50)NOUnique role name (e.g. Administrador)
Constraints: PRIMARY KEY (id_rol), UNIQUE KEY nombre_rol

cat_servicios

Catalog of accounting service types offered to clients (e.g. Declaración Anual, Contabilidad Mensual).
ColumnTypeNullableDescription
id_tipo_servicioint(11)NOAuto-increment primary key
nombre_serviciovarchar(100)NOUnique service name
Constraints: PRIMARY KEY (id_tipo_servicio), UNIQUE KEY nombre_servicio

cat_tipos_documentos

Catalog of document categories (e.g. Constancia de Situación Fiscal, CFDI).
ColumnTypeNullableDescription
id_tipo_docint(11)NOAuto-increment primary key
nombre_tipovarchar(50)NOUnique document type label
Constraints: PRIMARY KEY (id_tipo_doc), UNIQUE KEY nombre_tipo

Core User Tables

usuarios

The central identity table. Every person who can log in — admin, advisor, or client — has exactly one row here.
ColumnTypeNullableDescription
id_usuarioint(11)NOAuto-increment primary key
id_rolint(11)NOFK → cat_roles.id_rol
correovarchar(150)NOLogin email address; must be unique
numero_clientevarchar(50)YESOptional unique client number assigned by admin
password_hashvarchar(255)NOPASSWORD_BCRYPT hash via PHP password_hash()
estadoenum('activo','inactivo')YESAccount status; defaults to activo
require_password_changetinyint(1)YES1 forces a password reset on next login; defaults to 0
fecha_registrotimestampNOAutomatically set to current_timestamp() on insert
Constraints: PRIMARY KEY (id_usuario), UNIQUE KEY correo, UNIQUE KEY numero_cliente, FOREIGN KEY (id_rol) REFERENCES cat_roles(id_rol)
New users created via register.php always have require_password_change = 1, forcing them to set a personal password on first login.

perfiles

Stores extended profile data for every user. Advisor-specific and client-specific fields coexist in the same table — unused columns are NULL.
ColumnTypeNullableDescription
id_perfilint(11)NOAuto-increment primary key
id_usuarioint(11)NOFK → usuarios.id_usuario (ON DELETE CASCADE); unique — one profile per user
nombre_completovarchar(255)YESFull display name
telefonovarchar(20)YESContact phone number
foto_perfilvarchar(255)YESRelative path to uploaded profile photo
especialidadvarchar(100)YESAsesor only — area of accounting specialisation
biografiatextYESAsesor only — professional biography
rfcvarchar(13)YESCliente only — Mexican tax ID (RFC)
razon_socialvarchar(255)YESCliente only — registered business name
direccion_fiscaltextYESCliente only — registered fiscal address
fecha_actualizaciontimestampNOAuto-updates to current_timestamp() on every change
Constraints: PRIMARY KEY (id_perfil), UNIQUE KEY id_usuario, FOREIGN KEY (id_usuario) REFERENCES usuarios(id_usuario) ON DELETE CASCADE

Relationship & Workflow Tables

cliente_asesor

Tracks the assignment of clients to advisors. An admin creates and deactivates assignments; historical records are preserved with estado = 'inactivo'.
ColumnTypeNullableDescription
id_asignacionint(11)NOAuto-increment primary key
id_clienteint(11)NOFK → usuarios.id_usuario (ON DELETE CASCADE)
id_asesorint(11)NOFK → usuarios.id_usuario (ON DELETE CASCADE)
id_asignadorint(11)NOFK → usuarios.id_usuario — admin who created the assignment
fecha_asignaciontimestampNODefaults to current_timestamp()
fecha_fintimestampYESSet when the assignment is closed
estadoenum('activo','inactivo')YESDefaults to activo
motivo_cambiotextYESOptional reason recorded when reassigning or closing
Constraints: PRIMARY KEY (id_asignacion), cascading FKs on id_cliente and id_asesor; restricted FK on id_asignador

citas

Appointment records between a client and an advisor.
ColumnTypeNullableDescription
id_citaint(11)NOAuto-increment primary key
id_clienteint(11)NOFK → usuarios.id_usuario
id_asesorint(11)NOFK → usuarios.id_usuario
fecha_horadatetimeNOScheduled date and time of the appointment
estadoenum('Programada','Reprogramada','Cancelada')YESDefaults to Programada
motivo_cancelaciontextYESRequired narrative when estado = 'Cancelada'
Constraints: PRIMARY KEY (id_cita), FKs on id_cliente and id_asesor

servicios_contables

Associates a specific accounting service type with a client and tracks its progress.
ColumnTypeNullableDescription
id_servicioint(11)NOAuto-increment primary key
id_clienteint(11)NOFK → usuarios.id_usuario
id_tipo_servicioint(11)NOFK → cat_servicios.id_tipo_servicio
estadoenum('Pendiente','En proceso','Completado')YESDefaults to Pendiente
fecha_actualizaciontimestampNOAuto-updates on every UPDATE statement
Constraints: PRIMARY KEY (id_servicio), FKs on id_cliente and id_tipo_servicio

pagos_facturacion

Records payment and invoice state for a client’s service engagement.
ColumnTypeNullableDescription
id_pagoint(11)NOAuto-increment primary key
id_clienteint(11)NOFK → usuarios.id_usuario
id_servicioint(11)YESFK → servicios_contables.id_servicio (nullable — payment may precede service creation)
montodecimal(10,2)NOPayment amount
estado_pagoenum('Pendiente','Registrado','Aprobado')YESDefaults to Pendiente
estado_facturaenum('Pendiente','Emitida')YESDefaults to Pendiente
fecha_pagodatetimeYESDate and time payment was confirmed
Constraints: PRIMARY KEY (id_pago), FKs on id_cliente and id_servicio

Document & File Tables

documentos

Metadata record for every file uploaded to the system. The physical file is stored in backend/uploads/ and protected from direct web access by .htaccess.
ColumnTypeNullableDescription
id_documentoint(11)NOAuto-increment primary key
id_usuario_propietarioint(11)NOFK → usuarios.id_usuario — file owner
id_tipo_docint(11)NOFK → cat_tipos_documentos.id_tipo_doc
ruta_archivovarchar(255)NOServer-side path to the stored file
nombre_originalvarchar(255)NOOriginal filename as uploaded by the user
versionint(11)YESIncrements on re-upload of the same document; defaults to 1
validacion_cfditinyint(1)YES1 if the file has passed CFDI XML validation; defaults to 0
fecha_subidatimestampNODefaults to current_timestamp()
Constraints: PRIMARY KEY (id_documento), FKs on id_usuario_propietario and id_tipo_doc

Communication Tables

mensajes

Stores both internal chat messages and support tickets between any two users.
ColumnTypeNullableDescription
id_mensajeint(11)NOAuto-increment primary key
id_remitenteint(11)NOFK → usuarios.id_usuario — sender
id_destinatarioint(11)NOFK → usuarios.id_usuario — recipient
tipoenum('Chat interno','Ticket')YESDefaults to Chat interno
contenido_textotextNOMessage body
ruta_archivo_adjuntovarchar(255)YESOptional path to an attached file
leidatinyint(1)YES0 unread / 1 read; defaults to 0
fecha_enviotimestampNODefaults to current_timestamp()
Constraints: PRIMARY KEY (id_mensaje), separate FKs on id_remitente and id_destinatario

notificaciones

System-generated alerts delivered to individual users. The NotificationService.php shared service creates rows in this table.
ColumnTypeNullableDescription
id_notificacionint(11)NOAuto-increment primary key
id_usuario_destinoint(11)NOFK → usuarios.id_usuario
tipo_eventovarchar(50)NOShort event code (e.g. cita_programada)
mensaje_textotextNOHuman-readable notification body
leidatinyint(1)YES0 unread / 1 read; defaults to 0
fecha_creaciontimestampNODefaults to current_timestamp()
Constraints: PRIMARY KEY (id_notificacion), FK on id_usuario_destino

Reporting & Content Tables

reportes

Accounting reports authored by advisors and published to their assigned clients.
ColumnTypeNullableDescription
id_reporteint(11)NOAuto-increment primary key
id_asesorint(11)NOFK → usuarios.id_usuario (ON DELETE CASCADE)
titulovarchar(255)NOReport title
descripciontextNOShort description / abstract
contenidotextYESFull report body (may be NULL for drafts)
tipoenum('Mensual','Trimestral','Anual','Especial')YESDefaults to Mensual
estadoenum('Borrador','Publicado','Archivado')YESDefaults to Borrador
fecha_creaciontimestampNODefaults to current_timestamp()
fecha_actualizaciontimestampNOAuto-updates on every change
Constraints: PRIMARY KEY (id_reporte), FOREIGN KEY (id_asesor) REFERENCES usuarios(id_usuario) ON DELETE CASCADE

anuncios

Platform-wide announcements created by administrators and shown to all users.
ColumnTypeNullableDescription
id_anuncioint(11)NOAuto-increment primary key
id_autorint(11)NOFK → usuarios.id_usuario — admin author
titulovarchar(255)NOAnnouncement title
contenidotextNOFull announcement body
activotinyint(1)YES1 visible / 0 hidden; defaults to 1
fecha_creaciontimestampNODefaults to current_timestamp()
Constraints: PRIMARY KEY (id_anuncio), FK on id_autor

Rating & Audit Tables

calificaciones

Anonymous ratings submitted by clients to score their assigned advisor on a 1–5 scale.
ColumnTypeNullableDescription
id_calificacionint(11)NOAuto-increment primary key
id_clienteint(11)NOFK → usuarios.id_usuario — rating author
id_asesorint(11)NOFK → usuarios.id_usuario — rated advisor
puntuaciontinyint(1)NOInteger 1–5; enforced by CHECK (puntuacion BETWEEN 1 AND 5)
fechatimestampNODefaults to current_timestamp()
Constraints: PRIMARY KEY (id_calificacion), FKs on id_cliente and id_asesor, CHECK constraint on puntuacion

reset_logs

Immutable audit trail of every admin-initiated password reset. Used for compliance and security review.
ColumnTypeNullableDescription
id_logint(11)NOAuto-increment primary key
id_adminint(11)NOFK → usuarios.id_usuario (ON DELETE CASCADE) — admin who performed the reset
id_usuario_afectadoint(11)NOFK → usuarios.id_usuario (ON DELETE CASCADE) — account that was reset
fecha_reseteotimestampNODefaults to current_timestamp()
Constraints: PRIMARY KEY (id_log), cascading FKs on both id_admin and id_usuario_afectado

Character Set & Collation

All tables are defined with:
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
SettingValueReason
EngineInnoDBACID transactions and foreign-key enforcement
Character setutf8mb4Full Unicode — supports all Spanish characters and supplementary planes
Collationutf8mb4_general_ciCase-insensitive, accent-insensitive string comparisons
If you need accent-sensitive searches (e.g. distinguishing México from Mexico in queries), consider migrating specific varchar columns to utf8mb4_unicode_ci or utf8mb4_0900_ai_ci without changing the rest of the schema.

Build docs developers (and LLMs) love