@acorex/connectivity 21.0.0-next.1 → 21.0.0-next.11
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/api/index.d.ts +1 -59
- package/fesm2022/{acorex-connectivity-api-execute.command-SGNBLcOi.mjs → acorex-connectivity-api-execute.command-gIRQPxtq.mjs} +6 -6
- package/fesm2022/acorex-connectivity-api-execute.command-gIRQPxtq.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-api.mjs +101 -185
- package/fesm2022/acorex-connectivity-api.mjs.map +1 -1
- package/fesm2022/{acorex-connectivity-mock-category-with-items.query-Dsxj98tX.mjs → acorex-connectivity-mock-category-with-items.query-Cl7T-rSS.mjs} +4 -4
- package/fesm2022/{acorex-connectivity-mock-category-with-items.query-Dsxj98tX.mjs.map → acorex-connectivity-mock-category-with-items.query-Cl7T-rSS.mjs.map} +1 -1
- package/fesm2022/acorex-connectivity-mock-complete-signature-process.command-MIKenDnl.mjs +80 -0
- package/fesm2022/acorex-connectivity-mock-complete-signature-process.command-MIKenDnl.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-distribution-record.command-DRiDwlqN.mjs → acorex-connectivity-mock-distribution-record.command-D9MRsoPw.mjs} +4 -4
- package/fesm2022/{acorex-connectivity-mock-distribution-record.command-DRiDwlqN.mjs.map → acorex-connectivity-mock-distribution-record.command-D9MRsoPw.mjs.map} +1 -1
- package/fesm2022/acorex-connectivity-mock-get-application-versions-chart-data.query-H6rrh30t.mjs +115 -0
- package/fesm2022/acorex-connectivity-mock-get-application-versions-chart-data.query-H6rrh30t.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-application-versions-timeline.query-zuGKLAbn.mjs +163 -0
- package/fesm2022/acorex-connectivity-mock-get-application-versions-timeline.query-zuGKLAbn.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-CQ75e_tN.mjs +186 -0
- package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-CQ75e_tN.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-product-list.query-OM16ygmJ.mjs +246 -0
- package/fesm2022/acorex-connectivity-mock-get-product-list.query-OM16ygmJ.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-product-pdf-data.query-DoR3awXg.mjs +192 -0
- package/fesm2022/acorex-connectivity-mock-get-product-pdf-data.query-DoR3awXg.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-subscriptions-chart-data.query-Dq779mtQ.mjs +56 -0
- package/fesm2022/acorex-connectivity-mock-get-subscriptions-chart-data.query-Dq779mtQ.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-subscriptions-timeline.query-gNwKFN0F.mjs +246 -0
- package/fesm2022/acorex-connectivity-mock-get-subscriptions-timeline.query-gNwKFN0F.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-tenant-application-access.query-C3OxqcSp.mjs +258 -0
- package/fesm2022/acorex-connectivity-mock-get-tenant-application-access.query-C3OxqcSp.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-tenant-registration-chart-data.query-v8jIyUEH.mjs +56 -0
- package/fesm2022/acorex-connectivity-mock-get-tenant-registration-chart-data.query-v8jIyUEH.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-tenant-registration-timeline.query-Da6nKdpq.mjs +294 -0
- package/fesm2022/acorex-connectivity-mock-get-tenant-registration-timeline.query-Da6nKdpq.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-tenant-user-distribution.query-T0qvGjtD.mjs +212 -0
- package/fesm2022/acorex-connectivity-mock-get-tenant-user-distribution.query-T0qvGjtD.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-notify-signers.command-CmXMibLx.mjs +69 -0
- package/fesm2022/acorex-connectivity-mock-notify-signers.command-CmXMibLx.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-request-signature.command-B6VZ5KeW.mjs +72 -0
- package/fesm2022/acorex-connectivity-mock-request-signature.command-B6VZ5KeW.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-sample.command-CkH5bmEs.mjs → acorex-connectivity-mock-sample.command-BJJ67aLM.mjs} +4 -4
- package/fesm2022/{acorex-connectivity-mock-sample.command-CkH5bmEs.mjs.map → acorex-connectivity-mock-sample.command-BJJ67aLM.mjs.map} +1 -1
- package/fesm2022/acorex-connectivity-mock-validate-all-signatures.command-CG80T32a.mjs +81 -0
- package/fesm2022/acorex-connectivity-mock-validate-all-signatures.command-CG80T32a.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock.mjs +45895 -46303
- package/fesm2022/acorex-connectivity-mock.mjs.map +1 -1
- package/fesm2022/acorex-connectivity-utils.mjs +7 -7
- package/fesm2022/acorex-connectivity-utils.mjs.map +1 -1
- package/mock/index.d.ts +409 -331
- package/package.json +2 -2
- package/fesm2022/acorex-connectivity-api-execute.command-SGNBLcOi.mjs.map +0 -1
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, Injectable } from '@angular/core';
|
|
3
|
+
import { AXPEntityService } from '@acorex/platform/layout/entity';
|
|
4
|
+
import { AXPSystemStatusType } from '@acorex/platform/common';
|
|
5
|
+
import { RootConfig } from '@acorex/modules/subscription-management';
|
|
6
|
+
import { RootConfig as RootConfig$1 } from '@acorex/modules/tenant-management';
|
|
7
|
+
|
|
8
|
+
//#endregion
|
|
9
|
+
class GetSubscriptionsTimelineQuery {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.entityService = inject(AXPEntityService);
|
|
12
|
+
this.subscriptionService = this.entityService
|
|
13
|
+
.withEntity(`${RootConfig.module.name}.${RootConfig.entities.subscription.name}`)
|
|
14
|
+
.data();
|
|
15
|
+
this.tenantService = this.entityService
|
|
16
|
+
.withEntity(`${RootConfig$1.module.name}.${RootConfig$1.entities.tenant.name}`)
|
|
17
|
+
.data();
|
|
18
|
+
}
|
|
19
|
+
async fetch(input) {
|
|
20
|
+
// Extract filters from AXPFilterClause format
|
|
21
|
+
const extractedFilters = this.extractSubscriptionFilters(input.filters);
|
|
22
|
+
const filterLogic = input.filters?.logic || input.logic || 'and';
|
|
23
|
+
// Separate custom filters from entity filters
|
|
24
|
+
const entityFilters = [];
|
|
25
|
+
let dateRangeFilter;
|
|
26
|
+
if (extractedFilters && extractedFilters.length > 0) {
|
|
27
|
+
for (const filter of extractedFilters) {
|
|
28
|
+
if (filter.field === 'dateRange') {
|
|
29
|
+
dateRangeFilter = filter.value;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
entityFilters.push(filter);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Get all subscriptions
|
|
37
|
+
const subscriptionsResult = await this.subscriptionService.query({
|
|
38
|
+
skip: 0,
|
|
39
|
+
take: 10000,
|
|
40
|
+
filter: entityFilters.length > 0
|
|
41
|
+
? {
|
|
42
|
+
logic: filterLogic,
|
|
43
|
+
filters: entityFilters,
|
|
44
|
+
}
|
|
45
|
+
: undefined,
|
|
46
|
+
});
|
|
47
|
+
let subscriptions = subscriptionsResult.items.filter((s) => s.subscriberType === 'Tenant');
|
|
48
|
+
// Get all tenants for lookup
|
|
49
|
+
const tenantsResult = await this.tenantService.query({
|
|
50
|
+
skip: 0,
|
|
51
|
+
take: 10000,
|
|
52
|
+
});
|
|
53
|
+
const tenants = tenantsResult.items;
|
|
54
|
+
const tenantMap = new Map(tenants.map((t) => [t.id, t]));
|
|
55
|
+
// Apply date range filter if provided
|
|
56
|
+
if (dateRangeFilter) {
|
|
57
|
+
subscriptions = this.applyDateRangeFilter(subscriptions, dateRangeFilter);
|
|
58
|
+
}
|
|
59
|
+
const now = new Date();
|
|
60
|
+
// Build results
|
|
61
|
+
const results = [];
|
|
62
|
+
for (const subscription of subscriptions) {
|
|
63
|
+
const startDate = new Date(subscription.startDate);
|
|
64
|
+
const endDate = subscription.endDate ? new Date(subscription.endDate) : undefined;
|
|
65
|
+
// Calculate duration in days
|
|
66
|
+
const durationDays = endDate
|
|
67
|
+
? Math.ceil((endDate.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24))
|
|
68
|
+
: Math.ceil((now.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24));
|
|
69
|
+
// Extract time period info from start date
|
|
70
|
+
const year = startDate.getFullYear();
|
|
71
|
+
const month = startDate.getMonth() + 1;
|
|
72
|
+
const monthName = startDate.toLocaleString('en-US', { month: 'long' });
|
|
73
|
+
const quarter = Math.ceil(month / 3);
|
|
74
|
+
const quarterName = `Q${quarter}`;
|
|
75
|
+
// Check if subscription is currently active
|
|
76
|
+
const isActive = subscription.statusId === AXPSystemStatusType.Active &&
|
|
77
|
+
startDate <= now &&
|
|
78
|
+
(!endDate || endDate >= now);
|
|
79
|
+
// Get tenant name
|
|
80
|
+
const tenant = tenantMap.get(subscription.subscriberId);
|
|
81
|
+
results.push({
|
|
82
|
+
subscriptionId: subscription.id,
|
|
83
|
+
subscriptionTitle: subscription.title || `${tenant?.title || 'Unknown'} - ${subscription.plan?.title || 'Unknown Plan'}`,
|
|
84
|
+
tenantId: subscription.subscriberId,
|
|
85
|
+
tenantName: tenant?.title || 'Unknown',
|
|
86
|
+
planId: subscription.planId,
|
|
87
|
+
planName: subscription.plan?.title || 'Unknown',
|
|
88
|
+
status: subscription.statusId || 'Unknown',
|
|
89
|
+
startDate: startDate,
|
|
90
|
+
startDateStr: startDate.toISOString(),
|
|
91
|
+
endDate: endDate,
|
|
92
|
+
endDateStr: endDate?.toISOString(),
|
|
93
|
+
durationDays: durationDays,
|
|
94
|
+
month: monthName,
|
|
95
|
+
monthNumber: month,
|
|
96
|
+
quarter: quarterName,
|
|
97
|
+
year: year,
|
|
98
|
+
isActive: isActive,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
// Apply sorting if provided
|
|
102
|
+
if (input.sort && input.sort.length > 0) {
|
|
103
|
+
results.sort((a, b) => {
|
|
104
|
+
for (const sortField of input.sort) {
|
|
105
|
+
const field = sortField.field;
|
|
106
|
+
const aValue = a[field];
|
|
107
|
+
const bValue = b[field];
|
|
108
|
+
const dir = sortField.dir === 'asc' ? 1 : -1;
|
|
109
|
+
if (aValue === undefined && bValue === undefined)
|
|
110
|
+
continue;
|
|
111
|
+
if (aValue === undefined)
|
|
112
|
+
return 1 * dir;
|
|
113
|
+
if (bValue === undefined)
|
|
114
|
+
return -1 * dir;
|
|
115
|
+
// Handle date comparison
|
|
116
|
+
if (field === 'startDate') {
|
|
117
|
+
const aDate = a.startDate.getTime();
|
|
118
|
+
const bDate = b.startDate.getTime();
|
|
119
|
+
if (aDate < bDate)
|
|
120
|
+
return -1 * dir;
|
|
121
|
+
if (aDate > bDate)
|
|
122
|
+
return 1 * dir;
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (aValue < bValue)
|
|
126
|
+
return -1 * dir;
|
|
127
|
+
if (aValue > bValue)
|
|
128
|
+
return 1 * dir;
|
|
129
|
+
}
|
|
130
|
+
return 0;
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
// Default sort by start date descending (newest first)
|
|
135
|
+
results.sort((a, b) => {
|
|
136
|
+
return b.startDate.getTime() - a.startDate.getTime();
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
// Apply pagination
|
|
140
|
+
const skip = input.skip || 0;
|
|
141
|
+
const take = input.take || 10;
|
|
142
|
+
const total = results.length;
|
|
143
|
+
const items = results.slice(skip, skip + take);
|
|
144
|
+
return {
|
|
145
|
+
items,
|
|
146
|
+
total,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
//#region ---- Filter Extraction ----
|
|
150
|
+
/**
|
|
151
|
+
* Extract subscription-specific filters from AXPFilterClause format
|
|
152
|
+
* Maps report parameter paths to subscription entity field names
|
|
153
|
+
*/
|
|
154
|
+
extractSubscriptionFilters(parameters) {
|
|
155
|
+
const filters = [];
|
|
156
|
+
const paramsAny = parameters;
|
|
157
|
+
if (!paramsAny?.filters || !Array.isArray(paramsAny.filters)) {
|
|
158
|
+
return filters;
|
|
159
|
+
}
|
|
160
|
+
for (const filter of paramsAny.filters) {
|
|
161
|
+
if (!filter?.field || filter?.value === undefined || filter?.value === null) {
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
const field = filter.field;
|
|
165
|
+
const value = filter.value;
|
|
166
|
+
const operator = filter.operator || { type: 'equal' };
|
|
167
|
+
// Handle subscription-specific field mappings
|
|
168
|
+
if (field === 'planId') {
|
|
169
|
+
// Plan ID filter - can be array of IDs or single ID
|
|
170
|
+
if (Array.isArray(value) && value.length > 0) {
|
|
171
|
+
filters.push({
|
|
172
|
+
field: 'planId',
|
|
173
|
+
operator: { type: 'in' },
|
|
174
|
+
value: value,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
else if (value) {
|
|
178
|
+
filters.push({
|
|
179
|
+
field: 'planId',
|
|
180
|
+
operator: { type: 'equal' },
|
|
181
|
+
value: value,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
else if (field === 'statusId') {
|
|
186
|
+
// Status filter - skip 'all' value
|
|
187
|
+
if (value && value !== 'all') {
|
|
188
|
+
filters.push({
|
|
189
|
+
field: 'statusId',
|
|
190
|
+
operator: { type: 'equal' },
|
|
191
|
+
value: value,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
else if (field === 'dateRange') {
|
|
196
|
+
// Date range filter - custom logic handled in query
|
|
197
|
+
filters.push({
|
|
198
|
+
field: 'dateRange',
|
|
199
|
+
operator: { type: 'equal' },
|
|
200
|
+
value: value,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
// Direct field mapping
|
|
205
|
+
filters.push({
|
|
206
|
+
field: field,
|
|
207
|
+
operator: operator,
|
|
208
|
+
value: value,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return filters;
|
|
213
|
+
}
|
|
214
|
+
//#endregion
|
|
215
|
+
//#region ---- Custom Filter Handlers ----
|
|
216
|
+
/**
|
|
217
|
+
* Apply date range filter to subscriptions
|
|
218
|
+
*/
|
|
219
|
+
applyDateRangeFilter(subscriptions, dateRange) {
|
|
220
|
+
if (!dateRange || !dateRange.start || !dateRange.end) {
|
|
221
|
+
return subscriptions;
|
|
222
|
+
}
|
|
223
|
+
const startDate = new Date(dateRange.start);
|
|
224
|
+
const endDate = new Date(dateRange.end);
|
|
225
|
+
endDate.setHours(23, 59, 59, 999);
|
|
226
|
+
return subscriptions.filter((subscription) => {
|
|
227
|
+
const subStartDate = new Date(subscription.startDate);
|
|
228
|
+
const subEndDate = subscription.endDate ? new Date(subscription.endDate) : null;
|
|
229
|
+
// Check if subscription overlaps with the date range
|
|
230
|
+
return ((subStartDate >= startDate && subStartDate <= endDate) ||
|
|
231
|
+
(subEndDate && subEndDate >= startDate && subEndDate <= endDate) ||
|
|
232
|
+
(subStartDate <= startDate && (!subEndDate || subEndDate >= endDate)));
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: GetSubscriptionsTimelineQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
236
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: GetSubscriptionsTimelineQuery, providedIn: 'root' }); }
|
|
237
|
+
}
|
|
238
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: GetSubscriptionsTimelineQuery, decorators: [{
|
|
239
|
+
type: Injectable,
|
|
240
|
+
args: [{
|
|
241
|
+
providedIn: 'root',
|
|
242
|
+
}]
|
|
243
|
+
}] });
|
|
244
|
+
|
|
245
|
+
export { GetSubscriptionsTimelineQuery };
|
|
246
|
+
//# sourceMappingURL=acorex-connectivity-mock-get-subscriptions-timeline.query-gNwKFN0F.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-connectivity-mock-get-subscriptions-timeline.query-gNwKFN0F.mjs","sources":["../tmp-esm2022/mock/lib/tenant-management/reports/get-subscriptions-timeline.query.js"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { AXPEntityService } from '@acorex/platform/layout/entity';\nimport { AXPSystemStatusType } from '@acorex/platform/common';\nimport { RootConfig as SubscriptionRootConfig } from '@acorex/modules/subscription-management';\nimport { RootConfig as TenantRootConfig } from '@acorex/modules/tenant-management';\nimport * as i0 from \"@angular/core\";\n//#endregion\nexport class GetSubscriptionsTimelineQuery {\n constructor() {\n this.entityService = inject(AXPEntityService);\n this.subscriptionService = this.entityService\n .withEntity(`${SubscriptionRootConfig.module.name}.${SubscriptionRootConfig.entities.subscription.name}`)\n .data();\n this.tenantService = this.entityService\n .withEntity(`${TenantRootConfig.module.name}.${TenantRootConfig.entities.tenant.name}`)\n .data();\n }\n async fetch(input) {\n // Extract filters from AXPFilterClause format\n const extractedFilters = this.extractSubscriptionFilters(input.filters);\n const filterLogic = input.filters?.logic || input.logic || 'and';\n // Separate custom filters from entity filters\n const entityFilters = [];\n let dateRangeFilter;\n if (extractedFilters && extractedFilters.length > 0) {\n for (const filter of extractedFilters) {\n if (filter.field === 'dateRange') {\n dateRangeFilter = filter.value;\n }\n else {\n entityFilters.push(filter);\n }\n }\n }\n // Get all subscriptions\n const subscriptionsResult = await this.subscriptionService.query({\n skip: 0,\n take: 10000,\n filter: entityFilters.length > 0\n ? {\n logic: filterLogic,\n filters: entityFilters,\n }\n : undefined,\n });\n let subscriptions = subscriptionsResult.items.filter((s) => s.subscriberType === 'Tenant');\n // Get all tenants for lookup\n const tenantsResult = await this.tenantService.query({\n skip: 0,\n take: 10000,\n });\n const tenants = tenantsResult.items;\n const tenantMap = new Map(tenants.map((t) => [t.id, t]));\n // Apply date range filter if provided\n if (dateRangeFilter) {\n subscriptions = this.applyDateRangeFilter(subscriptions, dateRangeFilter);\n }\n const now = new Date();\n // Build results\n const results = [];\n for (const subscription of subscriptions) {\n const startDate = new Date(subscription.startDate);\n const endDate = subscription.endDate ? new Date(subscription.endDate) : undefined;\n // Calculate duration in days\n const durationDays = endDate\n ? Math.ceil((endDate.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24))\n : Math.ceil((now.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24));\n // Extract time period info from start date\n const year = startDate.getFullYear();\n const month = startDate.getMonth() + 1;\n const monthName = startDate.toLocaleString('en-US', { month: 'long' });\n const quarter = Math.ceil(month / 3);\n const quarterName = `Q${quarter}`;\n // Check if subscription is currently active\n const isActive = subscription.statusId === AXPSystemStatusType.Active &&\n startDate <= now &&\n (!endDate || endDate >= now);\n // Get tenant name\n const tenant = tenantMap.get(subscription.subscriberId);\n results.push({\n subscriptionId: subscription.id,\n subscriptionTitle: subscription.title || `${tenant?.title || 'Unknown'} - ${subscription.plan?.title || 'Unknown Plan'}`,\n tenantId: subscription.subscriberId,\n tenantName: tenant?.title || 'Unknown',\n planId: subscription.planId,\n planName: subscription.plan?.title || 'Unknown',\n status: subscription.statusId || 'Unknown',\n startDate: startDate,\n startDateStr: startDate.toISOString(),\n endDate: endDate,\n endDateStr: endDate?.toISOString(),\n durationDays: durationDays,\n month: monthName,\n monthNumber: month,\n quarter: quarterName,\n year: year,\n isActive: isActive,\n });\n }\n // Apply sorting if provided\n if (input.sort && input.sort.length > 0) {\n results.sort((a, b) => {\n for (const sortField of input.sort) {\n const field = sortField.field;\n const aValue = a[field];\n const bValue = b[field];\n const dir = sortField.dir === 'asc' ? 1 : -1;\n if (aValue === undefined && bValue === undefined)\n continue;\n if (aValue === undefined)\n return 1 * dir;\n if (bValue === undefined)\n return -1 * dir;\n // Handle date comparison\n if (field === 'startDate') {\n const aDate = a.startDate.getTime();\n const bDate = b.startDate.getTime();\n if (aDate < bDate)\n return -1 * dir;\n if (aDate > bDate)\n return 1 * dir;\n continue;\n }\n if (aValue < bValue)\n return -1 * dir;\n if (aValue > bValue)\n return 1 * dir;\n }\n return 0;\n });\n }\n else {\n // Default sort by start date descending (newest first)\n results.sort((a, b) => {\n return b.startDate.getTime() - a.startDate.getTime();\n });\n }\n // Apply pagination\n const skip = input.skip || 0;\n const take = input.take || 10;\n const total = results.length;\n const items = results.slice(skip, skip + take);\n return {\n items,\n total,\n };\n }\n //#region ---- Filter Extraction ----\n /**\n * Extract subscription-specific filters from AXPFilterClause format\n * Maps report parameter paths to subscription entity field names\n */\n extractSubscriptionFilters(parameters) {\n const filters = [];\n const paramsAny = parameters;\n if (!paramsAny?.filters || !Array.isArray(paramsAny.filters)) {\n return filters;\n }\n for (const filter of paramsAny.filters) {\n if (!filter?.field || filter?.value === undefined || filter?.value === null) {\n continue;\n }\n const field = filter.field;\n const value = filter.value;\n const operator = filter.operator || { type: 'equal' };\n // Handle subscription-specific field mappings\n if (field === 'planId') {\n // Plan ID filter - can be array of IDs or single ID\n if (Array.isArray(value) && value.length > 0) {\n filters.push({\n field: 'planId',\n operator: { type: 'in' },\n value: value,\n });\n }\n else if (value) {\n filters.push({\n field: 'planId',\n operator: { type: 'equal' },\n value: value,\n });\n }\n }\n else if (field === 'statusId') {\n // Status filter - skip 'all' value\n if (value && value !== 'all') {\n filters.push({\n field: 'statusId',\n operator: { type: 'equal' },\n value: value,\n });\n }\n }\n else if (field === 'dateRange') {\n // Date range filter - custom logic handled in query\n filters.push({\n field: 'dateRange',\n operator: { type: 'equal' },\n value: value,\n });\n }\n else {\n // Direct field mapping\n filters.push({\n field: field,\n operator: operator,\n value: value,\n });\n }\n }\n return filters;\n }\n //#endregion\n //#region ---- Custom Filter Handlers ----\n /**\n * Apply date range filter to subscriptions\n */\n applyDateRangeFilter(subscriptions, dateRange) {\n if (!dateRange || !dateRange.start || !dateRange.end) {\n return subscriptions;\n }\n const startDate = new Date(dateRange.start);\n const endDate = new Date(dateRange.end);\n endDate.setHours(23, 59, 59, 999);\n return subscriptions.filter((subscription) => {\n const subStartDate = new Date(subscription.startDate);\n const subEndDate = subscription.endDate ? new Date(subscription.endDate) : null;\n // Check if subscription overlaps with the date range\n return ((subStartDate >= startDate && subStartDate <= endDate) ||\n (subEndDate && subEndDate >= startDate && subEndDate <= endDate) ||\n (subStartDate <= startDate && (!subEndDate || subEndDate >= endDate)));\n });\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.15\", ngImport: i0, type: GetSubscriptionsTimelineQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }\n static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.3.15\", ngImport: i0, type: GetSubscriptionsTimelineQuery, providedIn: 'root' }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.15\", ngImport: i0, type: GetSubscriptionsTimelineQuery, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root',\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXN1YnNjcmlwdGlvbnMtdGltZWxpbmUucXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nvbm5lY3Rpdml0eS9tb2NrL3NyYy9saWIvdGVuYW50LW1hbmFnZW1lbnQvcmVwb3J0cy9nZXQtc3Vic2NyaXB0aW9ucy10aW1lbGluZS5xdWVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUdsRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsVUFBVSxJQUFJLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDL0YsT0FBTyxFQUFFLFVBQVUsSUFBSSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDOztBQXlDbkYsWUFBWTtBQUtaLE1BQU0sT0FBTyw2QkFBNkI7SUFIMUM7UUFNbUIsa0JBQWEsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNsRCx3QkFBbUIsR0FBRyxJQUFJLENBQUMsYUFBYTthQUM3QyxVQUFVLENBQUMsR0FBRyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDeEcsSUFBSSxFQUE0RCxDQUFDO1FBQzVELGtCQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWE7YUFDdkMsVUFBVSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ3RGLElBQUksRUFBZ0QsQ0FBQztLQXVQekQ7SUFyUEMsS0FBSyxDQUFDLEtBQUss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Y0FGNUIsTUFBTTs7NEZBRVAsNkJBQTZCO2tCQUh6QyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhQUXVlcnkgfSBmcm9tICdAYWNvcmV4L3BsYXRmb3JtL3J1bnRpbWUnO1xuaW1wb3J0IHsgQVhQRW50aXR5U2VydmljZSB9IGZyb20gJ0BhY29yZXgvcGxhdGZvcm0vbGF5b3V0L2VudGl0eSc7XG5pbXBvcnQgeyBBWE1TdWJzY3JpcHRpb25NYW5hZ2VtZW50U3Vic2NyaXB0aW9uRW50aXR5TW9kZWwgfSBmcm9tICdAYWNvcmV4L21vZHVsZXMvc3Vic2NyaXB0aW9uLW1hbmFnZW1lbnQnO1xuaW1wb3J0IHsgQVhNVGVuYW50TWFuYWdlbWVudFRlbmFudEVudGl0eU1vZGVsIH0gZnJvbSAnQGFjb3JleC9tb2R1bGVzL3RlbmFudC1tYW5hZ2VtZW50JztcbmltcG9ydCB7IEFYUFN5c3RlbVN0YXR1c1R5cGUgfSBmcm9tICdAYWNvcmV4L3BsYXRmb3JtL2NvbW1vbic7XG5pbXBvcnQgeyBSb290Q29uZmlnIGFzIFN1YnNjcmlwdGlvblJvb3RDb25maWcgfSBmcm9tICdAYWNvcmV4L21vZHVsZXMvc3Vic2NyaXB0aW9uLW1hbmFnZW1lbnQnO1xuaW1wb3J0IHsgUm9vdENvbmZpZyBhcyBUZW5hbnRSb290Q29uZmlnIH0gZnJvbSAnQGFjb3JleC9tb2R1bGVzL3RlbmFudC1tYW5hZ2VtZW50JztcblxuLy8jcmVnaW9uIC0tLS0gICBRdWVyeSBJbnB1dC9PdXRwdXQgVHlwZXMgICAtLS0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0U3Vic2NyaXB0aW9uc1RpbWVsaW5lUXVlcnlJbnB1dCB7XG4gIHNraXA/OiBudW1iZXI7XG4gIHRha2U/OiBudW1iZXI7XG4gIHNvcnQ/OiBBcnJheTx7IGZpZWxkOiBzdHJpbmc7IGRpcjogJ2FzYycgfCAnZGVzYycgfT47XG4gIGZpbHRlcnM/OiBBcnJheTx7XG4gICAgZmllbGQ6IHN0cmluZztcbiAgICBvcGVyYXRvcjogeyB0eXBlOiBzdHJpbmcgfTtcbiAgICB2YWx1ZTogYW55O1xuICB9PjtcbiAgbG9naWM/OiAnYW5kJyB8ICdvcic7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3Vic2NyaXB0aW9uc1RpbWVsaW5lUmVzdWx0IHtcbiAgc3Vic2NyaXB0aW9uSWQ6IHN0cmluZztcbiAgc3Vic2NyaXB0aW9uVGl0bGU6IHN0cmluZztcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgdGVuYW50TmFtZTogc3RyaW5nO1xuICBwbGFuSWQ/OiBzdHJpbmc7XG4gIHBsYW5OYW1lOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBzdGFydERhdGU6IERhdGU7XG4gIHN0YXJ0RGF0ZVN0cjogc3RyaW5nO1xuICBlbmREYXRlPzogRGF0ZTtcbiAgZW5kRGF0ZVN0cj86IHN0cmluZztcbiAgZHVyYXRpb25EYXlzOiBudW1iZXI7XG4gIG1vbnRoOiBzdHJpbmc7XG4gIG1vbnRoTnVtYmVyOiBudW1iZXI7XG4gIHF1YXJ0ZXI6IHN0cmluZztcbiAgeWVhcjogbnVtYmVyO1xuICBpc0FjdGl2ZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRTdWJzY3JpcHRpb25zVGltZWxpbmVRdWVyeVJlc3VsdCB7XG4gIGl0ZW1zOiBTdWJzY3JpcHRpb25zVGltZWxpbmVSZXN1bHRbXTtcbiAgdG90YWw6IG51bWJlcjtcbn1cblxuLy8jZW5kcmVnaW9uXG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBHZXRTdWJzY3JpcHRpb25zVGltZWxpbmVRdWVyeVxuICBpbXBsZW1lbnRzIEFYUFF1ZXJ5PEdldFN1YnNjcmlwdGlvbnNUaW1lbGluZVF1ZXJ5SW5wdXQsIEdldFN1YnNjcmlwdGlvbnNUaW1lbGluZVF1ZXJ5UmVzdWx0Plxue1xuICBwcml2YXRlIHJlYWRvbmx5IGVudGl0eVNlcnZpY2UgPSBpbmplY3QoQVhQRW50aXR5U2VydmljZSk7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uU2VydmljZSA9IHRoaXMuZW50aXR5U2VydmljZVxuICAgIC53aXRoRW50aXR5KGAke1N1YnNjcmlwdGlvblJvb3RDb25maWcubW9kdWxlLm5hbWV9LiR7U3Vic2NyaXB0aW9uUm9vdENvbmZpZy5lbnRpdGllcy5zdWJzY3JpcHRpb24ubmFtZX1gKVxuICAgIC5kYXRhPHN0cmluZywgQVhNU3Vic2NyaXB0aW9uTWFuYWdlbWVudFN1YnNjcmlwdGlvbkVudGl0eU1vZGVsPigpO1xuICBwcml2YXRlIHRlbmFudFNlcnZpY2UgPSB0aGlzLmVudGl0eVNlcnZpY2VcbiAgICAud2l0aEVudGl0eShgJHtUZW5hbnRSb290Q29uZmlnLm1vZHVsZS5uYW1lfS4ke1RlbmFudFJvb3RDb25maWcuZW50aXRpZXMudGVuYW50Lm5hbWV9YClcbiAgICAuZGF0YTxzdHJpbmcsIEFYTVRlbmFudE1hbmFnZW1lbnRUZW5hbnRFbnRpdHlNb2RlbD4oKTtcblxuICBhc3luYyBmZXRjaChpbnB1dDogR2V0U3Vic2NyaXB0aW9uc1RpbWVsaW5lUXVlcnlJbnB1dCB8IGFueSk6IFByb21pc2U8R2V0U3Vic2NyaXB0aW9uc1RpbWVsaW5lUXVlcnlSZXN1bHQ+IHtcbiAgICAvLyBFeHRyYWN0IGZpbHRlcnMgZnJvbSBBWFBGaWx0ZXJDbGF1c2UgZm9ybWF0XG4gICAgY29uc3QgZXh0cmFjdGVkRmlsdGVycyA9IHRoaXMuZXh0cmFjdFN1YnNjcmlwdGlvbkZpbHRlcnMoaW5wdXQuZmlsdGVycyk7XG4gICAgY29uc3QgZmlsdGVyTG9naWMgPSAoaW5wdXQuZmlsdGVycyBhcyBhbnkpPy5sb2dpYyB8fCBpbnB1dC5sb2dpYyB8fCAnYW5kJztcblxuICAgIC8vIFNlcGFyYXRlIGN1c3RvbSBmaWx0ZXJzIGZyb20gZW50aXR5IGZpbHRlcnNcbiAgICBjb25zdCBlbnRpdHlGaWx0ZXJzOiBHZXRTdWJzY3JpcHRpb25zVGltZWxpbmVRdWVyeUlucHV0WydmaWx0ZXJzJ10gPSBbXTtcbiAgICBsZXQgZGF0ZVJhbmdlRmlsdGVyOiBhbnk7XG5cbiAgICBpZiAoZXh0cmFjdGVkRmlsdGVycyAmJiBleHRyYWN0ZWRGaWx0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIGV4dHJhY3RlZEZpbHRlcnMpIHtcbiAgICAgICAgaWYgKGZpbHRlci5maWVsZCA9PT0gJ2RhdGVSYW5nZScpIHtcbiAgICAgICAgICBkYXRlUmFuZ2VGaWx0ZXIgPSBmaWx0ZXIudmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW50aXR5RmlsdGVycy5wdXNoKGZpbHRlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgYWxsIHN1YnNjcmlwdGlvbnNcbiAgICBjb25zdCBzdWJzY3JpcHRpb25zUmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJzY3JpcHRpb25TZXJ2aWNlLnF1ZXJ5KHtcbiAgICAgIHNraXA6IDAsXG4gICAgICB0YWtlOiAxMDAwMCxcbiAgICAgIGZpbHRlcjpcbiAgICAgICAgZW50aXR5RmlsdGVycy5sZW5ndGggPiAwXG4gICAgICAgICAgPyAoe1xuICAgICAgICAgICAgbG9naWM6IGZpbHRlckxvZ2ljLFxuICAgICAgICAgICAgZmlsdGVyczogZW50aXR5RmlsdGVycyxcbiAgICAgICAgICB9IGFzIGFueSlcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIGxldCBzdWJzY3JpcHRpb25zID0gc3Vic2NyaXB0aW9uc1Jlc3VsdC5pdGVtcy5maWx0ZXIoKHMpID0+IHMuc3Vic2NyaWJlclR5cGUgPT09ICdUZW5hbnQnKTtcblxuICAgIC8vIEdldCBhbGwgdGVuYW50cyBmb3IgbG9va3VwXG4gICAgY29uc3QgdGVuYW50c1Jlc3VsdCA9IGF3YWl0IHRoaXMudGVuYW50U2VydmljZS5xdWVyeSh7XG4gICAgICBza2lwOiAwLFxuICAgICAgdGFrZTogMTAwMDAsXG4gICAgfSk7XG4gICAgY29uc3QgdGVuYW50cyA9IHRlbmFudHNSZXN1bHQuaXRlbXM7XG4gICAgY29uc3QgdGVuYW50TWFwID0gbmV3IE1hcCh0ZW5hbnRzLm1hcCgodCkgPT4gW3QuaWQsIHRdKSk7XG5cbiAgICAvLyBBcHBseSBkYXRlIHJhbmdlIGZpbHRlciBpZiBwcm92aWRlZFxuICAgIGlmIChkYXRlUmFuZ2VGaWx0ZXIpIHtcbiAgICAgIHN1YnNjcmlwdGlvbnMgPSB0aGlzLmFwcGx5RGF0ZVJhbmdlRmlsdGVyKHN1YnNjcmlwdGlvbnMsIGRhdGVSYW5nZUZpbHRlcik7XG4gICAgfVxuXG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcblxuICAgIC8vIEJ1aWxkIHJlc3VsdHNcbiAgICBjb25zdCByZXN1bHRzOiBTdWJzY3JpcHRpb25zVGltZWxpbmVSZXN1bHRbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2Ygc3Vic2NyaXB0aW9ucykge1xuICAgICAgY29uc3Qgc3RhcnREYXRlID0gbmV3IERhdGUoc3Vic2NyaXB0aW9uLnN0YXJ0RGF0ZSk7XG4gICAgICBjb25zdCBlbmREYXRlID0gc3Vic2NyaXB0aW9uLmVuZERhdGUgPyBuZXcgRGF0ZShzdWJzY3JpcHRpb24uZW5kRGF0ZSkgOiB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBkdXJhdGlvbiBpbiBkYXlzXG4gICAgICBjb25zdCBkdXJhdGlvbkRheXMgPSBlbmREYXRlXG4gICAgICAgID8gTWF0aC5jZWlsKChlbmREYXRlLmdldFRpbWUoKSAtIHN0YXJ0RGF0ZS5nZXRUaW1lKCkpIC8gKDEwMDAgKiA2MCAqIDYwICogMjQpKVxuICAgICAgICA6IE1hdGguY2VpbCgobm93LmdldFRpbWUoKSAtIHN0YXJ0RGF0ZS5nZXRUaW1lKCkpIC8gKDEwMDAgKiA2MCAqIDYwICogMjQpKTtcblxuICAgICAgLy8gRXh0cmFjdCB0aW1lIHBlcmlvZCBpbmZvIGZyb20gc3RhcnQgZGF0ZVxuICAgICAgY29uc3QgeWVhciA9IHN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgY29uc3QgbW9udGggPSBzdGFydERhdGUuZ2V0TW9udGgoKSArIDE7XG4gICAgICBjb25zdCBtb250aE5hbWUgPSBzdGFydERhdGUudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywgeyBtb250aDogJ2xvbmcnIH0pO1xuICAgICAgY29uc3QgcXVhcnRlciA9IE1hdGguY2VpbChtb250aCAvIDMpO1xuICAgICAgY29uc3QgcXVhcnRlck5hbWUgPSBgUSR7cXVhcnRlcn1gO1xuXG4gICAgICAvLyBDaGVjayBpZiBzdWJzY3JpcHRpb24gaXMgY3VycmVudGx5IGFjdGl2ZVxuICAgICAgY29uc3QgaXNBY3RpdmUgPVxuICAgICAgICBzdWJzY3JpcHRpb24uc3RhdHVzSWQgPT09IEFYUFN5c3RlbVN0YXR1c1R5cGUuQWN0aXZlICYmXG4gICAgICAgIHN0YXJ0RGF0ZSA8PSBub3cgJiZcbiAgICAgICAgKCFlbmREYXRlIHx8IGVuZERhdGUgPj0gbm93KTtcblxuICAgICAgLy8gR2V0IHRlbmFudCBuYW1lXG4gICAgICBjb25zdCB0ZW5hbnQgPSB0ZW5hbnRNYXAuZ2V0KHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVySWQpO1xuXG4gICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICBzdWJzY3JpcHRpb25JZDogc3Vic2NyaXB0aW9uLmlkLFxuICAgICAgICBzdWJzY3JpcHRpb25UaXRsZTogc3Vic2NyaXB0aW9uLnRpdGxlIHx8IGAke3RlbmFudD8udGl0bGUgfHwgJ1Vua25vd24nfSAtICR7c3Vic2NyaXB0aW9uLnBsYW4/LnRpdGxlIHx8ICdVbmtub3duIFBsYW4nfWAsXG4gICAgICAgIHRlbmFudElkOiBzdWJzY3JpcHRpb24uc3Vic2NyaWJlcklkLFxuICAgICAgICB0ZW5hbnROYW1lOiB0ZW5hbnQ/LnRpdGxlIHx8ICdVbmtub3duJyxcbiAgICAgICAgcGxhbklkOiBzdWJzY3JpcHRpb24ucGxhbklkLFxuICAgICAgICBwbGFuTmFtZTogc3Vic2NyaXB0aW9uLnBsYW4/LnRpdGxlIHx8ICdVbmtub3duJyxcbiAgICAgICAgc3RhdHVzOiBzdWJzY3JpcHRpb24uc3RhdHVzSWQgfHwgJ1Vua25vd24nLFxuICAgICAgICBzdGFydERhdGU6IHN0YXJ0RGF0ZSxcbiAgICAgICAgc3RhcnREYXRlU3RyOiBzdGFydERhdGUudG9JU09TdHJpbmcoKSxcbiAgICAgICAgZW5kRGF0ZTogZW5kRGF0ZSxcbiAgICAgICAgZW5kRGF0ZVN0cjogZW5kRGF0ZT8udG9JU09TdHJpbmcoKSxcbiAgICAgICAgZHVyYXRpb25EYXlzOiBkdXJhdGlvbkRheXMsXG4gICAgICAgIG1vbnRoOiBtb250aE5hbWUsXG4gICAgICAgIG1vbnRoTnVtYmVyOiBtb250aCxcbiAgICAgICAgcXVhcnRlcjogcXVhcnRlck5hbWUsXG4gICAgICAgIHllYXI6IHllYXIsXG4gICAgICAgIGlzQWN0aXZlOiBpc0FjdGl2ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IHNvcnRpbmcgaWYgcHJvdmlkZWRcbiAgICBpZiAoaW5wdXQuc29ydCAmJiBpbnB1dC5zb3J0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc3VsdHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHNvcnRGaWVsZCBvZiBpbnB1dC5zb3J0ISkge1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gc29ydEZpZWxkLmZpZWxkIGFzIGtleW9mIFN1YnNjcmlwdGlvbnNUaW1lbGluZVJlc3VsdDtcbiAgICAgICAgICBjb25zdCBhVmFsdWUgPSBhW2ZpZWxkXTtcbiAgICAgICAgICBjb25zdCBiVmFsdWUgPSBiW2ZpZWxkXTtcbiAgICAgICAgICBjb25zdCBkaXIgPSBzb3J0RmllbGQuZGlyID09PSAnYXNjJyA/IDEgOiAtMTtcblxuICAgICAgICAgIGlmIChhVmFsdWUgPT09IHVuZGVmaW5lZCAmJiBiVmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgaWYgKGFWYWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMSAqIGRpcjtcbiAgICAgICAgICBpZiAoYlZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiAtMSAqIGRpcjtcblxuICAgICAgICAgIC8vIEhhbmRsZSBkYXRlIGNvbXBhcmlzb25cbiAgICAgICAgICBpZiAoZmllbGQgPT09ICdzdGFydERhdGUnKSB7XG4gICAgICAgICAgICBjb25zdCBhRGF0ZSA9IGEuc3RhcnREYXRlLmdldFRpbWUoKTtcbiAgICAgICAgICAgIGNvbnN0IGJEYXRlID0gYi5zdGFydERhdGUuZ2V0VGltZSgpO1xuICAgICAgICAgICAgaWYgKGFEYXRlIDwgYkRhdGUpIHJldHVybiAtMSAqIGRpcjtcbiAgICAgICAgICAgIGlmIChhRGF0ZSA+IGJEYXRlKSByZXR1cm4gMSAqIGRpcjtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChhVmFsdWUgPCBiVmFsdWUpIHJldHVybiAtMSAqIGRpcjtcbiAgICAgICAgICBpZiAoYVZhbHVlID4gYlZhbHVlKSByZXR1cm4gMSAqIGRpcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0IHNvcnQgYnkgc3RhcnQgZGF0ZSBkZXNjZW5kaW5nIChuZXdlc3QgZmlyc3QpXG4gICAgICByZXN1bHRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgcmV0dXJuIGIuc3RhcnREYXRlLmdldFRpbWUoKSAtIGEuc3RhcnREYXRlLmdldFRpbWUoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IHBhZ2luYXRpb25cbiAgICBjb25zdCBza2lwID0gaW5wdXQuc2tpcCB8fCAwO1xuICAgIGNvbnN0IHRha2UgPSBpbnB1dC50YWtlIHx8IDEwO1xuICAgIGNvbnN0IHRvdGFsID0gcmVzdWx0cy5sZW5ndGg7XG4gICAgY29uc3QgaXRlbXMgPSByZXN1bHRzLnNsaWNlKHNraXAsIHNraXAgKyB0YWtlKTtcblxuICAgIHJldHVybiB7XG4gICAgICBpdGVtcyxcbiAgICAgIHRvdGFsLFxuICAgIH07XG4gIH1cblxuICAvLyNyZWdpb24gLS0tLSAgIEZpbHRlciBFeHRyYWN0aW9uICAgLS0tLVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IHN1YnNjcmlwdGlvbi1zcGVjaWZpYyBmaWx0ZXJzIGZyb20gQVhQRmlsdGVyQ2xhdXNlIGZvcm1hdFxuICAgKiBNYXBzIHJlcG9ydCBwYXJhbWV0ZXIgcGF0aHMgdG8gc3Vic2NyaXB0aW9uIGVudGl0eSBmaWVsZCBuYW1lc1xuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0U3Vic2NyaXB0aW9uRmlsdGVycyhwYXJhbWV0ZXJzOiBhbnkpOiBHZXRTdWJzY3JpcHRpb25zVGltZWxpbmVRdWVyeUlucHV0WydmaWx0ZXJzJ10ge1xuICAgIGNvbnN0IGZpbHRlcnM6IEdldFN1YnNjcmlwdGlvbnNUaW1lbGluZVF1ZXJ5SW5wdXRbJ2ZpbHRlcnMnXSA9IFtdO1xuICAgIGNvbnN0IHBhcmFtc0FueSA9IHBhcmFtZXRlcnMgYXMgYW55O1xuXG4gICAgaWYgKCFwYXJhbXNBbnk/LmZpbHRlcnMgfHwgIUFycmF5LmlzQXJyYXkocGFyYW1zQW55LmZpbHRlcnMpKSB7XG4gICAgICByZXR1cm4gZmlsdGVycztcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiBwYXJhbXNBbnkuZmlsdGVycykge1xuICAgICAgaWYgKCFmaWx0ZXI/LmZpZWxkIHx8IGZpbHRlcj8udmFsdWUgPT09IHVuZGVmaW5lZCB8fCBmaWx0ZXI/LnZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWVsZCA9IGZpbHRlci5maWVsZDtcbiAgICAgIGNvbnN0IHZhbHVlID0gZmlsdGVyLnZhbHVlO1xuICAgICAgY29uc3Qgb3BlcmF0b3IgPSBmaWx0ZXIub3BlcmF0b3IgfHwgeyB0eXBlOiAnZXF1YWwnIH07XG5cbiAgICAgIC8vIEhhbmRsZSBzdWJzY3JpcHRpb24tc3BlY2lmaWMgZmllbGQgbWFwcGluZ3NcbiAgICAgIGlmIChmaWVsZCA9PT0gJ3BsYW5JZCcpIHtcbiAgICAgICAgLy8gUGxhbiBJRCBmaWx0ZXIgLSBjYW4gYmUgYXJyYXkgb2YgSURzIG9yIHNpbmdsZSBJRFxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZpbHRlcnMucHVzaCh7XG4gICAgICAgICAgICBmaWVsZDogJ3BsYW5JZCcsXG4gICAgICAgICAgICBvcGVyYXRvcjogeyB0eXBlOiAnaW4nIH0sXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgICAgICBmaWx0ZXJzLnB1c2goe1xuICAgICAgICAgICAgZmllbGQ6ICdwbGFuSWQnLFxuICAgICAgICAgICAgb3BlcmF0b3I6IHsgdHlwZTogJ2VxdWFsJyB9LFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkID09PSAnc3RhdHVzSWQnKSB7XG4gICAgICAgIC8vIFN0YXR1cyBmaWx0ZXIgLSBza2lwICdhbGwnIHZhbHVlXG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPT0gJ2FsbCcpIHtcbiAgICAgICAgICBmaWx0ZXJzLnB1c2goe1xuICAgICAgICAgICAgZmllbGQ6ICdzdGF0dXNJZCcsXG4gICAgICAgICAgICBvcGVyYXRvcjogeyB0eXBlOiAnZXF1YWwnIH0sXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZmllbGQgPT09ICdkYXRlUmFuZ2UnKSB7XG4gICAgICAgIC8vIERhdGUgcmFuZ2UgZmlsdGVyIC0gY3VzdG9tIGxvZ2ljIGhhbmRsZWQgaW4gcXVlcnlcbiAgICAgICAgZmlsdGVycy5wdXNoKHtcbiAgICAgICAgICBmaWVsZDogJ2RhdGVSYW5nZScsXG4gICAgICAgICAgb3BlcmF0b3I6IHsgdHlwZTogJ2VxdWFsJyB9LFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEaXJlY3QgZmllbGQgbWFwcGluZ1xuICAgICAgICBmaWx0ZXJzLnB1c2goe1xuICAgICAgICAgIGZpZWxkOiBmaWVsZCxcbiAgICAgICAgICBvcGVyYXRvcjogb3BlcmF0b3IsXG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmlsdGVycztcbiAgfVxuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiAtLS0tICAgQ3VzdG9tIEZpbHRlciBIYW5kbGVycyAgIC0tLS1cblxuICAvKipcbiAgICogQXBwbHkgZGF0ZSByYW5nZSBmaWx0ZXIgdG8gc3Vic2NyaXB0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhcHBseURhdGVSYW5nZUZpbHRlcihcbiAgICBzdWJzY3JpcHRpb25zOiBBWE1TdWJzY3JpcHRpb25NYW5hZ2VtZW50U3Vic2NyaXB0aW9uRW50aXR5TW9kZWxbXSxcbiAgICBkYXRlUmFuZ2U6IGFueVxuICApOiBBWE1TdWJzY3JpcHRpb25NYW5hZ2VtZW50U3Vic2NyaXB0aW9uRW50aXR5TW9kZWxbXSB7XG4gICAgaWYgKCFkYXRlUmFuZ2UgfHwgIWRhdGVSYW5nZS5zdGFydCB8fCAhZGF0ZVJhbmdlLmVuZCkge1xuICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbnM7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnREYXRlID0gbmV3IERhdGUoZGF0ZVJhbmdlLnN0YXJ0KTtcbiAgICBjb25zdCBlbmREYXRlID0gbmV3IERhdGUoZGF0ZVJhbmdlLmVuZCk7XG4gICAgZW5kRGF0ZS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpO1xuXG4gICAgcmV0dXJuIHN1YnNjcmlwdGlvbnMuZmlsdGVyKChzdWJzY3JpcHRpb24pID0+IHtcbiAgICAgIGNvbnN0IHN1YlN0YXJ0RGF0ZSA9IG5ldyBEYXRlKHN1YnNjcmlwdGlvbi5zdGFydERhdGUpO1xuICAgICAgY29uc3Qgc3ViRW5kRGF0ZSA9IHN1YnNjcmlwdGlvbi5lbmREYXRlID8gbmV3IERhdGUoc3Vic2NyaXB0aW9uLmVuZERhdGUpIDogbnVsbDtcblxuICAgICAgLy8gQ2hlY2sgaWYgc3Vic2NyaXB0aW9uIG92ZXJsYXBzIHdpdGggdGhlIGRhdGUgcmFuZ2VcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChzdWJTdGFydERhdGUgPj0gc3RhcnREYXRlICYmIHN1YlN0YXJ0RGF0ZSA8PSBlbmREYXRlKSB8fFxuICAgICAgICAoc3ViRW5kRGF0ZSAmJiBzdWJFbmREYXRlID49IHN0YXJ0RGF0ZSAmJiBzdWJFbmREYXRlIDw9IGVuZERhdGUpIHx8XG4gICAgICAgIChzdWJTdGFydERhdGUgPD0gc3RhcnREYXRlICYmICghc3ViRW5kRGF0ZSB8fCBzdWJFbmREYXRlID49IGVuZERhdGUpKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vI2VuZHJlZ2lvblxufVxuXG4iXX0="],"names":["SubscriptionRootConfig","TenantRootConfig"],"mappings":"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"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, Injectable } from '@angular/core';
|
|
3
|
+
import { AXPEntityService } from '@acorex/platform/layout/entity';
|
|
4
|
+
import { AXPSystemStatusType } from '@acorex/platform/common';
|
|
5
|
+
import { RootConfig } from '@acorex/modules/tenant-management';
|
|
6
|
+
import { RootConfig as RootConfig$1 } from '@acorex/modules/subscription-management';
|
|
7
|
+
import { RootConfig as RootConfig$2 } from '@acorex/modules/application-management';
|
|
8
|
+
|
|
9
|
+
//#endregion
|
|
10
|
+
class GetTenantApplicationAccessQuery {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.entityService = inject(AXPEntityService);
|
|
13
|
+
this.tenantService = this.entityService
|
|
14
|
+
.withEntity(`${RootConfig.module.name}.${RootConfig.entities.tenant.name}`)
|
|
15
|
+
.data();
|
|
16
|
+
this.subscriptionService = this.entityService
|
|
17
|
+
.withEntity(`${RootConfig$1.module.name}.${RootConfig$1.entities.subscription.name}`)
|
|
18
|
+
.data();
|
|
19
|
+
this.planService = this.entityService
|
|
20
|
+
.withEntity(`${RootConfig$1.module.name}.${RootConfig$1.entities.subscriptionPlan.name}`)
|
|
21
|
+
.data();
|
|
22
|
+
this.planItemService = this.entityService
|
|
23
|
+
.withEntity(`${RootConfig$1.module.name}.${RootConfig$1.entities.subscriptionPlanItem.name}`)
|
|
24
|
+
.data();
|
|
25
|
+
this.applicationService = this.entityService
|
|
26
|
+
.withEntity(`${RootConfig$2.module.name}.${RootConfig$2.entities.application.name}`)
|
|
27
|
+
.data();
|
|
28
|
+
}
|
|
29
|
+
async fetch(input) {
|
|
30
|
+
// Extract filters from AXPFilterClause format
|
|
31
|
+
const extractedFilters = this.extractTenantFilters(input.filters);
|
|
32
|
+
const filterLogic = input.filters?.logic || input.logic || 'and';
|
|
33
|
+
// Separate custom filters from entity filters
|
|
34
|
+
const entityFilters = [];
|
|
35
|
+
let dateRangeFilter;
|
|
36
|
+
if (extractedFilters && extractedFilters.length > 0) {
|
|
37
|
+
for (const filter of extractedFilters) {
|
|
38
|
+
if (filter.field === 'dateRange') {
|
|
39
|
+
dateRangeFilter = filter.value;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
entityFilters.push(filter);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Get all tenants
|
|
47
|
+
const tenantsResult = await this.tenantService.query({
|
|
48
|
+
skip: 0,
|
|
49
|
+
take: 10000,
|
|
50
|
+
filter: entityFilters.length > 0
|
|
51
|
+
? {
|
|
52
|
+
logic: filterLogic,
|
|
53
|
+
filters: entityFilters,
|
|
54
|
+
}
|
|
55
|
+
: undefined,
|
|
56
|
+
});
|
|
57
|
+
let tenants = tenantsResult.items;
|
|
58
|
+
// Apply date range filter if provided
|
|
59
|
+
if (dateRangeFilter) {
|
|
60
|
+
tenants = this.applyDateRangeFilter(tenants, dateRangeFilter);
|
|
61
|
+
}
|
|
62
|
+
// Get all subscriptions
|
|
63
|
+
const subscriptionsResult = await this.subscriptionService.query({
|
|
64
|
+
skip: 0,
|
|
65
|
+
take: 10000,
|
|
66
|
+
});
|
|
67
|
+
const subscriptions = subscriptionsResult.items.filter((s) => s.subscriberType === 'Tenant');
|
|
68
|
+
// Get all plans
|
|
69
|
+
const plansResult = await this.planService.query({
|
|
70
|
+
skip: 0,
|
|
71
|
+
take: 10000,
|
|
72
|
+
});
|
|
73
|
+
const plans = plansResult.items;
|
|
74
|
+
// Get all plan items
|
|
75
|
+
const planItemsResult = await this.planItemService.query({
|
|
76
|
+
skip: 0,
|
|
77
|
+
take: 10000,
|
|
78
|
+
});
|
|
79
|
+
const planItems = planItemsResult.items;
|
|
80
|
+
// Get all applications
|
|
81
|
+
const applicationsResult = await this.applicationService.query({
|
|
82
|
+
skip: 0,
|
|
83
|
+
take: 10000,
|
|
84
|
+
});
|
|
85
|
+
const applications = applicationsResult.items;
|
|
86
|
+
// Build results for each tenant
|
|
87
|
+
const results = [];
|
|
88
|
+
for (const tenant of tenants) {
|
|
89
|
+
// Get tenant's subscriptions
|
|
90
|
+
const tenantSubscriptions = subscriptions.filter((s) => s.subscriberId === tenant.id);
|
|
91
|
+
// Get unique applications through subscriptions → plans → plan items → editions → applications
|
|
92
|
+
const applicationSet = new Set();
|
|
93
|
+
const applicationNames = [];
|
|
94
|
+
for (const subscription of tenantSubscriptions) {
|
|
95
|
+
if (!subscription.planId)
|
|
96
|
+
continue;
|
|
97
|
+
// Get plan items for this plan
|
|
98
|
+
const planPlanItems = planItems.filter((pi) => pi.planId === subscription.planId);
|
|
99
|
+
for (const planItem of planPlanItems) {
|
|
100
|
+
if (!planItem.editionId)
|
|
101
|
+
continue;
|
|
102
|
+
// Find applications that have this edition
|
|
103
|
+
for (const application of applications) {
|
|
104
|
+
if (application.editionIds && application.editionIds.includes(planItem.editionId)) {
|
|
105
|
+
if (!applicationSet.has(application.id)) {
|
|
106
|
+
applicationSet.add(application.id);
|
|
107
|
+
applicationNames.push(application.title);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Count active subscriptions
|
|
114
|
+
const activeSubscriptions = tenantSubscriptions.filter((s) => s.statusId === AXPSystemStatusType.Active);
|
|
115
|
+
results.push({
|
|
116
|
+
tenantId: tenant.id,
|
|
117
|
+
tenantName: tenant.title,
|
|
118
|
+
tenantStatus: tenant.statusId || 'Unknown',
|
|
119
|
+
subscriptionCount: tenantSubscriptions.length,
|
|
120
|
+
applicationsCount: applicationSet.size,
|
|
121
|
+
applicationsList: applicationNames.join(', '),
|
|
122
|
+
activeSubscriptionsCount: activeSubscriptions.length,
|
|
123
|
+
registrationDate: tenant.registrationDate,
|
|
124
|
+
registrationDateStr: tenant.registrationDate?.toISOString(),
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
// Apply sorting if provided
|
|
128
|
+
if (input.sort && input.sort.length > 0) {
|
|
129
|
+
results.sort((a, b) => {
|
|
130
|
+
for (const sortField of input.sort) {
|
|
131
|
+
const field = sortField.field;
|
|
132
|
+
const aValue = a[field];
|
|
133
|
+
const bValue = b[field];
|
|
134
|
+
const dir = sortField.dir === 'asc' ? 1 : -1;
|
|
135
|
+
if (aValue === undefined && bValue === undefined)
|
|
136
|
+
continue;
|
|
137
|
+
if (aValue === undefined)
|
|
138
|
+
return 1 * dir;
|
|
139
|
+
if (bValue === undefined)
|
|
140
|
+
return -1 * dir;
|
|
141
|
+
if (aValue < bValue)
|
|
142
|
+
return -1 * dir;
|
|
143
|
+
if (aValue > bValue)
|
|
144
|
+
return 1 * dir;
|
|
145
|
+
}
|
|
146
|
+
return 0;
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
// Default sort by tenant name
|
|
151
|
+
results.sort((a, b) => a.tenantName.localeCompare(b.tenantName));
|
|
152
|
+
}
|
|
153
|
+
// Apply pagination
|
|
154
|
+
const skip = input.skip || 0;
|
|
155
|
+
const take = input.take || 10;
|
|
156
|
+
const total = results.length;
|
|
157
|
+
const items = results.slice(skip, skip + take);
|
|
158
|
+
return {
|
|
159
|
+
items,
|
|
160
|
+
total,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
//#region ---- Filter Extraction ----
|
|
164
|
+
/**
|
|
165
|
+
* Extract tenant-specific filters from AXPFilterClause format
|
|
166
|
+
* Maps report parameter paths to tenant entity field names
|
|
167
|
+
*/
|
|
168
|
+
extractTenantFilters(parameters) {
|
|
169
|
+
const filters = [];
|
|
170
|
+
const paramsAny = parameters;
|
|
171
|
+
if (!paramsAny?.filters || !Array.isArray(paramsAny.filters)) {
|
|
172
|
+
return filters;
|
|
173
|
+
}
|
|
174
|
+
for (const filter of paramsAny.filters) {
|
|
175
|
+
if (!filter?.field || filter?.value === undefined || filter?.value === null) {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
const field = filter.field;
|
|
179
|
+
const value = filter.value;
|
|
180
|
+
const operator = filter.operator || { type: 'equal' };
|
|
181
|
+
// Handle tenant-specific field mappings
|
|
182
|
+
if (field === 'tenantId') {
|
|
183
|
+
// Tenant ID filter - can be array of IDs or single ID
|
|
184
|
+
if (Array.isArray(value) && value.length > 0) {
|
|
185
|
+
filters.push({
|
|
186
|
+
field: 'id',
|
|
187
|
+
operator: { type: 'in' },
|
|
188
|
+
value: value,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
else if (value) {
|
|
192
|
+
filters.push({
|
|
193
|
+
field: 'id',
|
|
194
|
+
operator: { type: 'equal' },
|
|
195
|
+
value: value,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
else if (field === 'statusId') {
|
|
200
|
+
// Status filter - skip 'all' value
|
|
201
|
+
if (value && value !== 'all') {
|
|
202
|
+
filters.push({
|
|
203
|
+
field: 'statusId',
|
|
204
|
+
operator: { type: 'equal' },
|
|
205
|
+
value: value,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
else if (field === 'dateRange') {
|
|
210
|
+
// Date range filter - custom logic handled in query
|
|
211
|
+
filters.push({
|
|
212
|
+
field: 'dateRange',
|
|
213
|
+
operator: { type: 'equal' },
|
|
214
|
+
value: value,
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
// Direct field mapping
|
|
219
|
+
filters.push({
|
|
220
|
+
field: field,
|
|
221
|
+
operator: operator,
|
|
222
|
+
value: value,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return filters;
|
|
227
|
+
}
|
|
228
|
+
//#endregion
|
|
229
|
+
//#region ---- Custom Filter Handlers ----
|
|
230
|
+
/**
|
|
231
|
+
* Apply date range filter to tenants
|
|
232
|
+
*/
|
|
233
|
+
applyDateRangeFilter(tenants, dateRange) {
|
|
234
|
+
if (!dateRange || !dateRange.start || !dateRange.end) {
|
|
235
|
+
return tenants;
|
|
236
|
+
}
|
|
237
|
+
const startDate = new Date(dateRange.start);
|
|
238
|
+
const endDate = new Date(dateRange.end);
|
|
239
|
+
endDate.setHours(23, 59, 59, 999);
|
|
240
|
+
return tenants.filter((tenant) => {
|
|
241
|
+
if (!tenant.registrationDate)
|
|
242
|
+
return false;
|
|
243
|
+
const regDate = new Date(tenant.registrationDate);
|
|
244
|
+
return regDate >= startDate && regDate <= endDate;
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: GetTenantApplicationAccessQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
248
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: GetTenantApplicationAccessQuery, providedIn: 'root' }); }
|
|
249
|
+
}
|
|
250
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: GetTenantApplicationAccessQuery, decorators: [{
|
|
251
|
+
type: Injectable,
|
|
252
|
+
args: [{
|
|
253
|
+
providedIn: 'root',
|
|
254
|
+
}]
|
|
255
|
+
}] });
|
|
256
|
+
|
|
257
|
+
export { GetTenantApplicationAccessQuery };
|
|
258
|
+
//# sourceMappingURL=acorex-connectivity-mock-get-tenant-application-access.query-C3OxqcSp.mjs.map
|