diff --git a/src/app/pages/statistics/usage/statistics-usage.component.ts b/src/app/pages/statistics/usage/statistics-usage.component.ts
index 7fc85b7417..ea715897a8 100644
--- a/src/app/pages/statistics/usage/statistics-usage.component.ts
+++ b/src/app/pages/statistics/usage/statistics-usage.component.ts
@@ -1,7 +1,10 @@
import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import { ChartData } from 'chart.js';
+import { StatisticsAuthorizations } from 'types/Authorization';
import { ChartTypeValues } from 'types/Chart';
+import { StatisticDataResult } from 'types/DataResult';
+import { Utils } from 'utils/Utils';
import { CentralServerService } from '../../../services/central-server.service';
import { LocaleService } from '../../../services/locale.service';
@@ -27,6 +30,7 @@ export class StatisticsUsageComponent implements OnInit {
public selectedYear!: number;
public allYears = true;
public chartsInitialized = false;
+ public authorizations: StatisticsAuthorizations;
private filterParams = {};
private barChart!: SimpleChart;
@@ -156,11 +160,14 @@ export class StatisticsUsageComponent implements OnInit {
}
public buildCharts(): void {
+ // Append withAuth filter to retrieve auth - this also changes the response into datasource
+ this.filterParams['WithAuth'] = 'true';
this.spinnerService.show();
if (this.selectedCategory === 'C') {
this.centralServerService.getChargingStationUsageStatistics(this.selectedYear, this.filterParams)
.subscribe((statisticsData) => {
- this.barChartData = this.statisticsBuildService.buildStackedChartDataForMonths(statisticsData, 2);
+ this.initAuth(statisticsData);
+ this.barChartData = this.statisticsBuildService.buildStackedChartDataForMonths(statisticsData.result, 2);
this.pieChartData = this.statisticsBuildService.calculateTotalChartDataFromStackedChartData(this.barChartData);
this.totalUsage = this.statisticsBuildService.calculateTotalValueFromChartData(this.barChartData);
if (this.selectedChart === 'month') {
@@ -173,7 +180,8 @@ export class StatisticsUsageComponent implements OnInit {
} else {
this.centralServerService.getUserUsageStatistics(this.selectedYear, this.filterParams)
.subscribe((statisticsData) => {
- this.barChartData = this.statisticsBuildService.buildStackedChartDataForMonths(statisticsData, 2);
+ this.initAuth(statisticsData);
+ this.barChartData = this.statisticsBuildService.buildStackedChartDataForMonths(statisticsData.result, 2);
this.pieChartData = this.statisticsBuildService.calculateTotalChartDataFromStackedChartData(this.barChartData);
this.totalUsage = this.statisticsBuildService.calculateTotalValueFromChartData(this.barChartData);
if (this.selectedChart === 'month') {
@@ -185,4 +193,14 @@ export class StatisticsUsageComponent implements OnInit {
});
}
}
+
+ private initAuth(statisticsData: StatisticDataResult) {
+ this.authorizations = {
+ canListUsers: Utils.convertToBoolean(statisticsData.canListUsers),
+ canListChargingStations: Utils.convertToBoolean(statisticsData.canListChargingStations),
+ canListSites: Utils.convertToBoolean(statisticsData.canListSites),
+ canListSiteAreas: Utils.convertToBoolean(statisticsData.canListSiteAreas),
+ canExport: Utils.convertToBoolean(statisticsData.canExport),
+ };
+ }
}
diff --git a/src/app/release-notes/release-notes.component.ts b/src/app/release-notes/release-notes.component.ts
index ba3c490ec7..4d8259d51c 100644
--- a/src/app/release-notes/release-notes.component.ts
+++ b/src/app/release-notes/release-notes.component.ts
@@ -25,15 +25,23 @@ export class ReleaseNotesComponent {
this.releaseNotes = [
{
version: '2.7.6',
- date: new Date('2023-03-14'),
+ date: new Date('2023-03-28'),
componentChanges: [
{
name: 'Dashboard',
changes: [
'Smart Charging - Advanced Parameters for Departure Time',
'Smart Charging - Limit the number of periods to 16 (4 hours)',
+ 'Smart Charging - fix - default value not properly used',
'Billing - Stripe Integration - update dependency to the latest API version - 2022-11-15',
- 'Security - removed vulnerability from strong-soap dependencies'
+ 'Pricing - fix - Delete pricing definitions',
+ 'Security - Removed vulnerability from strong-soap dependencies',
+ 'Statistics - Export to CSV files - filtering is now taken into account',
+ 'Authorizations - Migrated Statistics endpoints to the new authorization framework',
+ 'Authorizations - Site owners can change the power limit of a site',
+ 'OCPP - Allow a distinct CPMS Domain Name per Tenant',
+ 'Performance - Fix - Partial index creation',
+ 'Performance - some logs less verbose'
],
},
],
diff --git a/src/app/services/central-server.service.ts b/src/app/services/central-server.service.ts
index 1e02080146..d294470f03 100644
--- a/src/app/services/central-server.service.ts
+++ b/src/app/services/central-server.service.ts
@@ -15,7 +15,7 @@ import { ChargingStationTemplate } from '../types/ChargingStationTemplate';
import { Company } from '../types/Company';
import CentralSystemServerConfiguration from '../types/configuration/CentralSystemServerConfiguration';
import { IntegrationConnection, UserConnection } from '../types/Connection';
-import { ActionResponse, ActionsResponse, AssetDataResult, AssetInErrorDataResult, BillingAccountDataResult, BillingInvoiceDataResult, BillingOperationResult, BillingPaymentMethodDataResult, BillingTaxDataResult, BillingTransferDataResult, CarCatalogDataResult, CarDataResult, ChargingProfileDataResult, ChargingStationDataResult, ChargingStationInErrorDataResult, ChargingStationTemplateDataResult, CheckAssetConnectionResponse, CheckBillingConnectionResponse, CompanyDataResult, DataResult, LogDataResult, LoginResponse, OcpiEndpointDataResult, OCPIGenerateLocalTokenResponse, OCPIJobStatusesResponse, OCPIPingResponse, OICPJobStatusesResponse, OICPPingResponse, Ordering, Paging, PricingDefinitionDataResult, RegistrationTokenDataResult, SiteAreaDataResult, SiteDataResult, SiteUserDataResult, TagDataResult, TransactionDataResult, TransactionInErrorDataResult, UserDataResult, UserSiteDataResult } from '../types/DataResult';
+import { ActionResponse, ActionsResponse, AssetDataResult, AssetInErrorDataResult, BillingAccountDataResult, BillingInvoiceDataResult, BillingOperationResult, BillingPaymentMethodDataResult, BillingTaxDataResult, BillingTransferDataResult, CarCatalogDataResult, CarDataResult, ChargingProfileDataResult, ChargingStationDataResult, ChargingStationInErrorDataResult, ChargingStationTemplateDataResult, CheckAssetConnectionResponse, CheckBillingConnectionResponse, CompanyDataResult, DataResult, LogDataResult, LoginResponse, OCPIGenerateLocalTokenResponse, OCPIJobStatusesResponse, OCPIPingResponse, OICPJobStatusesResponse, OICPPingResponse, OcpiEndpointDataResult, Ordering, Paging, PricingDefinitionDataResult, RegistrationTokenDataResult, SiteAreaDataResult, SiteDataResult, SiteUserDataResult, StatisticDataResult, TagDataResult, TransactionDataResult, TransactionInErrorDataResult, UserDataResult, UserSiteDataResult } from '../types/DataResult';
import { EndUserLicenseAgreement } from '../types/Eula';
import { FilterParams, Image, KeyValue } from '../types/GlobalType';
import { Log } from '../types/Log';
@@ -29,7 +29,6 @@ import { RESTServerRoute, ServerAction } from '../types/Server';
import { BillingSettings, SettingDB } from '../types/Setting';
import { Site } from '../types/Site';
import { SiteArea, SiteAreaConsumption, SubSiteAreaAction } from '../types/SiteArea';
-import { StatisticData } from '../types/Statistic';
import { Tag } from '../types/Tag';
import { Tenant } from '../types/Tenant';
import { OcpiData, Transaction } from '../types/Transaction';
@@ -554,12 +553,12 @@ export class CentralServerService {
}
public getChargingStationConsumptionStatistics(year: number,
- params: FilterParams = {}): Observable {
+ params: FilterParams = {}): Observable {
params['Year'] = year + '';
// Verify init
this.checkInit();
// Execute the REST service
- return this.httpClient.get(this.buildRestEndpointUrl(RESTServerRoute.REST_CHARGING_STATION_CONSUMPTION_STATISTICS),
+ return this.httpClient.get(this.buildRestEndpointUrl(RESTServerRoute.REST_CHARGING_STATION_CONSUMPTION_STATISTICS),
{
headers: this.buildHttpHeaders(),
params,
@@ -570,12 +569,12 @@ export class CentralServerService {
}
public getUserConsumptionStatistics(year: number,
- params: FilterParams = {}): Observable {
+ params: FilterParams = {}): Observable {
params['Year'] = year + '';
// Verify init
this.checkInit();
// Execute the REST service
- return this.httpClient.get(this.buildRestEndpointUrl(RESTServerRoute.REST_USER_CONSUMPTION_STATISTICS),
+ return this.httpClient.get(this.buildRestEndpointUrl(RESTServerRoute.REST_USER_CONSUMPTION_STATISTICS),
{
headers: this.buildHttpHeaders(),
params,
@@ -586,12 +585,12 @@ export class CentralServerService {
}
public getChargingStationUsageStatistics(year: number,
- params: FilterParams = {}): Observable {
+ params: FilterParams = {}): Observable {
params['Year'] = year + '';
// Verify init
this.checkInit();
// Execute the REST service
- return this.httpClient.get(this.buildRestEndpointUrl(RESTServerRoute.REST_CHARGING_STATION_USAGE_STATISTICS),
+ return this.httpClient.get(this.buildRestEndpointUrl(RESTServerRoute.REST_CHARGING_STATION_USAGE_STATISTICS),
{
headers: this.buildHttpHeaders(),
params,
@@ -602,12 +601,12 @@ export class CentralServerService {
}
public getUserUsageStatistics(year: number,
- params: FilterParams = {}): Observable {
+ params: FilterParams = {}): Observable {
params['Year'] = year + '';
// Verify init
this.checkInit();
// Execute the REST service
- return this.httpClient.get(this.buildRestEndpointUrl(RESTServerRoute.REST_USER_USAGE_STATISTICS),
+ return this.httpClient.get(this.buildRestEndpointUrl(RESTServerRoute.REST_USER_USAGE_STATISTICS),
{
headers: this.buildHttpHeaders(),
params,
@@ -618,12 +617,12 @@ export class CentralServerService {
}
public getChargingStationInactivityStatistics(year: number,
- params: FilterParams = {}): Observable {
+ params: FilterParams = {}): Observable {
params['Year'] = year + '';
// Verify init
this.checkInit();
// Execute the REST service
- return this.httpClient.get(this.buildRestEndpointUrl(RESTServerRoute.REST_CHARGING_STATION_INACTIVITY_STATISTICS),
+ return this.httpClient.get(this.buildRestEndpointUrl(RESTServerRoute.REST_CHARGING_STATION_INACTIVITY_STATISTICS),
{
headers: this.buildHttpHeaders(),
params,
@@ -634,12 +633,12 @@ export class CentralServerService {
}
public getUserInactivityStatistics(year: number,
- params: FilterParams = {}): Observable {
+ params: FilterParams = {}): Observable {
params['Year'] = year + '';
// Verify init
this.checkInit();
// Execute the REST service
- return this.httpClient.get(this.buildRestEndpointUrl(RESTServerRoute.REST_USER_INACTIVITY_STATISTICS),
+ return this.httpClient.get(this.buildRestEndpointUrl(RESTServerRoute.REST_USER_INACTIVITY_STATISTICS),
{
headers: this.buildHttpHeaders(),
params,
@@ -669,12 +668,12 @@ export class CentralServerService {
}
public getChargingStationTransactionsStatistics(year: number,
- params: FilterParams = {}): Observable {
+ params: FilterParams = {}): Observable {
params['Year'] = year + '';
// Verify init
this.checkInit();
// Execute the REST service
- return this.httpClient.get(this.buildRestEndpointUrl(RESTServerRoute.REST_CHARGING_STATION_TRANSACTIONS_STATISTICS),
+ return this.httpClient.get(this.buildRestEndpointUrl(RESTServerRoute.REST_CHARGING_STATION_TRANSACTIONS_STATISTICS),
{
headers: this.buildHttpHeaders(),
params,
@@ -685,12 +684,12 @@ export class CentralServerService {
}
public getUserTransactionsStatistics(year: number,
- params: FilterParams = {}): Observable {
+ params: FilterParams = {}): Observable {
params['Year'] = year + '';
// Verify init
this.checkInit();
// Execute the REST service
- return this.httpClient.get(this.buildRestEndpointUrl(RESTServerRoute.REST_USER_TRANSACTIONS_STATISTICS),
+ return this.httpClient.get(this.buildRestEndpointUrl(RESTServerRoute.REST_USER_TRANSACTIONS_STATISTICS),
{
headers: this.buildHttpHeaders(),
params,
@@ -701,12 +700,12 @@ export class CentralServerService {
}
public getChargingStationPricingStatistics(year: number,
- params: FilterParams = {}): Observable {
+ params: FilterParams = {}): Observable {
params['Year'] = year + '';
// Verify init
this.checkInit();
// Execute the REST service
- return this.httpClient.get(this.buildRestEndpointUrl(RESTServerRoute.REST_CHARGING_STATION_PRICING_STATISTICS),
+ return this.httpClient.get(this.buildRestEndpointUrl(RESTServerRoute.REST_CHARGING_STATION_PRICING_STATISTICS),
{
headers: this.buildHttpHeaders(),
params,
@@ -717,12 +716,12 @@ export class CentralServerService {
}
public getUserPricingStatistics(year: number,
- params: FilterParams = {}): Observable {
+ params: FilterParams = {}): Observable {
params['Year'] = year + '';
// Verify init
this.checkInit();
// Execute the REST service
- return this.httpClient.get(this.buildRestEndpointUrl(RESTServerRoute.REST_USER_PRICING_STATISTICS),
+ return this.httpClient.get(this.buildRestEndpointUrl(RESTServerRoute.REST_USER_PRICING_STATISTICS),
{
headers: this.buildHttpHeaders(),
params,
diff --git a/src/app/types/Authorization.ts b/src/app/types/Authorization.ts
index 8629c25584..f70baf5c2b 100644
--- a/src/app/types/Authorization.ts
+++ b/src/app/types/Authorization.ts
@@ -465,6 +465,17 @@ export interface OcpiEndpointAuthorizationActions extends AuthorizationActions {
canTriggerJob?: boolean;
}
+export interface StatisticsAuthorizations extends AuthorizationAttributes, StatisticsAuthorizationActions {
+ canListUsers?: boolean;
+ canListChargingStations?: boolean;
+ canListSites?: boolean;
+ canListSiteAreas?: boolean;
+ canExport?: boolean;
+}
+
+export interface StatisticsAuthorizationActions extends AuthorizationActions {
+}
+
export enum DialogMode {
EDIT = 'E',
CREATE = 'C',
diff --git a/src/app/types/DataResult.ts b/src/app/types/DataResult.ts
index 5bc7f3bd63..f60f11c6fb 100644
--- a/src/app/types/DataResult.ts
+++ b/src/app/types/DataResult.ts
@@ -1,23 +1,23 @@
-import { AssetInError, ChargingStationInError, TransactionInError } from './InError';
-import { AssetsAuthorizations, BillingAccountsAuthorizations, BillingInvoicesAuthorizations, BillingPaymentMethodsAuthorizationActions, BillingTaxesAuthorizations, BillingTransfersAuthorizations, CarCatalogsAuthorizations, CarsAuthorizations, ChargingProfilesAuthorizations, ChargingStationTemplateAuthorizationActions, ChargingStationsAuthorizations, DataResultAuthorizations, LogsAuthorizationActions, OcpiEndpointsAuthorizationActions, SettingsAuthorizationActions, SiteUsersAuthorizations, SitesAuthorizationActions, TagsAuthorizations, TransactionsAuthorizations, UserSitesAuthorizations, UsersAuthorizations } from './Authorization';
+import { Asset } from './Asset';
+import { AssetsAuthorizations, BillingAccountsAuthorizations, BillingInvoicesAuthorizations, BillingPaymentMethodsAuthorizationActions, BillingTaxesAuthorizations, BillingTransfersAuthorizations, CarCatalogsAuthorizations, CarsAuthorizations, ChargingProfilesAuthorizations, ChargingStationTemplateAuthorizationActions, ChargingStationsAuthorizations, DataResultAuthorizations, LogsAuthorizationActions, OcpiEndpointsAuthorizationActions, SettingsAuthorizationActions, SiteUsersAuthorizations, SitesAuthorizationActions, StatisticsAuthorizations, TagsAuthorizations, TransactionsAuthorizations, UserSitesAuthorizations, UsersAuthorizations } from './Authorization';
import { BillingAccount, BillingInvoice, BillingPaymentMethod, BillingTax, BillingTransfer } from './Billing';
import { Car, CarCatalog } from './Car';
-import { Site, UserSite } from './Site';
-import { SiteUser, User, UserStatus } from './User';
-
-import { Asset } from './Asset';
import { ChargingProfile } from './ChargingProfile';
import { ChargingStation } from './ChargingStation';
import { ChargingStationTemplate } from './ChargingStationTemplate';
import { Company } from './Company';
+import { AssetInError, ChargingStationInError, TransactionInError } from './InError';
import { Log } from './Log';
import { OCPIEndpoint } from './ocpi/OCPIEndpoint';
import PricingDefinition from './Pricing';
import { RegistrationToken } from './RegistrationToken';
import { Setting } from './Setting';
+import { Site, UserSite } from './Site';
import { SiteArea } from './SiteArea';
+import { StatisticData } from './Statistic';
import { Tag } from './Tag';
import { Transaction } from './Transaction';
+import { SiteUser, User, UserStatus } from './User';
export interface ActionResponse {
status: string;
@@ -198,6 +198,9 @@ export interface OcpiEndpointDataResult extends DataResult, OcpiEn
canCreate?: boolean;
}
+export interface StatisticDataResult extends DataResult, StatisticsAuthorizations {
+}
+
export interface Ordering {
field: string;
}