Feature/panales operaciones refactoring - #43
Merged
Conversation
…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
…ttentions doctors
…al and empty by default
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)
There was a problem hiding this comment.
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> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.