Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • web-et-numerique/factory/llle_project/ecolyo
1 result
Select Git revision
Show changes
Commits on Source (6)
......@@ -8,7 +8,7 @@
"build": "yarn run build:css && yarn run build:browser",
"build:browser": "cs build --browser ",
"build:cs": "build:browser",
"build:css": "sass -c ./src/styles",
"build:css": "sass -c ./src/styles:build",
"build-dev": "yarn run build:css && yarn run build-dev:browser",
"build-dev:browser": "cs build --browser --config app.config.alpha.js",
"build-dev:mobile": "cs build --mobile --config app.config.alpha.js",
......
......@@ -4,7 +4,7 @@ import { DateTime } from 'luxon'
import React from 'react'
import { Provider } from 'react-redux'
import { dataLoadArray } from 'tests/__mocks__/chartData.mock'
import { createMockEcolyoStore } from 'tests/__mocks__/store'
import { createMockEcolyoStore, mockGlobalState } from 'tests/__mocks__/store'
import ElecHalfHourChart from './ElecHalfHourChart'
jest.mock('services/dateChart.service', () => {
......@@ -20,6 +20,7 @@ describe('ElecHalfHourChart component', () => {
zone: 'utc',
}),
},
global: mockGlobalState,
})
it('should be rendered correctly', () => {
const wrapper = mount(
......
......@@ -6,7 +6,7 @@ import React from 'react'
import { Provider } from 'react-redux'
import * as chartActions from 'store/chart/chart.slice'
import { graphData } from 'tests/__mocks__/chartData.mock'
import { createMockEcolyoStore } from 'tests/__mocks__/store'
import { createMockEcolyoStore, mockGlobalState } from 'tests/__mocks__/store'
import Bar from './Bar'
const mockXScale: ScaleBand<string> = scaleBand()
......@@ -41,6 +41,7 @@ describe('Bar component test', () => {
zone: 'utc',
}),
},
global: mockGlobalState,
})
it('should correctly render Multifluid Bar', () => {
......
import { ScaleBand, ScaleLinear } from 'd3-scale'
import { detect } from 'detect-browser'
import { DataloadState, FluidType, TimeStep } from 'enums'
import { FluidType, TimeStep } from 'enums'
import { DateTime } from 'luxon'
import { Dataload } from 'models'
import React, { useEffect, useState } from 'react'
......@@ -14,10 +14,10 @@ import { useAppDispatch, useAppSelector } from 'store/hooks'
interface BarProps {
index: number
dataload: Dataload
compare: boolean
compareDataload: Dataload | null
fluidType: FluidType
timeStep: TimeStep
compare: boolean
xScale: ScaleBand<string>
yScale: ScaleLinear<number, number>
height: number
......@@ -32,10 +32,10 @@ interface BarProps {
const Bar = ({
index,
dataload,
compare,
compareDataload,
fluidType,
timeStep,
compare,
xScale,
yScale,
height,
......@@ -47,7 +47,10 @@ const Bar = ({
average,
}: BarProps) => {
const dispatch = useAppDispatch()
const { selectedDate } = useAppSelector(state => state.ecolyo.chart)
const {
chart: { selectedDate },
global: { fluidStatus },
} = useAppSelector(state => state.ecolyo)
const [clicked, setClicked] = useState(false)
const [animationEnded, setAnimationEnded] = useState(false)
const [compareAnimationEnded, setCompareAnimationEnded] = useState(false)
......@@ -127,6 +130,15 @@ const Bar = ({
return compare ? xScale.bandwidth() / 2 : xScale.bandwidth()
}
const lastDataDate =
fluidType !== FluidType.MULTIFLUID && fluidStatus[fluidType].lastDataDate
const dataMissingUpcoming = Boolean(
lastDataDate &&
dataload.date > lastDataDate &&
dataload.date < DateTime.local()
)
const topRoundedRect = (
x: number,
y: number,
......@@ -172,32 +184,31 @@ const Bar = ({
</g>
)}
{/* placeholder bar for upcoming values */}
{height > 0 &&
dataload.state === DataloadState.COMING &&
dataload.date < DateTime.local() && (
<g
transform={`translate(${xScaleValue}, ${yScaleValue})`}
className="barFill"
>
<defs>
<linearGradient id="gradient" x1="0" x2="0" y1="0" y2="1">
<stop id="stop-color-1" offset="0%" />
<stop id="stop-color-2" offset="100%" />
</linearGradient>
</defs>
<path
d={topRoundedRect(
compare ? getBandWidth() : 0,
0,
weekdays ? 3 : getBandWidth(),
height - yScaleValue
)}
className={getBarClass()}
onClick={!weekdays ? handleClick : () => undefined}
onAnimationEnd={onAnimationEnd}
/>
</g>
)}
{height > 0 && dataMissingUpcoming && (
<g
transform={`translate(${xScaleValue}, ${yScaleValue})`}
className="barFill"
>
<defs>
<linearGradient id="gradient" x1="0" x2="0" y1="0" y2="1">
<stop id="stop-color-1" offset="0%" />
<stop id="stop-color-2" offset="100%" />
</linearGradient>
</defs>
<path
d={topRoundedRect(
compare ? getBandWidth() : 0,
0,
weekdays ? 3 : getBandWidth(),
height - yScaleValue
)}
className={getBarClass()}
onClick={!weekdays ? handleClick : () => undefined}
onAnimationEnd={onAnimationEnd}
/>
</g>
)}
{/* hashed bars */}
{height > 0 && dataload.value >= 0 && isMultiMissingFluid ? (
<g
transform={`translate(${xScaleValue}, ${yScaleValue})`}
......@@ -258,6 +269,7 @@ const Bar = ({
height > 0 &&
dataload.value &&
dataload.value >= 0 && (
// default colored bar
<g transform={`translate(${xScaleValue}, ${yScaleValue})`}>
<defs>
<linearGradient
......
......@@ -91,11 +91,11 @@ const BarChart = ({
/>
<g transform={`translate(${marginLeft},${marginTop})`}>
{chartData.actualData.map((d, index) => (
{chartData.actualData.map((data, index) => (
<Bar
key={index}
index={index}
dataload={d}
dataload={data}
compareDataload={
chartData.comparisonData?.[index]
? chartData.comparisonData[index]
......@@ -109,11 +109,9 @@ const BarChart = ({
height={getContentHeight()}
isSwitching={isSwitching}
isMultiMissingFluid={
d.state === DataloadState.AGGREGATED_WITH_EMPTY ||
d.state === DataloadState.AGGREGATED_WITH_COMING ||
d.state === DataloadState.AGGREGATED_WITH_HOLE_OR_MISSING
? true
: false
data.state === DataloadState.AGGREGATED_WITH_EMPTY ||
data.state === DataloadState.AGGREGATED_WITH_COMING ||
data.state === DataloadState.AGGREGATED_WITH_HOLE_OR_MISSING
}
clickable={clickable}
average={averageConsumption}
......
......@@ -5,13 +5,12 @@ import explorationEntityData from 'db/explorationEntity.json'
import quizEntityData from 'db/quizEntity.json'
import { FluidType } from 'enums'
import { DateTime } from 'luxon'
import { Profile, UserChallenge } from 'models'
import { Profile, Trigger, UserChallenge } from 'models'
import { allChallengeEntityData } from 'tests/__mocks__/challengeEntity.mock'
import { graphData } from 'tests/__mocks__/chartData.mock'
import mockClient from 'tests/__mocks__/client.mock'
import { allDuelEntity } from 'tests/__mocks__/duelData.mock'
import { allExplorationEntities } from 'tests/__mocks__/explorationData.mock'
import { fluidPrices } from 'tests/__mocks__/fluidPrice.mock'
import { fluidStatusData } from 'tests/__mocks__/fluidStatusData.mock'
import { allQuizEntities } from 'tests/__mocks__/quizData.mock'
import { mockProfileState } from 'tests/__mocks__/store'
......@@ -184,15 +183,35 @@ describe('Initialization service', () => {
})
describe('initFluidPrices method', () => {
it('should do nothing because prices are already created', async () => {
mockGetAllPrices.mockResolvedValueOnce(fluidPrices)
const isDone = await initializationService.initFluidPrices()
expect(isDone).toBeTruthy()
})
it('should try to fetch prices from remote doctype', async () => {
mockGetAllPrices.mockResolvedValueOnce('')
const isDone = await initializationService.initFluidPrices()
expect(isDone).toBeFalsy()
it('should launch fluidsPrices service', async () => {
const mockQueryResult: QueryResult<Trigger[]> = {
data: [
{
_id: 'triggerId',
type: '',
arguments: '',
message: { account: '', konnector: '' },
worker: '',
},
],
bookmark: '',
next: false,
skip: 0,
}
mockClient.query.mockResolvedValueOnce(mockQueryResult)
await initializationService.initFluidPrices()
expect(mockClient.getStackClient).toBeCalledTimes(1)
})
it('should not launch fluidsPrices service because trigger is not found', async () => {
const mockQueryResult: QueryResult<Trigger[]> = {
data: [],
bookmark: '',
next: false,
skip: 0,
}
mockClient.query.mockResolvedValueOnce(mockQueryResult)
await initializationService.initFluidPrices()
expect(mockClient.getStackClient).toBeCalledTimes(0)
})
})
describe('initChallengeEntity method', () => {
......
import * as Sentry from '@sentry/react'
import { Client } from 'cozy-client'
import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client'
import logger from 'cozy-logger'
import challengeEntityData from 'db/challengeEntity.json'
import duelEntityData from 'db/duelEntity.json'
......@@ -12,8 +12,7 @@ import {
EXPLORATION_DOCTYPE,
PROFILE_DOCTYPE,
QUIZ_DOCTYPE,
REMOTE_ORG_ECOLYO_AGENT_PRICES,
REMOTE_ORG_ECOLYO_AGENT_PRICES_REC,
TRIGGERS_DOCTYPE,
} from 'doctypes'
import { FluidType } from 'enums'
import { DateTime } from 'luxon'
......@@ -21,7 +20,6 @@ import { initSchemaDoctype } from 'migrations/migration'
import { migrations } from 'migrations/migration.data'
import {
Dataload,
FluidPrice,
FluidStatus,
InitSteps,
InitStepsErrors,
......@@ -29,6 +27,7 @@ import {
ProfileEcogesture,
ProfileType,
TermsStatus,
Trigger,
UserChallenge,
} from 'models'
import React from 'react'
......@@ -43,8 +42,6 @@ import { getActualAnalysisDate } from 'utils/date'
import { logDuration } from 'utils/duration'
import { hashFile } from 'utils/hash'
import logApp from 'utils/logger'
import EnvironmentService from './environment.service'
import FluidPricesService from './fluidsPrices.service'
import ProfileEcogestureService from './profileEcogesture.service'
import ProfileTypeEntityService from './profileTypeEntity.service'
import TermsService from './terms.service'
......@@ -161,47 +158,28 @@ export default class InitializationService {
}
}
public async initFluidPrices(): Promise<boolean> {
public async initFluidPrices(): Promise<void> {
const startTime = performance.now()
const fpService = new FluidPricesService(this._client)
// Populate data if none ecogesture exists
const loadedPrices = await fpService.getAllPrices()
if (loadedPrices?.length) {
logDuration('[Initialization] FluidPrices db already created', startTime)
return true
logDuration('[Initialization] Launching fluidPrices service', startTime)
const triggerQuery: QueryDefinition = Q(TRIGGERS_DOCTYPE).where({
'message.name': 'fluidsPrices',
})
const {
data: [trigger],
}: QueryResult<Array<Trigger>> = await this._client.query(triggerQuery)
if (trigger?._id) {
this._client
.getStackClient()
.fetchJSON('POST', `/jobs/triggers/${trigger._id}/launch`)
logDuration(
'[Initialization] fluidPrices service launched successfully',
startTime
)
} else {
try {
const fluidTypes: FluidType[] = [
FluidType.ELECTRICITY,
FluidType.WATER,
FluidType.GAS,
]
const allPrices: FluidPrice[] = []
const env = new EnvironmentService()
const remoteUrl = env.isProduction()
? REMOTE_ORG_ECOLYO_AGENT_PRICES
: REMOTE_ORG_ECOLYO_AGENT_PRICES_REC
for (const fluid of fluidTypes) {
const prices = await this._client
.getStackClient()
.fetchJSON('GET', `${remoteUrl}?fluidtype=${fluid}`)
allPrices.push(...prices)
}
for (const price of allPrices) {
await fpService.createPrice(price)
}
logDuration('[Initialization] FluidPrices db created', startTime)
return true
} catch (error) {
const errorMessage = `Initialization error - initFluidPrices: ${JSON.stringify(
error
)}`
logStack('error', errorMessage)
logApp.error(errorMessage)
Sentry.captureException(errorMessage)
return false
}
logDuration(
'[Initialization] FluidPrices service trigger not found',
startTime
)
}
}
......
This diff is collapsed.
{
"version": 3,
"sourceRoot": "",
"sources": [
"index.scss",
"base/_color.scss",
"base/_layout.scss",
"base/_z-index.scss",
"base/_typography.scss",
"base/_typo-variables.scss",
"components/_barchart.scss",
"components/_buttons.scss",
"base/_mixins.scss",
"components/_card.scss",
"components/_dialog.scss",
"components/_expansion-panel.scss",
"components/_link.scss"
],
"names": [],
"mappings": "AAAA;AACQ;AACR;AACQ;AACR;ACJA;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;ADhIQ;AEZR;EACE,YDDa;;;ACIf;EACE,YDLa;ECMb;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;AACA;EANF;IAOI;;;;AAIJ;EACE,kBDaM;;ACZN;EAFF;IAGI;IACA;;;;AAIJ;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA,SCxDS;EDyDT;EACA;EACA;;AACA;EAVF;IAWI;;;AAEF;EACE;EAKA;;AACA;EACE;EACA,ODvBQ;;AC0BZ;EACE;EACA;EACA;;AACA;EAJF;IAKI;;;AAEF;EAPF;IAQI;;;AAEF;EACE;EACA;;AACA;EACE;;AAEF;EACE;EACA;;AAEF;EACE;EACA;EACA;EACA,ODlDM;;ACoDR;EACE;;AAEF;EACE;IACE;IACA,OD1DI;;EC4DN;IACE;;EAEF;IACE;;;;AAOV;EACE;EACA;EACA;EACA;EACA;EACA;EACA,OD9EY;;AC+EZ;EACE;EACA;EACA;;AAEF;EACE;EACA;;;AAIJ;AACE;AAIA;AAIA;;AAPA;EACE;;AAGF;EACE,YDHc;;ACMhB;EACE,YDNc;;;AAnJlB;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AAhJA;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AG5IA;EACE,aCLU;;;ADQZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE,OHsCU;EGrCV,aChBU;;;ADmBZ;EACE;EACA,aCrBU;EDsBV;EACA;EACA;EACA;;;AAGF;EACE,aC7BU;ED8BV;EACA;EACA;EACA;EAEA;EACA;EACA,OHeY;EGdZ;;;AAEF;EACE,OHtBY;EGuBZ;EACA;;;AAIA;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AAKN;AACA;EACE,aCrFU;EDsFV;EACA;EACA;EACA;EACA,OHtCY;;;AGwCd;EACE,aC7FU;ED8FV;EACA;EACA;EACA;EACA,OH9CY;;;AGgDd;EACE,aCrGU;EDsGV;EACA;EACA;EACA;EACA,OHtDY;;;AGwDd;EACE,aC7GU;ED8GV;EACA;EACA;EACA;EACA,OH9DY;;;AGgEd;EACE,aCrHU;EDsHV;EACA;EACA;EACA;EACA,OHtEY;;;AGyEd;AACA;EACE,aC/HU;EDgIV;EACA;EACA;EACA;;AACA;EANF;IAOI;;;;AAGJ;EACE,aCzIU;ED0IV;EACA;EACA;EACA;;AACA;EANF;IAOI;;;;AAIJ;AACA;EACE,aCrJU;EDsJV;EACA;EACA;EACA;EACA,OHtGY;;;AApDd;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AK7IA;EACE,OLkDU;;AKjDV;EACE,MLgDQ;;AK/CR;EACE,ML4CQ;;AKzCZ;EACE;EACA;EACA;;;AAGJ;EACE,MLoCU;;AKnCV;EACE,MLgCU;;;AK3BZ;AAAA;EACE;;;AAGJ;EACE;;AACA;EACE;;;AAGJ;EACE;;;AAUA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;;AAGJ;EACE,MLuBe;;AKtBf;EACE,MLmBS;EKlBT;;;AAIJ;EACE,MLiBuB;;AKhBvB;EACE,MLciB;EKbjB;;;AAIJ;EACE,MLmBgB;;AKlBhB;EACE,MLeU;EKdV;;;AAIJ;EACE,MLawB;;AKZxB;EACE,MLUkB;EKTlB;;;AAIJ;EACE,MLHc;;AKId;EACE,MLPQ;EKQR;;;AAIJ;EACE,MLTsB;;AKUtB;EACE,MLZgB;EKahB;;;AAIJ;EACE,MLRgB;;AKShB;EACE,MLXU;EKYV;;AAGA;EACE;;;AAIN;EACE,MLpFW;;AKqFX;EACE,MLtFS;EKuFT;;AAGA;EACE;;;AAIN;EACE,ML1HK;EK2HL;;AACA;EACE,MLpCU;EKqCV;;AAGA;EACE;;;AAKN;EACE,ML5CwB;;AK6CxB;EACE,ML/CkB;EKgDlB;;;AAGJ;EACE;EACA,QLvDY;;;AKyDd;EACE,MLzEmB;;AK0EnB;EACE,ML3EiB;EK4EjB;;;AAGJ;EACE,ML/DoB;;AKgEpB;EACE,MLjEkB;EKkElB;;;AAGJ;AACA;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAIJ;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAIJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;IACE;IACA;;EAEF;IACE;IACA;;EAEF;IACE;IACA;;;AAIJ;AACA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;ALxRF;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AM5IE;ECEA,YPiH4B;EOhH5B,kBPYY;EOXZ,QDHyC;ECIzC;EACA;EACA;EACA;EACA;;AACA;EACE,ODV8B;;ACYhC;EDXI;;ACiBJ;EACE;;ADfF;ECHA,YDQI;ECPJ,kBDII;ECHJ,QDKI;ECJJ;EACA;EACA;EACA;EACA;;AACA;EACE,OPIU;;AOFZ;EDDI;;AACA;EACE;;ACKN;EACE;;ADFF;EChBA,YDqBI;ECpBJ,kBDiBI;EChBJ,QDkBI;ECjBJ;EACA;EACA;EACA;EACA;;AACA;EACE,OPIU;;AOFZ;EDYI;;AACA;EACE;;ACRN;EACE;;ADWF;EC7BA,YDkCI;ECjCJ,kBD8BI;EC7BJ,QD+BI;EC9BJ;EACA;EACA;EACA;EACA;;AACA;EACE,OPqCU;;AOnCZ;EDyBI;;AACA;EACE;;ACrBN;EACE;;ADwBF;EC1CA,YD+CI;EC9CJ,kBD2CI;EC1CJ,QD4CI;EC3CJ;EACA;EACA;EACA;EACA;;AACA;EACE,OPqCU;;AOnCZ;EDsCI;;AACA;EACE;;AClCN;EACE;;ADqCF;ECvDA,YPFa;EOGb,kBPHa;EOIb,QDyDI;ECxDJ;EACA;EACA;EACA;EACA;;AACA;EACE,OPiCI;;AO/BN;EDmDI;;AC7CJ;EACE;;AD+CF;ECjEA,YPmBK;EOlBL,kBPkBK;EOjBL,QDgEwC;EC/DxC;EACA;EACA;EACA;EACA;;AACA;EACE,OPXW;;AOab;EDwDI;;AClDJ;EACE;;ADoDF;ECtEA;EACA,kBPHa;EOIb,QDqEyC;ECpEzC;EACA;EACA;EACA;EACA;;AACA;EACE,OPiCI;;AO/BN;ED6DI;;ACvDJ;EACE;;ADyDF;EC3EA,YPiH4B;EOhH5B,kBPYY;EOXZ,QD0EyC;ECzEzC;EACA;EACA;EACA;EACA;;AACA;EACE,ODmE8B;;ACjEhC;EDkEI;;AC5DJ;EACE;;AD8DF;EChFA,YDiF0C;EChF1C,kBDgFkB;EC/ElB,QD+EoC;EC9EpC;EACA;EACA;EACA;EACA;;AACA;EACE,OPsCQ;;AO9BV;EACE;;;APxBJ;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AQ9IA;EACE,YRoDgC;EQnDhC;EACA;EACA;EACA;EACA;;AACA;EACE,YRkDoC;;AQhDtC;EACE;;;ARbJ;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AS5IE;EACE;;;AAIJ;EACE,YT6CgC;ES5ChC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OT4BM;;AS3BN;EAZF;IAaI;IACA;;;AAEF;EAhBF;IAiBI;IACA;IACA;IACA;;;AAEF;EACE;;AAEF;EACE;;AAEF;EACE;;AAEF;EACE;;AAEF;EACE;EACA;EACA;EACA;EACA,SP9CO;;;AOkDX;EACE,YTEgC;ESDhC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OTfM;ESgBN;EACA;;AACA;EACE,YT/DW;;;AAJf;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AU9IA;EACE;EACA,OVgDY;EU/CZ,YVkDgC;EUjDhC;EACA;EACA;EACA;;AACA;EACE;;AAEF;EACE;;AAEF;EACE;;;AAGJ;EACE;EACA;;AACA;EACE;EACA;EACA;;AAEF;EACE;;AACA;EACE;;AAGJ;EACE;EACA;;AAEF;EACE;;;AAGJ;EACE;EACA;;AACA;EACE;;;AAGJ;EACE;;;AVlDF;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AW/IA;EACE,OXgBW;;AWfX;EACE,OXcS;;;AWVb;EACE;EACA;;AACA;EACE;;;AAGJ;EACE;;;AAEF;EACE,OXiCY;;;ADlCd;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EAME;EACA,kBCzDa",
"file": "index.css"
}
......@@ -51,65 +51,56 @@ const synchroPricesToUpdate = async (
const remotePrices = await getRemotePricesByFluid(client, fluidType)
let firstEditedPrice: string | null = null
await Promise.all(
remotePrices.map(remotePrice => {
// eslint-disable-next-line no-async-promise-executor
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
) {
logStack(
'debug',
`Price exist in db but not up to date, updating it`
)
// 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
}
// 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 {
logStack('debug', `Price up to date`)
}
} else {
logStack('debug', `Price doesn't exist in db, creating new price`)
// 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
}
// create price in db
await fps.createPrice(remotePrice)
remotePrices.map(async remotePrice => {
try {
const existingPrice = await fps.checkIfPriceExists(remotePrice)
if (!existingPrice) {
logStack('debug', `Price doesn't exist in db, creating a new price`)
// 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
) {
firstEditedPrice = remotePrice.startDate
}
} catch (error) {
logStack('error', `Error: ${error}`)
Sentry.captureException(JSON.stringify({ error }))
} finally {
resolve()
await fps.createPrice(remotePrice)
return
}
})
if (!existingPrice.UpdatedAt && remotePrice.UpdatedAt) {
// updatedAt key doesn't exist in db
await fps.updatePrice(existingPrice, {
UpdatedAt: remotePrice.UpdatedAt,
})
return
} else if (
!existingPrice.UpdatedAt ||
!remotePrice.UpdatedAt ||
existingPrice.UpdatedAt >= remotePrice.UpdatedAt
) {
logStack('debug', `Price up to date`)
return
}
logStack('debug', `Price exists in db but not up to date, updating it`)
// 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
) {
firstEditedPrice = remotePrice.startDate
}
// update this price in db
await fps.updatePrice(existingPrice, {
price: remotePrice.price,
UpdatedAt: remotePrice.UpdatedAt,
startDate: remotePrice.startDate,
endDate: remotePrice.endDate,
})
} catch (error) {
logStack('error', `Error: ${error}`)
Sentry.captureException(JSON.stringify({ error }))
}
})
)
return firstEditedPrice
......@@ -167,41 +158,36 @@ const aggregatePrices = async (
)
await Promise.all(
tsa.map(async ts => {
// eslint-disable-next-line no-async-promise-executor
return new Promise<void>(async resolve => {
let date: DateTime = DateTime.local()
Object.assign(date, firstDate)
try {
do {
const tp = await getTimePeriod(ts, date)
// Get doc for aggregation
const data = await qr.fetchFluidRawDoctype(
tp,
TimeStep.DAY,
fluidType
)
// Get doc to update
const docToUpdate = await qr.fetchFluidRawDoctype(tp, ts, fluidType)
let date: DateTime = DateTime.local()
Object.assign(date, firstDate)
try {
do {
const tp = await getTimePeriod(ts, date)
// Get doc for aggregation
const data = await qr.fetchFluidRawDoctype(
tp,
TimeStep.DAY,
fluidType
)
// Get doc to update
const docToUpdate = await qr.fetchFluidRawDoctype(tp, ts, fluidType)
if (docToUpdate?.data && data?.data) {
docToUpdate.data[0].price = data.data.map(price).reduce(sum)
}
// 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')
}
} while (date < today)
} catch (error) {
logStack('info', `Error : ${error}`)
Sentry.captureException(JSON.stringify({ error }))
} finally {
resolve()
}
})
if (docToUpdate?.data && data?.data) {
docToUpdate.data[0].price = data.data.map(price).reduce(sum)
}
// 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')
}
} while (date < today)
} catch (error) {
logStack('info', `Error : ${error}`)
Sentry.captureException(JSON.stringify({ error }))
}
})
)
logStack('debug', `Aggregation done`)
......@@ -302,51 +288,46 @@ const applyPrices = async (client: Client, fluidType: FluidType) => {
// Hourly and daily prices
await Promise.all(
tsa.map(async timeStep => {
// eslint-disable-next-line no-async-promise-executor
return new Promise<void>(async resolve => {
let date: DateTime = DateTime.local().setZone('utc', {
keepLocalTime: true,
})
Object.assign(date, firstDate)
try {
do {
// Get price
const priceData = await fluidsPricesService.getPrices(
fluidType,
date
)
const tp = await getTimePeriod(timeStep, date)
// Get doc to update
const data = await qr.fetchFluidRawDoctype(
tp,
timeStep,
fluidType
)
// If lastItem has a price, skip this day (in order to save perf)
const lastItem = 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?.data.forEach((element: DataloadEntity) => {
element.price = element.load * priceData.price
})
// Save updated docs
await cdm.saveDocs(data.data)
}
// Update date
if (timeStep === TimeStep.HALF_AN_HOUR) {
date = date.plus({ days: 1 })
} else {
date = date.plus({ month: 1 }).startOf('month')
}
} while (date < today)
} catch (error) {
logStack('error', `ERROR : ${error} `)
Sentry.captureException(JSON.stringify({ error }))
} finally {
resolve()
}
let date: DateTime = DateTime.local().setZone('utc', {
keepLocalTime: true,
})
Object.assign(date, firstDate)
try {
do {
// Get price
const priceData = await fluidsPricesService.getPrices(
fluidType,
date
)
const tp = await getTimePeriod(timeStep, date)
// Get doc to update
const data = await qr.fetchFluidRawDoctype(
tp,
timeStep,
fluidType
)
// If lastItem has a price, skip this day (in order to save perf)
const lastItem = 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?.data.forEach((element: DataloadEntity) => {
element.price = element.load * priceData.price
})
// Save updated docs
await cdm.saveDocs(data.data)
}
// Update date
if (timeStep === TimeStep.HALF_AN_HOUR) {
date = date.plus({ days: 1 })
} else {
date = date.plus({ month: 1 }).startOf('month')
}
} while (date < today)
} catch (error) {
logStack('error', `ERROR : ${error} `)
Sentry.captureException(JSON.stringify({ error }))
}
})
)
......