@golemio/energetics 1.13.1-dev.2773070597 → 1.13.1-dev.2809036872

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.
Files changed (36) hide show
  1. package/db/migrations/postgresql/20260821090000-enapo-gid-mapping-sync-comment.js +53 -0
  2. package/db/migrations/postgresql/20260827090000-enapo-gid-mapping-pk.js +53 -0
  3. package/db/migrations/postgresql/sqls/20260821090000-enapo-gid-mapping-sync-comment-down.sql +3 -0
  4. package/db/migrations/postgresql/sqls/20260821090000-enapo-gid-mapping-sync-comment-up.sql +4 -0
  5. package/db/migrations/postgresql/sqls/20260827090000-enapo-gid-mapping-pk-down.sql +4 -0
  6. package/db/migrations/postgresql/sqls/20260827090000-enapo-gid-mapping-pk-up.sql +17 -0
  7. package/db/scripts/ded_gid_mapping_mock_import.sql +4 -1
  8. package/dist/integration-engine/enapo/datasources/gid-mapping/EnapoGidMappingDataSource.d.ts +14 -0
  9. package/dist/integration-engine/enapo/datasources/gid-mapping/EnapoGidMappingDataSource.js +56 -0
  10. package/dist/integration-engine/enapo/datasources/gid-mapping/EnapoGidMappingDataSource.js.map +1 -0
  11. package/dist/integration-engine/enapo/helpers/EnapoGidMappingNormalizer.d.ts +43 -0
  12. package/dist/integration-engine/enapo/helpers/EnapoGidMappingNormalizer.js +193 -0
  13. package/dist/integration-engine/enapo/helpers/EnapoGidMappingNormalizer.js.map +1 -0
  14. package/dist/integration-engine/enapo/ioc/Di.js +11 -3
  15. package/dist/integration-engine/enapo/ioc/Di.js.map +1 -1
  16. package/dist/integration-engine/enapo/ioc/EnapoWorkerContainerToken.d.ts +4 -0
  17. package/dist/integration-engine/enapo/ioc/EnapoWorkerContainerToken.js +4 -0
  18. package/dist/integration-engine/enapo/ioc/EnapoWorkerContainerToken.js.map +1 -1
  19. package/dist/integration-engine/enapo/repositories/EnapoGidMappingRepository.d.ts +13 -0
  20. package/dist/integration-engine/enapo/repositories/EnapoGidMappingRepository.js +42 -0
  21. package/dist/integration-engine/enapo/repositories/EnapoGidMappingRepository.js.map +1 -0
  22. package/dist/integration-engine/enapo/workers/EnapoWorker.js +1 -0
  23. package/dist/integration-engine/enapo/workers/EnapoWorker.js.map +1 -1
  24. package/dist/integration-engine/enapo/workers/task/EnapoGidMappingSyncTask.d.ts +45 -0
  25. package/dist/integration-engine/enapo/workers/task/EnapoGidMappingSyncTask.js +121 -0
  26. package/dist/integration-engine/enapo/workers/task/EnapoGidMappingSyncTask.js.map +1 -0
  27. package/dist/schema-definitions/datasources/enapo/gid-mapping/EnapoGidMappingCsvSchema.d.ts +3 -0
  28. package/dist/schema-definitions/datasources/enapo/gid-mapping/EnapoGidMappingCsvSchema.js +23 -0
  29. package/dist/schema-definitions/datasources/enapo/gid-mapping/EnapoGidMappingCsvSchema.js.map +1 -0
  30. package/dist/schema-definitions/datasources/enapo/gid-mapping/interfaces/IEnapoGidMappingCsvRow.d.ts +15 -0
  31. package/dist/schema-definitions/datasources/enapo/gid-mapping/interfaces/IEnapoGidMappingCsvRow.js +3 -0
  32. package/dist/schema-definitions/datasources/enapo/gid-mapping/interfaces/IEnapoGidMappingCsvRow.js.map +1 -0
  33. package/dist/schema-definitions/models/enapo/EnapoGidMappingModel.js +0 -1
  34. package/dist/schema-definitions/models/enapo/EnapoGidMappingModel.js.map +1 -1
  35. package/docs/implementation_documentation.md +36 -2
  36. package/package.json +1 -1
@@ -0,0 +1,53 @@
1
+ 'use strict';
2
+
3
+ var dbm;
4
+ var type;
5
+ var seed;
6
+ var fs = require('fs');
7
+ var path = require('path');
8
+ var Promise;
9
+
10
+ /**
11
+ * We receive the dbmigrate dependency from dbmigrate initially.
12
+ * This enables us to not have to rely on NODE_PATH.
13
+ */
14
+ exports.setup = function(options, seedLink) {
15
+ dbm = options.dbmigrate;
16
+ type = dbm.dataType;
17
+ seed = seedLink;
18
+ Promise = options.Promise;
19
+ };
20
+
21
+ exports.up = function(db) {
22
+ var filePath = path.join(__dirname, 'sqls', '20260821090000-enapo-gid-mapping-sync-comment-up.sql');
23
+ return new Promise( function( resolve, reject ) {
24
+ fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
25
+ if (err) return reject(err);
26
+ console.log('received data: ' + data);
27
+
28
+ resolve(data);
29
+ });
30
+ })
31
+ .then(function(data) {
32
+ return db.runSql(data);
33
+ });
34
+ };
35
+
36
+ exports.down = function(db) {
37
+ var filePath = path.join(__dirname, 'sqls', '20260821090000-enapo-gid-mapping-sync-comment-down.sql');
38
+ return new Promise( function( resolve, reject ) {
39
+ fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
40
+ if (err) return reject(err);
41
+ console.log('received data: ' + data);
42
+
43
+ resolve(data);
44
+ });
45
+ })
46
+ .then(function(data) {
47
+ return db.runSql(data);
48
+ });
49
+ };
50
+
51
+ exports._meta = {
52
+ "version": 1
53
+ };
@@ -0,0 +1,53 @@
1
+ 'use strict';
2
+
3
+ var dbm;
4
+ var type;
5
+ var seed;
6
+ var fs = require('fs');
7
+ var path = require('path');
8
+ var Promise;
9
+
10
+ /**
11
+ * We receive the dbmigrate dependency from dbmigrate initially.
12
+ * This enables us to not have to rely on NODE_PATH.
13
+ */
14
+ exports.setup = function(options, seedLink) {
15
+ dbm = options.dbmigrate;
16
+ type = dbm.dataType;
17
+ seed = seedLink;
18
+ Promise = options.Promise;
19
+ };
20
+
21
+ exports.up = function(db) {
22
+ var filePath = path.join(__dirname, 'sqls', '20260827090000-enapo-gid-mapping-pk-up.sql');
23
+ return new Promise( function( resolve, reject ) {
24
+ fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
25
+ if (err) return reject(err);
26
+ console.log('received data: ' + data);
27
+
28
+ resolve(data);
29
+ });
30
+ })
31
+ .then(function(data) {
32
+ return db.runSql(data);
33
+ });
34
+ };
35
+
36
+ exports.down = function(db) {
37
+ var filePath = path.join(__dirname, 'sqls', '20260827090000-enapo-gid-mapping-pk-down.sql');
38
+ return new Promise( function( resolve, reject ) {
39
+ fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
40
+ if (err) return reject(err);
41
+ console.log('received data: ' + data);
42
+
43
+ resolve(data);
44
+ });
45
+ })
46
+ .then(function(data) {
47
+ return db.runSql(data);
48
+ });
49
+ };
50
+
51
+ exports._meta = {
52
+ "version": 1
53
+ };
@@ -0,0 +1,3 @@
1
+ -- Restores the comment as it was created by 20260807090000-enapo-gid-mapping-om-detail-up.sql.
2
+
3
+ COMMENT ON TABLE enapo_gid_mapping IS 'Mapping of consumption points (EAN/EIC) to ENO building GIDs. Module-owned contract; currently seeded with mock data (link_source = ''mock''), the future sync task from the data-team dbt output (tmp.ded_gid_mapping) will use link_source = ''energobroker_kod_eno''.';
@@ -0,0 +1,4 @@
1
+ -- The mapping table is no longer mock-only: EnapoGidMappingSyncTask fills it daily from the
2
+ -- ded_gid_mapping CSV export. Only the table comment changes, no data or structure is touched.
3
+
4
+ COMMENT ON TABLE enapo_gid_mapping IS 'Mapping of consumption points (EAN/EIC) to ENO building GIDs. Module-owned contract, filled daily by EnapoGidMappingSyncTask from the ded_gid_mapping CSV export (every synced row gets link_source = ''manual_entry''); electricity and gas only, water/heat (''eb_cis_odb_mista'') is out of scope. Upsert-only keyed on (place_id, gid): nothing is ever deleted, so a mapping missing from a later export stays. A synced row overwrites a manual mock row (link_source = ''mock'') for the same (place_id, gid).';
@@ -0,0 +1,4 @@
1
+ -- Restores the original three-column primary key. Rows collapsed by the up migration are not restored
2
+ -- (the data is gone); this only rebuilds the constraint shape.
3
+ ALTER TABLE enapo_gid_mapping DROP CONSTRAINT enapo_gid_mapping_pk;
4
+ ALTER TABLE enapo_gid_mapping ADD CONSTRAINT enapo_gid_mapping_pk PRIMARY KEY (place_id, gid, link_source);
@@ -0,0 +1,17 @@
1
+ -- Drops link_source from the enapo_gid_mapping primary key. A consumption point (place_id) maps to a
2
+ -- building (gid) regardless of which source produced the link, so (place_id, gid) is the real identity.
3
+ -- The CSV sync now stores a single link_source ('manual_entry'), so several source rows for one
4
+ -- (place_id, gid) collapse to a single row that would otherwise violate the old three-column key.
5
+
6
+ -- Collapse rows that become duplicate under the new key before the constraint is added, so ADD
7
+ -- CONSTRAINT cannot fail on existing data. Per (place_id, gid) keep an active mapping (valid_to IS NULL)
8
+ -- and then the newest valid_from, matching EnapoGidMappingNormalizer.isPreferred.
9
+ DELETE FROM enapo_gid_mapping t
10
+ WHERE t.ctid NOT IN (
11
+ SELECT DISTINCT ON (place_id, gid) ctid
12
+ FROM enapo_gid_mapping
13
+ ORDER BY place_id, gid, (valid_to IS NULL) DESC, valid_from DESC NULLS LAST, ctid
14
+ );
15
+
16
+ ALTER TABLE enapo_gid_mapping DROP CONSTRAINT enapo_gid_mapping_pk;
17
+ ALTER TABLE enapo_gid_mapping ADD CONSTRAINT enapo_gid_mapping_pk PRIMARY KEY (place_id, gid);
@@ -9,7 +9,10 @@
9
9
  -- - Full refresh of mock rows only: rows are inserted with link_source = 'mock', so this
