NGO-DB/ndb-core

View on GitHub
src/app/child-dev-project/children/health-checkup/demo-data/demo-health-check-generator.service.ts

Summary

Maintainability
A
1 hr
Test Coverage
import { DemoChildGenerator } from "../../demo-data-generators/demo-child-generator.service";
import { DemoDataGenerator } from "../../../../core/demo-data/demo-data-generator";
import { Injectable } from "@angular/core";
import { Child } from "../../model/child";
import { faker } from "../../../../core/demo-data/faker";
import { HealthCheck } from "../model/health-check";
import { heightRangeForAge, weightRangeForAge } from "./height-weight";

/**
 * Generate HealthCheck records every 6 months for children up to the age of 12.
 * Builds upon the generated demo Child entities.
 */
@Injectable()
export class DemoHealthCheckGeneratorService extends DemoDataGenerator<HealthCheck> {
  /**
   * This function returns a provider object to be used in an Angular Module configuration:
   *   `providers: [DemoHealthCheckGeneratorService.provider()]`
   */
  static provider() {
    return [
      {
        provide: DemoHealthCheckGeneratorService,
        useClass: DemoHealthCheckGeneratorService,
      },
    ];
  }

  constructor(private demoChildren: DemoChildGenerator) {
    super();
  }

  public generateEntities(): HealthCheck[] {
    const data = [];

    for (const child of this.demoChildren.entities) {
      data.push(...this.generateHealthCheckHistoryForChild(child));
    }

    return data;
  }

  private generateHealthCheckHistoryForChild(child: Child): HealthCheck[] {
    const data = [];

    let date = new Date(child.admissionDate.getTime());
    let previousRecord = new HealthCheck("");
    previousRecord.height = 0;
    previousRecord.weight = 0;
    do {
      const record = new HealthCheck();
      record.child = child.getId();
      record.date = date;
      this.setNextHeightAndWeight(
        record,
        previousRecord,
        this.getAgeAtDate(child, date),
      );

      data.push(record);

      if (date.getMonth() === 0) {
        date = new Date(date.getFullYear(), 5, 1);
      } else {
        date = new Date(date.getFullYear() + 1, 0, 1);
      }
      previousRecord = record;
    } while (
      date < faker.getEarlierDateOrToday(child.dropoutDate) &&
      this.getAgeAtDate(child, date) < 11
    );

    return data;
  }

  private getAgeAtDate(child: Child, date: Date): number {
    const timeDiff = date.getTime() - child.dateOfBirth.getTime();
    return timeDiff / (1000 * 60 * 60 * 24 * 365);
  }

  private setNextHeightAndWeight(
    record: HealthCheck,
    previousRecord: HealthCheck,
    age: number,
  ) {
    const ageRoundedToHalfYear = Math.round(2 * age) / 2;

    const randomHeight = faker.number.int(
      heightRangeForAge.get(ageRoundedToHalfYear),
    );
    record.height = Math.max(randomHeight, previousRecord.height); // height will not become less

    record.weight = faker.number.int(
      weightRangeForAge.get(ageRoundedToHalfYear),
    );
  }
}