diff --git a/src/enum/dacc.enum.ts b/src/enum/dacc.enum.ts index 6c8667e525b358a645648b897605b5be7adae9de..3a77a3a193168b27ab3d8d7d0fcbca9c82df905e 100644 --- a/src/enum/dacc.enum.ts +++ b/src/enum/dacc.enum.ts @@ -10,4 +10,5 @@ export enum DaccEvent { EVENT_DURATION = 'event-duration', QUIZ_STARS = 'quiz-stars', SUMMARY_SUBSCRIPTION_MONTHLY = 'summary-subscription-monthly', + ELECTRICITY_HALF_HOUR_DATA = 'electricity-half-hour-data', } diff --git a/src/services/consumption.service.ts b/src/services/consumption.service.ts index e2703e0176fde5da7b95e807f667bf075ca2bab6..27cf550fb7e79a4e8eeebdac6c24f76fd2f6ee94 100644 --- a/src/services/consumption.service.ts +++ b/src/services/consumption.service.ts @@ -1,13 +1,19 @@ import { DateTime } from 'luxon' -import { Client } from 'cozy-client' - +import { Client, QueryDefinition, Q } from 'cozy-client' import { FluidType } from 'enum/fluid.enum' import { TimeStep } from 'enum/timeStep.enum' -import { Datachart, Dataload, PerformanceIndicator, TimePeriod } from 'models' +import { + Datachart, + Dataload, + DataloadEntity, + PerformanceIndicator, + TimePeriod, +} from 'models' import ConsumptionFormatterService from 'services/consumptionFormatter.service' import QueryRunnerService from 'services/queryRunner.service' import ConsumptionValidatorService from 'services/consumptionValidator.service' import ConverterService from 'services/converter.service' +import { ENEDIS_MINUTE_DOCTYPE } from 'doctypes' // eslint-disable-next-line @typescript-eslint/interface-name-prefix export interface ISingleFluidChartData { @@ -43,7 +49,6 @@ export default class ConsumptionDataManager { ) if (!InputisValid) return null - let mappedData = null if (fluidTypes.length === 1 && !isHome) { //TODO validating input data @@ -56,6 +61,7 @@ export default class ConsumptionDataManager { fluidTypes[0], compareTimePeriod ) + // formatting data const formattedData = this.formatGraphDataManage( fetchedData, @@ -63,12 +69,7 @@ export default class ConsumptionDataManager { timePeriod, compareTimePeriod || null ) - - // validating output data - - // mapping result to contract - mappedData = formattedData - return mappedData + return formattedData } else if (fluidTypes.length > 1 || isHome) { const toBeAgreggatedData: ISingleFluidChartData[] = [] for (const fluidType of fluidTypes) { @@ -92,10 +93,8 @@ export default class ConsumptionDataManager { }) } const aggregatedData = this.aggregateGraphData(toBeAgreggatedData) - // mapping result to contract - mappedData = aggregatedData - return mappedData + return aggregatedData } else return null } @@ -452,4 +451,27 @@ export default class ConsumptionDataManager { return null } + + /** + * getLastHourData + * @param {Client} client + * @param {number} month number + * @returns {Promise<DataloadEntity[]>} usageEvent added + */ + public async getLastHourData( + client: Client, + month: number + ): Promise<DataloadEntity[]> { + const query: QueryDefinition = Q(ENEDIS_MINUTE_DOCTYPE) + .where({ + month: { + $eq: month, + }, + }) + .indexFields(['year', 'month', 'day']) + .sortBy([{ year: 'desc' }, { month: 'desc' }, { day: 'desc' }]) + .limitBy(1) + const data = await client.query(query) + return data.data + } } diff --git a/src/targets/services/aggregatorUsageEvents.ts b/src/targets/services/aggregatorUsageEvents.ts index 489e1b76fbdc955ac551c1103a8cee0a2f3e476c..ef3bb1124fdd0a44dc3c68cea12284d40fabe21e 100644 --- a/src/targets/services/aggregatorUsageEvents.ts +++ b/src/targets/services/aggregatorUsageEvents.ts @@ -53,6 +53,7 @@ const sendIndicator = async ( ? 'Sending data to dacc' : 'Sending data to dacc-dev' ) + // /!\ In order to test locally, please replace /remote/cc.cozycloud.dacc with http://localhost:8081 await client .getStackClient() .fetchJSON( @@ -578,6 +579,35 @@ const sendEmailSubscription = async (client: Client) => { } } +/** + * Send indicator to dacc, if user has half-hour data. + * @param client CozyClient + */ +const sendHalfHourConsumption = async (client: Client) => { + log('info', `sendHalfHourConsumption`) + const consumptionService = new ConsumptionService(client) + + const data = await consumptionService.getLastHourData( + client, + DateTime.local() + .minus({ month: 1 }) + .startOf('month').month + ) + + const halfHourConsumption: Indicator = { + createdBy: 'ecolyo', + measureName: DaccEvent.ELECTRICITY_HALF_HOUR_DATA, + startDate: DateTime.local() + .setZone('utc', { + keepLocalTime: true, + }) + .startOf('day') + .toISODate(), + value: data && data.length > 0 ? 1 : 0, + } + await sendIndicator(halfHourConsumption, client) +} + const aggregateEvents = async ( events: UsageEvent[], eventType: UsageEventType, @@ -936,6 +966,7 @@ const AggregatorUsageEvents = async ({ ) { calculateConsumptionVariation(client) sendEmailSubscription(client) + sendHalfHourConsumption(client) } const uniqueReadUsageEvents: UsageEvent[] = uniq(readUsageEvents) log(