10
10
  -- script can be re-run any time and never touches future non-mock (sync task) rows.
11
11
  -- - The dbt table has no primary key; DISTINCT ON collapses duplicates per (place_id, gid),
12
- -- preferring an active mapping (valid_to IS NULL) and then the newest valid_from.
12
+ -- preferring an active mapping (valid_to IS NULL) and then the newest valid_from. This script
13
+ -- writes link_source = 'mock'; the sync task (EnapoGidMappingSyncTask) writes link_source =
14
+ -- 'manual_entry'. Both deduplicate on (place_id, gid) — the table primary key — so a synced row
15
+ -- and a mock row for the same point collapse to one (the sync run wins, being the later upsert).
13
16
  -- - id_type / commodity are resolved from each other so a row survives when only one of the
14
17
  -- two columns is filled: an explicit value wins, the other column is the fallback.
15
18
  -- commodity uses EB codes ('1' -> electricity, '2' -> gas) as well as the DeD names.
@@ -0,0 +1,14 @@
1
+ import { IEnapoGidMappingCsvRow } from "../../../../schema-definitions/datasources/enapo/gid-mapping/interfaces/IEnapoGidMappingCsvRow";
2
+ import { ISimpleConfig } from "@golemio/core/dist/helpers/configuration/ISimpleConfig";
3
+ /**
4
+ * Reads the ded_gid_mapping CSV export from blob storage over plain HTTP GET. The full blob URL comes
5
+ * from config so golem and rabin point at their own containers. It is a single value (not base + path):
6
+ * only one file is fetched, and a one-piece URL can carry a SAS token query string, which a
7
+ * base-plus-path join would drop.
8
+ */
9
+ export declare class EnapoGidMappingDataSource {
10
+ private config;
11
+ private static readonly DATASOURCE_NAME;
12
+ constructor(config: ISimpleConfig);
13
+ getAll(): Promise<IEnapoGidMappingCsvRow[]>;
14
+ }
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var EnapoGidMappingDataSource_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.EnapoGidMappingDataSource = void 0;
17
+ const EnapoGidMappingCsvSchema_1 = require("../../../../schema-definitions/datasources/enapo/gid-mapping/EnapoGidMappingCsvSchema");
18
+ const CoreToken_1 = require("@golemio/core/dist/helpers/ioc/CoreToken");
19
+ const integration_engine_1 = require("@golemio/core/dist/integration-engine");
20
+ const CSVDataTypeStrategy_1 = require("@golemio/core/dist/integration-engine/datasources/datatype-strategy/CSVDataTypeStrategy");
21
+ const HTTPFetchProtocolStrategy_1 = require("@golemio/core/dist/integration-engine/datasources/protocol-strategy/HTTPFetchProtocolStrategy");
22
+ const golemio_validator_1 = require("@golemio/core/dist/shared/golemio-validator");
23
+ const tsyringe_1 = require("@golemio/core/dist/shared/tsyringe");
24
+ /**
25
+ * Reads the ded_gid_mapping CSV export from blob storage over plain HTTP GET. The full blob URL comes
26
+ * from config so golem and rabin point at their own containers. It is a single value (not base + path):
27
+ * only one file is fetched, and a one-piece URL can carry a SAS token query string, which a
28
+ * base-plus-path join would drop.
29
+ */
30
+ let EnapoGidMappingDataSource = EnapoGidMappingDataSource_1 = class EnapoGidMappingDataSource {
31
+ constructor(config) {
32
+ this.config = config;
33
+ }
34
+ async getAll() {
35
+ const url = this.config.getValue("module.energetics.enapo.gidMapping.url");
36
+ const dataSource = new integration_engine_1.DataSource(EnapoGidMappingDataSource_1.DATASOURCE_NAME, new HTTPFetchProtocolStrategy_1.HTTPFetchProtocolStrategy({
37
+ headers: { Accept: "text/csv" },
38
+ method: "GET",
39
+ responseType: "text",
40
+ timeoutInSeconds: 30,
41
+ url,
42
+ }), new CSVDataTypeStrategy_1.CSVDataTypeStrategy({
43
+ fastcsvParams: { headers: true, delimiter: "," },
44
+ subscribe: (row) => row,
45
+ }), new golemio_validator_1.JSONSchemaValidator(EnapoGidMappingDataSource_1.DATASOURCE_NAME, EnapoGidMappingCsvSchema_1.enapoGidMappingCsvSchema));
46
+ return dataSource.getAll();
47
+ }
48
+ };
49
+ exports.EnapoGidMappingDataSource = EnapoGidMappingDataSource;
50
+ EnapoGidMappingDataSource.DATASOURCE_NAME = "EnapoGidMapping";
51
+ exports.EnapoGidMappingDataSource = EnapoGidMappingDataSource = EnapoGidMappingDataSource_1 = __decorate([
52
+ (0, tsyringe_1.injectable)(),
53
+ __param(0, (0, tsyringe_1.inject)(CoreToken_1.CoreToken.SimpleConfig)),
54
+ __metadata("design:paramtypes", [Object])
55
+ ], EnapoGidMappingDataSource);
56
+ //# sourceMappingURL=EnapoGidMappingDataSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EnapoGidMappingDataSource.js","sourceRoot":"","sources":["../../../../../src/integration-engine/enapo/datasources/gid-mapping/EnapoGidMappingDataSource.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oIAAuG;AAGvG,wEAAqE;AACrE,8EAAmE;AACnE,iIAA8H;AAC9H,6IAA0I;AAC1I,mFAAkF;AAClF,iEAAwE;AAExE;;;;;GAKG;AAEI,IAAM,yBAAyB,iCAA/B,MAAM,yBAAyB;IAGlC,YAAoD,MAAqB;QAArB,WAAM,GAAN,MAAM,CAAe;IAAG,CAAC;IAEtE,KAAK,CAAC,MAAM;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAS,wCAAwC,CAAC,CAAC;QAEnF,MAAM,UAAU,GAAG,IAAI,+BAAU,CAC7B,2BAAyB,CAAC,eAAe,EACzC,IAAI,qDAAyB,CAAC;YAC1B,OAAO,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;YAC/B,MAAM,EAAE,KAAK;YACb,YAAY,EAAE,MAAM;YACpB,gBAAgB,EAAE,EAAE;YACpB,GAAG;SACN,CAAC,EACF,IAAI,yCAAmB,CAAC;YACpB,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE;YAChD,SAAS,EAAE,CAAC,GAA2B,EAAE,EAAE,CAAC,GAAG;SAClD,CAAC,EACF,IAAI,uCAAmB,CAAC,2BAAyB,CAAC,eAAe,EAAE,mDAAwB,CAAC,CAC/F,CAAC;QAEF,OAAO,UAAU,CAAC,MAAM,EAAE,CAAC;IAC/B,CAAC;;AAzBQ,8DAAyB;AACV,yCAAe,GAAG,iBAAiB,AAApB,CAAqB;oCADnD,yBAAyB;IADrC,IAAA,qBAAU,GAAE;IAII,WAAA,IAAA,iBAAM,EAAC,qBAAS,CAAC,YAAY,CAAC,CAAA;;GAHlC,yBAAyB,CA0BrC"}
@@ -0,0 +1,43 @@
1
+ import { IEnapoGidMappingCsvRow } from "../../../schema-definitions/datasources/enapo/gid-mapping/interfaces/IEnapoGidMappingCsvRow";
2
+ import { IEnapoGidMapping } from "../../../schema-definitions/models/enapo/interfaces/IEnapoGidMapping";
3
+ type EnapoGidMappingSkipReason = "missing_required" | "place_id_too_long" | "invalid_date" | "contradicting_pair" | "unresolvable_commodity";
4
+ export interface IEnapoGidMappingSkipReport {
5
+ total: number;
6
+ byReason: Record<EnapoGidMappingSkipReason, number>;
7
+ samples: Record<EnapoGidMappingSkipReason, string[]>;
8
+ }
9
+ interface IEnapoGidMappingNormalizeResult {
10
+ mappings: IEnapoGidMapping[];
11
+ skipped: IEnapoGidMappingSkipReport;
12
+ outOfScopeCount: number;
13
+ }
14
+ /**
15
+ * Normalizes raw ded_gid_mapping CSV rows into rows written to energetics.enapo_gid_mapping. Deduplicates
16
+ * across the whole dataset (a per-row map cannot), so it is a plain helper, not an AbstractTransformation.
17
+ */
18
+ export declare class EnapoGidMappingNormalizer {
19
+ private static readonly EB_PLACEHOLDER_DATE;
20
+ private static readonly MAX_PLACE_ID_LENGTH;
21
+ private static readonly LINK_SOURCE;
22
+ private static readonly ISO_DATE_PATTERN;
23
+ private static readonly EXCLUDED_LINK_SOURCE;
24
+ private static readonly ELECTRICITY_CODES;
25
+ private static readonly GAS_CODES;
26
+ private static readonly HEAT_WATER_CODES;
27
+ private static readonly TRUE_VALUES;
28
+ private static readonly MAX_SAMPLES_PER_REASON;
29
+ private static readonly SKIP_REASONS;
30
+ normalize(rows: IEnapoGidMappingCsvRow[]): IEnapoGidMappingNormalizeResult;
31
+ private isOutOfScope;
32
+ private normalizeRow;
33
+ private describeMissing;
34
+ private emptyReport;
35
+ private skip;
36
+ private resolveIdType;
37
+ private resolveCommodity;
38
+ private isConsistentPair;
39
+ private parseDate;
40
+ private isRealDate;
41
+ private isPreferred;
42
+ }
43
+ export {};
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var EnapoGidMappingNormalizer_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.EnapoGidMappingNormalizer = void 0;
11
+ const tsyringe_1 = require("@golemio/core/dist/shared/tsyringe");
12
+ /**
13
+ * Normalizes raw ded_gid_mapping CSV rows into rows written to energetics.enapo_gid_mapping. Deduplicates
14
+ * across the whole dataset (a per-row map cannot), so it is a plain helper, not an AbstractTransformation.
15
+ */
16
+ let EnapoGidMappingNormalizer = EnapoGidMappingNormalizer_1 = class EnapoGidMappingNormalizer {
17
+ normalize(rows) {
18
+ const skipped = this.emptyReport();
19
+ const byKey = new Map();
20
+ let outOfScopeCount = 0;
21
+ for (const row of rows) {
22
+ if (this.isOutOfScope(row)) {
23
+ outOfScopeCount += 1;
24
+ continue;
25
+ }
26
+ const mapping = this.normalizeRow(row, skipped);
27
+ if (!mapping) {
28
+ continue;
29
+ }
30
+ const key = `${mapping.place_id}|${mapping.gid}`;
31
+ const current = byKey.get(key);
32
+ if (!current || this.isPreferred(mapping, current)) {
33
+ byKey.set(key, mapping);
34
+ }
35
+ }
36
+ return { mappings: [...byKey.values()], skipped, outOfScopeCount };
37
+ }
38
+ // Dropped before any other check so an out-of-scope row that is also malformed cannot inflate the defect counters.
39
+ isOutOfScope(row) {
40
+ const linkSource = (row.link_source ?? "").trim().toLowerCase();
41
+ const commodity = (row.commodity ?? "").trim().toLowerCase();
42
+ return (linkSource === EnapoGidMappingNormalizer_1.EXCLUDED_LINK_SOURCE ||
43
+ EnapoGidMappingNormalizer_1.HEAT_WATER_CODES.includes(commodity));
44
+ }
45
+ normalizeRow(row, skipped) {
46
+ const placeId = (row.place_id ?? "").trim();
47
+ const gid = (row.gid ?? "").trim();
48
+ if (!placeId || !gid) {
49
+ return this.skip(skipped, "missing_required", this.describeMissing(placeId, gid));
50
+ }
51
+ if (placeId.length > EnapoGidMappingNormalizer_1.MAX_PLACE_ID_LENGTH) {
52
+ return this.skip(skipped, "place_id_too_long", placeId);
53
+ }
54
+ const idTypeRaw = (row.id_type ?? "").trim().toLowerCase();
55
+ const commodityRaw = (row.commodity ?? "").trim().toLowerCase();
56
+ const idType = this.resolveIdType(idTypeRaw, commodityRaw);
57
+ const commodity = this.resolveCommodity(idTypeRaw, commodityRaw);
58
+ if (!idType || !commodity) {
59
+ return this.skip(skipped, "unresolvable_commodity", placeId);
60
+ }
61
+ // EAN is always electricity, EIC always gas, so a disagreeing pair is bad source data.
62
+ if (!this.isConsistentPair(idType, commodity)) {
63
+ return this.skip(skipped, "contradicting_pair", placeId);
64
+ }
65
+ const validFrom = this.parseDate(row.valid_from);
66
+ const validTo = this.parseDate(row.valid_to);
67
+ if (!validFrom.isValid || !validTo.isValid) {
68
+ return this.skip(skipped, "invalid_date", `${placeId} (${row.valid_from ?? ""}/${row.valid_to ?? ""})`);
69
+ }
70
+ return {
71
+ place_id: placeId,
72
+ id_type: idType,
73
+ commodity,
74
+ gid,
75
+ is_first_gid: EnapoGidMappingNormalizer_1.TRUE_VALUES.includes((row.is_first_gid ?? "").trim().toLowerCase()),
76
+ link_source: EnapoGidMappingNormalizer_1.LINK_SOURCE,
77
+ valid_from: validFrom.value,
78
+ valid_to: validTo.value === EnapoGidMappingNormalizer_1.EB_PLACEHOLDER_DATE ? null : validTo.value,
79
+ };
80
+ }
81
+ // Names the missing columns and keeps whatever identifier the row still has, so the logged sample says what is wrong.
82
+ describeMissing(placeId, gid) {
83
+ const missing = [];
84
+ if (!placeId) {
85
+ missing.push("place_id");
86
+ }
87
+ if (!gid) {
88
+ missing.push("gid");
89
+ }
90
+ const present = [placeId ? `place_id=${placeId}` : null, gid ? `gid=${gid}` : null].filter((part) => part !== null);
91
+ return `missing ${missing.join("+")}${present.length > 0 ? ` (${present.join(", ")})` : ""}`;
92
+ }
93
+ emptyReport() {
94
+ const byReason = {};
95
+ const samples = {};
96
+ for (const reason of EnapoGidMappingNormalizer_1.SKIP_REASONS) {
97
+ byReason[reason] = 0;
98
+ samples[reason] = [];
99
+ }
100
+ return { total: 0, byReason, samples };
101
+ }
102
+ skip(report, reason, sample) {
103
+ report.total += 1;
104
+ report.byReason[reason] += 1;
105
+ if (report.samples[reason].length < EnapoGidMappingNormalizer_1.MAX_SAMPLES_PER_REASON && sample) {
106
+ report.samples[reason].push(sample);
107
+ }
108
+ return null;
109
+ }
110
+ resolveIdType(idTypeRaw, commodityRaw) {
111
+ if (idTypeRaw === "ean" || idTypeRaw === "eic") {
112
+ return idTypeRaw;
113
+ }
114
+ if (EnapoGidMappingNormalizer_1.ELECTRICITY_CODES.includes(commodityRaw)) {
115
+ return "ean";
116
+ }
117
+ if (EnapoGidMappingNormalizer_1.GAS_CODES.includes(commodityRaw)) {
118
+ return "eic";
119
+ }
120
+ return null;
121
+ }
122
+ resolveCommodity(idTypeRaw, commodityRaw) {
123
+ if (EnapoGidMappingNormalizer_1.ELECTRICITY_CODES.includes(commodityRaw)) {
124
+ return "electricity";
125
+ }
126
+ if (EnapoGidMappingNormalizer_1.GAS_CODES.includes(commodityRaw)) {
127
+ return "gas";
128
+ }
129
+ if (idTypeRaw === "ean") {
130
+ return "electricity";
131
+ }
132
+ if (idTypeRaw === "eic") {
133
+ return "gas";
134
+ }
135
+ return null;
136
+ }
137
+ isConsistentPair(idType, commodity) {
138
+ return (idType === "ean" && commodity === "electricity") || (idType === "eic" && commodity === "gas");
139
+ }
140
+ // Empty cell is a valid null; a timestamp suffix is tolerated (only the date part is stored). Anything
141
+ // that is not a real ISO calendar date is rejected, because the target columns are typed date.
142
+ parseDate(raw) {
143
+ const value = (raw ?? "").trim();
144
+ if (!value) {
145
+ return { isValid: true, value: null };
146
+ }
147
+ const datePart = value.slice(0, 10);
148
+ if (!EnapoGidMappingNormalizer_1.ISO_DATE_PATTERN.test(datePart) || !this.isRealDate(datePart)) {
149
+ return { isValid: false, value: null };
150
+ }
151
+ return { isValid: true, value: datePart };
152
+ }
153
+ // Guards against a well-shaped but non-existent date such as 2019-02-31 that the pattern alone lets through.
154
+ isRealDate(isoDate) {
155
+ const parsed = new Date(`${isoDate}T00:00:00Z`);
156
+ return !Number.isNaN(parsed.getTime()) && parsed.toISOString().slice(0, 10) === isoDate;
157
+ }
158
+ isPreferred(candidate, current) {
159
+ const candidateActive = candidate.valid_to === null;
160
+ const currentActive = current.valid_to === null;
161
+ if (candidateActive !== currentActive) {
162
+ return candidateActive;
163
+ }
164
+ // Both dates are normalized to ISO, so a plain string comparison orders them correctly.
165
+ return (candidate.valid_from ?? "") > (current.valid_from ?? "");
166
+ }
167
+ };
168
+ exports.EnapoGidMappingNormalizer = EnapoGidMappingNormalizer;
169
+ EnapoGidMappingNormalizer.EB_PLACEHOLDER_DATE = "1900-01-01";
170
+ EnapoGidMappingNormalizer.MAX_PLACE_ID_LENGTH = 50;
171
+ // link_source is not part of the primary key anymore and the CSV value is not stored: every synced
172
+ // mapping is written with a single fixed link_source, so downstream can tell sync rows from the
173
+ // manual mock import (link_source = "mock") and from the Porsenna view branch (link_source = "porsenna").
174
+ EnapoGidMappingNormalizer.LINK_SOURCE = "manual_entry";
175
+ EnapoGidMappingNormalizer.ISO_DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
176
+ // Water/heat mapping, out of scope until the source codes are cleaned up (separate issue).
177
+ EnapoGidMappingNormalizer.EXCLUDED_LINK_SOURCE = "eb_cis_odb_mista";
178
+ EnapoGidMappingNormalizer.ELECTRICITY_CODES = ["1", "electricity", "elektrina"];
179
+ EnapoGidMappingNormalizer.GAS_CODES = ["2", "gas", "plyn"];
180
+ EnapoGidMappingNormalizer.HEAT_WATER_CODES = ["3", "4", "heat", "teplo", "water", "voda"];
181
+ EnapoGidMappingNormalizer.TRUE_VALUES = ["true", "1", "t", "yes"];
182
+ EnapoGidMappingNormalizer.MAX_SAMPLES_PER_REASON = 5;
183
+ EnapoGidMappingNormalizer.SKIP_REASONS = [
184
+ "missing_required",
185
+ "place_id_too_long",
186
+ "invalid_date",
187
+ "contradicting_pair",
188
+ "unresolvable_commodity",
189
+ ];
190
+ exports.EnapoGidMappingNormalizer = EnapoGidMappingNormalizer = EnapoGidMappingNormalizer_1 = __decorate([
191
+ (0, tsyringe_1.injectable)()
192
+ ], EnapoGidMappingNormalizer);
193
+ //# sourceMappingURL=EnapoGidMappingNormalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EnapoGidMappingNormalizer.js","sourceRoot":"","sources":["../../../../src/integration-engine/enapo/helpers/EnapoGidMappingNormalizer.ts"],"names":[],"mappings":"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"}
@@ -7,10 +7,12 @@ const PpasAveApiDataSourceProvider_1 = require("../../commodity-providers/dataso
7
7
  const WorkerContainerToken_1 = require("../../commodity-providers/ioc/WorkerContainerToken");
8
8
  const Di_1 = require("@golemio/core/dist/integration-engine/ioc/Di");
9
9
  const EnoDatasourceFactory_1 = require("../datasources/eno/EnoDatasourceFactory");
10
+ const EnapoGidMappingDataSource_1 = require("../datasources/gid-mapping/EnapoGidMappingDataSource");
10
11
  const PorsennaDataSourceProvider_1 = require("../datasources/porsenna/PorsennaDataSourceProvider");
11
12
  const PorsennaDataSource_1 = require("../datasources/porsenna/PorsennaDataSource");
12
13
  const PpasCommercialDatasource_1 = require("../datasources/ppas/commercial/PpasCommercialDatasource");
13
14
  const PpasDistributionDatasource_1 = require("../datasources/ppas/distribution/PpasDistributionDatasource");
15
+ const EnapoGidMappingRepository_1 = require("../repositories/EnapoGidMappingRepository");
14
16
  const EnapoMeasurementsRepository_1 = require("../repositories/EnapoMeasurementsRepository");
15
17
  const PreIncomingDataLogRepository_1 = require("../repositories/PreIncomingDataLogRepository");
16
18
  const EnoAddressRepository_1 = require("../repositories/eno/EnoAddressRepository");
@@ -37,6 +39,7 @@ const PpasDistributionInvoiceDeviceRepository_1 = require("../repositories/ppas/
37
39
  const PpasDistributionInvoiceInstallationRepository_1 = require("../repositories/ppas/PpasDistributionInvoiceInstallationRepository");
38
40
  const PpasDistributionInvoicePriceRepository_1 = require("../repositories/ppas/PpasDistributionInvoicePriceRepository");
39
41
  const PpasDistributionInvoiceRepository_1 = require("../repositories/ppas/PpasDistributionInvoiceRepository");
42
+ const EnapoGidMappingNormalizer_1 = require("../helpers/EnapoGidMappingNormalizer");
40
43
  const PPasMeasurementTransformation_1 = require("../transformations/PPasMeasurementTransformation");
41
44
  const EnoEJTransformation_1 = require("../transformations/eno/EnoEJTransformation");
42
45
  const EnoManagerTransformation_1 = require("../transformations/eno/EnoManagerTransformation");
@@ -49,6 +52,7 @@ const PpasDistributionTransformation_1 = require("../transformations/ppas/PpasDi
49
52
  const PreDailyMeasurementsTransformation_1 = require("../transformations/pre/PreDailyMeasurementsTransformation");
50
53
  const PreMeasurementsTransformation_1 = require("../transformations/pre/PreMeasurementsTransformation");
51
54
  const PreMetadataTransfromation_1 = require("../transformations/pre/PreMetadataTransfromation");
55
+ const EnapoGidMappingSyncTask_1 = require("../workers/task/EnapoGidMappingSyncTask");
52
56
  const EnapoPpasCommercialTask_1 = require("../workers/task/EnapoPpasCommercialTask");
53
57
  const EnapoPpasDistributionTask_1 = require("../workers/task/EnapoPpasDistributionTask");
54
58
  const EnapoPpasTask_1 = require("../workers/task/EnapoPpasTask");
@@ -74,6 +78,7 @@ EnapoContainer.registerSingleton(EnapoWorkerContainerToken_1.EnapoWorkerContaine
74
78
  EnapoContainer.registerSingleton(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.EnapoPpasCommercialDatasource, PpasCommercialDatasource_1.PpasCommercialDatasource);
75
79
  EnapoContainer.registerSingleton(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.PorsennaDatasource, PorsennaDataSource_1.PorsennaDataSource);
76
80
  EnapoContainer.registerSingleton(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.PorsennaDataSourceProvider, PorsennaDataSourceProvider_1.PorsennaDataSourceProvider);
81
+ EnapoContainer.registerSingleton(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.EnapoGidMappingDataSource, EnapoGidMappingDataSource_1.EnapoGidMappingDataSource);
77
82
  //#endregion
78
83
  //#region Repositories
79
84
  EnapoContainer.register(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.EnapoMeasurementsRepository, EnapoMeasurementsRepository_1.EnapoMeasurementsRepository)
@@ -101,7 +106,8 @@ EnapoContainer.register(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.En
101
106
  .register(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.PpasCommercialInvoicePriceRepository, PpasCommercialInvoicePriceRepository_1.PpasCommercialInvoicePriceRepository)
102
107
  .register(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.PorsennaBuildingsRepository, PorsennaBuildingsRepository_1.PorsennaBuildingsRepository)
103
108
  .register(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.PorsennaConsumptionRepository, PorsennaConsumptionRepository_1.PorsennaConsumptionRepository)
104
- .register(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.PorsennaDevicesRepository, PorsennaDevicesRepository_1.PorsennaDevicesRepository);
109
+ .register(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.PorsennaDevicesRepository, PorsennaDevicesRepository_1.PorsennaDevicesRepository)
110
+ .register(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.EnapoGidMappingRepository, EnapoGidMappingRepository_1.EnapoGidMappingRepository);
105
111
  //#endregion
106
112
  //#region Transformation
107
113
  EnapoContainer.registerSingleton(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.PPasMeasurementTransformation, PPasMeasurementTransformation_1.PPasMeasurementTransformation);
@@ -115,7 +121,8 @@ EnapoContainer.registerSingleton(EnapoWorkerContainerToken_1.EnapoWorkerContaine
115
121
  .registerSingleton(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.PpasDistributionTransformation, PpasDistributionTransformation_1.PpasDistributionTransformation)
116
122
  .registerSingleton(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.PpasCommercialTransformation, PpasCommercialTransformation_1.PpasCommercialTransformation)
117
123
  .registerSingleton(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.PorsennaGaugeTransformation, PorsennaGaugeTransformation_1.PorsennaGaugeTransformation)
118
- .registerSingleton(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.PorsennaConsumptionTransformation, PorsennaConsumptionTransformation_1.PorsennaConsumptionTransformation);
124
+ .registerSingleton(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.PorsennaConsumptionTransformation, PorsennaConsumptionTransformation_1.PorsennaConsumptionTransformation)
125
+ .registerSingleton(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.EnapoGidMappingNormalizer, EnapoGidMappingNormalizer_1.EnapoGidMappingNormalizer);
119
126
  //#endregion
120
127
  //#region Tasks
121
128
  EnapoContainer.register(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.EnapoPpasTask, EnapoPpasTask_1.EnapoPpasTask);
@@ -128,5 +135,6 @@ EnapoContainer.register(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.En
128
135
  .register(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.EnapoPpasCommercialTask, EnapoPpasCommercialTask_1.EnapoPpasCommercialTask)
129
136
  .register(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.PorsennaDistributionTask, PorsennaDistributionTask_1.PorsennaDistributionTask)
130
137
  .register(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.DedSearchIndexRefreshTask, DedSearchIndexRefreshTask_1.DedSearchIndexRefreshTask)
131
- .register(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.EnapoConsumptionHistoryRefreshTask, EnapoConsumptionHistoryRefreshTask_1.EnapoConsumptionHistoryRefreshTask);
138
+ .register(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.EnapoConsumptionHistoryRefreshTask, EnapoConsumptionHistoryRefreshTask_1.EnapoConsumptionHistoryRefreshTask)
139
+ .register(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.EnapoGidMappingSyncTask, EnapoGidMappingSyncTask_1.EnapoGidMappingSyncTask);
132
140
  //# sourceMappingURL=Di.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Di.js","sourceRoot":"","sources":["../../../../src/integration-engine/enapo/ioc/Di.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Di.js","sourceRoot":"","sources":["../../../../src/integration-engine/enapo/ioc/Di.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ declare const EnapoWorkerContainerToken: {
4
4
  EnapoPpasCommercialDatasource: symbol;
5
5
  PorsennaDatasource: symbol;
6
6
  PorsennaDataSourceProvider: symbol;
7
+ EnapoGidMappingDataSource: symbol;
7
8
  EnapoMeasurementsRepository: symbol;
8
9
  EnapoMetadataRepository: symbol;
9
10
  PreIncomingDataLogRepository: symbol;
@@ -18,6 +19,7 @@ declare const EnapoWorkerContainerToken: {
18
19
  PorsennaBuildingsRepository: symbol;
19
20
  PorsennaConsumptionRepository: symbol;
20
21
  PorsennaDevicesRepository: symbol;
22
+ EnapoGidMappingRepository: symbol;
21
23
  PPasMeasurementTransformation: symbol;
22
24
  PreMeasurementsTransformation: symbol;
23
25
  PreDailyMeasurementsTransformation: symbol;
@@ -26,11 +28,13 @@ declare const EnapoWorkerContainerToken: {
26
28
  PpasCommercialTransformation: symbol;
27
29
  PorsennaGaugeTransformation: symbol;
28
30
  PorsennaConsumptionTransformation: symbol;
31
+ EnapoGidMappingNormalizer: symbol;
29
32
  EnapoPpasTask: symbol;
30
33
  EnapoPrediTask: symbol;
31
34
  EnapoPpasDistributionTask: symbol;
32
35
  EnapoPpasCommercialTask: symbol;
33
36
  PorsennaDistributionTask: symbol;
37
+ EnapoGidMappingSyncTask: symbol;
34
38
  EnoDatasourceFactory: symbol;
35
39
  EnoStructureTypeTransformation: symbol;
36
40
  EnoOrganizationTransformation: symbol;
@@ -8,6 +8,7 @@ const EnapoWorkerContainerToken = {
8
8
  EnapoPpasCommercialDatasource: Symbol(),
9
9
  PorsennaDatasource: Symbol(),
10
10
  PorsennaDataSourceProvider: Symbol(),
11
+ EnapoGidMappingDataSource: Symbol(),
11
12
  //#endregion
12
13
  //#region Repositories
13
14
  EnapoMeasurementsRepository: Symbol(),
@@ -24,6 +25,7 @@ const EnapoWorkerContainerToken = {
24
25
  PorsennaBuildingsRepository: Symbol(),
25
26
  PorsennaConsumptionRepository: Symbol(),
26
27
  PorsennaDevicesRepository: Symbol(),
28
+ EnapoGidMappingRepository: Symbol(),
27
29
  //#endregion
28
30
  //#region Transformations
29
31
  PPasMeasurementTransformation: Symbol(),
@@ -34,6 +36,7 @@ const EnapoWorkerContainerToken = {
34
36
  PpasCommercialTransformation: Symbol(),
35
37
  PorsennaGaugeTransformation: Symbol(),
36
38
  PorsennaConsumptionTransformation: Symbol(),
39
+ EnapoGidMappingNormalizer: Symbol(),
37
40
  //#endregion
38
41
  //#region Tasks
39
42
  EnapoPpasTask: Symbol(),
@@ -41,6 +44,7 @@ const EnapoWorkerContainerToken = {
41
44
  EnapoPpasDistributionTask: Symbol(),
42
45
  EnapoPpasCommercialTask: Symbol(),
43
46
  PorsennaDistributionTask: Symbol(),
47
+ EnapoGidMappingSyncTask: Symbol(),
44
48
  //#endregion
45
49
  //#region Eno
46
50
  EnoDatasourceFactory: Symbol(),
@@ -1 +1 @@
1
- {"version":3,"file":"EnapoWorkerContainerToken.js","sourceRoot":"","sources":["../../../../src/integration-engine/enapo/ioc/EnapoWorkerContainerToken.ts"],"names":[],"mappings":";;;AAAA,MAAM,yBAAyB,GAAG;IAC9B,oBAAoB;IACpB,kCAAkC,EAAE,MAAM,EAAE;IAC5C,+BAA+B,EAAE,MAAM,EAAE;IACzC,6BAA6B,EAAE,MAAM,EAAE;IACvC,kBAAkB,EAAE,MAAM,EAAE;IAC5B,0BAA0B,EAAE,MAAM,EAAE;IACpC,YAAY;IAEZ,sBAAsB;IACtB,2BAA2B,EAAE,MAAM,EAAE;IACrC,uBAAuB,EAAE,MAAM,EAAE;IACjC,4BAA4B,EAAE,MAAM,EAAE;IACtC,uCAAuC,EAAE,MAAM,EAAE;IACjD,6CAA6C,EAAE,MAAM,EAAE;IACvD,sCAAsC,EAAE,MAAM,EAAE;IAChD,iCAAiC,EAAE,MAAM,EAAE;IAC3C,+BAA+B,EAAE,MAAM,EAAE;IACzC,2CAA2C,EAAE,MAAM,EAAE;IACrD,qCAAqC,EAAE,MAAM,EAAE;IAC/C,oCAAoC,EAAE,MAAM,EAAE;IAC9C,2BAA2B,EAAE,MAAM,EAAE;IACrC,6BAA6B,EAAE,MAAM,EAAE;IACvC,yBAAyB,EAAE,MAAM,EAAE;IACnC,YAAY;IAEZ,yBAAyB;IACzB,6BAA6B,EAAE,MAAM,EAAE;IACvC,6BAA6B,EAAE,MAAM,EAAE;IACvC,kCAAkC,EAAE,MAAM,EAAE;IAC5C,yBAAyB,EAAE,MAAM,EAAE;IACnC,8BAA8B,EAAE,MAAM,EAAE;IACxC,4BAA4B,EAAE,MAAM,EAAE;IACtC,2BAA2B,EAAE,MAAM,EAAE;IACrC,iCAAiC,EAAE,MAAM,EAAE;IAC3C,YAAY;IAEZ,eAAe;IACf,aAAa,EAAE,MAAM,EAAE;IACvB,cAAc,EAAE,MAAM,EAAE;IACxB,yBAAyB,EAAE,MAAM,EAAE;IACnC,uBAAuB,EAAE,MAAM,EAAE;IACjC,wBAAwB,EAAE,MAAM,EAAE;IAClC,YAAY;IAEZ,aAAa;IACb,oBAAoB,EAAE,MAAM,EAAE;IAE9B,8BAA8B,EAAE,MAAM,EAAE;IACxC,6BAA6B,EAAE,MAAM,EAAE;IACvC,wBAAwB,EAAE,MAAM,EAAE;IAClC,mBAAmB,EAAE,MAAM,EAAE;IAE7B,0BAA0B,EAAE,MAAM,EAAE;IACpC,yBAAyB,EAAE,MAAM,EAAE;IACnC,oBAAoB,EAAE,MAAM,EAAE;IAC9B,eAAe,EAAE,MAAM,EAAE;IACzB,qBAAqB,EAAE,MAAM,EAAE;IAC/B,oBAAoB,EAAE,MAAM,EAAE;IAC9B,qBAAqB,EAAE,MAAM,EAAE;IAC/B,qBAAqB,EAAE,MAAM,EAAE;IAC/B,uBAAuB,EAAE,MAAM,EAAE;IACjC,sBAAsB,EAAE,MAAM,EAAE;IAChC,qBAAqB,EAAE,MAAM,EAAE;IAC/B,wBAAwB,EAAE,MAAM,EAAE;IAClC,sCAAsC,EAAE,MAAM,EAAE;IAEhD,aAAa,EAAE,MAAM,EAAE;IACvB,eAAe,EAAE,MAAM,EAAE;IACzB,gBAAgB,EAAE,MAAM,EAAE;IAC1B,eAAe,EAAE,MAAM,EAAE;IACzB,yBAAyB,EAAE,MAAM,EAAE;IACnC,kCAAkC,EAAE,MAAM,EAAE;IAC5C,YAAY;CACf,CAAC;AAEO,8DAAyB"}
1
+ {"version":3,"file":"EnapoWorkerContainerToken.js","sourceRoot":"","sources":["../../../../src/integration-engine/enapo/ioc/EnapoWorkerContainerToken.ts"],"names":[],"mappings":";;;AAAA,MAAM,yBAAyB,GAAG;IAC9B,oBAAoB;IACpB,kCAAkC,EAAE,MAAM,EAAE;IAC5C,+BAA+B,EAAE,MAAM,EAAE;IACzC,6BAA6B,EAAE,MAAM,EAAE;IACvC,kBAAkB,EAAE,MAAM,EAAE;IAC5B,0BAA0B,EAAE,MAAM,EAAE;IACpC,yBAAyB,EAAE,MAAM,EAAE;IACnC,YAAY;IAEZ,sBAAsB;IACtB,2BAA2B,EAAE,MAAM,EAAE;IACrC,uBAAuB,EAAE,MAAM,EAAE;IACjC,4BAA4B,EAAE,MAAM,EAAE;IACtC,uCAAuC,EAAE,MAAM,EAAE;IACjD,6CAA6C,EAAE,MAAM,EAAE;IACvD,sCAAsC,EAAE,MAAM,EAAE;IAChD,iCAAiC,EAAE,MAAM,EAAE;IAC3C,+BAA+B,EAAE,MAAM,EAAE;IACzC,2CAA2C,EAAE,MAAM,EAAE;IACrD,qCAAqC,EAAE,MAAM,EAAE;IAC/C,oCAAoC,EAAE,MAAM,EAAE;IAC9C,2BAA2B,EAAE,MAAM,EAAE;IACrC,6BAA6B,EAAE,MAAM,EAAE;IACvC,yBAAyB,EAAE,MAAM,EAAE;IACnC,yBAAyB,EAAE,MAAM,EAAE;IACnC,YAAY;IAEZ,yBAAyB;IACzB,6BAA6B,EAAE,MAAM,EAAE;IACvC,6BAA6B,EAAE,MAAM,EAAE;IACvC,kCAAkC,EAAE,MAAM,EAAE;IAC5C,yBAAyB,EAAE,MAAM,EAAE;IACnC,8BAA8B,EAAE,MAAM,EAAE;IACxC,4BAA4B,EAAE,MAAM,EAAE;IACtC,2BAA2B,EAAE,MAAM,EAAE;IACrC,iCAAiC,EAAE,MAAM,EAAE;IAC3C,yBAAyB,EAAE,MAAM,EAAE;IACnC,YAAY;IAEZ,eAAe;IACf,aAAa,EAAE,MAAM,EAAE;IACvB,cAAc,EAAE,MAAM,EAAE;IACxB,yBAAyB,EAAE,MAAM,EAAE;IACnC,uBAAuB,EAAE,MAAM,EAAE;IACjC,wBAAwB,EAAE,MAAM,EAAE;IAClC,uBAAuB,EAAE,MAAM,EAAE;IACjC,YAAY;IAEZ,aAAa;IACb,oBAAoB,EAAE,MAAM,EAAE;IAE9B,8BAA8B,EAAE,MAAM,EAAE;IACxC,6BAA6B,EAAE,MAAM,EAAE;IACvC,wBAAwB,EAAE,MAAM,EAAE;IAClC,mBAAmB,EAAE,MAAM,EAAE;IAE7B,0BAA0B,EAAE,MAAM,EAAE;IACpC,yBAAyB,EAAE,MAAM,EAAE;IACnC,oBAAoB,EAAE,MAAM,EAAE;IAC9B,eAAe,EAAE,MAAM,EAAE;IACzB,qBAAqB,EAAE,MAAM,EAAE;IAC/B,oBAAoB,EAAE,MAAM,EAAE;IAC9B,qBAAqB,EAAE,MAAM,EAAE;IAC/B,qBAAqB,EAAE,MAAM,EAAE;IAC/B,uBAAuB,EAAE,MAAM,EAAE;IACjC,sBAAsB,EAAE,MAAM,EAAE;IAChC,qBAAqB,EAAE,MAAM,EAAE;IAC/B,wBAAwB,EAAE,MAAM,EAAE;IAClC,sCAAsC,EAAE,MAAM,EAAE;IAEhD,aAAa,EAAE,MAAM,EAAE;IACvB,eAAe,EAAE,MAAM,EAAE;IACzB,gBAAgB,EAAE,MAAM,EAAE;IAC1B,eAAe,EAAE,MAAM,EAAE;IACzB,yBAAyB,EAAE,MAAM,EAAE;IACnC,kCAAkC,EAAE,MAAM,EAAE;IAC5C,YAAY;CACf,CAAC;AAEO,8DAAyB"}
@@ -0,0 +1,13 @@
1
+ import { IModel } from "@golemio/core/dist/integration-engine/models/IModel";
2
+ import { PostgresModel } from "@golemio/core/dist/integration-engine/models/PostgresModel";
3
+ /**
4
+ * Writes the ded_gid_mapping rows into energetics.enapo_gid_mapping. Uses insertOrUpdate so a run only
5
+ * ever inserts new mappings or updates existing ones (keyed on place_id + gid) and never deletes: a
6
+ * mapping that disappears from a later export stays in the table, and re-running over the same input is
7
+ * idempotent.
8
+ */
9
+ export declare class EnapoGidMappingRepository extends PostgresModel implements IModel {
10
+ static REPOSITORY_NAME: string;
11
+ static JSON_SCHEMA_VALIDATOR_NAME: string;
12
+ constructor();
13
+ }
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var EnapoGidMappingRepository_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.EnapoGidMappingRepository = void 0;
14
+ const _sch_1 = require("../../../schema-definitions");
15
+ const EnapoGidMappingModel_1 = require("../../../schema-definitions/models/enapo/EnapoGidMappingModel");
16
+ const PostgresModel_1 = require("@golemio/core/dist/integration-engine/models/PostgresModel");
17
+ const golemio_validator_1 = require("@golemio/core/dist/shared/golemio-validator");
18
+ const tsyringe_1 = require("@golemio/core/dist/shared/tsyringe");
19
+ /**
20
+ * Writes the ded_gid_mapping rows into energetics.enapo_gid_mapping. Uses insertOrUpdate so a run only
21
+ * ever inserts new mappings or updates existing ones (keyed on place_id + gid) and never deletes: a
22
+ * mapping that disappears from a later export stays in the table, and re-running over the same input is
23
+ * idempotent.
24
+ */
25
+ let EnapoGidMappingRepository = EnapoGidMappingRepository_1 = class EnapoGidMappingRepository extends PostgresModel_1.PostgresModel {
26
+ constructor() {
27
+ super(EnapoGidMappingRepository_1.REPOSITORY_NAME, {
28
+ pgTableName: EnapoGidMappingModel_1.EnapoGidMappingModel.TABLE_NAME,
29
+ pgSchema: _sch_1.EnergeticsSchema.pgSchema,
30
+ outputSequelizeAttributes: EnapoGidMappingModel_1.EnapoGidMappingModel.attributeModel,
31
+ savingType: "insertOrUpdate",
32
+ }, new golemio_validator_1.JSONSchemaValidator(EnapoGidMappingRepository_1.JSON_SCHEMA_VALIDATOR_NAME, EnapoGidMappingModel_1.EnapoGidMappingModel.jsonSchema));
33
+ }
34
+ };
35
+ exports.EnapoGidMappingRepository = EnapoGidMappingRepository;
36
+ EnapoGidMappingRepository.REPOSITORY_NAME = "EnapoGidMappingRepository";
37
+ EnapoGidMappingRepository.JSON_SCHEMA_VALIDATOR_NAME = "EnapoGidMappingRepositoryValidator";
38
+ exports.EnapoGidMappingRepository = EnapoGidMappingRepository = EnapoGidMappingRepository_1 = __decorate([
39
+ (0, tsyringe_1.injectable)(),
40
+ __metadata("design:paramtypes", [])
41
+ ], EnapoGidMappingRepository);
42
+ //# sourceMappingURL=EnapoGidMappingRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EnapoGidMappingRepository.js","sourceRoot":"","sources":["../../../../src/integration-engine/enapo/repositories/EnapoGidMappingRepository.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,sDAAwC;AACxC,wGAA8E;AAE9E,8FAA2F;AAC3F,mFAAkF;AAClF,iEAAgE;AAEhE;;;;;GAKG;AAEI,IAAM,yBAAyB,iCAA/B,MAAM,yBAA0B,SAAQ,6BAAa;IAIxD;QACI,KAAK,CACD,2BAAyB,CAAC,eAAe,EACzC;YACI,WAAW,EAAE,2CAAoB,CAAC,UAAU;YAC5C,QAAQ,EAAE,uBAAgB,CAAC,QAAQ;YACnC,yBAAyB,EAAE,2CAAoB,CAAC,cAAc;YAC9D,UAAU,EAAE,gBAAgB;SAC/B,EACD,IAAI,uCAAmB,CAAC,2BAAyB,CAAC,0BAA0B,EAAE,2CAAoB,CAAC,UAAU,CAAC,CACjH,CAAC;IACN,CAAC;;AAfQ,8DAAyB;AACpB,yCAAe,GAAG,2BAA2B,AAA9B,CAA+B;AAC9C,oDAA0B,GAAG,oCAAoC,AAAvC,CAAwC;oCAFvE,yBAAyB;IADrC,IAAA,qBAAU,GAAE;;GACA,yBAAyB,CAgBrC"}
@@ -25,6 +25,7 @@ class EnapoWorker extends integration_engine_1.AbstractWorker {
25
25
  this.registerTask(Di_1.EnapoContainer.resolve(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.PorsennaDistributionTask));
26
26
  this.registerTask(Di_1.EnapoContainer.resolve(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.DedSearchIndexRefreshTask));
27
27
  this.registerTask(Di_1.EnapoContainer.resolve(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.EnapoConsumptionHistoryRefreshTask));
28
+ this.registerTask(Di_1.EnapoContainer.resolve(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.EnapoGidMappingSyncTask));
28
29
  }
29
30
  }
30
31
  exports.EnapoWorker = EnapoWorker;
@@ -1 +1 @@
1
- {"version":3,"file":"EnapoWorker.js","sourceRoot":"","sources":["../../../../src/integration-engine/enapo/workers/EnapoWorker.ts"],"names":[],"mappings":";;;AAAA,8EAAuE;AAEvE,4CAAiD;AACjD,kCAA2C;AAC3C,gFAA6E;AAE7E,MAAa,WAAY,SAAQ,mCAAc;IAG3C;QACI,KAAK,EAAE,CAAC;QAHF,SAAI,GAAG,6BAAiB,CAAC;QAmB5B,iBAAY,GAAG,CAAC,IAAW,EAAQ,EAAE;YACxC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACzB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAC7C,CAAC,CAAC;QAjBE,iBAAiB;QACjB,IAAI,CAAC,YAAY,CAAC,mBAAc,CAAC,OAAO,CAAQ,qDAAyB,CAAC,aAAa,CAAC,CAAC,CAAC;QAC1F,IAAI,CAAC,YAAY,CAAC,mBAAc,CAAC,OAAO,CAAQ,qDAAyB,CAAC,cAAc,CAAC,CAAC,CAAC;QAC3F,IAAI,CAAC,YAAY,CAAC,mBAAc,CAAC,OAAO,CAAQ,qDAAyB,CAAC,aAAa,CAAC,CAAC,CAAC;QAC1F,IAAI,CAAC,YAAY,CAAC,mBAAc,CAAC,OAAO,CAAQ,qDAAyB,CAAC,eAAe,CAAC,CAAC,CAAC;QAC5F,IAAI,CAAC,YAAY,CAAC,mBAAc,CAAC,OAAO,CAAQ,qDAAyB,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC7F,IAAI,CAAC,YAAY,CAAC,mBAAc,CAAC,OAAO,CAAQ,qDAAyB,CAAC,eAAe,CAAC,CAAC,CAAC;QAC5F,IAAI,CAAC,YAAY,CAAC,mBAAc,CAAC,OAAO,CAAQ,qDAAyB,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACtG,IAAI,CAAC,YAAY,CAAC,mBAAc,CAAC,OAAO,CAAQ,qDAAyB,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACpG,IAAI,CAAC,YAAY,CAAC,mBAAc,CAAC,OAAO,CAAQ,qDAAyB,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACrG,IAAI,CAAC,YAAY,CAAC,mBAAc,CAAC,OAAO,CAAQ,qDAAyB,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACtG,IAAI,CAAC,YAAY,CAAC,mBAAc,CAAC,OAAO,CAAQ,qDAAyB,CAAC,kCAAkC,CAAC,CAAC,CAAC;IACnH,CAAC;CAMJ;AAxBD,kCAwBC"}
1
+ {"version":3,"file":"EnapoWorker.js","sourceRoot":"","sources":["../../../../src/integration-engine/enapo/workers/EnapoWorker.ts"],"names":[],"mappings":";;;AAAA,8EAAuE;AAEvE,4CAAiD;AACjD,kCAA2C;AAC3C,gFAA6E;AAE7E,MAAa,WAAY,SAAQ,mCAAc;IAG3C;QACI,KAAK,EAAE,CAAC;QAHF,SAAI,GAAG,6BAAiB,CAAC;QAoB5B,iBAAY,GAAG,CAAC,IAAW,EAAQ,EAAE;YACxC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACzB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAC7C,CAAC,CAAC;QAlBE,iBAAiB;QACjB,IAAI,CAAC,YAAY,CAAC,mBAAc,CAAC,OAAO,CAAQ,qDAAyB,CAAC,aAAa,CAAC,CAAC,CAAC;QAC1F,IAAI,CAAC,YAAY,CAAC,mBAAc,CAAC,OAAO,CAAQ,qDAAyB,CAAC,cAAc,CAAC,CAAC,CAAC;QAC3F,IAAI,CAAC,YAAY,CAAC,mBAAc,CAAC,OAAO,CAAQ,qDAAyB,CAAC,aAAa,CAAC,CAAC,CAAC;QAC1F,IAAI,CAAC,YAAY,CAAC,mBAAc,CAAC,OAAO,CAAQ,qDAAyB,CAAC,eAAe,CAAC,CAAC,CAAC;QAC5F,IAAI,CAAC,YAAY,CAAC,mBAAc,CAAC,OAAO,CAAQ,qDAAyB,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC7F,IAAI,CAAC,YAAY,CAAC,mBAAc,CAAC,OAAO,CAAQ,qDAAyB,CAAC,eAAe,CAAC,CAAC,CAAC;QAC5F,IAAI,CAAC,YAAY,CAAC,mBAAc,CAAC,OAAO,CAAQ,qDAAyB,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACtG,IAAI,CAAC,YAAY,CAAC,mBAAc,CAAC,OAAO,CAAQ,qDAAyB,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACpG,IAAI,CAAC,YAAY,CAAC,mBAAc,CAAC,OAAO,CAAQ,qDAAyB,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACrG,IAAI,CAAC,YAAY,CAAC,mBAAc,CAAC,OAAO,CAAQ,qDAAyB,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACtG,IAAI,CAAC,YAAY,CAAC,mBAAc,CAAC,OAAO,CAAQ,qDAAyB,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAC/G,IAAI,CAAC,YAAY,CAAC,mBAAc,CAAC,OAAO,CAAQ,qDAAyB,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACxG,CAAC;CAMJ;AAzBD,kCAyBC"}
@@ -0,0 +1,45 @@
1
+ import { EnapoGidMappingDataSource } from "../../datasources/gid-mapping/EnapoGidMappingDataSource";
2
+ import { EnapoGidMappingRepository } from "../../repositories/EnapoGidMappingRepository";
3
+ import { EnapoGidMappingNormalizer } from "../../helpers/EnapoGidMappingNormalizer";
4
+ import { IDatabaseConnector } from "@golemio/core/dist/helpers/data-access/postgres/IDatabaseConnector";
5
+ import { ILogger } from "@golemio/core/dist/helpers/logger/LoggerProvider";
6
+ import { AbstractTask } from "@golemio/core/dist/integration-engine";
7
+ /**
8
+ * Syncs the ded_gid_mapping CSV export (blob storage) into energetics.enapo_gid_mapping.
9
+ *
10
+ * Runs on a daily cron so a new consumption point or a changed mapping in the source reaches production
11
+ * the next day at the latest. The write is upsert-only (never delete), so a mapping missing from a later
12
+ * export stays in the table, and running twice over the same input yields the same result. The refresh
13
+ * takes no parameters - it always ingests the whole export - so there is nothing to validate and the
14
+ * schema is deliberately undefined.
15
+ *
16
+ * The producer delivers the full export (unsupported commodities and junk included) and cannot be forced
17
+ * to clean it, so rows we cannot process are skipped and logged as a warning rather than failing the run.
18
+ */
19
+ export declare class EnapoGidMappingSyncTask extends AbstractTask<Record<string, never>> {
20
+ private logger;
21
+ private dbConnector;
22
+ private datasource;
23
+ private normalizer;
24
+ private repository;
25
+ queueName: string;
26
+ queueTtl: number;
27
+ protected schema: undefined;
28
+ /**
29
+ * The whole export goes in as a single insert per batch, so the batch has to stay below the Postgres
30
+ * bind-parameter limit (65535); eight columns per row leave room for well over this many.
31
+ */
32
+ private static readonly SAVE_BATCH_SIZE;
33
+ constructor(logger: ILogger, dbConnector: IDatabaseConnector, datasource: EnapoGidMappingDataSource, normalizer: EnapoGidMappingNormalizer, repository: EnapoGidMappingRepository);
34
+ execute(): Promise<void>;
35
+ /**
36
+ * The routine outcome of a run, including the water/heat rows that are filtered out on purpose. This
37
+ * is expected volume, so it never warns - it only has to stay visible.
38
+ */
39
+ private logOutcome;
40
+ /**
41
+ * Rows that should have been usable but were not. Kept separate from the out-of-scope count so a
42
+ * large expected filter volume cannot hide a handful of real defects.
43
+ */
44
+ private logSkipped;
45
+ }
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var EnapoGidMappingSyncTask_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.EnapoGidMappingSyncTask = void 0;
17
+ const constants_1 = require("../../constants");
18
+ const EnapoGidMappingDataSource_1 = require("../../datasources/gid-mapping/EnapoGidMappingDataSource");
19
+ const Chunker_1 = require("../../helpers/Chunker");
20
+ const EnapoWorkerContainerToken_1 = require("../../ioc/EnapoWorkerContainerToken");
21
+ const EnapoGidMappingRepository_1 = require("../../repositories/EnapoGidMappingRepository");
22
+ const EnapoGidMappingNormalizer_1 = require("../../helpers/EnapoGidMappingNormalizer");
23
+ const CoreToken_1 = require("@golemio/core/dist/helpers/ioc/CoreToken");
24
+ const integration_engine_1 = require("@golemio/core/dist/integration-engine");
25
+ const golemio_errors_1 = require("@golemio/core/dist/shared/golemio-errors");
26
+ const tsyringe_1 = require("@golemio/core/dist/shared/tsyringe");
27
+ /**
28
+ * Syncs the ded_gid_mapping CSV export (blob storage) into energetics.enapo_gid_mapping.
29
+ *
30
+ * Runs on a daily cron so a new consumption point or a changed mapping in the source reaches production
31
+ * the next day at the latest. The write is upsert-only (never delete), so a mapping missing from a later
32
+ * export stays in the table, and running twice over the same input yields the same result. The refresh
33
+ * takes no parameters - it always ingests the whole export - so there is nothing to validate and the
34
+ * schema is deliberately undefined.
35
+ *
36
+ * The producer delivers the full export (unsupported commodities and junk included) and cannot be forced
37
+ * to clean it, so rows we cannot process are skipped and logged as a warning rather than failing the run.
38
+ */
39
+ let EnapoGidMappingSyncTask = EnapoGidMappingSyncTask_1 = class EnapoGidMappingSyncTask extends integration_engine_1.AbstractTask {
40
+ constructor(logger, dbConnector, datasource, normalizer, repository) {
41
+ super(constants_1.ENAPO_WORKER_NAME);
42
+ this.logger = logger;
43
+ this.dbConnector = dbConnector;
44
+ this.datasource = datasource;
45
+ this.normalizer = normalizer;
46
+ this.repository = repository;
47
+ this.queueName = "syncEnapoGidMapping";
48
+ this.queueTtl = 30 * 60 * 1000;
49
+ this.schema = undefined;
50
+ }
51
+ async execute() {
52
+ try {
53
+ const rawRows = await this.datasource.getAll();
54
+ const { mappings, skipped, outOfScopeCount } = this.normalizer.normalize(rawRows);
55
+ this.logOutcome(rawRows.length, mappings.length, outOfScopeCount);
56
+ this.logSkipped(skipped);
57
+ if (mappings.length === 0) {
58
+ return;
59
+ }
60
+ const batches = Chunker_1.Slicer.chunkArray(mappings, EnapoGidMappingSyncTask_1.SAVE_BATCH_SIZE);
61
+ const transaction = await this.dbConnector.getConnection().transaction();
62
+ try {
63
+ for (const batch of batches) {
64
+ await this.repository.bulkSave(batch, undefined, undefined, undefined, transaction);
65
+ }
66
+ await transaction.commit();
67
+ }
68
+ catch (err) {
69
+ await transaction.rollback();
70
+ throw err;
71
+ }
72
+ }
73
+ catch (err) {
74
+ if (err instanceof golemio_errors_1.AbstractGolemioError) {
75
+ throw err;
76
+ }
77
+ throw new golemio_errors_1.GeneralError("Failed to sync the enapo gid mapping.", this.constructor.name, err);
78
+ }
79
+ }
80
+ /**
81
+ * The routine outcome of a run, including the water/heat rows that are filtered out on purpose. This
82
+ * is expected volume, so it never warns - it only has to stay visible.
83
+ */
84
+ logOutcome(totalRows, savedRows, outOfScopeCount) {
85
+ this.logger.info(`${this.constructor.name}: read ${totalRows} gid mapping rows, saving ${savedRows}, ` +
86
+ `${outOfScopeCount} out of scope (water/heat).`);
87
+ }
88
+ /**
89
+ * Rows that should have been usable but were not. Kept separate from the out-of-scope count so a
90
+ * large expected filter volume cannot hide a handful of real defects.
91
+ */
92
+ logSkipped(skipped) {
93
+ if (skipped.total === 0) {
94
+ return;
95
+ }
96
+ const reasons = Object.keys(skipped.byReason);
97
+ const detail = reasons
98
+ .filter((reason) => skipped.byReason[reason] > 0)
99
+ .map((reason) => `${reason}=${skipped.byReason[reason]} (e.g. ${skipped.samples[reason].join(", ") || "-"})`)
100
+ .join("; ");
101
+ this.logger.warn(`${this.constructor.name}: could not process ${skipped.total} gid mapping rows. ${detail}`);
102
+ }
103
+ };
104
+ exports.EnapoGidMappingSyncTask = EnapoGidMappingSyncTask;
105
+ /**
106
+ * The whole export goes in as a single insert per batch, so the batch has to stay below the Postgres
107
+ * bind-parameter limit (65535); eight columns per row leave room for well over this many.
108
+ */
109
+ EnapoGidMappingSyncTask.SAVE_BATCH_SIZE = 5000;
110
+ exports.EnapoGidMappingSyncTask = EnapoGidMappingSyncTask = EnapoGidMappingSyncTask_1 = __decorate([
111
+ (0, tsyringe_1.injectable)(),
112
+ __param(0, (0, tsyringe_1.inject)(CoreToken_1.CoreToken.Logger)),
113
+ __param(1, (0, tsyringe_1.inject)(CoreToken_1.CoreToken.PostgresConnector)),
114
+ __param(2, (0, tsyringe_1.inject)(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.EnapoGidMappingDataSource)),
115
+ __param(3, (0, tsyringe_1.inject)(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.EnapoGidMappingNormalizer)),
116
+ __param(4, (0, tsyringe_1.inject)(EnapoWorkerContainerToken_1.EnapoWorkerContainerToken.EnapoGidMappingRepository)),
117
+ __metadata("design:paramtypes", [Object, Object, EnapoGidMappingDataSource_1.EnapoGidMappingDataSource,
118
+ EnapoGidMappingNormalizer_1.EnapoGidMappingNormalizer,
119
+ EnapoGidMappingRepository_1.EnapoGidMappingRepository])
120
+ ], EnapoGidMappingSyncTask);
121
+ //# sourceMappingURL=EnapoGidMappingSyncTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EnapoGidMappingSyncTask.js","sourceRoot":"","sources":["../../../../../src/integration-engine/enapo/workers/task/EnapoGidMappingSyncTask.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { JSONSchemaType } from "@golemio/core/dist/shared/ajv";
2
+ import { IEnapoGidMappingCsvRow } from "./interfaces/IEnapoGidMappingCsvRow";
3
+ export declare const enapoGidMappingCsvSchema: JSONSchemaType<IEnapoGidMappingCsvRow[]>;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.enapoGidMappingCsvSchema = void 0;
4
+ // Guards only the shape of the export contract: every column present as a string (CSV yields an empty
5
+ // string for a blank cell). Value normalization and business rules live in the transformation.
6
+ exports.enapoGidMappingCsvSchema = {
7
+ type: "array",
8
+ items: {
9
+ type: "object",
10
+ properties: {
11
+ place_id: { type: "string" },
12
+ id_type: { type: "string" },
13
+ commodity: { type: "string" },
14
+ gid: { type: "string" },
15
+ is_first_gid: { type: "string" },
16
+ link_source: { type: "string" },
17
+ valid_from: { type: "string" },
18
+ valid_to: { type: "string" },
19
+ },
20
+ required: ["place_id", "id_type", "commodity", "gid", "is_first_gid", "link_source", "valid_from", "valid_to"],
21
+ },
22
+ };
23
+ //# sourceMappingURL=EnapoGidMappingCsvSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EnapoGidMappingCsvSchema.js","sourceRoot":"","sources":["../../../../../src/schema-definitions/datasources/enapo/gid-mapping/EnapoGidMappingCsvSchema.ts"],"names":[],"mappings":";;;AAGA,sGAAsG;AACtG,+FAA+F;AAClF,QAAA,wBAAwB,GAA6C;IAC9E,IAAI,EAAE,OAAO;IACb,KAAK,EAAE;QACH,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACR,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC5B,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC3B,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC7B,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACvB,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAChC,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC/B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC9B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC/B;QACD,QAAQ,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,CAAC;KACjH;CACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Raw row of the ded_gid_mapping CSV export as delivered to blob storage by the data team.
3
+ * Every value arrives as a string (or empty string for a missing value); normalization and typing
4
+ * happen in the transformation, so the ingest never trusts the raw shape.
5
+ */
6
+ export interface IEnapoGidMappingCsvRow {
7
+ place_id: string;
8
+ id_type: string;
9
+ commodity: string;
10
+ gid: string;
11
+ is_first_gid: string;
12
+ link_source: string;
13
+ valid_from: string;
14
+ valid_to: string;
15
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IEnapoGidMappingCsvRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IEnapoGidMappingCsvRow.js","sourceRoot":"","sources":["../../../../../../src/schema-definitions/datasources/enapo/gid-mapping/interfaces/IEnapoGidMappingCsvRow.ts"],"names":[],"mappings":""}
@@ -34,7 +34,6 @@ EnapoGidMappingModel.attributeModel = {
34
34
  link_source: {
35
35
  type: sequelize_1.DataTypes.STRING(50),
36
36
  allowNull: false,
37
- primaryKey: true,
38
37
  },
39
38
  valid_from: {
40
39
  type: sequelize_1.DataTypes.DATEONLY,
@@ -1 +1 @@
1
- {"version":3,"file":"EnapoGidMappingModel.js","sourceRoot":"","sources":["../../../../src/schema-definitions/models/enapo/EnapoGidMappingModel.ts"],"names":[],"mappings":";;;AACA,mEAAwF;AAGxF,MAAa,oBAAqB,SAAQ,iBAAuB;;AAAjE,oDAmEC;AAlEiB,+BAAU,GAAG,mBAAmB,CAAC;AACjC,oCAAe,GAAG,2BAA2B,CAAC;AAW9C,mCAAc,GAA4D;IACpF,QAAQ,EAAE;QACN,IAAI,EAAE,qBAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,IAAI;KACnB;IACD,OAAO,EAAE;QACL,IAAI,EAAE,qBAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,SAAS,EAAE,KAAK;KACnB;IACD,SAAS,EAAE;QACP,IAAI,EAAE,qBAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,SAAS,EAAE,KAAK;KACnB;IACD,GAAG,EAAE;QACD,IAAI,EAAE,qBAAS,CAAC,MAAM;QACtB,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,IAAI;KACnB;IACD,YAAY,EAAE;QACV,IAAI,EAAE,qBAAS,CAAC,OAAO;QACvB,SAAS,EAAE,KAAK;QAChB,YAAY,EAAE,KAAK;KACtB;IACD,WAAW,EAAE;QACT,IAAI,EAAE,qBAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,IAAI;KACnB;IACD,UAAU,EAAE;QACR,IAAI,EAAE,qBAAS,CAAC,QAAQ;KAC3B;IACD,QAAQ,EAAE;QACN,IAAI,EAAE,qBAAS,CAAC,QAAQ;KAC3B;CACJ,CAAC;AAEY,+BAAU,GAAuC;IAC3D,IAAI,EAAE,OAAO;IACb,KAAK,EAAE;QACH,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACR,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC5B,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;YACjD,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;YAC5E,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACvB,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YACjC,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC/B,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;YAC7E,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;SAC9E;QACD,QAAQ,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,CAAC;KACvF;CACJ,CAAC"}
1
+ {"version":3,"file":"EnapoGidMappingModel.js","sourceRoot":"","sources":["../../../../src/schema-definitions/models/enapo/EnapoGidMappingModel.ts"],"names":[],"mappings":";;;AACA,mEAAwF;AAGxF,MAAa,oBAAqB,SAAQ,iBAAuB;;AAAjE,oDAkEC;AAjEiB,+BAAU,GAAG,mBAAmB,CAAC;AACjC,oCAAe,GAAG,2BAA2B,CAAC;AAW9C,mCAAc,GAA4D;IACpF,QAAQ,EAAE;QACN,IAAI,EAAE,qBAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,IAAI;KACnB;IACD,OAAO,EAAE;QACL,IAAI,EAAE,qBAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,SAAS,EAAE,KAAK;KACnB;IACD,SAAS,EAAE;QACP,IAAI,EAAE,qBAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,SAAS,EAAE,KAAK;KACnB;IACD,GAAG,EAAE;QACD,IAAI,EAAE,qBAAS,CAAC,MAAM;QACtB,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,IAAI;KACnB;IACD,YAAY,EAAE;QACV,IAAI,EAAE,qBAAS,CAAC,OAAO;QACvB,SAAS,EAAE,KAAK;QAChB,YAAY,EAAE,KAAK;KACtB;IACD,WAAW,EAAE;QACT,IAAI,EAAE,qBAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,SAAS,EAAE,KAAK;KACnB;IACD,UAAU,EAAE;QACR,IAAI,EAAE,qBAAS,CAAC,QAAQ;KAC3B;IACD,QAAQ,EAAE;QACN,IAAI,EAAE,qBAAS,CAAC,QAAQ;KAC3B;CACJ,CAAC;AAEY,+BAAU,GAAuC;IAC3D,IAAI,EAAE,OAAO;IACb,KAAK,EAAE;QACH,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACR,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC5B,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;YACjD,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;YAC5E,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACvB,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YACjC,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC/B,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;YAC7E,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;SAC9E;QACD,QAAQ,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,CAAC;KACvF;CACJ,CAAC"}
@@ -700,6 +700,40 @@ Task přegeneruje materializovaný pohled `mv_enapo_om_consumption`, ze kterého
700
700
  - unit testy
701
701
  - [EnapoConsumptionHistoryRefreshTask.test.ts](../test/integration-engine/enapo/task/EnapoConsumptionHistoryRefreshTask.test.ts)
702
702
 
703
+ #### _task: EnapoGidMappingSyncTask_
704
+
705
+ Task denně synchronizuje mapování odběrných míst (EAN/EIC) na GID budov z CSV exportu v blob storage do tabulky `energetics.enapo_gid_mapping`. Rozsah je elektřina a plyn; voda a teplo se filtrují jako mimo rozsah.
706
+
707
+ - zdroj dat
708
+ - CSV `ded_gid_mapping` v Azure Blob Storage, kontejner `golem-energetics` (prod) / `rabin-energetics` (rabin)
709
+ - plná URL z configu `module.energetics.enapo.gidMapping.url` — jedna hodnota, ne base + path, aby unesla i SAS token v query stringu
710
+ - CSV dodává datový tým (výstup z dbt), modul ho jen konzumuje; za obsah a denní obnovu odpovídá producent
711
+ - formát: UTF-8, delimiter `,`, hlavička na prvním řádku
712
+ - CSV kontrakt (sloupce = `enapo_gid_mapping` bez vody/tepla)
713
+ - `place_id` (EAN/EIC, ≤ 50 znaků), `id_type` (`ean` = elektřina / `eic` = plyn), `commodity` (`electricity` / `gas`), `gid` (GID budovy/stavby), `is_first_gid` (bool), `link_source` (v CSV např. `eb_ean_eic`; slouží už jen k odfiltrování vody/tepla přes `eb_cis_odb_mista`, do tabulky se neukládá), `valid_from` a `valid_to` (date `YYYY-MM-DD`, případná časová část se zahazuje; u `valid_to` je `1900-01-01` nebo prázdno = nezrušeno = NULL)
714
+ - normalizaci a validaci provádí [EnapoGidMappingNormalizer](../src/integration-engine/enapo/helpers/EnapoGidMappingNormalizer.ts) podle [ded_gid_mapping_mock_import.sql](../db/scripts/ded_gid_mapping_mock_import.sql): dopočet `id_type`↔`commodity`, zahození rozporných párů, `1900-01-01`→NULL, výběr aktivního a nejnovějšího mapování mezi duplicitami
715
+ - dedupuje na PK (`place_id`, `gid`) a `link_source` u všech řádků nastavuje na `manual_entry` (hodnota z CSV se neukládá)
716
+ - vstupní rabbitmq fronta
717
+ - název: dataplatform.enapoenergetics.syncEnapoGidMapping
718
+ - TTL: 30 minut (starší zpráva už je překonaná novější)
719
+ - parametry: žádné — task vždy ingestuje celý export, takže není co validovat a `schema` je záměrně `undefined`
720
+ - cron definice
721
+ - cron.dataplatform.enapoenergetics.syncEnapoGidMapping — denní běh, nejlépe krátce po obnově CSV producentem
722
+ - rabin `0 15 3 * * *`
723
+ - prod `0 15 3 * * *`
724
+ - samotná definice cronu je vedena mimo tento repozitář (deployment konfigurace); hodnoty výše jsou zamýšlený rozvrh
725
+ - data modely
726
+ - [EnapoGidMappingRepository](../src/integration-engine/enapo/repositories/EnapoGidMappingRepository.ts) — `savingType: "insertOrUpdate"` nad `enapo_gid_mapping` (PK `place_id` + `gid`)
727
+ - funkce
728
+ - **upsert-only, nic se nemaže**: nové mapování se vloží, existující aktualizuje, chybějící v tabulce zůstane. Opakovaný běh nad stejnými vstupy dá stejný výsledek bez duplicit
729
+ - **robustní vůči nečistým datům**: producenta k čistému exportu nedonutíme, takže co task neumí zpracovat, přeskočí a **zaloguje warning** se souhrnem (počet a pár vzorků na každý důvod: `missing_required`, `place_id_too_long`, `invalid_date`, `contradicting_pair`, `unresolvable_commodity`). Jeden vadný řádek běh neshodí — délkové a datové limity chrání typované cílové sloupce před hodnotou, která by jinak shodila celou dávku
730
+ - **voda a teplo nejsou chyba, jen mimo rozsah**: filtrují se jako první a pouze se spočítají. Jejich počet jde do `logger.info`, `logger.warn` zůstává vyhrazený pro skutečné defekty, aby velký očekávaný objem nepřehlušil pár reálných anomálií
731
+ - zápis běží v jedné transakci po dávkách 5 000 řádků — jeden `INSERT` nad celým exportem by narazil na limit 65535 bind parametrů Postgresu. Dedup před zápisem je nutný i technicky (`insertOrUpdate` nesmí v jedné dávce zasáhnout stejný PK dvakrát); selhání kterékoli dávky rolluje celý běh
732
+ - join na měření: `enapo_gid_mapping.place_id` je kód EAN/EIC (`enapo_measurements.place_id` je naopak interní PPAS place id — viz [Sémantika `var`](#sémantika-var-v-enapo_measurements-ověřeno-proti-produkci-2026-08-13))
733
+ - unit testy
734
+ - [EnapoGidMappingSyncTask.test.ts](../test/integration-engine/enapo/task/EnapoGidMappingSyncTask.test.ts)
735
+ - [EnapoGidMappingNormalizer.test.ts](../test/integration-engine/enapo/helpers/EnapoGidMappingNormalizer.test.ts)
736
+
703
737
  #### _Sémantika `var` v `enapo_measurements` (ověřeno proti produkci 2026-08-13)_
704
738
 
705
739
  Sloupec `value` míchá **kumulativní stavy měřidla** a **rozdíly za interval**, rozlišené pouze podle `(source, var)`. Agregace bez tohoto rozlišení dává nesmysly.
@@ -989,8 +1023,8 @@ Přehled endpointů a parametru `accessLimit`:
989
1023
  - `v_enapo_building_porsenna_devices` — měřidla Porsenny s budovou (`enapo_porsenna_devices` × `enapo_porsenna_buildings` přes `(source, building_id)`); slouží pro obohacení OM o blok `porsenna` (měřidlo + podružná měřidla) a pro blok `energy_management` na úrovni budovy; spotřeby Porsenny blok nenese — jdou přes `mv_enapo_om_consumption` do `consumption_history` daného OM, kde mají navíc pokrytí a počty přispěvatelů
990
1024
  - `enapo_ppas_distribution_invoice_device` / `_price`, `enapo_ppas_commercial_invoice_device` / `_price` — dotahované podle id faktury a filtrované podle `place_id` instalace (jedna faktura může účtovat více OM, bez filtru by se řádky mísily)
991
1025
  - mapovací tabulka `enapo_gid_mapping`
992
- - vlastní kontrakt modulu; aktuálně plněná mock daty (`link_source = 'mock'`)
993
- - v budoucnu ji bude plnit synchronizační task z dbt výstupu datového týmu (`tmp.ded_gid_mapping`, `link_source = 'energobroker_kod_eno'`)
1026
+ - vlastní kontrakt modulu; plněná denně synchronizačním taskem [EnapoGidMappingSyncTask](#task-enapogidmappingsynctask) z CSV exportu (synchronizované řádky mají `link_source = 'manual_entry'`)
1027
+ - PK je (`place_id`, `gid`); mock data (`link_source = 'mock'`) z ruční přípravy zůstávají, dokud je sync nepřepíše — synchronizovaný řádek pro stejné (`place_id`, `gid`) mock řádek přepíše
994
1028
  - sloupec `is_active` v pohledu je odvozený z `valid_to` (NULL nebo v budoucnu = aktivní); expirovaná mapování se vracejí s příznakem
995
1029
  - struktura odpovědi
996
1030
  - komoditně specifická data jsou vnořená pod klíči `electricity` / `gas` u každého OM; v odpovědi je pouze klíč odpovídající poli `commodity`, ostatní jsou zcela vynechány
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@golemio/energetics",
3
- "version": "1.13.1-dev.2773070597",
3
+ "version": "1.13.1-dev.2809036872",
4
4
  "description": "Golemio Energetics Module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",