feat: enhance search functionality and add sede validation in services - #33
Merged
Conversation
There was a problem hiding this comment.
Pull request overview
This PR enhances multi-term search behavior across the app (global search + list filtering), adds navigation “handoff” of initial search terms between modules, and introduces validation to prevent inventory/attention operations when a Sede is inactive. It also expands product/inventory UIs (price + stock display/filtering) and adjusts role/permission handling and seed data.
Changes:
- Implement multi-word (order-independent) search in DAOs and UI controllers, plus integration test coverage for multi-word global search.
- Add initial-search navigation parameters (Topbar → Productos / Inventario) and batch filtering UI + controller support.
- Add Sede active-state validation for inventory movements and attentions; extend product model/DAO/UI for
precio_unitarioand per-sede stock display.
Reviewed changes
Copilot reviewed 24 out of 24 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
| src/test/java/com/utp/meditrackapp/features/search/dao/GlobalSearchDaoIntegrationTest.java | Adds integration test for multi-word global search queries. |
| src/main/resources/com/utp/meditrackapp/sidebar.fxml | Removes “Movimientos / Mermas” button from sidebar UI. |
| src/main/resources/com/utp/meditrackapp/productos-view.fxml | Hides product ID column; adds price/stock columns and price input field. |
| src/main/resources/com/utp/meditrackapp/inventory-view.fxml | Adds batch-monitor search bar (text field + button) wired to controller. |
| src/main/java/com/utp/meditrackapp/features/users/ui/UsuarioController.java | Improves user search; replaces delete with activate/deactivate toggle in actions column. |
| src/main/java/com/utp/meditrackapp/features/sedes/dao/SedeDAO.java | Adds buscarPorId returning Optional<Sede> for Sede validation use-cases. |
| src/main/java/com/utp/meditrackapp/features/search/dao/GlobalSearchDAO.java | Implements dynamic multi-term SQL for patients/products; keeps batch search simple. |
| src/main/java/com/utp/meditrackapp/features/products/ui/ProductoController.java | Adds stock-per-sede display, price field, multi-term filtering, and initial-search handling. |
| src/main/java/com/utp/meditrackapp/features/patients/repository/PacienteRepositoryImpl.java | Implements multi-term SQL search for pacientes; falls back to findAll() on empty query. |
| src/main/java/com/utp/meditrackapp/features/inventory/ui/InventoryController.java | Adds initial-search handling and in-memory batch list filtering + handler method. |
| src/main/java/com/utp/meditrackapp/features/inventory/service/InventarioService.java | Blocks movement registration when the associated Sede is inactive. |
| src/main/java/com/utp/meditrackapp/features/auth/Dao/UsuarioDao.java | Replaces “delete/deactivate” with toggleEstado(id, nuevoEstado) update. |
| src/main/java/com/utp/meditrackapp/features/attentions/service/AtencionService.java | Validates Sede active state before registering an attention, returning user-facing messages. |
| src/main/java/com/utp/meditrackapp/core/ui/TopbarController.java | Routes PRODUCT results to Productos (with initial search) and BATCH to Inventario (with initial search). |
| src/main/java/com/utp/meditrackapp/core/ui/SidebarController.java | Removes Movements navigation and adjusts role-based visibility logic. |
| src/main/java/com/utp/meditrackapp/core/models/entity/Producto.java | Adds precioUnitario field + getter/setter. |
| src/main/java/com/utp/meditrackapp/core/dao/RolDAO.java | Prevents role deletion when users are assigned to the role. |
| src/main/java/com/utp/meditrackapp/core/dao/ProductoDAO.java | Adds optional precio_unitario column support (schema detection + CRUD/select mapping). |
| src/main/java/com/utp/meditrackapp/core/dao/LoteDAO.java | Adds obtenerStockTotalPorSede to fetch per-product stock totals for a sede. |
| src/main/java/com/utp/meditrackapp/core/dao/CategoriaDAO.java | Prevents category deletion when products are assigned to the category. |
| src/main/java/com/utp/meditrackapp/core/config/SessionManager.java | Changes role checks to substring-based matching (but currently has an accent/diacritics bug). |
| src/main/java/com/utp/meditrackapp/core/config/NavigationService.java | Adds initial-search parameters for Inventario/Productos navigation and clears after read. |
| database/nuevoscriptSQLsemifinal.txt | Updates roles and seed users (adds Químico + Técnico roles/users). |
| database/init.sql | Updates roles seed and inserts multiple default users. |
Comment on lines
35
to
38
| public boolean isTecnico() { | ||
| return isLoggedIn() && "Técnico de Farmacia".equalsIgnoreCase(currentUser.getRolNombre()); | ||
| return isLoggedIn() && currentUser.getRolNombre() != null && | ||
| currentUser.getRolNombre().toLowerCase().contains("tecnic"); | ||
| } |
Comment on lines
40
to
44
| public boolean isQuimico() { | ||
| return isLoggedIn() && "Químico Farmacéutico".equalsIgnoreCase(currentUser.getRolNombre()); | ||
| return isLoggedIn() && currentUser.getRolNombre() != null && | ||
| (currentUser.getRolNombre().toLowerCase().contains("farmac") || | ||
| currentUser.getRolNombre().toLowerCase().contains("quimic")); | ||
| } |
Comment on lines
+188
to
193
| btnEdit.setTooltip(new Tooltip("Editar usuario")); | ||
| btnEdit.setOnAction(e -> showEditForm(getTableView().getItems().get(getIndex()))); | ||
|
|
||
| btnDelete.setGraphic(new FontIcon("fas-user-minus")); | ||
| btnDelete.getStyleClass().addAll("button", "flat", "danger"); | ||
| btnDelete.setOnAction(e -> handleDelete(getTableView().getItems().get(getIndex()))); | ||
| btnToggle.getStyleClass().addAll("button", "flat"); | ||
| btnToggle.setOnAction(e -> handleToggleStatus(getTableView().getItems().get(getIndex()))); | ||
| } |
Comment on lines
+200
to
+214
| } else { | ||
| Usuario u = getTableView().getItems().get(getIndex()); | ||
| if (u.getIsActivo() == 1) { | ||
| btnToggle.setGraphic(new FontIcon("fas-user-minus")); | ||
| btnToggle.getStyleClass().removeAll("success"); | ||
| btnToggle.getStyleClass().add("danger"); | ||
| btnToggle.setTooltip(new Tooltip("Desactivar usuario")); | ||
| } else { | ||
| btnToggle.setGraphic(new FontIcon("fas-user-check")); | ||
| btnToggle.getStyleClass().removeAll("danger"); | ||
| btnToggle.getStyleClass().add("success"); | ||
| btnToggle.setTooltip(new Tooltip("Activar usuario")); | ||
| } | ||
| setGraphic(box); | ||
| } |
Comment on lines
+91
to
+105
| @Override protected void updateItem(Integer item, boolean empty) { | ||
| super.updateItem(item, empty); | ||
| if (empty || item == null) { | ||
| setText(null); | ||
| setGraphic(null); | ||
| } else { | ||
| setText(item.toString()); | ||
| Producto p = getTableRow().getItem(); | ||
| if (p != null && p.getStockMinimo() != null && item < p.getStockMinimo()) { | ||
| getStyleClass().add("text-danger"); | ||
| setStyle("-fx-font-weight: bold;"); | ||
| } else { | ||
| getStyleClass().remove("text-danger"); | ||
| setStyle(""); | ||
| } |
|
|
||
| @Test | ||
| public void testMultiWordSearch() throws SQLException { | ||
| // 'Paracetamol 500mg' exist in seeds. |
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.