/** 
 | 
 * @file         ADSO-10170 
 | 
 * @description  Copy operation cost via action bar (single cost selection Operating cost) 
 | 
 * @testcategory Web - Financials - Operations 
 | 
 * @author       Gay Er Xuan (erxuan.gay@3ds.com) 
 | 
 * @copyright    Dassault Systemes 
 | 
 */ 
 | 
import { qCustomMatcher } from '../../../e2elib/lib/src/main/qmatchers.const'; 
 | 
import { AppMP, Demo, Scenario } from '../../../libmp/appmp'; 
 | 
import { DataFoodBaseEntity, DataFoodBaseEntityName } from '../../../libmp/data/data.navigation'; 
 | 
import { DataOperationAccount, DataOperationCostCost, DataOperationCostCostDriver, DataOperationCostUoM } from '../../../libmp/data/data.operationcost'; 
 | 
import { startOfPlanningYear } from '../../../libmp/data/data.period'; 
 | 
import { ListColumnOperationCost } from '../../../libmp/forms/form.operationcost'; 
 | 
  
 | 
describe('ADSO-10170 - Copy operation cost via action bar (single cost selection Operating cost)', () => { 
 | 
  const appMP = AppMP.getInstance(); 
 | 
  const listOperationCost = appMP.viewOperationCost.frmOperationCost.listOperationCost; 
 | 
  const dlgOperationCost = listOperationCost.dlgOperationCost; 
 | 
  let eopString: string; 
 | 
  let sopYear: string; 
 | 
  const unit = DataFoodBaseEntityName.DEFermenter; 
 | 
  const unitParents = DataFoodBaseEntity.deUnitsParents; 
 | 
  const firstCostStartString = `1-Jan-${startOfPlanningYear - 1}`; 
 | 
  let newCostStartString = '1-Feb-'; // Year to be assigned after getting sopYear 
 | 
  const account = DataOperationAccount.OperatingCostAccountName; 
 | 
  const costDriver = DataOperationCostCostDriver.Volume; 
 | 
  let operation: string; 
 | 
  const cost = DataOperationCostCost.Cost700; 
 | 
  const uom = DataOperationCostUoM.EuroPerMT; 
 | 
  
 | 
  beforeAll(async () => { 
 | 
    jasmine.addMatchers(qCustomMatcher); 
 | 
    await appMP.login(); 
 | 
  }); 
 | 
  
 | 
  afterAll(async () => { 
 | 
    // Reset views and navigation 
 | 
    await appMP.formNavigation.reset(); 
 | 
    await appMP.viewOperationCost.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, 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; 
 | 
    ({ eopString, sopYear } = await formPeriod.getStartAndEndOfPlanning()); 
 | 
    newCostStartString = newCostStartString + sopYear; 
 | 
  }); 
 | 
  
 | 
  it(`Setup - Open view ${appMP.viewOperationCost.viewPath}. Verify operating cost exists for ${unit} for ${firstCostStartString} and Cost = ${cost}`, async () => { 
 | 
    // Open operation cost view 
 | 
    await appMP.viewOperationCost.switchTo(); 
 | 
    // Toggle ON Filter by Accounts 
 | 
    const cbFilterByAcc = appMP.viewOperationCost.frmOperationCost.cbFilterByAccounts; 
 | 
    await appMP.viewOperationCost.frmOperationCost.toggleFilterByAccount(true); 
 | 
    expect(await cbFilterByAcc.isChecked()).toBe(true, 'Filter by Accounts should be toggled to ON'); 
 | 
    // Click on operation account 
 | 
    const accRow = await appMP.viewOperationCost.frmOperationsAccount.listOperationAccount.getOperationAccountByName(account); 
 | 
    await accRow.leftClick(); 
 | 
    // Filter by unit 
 | 
    await appMP.formNavigation.filterByEntity(unit, unitParents); 
 | 
    // Verify 1 operation cost exist in the list 
 | 
    await listOperationCost.waitForScreenUpdate(); 
 | 
    expect(await listOperationCost.getRowCount()).toBe(1, `There should be exactly one operating cost exists for ${unit}`); 
 | 
    // Verify account, start, and cost of the operation cost 
 | 
    const operationCost = await listOperationCost.getRowByIndex(0); 
 | 
    expect(await listOperationCost.getCellValueFromRow(ListColumnOperationCost.Account, operationCost)).toBe(account, `Account of the ${unit} operation cost should be ${account}`); 
 | 
    expect(await listOperationCost.getCellValueFromRow(ListColumnOperationCost.Start, operationCost)).toBe(firstCostStartString, `Start of the ${unit} operation cost should be ${firstCostStartString}`); 
 | 
    expect(await listOperationCost.getCellValueFromRow(ListColumnOperationCost.Cost, operationCost)).toBe(cost.toString(), `Cost of the ${unit} operation cost should be ${cost}`); 
 | 
  }); 
 | 
  
 | 
  it('Step 1 - Open copy single operation cost dialog via action bar, verify the default value in dialog and OK button disabled with precondition', async () => { 
 | 
    // Open copy dialog 
 | 
    const operationCostRow = await listOperationCost.getRowByIndex(0); 
 | 
    operation = await listOperationCost.getCellValueFromRow(ListColumnOperationCost.Operation, operationCostRow); 
 | 
    await operationCostRow.leftClick(); 
 | 
    await appMP.abpData.btnCopy.click(); 
 | 
    await dlgOperationCost.waitUntilPresent(); 
 | 
    // Verify field value in dialog 
 | 
    const verifyBeforeDialogFeedbacks: string[] = await dlgOperationCost.verifyDialogValue(account, costDriver, operation, new Date(firstCostStartString), cost); 
 | 
    expect(verifyBeforeDialogFeedbacks.length).toBe(0, `${verifyBeforeDialogFeedbacks.join(', \n')}`); 
 | 
    // Verify OK button is disabled with precondition 
 | 
    expect(await dlgOperationCost.clickOK()).toBe(false, 'OK button should be disabled'); 
 | 
    expect(await dlgOperationCost.getDialogFeedback()).toBe('Identical cost definition exists. Operation cost must be unique by Account, Cost driver and Start date.', 'Feedback text should match'); 
 | 
  }); 
 | 
  
 | 
  it('Step 2 - Update start date and verify operation cost created successfully', async () => { 
 | 
    // Update start value 
 | 
    await dlgOperationCost.dtsStart.setDate(new Date(newCostStartString)); 
 | 
    expect(await dlgOperationCost.clickOK()).toBe(true, 'OK button should be enabled'); 
 | 
    // Verify row created with correct values in dialog 
 | 
    const previousOperationCostRow = await listOperationCost.getRowByCellValue(ListColumnOperationCost.Start, firstCostStartString); 
 | 
    const newOperationCost = await listOperationCost.getRowByCellValue(ListColumnOperationCost.Start, newCostStartString); 
 | 
    await listOperationCost.openCreateEditUnitCostDialog(newOperationCost); 
 | 
    const verifyFeedbacks = await dlgOperationCost.verifyDialogValue(account, costDriver, operation, new Date(newCostStartString), cost); 
 | 
    expect(verifyFeedbacks.length).toBe(0, `${verifyFeedbacks.join(', \n')}`); 
 | 
    await dlgOperationCost.clickCancel(); 
 | 
    // Verify UoM, Start, and End column value of the new row 
 | 
    expect(await listOperationCost.getCellValueFromRow(ListColumnOperationCost.UoM, newOperationCost)).toBe(uom, `UoM should be ${uom}`); 
 | 
    expect(await listOperationCost.getCellValueFromRow(ListColumnOperationCost.Start, newOperationCost)).toBe(newCostStartString, `Start should be ${newCostStartString}`); 
 | 
    expect(await listOperationCost.getCellValueFromRow(ListColumnOperationCost.End, newOperationCost)).toBe(eopString, `End should be ${eopString}`); 
 | 
    // Verify Start and End column value of the previous operation cost 
 | 
    expect(await listOperationCost.getCellValueFromRow(ListColumnOperationCost.Start, previousOperationCostRow)).toBe(firstCostStartString, `Start should be ${firstCostStartString}`); 
 | 
    expect(await listOperationCost.getCellValueFromRow(ListColumnOperationCost.End, previousOperationCostRow)).toBe(newCostStartString, `End should be ${newCostStartString}`); 
 | 
  }); 
 | 
}); 
 |