| /** | 
|  * @file         ADSO-10147 | 
|  * @description  General settings Shelf Life - usable if mature + expire within period | 
|  * @testcategory Web - Shelf life | 
|  * @author       Umar Adkhamov (umar.adkhamov@3ds.com) | 
|  * @copyright    Dassault Systèmes | 
|  */ | 
| import { AppMP, Demo, Scenario } from '../../libmp/appmp'; | 
| import { qCustomMatcher } from '../../e2elib/lib/src/main/qmatchers.const'; | 
| import { ListProductContextMenuItem } from '../../libmp/forms/form.product'; | 
| import { | 
|   DataMatrixProductPlanningAttributeName, | 
|   DataMatrixProductPlanningRowName, | 
|   DataMatrixProductPlanningValue, | 
| } from '../../libmp/data/data.supplyplanning'; | 
| import { DataFoodBaseProductName, DataLowFatStrawberry12 } from '../../libmp/data/data.navigation'; | 
| import { startOfPlanningYear } from '../../libmp/data/data.period'; | 
|   | 
| describe('ADSO-10147 - General settings Shelf Life, usable if mature + expire within period', () => { | 
|   const appMP = AppMP.getInstance(); | 
|   const datesToBeChecked = [ | 
|     `1-Jan-${startOfPlanningYear}`, | 
|     `1-Feb-${startOfPlanningYear}`, | 
|     `1-Mar-${startOfPlanningYear}`, | 
|     `1-Apr-${startOfPlanningYear}`, | 
|     `1-May-${startOfPlanningYear}`, | 
|   ]; | 
|   const listProduct = appMP.viewProduct.frmProduct.listProduct; | 
|   const formProductPlanning = appMP.viewSupplyPlanning.frmProductPlanning; | 
|   const meRowName = DataMatrixProductPlanningRowName.LowFat12PKBulgaria; | 
|   const meAttributeName = DataMatrixProductPlanningAttributeName.InventoryEnd; | 
|   const mePlanningValue = +(DataMatrixProductPlanningValue._10000.replace(',', '')); | 
|   | 
|   beforeAll(async () => { | 
|     jasmine.addMatchers(qCustomMatcher); | 
|     await appMP.login(); | 
|   }); | 
|   | 
|   afterAll(async () => { | 
|     await appMP.viewProduct.reset(); | 
|     await appMP.cleanupAndLogout(); | 
|   }); | 
|   | 
|   afterEach(async () => { | 
|     await appMP.checkToastMessage(); | 
|   }); | 
|   | 
|   it(`Setup - ${AppMP.getDemoDataPath(Demo.Food, Scenario.Base)}`, async () => { | 
|     await appMP.createDemoDataset(Demo.Food, Scenario.Base); | 
|   }); | 
|   | 
|   it(`Setup - Open view ${appMP.viewProduct.viewPath}, set new Shelf-life and Maturation values for ${DataFoodBaseProductName.AllProducts} | 
|       > ${DataFoodBaseProductName.FinishedGoods} > ${DataFoodBaseProductName.Lowfat} > ${DataLowFatStrawberry12.name} product`, async () => { | 
|     // Open Products view | 
|     await appMP.viewProduct.switchTo(); | 
|   | 
|     // Select AllProducts > FinishedGoods > Low fat > Lowfat Strawberry 12 pk product | 
|     const productRow = await listProduct.getRow({Name: DataLowFatStrawberry12.name}, DataLowFatStrawberry12.parents); | 
|     const [dialog] = await listProduct.selectContextMenu(ListProductContextMenuItem.Edit, productRow); | 
|     await dialog.pnlAdvanced.clickTab(); | 
|     await dialog.updateDialogValues({ShelfLifeEnabled: 'true', ShelfLife: '145', MaturationEnabled: 'true', Maturation: '45'}); | 
|     await dialog.clickOK(); | 
|   }); | 
|   | 
|   it(`Setup - Open view ${appMP.viewGeneralSettings.viewPath}, verify that "If Expired Within Period/If Mature Within Period" checkboxes are checked by default in the General setttings form`, async () => { | 
|     // Open General Settings view | 
|     await appMP.viewGeneralSettings.switchTo(); | 
|     const formGeneralSettings = appMP.viewGeneralSettings.frmGeneralSettings; | 
|     expect(await formGeneralSettings.cbIsUsableIfExpiredWithinPeriod.isChecked()).toBe(true, '"Is usable if expired within period" checkbox should be checked'); | 
|     expect(await formGeneralSettings.cbIsUsableIfMatureWithinPeriod.isChecked()).toBe(true, '"Is usable if matured within period" checkbox should be checked'); | 
|   }); | 
|   | 
|   it(`Step 1 - Open view ${appMP.viewSupplyPlanning.viewPath} and reset plan`, async () => { | 
|     // Open General Settings view | 
|     await appMP.viewSupplyPlanning.switchTo(); | 
|   | 
|     // Reset plan | 
|     await appMP.abpPlan.resetPlanAll(); | 
|   }); | 
|   | 
|   it(`Step 2 - Set new ${DataMatrixProductPlanningAttributeName.TotalSupply} for "${meRowName}"`, async () => { | 
|     // Select first row to be able to use DOWN key on the MatrixEditor | 
|     await formProductPlanning.meProductPlanning.selectByRow(0); | 
|     // Scroll to the desired row | 
|     await formProductPlanning.meProductPlanning.scrollToRowByRowHeader(meRowName); | 
|     // Set Total Supply value | 
|     await formProductPlanning.meProductPlanning.setTotalSupply(meRowName, datesToBeChecked[0], mePlanningValue); | 
|     // Verify if optimizer run finish | 
|     const isOptimizerFinished = await appMP.abpScenarioSelection.verifyIsOptimizerCompleted(5000); | 
|     expect(isOptimizerFinished).toBe(true, 'Optimizer triggered after entered Total Supply value should be finished in 5 second.'); | 
|   }); | 
|   | 
|   it(`Step 3 - Verify ${DataMatrixProductPlanningValue._10000} quantity is used to supply demand start from ${datesToBeChecked[1]} to ${datesToBeChecked[4]}`, async () => { | 
|     // Verify that quantity is not used to supply demand on Jan-SOPYear and used starting from Feb to May-SOPYear | 
|     for (const [index, date] of datesToBeChecked.entries()) { | 
|       const cell = await formProductPlanning.meProductPlanning.getCell(meRowName, meAttributeName, date); | 
|       const cellValue = await cell.getValue(); | 
|       // As Jan-SOPYear will be first index in dateString array, check if quantity is used when index is not 1 | 
|       if (index !== 0) { | 
|         // As we can't direct convert "10,000" type string value to number. Thus, we have to replace "," to empty string in order to convert | 
|         const numberValue = +(cellValue.replace(',', '')); | 
|         expect(numberValue).toBeLessThan( | 
|           mePlanningValue, | 
|           `${meAttributeName} value should be lesser than ${DataMatrixProductPlanningValue._10000} for ${date}. Actual value: ${cellValue}`, | 
|         ); | 
|       } else { | 
|         expect(cellValue).toBe( | 
|           DataMatrixProductPlanningValue._10000, | 
|           `${meAttributeName} value should be ${DataMatrixProductPlanningValue._10000} for ${date}. Actual value: ${cellValue}`, | 
|         ); | 
|       } | 
|     } | 
|   }); | 
| }); |