| /** | 
|  * @file         ADSO-10101 - Create unit cost for Fixed cost driver (from list context menu) | 
|  * @description  Create unit cost for Fixed cost driver (from list context menu) | 
|  * @testcategory Web - Financials - Units | 
|  * @author       Umar Adkhamov (umar.adkhamov@3ds.com) | 
|  * @copyright    Dassault Systemes | 
|  */ | 
| import { qCustomMatcher } from '../../../e2elib/lib/src/main/qmatchers.const'; | 
| import { AppMP, Demo, Scenario } from '../../../libmp/appmp'; | 
| import { ListUnitCostColumn } from '../../../libmp/forms/form.unitcost'; | 
| import { CostLabel, DataFoodBaseAccountName, DataFoodBaseAccountUoM } from '../../../libmp/data/data.account'; | 
| import { startOfPlanningYear } from '../../../libmp/data/data.period'; | 
|   | 
| describe('ADSO-10101 - Create unit cost for Fixed cost driver (from list context menu)', () => { | 
|   const appMP = AppMP.getInstance(); | 
|   const entity = 'DE Fermenter'; | 
|   const account = DataFoodBaseAccountName.GeneralFixedCosts; | 
|   const costDriver = 'Fixed'; | 
|   const timeUnit = 'Year'; | 
|   const cost = 100.23; | 
|   let eopString: string; | 
|   let sopYear: string; | 
|   const uom = DataFoodBaseAccountUoM.EuroPerMonth; | 
|   const janSOPMinus1 = `1-Jan-${startOfPlanningYear - 1}`; | 
|   | 
|   beforeAll(async () => { | 
|     jasmine.addMatchers(qCustomMatcher); | 
|     await appMP.login(); | 
|   }); | 
|   | 
|   afterAll(async () => { | 
|     await appMP.cleanupAndLogout(); | 
|   }); | 
|   | 
|   afterEach(async () => { | 
|     await appMP.checkToastMessage(); | 
|   }); | 
|   | 
|   it(`Setup - ${AppMP.getDemoDataPath(Demo.Food, Scenario.Base)}`, async () => { | 
|     await appMP.createDemoDataset(Demo.Food, Scenario.Base, false); | 
|   }); | 
|   | 
|   it(`Setup - Open view ${appMP.viewPeriod.viewPath}. Get start and end of planning`, async () => { | 
|     // Open Periods view | 
|     await appMP.viewPeriod.switchTo(); | 
|     const formPeriod = appMP.viewPeriod.frmPeriod; | 
|     ({ sopYear, eopString } = await formPeriod.getStartAndEndOfPlanning()); | 
|   }); | 
|   | 
|   it(`Step 1 - Open view ${appMP.viewUnitCost.viewPath}. Verify General Fixed Costs account exists with UoM as ${uom}`, async () => { | 
|     await appMP.viewUnitCost.switchTo(); | 
|   | 
|     const accountRow = await appMP.viewUnitCost.frmUnitAccount.listAccount.getRow({ Account: account }); | 
|     await appMP.viewUnitCost.frmUnitAccount.listAccount.verifyRowValues(accountRow, { 'Default UoM': uom }); | 
|   }); | 
|   | 
|   it('Step 2 - Verify navigation panel is show and open Stocking points and units list', async () => { | 
|     // Verify if navigation panel is showed by default | 
|     expect(await appMP.formNavigation.isVisible()).toBe(true, 'Navigation panel should be visible'); | 
|     // Open 'StockingPoints and Units' list (ListEntity) in navigation panel by clicking on 'StockingPoints and Units' button (ButtonNavEntity) | 
|     await appMP.formNavigation.btnEntity.click(); | 
|     expect(await appMP.formNavigation.listEntity.isVisible()).toBe(true, 'Entitiy list in navigation panel should be visible'); | 
|   }); | 
|   | 
|   it(`Step 3 - Check ${entity} units checkbox`, async () => { | 
|     // Resize DisplayName column incase DisplayName value will be show as "Denmerk Pl..." | 
|     const entityDisplayNameColumn = await appMP.formNavigation.listEntity.getColumnByValue('DisplayName'); | 
|     await entityDisplayNameColumn.resizeColumn(100); | 
|     // Check 2 leaf units DE Fermenter (to get row in hierarchy list can refer to getBookmarkByName function) | 
|     const deFermenterUnitRow = await appMP.formNavigation.listEntity.getEntityRowByName(entity, ['Europe', 'Plants', 'Denmark Plant']); | 
|     expect(deFermenterUnitRow).toBeDefined(`${entity} row should be found`); | 
|     await appMP.formNavigation.listEntity.scrollToRow(deFermenterUnitRow); | 
|     await deFermenterUnitRow.checkboxClick(); | 
|     expect(await deFermenterUnitRow.isChecked()).toBe(true, `${entity} row checkbox should be checked`); | 
|   }); | 
|   | 
|   it(`Step 4: Verify Exactly 1 cost exists for ${entity} with start = ${janSOPMinus1}`, async () => { | 
|     const unitCostRows = await appMP.viewUnitCost.frmUnitCost.listUnitCost.getAllRows(); | 
|     let counter = 0; | 
|     for (const row of unitCostRows) { | 
|       const cellValue = await appMP.viewUnitCost.frmUnitCost.listUnitCost.getCellValueFromRow('Unit', row); | 
|       if (cellValue === entity) { | 
|         counter++; | 
|       } | 
|     } | 
|     expect(counter).toBe(1, `There should be exactly 1 cost exists for ${entity}`); | 
|     const unitCostRow = await appMP.viewUnitCost.frmUnitCost.listUnitCost.getRowByValue([{ columnID: ListUnitCostColumn.Unit, value: entity }]); | 
|     const startValue = await appMP.viewUnitCost.frmUnitCost.listUnitCost.getCellValueFromRow(ListUnitCostColumn.Start, unitCostRow); | 
|     expect(startValue).toBe(janSOPMinus1, `Cost for unit '${entity}' should have start = ${janSOPMinus1}`); | 
|   }); | 
|   | 
|   it('Step 5 - Input data for unit account', async () => { | 
|     // Create new Unit Cost | 
|     const dlgUnitCost = await appMP.viewUnitCost.frmUnitCost.listUnitCost.openEditDialog(); | 
|     let btnMessage = ''; | 
|   | 
|     // Verify that dlgUnitCost fields have correct values | 
|     expect(await dlgUnitCost.verifyDropDownCount(dlgUnitCost.ddlAccount, 3)).toBe(true, 'There should be exactly 3 items in the Account DropDownList'); | 
|     const values = [account, DataFoodBaseAccountName.ChangeoverCost, DataFoodBaseAccountName.ShiftPatternCosts]; | 
|     expect(await dlgUnitCost.verifyDropDownContainValues(dlgUnitCost.ddlAccount, values)).toBe(true, `${values.join(', ')} should exist in Account drop down`); | 
|   | 
|     expect(await dlgUnitCost.verifyDropDownCount(dlgUnitCost.ddlCostDriver, 4)).toBe(true, 'There should be exactly 4 items in the Cost Driver DropDownList'); | 
|     const driverValues = [costDriver, 'Number of units', 'Changeover', 'Staffing']; | 
|     expect(await dlgUnitCost.verifyDropDownContainValues(dlgUnitCost.ddlCostDriver, driverValues)).toBe(true, `${driverValues.join(', ')} should exist in Cost Driver drop down`); | 
|   | 
|     // Update value in dialog | 
|     await dlgUnitCost.updateUnitCostValue(account, costDriver, entity, new Date(Number(sopYear), 1, 1), timeUnit, 1, cost); | 
|     // Verify that Cost Label displays correct value | 
|     expect(await dlgUnitCost.efCost.getComponentLabel()).toBe(CostLabel.euro(timeUnit), `Cost label should be ${CostLabel.euro(timeUnit)}`); | 
|     // Confirm dialog | 
|     const isUnitCostCreate = await dlgUnitCost.clickOK(); | 
|     if (!isUnitCostCreate) { | 
|       btnMessage = await dlgUnitCost.getOKButtonTooltip(); | 
|     } | 
|     expect(isUnitCostCreate).toBe(true, `Values for new Unit Cost should be inserted successfully. OK button disabled with tooltip ${btnMessage}`); | 
|   | 
|     // Click Cancel if create is not allowed | 
|     if (!isUnitCostCreate) { | 
|       await dlgUnitCost.clickCancel(); | 
|     } | 
|   }); | 
|   | 
|   it('Step 6 - Verify the new Unit Cost is created with correct details', async () => { | 
|     // Get the newly created Unit Cost based on start date (1-Feb-SOP Year) | 
|     const unitCostRow = await appMP.viewUnitCost.frmUnitCost.listUnitCost.getRowByValue([{ columnID: ListUnitCostColumn.Start, value: `1-Feb-${sopYear}` }]); | 
|   | 
|     // Verify the values are set correctly | 
|     let cellValue = await appMP.viewUnitCost.frmUnitCost.listUnitCost.getCellValueFromRow(ListUnitCostColumn.Account, unitCostRow); | 
|     expect(cellValue).toBe(account, `Account name should be ${account}`); | 
|   | 
|     cellValue = await appMP.viewUnitCost.frmUnitCost.listUnitCost.getCellValueFromRow(ListUnitCostColumn.CostDriver, unitCostRow); | 
|     expect(cellValue).toBe(costDriver, `Cost Driver should be ${costDriver}`); | 
|   | 
|     cellValue = await appMP.viewUnitCost.frmUnitCost.listUnitCost.getCellValueFromRow(ListUnitCostColumn.Cost, unitCostRow); | 
|     // Round the cost to compare, as the cost in the list is rounded | 
|     const roundedCost = Math.round(cost).toString(); | 
|     expect(cellValue).toBe(roundedCost, `Cost should be ${roundedCost}`); | 
|   | 
|     cellValue = await appMP.viewUnitCost.frmUnitCost.listUnitCost.getCellValueFromRow(ListUnitCostColumn.UoM, unitCostRow); | 
|     expect(cellValue).toBe(`${DataFoodBaseAccountUoM.EuroPer}${timeUnit}`, `Time unit should be ${DataFoodBaseAccountUoM.EuroPer}${timeUnit}`); | 
|   | 
|     cellValue = await appMP.viewUnitCost.frmUnitCost.listUnitCost.getCellValueFromRow(ListUnitCostColumn.End, unitCostRow); | 
|     expect(cellValue).toBe(eopString, `End should be ${eopString}`); | 
|   }); | 
|   | 
|   it('Step 7 - Verify the previous Unit Cost ', async () => { | 
|     // Get the previous Unit Cost based on start date (1-Jan-SOPYear minus 1) | 
|     const unitCostRow = await appMP.viewUnitCost.frmUnitCost.listUnitCost.getRowByValue([{ columnID: ListUnitCostColumn.Start, value: janSOPMinus1 }]); | 
|     // Verify the End is set correctly | 
|     const cellValue = await appMP.viewUnitCost.frmUnitCost.listUnitCost.getCellValueFromRow(ListUnitCostColumn.End, unitCostRow); | 
|     expect(cellValue).toBe(`1-Feb-${sopYear}`, `End should be 1-Feb-${sopYear}`); | 
|   }); | 
|   | 
|   it(`Step 8 - Open view ${appMP.viewScenarioAnalysisCost.viewPath} and verify if the values are correct`, async () => { | 
|     // Open ViewScenarioAnalysis | 
|     await appMP.viewScenarioAnalysisCost.switchTo(); | 
|   | 
|     // Select another account before choosing General fixed cost, else chart not refreshed to what we need | 
|     await appMP.viewScenarioAnalysisCost.frmCost.drpdAccount.selectItemSOP(DataFoodBaseAccountName.OperatingCost); | 
|     await appMP.viewScenarioAnalysisCost.frmCost.drpdAccount.selectItemSOP(account); | 
|   | 
|     // Get the cost value from the chart for 1-Feb-SOP Year and verify whether it is as expected | 
|     const chartValues = await appMP.viewScenarioAnalysisCost.frmCost.chartCost.getChartDataValue('DashboardChartSeriesSenarioAnalysisCostPerPeriodBaseCost', [account, account, account, account], [`1-Feb-${sopYear}`, `1-Mar-${sopYear}`, `1-Apr-${sopYear}`, `1-Dec-${+sopYear + 1}`]); | 
|     // Calculate monthly cost and limit decimal points to 4 | 
|     const expectedCostPerMonth = (cost / 12).toFixed(4); | 
|   | 
|     // Verify that starting from 1-Feb-SOP year the the chart displays the expectedCostPerMonth | 
|     expect(chartValues[0].values[0]).toBe(expectedCostPerMonth, `Value should be ${expectedCostPerMonth} starting from 1-Feb-${sopYear}`); | 
|     expect(chartValues[1].values[0]).toBe(expectedCostPerMonth, `Value should be ${expectedCostPerMonth} starting from 1-Mar-${sopYear}`); | 
|     expect(chartValues[2].values[0]).toBe(expectedCostPerMonth, `Value should be ${expectedCostPerMonth} starting from 1-Apr-${sopYear}`); | 
|     expect(chartValues[3].values[0]).toBe(expectedCostPerMonth, `Value should be ${expectedCostPerMonth} starting from 1-Dec-${+sopYear + 1}`); | 
|   }); | 
| }); |