From 67a0f51d83f6197a3b1fc620d2b6772baf95cab8 Mon Sep 17 00:00:00 2001
From: Yoan VALLET <ext.sopra.yvallet@grandlyon.com>
Date: Wed, 9 Mar 2022 17:17:11 +0000
Subject: [PATCH] fix(consumption): handle missing data at begining/end of
 month or year

---
 .../consumptionFormatter.service.spec.ts      | 89 ++++++++++++++++++-
 src/services/consumptionFormatter.service.ts  | 23 ++++-
 src/services/queryRunner.service.ts           |  8 +-
 3 files changed, 116 insertions(+), 4 deletions(-)

diff --git a/src/services/consumptionFormatter.service.spec.ts b/src/services/consumptionFormatter.service.spec.ts
index 2c5a80f5d..2a27a7681 100644
--- a/src/services/consumptionFormatter.service.spec.ts
+++ b/src/services/consumptionFormatter.service.spec.ts
@@ -288,6 +288,7 @@ describe('ConsumptionFormatter service', () => {
       const result: Dataload = consumptionFormatterService.defineDataloadState(
         mockData,
         FluidType.ELECTRICITY,
+        TimeStep.DAY,
         fluidStatus[FluidType.ELECTRICITY]
       )
       expect(result).toEqual(expectedResult)
@@ -303,11 +304,12 @@ describe('ConsumptionFormatter service', () => {
       const result: Dataload = consumptionFormatterService.defineDataloadState(
         mockData,
         FluidType.ELECTRICITY,
+        TimeStep.DAY,
         fluidStatus[FluidType.ELECTRICITY]
       )
       expect(result).toEqual(expectedResult)
     })
-    it('sould return EMPTY state because data.date < firstFluidDataDate', () => {
+    it('sould return EMPTY state because data.date < firstFluidDataDate for day timestep', () => {
       fluidStatus[FluidType.ELECTRICITY].firstDataDate = DateTime.fromISO(
         '2020-10-20T00:00:00.000Z',
         {
@@ -321,6 +323,83 @@ describe('ConsumptionFormatter service', () => {
       const result: Dataload = consumptionFormatterService.defineDataloadState(
         mockData,
         FluidType.ELECTRICITY,
+        TimeStep.DAY,
+        fluidStatus[FluidType.ELECTRICITY]
+      )
+      expect(result).toEqual(expectedResult)
+    })
+    it('sould return EMPTY state because data.date < start of month of firstFluidDataDate for month timestep', () => {
+      fluidStatus[FluidType.ELECTRICITY].firstDataDate = DateTime.fromISO(
+        '2020-11-01T00:00:00.000Z',
+        {
+          zone: 'utc',
+        }
+      )
+      const expectedResult: Dataload = {
+        ...mockData,
+        state: DataloadState.EMPTY,
+      }
+      const result: Dataload = consumptionFormatterService.defineDataloadState(
+        mockData,
+        FluidType.ELECTRICITY,
+        TimeStep.MONTH,
+        fluidStatus[FluidType.ELECTRICITY]
+      )
+      expect(result).toEqual(expectedResult)
+    })
+    it('sould return EMPTY state because data.date < start of year firstFluidDataDate for year timestep', () => {
+      fluidStatus[FluidType.ELECTRICITY].firstDataDate = DateTime.fromISO(
+        '2021-10-20T00:00:00.000Z',
+        {
+          zone: 'utc',
+        }
+      )
+      const expectedResult: Dataload = {
+        ...mockData,
+        state: DataloadState.EMPTY,
+      }
+      const result: Dataload = consumptionFormatterService.defineDataloadState(
+        mockData,
+        FluidType.ELECTRICITY,
+        TimeStep.YEAR,
+        fluidStatus[FluidType.ELECTRICITY]
+      )
+      expect(result).toEqual(expectedResult)
+    })
+    it('sould return VALID state because data.date < firstFluidDataDate for month timestep', () => {
+      fluidStatus[FluidType.ELECTRICITY].firstDataDate = DateTime.fromISO(
+        '2020-10-20T00:00:00.000Z',
+        {
+          zone: 'utc',
+        }
+      )
+      const expectedResult: Dataload = {
+        ...mockData,
+        state: DataloadState.VALID,
+      }
+      const result: Dataload = consumptionFormatterService.defineDataloadState(
+        mockData,
+        FluidType.ELECTRICITY,
+        TimeStep.MONTH,
+        fluidStatus[FluidType.ELECTRICITY]
+      )
+      expect(result).toEqual(expectedResult)
+    })
+    it('sould return VALID state because data.date < firstFluidDataDate for year timestep', () => {
+      fluidStatus[FluidType.ELECTRICITY].firstDataDate = DateTime.fromISO(
+        '2020-12-20T00:00:00.000Z',
+        {
+          zone: 'utc',
+        }
+      )
+      const expectedResult: Dataload = {
+        ...mockData,
+        state: DataloadState.VALID,
+      }
+      const result: Dataload = consumptionFormatterService.defineDataloadState(
+        mockData,
+        FluidType.ELECTRICITY,
+        TimeStep.YEAR,
         fluidStatus[FluidType.ELECTRICITY]
       )
       expect(result).toEqual(expectedResult)
@@ -345,6 +424,7 @@ describe('ConsumptionFormatter service', () => {
       const result: Dataload = consumptionFormatterService.defineDataloadState(
         mockEmptyData,
         FluidType.ELECTRICITY,
+        TimeStep.DAY,
         fluidStatus[FluidType.ELECTRICITY]
       )
       expect(result).toEqual(expectedResult)
@@ -369,6 +449,7 @@ describe('ConsumptionFormatter service', () => {
       const result: Dataload = consumptionFormatterService.defineDataloadState(
         mockData,
         FluidType.ELECTRICITY,
+        TimeStep.DAY,
         fluidStatus[FluidType.ELECTRICITY]
       )
       expect(result).toEqual(expectedResult)
@@ -428,6 +509,7 @@ describe('ConsumptionFormatter service', () => {
         const result: Dataload = consumptionFormatterService.defineDataloadState(
           data,
           FluidType.ELECTRICITY,
+          TimeStep.DAY,
           fluidStatus[FluidType.ELECTRICITY]
         )
         expect(result).toEqual(expectedResult)
@@ -444,6 +526,7 @@ describe('ConsumptionFormatter service', () => {
         const result: Dataload = consumptionFormatterService.defineDataloadState(
           data,
           FluidType.GAS,
+          TimeStep.DAY,
           fluidStatus[FluidType.GAS]
         )
         expect(result).toEqual(expectedResult)
@@ -460,6 +543,7 @@ describe('ConsumptionFormatter service', () => {
         const result: Dataload = consumptionFormatterService.defineDataloadState(
           data,
           FluidType.WATER,
+          TimeStep.DAY,
           fluidStatus[FluidType.WATER]
         )
         expect(result).toEqual(expectedResult)
@@ -520,6 +604,7 @@ describe('ConsumptionFormatter service', () => {
         const result: Dataload = consumptionFormatterService.defineDataloadState(
           data,
           FluidType.ELECTRICITY,
+          TimeStep.DAY,
           fluidStatus[FluidType.ELECTRICITY]
         )
         expect(result).toEqual(expectedResult)
@@ -536,6 +621,7 @@ describe('ConsumptionFormatter service', () => {
         const result: Dataload = consumptionFormatterService.defineDataloadState(
           data,
           FluidType.GAS,
+          TimeStep.DAY,
           fluidStatus[FluidType.GAS]
         )
         expect(result).toEqual(expectedResult)
@@ -552,6 +638,7 @@ describe('ConsumptionFormatter service', () => {
         const result: Dataload = consumptionFormatterService.defineDataloadState(
           data,
           FluidType.WATER,
+          TimeStep.DAY,
           fluidStatus[FluidType.WATER]
         )
         expect(result).toEqual(expectedResult)
diff --git a/src/services/consumptionFormatter.service.ts b/src/services/consumptionFormatter.service.ts
index ce3f9e438..1ca49c7e2 100644
--- a/src/services/consumptionFormatter.service.ts
+++ b/src/services/consumptionFormatter.service.ts
@@ -38,6 +38,7 @@ export default class ConsumptionFormatterService {
               valueDetail: null,
             },
         fluidType,
+        timeStep,
         fluidStatus
       )
       filledData.push({ ...newElement })
@@ -50,6 +51,7 @@ export default class ConsumptionFormatterService {
   public defineDataloadState(
     data: Dataload,
     fluidType: FluidType,
+    timeStep: TimeStep,
     fluidStatus?: FluidStatus
   ): Dataload {
     const today = DateTime.local().setZone('utc', {
@@ -63,7 +65,26 @@ export default class ConsumptionFormatterService {
       return data
     }
     // Define state in function of first and last fluid data date
-    if (fluidStatus.firstDataDate && data.date < fluidStatus.firstDataDate) {
+    if (
+      fluidStatus.firstDataDate &&
+      timeStep !== TimeStep.MONTH &&
+      timeStep !== TimeStep.YEAR &&
+      data.date < fluidStatus.firstDataDate
+    ) {
+      return { ...data, state: DataloadState.EMPTY }
+    }
+    if (
+      fluidStatus.firstDataDate &&
+      timeStep === TimeStep.MONTH &&
+      data.date < fluidStatus.firstDataDate.startOf('month')
+    ) {
+      return { ...data, state: DataloadState.EMPTY }
+    }
+    if (
+      fluidStatus.firstDataDate &&
+      timeStep === TimeStep.YEAR &&
+      data.date < fluidStatus.firstDataDate.startOf('year')
+    ) {
       return { ...data, state: DataloadState.EMPTY }
     }
     if (fluidStatus.lastDataDate && data.date > fluidStatus.lastDataDate) {
diff --git a/src/services/queryRunner.service.ts b/src/services/queryRunner.service.ts
index dad1cf338..1fae7902e 100644
--- a/src/services/queryRunner.service.ts
+++ b/src/services/queryRunner.service.ts
@@ -429,7 +429,9 @@ export default class QueryRunner {
       return DateTime.local(
         result.data[0].year,
         result.data[0].month,
-        result.data[0].day
+        result.data[0].day,
+        result.data[0].hour ? result.data[0].hour : 0,
+        result.data[0].minute ? result.data[0].minute : 0
       ).setZone('utc', {
         keepLocalTime: true,
       })
@@ -451,7 +453,9 @@ export default class QueryRunner {
       return DateTime.local(
         result.data[0].year,
         result.data[0].month,
-        result.data[0].day
+        result.data[0].day,
+        result.data[0].hour ? result.data[0].hour : 0,
+        result.data[0].minute ? result.data[0].minute : 0
       ).setZone('utc', {
         keepLocalTime: true,
       })
-- 
GitLab