@fin.cx/opendata 1.4.0 → 1.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.businessrecord.d.ts +8 -0
- package/dist_ts/classes.businessrecord.js +20 -2
- package/dist_ts/classes.handelsregister.d.ts +42 -1
- package/dist_ts/classes.handelsregister.js +26 -9
- package/dist_ts/classes.jsonldata.d.ts +40 -5
- package/dist_ts/classes.jsonldata.js +12 -25
- package/dist_ts/classes.main.opendata.d.ts +5 -2
- package/dist_ts/classes.main.opendata.js +18 -2
- package/dist_ts/plugins.d.ts +3 -1
- package/dist_ts/plugins.js +4 -2
- package/npmextra.json +3 -0
- package/package.json +13 -11
- package/readme.md +19 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.businessrecord.ts +22 -0
- package/ts/classes.handelsregister.ts +28 -9
- package/ts/classes.jsonldata.ts +67 -39
- package/ts/classes.main.opendata.ts +35 -11
- package/ts/plugins.ts +4 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@fin.cx/opendata',
|
|
6
|
-
version: '1.4.
|
|
6
|
+
version: '1.4.4',
|
|
7
7
|
description: 'A TypeScript library for accessing, managing, and updating open business data, focused on German companies and integrating with MongoDB.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxrQkFBa0I7SUFDeEIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLDBJQUEwSTtDQUN4SixDQUFBIn0=
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
2
|
export declare class BusinessRecord extends plugins.smartdata.SmartDataDbDoc<BusinessRecord, BusinessRecord> {
|
|
3
|
+
static getByGermanParsedRegistration: (parsedGermanRegistrationArg: BusinessRecord["data"]["germanParsedRegistration"]) => Promise<BusinessRecord>;
|
|
3
4
|
id: string;
|
|
4
5
|
data: {
|
|
5
6
|
name?: string;
|
|
7
|
+
startDate?: string;
|
|
8
|
+
endDate?: string;
|
|
9
|
+
status?: 'active' | 'liquidating' | 'closed';
|
|
6
10
|
address?: string;
|
|
7
11
|
postalCode?: string;
|
|
8
12
|
city?: string;
|
|
@@ -27,4 +31,8 @@ export declare class BusinessRecord extends plugins.smartdata.SmartDataDbDoc<Bus
|
|
|
27
31
|
purpose?: string;
|
|
28
32
|
lastUpdate?: string;
|
|
29
33
|
};
|
|
34
|
+
/**
|
|
35
|
+
* validates the record against the Handelregister.
|
|
36
|
+
*/
|
|
37
|
+
validate(): Promise<void>;
|
|
30
38
|
}
|
|
@@ -7,12 +7,30 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
8
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
9
|
};
|
|
10
|
+
var BusinessRecord_1;
|
|
10
11
|
import * as plugins from './plugins.js';
|
|
11
12
|
let BusinessRecord = class BusinessRecord extends plugins.smartdata.SmartDataDbDoc {
|
|
12
13
|
constructor() {
|
|
13
14
|
super(...arguments);
|
|
14
15
|
this.data = {};
|
|
15
16
|
}
|
|
17
|
+
static { BusinessRecord_1 = this; }
|
|
18
|
+
// STATIC
|
|
19
|
+
static { this.getByGermanParsedRegistration = async (parsedGermanRegistrationArg) => {
|
|
20
|
+
const businessRecords = await BusinessRecord_1.getInstance({
|
|
21
|
+
data: {
|
|
22
|
+
germanParsedRegistration: parsedGermanRegistrationArg,
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
return businessRecords;
|
|
26
|
+
}; }
|
|
27
|
+
/**
|
|
28
|
+
* validates the record against the Handelregister.
|
|
29
|
+
*/
|
|
30
|
+
async validate() {
|
|
31
|
+
if (!this.data.name)
|
|
32
|
+
throw new Error('Name is required.');
|
|
33
|
+
}
|
|
16
34
|
};
|
|
17
35
|
__decorate([
|
|
18
36
|
plugins.smartdata.unI(),
|
|
@@ -22,8 +40,8 @@ __decorate([
|
|
|
22
40
|
plugins.smartdata.svDb(),
|
|
23
41
|
__metadata("design:type", Object)
|
|
24
42
|
], BusinessRecord.prototype, "data", void 0);
|
|
25
|
-
BusinessRecord = __decorate([
|
|
43
|
+
BusinessRecord = BusinessRecord_1 = __decorate([
|
|
26
44
|
plugins.smartdata.Manager()
|
|
27
45
|
], BusinessRecord);
|
|
28
46
|
export { BusinessRecord };
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5idXNpbmVzc3JlY29yZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuYnVzaW5lc3NyZWNvcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBR2pDLElBQU0sY0FBYyxHQUFwQixNQUFNLGNBQWUsU0FBUSxPQUFPLENBQUMsU0FBUyxDQUFDLGNBR3JEO0lBSE07O1FBb0JMLFNBQUksR0FtQ0EsRUFBRSxDQUFDO0lBUVQsQ0FBQzs7SUEzREMsU0FBUzthQUNLLGtDQUE2QixHQUFHLEtBQUssRUFBRSwyQkFBK0UsRUFBRSxFQUFFO1FBQ3RJLE1BQU0sZUFBZSxHQUFHLE1BQU0sZ0JBQWMsQ0FBQyxXQUFXLENBQUM7WUFDdkQsSUFBSSxFQUFFO2dCQUNKLHdCQUF3QixFQUFFLDJCQUEyQjthQUN0RDtTQUNGLENBQUMsQ0FBQztRQUNILE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUMsQUFQMEMsQ0FPekM7SUE2Q0Y7O09BRUc7SUFDSSxLQUFLLENBQUMsUUFBUTtRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQzVELENBQUM7O0FBN0NEO0lBREMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7OzBDQUNiO0FBR1g7SUFEQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTs7NENBb0NsQjtBQXZESSxjQUFjO0lBRDFCLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFO0dBQ2YsY0FBYyxDQStEMUIifQ==
|
|
@@ -28,8 +28,11 @@ export declare class HandelsRegister {
|
|
|
28
28
|
/**
|
|
29
29
|
* Search for a company by name and return basic info
|
|
30
30
|
*/
|
|
31
|
-
searchCompany(companyNameArg: string): Promise<{
|
|
31
|
+
searchCompany(companyNameArg: string, resultsLimitArg?: number): Promise<{
|
|
32
32
|
name?: string;
|
|
33
|
+
startDate?: string;
|
|
34
|
+
endDate?: string;
|
|
35
|
+
status?: "active" | "liquidating" | "closed";
|
|
33
36
|
address?: string;
|
|
34
37
|
postalCode?: string;
|
|
35
38
|
city?: string;
|
|
@@ -61,6 +64,44 @@ export declare class HandelsRegister {
|
|
|
61
64
|
getSpecificCompany(companyArg: BusinessRecord['data']['germanParsedRegistration']): Promise<{
|
|
62
65
|
businessRecords: {
|
|
63
66
|
name?: string;
|
|
67
|
+
startDate?: string;
|
|
68
|
+
endDate?: string;
|
|
69
|
+
status?: "active" | "liquidating" | "closed";
|
|
70
|
+
address?: string;
|
|
71
|
+
postalCode?: string;
|
|
72
|
+
city?: string;
|
|
73
|
+
country?: string;
|
|
74
|
+
phone?: string;
|
|
75
|
+
fax?: string;
|
|
76
|
+
email?: string;
|
|
77
|
+
website?: string;
|
|
78
|
+
businessType?: string;
|
|
79
|
+
registrationId?: string;
|
|
80
|
+
germanParsedRegistration?: {
|
|
81
|
+
court?: string;
|
|
82
|
+
type?: "HRA" | "HRB" | "GnR" | "PR" | "VR" | "GsR";
|
|
83
|
+
number?: string;
|
|
84
|
+
};
|
|
85
|
+
legalForm?: "GmbH" | "GmbH & Co. KG" | "AG" | "LLC" | "LLP" | "GmbH & Co. KGaA" | "GmbH & Co. KGaA, LLC";
|
|
86
|
+
managingDirectors?: string[];
|
|
87
|
+
boardOfDirectors?: string[];
|
|
88
|
+
supervisoryBoard?: string[];
|
|
89
|
+
foundingDate?: string;
|
|
90
|
+
capital?: string;
|
|
91
|
+
purpose?: string;
|
|
92
|
+
lastUpdate?: string;
|
|
93
|
+
}[];
|
|
94
|
+
files: plugins.smartfile.SmartFile[];
|
|
95
|
+
}>;
|
|
96
|
+
/**
|
|
97
|
+
* get specific company by full name
|
|
98
|
+
*/
|
|
99
|
+
getSpecificCompanyByName(companyNameArg: string): Promise<{
|
|
100
|
+
businessRecords: {
|
|
101
|
+
name?: string;
|
|
102
|
+
startDate?: string;
|
|
103
|
+
endDate?: string;
|
|
104
|
+
status?: "active" | "liquidating" | "closed";
|
|
64
105
|
address?: string;
|
|
65
106
|
postalCode?: string;
|
|
66
107
|
city?: string;
|
|
@@ -75,12 +75,12 @@ export class HandelsRegister {
|
|
|
75
75
|
});
|
|
76
76
|
return businessRecords;
|
|
77
77
|
};
|
|
78
|
-
this.clickFindButton = async (pageArg) => {
|
|
78
|
+
this.clickFindButton = async (pageArg, resultsLimitArg = 100) => {
|
|
79
79
|
try {
|
|
80
80
|
// Wait for the button with the text "Find" to appear
|
|
81
81
|
await pageArg.waitForSelector('span.ui-button-text.ui-c', { timeout: 5000 });
|
|
82
82
|
// adjust to 100 results per page
|
|
83
|
-
await pageArg.select('#form\\:ergebnisseProSeite_input',
|
|
83
|
+
await pageArg.select('#form\\:ergebnisseProSeite_input', `${resultsLimitArg}`);
|
|
84
84
|
// Locate and click the button using its text
|
|
85
85
|
await pageArg.evaluate(() => {
|
|
86
86
|
const buttons = Array.from(document.querySelectorAll('span.ui-button-text.ui-c'));
|
|
@@ -144,12 +144,21 @@ export class HandelsRegister {
|
|
|
144
144
|
throw new Error('Invalid file type');
|
|
145
145
|
}
|
|
146
146
|
}, typeArg);
|
|
147
|
-
|
|
148
|
-
// a more robust file-exists check or a wait-for-download library)
|
|
149
|
-
await pageArg.waitForTimeout(10000);
|
|
147
|
+
await plugins.smartfile.fs.waitForFileToBeReady(this.uniqueDowloadFolder);
|
|
150
148
|
const files = await plugins.smartfile.fs.fileTreeToObject(this.uniqueDowloadFolder, '**/*');
|
|
149
|
+
const file = files[0];
|
|
150
|
+
// lets clear the folder for the next download
|
|
151
151
|
await plugins.smartfile.fs.ensureEmptyDir(this.uniqueDowloadFolder);
|
|
152
|
-
|
|
152
|
+
switch (typeArg) {
|
|
153
|
+
case 'AD':
|
|
154
|
+
await file.rename(`ad.pdf`);
|
|
155
|
+
break;
|
|
156
|
+
case 'SI':
|
|
157
|
+
await file.rename(`si.xml`);
|
|
158
|
+
break;
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
return file;
|
|
153
162
|
}
|
|
154
163
|
/**
|
|
155
164
|
* Helper method to parse the German registration string
|
|
@@ -169,7 +178,7 @@ export class HandelsRegister {
|
|
|
169
178
|
/**
|
|
170
179
|
* Search for a company by name and return basic info
|
|
171
180
|
*/
|
|
172
|
-
async searchCompany(companyNameArg) {
|
|
181
|
+
async searchCompany(companyNameArg, resultsLimitArg = 100) {
|
|
173
182
|
return this.asyncExecutionStack.getExclusiveExecutionSlot(async () => {
|
|
174
183
|
const page = await this.getNewPage();
|
|
175
184
|
await this.navigateToPage(page, 'Normal search');
|
|
@@ -207,7 +216,7 @@ export class HandelsRegister {
|
|
|
207
216
|
catch (error) {
|
|
208
217
|
console.error('Failed to find or click the radio button:', error);
|
|
209
218
|
}
|
|
210
|
-
await this.clickFindButton(page);
|
|
219
|
+
await this.clickFindButton(page, resultsLimitArg);
|
|
211
220
|
const businessRecords = await this.waitForResults(page);
|
|
212
221
|
// Parse out the registration info
|
|
213
222
|
for (const record of businessRecords) {
|
|
@@ -267,5 +276,13 @@ export class HandelsRegister {
|
|
|
267
276
|
};
|
|
268
277
|
}, 60000);
|
|
269
278
|
}
|
|
279
|
+
/**
|
|
280
|
+
* get specific company by full name
|
|
281
|
+
*/
|
|
282
|
+
async getSpecificCompanyByName(companyNameArg) {
|
|
283
|
+
const businessRecords = await this.searchCompany(companyNameArg, 1);
|
|
284
|
+
const result = this.getSpecificCompany(businessRecords[0].germanParsedRegistration);
|
|
285
|
+
return result;
|
|
286
|
+
}
|
|
270
287
|
}
|
|
271
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5oYW5kZWxzcmVnaXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmhhbmRlbHNyZWdpc3Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssS0FBSyxNQUFNLFlBQVksQ0FBQztBQUVwQzs7R0FFRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBUTFCLFlBQVksV0FBcUI7UUFOekIsd0JBQW1CLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDNUQsd0JBQW1CLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFFcEcsNkJBQTZCO1FBQ3RCLHlCQUFvQixHQUFHLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQWtCdEU7OztXQUdHO1FBQ0ksZUFBVSxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQzdCLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUV2RSw2Q0FBNkM7WUFDN0MsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUUxRCxvREFBb0Q7WUFDcEQsTUFBTSxVQUFVLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFO2dCQUNoRCxRQUFRLEVBQUUsT0FBTztnQkFDakIsWUFBWSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxnREFBZ0Q7YUFDekYsQ0FBQyxDQUFDO1lBRUgseUNBQXlDO1lBQ3pDLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUs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
|
|
288
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5oYW5kZWxzcmVnaXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmhhbmRlbHNyZWdpc3Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssS0FBSyxNQUFNLFlBQVksQ0FBQztBQUVwQzs7R0FFRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBUTFCLFlBQVksV0FBcUI7UUFOekIsd0JBQW1CLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDNUQsd0JBQW1CLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFFcEcsNkJBQTZCO1FBQ3RCLHlCQUFvQixHQUFHLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQWtCdEU7OztXQUdHO1FBQ0ksZUFBVSxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQzdCLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUV2RSw2Q0FBNkM7WUFDN0MsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUUxRCxvREFBb0Q7WUFDcEQsTUFBTSxVQUFVLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFO2dCQUNoRCxRQUFRLEVBQUUsT0FBTztnQkFDakIsWUFBWSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxnREFBZ0Q7YUFDekYsQ0FBQyxDQUFDO1lBRUgseUNBQXlDO1lBQ3pDLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUs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
|
|
@@ -1,7 +1,42 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
export type SeedEntryType = {
|
|
2
|
+
all_attributes: {
|
|
3
|
+
_registerArt: string;
|
|
4
|
+
_registerNummer: string;
|
|
5
|
+
additional_data: {
|
|
6
|
+
AD: boolean;
|
|
7
|
+
CD: boolean;
|
|
8
|
+
DK: boolean;
|
|
9
|
+
HD: boolean;
|
|
10
|
+
SI: boolean;
|
|
11
|
+
UT: boolean;
|
|
12
|
+
VÖ: boolean;
|
|
13
|
+
};
|
|
14
|
+
federal_state: string;
|
|
15
|
+
native_company_number: string;
|
|
16
|
+
registered_office: string;
|
|
17
|
+
registrar: string;
|
|
18
|
+
};
|
|
19
|
+
company_number: string;
|
|
20
|
+
current_status: string;
|
|
21
|
+
jurisdiction_code: string;
|
|
22
|
+
name: string;
|
|
23
|
+
officers: {
|
|
24
|
+
name: string;
|
|
25
|
+
other_attributes: {
|
|
26
|
+
city: string;
|
|
27
|
+
firstname: string;
|
|
28
|
+
flag: string;
|
|
29
|
+
lastname: string;
|
|
30
|
+
};
|
|
31
|
+
position: string;
|
|
32
|
+
start_date: string;
|
|
33
|
+
type: string;
|
|
34
|
+
}[];
|
|
35
|
+
registered_address: string;
|
|
36
|
+
retrieved_at: string;
|
|
37
|
+
};
|
|
38
|
+
export declare class JsonlDataProcessor<T> {
|
|
39
|
+
forEachFunction: (entryArg: T) => Promise<void>;
|
|
40
|
+
constructor(forEachFunctionArg: typeof this.forEachFunction);
|
|
5
41
|
processDataFromUrl(dataUrlArg?: string): Promise<void>;
|
|
6
|
-
getBusinessRecordByName(nameArg: string): Promise<import("./classes.businessrecord.js").BusinessRecord>;
|
|
7
42
|
}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
2
|
import * as paths from './paths.js';
|
|
3
3
|
export class JsonlDataProcessor {
|
|
4
|
-
constructor(
|
|
5
|
-
this.
|
|
4
|
+
constructor(forEachFunctionArg) {
|
|
5
|
+
this.forEachFunction = forEachFunctionArg;
|
|
6
6
|
}
|
|
7
7
|
// TODO: define a mapper as argument instead of hard-coding it
|
|
8
8
|
async processDataFromUrl(dataUrlArg = 'https://daten.offeneregister.de/de_companies_ocdata.jsonl.bz2') {
|
|
9
9
|
const done = plugins.smartpromise.defer();
|
|
10
|
-
const promiseArray = [];
|
|
11
10
|
const dataExists = await plugins.smartfile.fs.isDirectory(paths.germanBusinessDataDir);
|
|
12
11
|
if (!dataExists) {
|
|
13
12
|
await plugins.smartfile.fs.ensureDir(paths.germanBusinessDataDir);
|
|
@@ -15,8 +14,6 @@ export class JsonlDataProcessor {
|
|
|
15
14
|
else {
|
|
16
15
|
}
|
|
17
16
|
const smartarchive = await plugins.smartarchive.SmartArchive.fromArchiveUrl(dataUrlArg);
|
|
18
|
-
promiseArray
|
|
19
|
-
.push();
|
|
20
17
|
const jsonlDataStream = await smartarchive.exportToStreamOfStreamFiles();
|
|
21
18
|
let totalRecordsCounter = 0;
|
|
22
19
|
let nextRest = '';
|
|
@@ -31,47 +28,37 @@ export class JsonlDataProcessor {
|
|
|
31
28
|
const lines = currentString.split('\n');
|
|
32
29
|
nextRest = lines.pop();
|
|
33
30
|
console.log(`Got another ${lines.length} records.`);
|
|
34
|
-
|
|
31
|
+
const concurrentProcessor = new plugins.smartarray.ConcurrentProcessor(async (line) => {
|
|
35
32
|
let entry;
|
|
36
33
|
if (!line)
|
|
37
|
-
|
|
34
|
+
return;
|
|
38
35
|
try {
|
|
39
36
|
entry = JSON.parse(line);
|
|
40
|
-
console.log(JSON.stringify(entry, null, 2));
|
|
41
|
-
process.exit(0);
|
|
42
37
|
}
|
|
43
38
|
catch (err) {
|
|
44
39
|
console.log(line);
|
|
45
40
|
await plugins.smartdelay.delayFor(10000);
|
|
46
41
|
}
|
|
47
42
|
if (!entry)
|
|
48
|
-
|
|
43
|
+
return;
|
|
49
44
|
totalRecordsCounter++;
|
|
50
45
|
if (totalRecordsCounter % 10000 === 0)
|
|
51
46
|
console.log(`${totalRecordsCounter} total records.`);
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
await businessRecord.save();
|
|
56
|
-
}
|
|
47
|
+
await this.forEachFunction(entry);
|
|
48
|
+
}, 1000);
|
|
49
|
+
await concurrentProcessor.process(lines);
|
|
57
50
|
},
|
|
58
51
|
finalFunction: async (streamToolsArg) => {
|
|
59
52
|
console.log(`finished processing ${totalRecordsCounter} records.`);
|
|
60
53
|
if (!nextRest)
|
|
61
54
|
return;
|
|
62
55
|
JSON.parse(nextRest);
|
|
63
|
-
|
|
56
|
+
done.resolve();
|
|
57
|
+
},
|
|
64
58
|
}));
|
|
65
59
|
},
|
|
66
60
|
}));
|
|
67
|
-
|
|
68
|
-
async getBusinessRecordByName(nameArg) {
|
|
69
|
-
const businessRecord = await this.openDataRef.CBusinessRecord.getInstance({
|
|
70
|
-
data: {
|
|
71
|
-
name: { $regex: `${nameArg}`, $options: "i" },
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
return businessRecord;
|
|
61
|
+
await done.promise;
|
|
75
62
|
}
|
|
76
63
|
}
|
|
77
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5qc29ubGRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmpzb25sZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssS0FBSyxNQUFNLFlBQVksQ0FBQztBQXlDcEMsTUFBTSxPQUFPLGtCQUFrQjtJQUU3QixZQUFZLGtCQUErQztRQUN6RCxJQUFJLENBQUMsZUFBZSxHQUFHLGtCQUFrQixDQUFDO0lBQzVDLENBQUM7SUFFRCw4REFBOEQ7SUFDdkQsS0FBSyxDQUFDLGtCQUFrQixDQUM3QixVQUFVLEdBQUcsK0RBQStEO1FBRTVFLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDdkYsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7YUFBTSxDQUFDO1FBQ1IsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLE1BQU0sT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hGLE1BQU0sZUFBZSxHQUFHLE1BQU0sWUFBWSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDekUsSUFBSSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxRQUFRLEdBQVcsRUFBRSxDQUFDO1FBQzFCLGVBQWUsQ0FBQyxJQUFJLENBQ2xCLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUM7WUFDbEMsVUFBVSxFQUFFLElBQUk7WUFDaEIsYUFBYSxFQUFFLEtBQUssRUFBRSxRQUFzQyxFQUFFLGNBQWMsRUFBRSxFQUFFO2dCQUM5RSxNQUFNLFVBQVUsR0FBRyxNQUFNLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNyRCxVQUFVLENBQUMsSUFBSSxDQUNiLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUM7b0JBQ2xDLFVBQVUsRUFBRSxJQUFJO29CQUNoQixhQUFhLEVBQUUsS0FBSyxFQUFFLFFBQWdCLEVBQUUsY0FBYyxFQUFFLEVBQUU7d0JBQ3hELE1BQU0sYUFBYSxHQUFHLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ3JELE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ3hDLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ3ZCLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxLQUFLLENBQUMsTUFBTSxXQUFXLENBQUMsQ0FBQzt3QkFDcEQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQ3BFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTs0QkFDYixJQUFJLEtBQVEsQ0FBQzs0QkFDYixJQUFJLENBQUMsSUFBSTtnQ0FBRSxPQUFPOzRCQUNsQixJQUFJLENBQUM7Z0NBQ0gsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQzNCLENBQUM7NEJBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQ0FDYixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dDQUNsQixNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUMzQyxDQUFDOzRCQUNELElBQUksQ0FBQyxLQUFLO2dDQUFFLE9BQU87NEJBQ25CLG1CQUFtQixFQUFFLENBQUM7NEJBQ3RCLElBQUksbUJBQW1CLEdBQUcsS0FBSyxLQUFLLENBQUM7Z0NBQ25DLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxtQkFBbUIsaUJBQWlCLENBQUMsQ0FBQzs0QkFDdkQsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUNwQyxDQUFDLEVBQ0QsSUFBSSxDQUNMLENBQUM7d0JBQ0YsTUFBTSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzNDLENBQUM7b0JBQ0QsYUFBYSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsRUFBRTt3QkFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsbUJBQW1CLFdBQVcsQ0FBQyxDQUFDO3dCQUNuRSxJQUFJLENBQUMsUUFBUTs0QkFBRSxPQUFPO3dCQUN0QixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUNyQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2pCLENBQUM7aUJBQ0YsQ0FBQyxDQUNILENBQUM7WUFDSixDQUFDO1NBQ0YsQ0FBQyxDQUNILENBQUM7UUFDRixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDckIsQ0FBQztDQUNGIn0=
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import { BusinessRecord } from './classes.businessrecord.js';
|
|
2
2
|
import { HandelsRegister } from './classes.handelsregister.js';
|
|
3
|
-
import { JsonlDataProcessor } from './classes.jsonldata.js';
|
|
3
|
+
import { JsonlDataProcessor, type SeedEntryType } from './classes.jsonldata.js';
|
|
4
4
|
import * as plugins from './plugins.js';
|
|
5
5
|
export declare class OpenData {
|
|
6
6
|
db: plugins.smartdata.SmartdataDb;
|
|
7
7
|
private serviceQenv;
|
|
8
|
-
jsonLDataProcessor: JsonlDataProcessor
|
|
8
|
+
jsonLDataProcessor: JsonlDataProcessor<SeedEntryType>;
|
|
9
9
|
handelsregister: HandelsRegister;
|
|
10
10
|
CBusinessRecord: typeof BusinessRecord;
|
|
11
11
|
start(): Promise<void>;
|
|
12
12
|
buildInitialDb(): Promise<void>;
|
|
13
|
+
slowValidateDb(): Promise<void>;
|
|
14
|
+
validateSearchByName(): Promise<void>;
|
|
15
|
+
searchDbByBusinessNameAndPostalCode(businessNameArg: string, postalCodeArg: string): Promise<void>;
|
|
13
16
|
stop(): Promise<void>;
|
|
14
17
|
}
|
|
@@ -16,16 +16,32 @@ export class OpenData {
|
|
|
16
16
|
mongoDbPass: await this.serviceQenv.getEnvVarOnDemand('MONGODB_PASS'),
|
|
17
17
|
});
|
|
18
18
|
await this.db.init();
|
|
19
|
-
this.jsonLDataProcessor = new JsonlDataProcessor(
|
|
19
|
+
this.jsonLDataProcessor = new JsonlDataProcessor(async (entryArg) => {
|
|
20
|
+
const businessRecord = new this.CBusinessRecord();
|
|
21
|
+
businessRecord.id = await this.CBusinessRecord.getNewId();
|
|
22
|
+
businessRecord.data.name = entryArg.name;
|
|
23
|
+
businessRecord.data.germanParsedRegistration = {
|
|
24
|
+
court: entryArg.all_attributes.registered_office,
|
|
25
|
+
number: entryArg.all_attributes._registerNummer,
|
|
26
|
+
type: entryArg.all_attributes._registerArt,
|
|
27
|
+
};
|
|
28
|
+
await businessRecord.save();
|
|
29
|
+
});
|
|
20
30
|
this.handelsregister = new HandelsRegister(this);
|
|
21
31
|
await this.handelsregister.start();
|
|
22
32
|
}
|
|
23
33
|
async buildInitialDb() {
|
|
24
34
|
await this.jsonLDataProcessor.processDataFromUrl();
|
|
25
35
|
}
|
|
36
|
+
async slowValidateDb() {
|
|
37
|
+
}
|
|
38
|
+
async validateSearchByName() {
|
|
39
|
+
}
|
|
40
|
+
async searchDbByBusinessNameAndPostalCode(businessNameArg, postalCodeArg) {
|
|
41
|
+
}
|
|
26
42
|
async stop() {
|
|
27
43
|
await this.db.close();
|
|
28
44
|
await this.handelsregister.stop();
|
|
29
45
|
}
|
|
30
46
|
}
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5tYWluLm9wZW5kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5tYWluLm9wZW5kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGtCQUFrQixFQUFzQixNQUFNLHdCQUF3QixDQUFDO0FBQ2hGLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE1BQU0sT0FBTyxRQUFRO0lBQXJCO1FBRVUsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBS3ZFLG9CQUFlLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7SUErQzNGLENBQUM7SUE3Q1EsS0FBSyxDQUFDLEtBQUs7UUFDaEIsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1lBQzFDLFVBQVUsRUFBRSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDO1lBQ25FLFdBQVcsRUFBRSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDO1lBQ3JFLFdBQVcsRUFBRSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDO1lBQ3JFLFdBQVcsRUFBRSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDO1NBQ3RFLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDbEUsTUFBTSxjQUFjLEdBQUcsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDbEQsY0FBYyxDQUFDLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDMUQsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztZQUN6QyxjQUFjLENBQUMsSUFBSSxDQUFDLHdCQUF3QixHQUFHO2dCQUM3QyxLQUFLLEVBQUUsUUFBUSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUI7Z0JBQ2hELE1BQU0sRUFBRSxRQUFRLENBQUMsY0FBYyxDQUFDLGVBQWU7Z0JBQy9DLElBQUksRUFBRSxRQUFRLENBQUMsY0FBYyxDQUFDLFlBQTZCO2FBQzVELENBQUM7WUFDRixNQUFNLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakQsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFTSxLQUFLLENBQUMsY0FBYztRQUN6QixNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFFTSxLQUFLLENBQUMsY0FBYztJQUUzQixDQUFDO0lBRU0sS0FBSyxDQUFDLG9CQUFvQjtJQUVqQyxDQUFDO0lBRU0sS0FBSyxDQUFDLG1DQUFtQyxDQUFDLGVBQXVCLEVBQUUsYUFBcUI7SUFFL0YsQ0FBQztJQUlNLEtBQUssQ0FBQyxJQUFJO1FBQ2YsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3RCLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0NBQ0YifQ==
|
package/dist_ts/plugins.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export { path, };
|
|
|
3
3
|
import * as lik from '@push.rocks/lik';
|
|
4
4
|
import * as qenv from '@push.rocks/qenv';
|
|
5
5
|
import * as smartarchive from '@push.rocks/smartarchive';
|
|
6
|
+
import * as smartarray from '@push.rocks/smartarray';
|
|
6
7
|
import * as smartbrowser from '@push.rocks/smartbrowser';
|
|
7
8
|
import * as smartdata from '@push.rocks/smartdata';
|
|
8
9
|
import * as smartdelay from '@push.rocks/smartdelay';
|
|
@@ -12,6 +13,7 @@ import * as smartpromise from '@push.rocks/smartpromise';
|
|
|
12
13
|
import * as smartrequest from '@push.rocks/smartrequest';
|
|
13
14
|
import * as smartstream from '@push.rocks/smartstream';
|
|
14
15
|
import * as smartunique from '@push.rocks/smartunique';
|
|
15
|
-
|
|
16
|
+
import * as smartxml from '@push.rocks/smartxml';
|
|
17
|
+
export { lik, qenv, smartarchive, smartarray, smartbrowser, smartdata, smartdelay, smartfile, smartpath, smartpromise, smartrequest, smartstream, smartunique, smartxml, };
|
|
16
18
|
import * as tsclass from '@tsclass/tsclass';
|
|
17
19
|
export { tsclass, };
|
package/dist_ts/plugins.js
CHANGED
|
@@ -5,6 +5,7 @@ export { path, };
|
|
|
5
5
|
import * as lik from '@push.rocks/lik';
|
|
6
6
|
import * as qenv from '@push.rocks/qenv';
|
|
7
7
|
import * as smartarchive from '@push.rocks/smartarchive';
|
|
8
|
+
import * as smartarray from '@push.rocks/smartarray';
|
|
8
9
|
import * as smartbrowser from '@push.rocks/smartbrowser';
|
|
9
10
|
import * as smartdata from '@push.rocks/smartdata';
|
|
10
11
|
import * as smartdelay from '@push.rocks/smartdelay';
|
|
@@ -14,8 +15,9 @@ import * as smartpromise from '@push.rocks/smartpromise';
|
|
|
14
15
|
import * as smartrequest from '@push.rocks/smartrequest';
|
|
15
16
|
import * as smartstream from '@push.rocks/smartstream';
|
|
16
17
|
import * as smartunique from '@push.rocks/smartunique';
|
|
17
|
-
|
|
18
|
+
import * as smartxml from '@push.rocks/smartxml';
|
|
19
|
+
export { lik, qenv, smartarchive, smartarray, smartbrowser, smartdata, smartdelay, smartfile, smartpath, smartpromise, smartrequest, smartstream, smartunique, smartxml, };
|
|
18
20
|
// @tsclass scope
|
|
19
21
|
import * as tsclass from '@tsclass/tsclass';
|
|
20
22
|
export { tsclass, };
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFDTCxJQUFJLEdBQ0wsQ0FBQTtBQUVELG9CQUFvQjtBQUNwQixPQUFPLEtBQUssR0FBRyxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sS0FBSyxJQUFJLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFFakQsT0FBTyxFQUNMLEdBQUcsRUFDSCxJQUFJLEVBQ0osWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osU0FBUyxFQUNULFVBQVUsRUFDVixTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osV0FBVyxFQUNYLFdBQVcsRUFDWCxRQUFRLEdBQ1QsQ0FBQTtBQUVELGlCQUFpQjtBQUNqQixPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBRTVDLE9BQU8sRUFDTCxPQUFPLEdBQ1IsQ0FBQSJ9
|
package/npmextra.json
CHANGED
|
@@ -30,5 +30,8 @@
|
|
|
30
30
|
"npmci": {
|
|
31
31
|
"npmGlobalTools": [],
|
|
32
32
|
"npmAccessLevel": "public"
|
|
33
|
+
},
|
|
34
|
+
"tsdoc": {
|
|
35
|
+
"legal": "\n## License and Legal Information\n\nThis repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository. \n\n**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.\n\n### Trademarks\n\nThis project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.\n\n### Company Information\n\nTask Venture Capital GmbH \nRegistered at District court Bremen HRB 35230 HB, Germany\n\nFor any legal inquiries or if you require further information, please contact us via email at hello@task.vc.\n\nBy using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.\n"
|
|
33
36
|
}
|
|
34
37
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fin.cx/opendata",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.4",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "A TypeScript library for accessing, managing, and updating open business data, focused on German companies and integrating with MongoDB.",
|
|
6
6
|
"main": "dist_ts/index.js",
|
|
@@ -9,27 +9,29 @@
|
|
|
9
9
|
"author": "Task Venture Capital GmbH",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"devDependencies": {
|
|
12
|
-
"@git.zone/tsbuild": "^2.2
|
|
13
|
-
"@git.zone/tsbundle": "^2.
|
|
12
|
+
"@git.zone/tsbuild": "^2.3.2",
|
|
13
|
+
"@git.zone/tsbundle": "^2.2.5",
|
|
14
14
|
"@git.zone/tsrun": "^1.3.3",
|
|
15
|
-
"@git.zone/tstest": "^1.0.
|
|
16
|
-
"@push.rocks/tapbundle": "^5.
|
|
17
|
-
"@types/node": "^22.
|
|
15
|
+
"@git.zone/tstest": "^1.0.96",
|
|
16
|
+
"@push.rocks/tapbundle": "^5.6.2",
|
|
17
|
+
"@types/node": "^22.14.0"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
20
|
"@push.rocks/lik": "^6.1.0",
|
|
21
21
|
"@push.rocks/qenv": "^6.1.0",
|
|
22
22
|
"@push.rocks/smartarchive": "^4.0.39",
|
|
23
|
+
"@push.rocks/smartarray": "^1.1.0",
|
|
23
24
|
"@push.rocks/smartbrowser": "^2.0.8",
|
|
24
|
-
"@push.rocks/smartdata": "^5.2.
|
|
25
|
+
"@push.rocks/smartdata": "^5.2.12",
|
|
25
26
|
"@push.rocks/smartdelay": "^3.0.5",
|
|
26
|
-
"@push.rocks/smartfile": "^11.0
|
|
27
|
+
"@push.rocks/smartfile": "^11.2.0",
|
|
27
28
|
"@push.rocks/smartpath": "^5.0.18",
|
|
28
|
-
"@push.rocks/smartpromise": "^4.
|
|
29
|
-
"@push.rocks/smartrequest": "^2.0
|
|
29
|
+
"@push.rocks/smartpromise": "^4.2.3",
|
|
30
|
+
"@push.rocks/smartrequest": "^2.1.0",
|
|
30
31
|
"@push.rocks/smartstream": "^3.2.5",
|
|
31
32
|
"@push.rocks/smartunique": "^3.0.9",
|
|
32
|
-
"@
|
|
33
|
+
"@push.rocks/smartxml": "^1.1.1",
|
|
34
|
+
"@tsclass/tsclass": "^8.2.0"
|
|
33
35
|
},
|
|
34
36
|
"repository": {
|
|
35
37
|
"type": "git",
|
package/readme.md
CHANGED
|
@@ -215,4 +215,22 @@ When working with business data, ensuring integrity and accuracy is crucial. Eac
|
|
|
215
215
|
The `@fin.cx/opendata` module provides an extensive toolset for accessing and managing business data, particularly for companies based in Germany. Its functionalities include creating, updating, retrieving, and deleting business records, as well as keeping them current with the latest open data releases. This makes it an invaluable asset for developers aiming to integrate open data seamlessly into their systems, ensuring robust data management capabilities within their applications.
|
|
216
216
|
|
|
217
217
|
Happy exploring and integrating open data into your projects!
|
|
218
|
-
|
|
218
|
+
|
|
219
|
+
## License and Legal Information
|
|
220
|
+
|
|
221
|
+
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
|
|
222
|
+
|
|
223
|
+
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
|
|
224
|
+
|
|
225
|
+
### Trademarks
|
|
226
|
+
|
|
227
|
+
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
|
|
228
|
+
|
|
229
|
+
### Company Information
|
|
230
|
+
|
|
231
|
+
Task Venture Capital GmbH
|
|
232
|
+
Registered at District court Bremen HRB 35230 HB, Germany
|
|
233
|
+
|
|
234
|
+
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
|
|
235
|
+
|
|
236
|
+
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -5,12 +5,27 @@ export class BusinessRecord extends plugins.smartdata.SmartDataDbDoc<
|
|
|
5
5
|
BusinessRecord,
|
|
6
6
|
BusinessRecord
|
|
7
7
|
> {
|
|
8
|
+
// STATIC
|
|
9
|
+
public static getByGermanParsedRegistration = async (parsedGermanRegistrationArg: BusinessRecord['data']['germanParsedRegistration']) => {
|
|
10
|
+
const businessRecords = await BusinessRecord.getInstance({
|
|
11
|
+
data: {
|
|
12
|
+
germanParsedRegistration: parsedGermanRegistrationArg,
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
return businessRecords;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
// INSTANCE
|
|
8
20
|
@plugins.smartdata.unI()
|
|
9
21
|
id: string;
|
|
10
22
|
|
|
11
23
|
@plugins.smartdata.svDb()
|
|
12
24
|
data: {
|
|
13
25
|
name?: string;
|
|
26
|
+
startDate?: string;
|
|
27
|
+
endDate?: string;
|
|
28
|
+
status?: 'active' | 'liquidating' | 'closed';
|
|
14
29
|
address?: string;
|
|
15
30
|
postalCode?: string;
|
|
16
31
|
city?: string;
|
|
@@ -42,4 +57,11 @@ export class BusinessRecord extends plugins.smartdata.SmartDataDbDoc<
|
|
|
42
57
|
purpose?: string;
|
|
43
58
|
lastUpdate?: string;
|
|
44
59
|
} = {};
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* validates the record against the Handelregister.
|
|
63
|
+
*/
|
|
64
|
+
public async validate() {
|
|
65
|
+
if (!this.data.name) throw new Error('Name is required.');
|
|
66
|
+
}
|
|
45
67
|
}
|
|
@@ -113,13 +113,13 @@ export class HandelsRegister {
|
|
|
113
113
|
return businessRecords;
|
|
114
114
|
};
|
|
115
115
|
|
|
116
|
-
private clickFindButton = async (pageArg: plugins.smartbrowser.smartpuppeteer.puppeteer.Page) => {
|
|
116
|
+
private clickFindButton = async (pageArg: plugins.smartbrowser.smartpuppeteer.puppeteer.Page, resultsLimitArg: number = 100) => {
|
|
117
117
|
try {
|
|
118
118
|
// Wait for the button with the text "Find" to appear
|
|
119
119
|
await pageArg.waitForSelector('span.ui-button-text.ui-c', { timeout: 5000 });
|
|
120
120
|
|
|
121
121
|
// adjust to 100 results per page
|
|
122
|
-
await pageArg.select('#form\\:ergebnisseProSeite_input',
|
|
122
|
+
await pageArg.select('#form\\:ergebnisseProSeite_input', `${resultsLimitArg}`);
|
|
123
123
|
|
|
124
124
|
// Locate and click the button using its text
|
|
125
125
|
await pageArg.evaluate(() => {
|
|
@@ -183,14 +183,24 @@ export class HandelsRegister {
|
|
|
183
183
|
}
|
|
184
184
|
}, typeArg);
|
|
185
185
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
await pageArg.waitForTimeout(10000);
|
|
186
|
+
|
|
187
|
+
await plugins.smartfile.fs.waitForFileToBeReady(this.uniqueDowloadFolder);
|
|
189
188
|
|
|
190
189
|
const files = await plugins.smartfile.fs.fileTreeToObject(this.uniqueDowloadFolder, '**/*');
|
|
191
|
-
|
|
190
|
+
const file = files[0];
|
|
192
191
|
|
|
193
|
-
|
|
192
|
+
// lets clear the folder for the next download
|
|
193
|
+
await plugins.smartfile.fs.ensureEmptyDir(this.uniqueDowloadFolder);
|
|
194
|
+
switch (typeArg) {
|
|
195
|
+
case 'AD':
|
|
196
|
+
await file.rename(`ad.pdf`);
|
|
197
|
+
break;
|
|
198
|
+
case 'SI':
|
|
199
|
+
await file.rename(`si.xml`);
|
|
200
|
+
break;
|
|
201
|
+
break;
|
|
202
|
+
}
|
|
203
|
+
return file;
|
|
194
204
|
}
|
|
195
205
|
|
|
196
206
|
/**
|
|
@@ -216,7 +226,7 @@ export class HandelsRegister {
|
|
|
216
226
|
/**
|
|
217
227
|
* Search for a company by name and return basic info
|
|
218
228
|
*/
|
|
219
|
-
public async searchCompany(companyNameArg: string) {
|
|
229
|
+
public async searchCompany(companyNameArg: string, resultsLimitArg: number = 100) {
|
|
220
230
|
return this.asyncExecutionStack.getExclusiveExecutionSlot(async () => {
|
|
221
231
|
const page = await this.getNewPage();
|
|
222
232
|
await this.navigateToPage(page, 'Normal search');
|
|
@@ -261,7 +271,7 @@ export class HandelsRegister {
|
|
|
261
271
|
console.error('Failed to find or click the radio button:', error);
|
|
262
272
|
}
|
|
263
273
|
|
|
264
|
-
await this.clickFindButton(page);
|
|
274
|
+
await this.clickFindButton(page, resultsLimitArg);
|
|
265
275
|
|
|
266
276
|
const businessRecords = await this.waitForResults(page);
|
|
267
277
|
|
|
@@ -336,4 +346,13 @@ export class HandelsRegister {
|
|
|
336
346
|
};
|
|
337
347
|
}, 60000);
|
|
338
348
|
}
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* get specific company by full name
|
|
352
|
+
*/
|
|
353
|
+
public async getSpecificCompanyByName(companyNameArg: string) {
|
|
354
|
+
const businessRecords = await this.searchCompany(companyNameArg, 1);
|
|
355
|
+
const result = this.getSpecificCompany(businessRecords[0].germanParsedRegistration);
|
|
356
|
+
return result;
|
|
357
|
+
}
|
|
339
358
|
}
|
package/ts/classes.jsonldata.ts
CHANGED
|
@@ -2,16 +2,55 @@ import * as plugins from './plugins.js';
|
|
|
2
2
|
import * as paths from './paths.js';
|
|
3
3
|
import type { OpenData } from './classes.main.opendata.js';
|
|
4
4
|
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
export type SeedEntryType = {
|
|
6
|
+
all_attributes: {
|
|
7
|
+
_registerArt: string;
|
|
8
|
+
_registerNummer: string;
|
|
9
|
+
additional_data: {
|
|
10
|
+
AD: boolean;
|
|
11
|
+
CD: boolean;
|
|
12
|
+
DK: boolean;
|
|
13
|
+
HD: boolean;
|
|
14
|
+
SI: boolean;
|
|
15
|
+
UT: boolean;
|
|
16
|
+
VÖ: boolean;
|
|
17
|
+
};
|
|
18
|
+
federal_state: string;
|
|
19
|
+
native_company_number: string;
|
|
20
|
+
registered_office: string;
|
|
21
|
+
registrar: string;
|
|
22
|
+
};
|
|
23
|
+
company_number: string;
|
|
24
|
+
current_status: string;
|
|
25
|
+
jurisdiction_code: string;
|
|
26
|
+
name: string;
|
|
27
|
+
officers: {
|
|
28
|
+
name: string;
|
|
29
|
+
other_attributes: {
|
|
30
|
+
city: string;
|
|
31
|
+
firstname: string;
|
|
32
|
+
flag: string;
|
|
33
|
+
lastname: string;
|
|
34
|
+
};
|
|
35
|
+
position: string;
|
|
36
|
+
start_date: string; // ISO 8601 date string
|
|
37
|
+
type: string;
|
|
38
|
+
}[];
|
|
39
|
+
registered_address: string;
|
|
40
|
+
retrieved_at: string; // ISO 8601 date string
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export class JsonlDataProcessor<T> {
|
|
44
|
+
public forEachFunction: (entryArg: T) => Promise<void>;
|
|
45
|
+
constructor(forEachFunctionArg: typeof this.forEachFunction) {
|
|
46
|
+
this.forEachFunction = forEachFunctionArg;
|
|
9
47
|
}
|
|
10
48
|
|
|
11
49
|
// TODO: define a mapper as argument instead of hard-coding it
|
|
12
|
-
public async processDataFromUrl(
|
|
50
|
+
public async processDataFromUrl(
|
|
51
|
+
dataUrlArg = 'https://daten.offeneregister.de/de_companies_ocdata.jsonl.bz2'
|
|
52
|
+
) {
|
|
13
53
|
const done = plugins.smartpromise.defer();
|
|
14
|
-
const promiseArray: Promise<any>[] = [];
|
|
15
54
|
const dataExists = await plugins.smartfile.fs.isDirectory(paths.germanBusinessDataDir);
|
|
16
55
|
if (!dataExists) {
|
|
17
56
|
await plugins.smartfile.fs.ensureDir(paths.germanBusinessDataDir);
|
|
@@ -19,10 +58,6 @@ export class JsonlDataProcessor {
|
|
|
19
58
|
}
|
|
20
59
|
|
|
21
60
|
const smartarchive = await plugins.smartarchive.SmartArchive.fromArchiveUrl(dataUrlArg);
|
|
22
|
-
promiseArray
|
|
23
|
-
.push
|
|
24
|
-
// smartarchive.exportToFs(paths.germanBusinessDataDir, 'de_companies_ocdata.jsonl')
|
|
25
|
-
();
|
|
26
61
|
const jsonlDataStream = await smartarchive.exportToStreamOfStreamFiles();
|
|
27
62
|
let totalRecordsCounter = 0;
|
|
28
63
|
let nextRest: string = '';
|
|
@@ -39,44 +74,37 @@ export class JsonlDataProcessor {
|
|
|
39
74
|
const lines = currentString.split('\n');
|
|
40
75
|
nextRest = lines.pop();
|
|
41
76
|
console.log(`Got another ${lines.length} records.`);
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
77
|
+
const concurrentProcessor = new plugins.smartarray.ConcurrentProcessor<string>(
|
|
78
|
+
async (line) => {
|
|
79
|
+
let entry: T;
|
|
80
|
+
if (!line) return;
|
|
81
|
+
try {
|
|
82
|
+
entry = JSON.parse(line);
|
|
83
|
+
} catch (err) {
|
|
84
|
+
console.log(line);
|
|
85
|
+
await plugins.smartdelay.delayFor(10000);
|
|
86
|
+
}
|
|
87
|
+
if (!entry) return;
|
|
88
|
+
totalRecordsCounter++;
|
|
89
|
+
if (totalRecordsCounter % 10000 === 0)
|
|
90
|
+
console.log(`${totalRecordsCounter} total records.`);
|
|
91
|
+
await this.forEachFunction(entry);
|
|
92
|
+
},
|
|
93
|
+
1000
|
|
94
|
+
);
|
|
95
|
+
await concurrentProcessor.process(lines);
|
|
61
96
|
},
|
|
62
97
|
finalFunction: async (streamToolsArg) => {
|
|
63
98
|
console.log(`finished processing ${totalRecordsCounter} records.`);
|
|
64
99
|
if (!nextRest) return;
|
|
65
100
|
JSON.parse(nextRest);
|
|
66
|
-
|
|
101
|
+
done.resolve();
|
|
102
|
+
},
|
|
67
103
|
})
|
|
68
104
|
);
|
|
69
105
|
},
|
|
70
106
|
})
|
|
71
107
|
);
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
public async getBusinessRecordByName(nameArg: string) {
|
|
75
|
-
const businessRecord = await this.openDataRef.CBusinessRecord.getInstance({
|
|
76
|
-
data: {
|
|
77
|
-
name: { $regex: `${nameArg}`, $options: "i" } as any,
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
return businessRecord;
|
|
108
|
+
await done.promise;
|
|
81
109
|
}
|
|
82
110
|
}
|
|
@@ -1,27 +1,37 @@
|
|
|
1
1
|
import { BusinessRecord } from './classes.businessrecord.js';
|
|
2
|
-
import
|
|
3
|
-
import { JsonlDataProcessor } from './classes.jsonldata.js';
|
|
2
|
+
import { HandelsRegister } from './classes.handelsregister.js';
|
|
3
|
+
import { JsonlDataProcessor, type SeedEntryType } from './classes.jsonldata.js';
|
|
4
4
|
import * as paths from './paths.js';
|
|
5
5
|
import * as plugins from './plugins.js';
|
|
6
6
|
|
|
7
7
|
export class OpenData {
|
|
8
8
|
public db: plugins.smartdata.SmartdataDb;
|
|
9
9
|
private serviceQenv = new plugins.qenv.Qenv(paths.packageDir, paths.nogitDir);
|
|
10
|
-
|
|
11
|
-
public jsonLDataProcessor: JsonlDataProcessor
|
|
10
|
+
|
|
11
|
+
public jsonLDataProcessor: JsonlDataProcessor<SeedEntryType>;
|
|
12
12
|
public handelsregister: HandelsRegister;
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
public CBusinessRecord = plugins.smartdata.setDefaultManagerForDoc(this, BusinessRecord);
|
|
15
15
|
|
|
16
16
|
public async start() {
|
|
17
17
|
this.db = new plugins.smartdata.SmartdataDb({
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
mongoDbUrl: await this.serviceQenv.getEnvVarOnDemand('MONGODB_URL'),
|
|
19
|
+
mongoDbName: await this.serviceQenv.getEnvVarOnDemand('MONGODB_NAME'),
|
|
20
|
+
mongoDbUser: await this.serviceQenv.getEnvVarOnDemand('MONGODB_USER'),
|
|
21
|
+
mongoDbPass: await this.serviceQenv.getEnvVarOnDemand('MONGODB_PASS'),
|
|
22
22
|
});
|
|
23
23
|
await this.db.init();
|
|
24
|
-
this.jsonLDataProcessor = new JsonlDataProcessor(
|
|
24
|
+
this.jsonLDataProcessor = new JsonlDataProcessor(async (entryArg) => {
|
|
25
|
+
const businessRecord = new this.CBusinessRecord();
|
|
26
|
+
businessRecord.id = await this.CBusinessRecord.getNewId();
|
|
27
|
+
businessRecord.data.name = entryArg.name;
|
|
28
|
+
businessRecord.data.germanParsedRegistration = {
|
|
29
|
+
court: entryArg.all_attributes.registered_office,
|
|
30
|
+
number: entryArg.all_attributes._registerNummer,
|
|
31
|
+
type: entryArg.all_attributes._registerArt as 'HRA' | 'HRB',
|
|
32
|
+
};
|
|
33
|
+
await businessRecord.save();
|
|
34
|
+
});
|
|
25
35
|
this.handelsregister = new HandelsRegister(this);
|
|
26
36
|
await this.handelsregister.start();
|
|
27
37
|
}
|
|
@@ -30,8 +40,22 @@ export class OpenData {
|
|
|
30
40
|
await this.jsonLDataProcessor.processDataFromUrl();
|
|
31
41
|
}
|
|
32
42
|
|
|
43
|
+
public async slowValidateDb() {
|
|
44
|
+
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public async validateSearchByName() {
|
|
48
|
+
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public async searchDbByBusinessNameAndPostalCode(businessNameArg: string, postalCodeArg: string) {
|
|
52
|
+
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
33
57
|
public async stop() {
|
|
34
58
|
await this.db.close();
|
|
35
59
|
await this.handelsregister.stop();
|
|
36
60
|
}
|
|
37
|
-
}
|
|
61
|
+
}
|
package/ts/plugins.ts
CHANGED
|
@@ -9,6 +9,7 @@ export {
|
|
|
9
9
|
import * as lik from '@push.rocks/lik';
|
|
10
10
|
import * as qenv from '@push.rocks/qenv';
|
|
11
11
|
import * as smartarchive from '@push.rocks/smartarchive';
|
|
12
|
+
import * as smartarray from '@push.rocks/smartarray';
|
|
12
13
|
import * as smartbrowser from '@push.rocks/smartbrowser';
|
|
13
14
|
import * as smartdata from '@push.rocks/smartdata';
|
|
14
15
|
import * as smartdelay from '@push.rocks/smartdelay';
|
|
@@ -18,11 +19,13 @@ import * as smartpromise from '@push.rocks/smartpromise';
|
|
|
18
19
|
import * as smartrequest from '@push.rocks/smartrequest';
|
|
19
20
|
import * as smartstream from '@push.rocks/smartstream';
|
|
20
21
|
import * as smartunique from '@push.rocks/smartunique';
|
|
22
|
+
import * as smartxml from '@push.rocks/smartxml';
|
|
21
23
|
|
|
22
24
|
export {
|
|
23
25
|
lik,
|
|
24
26
|
qenv,
|
|
25
27
|
smartarchive,
|
|
28
|
+
smartarray,
|
|
26
29
|
smartbrowser,
|
|
27
30
|
smartdata,
|
|
28
31
|
smartdelay,
|
|
@@ -32,6 +35,7 @@ export {
|
|
|
32
35
|
smartrequest,
|
|
33
36
|
smartstream,
|
|
34
37
|
smartunique,
|
|
38
|
+
smartxml,
|
|
35
39
|
}
|
|
36
40
|
|
|
37
41
|
// @tsclass scope
|