@acorex/connectivity 21.0.0-next.8 → 21.0.0-next.83
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/fesm2022/{acorex-connectivity-api-execute.command-SGNBLcOi.mjs → acorex-connectivity-api-execute.command-CjCFEav4.mjs} +18 -8
- package/fesm2022/acorex-connectivity-api-execute.command-CjCFEav4.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-api.mjs +196 -192
- package/fesm2022/acorex-connectivity-api.mjs.map +1 -1
- package/fesm2022/acorex-connectivity-mock-acorex-connectivity-mock-Btm13GJK.mjs +86927 -0
- package/fesm2022/acorex-connectivity-mock-acorex-connectivity-mock-Btm13GJK.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-assign-to-manager.activity-CY_5d0KF.mjs +288 -0
- package/fesm2022/acorex-connectivity-mock-assign-to-manager.activity-CY_5d0KF.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-category-metadata-inheritance.query-CIof4zTg.mjs +200 -0
- package/fesm2022/acorex-connectivity-mock-category-metadata-inheritance.query-CIof4zTg.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-category-with-items.query-Dsxj98tX.mjs → acorex-connectivity-mock-category-with-items.query-DAKUJIIt.mjs} +18 -17
- package/fesm2022/acorex-connectivity-mock-category-with-items.query-DAKUJIIt.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-chat-generate-image.command-Hj-2bHyJ.mjs +111 -0
- package/fesm2022/acorex-connectivity-mock-chat-generate-image.command-Hj-2bHyJ.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-chat-synthesize-speech.command-0ZnevjmT.mjs +121 -0
- package/fesm2022/acorex-connectivity-mock-chat-synthesize-speech.command-0ZnevjmT.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-chat-transcribe-speech.command-D8sCgp69.mjs +121 -0
- package/fesm2022/acorex-connectivity-mock-chat-transcribe-speech.command-D8sCgp69.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-check-permission.activity-vr3OHtjC.mjs +45 -0
- package/fesm2022/acorex-connectivity-mock-check-permission.activity-vr3OHtjC.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-contact-core.module-5TLCGWOR.mjs +968 -0
- package/fesm2022/acorex-connectivity-mock-contact-core.module-5TLCGWOR.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-content-management.module-GQdqKsPB.mjs +16 -0
- package/fesm2022/acorex-connectivity-mock-content-management.module-GQdqKsPB.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-distribution-record.command-DRiDwlqN.mjs → acorex-connectivity-mock-distribution-record.activity-a1_k9Czb.mjs} +29 -14
- package/fesm2022/acorex-connectivity-mock-distribution-record.activity-a1_k9Czb.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-entity-create.activity-CdoUzUvF.mjs +67 -0
- package/fesm2022/acorex-connectivity-mock-entity-create.activity-CdoUzUvF.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-entity-delete.activity-ErEN1c24.mjs +60 -0
- package/fesm2022/acorex-connectivity-mock-entity-delete.activity-ErEN1c24.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-entity-read.activity-1fJW8gVe.mjs +67 -0
- package/fesm2022/acorex-connectivity-mock-entity-read.activity-1fJW8gVe.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-entity-update.activity-06HTKiQQ.mjs +68 -0
- package/fesm2022/acorex-connectivity-mock-entity-update.activity-06HTKiQQ.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-extract-document-text.command-nGfUTSf6.mjs +64 -0
- package/fesm2022/acorex-connectivity-mock-extract-document-text.command-nGfUTSf6.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-get-application-versions-chart-data.query-C3eQfF0A.mjs → acorex-connectivity-mock-get-application-versions-chart-data.query-DwVuYuKx.mjs} +4 -4
- package/fesm2022/acorex-connectivity-mock-get-application-versions-chart-data.query-DwVuYuKx.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-get-application-versions-timeline.query-CLzDz9ob.mjs → acorex-connectivity-mock-get-application-versions-timeline.query-sFKYynZA.mjs} +4 -4
- package/fesm2022/acorex-connectivity-mock-get-application-versions-timeline.query-sFKYynZA.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-current-session-user.activity-CsmxwXsM.mjs +39 -0
- package/fesm2022/acorex-connectivity-mock-get-current-session-user.activity-CsmxwXsM.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-current-user-manager.activity-C1mj2bgB.mjs +69 -0
- package/fesm2022/acorex-connectivity-mock-get-current-user-manager.activity-C1mj2bgB.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-employee-list.query-BWbZj3tp.mjs +214 -0
- package/fesm2022/acorex-connectivity-mock-get-employee-list.query-BWbZj3tp.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-location-list.query-CQ2rFDUM.mjs +209 -0
- package/fesm2022/acorex-connectivity-mock-get-location-list.query-CQ2rFDUM.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-D7DBzLT-.mjs +186 -0
- package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-D7DBzLT-.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-get-product-list.query-ChtYlSTt.mjs → acorex-connectivity-mock-get-product-list.query-Bv1im5yj.mjs} +111 -14
- package/fesm2022/acorex-connectivity-mock-get-product-list.query-Bv1im5yj.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-product-pdf-data.query-Cp65_mpB.mjs +192 -0
- package/fesm2022/acorex-connectivity-mock-get-product-pdf-data.query-Cp65_mpB.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-get-subscriptions-chart-data.query-HxX_bCT8.mjs → acorex-connectivity-mock-get-subscriptions-chart-data.query-CkQnH-F_.mjs} +5 -5
- package/fesm2022/acorex-connectivity-mock-get-subscriptions-chart-data.query-CkQnH-F_.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-get-subscriptions-timeline.query-dp08JqLP.mjs → acorex-connectivity-mock-get-subscriptions-timeline.query-C_ecGCyk.mjs} +92 -14
- package/fesm2022/acorex-connectivity-mock-get-subscriptions-timeline.query-C_ecGCyk.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-get-tenant-application-access.query-IATTXcAV.mjs → acorex-connectivity-mock-get-tenant-application-access.query-t4BHU8qk.mjs} +92 -14
- package/fesm2022/acorex-connectivity-mock-get-tenant-application-access.query-t4BHU8qk.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-get-tenant-registration-chart-data.query-DlXi4Rcg.mjs → acorex-connectivity-mock-get-tenant-registration-chart-data.query-CgMZxfzh.mjs} +5 -5
- package/fesm2022/acorex-connectivity-mock-get-tenant-registration-chart-data.query-CgMZxfzh.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-get-tenant-registration-timeline.query-hskw8Ioa.mjs → acorex-connectivity-mock-get-tenant-registration-timeline.query-COmTsDCV.mjs} +92 -14
- package/fesm2022/acorex-connectivity-mock-get-tenant-registration-timeline.query-COmTsDCV.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-get-tenant-user-distribution.query-Bs5U5tze.mjs → acorex-connectivity-mock-get-tenant-user-distribution.query-jQAsUf_h.mjs} +92 -14
- package/fesm2022/acorex-connectivity-mock-get-tenant-user-distribution.query-jQAsUf_h.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-if.activity-DvzuhItL.mjs +35 -0
- package/fesm2022/acorex-connectivity-mock-if.activity-DvzuhItL.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-notification-management-email-send.command-DAQfIWoD.mjs +73 -0
- package/fesm2022/acorex-connectivity-mock-notification-management-email-send.command-DAQfIWoD.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-report-summary.util-CGOhHIZr.mjs +56 -0
- package/fesm2022/acorex-connectivity-mock-report-summary.util-CGOhHIZr.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-sample.command-CkH5bmEs.mjs → acorex-connectivity-mock-sample.command-CJmDL4pL.mjs} +4 -4
- package/fesm2022/acorex-connectivity-mock-sample.command-CJmDL4pL.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-structured-text-completion.command-l31pjl9-.mjs +38 -0
- package/fesm2022/acorex-connectivity-mock-structured-text-completion.command-l31pjl9-.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-user-roles-for-list-column.query-D2QjJXu4.mjs +30 -0
- package/fesm2022/acorex-connectivity-mock-user-roles-for-list-column.query-D2QjJXu4.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock.mjs +2 -50419
- 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/fesm2022/acorex-connectivity.mjs.map +1 -1
- package/package.json +8 -7
- package/{api/index.d.ts → types/acorex-connectivity-api.d.ts} +14 -60
- package/types/acorex-connectivity-mock.d.ts +4224 -0
- package/fesm2022/acorex-connectivity-api-execute.command-SGNBLcOi.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-category-with-items.query-Dsxj98tX.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-distribution-record.command-DRiDwlqN.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-get-application-versions-chart-data.query-C3eQfF0A.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-get-application-versions-timeline.query-CLzDz9ob.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-DDVVFeYN.mjs +0 -97
- package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-DDVVFeYN.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-get-product-list.query-ChtYlSTt.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-get-subscriptions-chart-data.query-HxX_bCT8.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-get-subscriptions-timeline.query-dp08JqLP.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-get-tenant-application-access.query-IATTXcAV.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-get-tenant-registration-chart-data.query-DlXi4Rcg.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-get-tenant-registration-timeline.query-hskw8Ioa.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-get-tenant-user-distribution.query-Bs5U5tze.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-sample.command-CkH5bmEs.mjs.map +0 -1
- package/mock/index.d.ts +0 -2669
- /package/{utils/index.d.ts → types/acorex-connectivity-utils.d.ts} +0 -0
- /package/{index.d.ts → types/acorex-connectivity.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-connectivity-mock-get-product-pdf-data.query-Cp65_mpB.mjs","sources":["../../../../libs/connectivity/mock/src/lib/product-catalog/reports/get-product-pdf-data.query.ts"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { AXPQuery } from '@acorex/platform/runtime';\nimport { GetProductListQueryInput, GetProductListQueryResult } from './get-product-list.query';\nimport { GetProductListQuery } from './get-product-list.query';\n\n//#region ---- Query Input/Output Types ----\n\nexport interface GetProductPdfDataQueryInput {\n filters?: Array<{\n field: string;\n operator: { type: string };\n value: any;\n }>;\n logic?: 'and' | 'or';\n}\n\nexport interface GetProductPdfDataQueryResult {\n url?: string;\n base64?: string;\n blob?: Blob;\n filename?: string;\n}\n\n//#endregion\n\n@Injectable({\n providedIn: 'root',\n})\nexport class GetProductPdfDataQuery implements AXPQuery<GetProductPdfDataQueryInput, GetProductPdfDataQueryResult> {\n private readonly productListQuery = inject(GetProductListQuery);\n\n async fetch(input: GetProductPdfDataQueryInput | any): Promise<GetProductPdfDataQueryResult> {\n // Extract product-specific filters from AXPFilterClause format\n const extractedFilters = this.extractProductFilters(input.filters);\n\n // Get the product list data to generate PDF content\n const productListInput: GetProductListQueryInput = {\n skip: 0,\n take: 10000, // Get all products for PDF\n filters: extractedFilters,\n logic: input.logic,\n };\n\n const productData = await this.productListQuery.fetch(productListInput);\n\n // Generate a mock PDF base64 string\n // In production, this would call an actual PDF generation service\n const pdfBase64 = this.generateMockPdfBase64(productData);\n\n return {\n base64: pdfBase64,\n filename: `Product_Report_${new Date().toISOString().split('T')[0]}.pdf`,\n };\n }\n\n //#region ---- Filter Extraction ----\n\n /**\n * Extract product-specific filters from AXPFilterClause format\n * Maps report parameter paths to product entity field names\n */\n private extractProductFilters(parameters: any): GetProductListQueryInput['filters'] {\n const filters: GetProductListQueryInput['filters'] = [];\n const paramsAny = parameters as any;\n\n if (!paramsAny?.filters || !Array.isArray(paramsAny.filters)) {\n return filters;\n }\n\n for (const filter of paramsAny.filters) {\n if (!filter?.field || filter?.value === undefined || filter?.value === null) {\n continue;\n }\n\n const field = filter.field;\n const value = filter.value;\n const operator = filter.operator || { type: 'equal' };\n\n // Handle product-specific field mappings\n if (field === 'brand') {\n // Brand filter - can be array of IDs or single ID\n if (Array.isArray(value) && value.length > 0) {\n filters.push({\n field: 'brandId',\n operator: { type: 'in' },\n value: value,\n });\n } else if (value) {\n filters.push({\n field: 'brandId',\n operator: { type: 'equal' },\n value: value,\n });\n }\n } else if (field === 'category') {\n // Category filter - can be array of IDs or single ID\n if (Array.isArray(value) && value.length > 0) {\n filters.push({\n field: 'categoryIds',\n operator: { type: 'contains' },\n value: value[0], // Use first category for contains check\n });\n } else if (value) {\n filters.push({\n field: 'categoryIds',\n operator: { type: 'contains' },\n value: value,\n });\n }\n } else if (field === 'status') {\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 } else if (field === 'priceRange') {\n // Price range filter - custom logic handled in query\n filters.push({\n field: 'priceRange',\n operator: { type: 'equal' },\n value: value,\n });\n } else if (field === 'startDate' || field === 'endDate') {\n // Date filters - can be handled if needed\n // For now, skip as they might not be directly on product entity\n } else {\n // Direct field mapping\n filters.push({\n field: field,\n operator: operator,\n value: value,\n });\n }\n }\n\n return filters;\n }\n\n //#endregion\n\n //#region ---- PDF Generation Helpers ----\n\n /**\n * Generate a mock PDF base64 string\n * In production, this would call an actual PDF generation service\n */\n private generateMockPdfBase64(productData: GetProductListQueryResult): string {\n // Create a minimal valid PDF with some content\n // This is a very basic PDF structure for demonstration\n // In production, use a proper PDF library like jsPDF or call a backend service\n\n const pdfContent = this.createSimplePdf(productData);\n\n // Convert to base64\n const base64 = btoa(pdfContent);\n\n return base64;\n }\n\n /**\n * Create a simple PDF document structure\n * This is a minimal valid PDF for demonstration - in production use a proper PDF library\n */\n private createSimplePdf(productData: GetProductListQueryResult): string {\n // Use a minimal valid PDF structure that browsers can render\n // This is a very basic single-page PDF\n const pdf = `%PDF-1.4\n1 0 obj\n<< /Type /Catalog /Pages 2 0 R >>\nendobj\n2 0 obj\n<< /Type /Pages /Kids [3 0 R] /Count 1 >>\nendobj\n3 0 obj\n<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] /Contents 4 0 R /Resources << /Font << /F1 5 0 R >> >> >>\nendobj\n4 0 obj\n<< /Length 200 >>\nstream\nBT\n/F1 12 Tf\n100 700 Td\n(Product Report) Tj\n0 -20 Td\n(Total Brands: ${productData.total}) Tj\n0 -20 Td\n(Generated: ${new Date().toLocaleDateString()}) Tj\n0 -20 Td\n(Items: ${productData.items.length}) Tj\nET\nendstream\nendobj\n5 0 obj\n<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>\nendobj\nxref\n0 6\n0000000000 65535 f \n0000000009 00000 n \n0000000058 00000 n \n0000000115 00000 n \n0000000317 00000 n \n0000000444 00000 n \ntrailer\n<< /Size 6 /Root 1 0 R >>\nstartxref\n527\n%%EOF`;\n\n return pdf;\n }\n\n //#endregion\n}\n\n"],"names":[],"mappings":";;;;AAuBA;MAKa,sBAAsB,CAAA;AAHnC,IAAA,WAAA,GAAA;AAIqB,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AA2LlE,IAAA;IAzLG,MAAM,KAAK,CAAC,KAAwC,EAAA;;QAEhD,MAAM,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC;;AAGlE,QAAA,MAAM,gBAAgB,GAA6B;AAC/C,YAAA,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,KAAK;AACX,YAAA,OAAO,EAAE,gBAAgB;YACzB,KAAK,EAAE,KAAK,CAAC,KAAK;SACrB;QAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,gBAAgB,CAAC;;;QAIvE,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC;QAEzD,OAAO;AACH,YAAA,MAAM,EAAE,SAAS;AACjB,YAAA,QAAQ,EAAE,CAAA,eAAA,EAAkB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA,IAAA,CAAM;SAC3E;IACL;;AAIA;;;AAGG;AACK,IAAA,qBAAqB,CAAC,UAAe,EAAA;QACzC,MAAM,OAAO,GAAwC,EAAE;QACvD,MAAM,SAAS,GAAG,UAAiB;AAEnC,QAAA,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;AAC1D,YAAA,OAAO,OAAO;QAClB;AAEA,QAAA,KAAK,MAAM,MAAM,IAAI,SAAS,CAAC,OAAO,EAAE;AACpC,YAAA,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,MAAM,EAAE,KAAK,KAAK,SAAS,IAAI,MAAM,EAAE,KAAK,KAAK,IAAI,EAAE;gBACzE;YACJ;AAEA,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK;AAC1B,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK;YAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE;;AAGrD,YAAA,IAAI,KAAK,KAAK,OAAO,EAAE;;AAEnB,gBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC1C,OAAO,CAAC,IAAI,CAAC;AACT,wBAAA,KAAK,EAAE,SAAS;AAChB,wBAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;AACxB,wBAAA,KAAK,EAAE,KAAK;AACf,qBAAA,CAAC;gBACN;qBAAO,IAAI,KAAK,EAAE;oBACd,OAAO,CAAC,IAAI,CAAC;AACT,wBAAA,KAAK,EAAE,SAAS;AAChB,wBAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;AAC3B,wBAAA,KAAK,EAAE,KAAK;AACf,qBAAA,CAAC;gBACN;YACJ;AAAO,iBAAA,IAAI,KAAK,KAAK,UAAU,EAAE;;AAE7B,gBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC1C,OAAO,CAAC,IAAI,CAAC;AACT,wBAAA,KAAK,EAAE,aAAa;AACpB,wBAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;AAC9B,wBAAA,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AAClB,qBAAA,CAAC;gBACN;qBAAO,IAAI,KAAK,EAAE;oBACd,OAAO,CAAC,IAAI,CAAC;AACT,wBAAA,KAAK,EAAE,aAAa;AACpB,wBAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;AAC9B,wBAAA,KAAK,EAAE,KAAK;AACf,qBAAA,CAAC;gBACN;YACJ;AAAO,iBAAA,IAAI,KAAK,KAAK,QAAQ,EAAE;;AAE3B,gBAAA,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,EAAE;oBAC1B,OAAO,CAAC,IAAI,CAAC;AACT,wBAAA,KAAK,EAAE,UAAU;AACjB,wBAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;AAC3B,wBAAA,KAAK,EAAE,KAAK;AACf,qBAAA,CAAC;gBACN;YACJ;AAAO,iBAAA,IAAI,KAAK,KAAK,YAAY,EAAE;;gBAE/B,OAAO,CAAC,IAAI,CAAC;AACT,oBAAA,KAAK,EAAE,YAAY;AACnB,oBAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;AAC3B,oBAAA,KAAK,EAAE,KAAK;AACf,iBAAA,CAAC;YACN;iBAAO,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,SAAS,EAAE;;;YAGzD;iBAAO;;gBAEH,OAAO,CAAC,IAAI,CAAC;AACT,oBAAA,KAAK,EAAE,KAAK;AACZ,oBAAA,QAAQ,EAAE,QAAQ;AAClB,oBAAA,KAAK,EAAE,KAAK;AACf,iBAAA,CAAC;YACN;QACJ;AAEA,QAAA,OAAO,OAAO;IAClB;;;AAMA;;;AAGG;AACK,IAAA,qBAAqB,CAAC,WAAsC,EAAA;;;;QAKhE,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC;;AAGpD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;AAE/B,QAAA,OAAO,MAAM;IACjB;AAEA;;;AAGG;AACK,IAAA,eAAe,CAAC,WAAsC,EAAA;;;AAG1D,QAAA,MAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;AAkBH,eAAA,EAAA,WAAW,CAAC,KAAK,CAAA;;AAEpB,YAAA,EAAA,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE,CAAA;;UAEnC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAA;;;;;;;;;;;;;;;;;;;MAmB5B;AAEE,QAAA,OAAO,GAAG;IACd;8GAzLS,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cAFnB,MAAM,EAAA,CAAA,CAAA;;2FAET,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAHlC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE,MAAM;AACrB,iBAAA;;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { inject, Injectable } from '@angular/core';
|
|
3
|
-
import { GetSubscriptionsTimelineQuery } from './acorex-connectivity-mock-get-subscriptions-timeline.query-
|
|
3
|
+
import { GetSubscriptionsTimelineQuery } from './acorex-connectivity-mock-get-subscriptions-timeline.query-C_ecGCyk.mjs';
|
|
4
4
|
|
|
5
5
|
//#endregion
|
|
6
6
|
class GetSubscriptionsChartDataQuery {
|
|
@@ -42,10 +42,10 @@ class GetSubscriptionsChartDataQuery {
|
|
|
42
42
|
items: results,
|
|
43
43
|
};
|
|
44
44
|
}
|
|
45
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
46
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
45
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: GetSubscriptionsChartDataQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
46
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: GetSubscriptionsChartDataQuery, providedIn: 'root' }); }
|
|
47
47
|
}
|
|
48
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
48
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: GetSubscriptionsChartDataQuery, decorators: [{
|
|
49
49
|
type: Injectable,
|
|
50
50
|
args: [{
|
|
51
51
|
providedIn: 'root',
|
|
@@ -53,4 +53,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
|
|
|
53
53
|
}] });
|
|
54
54
|
|
|
55
55
|
export { GetSubscriptionsChartDataQuery };
|
|
56
|
-
//# sourceMappingURL=acorex-connectivity-mock-get-subscriptions-chart-data.query-
|
|
56
|
+
//# sourceMappingURL=acorex-connectivity-mock-get-subscriptions-chart-data.query-CkQnH-F_.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-connectivity-mock-get-subscriptions-chart-data.query-CkQnH-F_.mjs","sources":["../../../../libs/connectivity/mock/src/lib/tenant-management/reports/get-subscriptions-chart-data.query.ts"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { AXPQuery } from '@acorex/platform/runtime';\nimport { GetSubscriptionsTimelineQueryInput } from './get-subscriptions-timeline.query';\nimport { GetSubscriptionsTimelineQuery } from './get-subscriptions-timeline.query';\n\n//#region ---- Query Input/Output Types ----\n\nexport interface GetSubscriptionsChartDataQueryInput {\n filters?: Array<{\n field: string;\n operator: { type: string };\n value: any;\n }>;\n logic?: 'and' | 'or';\n}\n\nexport interface SubscriptionsChartDataResult {\n month: string;\n year: number;\n quarter: string;\n subscriptionCount: number;\n}\n\nexport interface GetSubscriptionsChartDataQueryResult {\n items: SubscriptionsChartDataResult[];\n}\n\n//#endregion\n\n@Injectable({\n providedIn: 'root',\n})\nexport class GetSubscriptionsChartDataQuery\n implements AXPQuery<GetSubscriptionsChartDataQueryInput, GetSubscriptionsChartDataQueryResult>\n{\n private readonly subscriptionsTimelineQuery = inject(GetSubscriptionsTimelineQuery);\n\n async fetch(input: GetSubscriptionsChartDataQueryInput | any): Promise<GetSubscriptionsChartDataQueryResult> {\n // Get all subscription timeline data (no pagination for charts)\n const timelineResult = await this.subscriptionsTimelineQuery.fetch({\n skip: 0,\n take: 10000,\n filters: input.filters,\n logic: input.logic,\n });\n\n // Group by month\n const monthGroups = new Map<string, SubscriptionsChartDataResult>();\n\n for (const item of timelineResult.items) {\n const monthKey = `${item.year}-${String(item.monthNumber).padStart(2, '0')}`;\n\n if (!monthGroups.has(monthKey)) {\n monthGroups.set(monthKey, {\n month: item.month,\n year: item.year,\n quarter: item.quarter,\n subscriptionCount: 0,\n });\n }\n\n const group = monthGroups.get(monthKey)!;\n group.subscriptionCount++;\n }\n\n // Convert to array and sort by date\n const results = Array.from(monthGroups.values()).sort((a, b) => {\n if (a.year !== b.year) return a.year - b.year;\n const monthA = new Date(`${a.month} 1, ${a.year}`).getMonth();\n const monthB = new Date(`${b.month} 1, ${b.year}`).getMonth();\n return monthA - monthB;\n });\n\n return {\n items: results,\n };\n }\n}\n\n"],"names":[],"mappings":";;;;AA2BA;MAKa,8BAA8B,CAAA;AAH3C,IAAA,WAAA,GAAA;AAMmB,QAAA,IAAA,CAAA,0BAA0B,GAAG,MAAM,CAAC,6BAA6B,CAAC;AA0CpF,IAAA;IAxCC,MAAM,KAAK,CAAC,KAAgD,EAAA;;QAE1D,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC;AACjE,YAAA,IAAI,EAAE,CAAC;AACP,YAAA,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,KAAK,CAAC,KAAK;AACnB,SAAA,CAAC;;AAGF,QAAA,MAAM,WAAW,GAAG,IAAI,GAAG,EAAwC;AAEnE,QAAA,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,KAAK,EAAE;YACvC,MAAM,QAAQ,GAAG,CAAA,EAAG,IAAI,CAAC,IAAI,CAAA,CAAA,EAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,CAAE;YAE5E,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AAC9B,gBAAA,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE;oBACxB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,oBAAA,iBAAiB,EAAE,CAAC;AACrB,iBAAA,CAAC;YACJ;YAEA,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAE;YACxC,KAAK,CAAC,iBAAiB,EAAE;QAC3B;;AAGA,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AAC7D,YAAA,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;AAAE,gBAAA,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI;AAC7C,YAAA,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,CAAA,EAAG,CAAC,CAAC,KAAK,CAAA,IAAA,EAAO,CAAC,CAAC,IAAI,CAAA,CAAE,CAAC,CAAC,QAAQ,EAAE;AAC7D,YAAA,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,CAAA,EAAG,CAAC,CAAC,KAAK,CAAA,IAAA,EAAO,CAAC,CAAC,IAAI,CAAA,CAAE,CAAC,CAAC,QAAQ,EAAE;YAC7D,OAAO,MAAM,GAAG,MAAM;AACxB,QAAA,CAAC,CAAC;QAEF,OAAO;AACL,YAAA,KAAK,EAAE,OAAO;SACf;IACH;8GA5CW,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAA9B,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,8BAA8B,cAF7B,MAAM,EAAA,CAAA,CAAA;;2FAEP,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAH1C,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;;;"}
|
|
@@ -17,14 +17,30 @@ class GetSubscriptionsTimelineQuery {
|
|
|
17
17
|
.data();
|
|
18
18
|
}
|
|
19
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
|
+
}
|
|
20
36
|
// Get all subscriptions
|
|
21
37
|
const subscriptionsResult = await this.subscriptionService.query({
|
|
22
38
|
skip: 0,
|
|
23
39
|
take: 10000,
|
|
24
|
-
filter:
|
|
40
|
+
filter: entityFilters.length > 0
|
|
25
41
|
? {
|
|
26
|
-
logic:
|
|
27
|
-
filters:
|
|
42
|
+
logic: filterLogic,
|
|
43
|
+
filters: entityFilters,
|
|
28
44
|
}
|
|
29
45
|
: undefined,
|
|
30
46
|
});
|
|
@@ -37,12 +53,8 @@ class GetSubscriptionsTimelineQuery {
|
|
|
37
53
|
const tenants = tenantsResult.items;
|
|
38
54
|
const tenantMap = new Map(tenants.map((t) => [t.id, t]));
|
|
39
55
|
// Apply date range filter if provided
|
|
40
|
-
if (
|
|
41
|
-
|
|
42
|
-
if (filter.field === 'dateRange' && filter.value) {
|
|
43
|
-
subscriptions = this.applyDateRangeFilter(subscriptions, filter.value);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
56
|
+
if (dateRangeFilter) {
|
|
57
|
+
subscriptions = this.applyDateRangeFilter(subscriptions, dateRangeFilter);
|
|
46
58
|
}
|
|
47
59
|
const now = new Date();
|
|
48
60
|
// Build results
|
|
@@ -90,7 +102,7 @@ class GetSubscriptionsTimelineQuery {
|
|
|
90
102
|
if (input.sort && input.sort.length > 0) {
|
|
91
103
|
results.sort((a, b) => {
|
|
92
104
|
for (const sortField of input.sort) {
|
|
93
|
-
const field = sortField.
|
|
105
|
+
const field = sortField.name;
|
|
94
106
|
const aValue = a[field];
|
|
95
107
|
const bValue = b[field];
|
|
96
108
|
const dir = sortField.dir === 'asc' ? 1 : -1;
|
|
@@ -134,6 +146,72 @@ class GetSubscriptionsTimelineQuery {
|
|
|
134
146
|
total,
|
|
135
147
|
};
|
|
136
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
|
|
137
215
|
//#region ---- Custom Filter Handlers ----
|
|
138
216
|
/**
|
|
139
217
|
* Apply date range filter to subscriptions
|
|
@@ -154,10 +232,10 @@ class GetSubscriptionsTimelineQuery {
|
|
|
154
232
|
(subStartDate <= startDate && (!subEndDate || subEndDate >= endDate)));
|
|
155
233
|
});
|
|
156
234
|
}
|
|
157
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
158
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
235
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: GetSubscriptionsTimelineQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
236
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: GetSubscriptionsTimelineQuery, providedIn: 'root' }); }
|
|
159
237
|
}
|
|
160
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
238
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: GetSubscriptionsTimelineQuery, decorators: [{
|
|
161
239
|
type: Injectable,
|
|
162
240
|
args: [{
|
|
163
241
|
providedIn: 'root',
|
|
@@ -165,4 +243,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
|
|
|
165
243
|
}] });
|
|
166
244
|
|
|
167
245
|
export { GetSubscriptionsTimelineQuery };
|
|
168
|
-
//# sourceMappingURL=acorex-connectivity-mock-get-subscriptions-timeline.query-
|
|
246
|
+
//# sourceMappingURL=acorex-connectivity-mock-get-subscriptions-timeline.query-C_ecGCyk.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-connectivity-mock-get-subscriptions-timeline.query-C_ecGCyk.mjs","sources":["../../../../libs/connectivity/mock/src/lib/tenant-management/reports/get-subscriptions-timeline.query.ts"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { AXPQuery } from '@acorex/platform/runtime';\nimport { AXPEntityService } from '@acorex/platform/layout/entity';\nimport { AXMSubscriptionManagementSubscriptionEntityModel } from '@acorex/modules/subscription-management';\nimport { AXMTenantManagementTenantEntityModel } from '@acorex/modules/tenant-management';\nimport { AXPSystemStatusType } from '@acorex/platform/common';\nimport { RootConfig as SubscriptionRootConfig } from '@acorex/modules/subscription-management';\nimport { RootConfig as TenantRootConfig } from '@acorex/modules/tenant-management';\n\n//#region ---- Query Input/Output Types ----\n\nexport interface GetSubscriptionsTimelineQueryInput {\n skip?: number;\n take?: number;\n sort?: import('@acorex/platform/common').AXPQuerySort[];\n filters?: Array<{\n field: string;\n operator: { type: string };\n value: any;\n }>;\n logic?: 'and' | 'or';\n}\n\nexport interface SubscriptionsTimelineResult {\n subscriptionId: string;\n subscriptionTitle: string;\n tenantId: string;\n tenantName: string;\n planId?: string;\n planName: string;\n status: string;\n startDate: Date;\n startDateStr: string;\n endDate?: Date;\n endDateStr?: string;\n durationDays: number;\n month: string;\n monthNumber: number;\n quarter: string;\n year: number;\n isActive: boolean;\n}\n\nexport interface GetSubscriptionsTimelineQueryResult {\n items: SubscriptionsTimelineResult[];\n total: number;\n}\n\n//#endregion\n\n@Injectable({\n providedIn: 'root',\n})\nexport class GetSubscriptionsTimelineQuery\n implements AXPQuery<GetSubscriptionsTimelineQueryInput, GetSubscriptionsTimelineQueryResult>\n{\n private readonly entityService = inject(AXPEntityService);\n private subscriptionService = this.entityService\n .withEntity(`${SubscriptionRootConfig.module.name}.${SubscriptionRootConfig.entities.subscription.name}`)\n .data<string, AXMSubscriptionManagementSubscriptionEntityModel>();\n private tenantService = this.entityService\n .withEntity(`${TenantRootConfig.module.name}.${TenantRootConfig.entities.tenant.name}`)\n .data<string, AXMTenantManagementTenantEntityModel>();\n\n async fetch(input: GetSubscriptionsTimelineQueryInput | any): Promise<GetSubscriptionsTimelineQueryResult> {\n // Extract filters from AXPFilterClause format\n const extractedFilters = this.extractSubscriptionFilters(input.filters);\n const filterLogic = (input.filters as any)?.logic || input.logic || 'and';\n\n // Separate custom filters from entity filters\n const entityFilters: GetSubscriptionsTimelineQueryInput['filters'] = [];\n let dateRangeFilter: any;\n\n if (extractedFilters && extractedFilters.length > 0) {\n for (const filter of extractedFilters) {\n if (filter.field === 'dateRange') {\n dateRangeFilter = filter.value;\n } else {\n entityFilters.push(filter);\n }\n }\n }\n\n // Get all subscriptions\n const subscriptionsResult = await this.subscriptionService.query({\n skip: 0,\n take: 10000,\n filter:\n entityFilters.length > 0\n ? ({\n logic: filterLogic,\n filters: entityFilters,\n } as any)\n : undefined,\n });\n\n let subscriptions = subscriptionsResult.items.filter((s) => s.subscriberType === 'Tenant');\n\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\n // Apply date range filter if provided\n if (dateRangeFilter) {\n subscriptions = this.applyDateRangeFilter(subscriptions, dateRangeFilter);\n }\n\n const now = new Date();\n\n // Build results\n const results: SubscriptionsTimelineResult[] = [];\n\n for (const subscription of subscriptions) {\n const startDate = new Date(subscription.startDate);\n const endDate = subscription.endDate ? new Date(subscription.endDate) : undefined;\n\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\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\n // Check if subscription is currently active\n const isActive =\n subscription.statusId === AXPSystemStatusType.Active &&\n startDate <= now &&\n (!endDate || endDate >= now);\n\n // Get tenant name\n const tenant = tenantMap.get(subscription.subscriberId);\n\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\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.name as keyof SubscriptionsTimelineResult;\n const aValue = a[field];\n const bValue = b[field];\n const dir = sortField.dir === 'asc' ? 1 : -1;\n\n if (aValue === undefined && bValue === undefined) continue;\n if (aValue === undefined) return 1 * dir;\n if (bValue === undefined) return -1 * dir;\n\n // Handle date comparison\n if (field === 'startDate') {\n const aDate = a.startDate.getTime();\n const bDate = b.startDate.getTime();\n if (aDate < bDate) return -1 * dir;\n if (aDate > bDate) return 1 * dir;\n continue;\n }\n\n if (aValue < bValue) return -1 * dir;\n if (aValue > bValue) return 1 * dir;\n }\n return 0;\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\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\n return {\n items,\n total,\n };\n }\n\n //#region ---- Filter Extraction ----\n\n /**\n * Extract subscription-specific filters from AXPFilterClause format\n * Maps report parameter paths to subscription entity field names\n */\n private extractSubscriptionFilters(parameters: any): GetSubscriptionsTimelineQueryInput['filters'] {\n const filters: GetSubscriptionsTimelineQueryInput['filters'] = [];\n const paramsAny = parameters as any;\n\n if (!paramsAny?.filters || !Array.isArray(paramsAny.filters)) {\n return filters;\n }\n\n for (const filter of paramsAny.filters) {\n if (!filter?.field || filter?.value === undefined || filter?.value === null) {\n continue;\n }\n\n const field = filter.field;\n const value = filter.value;\n const operator = filter.operator || { type: 'equal' };\n\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 } else if (value) {\n filters.push({\n field: 'planId',\n operator: { type: 'equal' },\n value: value,\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 } 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 } else {\n // Direct field mapping\n filters.push({\n field: field,\n operator: operator,\n value: value,\n });\n }\n }\n\n return filters;\n }\n\n //#endregion\n\n //#region ---- Custom Filter Handlers ----\n\n /**\n * Apply date range filter to subscriptions\n */\n private applyDateRangeFilter(\n subscriptions: AXMSubscriptionManagementSubscriptionEntityModel[],\n dateRange: any\n ): AXMSubscriptionManagementSubscriptionEntityModel[] {\n if (!dateRange || !dateRange.start || !dateRange.end) {\n return subscriptions;\n }\n\n const startDate = new Date(dateRange.start);\n const endDate = new Date(dateRange.end);\n endDate.setHours(23, 59, 59, 999);\n\n return subscriptions.filter((subscription) => {\n const subStartDate = new Date(subscription.startDate);\n const subEndDate = subscription.endDate ? new Date(subscription.endDate) : null;\n\n // Check if subscription overlaps with the date range\n return (\n (subStartDate >= startDate && subStartDate <= endDate) ||\n (subEndDate && subEndDate >= startDate && subEndDate <= endDate) ||\n (subStartDate <= startDate && (!subEndDate || subEndDate >= endDate))\n );\n });\n }\n\n //#endregion\n}\n\n"],"names":["SubscriptionRootConfig","TenantRootConfig"],"mappings":"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"}
|
|
@@ -27,25 +27,37 @@ class GetTenantApplicationAccessQuery {
|
|
|
27
27
|
.data();
|
|
28
28
|
}
|
|
29
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
|
+
}
|
|
30
46
|
// Get all tenants
|
|
31
47
|
const tenantsResult = await this.tenantService.query({
|
|
32
48
|
skip: 0,
|
|
33
49
|
take: 10000,
|
|
34
|
-
filter:
|
|
50
|
+
filter: entityFilters.length > 0
|
|
35
51
|
? {
|
|
36
|
-
logic:
|
|
37
|
-
filters:
|
|
52
|
+
logic: filterLogic,
|
|
53
|
+
filters: entityFilters,
|
|
38
54
|
}
|
|
39
55
|
: undefined,
|
|
40
56
|
});
|
|
41
57
|
let tenants = tenantsResult.items;
|
|
42
58
|
// Apply date range filter if provided
|
|
43
|
-
if (
|
|
44
|
-
|
|
45
|
-
if (filter.field === 'dateRange' && filter.value) {
|
|
46
|
-
tenants = this.applyDateRangeFilter(tenants, filter.value);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
59
|
+
if (dateRangeFilter) {
|
|
60
|
+
tenants = this.applyDateRangeFilter(tenants, dateRangeFilter);
|
|
49
61
|
}
|
|
50
62
|
// Get all subscriptions
|
|
51
63
|
const subscriptionsResult = await this.subscriptionService.query({
|
|
@@ -116,7 +128,7 @@ class GetTenantApplicationAccessQuery {
|
|
|
116
128
|
if (input.sort && input.sort.length > 0) {
|
|
117
129
|
results.sort((a, b) => {
|
|
118
130
|
for (const sortField of input.sort) {
|
|
119
|
-
const field = sortField.
|
|
131
|
+
const field = sortField.name;
|
|
120
132
|
const aValue = a[field];
|
|
121
133
|
const bValue = b[field];
|
|
122
134
|
const dir = sortField.dir === 'asc' ? 1 : -1;
|
|
@@ -148,6 +160,72 @@ class GetTenantApplicationAccessQuery {
|
|
|
148
160
|
total,
|
|
149
161
|
};
|
|
150
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
|
|
151
229
|
//#region ---- Custom Filter Handlers ----
|
|
152
230
|
/**
|
|
153
231
|
* Apply date range filter to tenants
|
|
@@ -166,10 +244,10 @@ class GetTenantApplicationAccessQuery {
|
|
|
166
244
|
return regDate >= startDate && regDate <= endDate;
|
|
167
245
|
});
|
|
168
246
|
}
|
|
169
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
170
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
247
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: GetTenantApplicationAccessQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
248
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: GetTenantApplicationAccessQuery, providedIn: 'root' }); }
|
|
171
249
|
}
|
|
172
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
250
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: GetTenantApplicationAccessQuery, decorators: [{
|
|
173
251
|
type: Injectable,
|
|
174
252
|
args: [{
|
|
175
253
|
providedIn: 'root',
|
|
@@ -177,4 +255,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
|
|
|
177
255
|
}] });
|
|
178
256
|
|
|
179
257
|
export { GetTenantApplicationAccessQuery };
|
|
180
|
-
//# sourceMappingURL=acorex-connectivity-mock-get-tenant-application-access.query-
|
|
258
|
+
//# sourceMappingURL=acorex-connectivity-mock-get-tenant-application-access.query-t4BHU8qk.mjs.map
|
package/fesm2022/acorex-connectivity-mock-get-tenant-application-access.query-t4BHU8qk.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-connectivity-mock-get-tenant-application-access.query-t4BHU8qk.mjs","sources":["../../../../libs/connectivity/mock/src/lib/tenant-management/reports/get-tenant-application-access.query.ts"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { AXPQuery } from '@acorex/platform/runtime';\nimport { AXPEntityService } from '@acorex/platform/layout/entity';\nimport { AXMTenantManagementTenantEntityModel } from '@acorex/modules/tenant-management';\nimport { AXMSubscriptionManagementSubscriptionEntityModel } from '@acorex/modules/subscription-management';\nimport { AXMSubscriptionManagementSubscriptionPlanEntityModel } from '@acorex/modules/subscription-management';\nimport { AXMSubscriptionManagementSubscriptionPlanItemEntityModel } from '@acorex/modules/subscription-management';\nimport { AXMApplicationManagementApplicationEntityModel } from '@acorex/modules/application-management';\nimport { AXPSystemStatusType } from '@acorex/platform/common';\nimport { RootConfig as TenantRootConfig } from '@acorex/modules/tenant-management';\nimport { RootConfig as SubscriptionRootConfig } from '@acorex/modules/subscription-management';\nimport { RootConfig as ApplicationRootConfig } from '@acorex/modules/application-management';\n\n//#region ---- Query Input/Output Types ----\n\nexport interface GetTenantApplicationAccessQueryInput {\n skip?: number;\n take?: number;\n sort?: import('@acorex/platform/common').AXPQuerySort[];\n filters?: Array<{\n field: string;\n operator: { type: string };\n value: any;\n }>;\n logic?: 'and' | 'or';\n}\n\nexport interface TenantApplicationAccessResult {\n tenantId: string;\n tenantName: string;\n tenantStatus: string;\n subscriptionCount: number;\n applicationsCount: number;\n applicationsList: string;\n activeSubscriptionsCount: number;\n registrationDate?: Date;\n registrationDateStr?: string;\n}\n\nexport interface GetTenantApplicationAccessQueryResult {\n items: TenantApplicationAccessResult[];\n total: number;\n}\n\n//#endregion\n\n@Injectable({\n providedIn: 'root',\n})\nexport class GetTenantApplicationAccessQuery\n implements AXPQuery<GetTenantApplicationAccessQueryInput, GetTenantApplicationAccessQueryResult> {\n private readonly entityService = inject(AXPEntityService);\n private tenantService = this.entityService\n .withEntity(`${TenantRootConfig.module.name}.${TenantRootConfig.entities.tenant.name}`)\n .data<string, AXMTenantManagementTenantEntityModel>();\n private subscriptionService = this.entityService\n .withEntity(`${SubscriptionRootConfig.module.name}.${SubscriptionRootConfig.entities.subscription.name}`)\n .data<string, AXMSubscriptionManagementSubscriptionEntityModel>();\n private planService = this.entityService\n .withEntity(`${SubscriptionRootConfig.module.name}.${SubscriptionRootConfig.entities.subscriptionPlan.name}`)\n .data<string, AXMSubscriptionManagementSubscriptionPlanEntityModel>();\n private planItemService = this.entityService\n .withEntity(`${SubscriptionRootConfig.module.name}.${SubscriptionRootConfig.entities.subscriptionPlanItem.name}`)\n .data<string, AXMSubscriptionManagementSubscriptionPlanItemEntityModel>();\n private applicationService = this.entityService\n .withEntity(`${ApplicationRootConfig.module.name}.${ApplicationRootConfig.entities.application.name}`)\n .data<string, AXMApplicationManagementApplicationEntityModel>();\n\n async fetch(input: GetTenantApplicationAccessQueryInput | any): Promise<GetTenantApplicationAccessQueryResult> {\n // Extract filters from AXPFilterClause format\n const extractedFilters = this.extractTenantFilters(input.filters);\n const filterLogic = (input.filters as any)?.logic || input.logic || 'and';\n\n // Separate custom filters from entity filters\n const entityFilters: GetTenantApplicationAccessQueryInput['filters'] = [];\n let dateRangeFilter: any;\n\n if (extractedFilters && extractedFilters.length > 0) {\n for (const filter of extractedFilters) {\n if (filter.field === 'dateRange') {\n dateRangeFilter = filter.value;\n } else {\n entityFilters.push(filter);\n }\n }\n }\n\n // Get all tenants\n const tenantsResult = await this.tenantService.query({\n skip: 0,\n take: 10000,\n filter:\n entityFilters.length > 0\n ? ({\n logic: filterLogic,\n filters: entityFilters,\n } as any)\n : undefined,\n });\n\n let tenants = tenantsResult.items;\n\n // Apply date range filter if provided\n if (dateRangeFilter) {\n tenants = this.applyDateRangeFilter(tenants, dateRangeFilter);\n }\n\n // Get all subscriptions\n const subscriptionsResult = await this.subscriptionService.query({\n skip: 0,\n take: 10000,\n });\n const subscriptions = subscriptionsResult.items.filter((s) => s.subscriberType === 'Tenant');\n\n // Get all plans\n const plansResult = await this.planService.query({\n skip: 0,\n take: 10000,\n });\n const plans = plansResult.items;\n\n // Get all plan items\n const planItemsResult = await this.planItemService.query({\n skip: 0,\n take: 10000,\n });\n const planItems = planItemsResult.items;\n\n // Get all applications\n const applicationsResult = await this.applicationService.query({\n skip: 0,\n take: 10000,\n });\n const applications = applicationsResult.items;\n\n // Build results for each tenant\n const results: TenantApplicationAccessResult[] = [];\n\n for (const tenant of tenants) {\n // Get tenant's subscriptions\n const tenantSubscriptions = subscriptions.filter((s) => s.subscriberId === tenant.id);\n\n // Get unique applications through subscriptions → plans → plan items → editions → applications\n const applicationSet = new Set<string>();\n const applicationNames: string[] = [];\n\n for (const subscription of tenantSubscriptions) {\n if (!subscription.planId) continue;\n\n // Get plan items for this plan\n const planPlanItems = planItems.filter((pi) => pi.planId === subscription.planId);\n\n for (const planItem of planPlanItems) {\n if (!planItem.editionId) continue;\n\n // Find applications that have this edition\n for (const application of applications) {\n if (application.editionIds && application.editionIds.includes(planItem.editionId)) {\n if (!applicationSet.has(application.id)) {\n applicationSet.add(application.id);\n applicationNames.push(application.title);\n }\n }\n }\n }\n }\n\n // Count active subscriptions\n const activeSubscriptions = tenantSubscriptions.filter(\n (s) => s.statusId === AXPSystemStatusType.Active\n );\n\n results.push({\n tenantId: tenant.id,\n tenantName: tenant.title,\n tenantStatus: tenant.statusId || 'Unknown',\n subscriptionCount: tenantSubscriptions.length,\n applicationsCount: applicationSet.size,\n applicationsList: applicationNames.join(', '),\n activeSubscriptionsCount: activeSubscriptions.length,\n registrationDate: tenant.registrationDate,\n registrationDateStr: tenant.registrationDate?.toISOString(),\n });\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.name as keyof TenantApplicationAccessResult;\n const aValue = a[field];\n const bValue = b[field];\n const dir = sortField.dir === 'asc' ? 1 : -1;\n\n if (aValue === undefined && bValue === undefined) continue;\n if (aValue === undefined) return 1 * dir;\n if (bValue === undefined) return -1 * dir;\n\n if (aValue < bValue) return -1 * dir;\n if (aValue > bValue) return 1 * dir;\n }\n return 0;\n });\n } else {\n // Default sort by tenant name\n results.sort((a, b) => a.tenantName.localeCompare(b.tenantName));\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\n return {\n items,\n total,\n };\n }\n\n //#region ---- Filter Extraction ----\n\n /**\n * Extract tenant-specific filters from AXPFilterClause format\n * Maps report parameter paths to tenant entity field names\n */\n private extractTenantFilters(parameters: any): GetTenantApplicationAccessQueryInput['filters'] {\n const filters: GetTenantApplicationAccessQueryInput['filters'] = [];\n const paramsAny = parameters as any;\n\n if (!paramsAny?.filters || !Array.isArray(paramsAny.filters)) {\n return filters;\n }\n\n for (const filter of paramsAny.filters) {\n if (!filter?.field || filter?.value === undefined || filter?.value === null) {\n continue;\n }\n\n const field = filter.field;\n const value = filter.value;\n const operator = filter.operator || { type: 'equal' };\n\n // Handle tenant-specific field mappings\n if (field === 'tenantId') {\n // Tenant ID filter - can be array of IDs or single ID\n if (Array.isArray(value) && value.length > 0) {\n filters.push({\n field: 'id',\n operator: { type: 'in' },\n value: value,\n });\n } else if (value) {\n filters.push({\n field: 'id',\n operator: { type: 'equal' },\n value: value,\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 } 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 } else {\n // Direct field mapping\n filters.push({\n field: field,\n operator: operator,\n value: value,\n });\n }\n }\n\n return filters;\n }\n\n //#endregion\n\n //#region ---- Custom Filter Handlers ----\n\n /**\n * Apply date range filter to tenants\n */\n private applyDateRangeFilter(\n tenants: AXMTenantManagementTenantEntityModel[],\n dateRange: any\n ): AXMTenantManagementTenantEntityModel[] {\n if (!dateRange || !dateRange.start || !dateRange.end) {\n return tenants;\n }\n\n const startDate = new Date(dateRange.start);\n const endDate = new Date(dateRange.end);\n endDate.setHours(23, 59, 59, 999);\n\n return tenants.filter((tenant) => {\n if (!tenant.registrationDate) return false;\n const regDate = new Date(tenant.registrationDate);\n return regDate >= startDate && regDate <= endDate;\n });\n }\n\n //#endregion\n}\n\n"],"names":["TenantRootConfig","SubscriptionRootConfig","ApplicationRootConfig"],"mappings":";;;;;;;;AA4CA;MAKa,+BAA+B,CAAA;AAH5C,IAAA,WAAA,GAAA;AAKmB,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACjD,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC;AAC1B,aAAA,UAAU,CAAC,CAAA,EAAGA,UAAgB,CAAC,MAAM,CAAC,IAAI,CAAA,CAAA,EAAIA,UAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE;AACrF,aAAA,IAAI,EAAgD;QAC/C,IAAA,CAAA,mBAAmB,GAAG,IAAI,CAAC;AAChC,aAAA,UAAU,CAAC,CAAA,EAAGC,YAAsB,CAAC,MAAM,CAAC,IAAI,CAAA,CAAA,EAAIA,YAAsB,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE;AACvG,aAAA,IAAI,EAA4D;QAC3D,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC;AACxB,aAAA,UAAU,CAAC,CAAA,EAAGA,YAAsB,CAAC,MAAM,CAAC,IAAI,CAAA,CAAA,EAAIA,YAAsB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE;AAC3G,aAAA,IAAI,EAAgE;QAC/D,IAAA,CAAA,eAAe,GAAG,IAAI,CAAC;AAC5B,aAAA,UAAU,CAAC,CAAA,EAAGA,YAAsB,CAAC,MAAM,CAAC,IAAI,CAAA,CAAA,EAAIA,YAAsB,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,EAAE;AAC/G,aAAA,IAAI,EAAoE;QACnE,IAAA,CAAA,kBAAkB,GAAG,IAAI,CAAC;AAC/B,aAAA,UAAU,CAAC,CAAA,EAAGC,YAAqB,CAAC,MAAM,CAAC,IAAI,CAAA,CAAA,EAAIA,YAAqB,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE;AACpG,aAAA,IAAI,EAA0D;AAyPlE,IAAA;IAvPC,MAAM,KAAK,CAAC,KAAiD,EAAA;;QAE3D,MAAM,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC;AACjE,QAAA,MAAM,WAAW,GAAI,KAAK,CAAC,OAAe,EAAE,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK;;QAGzE,MAAM,aAAa,GAAoD,EAAE;AACzE,QAAA,IAAI,eAAoB;QAExB,IAAI,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;AACnD,YAAA,KAAK,MAAM,MAAM,IAAI,gBAAgB,EAAE;AACrC,gBAAA,IAAI,MAAM,CAAC,KAAK,KAAK,WAAW,EAAE;AAChC,oBAAA,eAAe,GAAG,MAAM,CAAC,KAAK;gBAChC;qBAAO;AACL,oBAAA,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC5B;YACF;QACF;;QAGA,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;AACnD,YAAA,IAAI,EAAE,CAAC;AACP,YAAA,IAAI,EAAE,KAAK;AACX,YAAA,MAAM,EACJ,aAAa,CAAC,MAAM,GAAG;AACrB,kBAAG;AACD,oBAAA,KAAK,EAAE,WAAW;AAClB,oBAAA,OAAO,EAAE,aAAa;AACf;AACT,kBAAE,SAAS;AAChB,SAAA,CAAC;AAEF,QAAA,IAAI,OAAO,GAAG,aAAa,CAAC,KAAK;;QAGjC,IAAI,eAAe,EAAE;YACnB,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,eAAe,CAAC;QAC/D;;QAGA,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;AAC/D,YAAA,IAAI,EAAE,CAAC;AACP,YAAA,IAAI,EAAE,KAAK;AACZ,SAAA,CAAC;AACF,QAAA,MAAM,aAAa,GAAG,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,cAAc,KAAK,QAAQ,CAAC;;QAG5F,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC/C,YAAA,IAAI,EAAE,CAAC;AACP,YAAA,IAAI,EAAE,KAAK;AACZ,SAAA,CAAC;AACF,QAAA,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK;;QAG/B,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;AACvD,YAAA,IAAI,EAAE,CAAC;AACP,YAAA,IAAI,EAAE,KAAK;AACZ,SAAA,CAAC;AACF,QAAA,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK;;QAGvC,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAC7D,YAAA,IAAI,EAAE,CAAC;AACP,YAAA,IAAI,EAAE,KAAK;AACZ,SAAA,CAAC;AACF,QAAA,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK;;QAG7C,MAAM,OAAO,GAAoC,EAAE;AAEnD,QAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;;AAE5B,YAAA,MAAM,mBAAmB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,MAAM,CAAC,EAAE,CAAC;;AAGrF,YAAA,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU;YACxC,MAAM,gBAAgB,GAAa,EAAE;AAErC,YAAA,KAAK,MAAM,YAAY,IAAI,mBAAmB,EAAE;gBAC9C,IAAI,CAAC,YAAY,CAAC,MAAM;oBAAE;;AAG1B,gBAAA,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,CAAC;AAEjF,gBAAA,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE;oBACpC,IAAI,CAAC,QAAQ,CAAC,SAAS;wBAAE;;AAGzB,oBAAA,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE;AACtC,wBAAA,IAAI,WAAW,CAAC,UAAU,IAAI,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;4BACjF,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE;AACvC,gCAAA,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;AAClC,gCAAA,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;4BAC1C;wBACF;oBACF;gBACF;YACF;;AAGA,YAAA,MAAM,mBAAmB,GAAG,mBAAmB,CAAC,MAAM,CACpD,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,mBAAmB,CAAC,MAAM,CACjD;YAED,OAAO,CAAC,IAAI,CAAC;gBACX,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,UAAU,EAAE,MAAM,CAAC,KAAK;AACxB,gBAAA,YAAY,EAAE,MAAM,CAAC,QAAQ,IAAI,SAAS;gBAC1C,iBAAiB,EAAE,mBAAmB,CAAC,MAAM;gBAC7C,iBAAiB,EAAE,cAAc,CAAC,IAAI;AACtC,gBAAA,gBAAgB,EAAE,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC7C,wBAAwB,EAAE,mBAAmB,CAAC,MAAM;gBACpD,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;AACzC,gBAAA,mBAAmB,EAAE,MAAM,CAAC,gBAAgB,EAAE,WAAW,EAAE;AAC5D,aAAA,CAAC;QACJ;;AAGA,QAAA,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACpB,gBAAA,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,IAAK,EAAE;AACnC,oBAAA,MAAM,KAAK,GAAG,SAAS,CAAC,IAA2C;AACnE,oBAAA,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC;AACvB,oBAAA,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC;AACvB,oBAAA,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,KAAK,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;AAE5C,oBAAA,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;wBAAE;oBAClD,IAAI,MAAM,KAAK,SAAS;wBAAE,OAAO,CAAC,GAAG,GAAG;oBACxC,IAAI,MAAM,KAAK,SAAS;AAAE,wBAAA,OAAO,CAAC,CAAC,GAAG,GAAG;oBAEzC,IAAI,MAAM,GAAG,MAAM;AAAE,wBAAA,OAAO,CAAC,CAAC,GAAG,GAAG;oBACpC,IAAI,MAAM,GAAG,MAAM;wBAAE,OAAO,CAAC,GAAG,GAAG;gBACrC;AACA,gBAAA,OAAO,CAAC;AACV,YAAA,CAAC,CAAC;QACJ;aAAO;;YAEL,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAClE;;AAGA,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC;AAC5B,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE;AAC7B,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM;AAC5B,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;QAE9C,OAAO;YACL,KAAK;YACL,KAAK;SACN;IACH;;AAIA;;;AAGG;AACK,IAAA,oBAAoB,CAAC,UAAe,EAAA;QAC1C,MAAM,OAAO,GAAoD,EAAE;QACnE,MAAM,SAAS,GAAG,UAAiB;AAEnC,QAAA,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;AAC5D,YAAA,OAAO,OAAO;QAChB;AAEA,QAAA,KAAK,MAAM,MAAM,IAAI,SAAS,CAAC,OAAO,EAAE;AACtC,YAAA,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,MAAM,EAAE,KAAK,KAAK,SAAS,IAAI,MAAM,EAAE,KAAK,KAAK,IAAI,EAAE;gBAC3E;YACF;AAEA,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK;AAC1B,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK;YAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE;;AAGrD,YAAA,IAAI,KAAK,KAAK,UAAU,EAAE;;AAExB,gBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC5C,OAAO,CAAC,IAAI,CAAC;AACX,wBAAA,KAAK,EAAE,IAAI;AACX,wBAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;AACxB,wBAAA,KAAK,EAAE,KAAK;AACb,qBAAA,CAAC;gBACJ;qBAAO,IAAI,KAAK,EAAE;oBAChB,OAAO,CAAC,IAAI,CAAC;AACX,wBAAA,KAAK,EAAE,IAAI;AACX,wBAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;AAC3B,wBAAA,KAAK,EAAE,KAAK;AACb,qBAAA,CAAC;gBACJ;YACF;AAAO,iBAAA,IAAI,KAAK,KAAK,UAAU,EAAE;;AAE/B,gBAAA,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,EAAE;oBAC5B,OAAO,CAAC,IAAI,CAAC;AACX,wBAAA,KAAK,EAAE,UAAU;AACjB,wBAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;AAC3B,wBAAA,KAAK,EAAE,KAAK;AACb,qBAAA,CAAC;gBACJ;YACF;AAAO,iBAAA,IAAI,KAAK,KAAK,WAAW,EAAE;;gBAEhC,OAAO,CAAC,IAAI,CAAC;AACX,oBAAA,KAAK,EAAE,WAAW;AAClB,oBAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;AAC3B,oBAAA,KAAK,EAAE,KAAK;AACb,iBAAA,CAAC;YACJ;iBAAO;;gBAEL,OAAO,CAAC,IAAI,CAAC;AACX,oBAAA,KAAK,EAAE,KAAK;AACZ,oBAAA,QAAQ,EAAE,QAAQ;AAClB,oBAAA,KAAK,EAAE,KAAK;AACb,iBAAA,CAAC;YACJ;QACF;AAEA,QAAA,OAAO,OAAO;IAChB;;;AAMA;;AAEG;IACK,oBAAoB,CAC1B,OAA+C,EAC/C,SAAc,EAAA;AAEd,QAAA,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE;AACpD,YAAA,OAAO,OAAO;QAChB;QAEA,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;QACvC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;AAEjC,QAAA,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,KAAI;YAC/B,IAAI,CAAC,MAAM,CAAC,gBAAgB;AAAE,gBAAA,OAAO,KAAK;YAC1C,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;AACjD,YAAA,OAAO,OAAO,IAAI,SAAS,IAAI,OAAO,IAAI,OAAO;AACnD,QAAA,CAAC,CAAC;IACJ;8GAvQW,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAA/B,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,+BAA+B,cAF9B,MAAM,EAAA,CAAA,CAAA;;2FAEP,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAH3C,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { inject, Injectable } from '@angular/core';
|
|
3
|
-
import { GetTenantRegistrationTimelineQuery } from './acorex-connectivity-mock-get-tenant-registration-timeline.query-
|
|
3
|
+
import { GetTenantRegistrationTimelineQuery } from './acorex-connectivity-mock-get-tenant-registration-timeline.query-COmTsDCV.mjs';
|
|
4
4
|
|
|
5
5
|
//#endregion
|
|
6
6
|
class GetTenantRegistrationChartDataQuery {
|
|
@@ -42,10 +42,10 @@ class GetTenantRegistrationChartDataQuery {
|
|
|
42
42
|
items: results,
|
|
43
43
|
};
|
|
44
44
|
}
|
|
45
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
46
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
45
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: GetTenantRegistrationChartDataQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
46
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: GetTenantRegistrationChartDataQuery, providedIn: 'root' }); }
|
|
47
47
|
}
|
|
48
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
48
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: GetTenantRegistrationChartDataQuery, decorators: [{
|
|
49
49
|
type: Injectable,
|
|
50
50
|
args: [{
|
|
51
51
|
providedIn: 'root',
|
|
@@ -53,4 +53,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
|
|
|
53
53
|
}] });
|
|
54
54
|
|
|
55
55
|
export { GetTenantRegistrationChartDataQuery };
|
|
56
|
-
//# sourceMappingURL=acorex-connectivity-mock-get-tenant-registration-chart-data.query-
|
|
56
|
+
//# sourceMappingURL=acorex-connectivity-mock-get-tenant-registration-chart-data.query-CgMZxfzh.mjs.map
|
package/fesm2022/acorex-connectivity-mock-get-tenant-registration-chart-data.query-CgMZxfzh.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-connectivity-mock-get-tenant-registration-chart-data.query-CgMZxfzh.mjs","sources":["../../../../libs/connectivity/mock/src/lib/tenant-management/reports/get-tenant-registration-chart-data.query.ts"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { AXPQuery } from '@acorex/platform/runtime';\nimport { GetTenantRegistrationTimelineQueryInput } from './get-tenant-registration-timeline.query';\nimport { GetTenantRegistrationTimelineQuery } from './get-tenant-registration-timeline.query';\n\n//#region ---- Query Input/Output Types ----\n\nexport interface GetTenantRegistrationChartDataQueryInput {\n filters?: Array<{\n field: string;\n operator: { type: string };\n value: any;\n }>;\n logic?: 'and' | 'or';\n}\n\nexport interface TenantRegistrationChartDataResult {\n month: string;\n year: number;\n quarter: string;\n tenantCount: number;\n}\n\nexport interface GetTenantRegistrationChartDataQueryResult {\n items: TenantRegistrationChartDataResult[];\n}\n\n//#endregion\n\n@Injectable({\n providedIn: 'root',\n})\nexport class GetTenantRegistrationChartDataQuery\n implements AXPQuery<GetTenantRegistrationChartDataQueryInput, GetTenantRegistrationChartDataQueryResult>\n{\n private readonly tenantRegistrationTimelineQuery = inject(GetTenantRegistrationTimelineQuery);\n\n async fetch(input: GetTenantRegistrationChartDataQueryInput | any): Promise<GetTenantRegistrationChartDataQueryResult> {\n // Get all tenant registration timeline data (no pagination for charts)\n const timelineResult = await this.tenantRegistrationTimelineQuery.fetch({\n skip: 0,\n take: 10000,\n filters: input.filters,\n logic: input.logic,\n });\n\n // Group by month\n const monthGroups = new Map<string, TenantRegistrationChartDataResult>();\n\n for (const item of timelineResult.items) {\n const monthKey = `${item.year}-${String(item.monthNumber).padStart(2, '0')}`;\n\n if (!monthGroups.has(monthKey)) {\n monthGroups.set(monthKey, {\n month: item.month,\n year: item.year,\n quarter: item.quarter,\n tenantCount: 0,\n });\n }\n\n const group = monthGroups.get(monthKey)!;\n group.tenantCount++;\n }\n\n // Convert to array and sort by date\n const results = Array.from(monthGroups.values()).sort((a, b) => {\n if (a.year !== b.year) return a.year - b.year;\n const monthA = new Date(`${a.month} 1, ${a.year}`).getMonth();\n const monthB = new Date(`${b.month} 1, ${b.year}`).getMonth();\n return monthA - monthB;\n });\n\n return {\n items: results,\n };\n }\n}\n\n"],"names":[],"mappings":";;;;AA2BA;MAKa,mCAAmC,CAAA;AAHhD,IAAA,WAAA,GAAA;AAMmB,QAAA,IAAA,CAAA,+BAA+B,GAAG,MAAM,CAAC,kCAAkC,CAAC;AA0C9F,IAAA;IAxCC,MAAM,KAAK,CAAC,KAAqD,EAAA;;QAE/D,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,+BAA+B,CAAC,KAAK,CAAC;AACtE,YAAA,IAAI,EAAE,CAAC;AACP,YAAA,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,KAAK,CAAC,KAAK;AACnB,SAAA,CAAC;;AAGF,QAAA,MAAM,WAAW,GAAG,IAAI,GAAG,EAA6C;AAExE,QAAA,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,KAAK,EAAE;YACvC,MAAM,QAAQ,GAAG,CAAA,EAAG,IAAI,CAAC,IAAI,CAAA,CAAA,EAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,CAAE;YAE5E,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AAC9B,gBAAA,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE;oBACxB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,oBAAA,WAAW,EAAE,CAAC;AACf,iBAAA,CAAC;YACJ;YAEA,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAE;YACxC,KAAK,CAAC,WAAW,EAAE;QACrB;;AAGA,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AAC7D,YAAA,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;AAAE,gBAAA,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI;AAC7C,YAAA,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,CAAA,EAAG,CAAC,CAAC,KAAK,CAAA,IAAA,EAAO,CAAC,CAAC,IAAI,CAAA,CAAE,CAAC,CAAC,QAAQ,EAAE;AAC7D,YAAA,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,CAAA,EAAG,CAAC,CAAC,KAAK,CAAA,IAAA,EAAO,CAAC,CAAC,IAAI,CAAA,CAAE,CAAC,CAAC,QAAQ,EAAE;YAC7D,OAAO,MAAM,GAAG,MAAM;AACxB,QAAA,CAAC,CAAC;QAEF,OAAO;AACL,YAAA,KAAK,EAAE,OAAO;SACf;IACH;8GA5CW,mCAAmC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAnC,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mCAAmC,cAFlC,MAAM,EAAA,CAAA,CAAA;;2FAEP,mCAAmC,EAAA,UAAA,EAAA,CAAA;kBAH/C,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;;;"}
|