Skip to content
Snippets Groups Projects
Commit a2dea9de authored by Hugo SUBTIL's avatar Hugo SUBTIL
Browse files

feat(dacc): add new monthly indicator for half-hour

parent a02a8b88
Branches
Tags
1 merge request!386US513-dacc-indicator
...@@ -10,4 +10,5 @@ export enum DaccEvent { ...@@ -10,4 +10,5 @@ export enum DaccEvent {
EVENT_DURATION = 'event-duration', EVENT_DURATION = 'event-duration',
QUIZ_STARS = 'quiz-stars', QUIZ_STARS = 'quiz-stars',
SUMMARY_SUBSCRIPTION_MONTHLY = 'summary-subscription-monthly', SUMMARY_SUBSCRIPTION_MONTHLY = 'summary-subscription-monthly',
ELECTRICITY_HALF_HOUR_DATA = 'electricity-half-hour-data',
} }
import { DateTime } from 'luxon' import { DateTime } from 'luxon'
import { Client } from 'cozy-client' import { Client, QueryDefinition, Q } from 'cozy-client'
import { FluidType } from 'enum/fluid.enum' import { FluidType } from 'enum/fluid.enum'
import { TimeStep } from 'enum/timeStep.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 ConsumptionFormatterService from 'services/consumptionFormatter.service'
import QueryRunnerService from 'services/queryRunner.service' import QueryRunnerService from 'services/queryRunner.service'
import ConsumptionValidatorService from 'services/consumptionValidator.service' import ConsumptionValidatorService from 'services/consumptionValidator.service'
import ConverterService from 'services/converter.service' import ConverterService from 'services/converter.service'
import { ENEDIS_MINUTE_DOCTYPE } from 'doctypes'
// eslint-disable-next-line @typescript-eslint/interface-name-prefix // eslint-disable-next-line @typescript-eslint/interface-name-prefix
export interface ISingleFluidChartData { export interface ISingleFluidChartData {
...@@ -43,7 +49,6 @@ export default class ConsumptionDataManager { ...@@ -43,7 +49,6 @@ export default class ConsumptionDataManager {
) )
if (!InputisValid) return null if (!InputisValid) return null
let mappedData = null
if (fluidTypes.length === 1 && !isHome) { if (fluidTypes.length === 1 && !isHome) {
//TODO validating input data //TODO validating input data
...@@ -56,6 +61,7 @@ export default class ConsumptionDataManager { ...@@ -56,6 +61,7 @@ export default class ConsumptionDataManager {
fluidTypes[0], fluidTypes[0],
compareTimePeriod compareTimePeriod
) )
// formatting data // formatting data
const formattedData = this.formatGraphDataManage( const formattedData = this.formatGraphDataManage(
fetchedData, fetchedData,
...@@ -63,12 +69,7 @@ export default class ConsumptionDataManager { ...@@ -63,12 +69,7 @@ export default class ConsumptionDataManager {
timePeriod, timePeriod,
compareTimePeriod || null compareTimePeriod || null
) )
return formattedData
// validating output data
// mapping result to contract
mappedData = formattedData
return mappedData
} else if (fluidTypes.length > 1 || isHome) { } else if (fluidTypes.length > 1 || isHome) {
const toBeAgreggatedData: ISingleFluidChartData[] = [] const toBeAgreggatedData: ISingleFluidChartData[] = []
for (const fluidType of fluidTypes) { for (const fluidType of fluidTypes) {
...@@ -92,10 +93,8 @@ export default class ConsumptionDataManager { ...@@ -92,10 +93,8 @@ export default class ConsumptionDataManager {
}) })
} }
const aggregatedData = this.aggregateGraphData(toBeAgreggatedData) const aggregatedData = this.aggregateGraphData(toBeAgreggatedData)
// mapping result to contract
mappedData = aggregatedData
return mappedData return aggregatedData
} else return null } else return null
} }
...@@ -452,4 +451,27 @@ export default class ConsumptionDataManager { ...@@ -452,4 +451,27 @@ export default class ConsumptionDataManager {
return null 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
}
} }
...@@ -53,6 +53,7 @@ const sendIndicator = async ( ...@@ -53,6 +53,7 @@ const sendIndicator = async (
? 'Sending data to dacc' ? 'Sending data to dacc'
: 'Sending data to dacc-dev' : 'Sending data to dacc-dev'
) )
// /!\ In order to test locally, please replace /remote/cc.cozycloud.dacc with http://localhost:8081
await client await client
.getStackClient() .getStackClient()
.fetchJSON( .fetchJSON(
...@@ -578,6 +579,35 @@ const sendEmailSubscription = async (client: Client) => { ...@@ -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 ( const aggregateEvents = async (
events: UsageEvent[], events: UsageEvent[],
eventType: UsageEventType, eventType: UsageEventType,
...@@ -936,6 +966,7 @@ const AggregatorUsageEvents = async ({ ...@@ -936,6 +966,7 @@ const AggregatorUsageEvents = async ({
) { ) {
calculateConsumptionVariation(client) calculateConsumptionVariation(client)
sendEmailSubscription(client) sendEmailSubscription(client)
sendHalfHourConsumption(client)
} }
const uniqueReadUsageEvents: UsageEvent[] = uniq(readUsageEvents) const uniqueReadUsageEvents: UsageEvent[] = uniq(readUsageEvents)
log( log(
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment