Skip to content

Feature/panales operaciones refactoring - #43

Merged
iJosueeh merged 14 commits into
devfrom
feature/panales-operaciones-refactoring
Jul 2, 2026
Merged

Feature/panales operaciones refactoring#43
iJosueeh merged 14 commits into
devfrom
feature/panales-operaciones-refactoring

Conversation

@iJosueeh

@iJosueeh iJosueeh commented Jul 2, 2026

Copy link
Copy Markdown
Owner

No description provided.

iJosueeh added 14 commits July 2, 2026 00:17
…eanup

- UsuarioController: filter users by sede for Jefe de Sede, restrict sede assignment
- InventoryController: restrict edit/anular buttons by movement type permissions
- InventoryController: filter edit dialog type combo by permissions
- SessionManager: remove dead isTecnico/isQuimico/isAdmin methods
- Rol: remove dead isAdmin/isJefeSede/isTecnico compatibility methods
- Usuario: remove dead isTecnico method
- SQL: updated role names/descriptions and permission assignments
- SQL: Jefe de Sede gains M3_PRODUCTOS, M7_PACIENTES, CATEGORIAS
- SQL: Técnico de Farmacia gains M10_REPORTES
- PacienteController: filter patients by sede for non-admin users
- GestionarPacienteUseCase: add listarPacientesPorSede()
- PacienteAdapter: add listarPacientesPorSede()
- ProductoController: hide edit/delete buttons for non-admin users
- CategoriaController: hide edit/toggle/delete buttons for non-admin users
- Both controllers: add safety net checks in save/delete methods
- Only AdminGlobal (M2_SEDES) can create/edit/delete products and categories
- Usuario: remove isAdmin() and isJefeSede() methods
- SedeAccessValidator: use tienePermiso("M2_SEDES") instead of user.isAdmin()
- SessionManager: use tienePermiso("M2_SEDES") for sede blocking bypass
- GestionarSedeUseCase: check M2_SEDES or M5_ENTRADAS permissions via Rol entity
- Eliminates dependency on hardcoded role IDs and role names
- Sedes: SED-001, SED-002 (sequential)
- Usuarios: USR-001-0001, USR-001-0002, USR-002-0001 (USR-[SEDE]-[SEQ])
- Categorias: CAT-001-001, CAT-001-002, etc.
- Productos: PRD-001-001, PRD-001-002, etc.
- Pacientes: PAC-001-001, PAC-001-002, PAC-002-001
- Lotes: LT-001-001, etc.
- Atenciones: ATN-001-001, etc.
- Role names updated: Administrador global, Jefe de Sede, Técnico de Farmacia
- All seed data uses DELETE+INSERT for idempotent reconstruction
- Removed confusing levels 10 and 99
- Levels now: 1=Admin, 2=Director, 3=Jefe, 4=Técnico, 5=Auxiliar
- When creating a role, only shows levels higher than current user's level
- Removed debug logs
1. InventoryController: NPE guard on edit modal - if Tipo or Motivo
   combo selections are null, dialog result is null and won't process

2. PacienteController: add form validation for required fields
   (tipoDocumento, numeroDocumento, nombres, apellidos) before saving

3. RolController: add hierarchy validation when EDITING existing roles -
   cannot change to nivel <= current user, cannot edit roles with
   nivel < current user (higher hierarchy)
Copilot AI review requested due to automatic review settings July 2, 2026 07:08
@iJosueeh
iJosueeh merged commit 1db1a63 into dev Jul 2, 2026
2 checks passed

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR refactors “panel/operaciones” behavior around the permission-based authorization model (SessionManager.tienePermiso(...)), expands inventory/attention workflows, and tightens (or attempts to tighten) “Jefe de Sede” scoping across multiple modules. It also includes broad JavaFX layout/UX adjustments (padding, responsive search fields, summary cards) and updates DB seed logic / base role-permission assignments.

