| /** | 
|  * @file         ADSO-10148 | 
|  * @description  General settings Shelf Life - not 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 { DialogSmartPlanDirectionRadioButton } from '../../libmp/dialogs/dialog.smartplan'; | 
| import { DataLowFatStrawberry12 } from '../../libmp/data/data.navigation'; | 
| import { LogMessage } from '../../libappbase/logmessage'; | 
| import { startOfPlanningYear } from '../../libmp/data/data.period'; | 
|   | 
| describe('ADSO-10148 - General settings Shelf Life, not usable if mature + expire within period', () => { | 
|   const appMP = AppMP.getInstance(); | 
|   const datesToBeChecked: string[] = [ | 
|     `1-Jan-${startOfPlanningYear}`, | 
|     `1-Feb-${startOfPlanningYear}`, | 
|     `1-Mar-${startOfPlanningYear}`, | 
|     `1-Apr-${startOfPlanningYear}`, | 
|   ]; | 
|   const listProduct = appMP.viewProduct.frmProduct.listProduct; | 
|   const formProductPlanning = appMP.viewSupplyPlanning.frmProductPlanning; | 
|   const meRowName = DataMatrixProductPlanningRowName.LowFat12PKBulgaria; | 
|   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 to "${DataLowFatStrawberry12.name}"`, async () => { | 
|     // Open Products view | 
|     await appMP.viewProduct.switchTo(); | 
|   | 
|     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}. Uncheck "If Expired Within Period/If Mature Within Period" checkboxes`, async () => { | 
|     // Open General Settings view | 
|     await appMP.viewGeneralSettings.switchTo(); | 
|     const formGeneralSettings = appMP.viewGeneralSettings.frmGeneralSettings; | 
|   | 
|     // Uncheck "If Expired Within Period/If Mature Within Period" checkboxes | 
|     await formGeneralSettings.updateDialogValues({UsableIfMature: 'false', UsableIfExpired: 'false'}); | 
|   | 
|     // Verify the checkboxes are unchecked | 
|     expect(await formGeneralSettings.cbIsUsableIfExpiredWithinPeriod.isChecked()).toBe(false, LogMessage.checkbox_isChecked('Is usable if expired within period')); | 
|     expect(await formGeneralSettings.cbIsUsableIfMatureWithinPeriod.isChecked()).toBe(false, LogMessage.checkbox_isChecked('Is usable if matured within period')); | 
|   | 
|     // Click on Apply button to save changes | 
|     const [isApplyButtonClickable, btnDisabledTooltip] = await formGeneralSettings.btnApply.getIsClickable(); | 
|     expect(isApplyButtonClickable).toBe(true, LogMessage.btn_notClickable('Apply', btnDisabledTooltip)); | 
|     await formGeneralSettings.btnApply.click(); | 
|   }); | 
|   | 
|   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 - Select "${DialogSmartPlanDirectionRadioButton.Upstream}" Smart Plan for "${meRowName}"`, async () => { | 
|     // Select first row to be able to use DOWN key on the MatrixEditor | 
|     await formProductPlanning.meProductPlanning.selectByRow(0); | 
|     // HACK: Scroll to the desired row by pressing DOWN key | 
|     await formProductPlanning.meProductPlanning.scrollToRowByRowHeader(meRowName); | 
|     // Set "Upstream" Smart Plan direction | 
|     const dlgSmartPlan = await formProductPlanning.meProductPlanning.startSettingSmartPlanDirection(0, datesToBeChecked[0]); | 
|     await dlgSmartPlan.selectSmartPlanDirection(DialogSmartPlanDirectionRadioButton.Upstream); | 
|   | 
|     // Verify if optimizer run finish | 
|     const isOptimizerFinished = await appMP.abpScenarioSelection.verifyIsOptimizerCompleted(5000); | 
|     expect(isOptimizerFinished).toBe(true, 'Optimizer triggered after change smart plan direction should be finished in 1 second.'); | 
|   }); | 
|   | 
|   it(`Step 3 - Set new ${DataMatrixProductPlanningAttributeName.TotalSupply} for "${meRowName}" and verify its utilization`, async () => { | 
|     // Set Total Supply value | 
|     await formProductPlanning.meProductPlanning.setTotalSupply(0, 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.'); | 
|   | 
|     // Verify that the quantity is not used to supply demand on the periods of January and Feb SOPYear | 
|     for (let index = 0; index < 2; index++) { | 
|       const cell = await formProductPlanning.meProductPlanning.getCell(meRowName, DataMatrixProductPlanningAttributeName.InventoryEnd, datesToBeChecked[index]); | 
|       expect(await cell.getValue()).toBe( | 
|         DataMatrixProductPlanningValue._10000, | 
|         `${DataMatrixProductPlanningAttributeName.InventoryEnd} value should be ${DataMatrixProductPlanningValue._10000} for ${datesToBeChecked[index]}`, | 
|       ); | 
|     } | 
|   | 
|     // Verify that the quantity is used to supply demand on the periods of March SOPYear and April SOPYear | 
|     for (let index = 2; index < 4; index++) { | 
|       const cell = await formProductPlanning.meProductPlanning.getCell(meRowName, DataMatrixProductPlanningAttributeName.InventoryEnd, datesToBeChecked[index]); | 
|       const cellValue = await cell.getValue(); | 
|       // 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 cellValueInNumber = +(cellValue.replace(',', '')); | 
|       expect(cellValueInNumber).toBeLessThan( | 
|         mePlanningValue, | 
|         `${DataMatrixProductPlanningAttributeName.InventoryEnd} value should not be ${DataMatrixProductPlanningValue._10000} for ${datesToBeChecked[index]}`, | 
|       ); | 
|     } | 
|   }); | 
| }); |