Index: src/stock-physical-inventory-draft/physical-inventory-product-group.filter.js =================================================================== diff -u -N -ra8be4a11e5824f788f6390fabf4528443397da57 -rdbf28b4acb8b402c6f8eb7bb03b30ad2336f681d --- src/stock-physical-inventory-draft/physical-inventory-product-group.filter.js (.../physical-inventory-product-group.filter.js) (revision a8be4a11e5824f788f6390fabf4528443397da57) +++ src/stock-physical-inventory-draft/physical-inventory-product-group.filter.js (.../physical-inventory-product-group.filter.js) (revision dbf28b4acb8b402c6f8eb7bb03b30ad2336f681d) @@ -22,20 +22,20 @@ * @description * Groups nested array of physical inventory line item by 'orderableCategoryDisplayName' * - * @param {Array} List of objects to be grouped - * @return {Integer} programId - * + * @param {Array} List of objects to be grouped + * @param {String} programId + * @return {Object} Grouped products - category name as key and array of products as value */ angular .module('stock-physical-inventory-draft') .filter('groupByProgramProductCategory', groupByProgramProductCategory); function groupByProgramProductCategory() { - return _.memoize(function(items, _programId) { + return _.memoize(function(items, programId) { return _.groupBy(items, function(item) { return _.findWhere(item[0].orderable.programs, { - programId: _programId + programId: programId }).orderableCategoryDisplayName; }); }); Index: src/stock-physical-inventory-draft/physical-inventory-product-group.filter.spec.js =================================================================== diff -u -N -ra8be4a11e5824f788f6390fabf4528443397da57 -rdbf28b4acb8b402c6f8eb7bb03b30ad2336f681d --- src/stock-physical-inventory-draft/physical-inventory-product-group.filter.spec.js (.../physical-inventory-product-group.filter.spec.js) (revision a8be4a11e5824f788f6390fabf4528443397da57) +++ src/stock-physical-inventory-draft/physical-inventory-product-group.filter.spec.js (.../physical-inventory-product-group.filter.spec.js) (revision dbf28b4acb8b402c6f8eb7bb03b30ad2336f681d) @@ -15,9 +15,9 @@ describe('Group by program product category filter', function() { var groupByProgramProductCategoryFilter, $filter, - physicalInventoryLineItem, programId, - oralContraceptiveCategoryDisplayName, - implantableContraceptiveCategoryDisplayName; + programId, oralContraceptiveCategoryDisplayName, implantableContraceptiveCategoryDisplayName, + lineItem, lineItem1, lineItem2, programOrderable1, programOrderable2, pagedLineItem, + PhysicalInventoryLineItemDataBuilder, ProgramOrderableDataBuilder, OrderableDataBuilder; beforeEach(function() { module('stock-physical-inventory-draft'); @@ -26,38 +26,52 @@ $filter = $injector.get('$filter'); groupByProgramProductCategoryFilter = $filter('groupByProgramProductCategory'); + PhysicalInventoryLineItemDataBuilder = $injector.get('PhysicalInventoryLineItemDataBuilder'); + ProgramOrderableDataBuilder = $injector.get('ProgramOrderableDataBuilder'); + OrderableDataBuilder = $injector.get('OrderableDataBuilder'); + programId = 'pid123'; oralContraceptiveCategoryDisplayName = 'Oral contraceptive'; implantableContraceptiveCategoryDisplayName = 'Implantable contraceptive'; - physicalInventoryLineItem = - [ - [ - generatePhysicalInventoryLineItem(0, {}, 'C100', oralContraceptiveCategoryDisplayName), - generatePhysicalInventoryLineItem(80, null, 'C100', oralContraceptiveCategoryDisplayName) - ], - [ generatePhysicalInventoryLineItem(0, null, 'C234' - , implantableContraceptiveCategoryDisplayName) ], - [ generatePhysicalInventoryLineItem(0, null, 'C239' - , implantableContraceptiveCategoryDisplayName) ] - ]; + programOrderable1 = new ProgramOrderableDataBuilder() + .withProgramId(programId) + .withOrderableCategoryDisplayName(oralContraceptiveCategoryDisplayName) + .buildJson(); - function generatePhysicalInventoryLineItem(stockOnHand, lot, productCode, categoryName) { - return { - stockOnHand: 0, - lot: {}, - orderable: { - productCode: productCode, - programs: [ - { - programId: programId, - orderableCategoryDisplayName: categoryName - } - ] - } - }; - } + programOrderable2 = new ProgramOrderableDataBuilder() + .withProgramId(programId) + .withOrderableCategoryDisplayName(implantableContraceptiveCategoryDisplayName) + .buildJson(); + lineItem = new PhysicalInventoryLineItemDataBuilder() + .withQuantity(1) + .withOrderable(new OrderableDataBuilder() + .withProductCode('C100') + .withFullProductName('b') + .withPrograms([programOrderable1]) + .buildJson()) + .buildAsAdded(); + + lineItem1 = new PhysicalInventoryLineItemDataBuilder() + .withQuantity(34) + .withOrderable(new OrderableDataBuilder() + .withProductCode('C200') + .withFullProductName('b') + .withPrograms([programOrderable2]) + .buildJson()) + .buildAsAdded(); + + lineItem2 = new PhysicalInventoryLineItemDataBuilder() + .withQuantity(34) + .withOrderable(new OrderableDataBuilder() + .withProductCode('C300') + .withFullProductName('b') + .withPrograms([programOrderable2]) + .buildJson()) + .buildAsAdded(); + + pagedLineItem = [[lineItem], [lineItem1], [lineItem2]]; }); }); @@ -67,13 +81,13 @@ }); it('should group line item for non-empty lineItem', function() { - var groupedLineItem = groupByProgramProductCategoryFilter(physicalInventoryLineItem, programId); + var groupedLineItem = groupByProgramProductCategoryFilter(pagedLineItem, programId); expect(Object.keys(groupedLineItem).length).toEqual(2); }); it('should be grouped by orderableCategoryDisplayName', function() { - var groupedLineItem = groupByProgramProductCategoryFilter(physicalInventoryLineItem, programId); + var groupedLineItem = groupByProgramProductCategoryFilter(pagedLineItem, programId); var groupLineItemKeys = Object.keys(groupedLineItem); expect(groupLineItemKeys.indexOf(oralContraceptiveCategoryDisplayName)).toBeGreaterThan(-1);