Changes:

  • Updated multiple JavaFX views/CSS for a more compact, responsive layout (reduced paddings, more HBox.hgrow="ALWAYS", simplified KPI cards).
  • Added/rewired permission & sede-scoping behaviors (e.g., list users by sede for non-admins; restrict action buttons; updated sidebar visibility rules).
  • Added new inventory movement edit use case and attention enhancements (auto-generating REC-YYYY-####, receta de-dup check), plus DB script updates for roles/permissions and test data.

Reviewed changes

Copilot reviewed 37 out of 39 changed files in this pull request and generated 18 comments.

Show a summary per file
File Description
src/main/resources/com/utp/meditrackapp/users-view.fxml Reduced padding and made search field responsive via HBox.hgrow.
src/main/resources/com/utp/meditrackapp/styles/global.css Compact navbar/sidebar sizing (padding/height/width).
src/main/resources/com/utp/meditrackapp/sede-view.fxml Compact header/cards; replaced FlowPane cards with HBox cards; responsive search field.
src/main/resources/com/utp/meditrackapp/roles-view.fxml Compact summary card layout + responsive search.
src/main/resources/com/utp/meditrackapp/reports-view.fxml Layout compaction + FlowPane spacing adjustments.
src/main/resources/com/utp/meditrackapp/productos-view.fxml Compact summary card layout + responsive search.
src/main/resources/com/utp/meditrackapp/pacientes-view.fxml Compact KPI layout + table column width changes + responsive search.
src/main/resources/com/utp/meditrackapp/inventory-view.fxml UI re-layout for movements/batches, icon-only PDF button, “registro rápido” row, hidden alerts container.
src/main/resources/com/utp/meditrackapp/dashboard-view.fxml Reduced spacing and adjusted module guide FlowPane wrap length.
src/main/resources/com/utp/meditrackapp/categorias-view.fxml Compact summary card layout + responsive search.
src/main/resources/com/utp/meditrackapp/catalogos-mov-view.fxml Reduced padding and made search fields responsive.
src/main/resources/com/utp/meditrackapp/atencion-view.fxml Major header/layout rework; added medico text field; icon-only PDF button; new “N° RECETA” input placement.
src/main/java/com/utp/meditrackapp/infrastructure/persistence/jdbc/JdbcUsuarioRepository.java Added findAllBySedeId query.
src/main/java/com/utp/meditrackapp/infrastructure/persistence/jdbc/JdbcRolRepository.java Loads permisos for each role in findAll().
src/main/java/com/utp/meditrackapp/infrastructure/persistence/jdbc/JdbcAtencionRepository.java Added countBySedeAndYear for receta numbering.
src/main/java/com/utp/meditrackapp/infrastructure/adapters/UserAdapter.java Exposed listarUsuariosPorSede.
src/main/java/com/utp/meditrackapp/infrastructure/adapters/PacienteAdapter.java Exposed listarPacientesPorSede.
src/main/java/com/utp/meditrackapp/infrastructure/adapters/InventoryAdapter.java Wired new EditarMovimientoUseCase and adapter method editarMovimiento(...).
src/main/java/com/utp/meditrackapp/infrastructure/adapters/AtencionAdapter.java Added receta generator + receta existence check pass-through.
src/main/java/com/utp/meditrackapp/features/users/ui/UsuarioController.java Applies sede scoping based on M2_SEDES permission for listing/search and restricts sede combo.
src/main/java/com/utp/meditrackapp/features/products/ui/ProductoController.java Adds permission gating for create/edit/delete UI flows (currently keyed off M2_SEDES).
src/main/java/com/utp/meditrackapp/features/patients/ui/PacienteController.java Adds tooltips, changes search to in-memory filtering, improves form validations, compact action buttons.
src/main/java/com/utp/meditrackapp/features/inventory/ui/InventoryController.java Date formatting in table, permission-based action visibility, edit dialog for movement fields, modal styling, alerts visibility toggle.
src/main/java/com/utp/meditrackapp/features/catalogs/ui/RolController.java Restricts role levels to 1..5, updates descriptions, adds hierarchy validation when editing.
src/main/java/com/utp/meditrackapp/features/catalogs/ui/CategoriaController.java Adds permission gating for category actions (currently keyed off M2_SEDES).
src/main/java/com/utp/meditrackapp/features/attentions/ui/AtencionController.java Removes medico ComboBox, auto-generates receta, checks duplicates before save, improves alert modality/CSS.
src/main/java/com/utp/meditrackapp/domain/services/usuario/GestionarUsuarioUseCase.java Adds listarUsuariosPorSede use case method.
src/main/java/com/utp/meditrackapp/domain/services/sede/GestionarSedeUseCase.java Changes “admin/jefe disponible” logic to permission-based checks (instantiates JDBC repo).
src/main/java/com/utp/meditrackapp/domain/services/paciente/GestionarPacienteUseCase.java Adds listarPacientesPorSede to use case.
src/main/java/com/utp/meditrackapp/domain/services/inventario/EditarMovimientoUseCase.java New use case to “edit” movements via transaction, delete+insert, stock adjustments.
src/main/java/com/utp/meditrackapp/domain/ports/out/UsuarioRepository.java Adds findAllBySedeId port method.
src/main/java/com/utp/meditrackapp/domain/ports/out/AtencionRepository.java Adds countBySedeAndYear method.
src/main/java/com/utp/meditrackapp/domain/entities/Usuario.java Removes legacy hardcoded role helper methods.
src/main/java/com/utp/meditrackapp/domain/entities/Rol.java Removes legacy hardcoded role helper methods.
src/main/java/com/utp/meditrackapp/core/validation/SedeAccessValidator.java Admin check now uses permission M2_SEDES.
src/main/java/com/utp/meditrackapp/core/ui/SidebarController.java Hides “Sistema” section when reports permission absent.
src/main/java/com/utp/meditrackapp/core/config/SessionManager.java Removes legacy helper methods; uses permission M2_SEDES for sede-block bypass.
docs/superpowers/plans/2026-07-02-jefe-sede-cleanup.md Adds an internal implementation plan document for permission/scoping cleanup.
database/meditrack_init.sql Updates role names/descriptions, reassigns permissions, and changes test data seeding behavior (now destructive).

Comment on lines 142 to +146
public List<Usuario> obtenerAdministradoresDisponibles() {
var rolRepo = new JdbcRolRepository();
return usuarioRepository.findAll().stream()
.filter(u -> u.isActivo() && (u.isAdmin() || u.isJefeSede()))
.filter(u -> {
if (!u.isActivo()) return false;
Comment on lines 53 to +58
while (rs.next()) {
roles.add(mapResultSetToRol(rs));
Rol rol = mapResultSetToRol(rs);
// Cargar permisos del rol
List<Permiso> permisos = permisoRepository.findByRolId(rol.getId());
rol.setPermisos(permisos);
roles.add(rol);
Comment on lines 67 to 72
colAcciones.setCellFactory(column -> new TableCell<>() {
private final Button editBtn = new Button();
private final Button toggleBtn = new Button();
private final Button deleteBtn = new Button();
private final boolean canWrite = sessionManager.tienePermiso("M2_SEDES");
{
Comment on lines 145 to +149
protected void onOpenRegisterModal() {
if (!sessionManager.tienePermiso("M2_SEDES")) {
showAlert("Sin permisos", "No tiene permisos para crear categorías.");
return;
}
Comment on lines 163 to +168
@FXML
protected void onSave() {
if (!sessionManager.tienePermiso("M2_SEDES")) {
showAlert("Sin permisos", "No tiene permisos para modificar categorías.");
return;
}
Comment on lines 166 to +170
protected void onSearch() {
String query = searchField.getText();
List<Paciente> resultados = pacienteAdapter.buscarPacientes(query);
patientsTable.setItems(FXCollections.observableArrayList(resultados));
List<Paciente> basePacientes = pacienteAdapter.listarPacientes();

if (query == null || query.trim().isEmpty()) {
Comment on lines +384 to +388
String numReceta = txtReceta.getText().trim();
String sedeId = sessionManager.getCurrentUser().getSedeId();
if (atencionAdapter.existeReceta(sedeId, numReceta)) {
showAlert(Alert.AlertType.WARNING, "Duplicado",
"Ya existe una atención con el número de receta " + numReceta + ". Modifíquelo e intente de nuevo.");
Comment on lines +684 to +688
-- Limpiar datos de prueba existentes para re-insertar con IDs correctos
DELETE FROM [atencion_detalles];
DELETE FROM [atenciones];
DELETE FROM [movimientos];
DELETE FROM [lotes];
Comment on lines +46 to 48
<Button onAction="#onGenerateReport" styleClass="button, sm, danger">
<graphic><FontIcon iconLiteral="fas-file-pdf" iconColor="white" /></graphic>
</Button>
Comment on lines +34 to +36
<Button onAction="#onGenerateReport" styleClass="button, sm, danger">
<graphic><FontIcon iconLiteral="fas-file-pdf" iconColor="white" /></graphic>
</Button>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants