From 6a3b908467b3ce63f739bd70e8eb581bfbfb6fde Mon Sep 17 00:00:00 2001 From: Jonathan Cameron Date: Wed, 30 Mar 2022 16:46:39 +0200 Subject: [PATCH] Added filters and action item for required inventory scans registry --- client/src/i18n/en/asset.json | 3 ++ client/src/i18n/fr/asset.json | 3 ++ client/src/js/services/PeriodService.js | 2 +- .../asset-scans-registry.service.js | 20 +++++---- .../asset_scans/modals/search.modal.js | 3 +- .../modals/edit.modal.js | 6 --- .../modals/search.modal.html | 15 +++++++ .../modals/search.modal.js | 22 ++++++++-- .../required-inventory-scans-registry.js | 43 ++++++++++++++++--- ...quired-inventory-scans-registry.service.js | 19 ++++++-- .../templates/action.cell.html | 6 +++ server/config/routes.js | 16 +++---- .../controllers/inventory/inventory/core.js | 2 +- .../stock/{asset.js => asset_scan.js} | 8 ++-- server/controllers/stock/core.js | 2 +- server/controllers/stock/lots.js | 2 +- .../stock/required_inventory_scans.js | 7 ++- server/models/migrations/next/migrate.sql | 6 +-- server/models/schema.sql | 6 +-- test/data.sql | 6 +-- 20 files changed, 139 insertions(+), 58 deletions(-) rename server/controllers/stock/{asset.js => asset_scan.js} (96%) diff --git a/client/src/i18n/en/asset.json b/client/src/i18n/en/asset.json index 656ebdea85..e71007c6d4 100644 --- a/client/src/i18n/en/asset.json +++ b/client/src/i18n/en/asset.json @@ -15,6 +15,7 @@ "NOT_ASSIGNED" : "Not assigned", "NO_ASSIGNMENT_HISTORY" : "No assignment history", "REQUIRED_INVENTORY_SCAN" : "Required Inventory Scan", + "REQUIRED_INVENTORY_SCAN_CREATED" : "Required inventory scan successfully created", "REQUIRED_INVENTORY_SCAN_DETAILS" : "Required Inventory Scan Details", "REQUIRED_INVENTORY_SCAN_EDITED" : "Required inventory scan successfully edited", "SCANNED_BY" : "Scanned by", @@ -29,6 +30,8 @@ "SHOW_NOT_ASSIGNED" : "Unassigned assets", "SHOW_ONLY" : "Show only", "SHOW_ONLY_ASSIGNED" : "Assigned assets", + "SHOW_SCANNED_ASSETS" : "Show Scanned Assets", + "SHOW_UNSCANNED_ASSETS" : "Show Unscanned Assets", "SUCCESSFULLY_EDITED":"Asset successfully updated", "TITLE" : "Assets", "VIEW_IN_INVENTORY" : "View Asset in Inventory", diff --git a/client/src/i18n/fr/asset.json b/client/src/i18n/fr/asset.json index 5ab750a8eb..ca61eed25e 100644 --- a/client/src/i18n/fr/asset.json +++ b/client/src/i18n/fr/asset.json @@ -15,6 +15,7 @@ "NOT_ASSIGNED" : "Aucune assignation", "NO_ASSIGNMENT_HISTORY" : "Aucun historique des assignations", "REQUIRED_INVENTORY_SCAN" : "Scan d'inventaire obligatoire", + "REQUIRED_INVENTORY_SCAN_CREATED" : "Scan d'inventaire obligatoire créé avec succès", "REQUIRED_INVENTORY_SCAN_DETAILS" : "Détails de scan d'inventaire obligatoire", "REQUIRED_INVENTORY_SCAN_EDITED" : "Scan d'inventaire obligatoire édité avec succès", "SCANNED_BY" : "Scanné par", @@ -29,6 +30,8 @@ "SHOW_NOT_ASSIGNED" : "Actifs non assigné", "SHOW_ONLY" : "Montrer uniquement", "SHOW_ONLY_ASSIGNED" : "Actifs assigné", + "SHOW_SCANNED_ASSETS" : "Montrer les actifs scannés", + "SHOW_UNSCANNED_ASSETS" : "Montrer les actifs non scannés", "SUCCESSFULLY_EDITED":"L'actif a été modifié", "TITLE" : "Actifs", "VIEW_IN_INVENTORY" : "Visualiser l'actif dans l'inventaire", diff --git a/client/src/js/services/PeriodService.js b/client/src/js/services/PeriodService.js index 374bc828f7..f2fd745455 100644 --- a/client/src/js/services/PeriodService.js +++ b/client/src/js/services/PeriodService.js @@ -52,7 +52,7 @@ function PeriodService(Moment) { }, // components will make an exception for all time - no period has to be selected - // on the server this simple removes the WHERE condition + // on the server this simply removes the WHERE condition allTime : { key : 'allTime', translateKey : 'PERIODS.ALL_TIME', diff --git a/client/src/modules/asset_scans/asset-scans-registry.service.js b/client/src/modules/asset_scans/asset-scans-registry.service.js index 42c15b61c4..2506fad55c 100644 --- a/client/src/modules/asset_scans/asset-scans-registry.service.js +++ b/client/src/modules/asset_scans/asset-scans-registry.service.js @@ -93,25 +93,27 @@ function AssetsScansRegistryService(Session, Filters, AppCache, bhConstants, Per headerCellClass : 'wrappingColHeader', visible : false, }, { - field : 'updated_at', + field : 'created_at', + type : 'date', displayName : 'ASSET.SCAN_DATE', headerTooltip : 'ASSET.SCAN_DATE', headerCellFilter : 'translate', headerCellClass : 'wrappingColHeader', cellFilter : 'date', + }, { + field : 'updated_at', + type : 'date', + displayName : 'FORM.LABELS.UPDATED', + headerTooltip : 'FORM.LABELS.UPDATED', + headerCellFilter : 'translate', + cellFilter : 'date', + visible : false, }, { field : 'assigned_to_name', displayName : 'ENTITY.ASSIGNED_TO', headerTooltip : 'ENTITY.ASSIGNED_TO', headerCellFilter : 'translate', headerCellClass : 'wrappingColHeader', - }, { - field : 'created_at', - type : 'date', - displayName : 'FORM.LABELS.SERVER_DATE', - headerCellFilter : 'translate', - cellTemplate : 'modules/journal/templates/created_at.cell.html', - visible : false, }, { field : 'action', displayName : '', @@ -162,6 +164,8 @@ function AssetsScansRegistryService(Session, Filters, AppCache, bhConstants, Per if (!periodDefined) { scansFilters.assignFilters(Periods.defaultFilters()); + // Force the default period to be this year + scansFilters.assignFilter('period', 'year', 'PERIODS.THIS_YEAR'); } } diff --git a/client/src/modules/asset_scans/modals/search.modal.js b/client/src/modules/asset_scans/modals/search.modal.js index 5af06ce59c..28a462ad04 100644 --- a/client/src/modules/asset_scans/modals/search.modal.js +++ b/client/src/modules/asset_scans/modals/search.modal.js @@ -3,8 +3,7 @@ angular.module('bhima.controllers') // dependencies injections AssetScansSearchModalController.$inject = [ - 'data', 'util', 'Store', '$uibModalInstance', 'StockService', - 'SearchModalUtilService', 'PeriodService', + 'data', 'util', 'Store', '$uibModalInstance', 'StockService', 'SearchModalUtilService', 'PeriodService', ]; function AssetScansSearchModalController(data, util, Store, Instance, Stock, SearchModal, Periods) { diff --git a/client/src/modules/required_inventory_scans/modals/edit.modal.js b/client/src/modules/required_inventory_scans/modals/edit.modal.js index 189bcf759f..440e797e9a 100644 --- a/client/src/modules/required_inventory_scans/modals/edit.modal.js +++ b/client/src/modules/required_inventory_scans/modals/edit.modal.js @@ -67,12 +67,6 @@ function RequiredInventoryScanEditModalController(Data, ReqInvScansService, function submit(form) { if (form.$invalid) { return 0; } - // ??? - // // Set up is_asset (based on html radio element values) - // if (vm.model.is_asset) { - // vm.model.is_asset = vm.model.is_asset === 1; - // } - if (vm.model.uuid) { return ReqInvScansService.update(Data.uuid, vm.model) .then(() => { diff --git a/client/src/modules/required_inventory_scans/modals/search.modal.html b/client/src/modules/required_inventory_scans/modals/search.modal.html index 82753eb87c..c435ad9151 100644 --- a/client/src/modules/required_inventory_scans/modals/search.modal.html +++ b/client/src/modules/required_inventory_scans/modals/search.modal.html @@ -24,12 +24,27 @@ +
+ + + +
+
+ + + +
{ + changes.post(filterChange); + }); + }; + // default filter limit - directly write to changes list vm.onSelectLimit = function onSelectLimit(value) { // input is type value, this will only be defined for a valid number @@ -57,7 +72,6 @@ function RequiredInventoryScansSearchModalController(data, util, Store, Instance vm.cancel = () => Instance.dismiss(); vm.submit = () => { - const loggedChanges = SearchModal.getChanges(vm.searchQueries, changes, displayValues, lastDisplayValues); return Instance.close(loggedChanges); diff --git a/client/src/modules/required_inventory_scans/required-inventory-scans-registry.js b/client/src/modules/required_inventory_scans/required-inventory-scans-registry.js index 28134cd64f..a833d751b3 100644 --- a/client/src/modules/required_inventory_scans/required-inventory-scans-registry.js +++ b/client/src/modules/required_inventory_scans/required-inventory-scans-registry.js @@ -2,9 +2,8 @@ angular.module('bhima.controllers') .controller('RequiredInventoryScansRegistryController', RequiredInventoryScansRegistryController); RequiredInventoryScansRegistryController.$inject = [ - 'StockService', 'RequiredInventoryScansService', - 'RequiredInventoryScansRegistryService', - 'StockModalService', 'DepotService', 'BarcodeService', + 'RequiredInventoryScansService', 'RequiredInventoryScansRegistryService', + 'StockModalService', 'DepotService', 'GridStateService', 'GridColumnService', 'GridGroupingService', 'NotifyService', '$state', ]; @@ -14,9 +13,8 @@ RequiredInventoryScansRegistryController.$inject = [ * This module is a registry page for assets */ function RequiredInventoryScansRegistryController( - Stock, RequiredInventoryScans, - ReqInvScansRegistryService, - StockModal, Depots, Barcode, + RequiredInventoryScans, ReqInvScansRegistryService, + StockModal, Depots, GridState, Columns, Grouping, Notify, $state, ) { @@ -73,6 +71,8 @@ function RequiredInventoryScansRegistryController( vm.latestViewFilters = vm.filters.formatView(); } + // { key : 'period', value : 'allTime', displayValue : 'PERIODS.ALL_TIME', cacheable: false }, + // load the assets scans into the grid function load(filters) { if (vm.defaultDepot) { @@ -174,6 +174,37 @@ function RequiredInventoryScansRegistryController( }); }; + /** + * Go to the Assets Registry and show a + * @param {object} scan - required inventory scan object + */ + vm.showScannedAssets = function showScannedAssets(scan) { + const filters = [{ + key : 'period', + value : 'custom', + cacheable : false, + }, { + key : 'custom_period_start', + value : scan.start_date, + cacheable : false, + }, { + key : 'custom_period_end', + value : scan.end_date, + cacheable : false, + }]; + + if (scan.depot_uuid) { + filters.push({ + key : 'depot_uuid', + value : scan.depot_uuid, + displayValue : scan.depot_name, + cacheable : false, + }); + } + + $state.go('stockAssetsScans', { filters }); + }; + // This function opens a modal through column service to let the user toggle // the visibility of the lots registry's columns. vm.openColumnConfigModal = function openColumnConfigModal() { diff --git a/client/src/modules/required_inventory_scans/required-inventory-scans-registry.service.js b/client/src/modules/required_inventory_scans/required-inventory-scans-registry.service.js index 3e1cb24be0..257f4edd3d 100644 --- a/client/src/modules/required_inventory_scans/required-inventory-scans-registry.service.js +++ b/client/src/modules/required_inventory_scans/required-inventory-scans-registry.service.js @@ -2,13 +2,13 @@ angular.module('bhima.services') .service('RequiredInventoryScansRegistryService', RequiredInventoryScansRegistryService); RequiredInventoryScansRegistryService.$inject = [ - 'SessionService', 'FilterService', 'appcache', 'bhConstants', + 'FilterService', 'PeriodService', 'appcache', 'bhConstants', 'util', ]; /** * This service encapsulates some common methods of assets scans registry */ -function RequiredInventoryScansRegistryService(Session, Filters, AppCache, bhConstants) { +function RequiredInventoryScansRegistryService(Filters, Periods, AppCache, bhConstants, util) { const service = this; /** @@ -68,8 +68,8 @@ function RequiredInventoryScansRegistryService(Session, Filters, AppCache, bhCon visible : false, }, { field : 'updated_at', - displayName : 'ASSET.SCAN_DATE', - headerTooltip : 'ASSET.SCAN_DATE', + displayName : 'FORM.LABELS.UPDATED', + headerTooltip : 'FORM.LABELS.UPDATED', headerCellFilter : 'translate', headerCellClass : 'wrappingColHeader', cellFilter : 'date', @@ -95,6 +95,7 @@ function RequiredInventoryScansRegistryService(Session, Filters, AppCache, bhCon scansFilters.registerCustomFilters([ { key : 'uuid', label : 'FORM.LABELS.REFERENCE' }, { key : 'depot_uuid', label : 'STOCK.DEPOT' }, + { key : 'reference_number', label : 'FORM.LABELS.REFERENCE_NUMBER' }, ]); if (filterCache.filters) { @@ -112,6 +113,16 @@ function RequiredInventoryScansRegistryService(Session, Filters, AppCache, bhCon if (assignedKeys.indexOf('limit') === -1) { scansFilters.assignFilter('limit', 100); } + + // assign default period filter (for the end date of the inventory scan) + const periodKeys = ['period', 'custom_period_start', 'custom_period_end']; + const periodDefined = util.arrayIncludes(assignedKeys, periodKeys); + + if (!periodDefined) { + scansFilters.assignFilters(Periods.defaultFilters()); + // Force the default period to be this year + scansFilters.assignFilter('period', 'year', 'PERIODS.THIS_YEAR'); + } } // Remove a filter diff --git a/client/src/modules/required_inventory_scans/templates/action.cell.html b/client/src/modules/required_inventory_scans/templates/action.cell.html index 60b2064b6d..af5240e486 100644 --- a/client/src/modules/required_inventory_scans/templates/action.cell.html +++ b/client/src/modules/required_inventory_scans/templates/action.cell.html @@ -17,6 +17,12 @@ +
  • + + ASSET.SHOW_SCANNED_ASSETS + +
  • + diff --git a/server/config/routes.js b/server/config/routes.js index 3c8ec9a869..ea54d3bb0a 100644 --- a/server/config/routes.js +++ b/server/config/routes.js @@ -148,7 +148,7 @@ const period = require('../controllers/finance/period'); const lots = require('../controllers/stock/lots'); // assets -const assets = require('../controllers/stock/asset'); +const assetScans = require('../controllers/stock/asset_scan'); const reqInvScans = require('../controllers/stock/required_inventory_scans'); // todo: the indicator folder must not be inside the finance folder @@ -803,13 +803,13 @@ exports.configure = function configure(app) { app.get('/stock/status', stock.listStatus); // API for asset scan related queries - app.get('/asset/conditions', assets.conditions); - app.get('/asset/scans', assets.getAssetScans); - app.get('/asset/scan/:uuid', assets.getAssetScan); - app.get('/asset/scans/reports/', assets.report); - app.post('/asset/scan', assets.createAssetScan); - app.put('/asset/scan/:uuid', assets.updateAssetScan); - app.delete('/asset/scan/:uuid/delete', assets.deleteAssetScan); + app.get('/asset/conditions', assetScans.conditions); + app.get('/asset/scans', assetScans.getAssetScans); + app.get('/asset/scan/:uuid', assetScans.getAssetScan); + app.get('/asset/scans/reports/', assetScans.report); + app.post('/asset/scan', assetScans.createAssetScan); + app.put('/asset/scan/:uuid', assetScans.updateAssetScan); + app.delete('/asset/scan/:uuid/delete', assetScans.deleteAssetScan); // API for required asset inventory scans app.get('/inventory/required/scans', reqInvScans.getRequiredInventoryScans); diff --git a/server/controllers/inventory/inventory/core.js b/server/controllers/inventory/inventory/core.js index e741b4064a..2010cd7694 100644 --- a/server/controllers/inventory/inventory/core.js +++ b/server/controllers/inventory/inventory/core.js @@ -283,7 +283,7 @@ async function getItemsMetadata(params) { filters.equals('note'); filters.equals('importance'); filters.equals('is_asset'); - filters.equals('reference_number'); + filters.fullText('reference_number'); filters.equals('manufacturer_brand'); filters.equals('manufacturer_model'); filters.custom('tags', 't.uuid IN (?)', [params.tags]); diff --git a/server/controllers/stock/asset.js b/server/controllers/stock/asset_scan.js similarity index 96% rename from server/controllers/stock/asset.js rename to server/controllers/stock/asset_scan.js index 705674876a..d6e98c3997 100644 --- a/server/controllers/stock/asset.js +++ b/server/controllers/stock/asset_scan.js @@ -71,11 +71,9 @@ function getAssetScanFilters(parameters) { filters.equals('inventory_uuid', 'inventory_uuid', 'l'); filters.equals('scanned_by'); filters.equals('condition_id', 'id', 'ac'); - filters.dateFrom('start_date', 'updated_at'); - filters.dateTo('end_date', 'updated_at'); - filters.period('period', 'updated_at'); - filters.dateFrom('custom_period_start', 'updated_at'); - filters.dateTo('custom_period_end', 'updated_at'); + filters.period('period', 'created_at'); + filters.dateFrom('custom_period_start', 'created_at'); + filters.dateTo('custom_period_end', 'created_at'); return filters; } diff --git a/server/controllers/stock/core.js b/server/controllers/stock/core.js index 7f65818e87..49794adae0 100644 --- a/server/controllers/stock/core.js +++ b/server/controllers/stock/core.js @@ -104,7 +104,7 @@ function getLotFilters(parameters) { filters.equals('text', 'text', 'i'); filters.equals('label', 'label', 'l'); filters.equals('is_asset', 'is_asset', 'i'); - filters.equals('reference_number', 'reference_number', 'l'); + filters.fullText('reference_number', 'reference_number', 'l'); filters.equals('period_id', 'period_id', 'm'); filters.equals('is_exit', 'is_exit', 'm'); filters.equals('flux_id', 'flux_id', 'm', true); diff --git a/server/controllers/stock/lots.js b/server/controllers/stock/lots.js index 5cd712bde8..3131fd5fab 100644 --- a/server/controllers/stock/lots.js +++ b/server/controllers/stock/lots.js @@ -158,7 +158,7 @@ function getDupes(req, res, next) { filters.equals('inventory_uuid'); filters.equals('entry_date'); filters.equals('expiration_date'); - filters.equals('reference_number'); + filters.fullText('reference_number'); filters.equals('serial_number'); const query = filters.applyQuery(detailsQuery); diff --git a/server/controllers/stock/required_inventory_scans.js b/server/controllers/stock/required_inventory_scans.js index 3eb20896a6..a4aac39883 100644 --- a/server/controllers/stock/required_inventory_scans.js +++ b/server/controllers/stock/required_inventory_scans.js @@ -47,9 +47,12 @@ function getFilters(parameters) { filters.equals('title'); filters.equals('description'); filters.equals('depot_uuid'); + filters.fullText('reference_number'); filters.equals('is_asset'); - filters.dateTo('start_date'); - filters.dateTo('end_date'); + + filters.period('period', 'end_date'); + filters.dateFrom('custom_period_start', 'end_date'); + filters.dateTo('custom_period_end', 'end_date'); return filters; } diff --git a/server/models/migrations/next/migrate.sql b/server/models/migrations/next/migrate.sql index df17636e27..ed81caa2e4 100644 --- a/server/models/migrations/next/migrate.sql +++ b/server/models/migrations/next/migrate.sql @@ -217,7 +217,7 @@ CREATE TABLE IF NOT EXISTS `asset_scan` ( `scanned_by` SMALLINT(5) UNSIGNED NOT NULL, `condition_id` SMALLINT(5) NOT NULL, `notes` TEXT DEFAULT NULL, - `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, -- This is the official "scan date" `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`uuid`), KEY `asset_uuid` (`asset_uuid`), @@ -241,8 +241,8 @@ CREATE TABLE IF NOT EXISTS `required_inventory_scan` ( `uuid` BINARY(16) NOT NULL, `title` VARCHAR(100) NOT NULL, `description` TEXT NULL, - `start_date` DATE NOT NULL, - `end_date` DATE NOT NULL, + `start_date` DATETIME NOT NULL, + `end_date` DATETIME NOT NULL, `depot_uuid` BINARY(16) DEFAULT NULL, -- NULL if not restricted to a specific depot `is_asset` BOOLEAN NOT NULL DEFAULT 1, -- Limit to assets if true `reference_number` TEXT NULL, -- If non null, Limit to lots/assets with same 'reference_number' diff --git a/server/models/schema.sql b/server/models/schema.sql index 83284751e9..831781898c 100644 --- a/server/models/schema.sql +++ b/server/models/schema.sql @@ -1967,7 +1967,7 @@ CREATE TABLE `asset_scan` ( `scanned_by` SMALLINT(5) UNSIGNED NOT NULL, `condition_id` SMALLINT(5) NOT NULL, `notes` TEXT DEFAULT NULL, - `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, -- This is the official "scan date" `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`uuid`), KEY `asset_uuid` (`asset_uuid`), @@ -1984,8 +1984,8 @@ CREATE TABLE `required_inventory_scan` ( `uuid` BINARY(16) NOT NULL, `title` VARCHAR(100) NOT NULL, `description` TEXT NULL, - `start_date` DATE NOT NULL, - `end_date` DATE NOT NULL, + `start_date` DATETIME NOT NULL, + `end_date` DATETIME NOT NULL, `depot_uuid` BINARY(16) DEFAULT NULL, -- NULL if not restricted to a specific depot `is_asset` BOOLEAN NOT NULL DEFAULT 1, -- Limit to assets if true `reference_number` TEXT NULL, -- If non null, Limit to lots/assets with same 'reference_number' diff --git a/test/data.sql b/test/data.sql index 93f0cc0893..13ce82d033 100644 --- a/test/data.sql +++ b/test/data.sql @@ -1205,6 +1205,6 @@ INSERT INTO `stock_assign` (`uuid`, `lot_uuid`, `entity_uuid`, `depot_uuid`, -- Add asset management scans INSERT INTO `asset_scan` (`uuid`, `asset_uuid`, `location_uuid`, `depot_uuid`, - `scanned_by`, `condition_id`, `notes`) VALUES -(0xA215AE67494744271A7F81596FC62CFC, @asset_mot1, NULL, @depot_uuid, 1, 1, 'Initial entry'), -(0xA215AE6749474422345F81596FC62CFC, @asset_mot2, NULL, @depot_uuid, 1, 1, 'Initial entry'); + `scanned_by`, `condition_id`, `notes`, `created_at`) VALUES +(0xA215AE67494744271A7F81596FC62CFC, @asset_mot1, NULL, @depot_uuid, 1, 1, 'Initial entry', DATE_ADD(NOW(), INTERVAL -7 DAY)), +(0xA215AE6749474422345F81596FC62CFC, @asset_mot2, NULL, @depot_uuid, 1, 1, 'Initial entry', NOW());