@zetra/citrineos-transactions 1.8.3-fork.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +4 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/module/2.0.1/MessageApi.d.ts +30 -0
- package/dist/module/2.0.1/MessageApi.js +62 -0
- package/dist/module/2.0.1/MessageApi.js.map +1 -0
- package/dist/module/CostCalculator.d.ts +24 -0
- package/dist/module/CostCalculator.js +52 -0
- package/dist/module/CostCalculator.js.map +1 -0
- package/dist/module/CostNotifier.d.ts +27 -0
- package/dist/module/CostNotifier.js +60 -0
- package/dist/module/CostNotifier.js.map +1 -0
- package/dist/module/DataApi.d.ts +43 -0
- package/dist/module/DataApi.js +94 -0
- package/dist/module/DataApi.js.map +1 -0
- package/dist/module/Scheduler.d.ts +12 -0
- package/dist/module/Scheduler.js +33 -0
- package/dist/module/Scheduler.js.map +1 -0
- package/dist/module/StatusNotificationService.d.ts +19 -0
- package/dist/module/StatusNotificationService.js +137 -0
- package/dist/module/StatusNotificationService.js.map +1 -0
- package/dist/module/TransactionService.d.ts +25 -0
- package/dist/module/TransactionService.js +246 -0
- package/dist/module/TransactionService.js.map +1 -0
- package/dist/module/interface.d.ts +5 -0
- package/dist/module/interface.js +5 -0
- package/dist/module/interface.js.map +1 -0
- package/dist/module/model/tariffs.d.ts +10 -0
- package/dist/module/model/tariffs.js +14 -0
- package/dist/module/model/tariffs.js.map +1 -0
- package/dist/module/module.d.ts +122 -0
- package/dist/module/module.js +500 -0
- package/dist/module/module.js.map +1 -0
- package/package.json +25 -0
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { AbstractModule, AsHandler, AuthorizationStatusEnum, CrudRepository, ErrorCode, EventGroup, OCPP1_6, OCPP1_6_CallAction, OCPP2_0_1, OCPP2_0_1_CallAction, OcppError, OCPPValidator, OCPPVersion, } from '@citrineos/base';
|
|
11
|
+
import { Authorization, Component, OCPP1_6_Mapper, sequelize, SequelizeOCPPMessageRepository, SequelizeRepository, StartTransaction, Transaction, VariableAttribute, } from '@citrineos/data';
|
|
12
|
+
import { RabbitMqReceiver, RabbitMqSender, RealTimeAuthorizer, SignedMeterValuesUtil, } from '@citrineos/util';
|
|
13
|
+
import { Logger } from 'tslog';
|
|
14
|
+
import { CostCalculator } from './CostCalculator.js';
|
|
15
|
+
import { CostNotifier } from './CostNotifier.js';
|
|
16
|
+
import { StatusNotificationService } from './StatusNotificationService.js';
|
|
17
|
+
import { TransactionService } from './TransactionService.js';
|
|
18
|
+
/**
|
|
19
|
+
* Component that handles transaction related messages.
|
|
20
|
+
*/
|
|
21
|
+
export class TransactionsModule extends AbstractModule {
|
|
22
|
+
_requests = [];
|
|
23
|
+
_responses = [];
|
|
24
|
+
_transactionEventRepository;
|
|
25
|
+
_authorizeRepository;
|
|
26
|
+
_deviceModelRepository;
|
|
27
|
+
_componentRepository;
|
|
28
|
+
_locationRepository;
|
|
29
|
+
_tariffRepository;
|
|
30
|
+
_reservationRepository;
|
|
31
|
+
_ocppMessageRepository;
|
|
32
|
+
_transactionService;
|
|
33
|
+
_statusNotificationService;
|
|
34
|
+
_fileStorage;
|
|
35
|
+
_authorizers;
|
|
36
|
+
_realTimeAuthorizer;
|
|
37
|
+
_signedMeterValuesUtil;
|
|
38
|
+
_costNotifier;
|
|
39
|
+
_costCalculator;
|
|
40
|
+
_sendCostUpdatedOnMeterValue;
|
|
41
|
+
_costUpdatedInterval;
|
|
42
|
+
/**
|
|
43
|
+
* This is the constructor function that initializes the {@link TransactionsModule}.
|
|
44
|
+
*
|
|
45
|
+
* @param {BootstrapConfig & SystemConfig} config - The `config` contains configuration settings for the module.
|
|
46
|
+
*
|
|
47
|
+
* @param {ICache} [cache] - The cache instance which is shared among the modules & Central System to pass information such as blacklisted actions or boot status.
|
|
48
|
+
*
|
|
49
|
+
* @param {IFileStorage} [fileStorage] - The `fileStorage` allows access to the configured file storage.
|
|
50
|
+
*
|
|
51
|
+
* @param {IMessageSender} [sender] - The `sender` parameter is an optional parameter that represents an instance of the {@link IMessageSender} interface.
|
|
52
|
+
* It is used to send messages from the central system to external systems or devices. If no `sender` is provided, a default {@link RabbitMqSender} instance is created and used.
|
|
53
|
+
*
|
|
54
|
+
* @param {IMessageHandler} [handler] - The `handler` parameter is an optional parameter that represents an instance of the {@link IMessageHandler} interface.
|
|
55
|
+
* It is used to handle incoming messages and dispatch them to the appropriate methods or functions. If no `handler` is provided, a default {@link RabbitMqReceiver} instance is created and used.
|
|
56
|
+
*
|
|
57
|
+
* @param {Logger<ILogObj>} [logger] - The `logger` parameter is an optional parameter that represents an instance of {@link Logger<ILogObj>}.
|
|
58
|
+
* It is used to propagate system-wide logger settings and will serve as the parent logger for any sub-component logging. If no `logger` is provided, a default {@link Logger<ILogObj>} instance is created and used.
|
|
59
|
+
*
|
|
60
|
+
* @param {ITransactionEventRepository} [transactionEventRepository] - An optional parameter of type {@link ITransactionEventRepository} which represents a repository for accessing and manipulating transaction event data.
|
|
61
|
+
* If no `transactionEventRepository` is provided, a default {@link sequelize:transactionEventRepository} instance
|
|
62
|
+
* is created and used.
|
|
63
|
+
*
|
|
64
|
+
* @param {IAuthorizationRepository} [authorizeRepository] - An optional parameter of type {@link IAuthorizationRepository} which represents a repository for accessing and manipulating authorization data.
|
|
65
|
+
* If no `authorizeRepository` is provided, a default {@link sequelize:authorizeRepository} instance is
|
|
66
|
+
* created and used.
|
|
67
|
+
*
|
|
68
|
+
* @param {IDeviceModelRepository} [deviceModelRepository] - An optional parameter of type {@link IDeviceModelRepository} which represents a repository for accessing and manipulating variable attribute data.
|
|
69
|
+
* If no `deviceModelRepository` is provided, a default {@link sequelize:deviceModelRepository} instance is
|
|
70
|
+
* created and used.
|
|
71
|
+
*
|
|
72
|
+
* @param {CrudRepository<Component>} [componentRepository] - An optional parameter of type {@link CrudRepository<Component>} which represents a repository for accessing and manipulating component data.
|
|
73
|
+
* If no `componentRepository` is provided, a default {@link sequelize:componentRepository} instance is
|
|
74
|
+
* created and used.
|
|
75
|
+
*
|
|
76
|
+
* @param {ILocationRepository} [locationRepository] - An optional parameter of type {@link ILocationRepository} which represents a repository for accessing and manipulating location and charging station data.
|
|
77
|
+
* If no `locationRepository` is provided, a default {@link sequelize:locationRepository} instance is
|
|
78
|
+
* created and used.
|
|
79
|
+
*
|
|
80
|
+
* @param {CrudRepository<Component>} [componentRepository] - An optional parameter of type {@link CrudRepository<Component>} which represents a repository for accessing and manipulating component data.
|
|
81
|
+
* If no `componentRepository` is provided, a default {@link sequelize:componentRepository} instance is
|
|
82
|
+
* created and used.
|
|
83
|
+
*
|
|
84
|
+
* @param {ILocationRepository} [locationRepository] - An optional parameter of type {@link ILocationRepository} which represents a repository for accessing and manipulating location and charging station data.
|
|
85
|
+
* If no `locationRepository` is provided, a default {@link sequelize:locationRepository} instance is
|
|
86
|
+
* created and used.
|
|
87
|
+
*
|
|
88
|
+
* @param {ITariffRepository} [tariffRepository] - An optional parameter of type {@link ITariffRepository} which
|
|
89
|
+
* represents a repository for accessing and manipulating tariff data.
|
|
90
|
+
* If no `tariffRepository` is provided, a default {@link sequelize:tariffRepository} instance is
|
|
91
|
+
* created and used.
|
|
92
|
+
*
|
|
93
|
+
* @param {IReservationRepository} [reservationRepository] - An optional parameter of type {@link IReservationRepository}
|
|
94
|
+
* which represents a repository for accessing and manipulating reservation data.
|
|
95
|
+
* If no `reservationRepository` is provided, a default {@link sequelize:reservationRepository} instance is created and used.
|
|
96
|
+
*
|
|
97
|
+
* @param {IOCPPMessageRepository} [ocppMessageRepository] - An optional parameter of type {@link IOCPPMessageRepository}
|
|
98
|
+
* which represents a repository for accessing and manipulating OCPP Message data.
|
|
99
|
+
* If no `ocppMessageRepository` is provided, a default {@link sequelize:ocppMessageRepository} instance is created and used.
|
|
100
|
+
*
|
|
101
|
+
* @param {IAuthorizer[]} [authorizers] - An optional parameter of type {@link IAuthorizer[]} which represents
|
|
102
|
+
* a list of authorizers that can be used to authorize requests.
|
|
103
|
+
*
|
|
104
|
+
* @param {IAuthorizer} [realTimeAuthorizer] - An optional parameter of type {@link IAuthorizer} which represents
|
|
105
|
+
* a real-time authorizer that can be used to authorize real-time requests.
|
|
106
|
+
*/
|
|
107
|
+
constructor(config, cache, fileStorage, sender, handler, logger, ocppValidator, transactionEventRepository, authorizeRepository, deviceModelRepository, componentRepository, locationRepository, tariffRepository, reservationRepository, ocppMessageRepository, realTimeAuthorizer, authorizers) {
|
|
108
|
+
super(config, cache, handler || new RabbitMqReceiver(config, logger), sender || new RabbitMqSender(config, logger), EventGroup.Transactions, logger, ocppValidator);
|
|
109
|
+
this._requests = config.modules.transactions.requests;
|
|
110
|
+
this._responses = config.modules.transactions.responses;
|
|
111
|
+
this._fileStorage = fileStorage;
|
|
112
|
+
this._transactionEventRepository =
|
|
113
|
+
transactionEventRepository ||
|
|
114
|
+
new sequelize.SequelizeTransactionEventRepository(config, logger);
|
|
115
|
+
this._authorizeRepository =
|
|
116
|
+
authorizeRepository || new sequelize.SequelizeAuthorizationRepository(config, logger);
|
|
117
|
+
this._deviceModelRepository =
|
|
118
|
+
deviceModelRepository || new sequelize.SequelizeDeviceModelRepository(config, logger);
|
|
119
|
+
this._componentRepository =
|
|
120
|
+
componentRepository ||
|
|
121
|
+
new SequelizeRepository(config, Component.MODEL_NAME, logger);
|
|
122
|
+
this._locationRepository =
|
|
123
|
+
locationRepository || new sequelize.SequelizeLocationRepository(config, logger);
|
|
124
|
+
this._tariffRepository =
|
|
125
|
+
tariffRepository || new sequelize.SequelizeTariffRepository(config, logger);
|
|
126
|
+
this._reservationRepository =
|
|
127
|
+
reservationRepository || new sequelize.SequelizeReservationRepository(config, logger);
|
|
128
|
+
this._ocppMessageRepository =
|
|
129
|
+
ocppMessageRepository || new SequelizeOCPPMessageRepository(config, this._logger);
|
|
130
|
+
this._authorizers = authorizers || [];
|
|
131
|
+
this._realTimeAuthorizer =
|
|
132
|
+
realTimeAuthorizer ||
|
|
133
|
+
new RealTimeAuthorizer(this._locationRepository, this.config, this._logger);
|
|
134
|
+
this._signedMeterValuesUtil = new SignedMeterValuesUtil(fileStorage, config, this._logger);
|
|
135
|
+
this._sendCostUpdatedOnMeterValue = config.modules.transactions.sendCostUpdatedOnMeterValue;
|
|
136
|
+
this._costUpdatedInterval = config.modules.transactions.costUpdatedInterval;
|
|
137
|
+
this._transactionService = new TransactionService(this._transactionEventRepository, this._authorizeRepository, this._locationRepository, this._reservationRepository, this._ocppMessageRepository, this._realTimeAuthorizer, this._authorizers, this._logger);
|
|
138
|
+
this._statusNotificationService = new StatusNotificationService(this._componentRepository, this._deviceModelRepository, this._locationRepository, this._logger);
|
|
139
|
+
this._costCalculator = new CostCalculator(this._tariffRepository, this._transactionService, this._logger);
|
|
140
|
+
this._costNotifier = new CostNotifier(this, this._transactionEventRepository, this._costCalculator, this._logger);
|
|
141
|
+
}
|
|
142
|
+
get transactionEventRepository() {
|
|
143
|
+
return this._transactionEventRepository;
|
|
144
|
+
}
|
|
145
|
+
get authorizeRepository() {
|
|
146
|
+
return this._authorizeRepository;
|
|
147
|
+
}
|
|
148
|
+
get deviceModelRepository() {
|
|
149
|
+
return this._deviceModelRepository;
|
|
150
|
+
}
|
|
151
|
+
get tariffRepository() {
|
|
152
|
+
return this._tariffRepository;
|
|
153
|
+
}
|
|
154
|
+
get ocppMessageRepository() {
|
|
155
|
+
return this._ocppMessageRepository;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Handle OCPP 2.0.1 requests
|
|
159
|
+
*/
|
|
160
|
+
async _handleTransactionEvent(message, props) {
|
|
161
|
+
this._logger.debug('Transaction event received:', message, props);
|
|
162
|
+
const tenantId = message.context.tenantId;
|
|
163
|
+
const stationId = message.context.stationId;
|
|
164
|
+
const transactionEvent = message.payload;
|
|
165
|
+
const transactionId = transactionEvent.transactionInfo.transactionId;
|
|
166
|
+
let response = undefined;
|
|
167
|
+
let transaction = undefined;
|
|
168
|
+
if (transactionEvent.idToken) {
|
|
169
|
+
response = await this._transactionService.authorizeOcpp201IdToken(tenantId, transactionEvent, message.context);
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
transaction =
|
|
173
|
+
await this._transactionEventRepository.createOrUpdateTransactionByTransactionEventAndStationId(tenantId, message.payload, stationId);
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
if (error.name === 'SequelizeForeignKeyConstraintError') {
|
|
177
|
+
await this.sendCallErrorWithMessage(message, new OcppError(message.context.correlationId, ErrorCode.PropertyConstraintViolation, 'Referenced entity does not exist.'));
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
throw error;
|
|
181
|
+
}
|
|
182
|
+
if (message.payload.reservationId) {
|
|
183
|
+
await this._transactionService.deactivateReservation(tenantId, transactionId, message.payload.reservationId, stationId);
|
|
184
|
+
}
|
|
185
|
+
if (response) {
|
|
186
|
+
const messageConfirmation = await this.sendCallResultWithMessage(message, response);
|
|
187
|
+
this._logger.debug('Transaction response sent: ', messageConfirmation);
|
|
188
|
+
// If the transaction is accepted and interval is set, start the cost update
|
|
189
|
+
if (transactionEvent.eventType === OCPP2_0_1.TransactionEventEnumType.Started &&
|
|
190
|
+
response.idTokenInfo?.status === OCPP2_0_1.AuthorizationStatusEnumType.Accepted &&
|
|
191
|
+
this._costUpdatedInterval) {
|
|
192
|
+
this._costNotifier.notifyWhileActive(stationId, transactionId, message.context.tenantId, this._costUpdatedInterval);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
const response = {
|
|
197
|
+
// TODO determine how to set chargingPriority and updatedPersonalMessage for anonymous users
|
|
198
|
+
};
|
|
199
|
+
if (message.payload.eventType === OCPP2_0_1.TransactionEventEnumType.Updated) {
|
|
200
|
+
// I02 - Show EV Driver Running Total Cost During Charging
|
|
201
|
+
if (transaction &&
|
|
202
|
+
transaction.isActive &&
|
|
203
|
+
transaction.totalKwh &&
|
|
204
|
+
this._sendCostUpdatedOnMeterValue) {
|
|
205
|
+
response.totalCost = await this._costCalculator.calculateTotalCost(tenantId, stationId, transaction.totalKwh);
|
|
206
|
+
}
|
|
207
|
+
// I06 - Update Tariff Information During Transaction
|
|
208
|
+
const tariffAvailableAttributes = await this._deviceModelRepository.readAllByQuerystring(tenantId, {
|
|
209
|
+
tenantId,
|
|
210
|
+
stationId: stationId,
|
|
211
|
+
component_name: 'TariffCostCtrlr',
|
|
212
|
+
variable_instance: 'Tariff',
|
|
213
|
+
variable_name: 'Available',
|
|
214
|
+
type: OCPP2_0_1.AttributeEnumType.Actual,
|
|
215
|
+
});
|
|
216
|
+
const supportTariff = tariffAvailableAttributes.length !== 0 && Boolean(tariffAvailableAttributes[0].value);
|
|
217
|
+
if (supportTariff && transaction && transaction.isActive) {
|
|
218
|
+
this._logger.debug(`Checking if updated tariff information is available for traction ${transaction.transactionId}`);
|
|
219
|
+
// TODO: checks if there is updated tariff information available and set it in the PersonalMessage field.
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if (message.payload.eventType === OCPP2_0_1.TransactionEventEnumType.Ended &&
|
|
223
|
+
transaction.totalKwh) {
|
|
224
|
+
response.totalCost = await this._costCalculator.calculateTotalCost(tenantId, stationId, transaction.totalKwh);
|
|
225
|
+
}
|
|
226
|
+
// Store total cost in db
|
|
227
|
+
if (response.totalCost && transaction) {
|
|
228
|
+
await this._transactionEventRepository.updateTransactionTotalCostById(tenantId, response.totalCost, transaction.id);
|
|
229
|
+
}
|
|
230
|
+
if (transactionEvent.meterValue) {
|
|
231
|
+
const meterValuesValid = await this._signedMeterValuesUtil.validateMeterValues(tenantId, stationId, transactionEvent.meterValue);
|
|
232
|
+
if (!meterValuesValid) {
|
|
233
|
+
this._logger.warn('One or more MeterValues in this TransactionEvent have an invalid signature.');
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
const messageConfirmation = await this.sendCallResultWithMessage(message, response);
|
|
237
|
+
this._logger.debug('Transaction response sent: ', messageConfirmation);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
async _handleMeterValues(message, props) {
|
|
241
|
+
this._logger.debug('MeterValues received:', message, props);
|
|
242
|
+
// TODO: Meter values can be triggered. Ideally, it should be sent to the callbackUrl from the message api that sent the trigger message
|
|
243
|
+
const meterValues = message.payload.meterValue;
|
|
244
|
+
const tenantId = message.context.tenantId;
|
|
245
|
+
const stationId = message.context.stationId;
|
|
246
|
+
const evseId = message.payload.evseId;
|
|
247
|
+
// When evseId is 0, the MeterValuesRequest message SHALL be associated with the entire Charging Station.
|
|
248
|
+
if (this._sendCostUpdatedOnMeterValue && evseId !== 0) {
|
|
249
|
+
const activeTransaction = await this.transactionEventRepository.getActiveTransactionByStationIdAndEvseId(tenantId, stationId, evseId);
|
|
250
|
+
if (!activeTransaction) {
|
|
251
|
+
this._logger.error('Active Transaction not found on charging station {} evse {}', stationId, evseId);
|
|
252
|
+
}
|
|
253
|
+
const meterValuesCreated = await this._transactionService.createMeterValues(tenantId, meterValues, activeTransaction?.id, activeTransaction?.transactionId, activeTransaction?.tariffId);
|
|
254
|
+
if (activeTransaction) {
|
|
255
|
+
await this._transactionService.recalculateTotalKwh(activeTransaction, meterValuesCreated);
|
|
256
|
+
await this._costNotifier.calculateCostAndNotify(activeTransaction, message.context.tenantId);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
await this._transactionService.createMeterValues(tenantId, meterValues);
|
|
261
|
+
}
|
|
262
|
+
const meterValuesValid = await this._signedMeterValuesUtil.validateMeterValues(tenantId, stationId, meterValues);
|
|
263
|
+
if (!meterValuesValid) {
|
|
264
|
+
throw new OcppError(message.context.correlationId, ErrorCode.SecurityError, 'One or more MeterValues have an invalid signature.');
|
|
265
|
+
}
|
|
266
|
+
const response = {
|
|
267
|
+
// TODO determine how to set chargingPriority and updatedPersonalMessage for anonymous users
|
|
268
|
+
};
|
|
269
|
+
const messageConfirmation = await this.sendCallResultWithMessage(message, response);
|
|
270
|
+
this._logger.debug('MeterValues response sent: ', messageConfirmation);
|
|
271
|
+
}
|
|
272
|
+
async _handleStatusNotification(message, props) {
|
|
273
|
+
this._logger.debug('StatusNotification received:', message, props);
|
|
274
|
+
this._statusNotificationService
|
|
275
|
+
.processStatusNotification(message.context.tenantId, message.context.stationId, message.payload)
|
|
276
|
+
.catch((error) => {
|
|
277
|
+
this._logger.error('Failed to process status notification', error);
|
|
278
|
+
});
|
|
279
|
+
// Create response
|
|
280
|
+
const response = {};
|
|
281
|
+
const messageConfirmation = await this.sendCallResultWithMessage(message, response);
|
|
282
|
+
this._logger.debug('StatusNotification response sent: ', messageConfirmation);
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Handle OCPP 2.0.1 responses
|
|
286
|
+
*/
|
|
287
|
+
_handleCostUpdated(message, props) {
|
|
288
|
+
this._logger.debug('CostUpdated response received:', message, props);
|
|
289
|
+
}
|
|
290
|
+
async _handleGetTransactionStatus(message, props) {
|
|
291
|
+
this._logger.debug('GetTransactionStatus response received:', message, props);
|
|
292
|
+
const response = message.payload;
|
|
293
|
+
if (response.ongoingIndicator !== null && response.ongoingIndicator !== undefined) {
|
|
294
|
+
await this._transactionService.updateTransactionStatus(message.context.tenantId, message.context.stationId, message.context.correlationId, response.ongoingIndicator);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Handle OCPP 1.6 requests
|
|
299
|
+
*/
|
|
300
|
+
async _handleOcpp16StatusNotification(message, props) {
|
|
301
|
+
this._logger.debug('StatusNotification request received:', message, props);
|
|
302
|
+
await this._statusNotificationService.processOcpp16StatusNotification(message.context.tenantId, message.context.stationId, message.payload);
|
|
303
|
+
// Create response
|
|
304
|
+
const response = {};
|
|
305
|
+
const messageConfirmation = await this.sendCallResultWithMessage(message, response);
|
|
306
|
+
this._logger.debug('StatusNotification response sent: ', messageConfirmation);
|
|
307
|
+
}
|
|
308
|
+
async _handleOcpp16MeterValues(message, props) {
|
|
309
|
+
this._logger.debug('MeterValues request received:', message, props);
|
|
310
|
+
const tenantId = message.context.tenantId;
|
|
311
|
+
const stationId = message.context.stationId;
|
|
312
|
+
const connectorId = message.payload.connectorId;
|
|
313
|
+
const transactionId = message.payload.transactionId;
|
|
314
|
+
const meterValues = message.payload.meterValue;
|
|
315
|
+
if (connectorId !== 0 && transactionId && meterValues.length > 0) {
|
|
316
|
+
try {
|
|
317
|
+
const meterValueEntities = [];
|
|
318
|
+
for (const meterValue of meterValues) {
|
|
319
|
+
if (meterValue.sampledValue && meterValue.sampledValue.length > 0) {
|
|
320
|
+
const meterValueEntity = OCPP1_6_Mapper.MeterValueMapper.fromMeterValueType(meterValue);
|
|
321
|
+
meterValueEntity.tenantId = tenantId;
|
|
322
|
+
meterValueEntity.connectorId = connectorId;
|
|
323
|
+
meterValueEntities.push(meterValueEntity);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
if (meterValueEntities.length > 0) {
|
|
327
|
+
await this._transactionEventRepository.updateTransactionByMeterValues(tenantId, meterValueEntities, stationId, transactionId);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
catch (e) {
|
|
331
|
+
this._logger.error(`Failed to process MeterValues.`, e);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
await this.sendCallResultWithMessage(message, {});
|
|
335
|
+
}
|
|
336
|
+
async _handleOcpp16StartTransaction(message, props) {
|
|
337
|
+
this._logger.debug('OCPP 1.6 StartTransaction request received:', message, props);
|
|
338
|
+
const tenantId = message.context.tenantId;
|
|
339
|
+
const stationId = message.context.stationId;
|
|
340
|
+
const request = message.payload;
|
|
341
|
+
// Authorize
|
|
342
|
+
const response = await this._transactionService.authorizeOcpp16IdToken(message.context, request.idTag, request.connectorId);
|
|
343
|
+
// Send response to charger
|
|
344
|
+
if (response.idTagInfo.status !== OCPP1_6.StartTransactionResponseStatus.Accepted) {
|
|
345
|
+
await this.sendCallResultWithMessage(message, response);
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
try {
|
|
349
|
+
// Create transaction
|
|
350
|
+
const newTransaction = await this._transactionEventRepository.createTransactionByStartTransaction(tenantId, request, stationId);
|
|
351
|
+
response.transactionId = parseInt(newTransaction.transactionId);
|
|
352
|
+
}
|
|
353
|
+
catch (error) {
|
|
354
|
+
const errorMessage = error.message || '';
|
|
355
|
+
if (errorMessage.includes('Charging station') && errorMessage.includes('does not exist')) {
|
|
356
|
+
this._logger.error(`Charging station ${stationId} does not exist for idTag ${request.idTag}`);
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
this._logger.error(`Failed to create transaction for idTag ${request.idTag}`, error);
|
|
360
|
+
}
|
|
361
|
+
response.idTagInfo = {
|
|
362
|
+
status: OCPP1_6.StartTransactionResponseStatus.Invalid,
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
await this.sendCallResultWithMessage(message, response);
|
|
366
|
+
}
|
|
367
|
+
// Deactivate reservation
|
|
368
|
+
if (request.reservationId) {
|
|
369
|
+
await this._transactionService.deactivateReservation(tenantId, response.transactionId.toString(), request.reservationId, stationId);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
async _handleOcpp16StopTransaction(message, props) {
|
|
373
|
+
this._logger.debug('OCPP 1.6 StopTransaction request received:', message, props);
|
|
374
|
+
const tenantId = message.context.tenantId;
|
|
375
|
+
const stationId = message.context.stationId;
|
|
376
|
+
const request = message.payload;
|
|
377
|
+
const authorization = request.idTag
|
|
378
|
+
? await this._authorizeRepository.readOnlyOneByQuerystring(tenantId, {
|
|
379
|
+
idToken: request.idTag,
|
|
380
|
+
})
|
|
381
|
+
: undefined;
|
|
382
|
+
let idTokenInfoStatus = authorization?.status;
|
|
383
|
+
if (authorization === undefined && request.idTag) {
|
|
384
|
+
// Unknown idTag, fallback to Invalid
|
|
385
|
+
idTokenInfoStatus = 'Invalid';
|
|
386
|
+
}
|
|
387
|
+
switch (idTokenInfoStatus) {
|
|
388
|
+
case AuthorizationStatusEnum.Accepted:
|
|
389
|
+
case AuthorizationStatusEnum.Blocked:
|
|
390
|
+
case AuthorizationStatusEnum.Expired:
|
|
391
|
+
case AuthorizationStatusEnum.ConcurrentTx:
|
|
392
|
+
case AuthorizationStatusEnum.Invalid:
|
|
393
|
+
break;
|
|
394
|
+
default: // Other OCPP 2.0.1 statuses default to Invalid for OCPP 1.6
|
|
395
|
+
idTokenInfoStatus = AuthorizationStatusEnum.Invalid;
|
|
396
|
+
}
|
|
397
|
+
let parentIdTag = undefined;
|
|
398
|
+
if (authorization?.groupAuthorizationId) {
|
|
399
|
+
const parentAuth = await this._authorizeRepository.readOnlyOneByQuery(tenantId, {
|
|
400
|
+
where: { id: authorization.groupAuthorizationId },
|
|
401
|
+
});
|
|
402
|
+
if (parentAuth) {
|
|
403
|
+
parentIdTag = parentAuth.idToken;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
const stopTransactionResponse = {
|
|
407
|
+
...(request.idTag
|
|
408
|
+
? {
|
|
409
|
+
idTagInfo: {
|
|
410
|
+
expiryDate: authorization?.cacheExpiryDateTime,
|
|
411
|
+
parentIdTag,
|
|
412
|
+
status: idTokenInfoStatus,
|
|
413
|
+
},
|
|
414
|
+
}
|
|
415
|
+
: {}),
|
|
416
|
+
};
|
|
417
|
+
await this.sendCallResultWithMessage(message, stopTransactionResponse);
|
|
418
|
+
const transaction = await Transaction.findOne({
|
|
419
|
+
where: {
|
|
420
|
+
stationId,
|
|
421
|
+
transactionId: request.transactionId.toString(),
|
|
422
|
+
},
|
|
423
|
+
include: [StartTransaction],
|
|
424
|
+
});
|
|
425
|
+
if (!transaction) {
|
|
426
|
+
this._logger.error(`Transaction ${request.transactionId} not found.`);
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
const stopTransaction = await this._transactionEventRepository.createStopTransaction(tenantId, transaction.id, stationId, request.meterStop, new Date(request.timestamp), request.transactionData?.map((data) => OCPP1_6_Mapper.MeterValueMapper.fromMeterValueType(data)) || [], request.reason || (request.idTag ? 'Remote' : 'Local'), authorization?.id);
|
|
430
|
+
if (!stopTransaction) {
|
|
431
|
+
this._logger.error(`Failed to create StopTransaction record for transaction ${request.transactionId}`);
|
|
432
|
+
}
|
|
433
|
+
if (transaction.startTransaction) {
|
|
434
|
+
transaction.totalKwh = (request.meterStop - transaction.startTransaction.meterStart) / 1000; // Convert from Wh to kWh
|
|
435
|
+
}
|
|
436
|
+
else {
|
|
437
|
+
this._logger.warn(`StartTransaction record not found at station ${stationId} for transactionId ${request.transactionId}.
|
|
438
|
+
Cannot calculate totalKwh.`);
|
|
439
|
+
}
|
|
440
|
+
transaction.isActive = false;
|
|
441
|
+
transaction.stoppedReason = request.reason;
|
|
442
|
+
transaction.endTime = request.timestamp;
|
|
443
|
+
await transaction.save();
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
__decorate([
|
|
447
|
+
AsHandler(OCPPVersion.OCPP2_0_1, OCPP2_0_1_CallAction.TransactionEvent),
|
|
448
|
+
__metadata("design:type", Function),
|
|
449
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
450
|
+
__metadata("design:returntype", Promise)
|
|
451
|
+
], TransactionsModule.prototype, "_handleTransactionEvent", null);
|
|
452
|
+
__decorate([
|
|
453
|
+
AsHandler(OCPPVersion.OCPP2_0_1, OCPP2_0_1_CallAction.MeterValues),
|
|
454
|
+
__metadata("design:type", Function),
|
|
455
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
456
|
+
__metadata("design:returntype", Promise)
|
|
457
|
+
], TransactionsModule.prototype, "_handleMeterValues", null);
|
|
458
|
+
__decorate([
|
|
459
|
+
AsHandler(OCPPVersion.OCPP2_0_1, OCPP2_0_1_CallAction.StatusNotification),
|
|
460
|
+
__metadata("design:type", Function),
|
|
461
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
462
|
+
__metadata("design:returntype", Promise)
|
|
463
|
+
], TransactionsModule.prototype, "_handleStatusNotification", null);
|
|
464
|
+
__decorate([
|
|
465
|
+
AsHandler(OCPPVersion.OCPP2_0_1, OCPP2_0_1_CallAction.CostUpdated),
|
|
466
|
+
__metadata("design:type", Function),
|
|
467
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
468
|
+
__metadata("design:returntype", void 0)
|
|
469
|
+
], TransactionsModule.prototype, "_handleCostUpdated", null);
|
|
470
|
+
__decorate([
|
|
471
|
+
AsHandler(OCPPVersion.OCPP2_0_1, OCPP2_0_1_CallAction.GetTransactionStatus),
|
|
472
|
+
__metadata("design:type", Function),
|
|
473
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
474
|
+
__metadata("design:returntype", Promise)
|
|
475
|
+
], TransactionsModule.prototype, "_handleGetTransactionStatus", null);
|
|
476
|
+
__decorate([
|
|
477
|
+
AsHandler(OCPPVersion.OCPP1_6, OCPP1_6_CallAction.StatusNotification),
|
|
478
|
+
__metadata("design:type", Function),
|
|
479
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
480
|
+
__metadata("design:returntype", Promise)
|
|
481
|
+
], TransactionsModule.prototype, "_handleOcpp16StatusNotification", null);
|
|
482
|
+
__decorate([
|
|
483
|
+
AsHandler(OCPPVersion.OCPP1_6, OCPP1_6_CallAction.MeterValues),
|
|
484
|
+
__metadata("design:type", Function),
|
|
485
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
486
|
+
__metadata("design:returntype", Promise)
|
|
487
|
+
], TransactionsModule.prototype, "_handleOcpp16MeterValues", null);
|
|
488
|
+
__decorate([
|
|
489
|
+
AsHandler(OCPPVersion.OCPP1_6, OCPP1_6_CallAction.StartTransaction),
|
|
490
|
+
__metadata("design:type", Function),
|
|
491
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
492
|
+
__metadata("design:returntype", Promise)
|
|
493
|
+
], TransactionsModule.prototype, "_handleOcpp16StartTransaction", null);
|
|
494
|
+
__decorate([
|
|
495
|
+
AsHandler(OCPPVersion.OCPP1_6, OCPP1_6_CallAction.StopTransaction),
|
|
496
|
+
__metadata("design:type", Function),
|
|
497
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
498
|
+
__metadata("design:returntype", Promise)
|
|
499
|
+
], TransactionsModule.prototype, "_handleOcpp16StopTransaction", null);
|
|
500
|
+
//# sourceMappingURL=module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/module/module.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zetra/citrineos-transactions",
|
|
3
|
+
"version": "1.8.3-fork.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "The transactions module for OCPP v2.0.1. This module is not intended to be used directly, but rather as a dependency for other modules.",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"prepublish": "npx eslint",
|
|
13
|
+
"test": "vitest run"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"ocpp",
|
|
17
|
+
"ocpp_v201"
|
|
18
|
+
],
|
|
19
|
+
"license": "Apache-2.0",
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@zetra/citrineos-base": "1.8.3-fork.1",
|
|
22
|
+
"@zetra/citrineos-data": "1.8.3-fork.1",
|
|
23
|
+
"@zetra/citrineos-util": "1.8.3-fork.1"
|
|
24
|
+
}
|
|
25
|
+
}
|