From f518d5a6ebfb36b7eb8cef0f6c7812e623ff7b87 Mon Sep 17 00:00:00 2001
From: git-directory-deploy <>
Date: Tue, 8 Mar 2022 16:11:44 +0100
Subject: [PATCH] fix promises

---
 src/targets/services/fluidsPrices.ts | 204 ++++++++++++++++-----------
 1 file changed, 119 insertions(+), 85 deletions(-)

diff --git a/src/targets/services/fluidsPrices.ts b/src/targets/services/fluidsPrices.ts
index 68c97c41d..bb0b4acb9 100644
--- a/src/targets/services/fluidsPrices.ts
+++ b/src/targets/services/fluidsPrices.ts
@@ -43,69 +43,75 @@ const synchroPricesToUpdate = async (
   const fps = new FluidPricesService(client)
   const remotePrices = await getRemotePricesByfluid(client, fluidType)
   let firstEditedPrice: string | null = null
-  const promises = remotePrices.map(async remotePrice => {
-    return new Promise<void>(async resolve => {
-      //Check if price exist in database
-      log('info', `Price remote ${JSON.stringify(remotePrice)}`)
-      const existingPrice = await fps.checkIfPriceExists(remotePrice)
-      log('info', `Existing ?Price remote ${JSON.stringify(existingPrice)}`)
-      if (existingPrice) {
-        //Check if the remote price is more recent
-        if (
-          existingPrice.UpdatedAt &&
-          remotePrice.UpdatedAt &&
-          existingPrice.UpdatedAt < remotePrice.UpdatedAt
-        ) {
-          log(
-            'info',
-            `Price exist in db but not up to date, updating ${existingPrice}`
-          )
-          log('info', `startDate ${remotePrice.startDate}`)
-          //If a price has been updated, set the oldest startDate of the edited price so we can redo aggregation
-          if (firstEditedPrice === null) {
-            firstEditedPrice = remotePrice.startDate
-          }
-          if (firstEditedPrice >= remotePrice.startDate) {
-            firstEditedPrice = remotePrice.startDate
-          }
-          log(
-            'info',
-            `firstEditedPrice ${firstEditedPrice}, fluidTypeeee : ${fluidType}`
-          )
+  await Promise.all(
+    remotePrices.map(async remotePrice => {
+      return new Promise<void>(async resolve => {
+        try {
+          //Check if price exist in database
+          const existingPrice = await fps.checkIfPriceExists(remotePrice)
+          if (existingPrice) {
+            //Check if the remote price is more recent
+            if (
+              existingPrice.UpdatedAt &&
+              remotePrice.UpdatedAt &&
+              existingPrice.UpdatedAt < remotePrice.UpdatedAt
+            ) {
+              log(
+                'info',
+                `Price exist in db but not up to date, updating ${existingPrice}`
+              )
+              //If a price has been updated, set the oldest startDate of the edited price so we can redo aggregation
+              if (firstEditedPrice === null) {
+                firstEditedPrice = remotePrice.startDate
+              }
+              if (firstEditedPrice >= remotePrice.startDate) {
+                firstEditedPrice = remotePrice.startDate
+              }
+              log(
+                'debug',
+                `firstEditedPrice ${firstEditedPrice}, fluidTypeeee : ${fluidType}`
+              )
 
-          //update this price in db
-          await fps.updatePrice(existingPrice, {
-            price: remotePrice.price,
-            UpdatedAt: remotePrice.UpdatedAt,
-            startDate: remotePrice.startDate,
-            endDate: remotePrice.endDate,
-          })
-        } else if (!existingPrice.UpdatedAt && remotePrice.UpdatedAt) {
-          //updatedAt key doesn't exist in db
-          await fps.updatePrice(existingPrice, {
-            UpdatedAt: remotePrice.UpdatedAt,
-          })
-        } else {
-          log('info', `Price up to date`)
+              //update this price in db
+              await fps.updatePrice(existingPrice, {
+                price: remotePrice.price,
+                UpdatedAt: remotePrice.UpdatedAt,
+                startDate: remotePrice.startDate,
+                endDate: remotePrice.endDate,
+              })
+            } else if (!existingPrice.UpdatedAt && remotePrice.UpdatedAt) {
+              //updatedAt key doesn't exist in db
+              await fps.updatePrice(existingPrice, {
+                UpdatedAt: remotePrice.UpdatedAt,
+              })
+            } else {
+              log('info', `Price up to date`)
+            }
+          } else {
+            log('info', `Price doesn't exist in db, creating new price`)
+            //create price in db
+            await fps.createPrice(remotePrice)
+          }
+        } catch (err) {
+          log('error', `Error: ${err}`)
+        } finally {
+          resolve()
         }
-      } else {
-        log('info', `Price doesn't exist in db, creating new price`)
-        //create price in db
-        await fps.createPrice(remotePrice)
-      }
-      resolve()
+      })
     })
-  })
-  await Promise.all(promises)
+  )
   return firstEditedPrice
 }
 
-const price = (item: DataloadEntity): number | null => {
-  return item.price ? item.price : null
+const price = (item: DataloadEntity): number => {
+  return item.price ? item.price : 0
 }
 
 const sum = (prev: number, next: number): number => {
-  return prev + next
+  if (prev) {
+    return prev + next
+  }
+  return next
 }
 
 const getTimePeriod = async (
@@ -147,40 +153,58 @@ const aggregatePrices = async (
     'debug',
     `Aggregation started for fluid: ${fluidType}, from ${firstDate}  `
   )
-  const aggregatePromises = tsa.map(async ts => {
-    return new Promise<void>(async resolve => {
-      let date: DateTime = DateTime.local()
-      Object.assign(date, firstDate)
-      do {
-        log(
-          'info',
-          `Step: ${ts} | Fluid: ${fluidType} | Date: ${date.day}/${date.month}/${date.year}`
-        )
-        const tp = await getTimePeriod(ts, date)
-        // Get doc for aggregation
-        const data = await qr.fetchFluidRawDoctype(tp, TimeStep.DAY, fluidType)
+  await Promise.all(
+    tsa.map(async ts => {
+      return new Promise<void>(async resolve => {
+        let date: DateTime = DateTime.local()
+        Object.assign(date, firstDate)
+        try {
+          do {
+            log(
+              'info',
+              `Step: ${ts} | Fluid: ${fluidType} | Date: ${date.day}/${date.month}/${date.year}`
+            )
+            const tp = await getTimePeriod(ts, date)
+            // Get doc for aggregation
+            const data = await qr.fetchFluidRawDoctype(
+              tp,
+              TimeStep.DAY,
+              fluidType
+            )
+            log(
+              'info',
+              `DATAAAAAA: ${JSON.stringify(data)} for PERIOD : ${JSON.stringify(
+                tp
+              )} Date: ${date.day}/${date.month}/${
+                date.year
+              } for TIMESTEP ${ts}`
+            )
 
-        // Get doc to update
-        const docToUpdate = await qr.fetchFluidRawDoctype(tp, ts, fluidType)
+            // Get doc to update
+            const docToUpdate = await qr.fetchFluidRawDoctype(tp, ts, fluidType)
+            log('info', `docToUpdateEEEE: ${JSON.stringify(docToUpdate)}`)
 
-        if (docToUpdate && data && docToUpdate.data && data.data) {
-          docToUpdate.data[0].price = data.data.map(price).reduce(sum)
-        }
+            if (docToUpdate && data && docToUpdate.data && data.data) {
+              docToUpdate.data[0].price = data.data.map(price).reduce(sum)
+              // Save updated docs
+              await cdm.saveDocs(docToUpdate.data)
+            }
 
-        // Save updated docs
-        await cdm.saveDocs(docToUpdate.data)
-        // Update date according to timestep
-        if (ts === TimeStep.YEAR) {
-          date = date.plus({ year: 1 }).startOf('month')
-        } else {
-          date = date.plus({ month: 1 }).startOf('month')
+            // Update date according to timestep
+            if (ts === TimeStep.YEAR) {
+              date = date.plus({ year: 1 }).startOf('month')
+            } else {
+              date = date.plus({ month: 1 }).startOf('month')
+            }
+          } while (date < today)
+        } catch (err) {
+          log('error', `Error : ${err}`)
+        } finally {
+          resolve()
         }
-      } while (date < today)
-      resolve()
+      })
     })
-  })
-
-  await Promise.all(aggregatePromises)
+  )
   log('debug', `Aggregation done`)
 }
 
@@ -227,6 +251,8 @@ const applyPrices = async (client: Client, fluidType: FluidType) => {
     const firstMinuteData = await cdm.getFirstDataDateFromDoctypeWithPrice(
       getDoctypeTypeByFluid(fluidType)
     )
+    // const firstDoctypeData = await cdm.getFirsDataDateFromDoctype()
+
     // If there is data, update hourly data and daily data
     if (firstMinuteData || firstEditedPriceDate !== null) {
       const today = DateTime.now()
@@ -291,7 +317,8 @@ const applyPrices = async (client: Client, fluidType: FluidType) => {
                 )
 
                 // If lastItem has a price, skip this day (in order to save perf)
-                const lastItem = data.data[data.data.length - 1]
+                const lastItem =
+                  data && data.data && data.data[data.data.length - 1]
                 if (lastItem && priceData) {
                   //if a price has been updated in backoffice re-calculates all price from the firstEditedPriceDate
                   data &&
@@ -310,11 +337,18 @@ const applyPrices = async (client: Client, fluidType: FluidType) => {
               } while (date < today)
             } catch (err) {
               log('error', `ERROR : ${err} `)
+            } finally {
+              resolve()
             }
-            resolve()
           })
         })
       )
+      log(
+        'info',
+        `SHOULD LAUNCH AGGREGATION for ${fluidType} with ${JSON.stringify(
+          firstDate
+        )}`
+      )
       // Call aggregation method
       await aggregatePrices(qr, cdm, firstDate, today, fluidType)
     } else log('info', `No data found for fluid ${fluidType}`)
-- 
GitLab