import { Form } from '../../e2elib/lib/src/pageobjects/form.component'; 
 | 
import { ListBase } from '../../libappbase/listbase'; 
 | 
  
 | 
export class FormPeriod extends Form { 
 | 
  public lstStartOfPlanning = new ListStartOfPlanning(); 
 | 
  public lstPeriod = new ListPeriod(); 
 | 
  private readonly _months = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC']; 
 | 
  
 | 
  public constructor() { 
 | 
    super('FormPeriods'); 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Get the start of planning date 
 | 
   * 
 | 
   * @returns Start date of planning date 
 | 
   */ 
 | 
  public async getStartOfPlanningDate(): Promise<Date> { 
 | 
    const row = await this.lstStartOfPlanning.getRowByIndex(0); 
 | 
    const cell = await row.getCell('Start of planning'); 
 | 
    const startOfPlanning = await cell.getValue(); 
 | 
    const dateValues = startOfPlanning.split('-'); 
 | 
    const startOfPlanningDate = new Date(); 
 | 
    startOfPlanningDate.setFullYear(Number(dateValues[2]), this._months.indexOf(dateValues[1].toUpperCase()), Number(dateValues[0])); 
 | 
    return startOfPlanningDate; 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Get the end of planning date, calculated by start of planning + future planning periods 
 | 
   * 
 | 
   * @returns End date of planning date 
 | 
   */ 
 | 
  public async getEndOfPlanningDate(): Promise<Date> { 
 | 
    const startOfPlanningDate = await this.getStartOfPlanningDate(); 
 | 
    const endOfPlanningDate = new Date(startOfPlanningDate); 
 | 
    const futurePeriod = await this.lstPeriod.getFuturePeriodByName('Planning periods'); 
 | 
    const month = endOfPlanningDate.getMonth() + futurePeriod; 
 | 
    endOfPlanningDate.setMonth(month); 
 | 
    return endOfPlanningDate; 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Get all the necessary values for the planning period. 
 | 
   * 
 | 
   * @returns PlanningPeriods 
 | 
   */ 
 | 
  public async getStartAndEndOfPlanning(): Promise<PlanningPeriods> { 
 | 
    const startOfPlanningDate = await this.getStartOfPlanningDate(); 
 | 
    const endOfPlanningDate = await this.getEndOfPlanningDate(); 
 | 
    const sopYear = startOfPlanningDate.getFullYear().toString(); 
 | 
    const eopYear = endOfPlanningDate.getFullYear().toString(); 
 | 
    const sopString = `${startOfPlanningDate.getDate().toString()}-${startOfPlanningDate.toLocaleString(undefined, { 
 | 
      month: 'short', 
 | 
    })}-${sopYear}`; 
 | 
    const eopString = `${endOfPlanningDate.getDate().toString()}-${endOfPlanningDate.toLocaleString(undefined, { 
 | 
      month: 'short', 
 | 
    })}-${eopYear}`; 
 | 
  
 | 
    return { startOfPlanningDate, endOfPlanningDate, sopYear, eopYear, sopString, eopString }; 
 | 
  } 
 | 
} 
 | 
  
 | 
export interface PlanningPeriods { 
 | 
  startOfPlanningDate: Date; 
 | 
  endOfPlanningDate: Date; 
 | 
  sopYear: string; 
 | 
  eopYear: string; 
 | 
  sopString: string; 
 | 
  eopString: string; 
 | 
} 
 | 
  
 | 
export class ListStartOfPlanning extends ListBase { 
 | 
  public constructor() { 
 | 
    super('ListStartOfPlanning'); 
 | 
  } 
 | 
} 
 | 
  
 | 
export class ListPeriod extends ListBase { 
 | 
  public constructor() { 
 | 
    super('ListPeriodSpec'); 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Get future periods number of period by name 
 | 
   * 
 | 
   * @param periodName Name of period 
 | 
   * @returns Future period number in months 
 | 
   */ 
 | 
  public async getFuturePeriodByName(periodName: string): Promise<number> { 
 | 
    const periodRow = await this.getRowByValue([{ columnID: 'Name', value: periodName }]); 
 | 
    return Number(await (await periodRow.getCell('# Future periods')).getValue()); 
 | 
  } 
 | 
} 
 |