renhao
2023-09-21 1aa9f2bb83dd9e4b7517f1cbf06b0db53979bb31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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());
  }
}