@fin.cx/opendata 1.2.0 → 1.4.0
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 +7 -3
- package/dist_ts/classes.businessrecord.js +1 -1
- package/dist_ts/classes.handelsregister.d.ts +76 -2
- package/dist_ts/classes.handelsregister.js +250 -90
- package/dist_ts/classes.jsonldata.js +3 -1
- package/dist_ts/classes.main.opendata.d.ts +1 -0
- package/dist_ts/classes.main.opendata.js +4 -1
- package/dist_ts/paths.d.ts +1 -0
- package/dist_ts/paths.js +3 -1
- package/dist_ts/plugins.d.ts +5 -1
- package/dist_ts/plugins.js +7 -2
- package/package.json +7 -4
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.businessrecord.ts +37 -24
- package/ts/classes.handelsregister.ts +272 -71
- package/ts/classes.jsonldata.ts +2 -0
- package/ts/classes.main.opendata.ts +5 -0
- package/ts/paths.ts +4 -0
- package/ts/plugins.ts +12 -1
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@fin.cx/opendata',
|
|
6
|
-
version: '1.
|
|
6
|
+
version: '1.4.0',
|
|
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=
|
|
@@ -12,9 +12,13 @@ export declare class BusinessRecord extends plugins.smartdata.SmartDataDbDoc<Bus
|
|
|
12
12
|
email?: string;
|
|
13
13
|
website?: string;
|
|
14
14
|
businessType?: string;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
registrationId?: string;
|
|
16
|
+
germanParsedRegistration?: {
|
|
17
|
+
court?: string;
|
|
18
|
+
type?: 'HRA' | 'HRB' | 'GnR' | 'PR' | 'VR' | 'GsR';
|
|
19
|
+
number?: string;
|
|
20
|
+
};
|
|
21
|
+
legalForm?: 'GmbH' | 'GmbH & Co. KG' | 'AG' | 'LLC' | 'LLP' | 'GmbH & Co. KGaA' | 'GmbH & Co. KGaA, LLC';
|
|
18
22
|
managingDirectors?: string[];
|
|
19
23
|
boardOfDirectors?: string[];
|
|
20
24
|
supervisoryBoard?: string[];
|
|
@@ -26,4 +26,4 @@ BusinessRecord = __decorate([
|
|
|
26
26
|
plugins.smartdata.Manager()
|
|
27
27
|
], BusinessRecord);
|
|
28
28
|
export { BusinessRecord };
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5idXNpbmVzc3JlY29yZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuYnVzaW5lc3NyZWNvcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFHakMsSUFBTSxjQUFjLEdBQXBCLE1BQU0sY0FBZSxTQUFRLE9BQU8sQ0FBQyxTQUFTLENBQUMsY0FHckQ7SUFITTs7UUFRTCxTQUFJLEdBZ0NBLEVBQUUsQ0FBQztJQUNULENBQUM7Q0FBQSxDQUFBO0FBcENDO0lBREMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7OzBDQUNiO0FBR1g7SUFEQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTs7NENBaUNsQjtBQXhDSSxjQUFjO0lBRDFCLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFO0dBQ2YsY0FBYyxDQXlDMUIifQ==
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { BusinessRecord } from './classes.businessrecord.js';
|
|
1
2
|
import type { OpenData } from './classes.main.opendata.js';
|
|
2
3
|
import * as plugins from './plugins.js';
|
|
3
4
|
/**
|
|
@@ -5,12 +6,85 @@ import * as plugins from './plugins.js';
|
|
|
5
6
|
*/
|
|
6
7
|
export declare class HandelsRegister {
|
|
7
8
|
private openDataRef;
|
|
9
|
+
private asyncExecutionStack;
|
|
10
|
+
private uniqueDowloadFolder;
|
|
8
11
|
smartbrowserInstance: plugins.smartbrowser.SmartBrowser;
|
|
9
12
|
constructor(openDataRef: OpenData);
|
|
10
13
|
start(): Promise<void>;
|
|
11
14
|
stop(): Promise<void>;
|
|
12
15
|
/**
|
|
13
|
-
*
|
|
16
|
+
* Creates a new page and configures it to allow file downloads
|
|
17
|
+
* to a predefined path.
|
|
14
18
|
*/
|
|
15
|
-
|
|
19
|
+
getNewPage: () => Promise<plugins.smartbrowser.smartpuppeteer.puppeteer.Page>;
|
|
20
|
+
private navigateToPage;
|
|
21
|
+
private waitForResults;
|
|
22
|
+
private clickFindButton;
|
|
23
|
+
private downloadFile;
|
|
24
|
+
/**
|
|
25
|
+
* Helper method to parse the German registration string
|
|
26
|
+
*/
|
|
27
|
+
private parseGermanRegistration;
|
|
28
|
+
/**
|
|
29
|
+
* Search for a company by name and return basic info
|
|
30
|
+
*/
|
|
31
|
+
searchCompany(companyNameArg: string): Promise<{
|
|
32
|
+
name?: string;
|
|
33
|
+
address?: string;
|
|
34
|
+
postalCode?: string;
|
|
35
|
+
city?: string;
|
|
36
|
+
country?: string;
|
|
37
|
+
phone?: string;
|
|
38
|
+
fax?: string;
|
|
39
|
+
email?: string;
|
|
40
|
+
website?: string;
|
|
41
|
+
businessType?: string;
|
|
42
|
+
registrationId?: string;
|
|
43
|
+
germanParsedRegistration?: {
|
|
44
|
+
court?: string;
|
|
45
|
+
type?: "HRA" | "HRB" | "GnR" | "PR" | "VR" | "GsR";
|
|
46
|
+
number?: string;
|
|
47
|
+
};
|
|
48
|
+
legalForm?: "GmbH" | "GmbH & Co. KG" | "AG" | "LLC" | "LLP" | "GmbH & Co. KGaA" | "GmbH & Co. KGaA, LLC";
|
|
49
|
+
managingDirectors?: string[];
|
|
50
|
+
boardOfDirectors?: string[];
|
|
51
|
+
supervisoryBoard?: string[];
|
|
52
|
+
foundingDate?: string;
|
|
53
|
+
capital?: string;
|
|
54
|
+
purpose?: string;
|
|
55
|
+
lastUpdate?: string;
|
|
56
|
+
}[]>;
|
|
57
|
+
/**
|
|
58
|
+
* Search for a specific company (known register type/number/court),
|
|
59
|
+
* then click on an element that triggers a file download.
|
|
60
|
+
*/
|
|
61
|
+
getSpecificCompany(companyArg: BusinessRecord['data']['germanParsedRegistration']): Promise<{
|
|
62
|
+
businessRecords: {
|
|
63
|
+
name?: string;
|
|
64
|
+
address?: string;
|
|
65
|
+
postalCode?: string;
|
|
66
|
+
city?: string;
|
|
67
|
+
country?: string;
|
|
68
|
+
phone?: string;
|
|
69
|
+
fax?: string;
|
|
70
|
+
email?: string;
|
|
71
|
+
website?: string;
|
|
72
|
+
businessType?: string;
|
|
73
|
+
registrationId?: string;
|
|
74
|
+
germanParsedRegistration?: {
|
|
75
|
+
court?: string;
|
|
76
|
+
type?: "HRA" | "HRB" | "GnR" | "PR" | "VR" | "GsR";
|
|
77
|
+
number?: string;
|
|
78
|
+
};
|
|
79
|
+
legalForm?: "GmbH" | "GmbH & Co. KG" | "AG" | "LLC" | "LLP" | "GmbH & Co. KGaA" | "GmbH & Co. KGaA, LLC";
|
|
80
|
+
managingDirectors?: string[];
|
|
81
|
+
boardOfDirectors?: string[];
|
|
82
|
+
supervisoryBoard?: string[];
|
|
83
|
+
foundingDate?: string;
|
|
84
|
+
capital?: string;
|
|
85
|
+
purpose?: string;
|
|
86
|
+
lastUpdate?: string;
|
|
87
|
+
}[];
|
|
88
|
+
files: plugins.smartfile.SmartFile[];
|
|
89
|
+
}>;
|
|
16
90
|
}
|
|
@@ -1,111 +1,271 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
|
+
import * as paths from './paths.js';
|
|
2
3
|
/**
|
|
3
4
|
* the HandlesRegister exposed as a class
|
|
4
5
|
*/
|
|
5
6
|
export class HandelsRegister {
|
|
6
7
|
constructor(openDataRef) {
|
|
8
|
+
this.asyncExecutionStack = new plugins.lik.AsyncExecutionStack();
|
|
9
|
+
this.uniqueDowloadFolder = plugins.path.join(paths.downloadDir, plugins.smartunique.uniSimple());
|
|
10
|
+
// Puppeteer wrapper instance
|
|
7
11
|
this.smartbrowserInstance = new plugins.smartbrowser.SmartBrowser();
|
|
12
|
+
/**
|
|
13
|
+
* Creates a new page and configures it to allow file downloads
|
|
14
|
+
* to a predefined path.
|
|
15
|
+
*/
|
|
16
|
+
this.getNewPage = async () => {
|
|
17
|
+
const page = await this.smartbrowserInstance.headlessBrowser.newPage();
|
|
18
|
+
// 1) Create a DevTools session for this page
|
|
19
|
+
const cdpSession = await page.target().createCDPSession();
|
|
20
|
+
// 2) Allow file downloads and set the download path
|
|
21
|
+
await cdpSession.send('Page.setDownloadBehavior', {
|
|
22
|
+
behavior: 'allow',
|
|
23
|
+
downloadPath: this.uniqueDowloadFolder, // <-- Change this to your desired absolute path
|
|
24
|
+
});
|
|
25
|
+
// Optionally set viewport and go to page
|
|
26
|
+
await page.setViewport({ width: 1920, height: 1080 });
|
|
27
|
+
await page.goto('https://www.handelsregister.de/');
|
|
28
|
+
return page;
|
|
29
|
+
};
|
|
30
|
+
this.navigateToPage = async (pageArg, pageNameArg) => {
|
|
31
|
+
try {
|
|
32
|
+
await pageArg.evaluate((pageNameArg2) => {
|
|
33
|
+
const elements = Array.from(document.querySelectorAll('.ui-menuitem-text > span'));
|
|
34
|
+
const targetElement = elements.find((el) => el.textContent?.trim() === pageNameArg2);
|
|
35
|
+
if (targetElement) {
|
|
36
|
+
targetElement.click();
|
|
37
|
+
}
|
|
38
|
+
}, pageNameArg);
|
|
39
|
+
console.log(`Navigated to the ${pageNameArg} page successfully.`);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
console.error(`Failed to navigate to the ${pageNameArg} page:`, error);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
this.waitForResults = async (pageArg) => {
|
|
46
|
+
await pageArg
|
|
47
|
+
.waitForSelector('#ergebnissForm\\:selectedSuchErgebnisFormTable_data', {
|
|
48
|
+
timeout: 30000,
|
|
49
|
+
})
|
|
50
|
+
.catch(async (err) => {
|
|
51
|
+
await pageArg.screenshot({ path: paths.downloadDir + '/error.png' });
|
|
52
|
+
throw err;
|
|
53
|
+
});
|
|
54
|
+
const businessRecords = await pageArg.evaluate(() => {
|
|
55
|
+
const rows = document.querySelectorAll('#ergebnissForm\\:selectedSuchErgebnisFormTable_data > tr');
|
|
56
|
+
const records = [];
|
|
57
|
+
rows.forEach((row) => {
|
|
58
|
+
const nameElement = row.querySelector('td.ui-panelgrid-cell span.marginLeft20');
|
|
59
|
+
const cityElement = row.querySelector('td.ui-panelgrid-cell.sitzSuchErgebnisse span');
|
|
60
|
+
const statusElement = row.querySelector('td.ui-panelgrid-cell span.verticalText');
|
|
61
|
+
const registrationCourtElement = row.querySelector('td.ui-panelgrid-cell.fontTableNameSize');
|
|
62
|
+
const name = nameElement?.textContent?.trim();
|
|
63
|
+
const city = cityElement?.textContent?.trim();
|
|
64
|
+
const status = statusElement?.textContent?.trim();
|
|
65
|
+
const registrationId = registrationCourtElement?.textContent?.trim();
|
|
66
|
+
// Push parsed data into records array
|
|
67
|
+
records.push({
|
|
68
|
+
name,
|
|
69
|
+
city,
|
|
70
|
+
registrationId,
|
|
71
|
+
businessType: status,
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
return records;
|
|
75
|
+
});
|
|
76
|
+
return businessRecords;
|
|
77
|
+
};
|
|
78
|
+
this.clickFindButton = async (pageArg) => {
|
|
79
|
+
try {
|
|
80
|
+
// Wait for the button with the text "Find" to appear
|
|
81
|
+
await pageArg.waitForSelector('span.ui-button-text.ui-c', { timeout: 5000 });
|
|
82
|
+
// adjust to 100 results per page
|
|
83
|
+
await pageArg.select('#form\\:ergebnisseProSeite_input', '100');
|
|
84
|
+
// Locate and click the button using its text
|
|
85
|
+
await pageArg.evaluate(() => {
|
|
86
|
+
const buttons = Array.from(document.querySelectorAll('span.ui-button-text.ui-c'));
|
|
87
|
+
const targetButton = buttons.find((button) => button.textContent?.trim() === 'Find');
|
|
88
|
+
if (targetButton) {
|
|
89
|
+
const parentButton = targetButton.closest('button') || targetButton;
|
|
90
|
+
parentButton.click();
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
console.log('Find button clicked successfully!');
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
console.error('Failed to find or click the "Find" button:', error);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
8
99
|
this.openDataRef = openDataRef;
|
|
9
100
|
}
|
|
10
101
|
async start() {
|
|
102
|
+
// Start the browser
|
|
103
|
+
await plugins.smartfile.fs.ensureDir(this.uniqueDowloadFolder);
|
|
11
104
|
await this.smartbrowserInstance.start();
|
|
12
105
|
}
|
|
13
106
|
async stop() {
|
|
107
|
+
// Stop the browser
|
|
108
|
+
await plugins.smartfile.fs.remove(this.uniqueDowloadFolder);
|
|
14
109
|
await this.smartbrowserInstance.stop();
|
|
15
110
|
}
|
|
111
|
+
async downloadFile(pageArg, typeArg) {
|
|
112
|
+
// Trigger the file download by clicking on the relevant link
|
|
113
|
+
await pageArg.evaluate((typeArg2) => {
|
|
114
|
+
// Locate the table body
|
|
115
|
+
const tableBody = document.querySelector('#ergebnissForm\\:selectedSuchErgebnisFormTable_data');
|
|
116
|
+
if (!tableBody) {
|
|
117
|
+
throw new Error('Table body not found');
|
|
118
|
+
}
|
|
119
|
+
// Locate the first row
|
|
120
|
+
const firstRow = tableBody.querySelector('tr:nth-child(1)');
|
|
121
|
+
if (!firstRow) {
|
|
122
|
+
throw new Error('First row not found');
|
|
123
|
+
}
|
|
124
|
+
// Locate the last cell in the first row
|
|
125
|
+
const lastCell = firstRow.querySelector('td:last-child');
|
|
126
|
+
if (!lastCell) {
|
|
127
|
+
throw new Error('Last cell not found in the first row');
|
|
128
|
+
}
|
|
129
|
+
// Locate the download links
|
|
130
|
+
const adLink = lastCell.querySelector('a:first-of-type');
|
|
131
|
+
const siLink = lastCell.querySelector('a:last-of-type');
|
|
132
|
+
if (!siLink) {
|
|
133
|
+
throw new Error('SI link not found in the last cell');
|
|
134
|
+
}
|
|
135
|
+
// Simulate a click on the last <a> element
|
|
136
|
+
switch (typeArg2) {
|
|
137
|
+
case 'AD':
|
|
138
|
+
adLink.click();
|
|
139
|
+
break;
|
|
140
|
+
case 'SI':
|
|
141
|
+
siLink.click();
|
|
142
|
+
break;
|
|
143
|
+
default:
|
|
144
|
+
throw new Error('Invalid file type');
|
|
145
|
+
}
|
|
146
|
+
}, typeArg);
|
|
147
|
+
// Wait a bit for the download to complete (you might want to implement
|
|
148
|
+
// a more robust file-exists check or a wait-for-download library)
|
|
149
|
+
await pageArg.waitForTimeout(10000);
|
|
150
|
+
const files = await plugins.smartfile.fs.fileTreeToObject(this.uniqueDowloadFolder, '**/*');
|
|
151
|
+
await plugins.smartfile.fs.ensureEmptyDir(this.uniqueDowloadFolder);
|
|
152
|
+
return files[0];
|
|
153
|
+
}
|
|
16
154
|
/**
|
|
17
|
-
*
|
|
155
|
+
* Helper method to parse the German registration string
|
|
18
156
|
*/
|
|
19
|
-
async
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
try {
|
|
31
|
-
// Wait for the textarea to appear
|
|
32
|
-
await page.waitForSelector('#form\\:schlagwoerter', { timeout: 5000 });
|
|
33
|
-
// Enter text into the textarea using page.evaluate
|
|
34
|
-
const inputText = companyNameArg;
|
|
35
|
-
await page.evaluate((text) => {
|
|
36
|
-
const textarea = document.querySelector('#form\\:schlagwoerter');
|
|
37
|
-
if (textarea) {
|
|
38
|
-
textarea.value = text; // Set the value
|
|
39
|
-
// Trigger the change event manually if required
|
|
40
|
-
const event = new Event('change', { bubbles: true });
|
|
41
|
-
textarea.dispatchEvent(event);
|
|
42
|
-
}
|
|
43
|
-
}, inputText);
|
|
44
|
-
console.log('Text entered successfully!');
|
|
45
|
-
}
|
|
46
|
-
catch (error) {
|
|
47
|
-
console.error('Failed to find or enter text into the textarea:', error);
|
|
157
|
+
async parseGermanRegistration(input) {
|
|
158
|
+
// e.g. District court Berlin (Charlottenburg) HRB 123456
|
|
159
|
+
const regex = /District court (\p{L}[\p{L}\s-]*?(?:\s*\([\p{L}\s-]+\))?)\s+(HRA|HRB|GnR|VR|PR|GsR)\s+(\d+)/u;
|
|
160
|
+
const match = input.match(regex);
|
|
161
|
+
if (match) {
|
|
162
|
+
return {
|
|
163
|
+
court: match[1],
|
|
164
|
+
type: match[2], // Adjust if needed
|
|
165
|
+
number: match[3],
|
|
166
|
+
};
|
|
48
167
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
const rows = document.querySelectorAll('#ergebnissForm\\:selectedSuchErgebnisFormTable_data > tr');
|
|
86
|
-
const records = [];
|
|
87
|
-
rows.forEach((row) => {
|
|
88
|
-
const nameElement = row.querySelector('td.ui-panelgrid-cell span.marginLeft20');
|
|
89
|
-
const cityElement = row.querySelector('td.ui-panelgrid-cell.sitzSuchErgebnisse span');
|
|
90
|
-
const statusElement = row.querySelector('td.ui-panelgrid-cell span.verticalText');
|
|
91
|
-
const registrationCourtElement = row.querySelector('td.ui-panelgrid-cell.fontTableNameSize');
|
|
92
|
-
const name = nameElement?.textContent?.trim();
|
|
93
|
-
const city = cityElement?.textContent?.trim();
|
|
94
|
-
const status = statusElement?.textContent?.trim();
|
|
95
|
-
const registrationCourt = registrationCourtElement?.textContent?.trim();
|
|
96
|
-
// Push parsed data into records array
|
|
97
|
-
records.push({
|
|
98
|
-
name,
|
|
99
|
-
city,
|
|
100
|
-
registrationCourt,
|
|
101
|
-
businessType: status,
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Search for a company by name and return basic info
|
|
171
|
+
*/
|
|
172
|
+
async searchCompany(companyNameArg) {
|
|
173
|
+
return this.asyncExecutionStack.getExclusiveExecutionSlot(async () => {
|
|
174
|
+
const page = await this.getNewPage();
|
|
175
|
+
await this.navigateToPage(page, 'Normal search');
|
|
176
|
+
try {
|
|
177
|
+
// Wait for the textarea to appear
|
|
178
|
+
await page.waitForSelector('#form\\:schlagwoerter', { timeout: 5000 });
|
|
179
|
+
// Enter text into the textarea
|
|
180
|
+
const inputText = companyNameArg;
|
|
181
|
+
await page.evaluate((text) => {
|
|
182
|
+
const textarea = document.querySelector('#form\\:schlagwoerter');
|
|
183
|
+
if (textarea) {
|
|
184
|
+
textarea.value = text; // Set the value
|
|
185
|
+
// Trigger the change event manually if required
|
|
186
|
+
const event = new Event('change', { bubbles: true });
|
|
187
|
+
textarea.dispatchEvent(event);
|
|
188
|
+
}
|
|
189
|
+
}, inputText);
|
|
190
|
+
console.log('Text entered successfully!');
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
console.error('Failed to find or enter text into the textarea:', error);
|
|
194
|
+
}
|
|
195
|
+
try {
|
|
196
|
+
// Wait for the radio button's label to appear
|
|
197
|
+
await page.waitForSelector('label[for="form:schlagwortOptionen:0"]', { timeout: 5000 });
|
|
198
|
+
// Click the label to select the radio button
|
|
199
|
+
await page.evaluate(() => {
|
|
200
|
+
const label = document.querySelector('label[for="form:schlagwortOptionen:0"]');
|
|
201
|
+
if (label) {
|
|
202
|
+
label.click();
|
|
203
|
+
}
|
|
102
204
|
});
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
205
|
+
console.log('Radio button clicked successfully!');
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
console.error('Failed to find or click the radio button:', error);
|
|
209
|
+
}
|
|
210
|
+
await this.clickFindButton(page);
|
|
211
|
+
const businessRecords = await this.waitForResults(page);
|
|
212
|
+
// Parse out the registration info
|
|
213
|
+
for (const record of businessRecords) {
|
|
214
|
+
if (record.registrationId) {
|
|
215
|
+
record.germanParsedRegistration = await this.parseGermanRegistration(record.registrationId);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
await page.close();
|
|
219
|
+
return businessRecords;
|
|
220
|
+
}, 60000);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Search for a specific company (known register type/number/court),
|
|
224
|
+
* then click on an element that triggers a file download.
|
|
225
|
+
*/
|
|
226
|
+
async getSpecificCompany(companyArg) {
|
|
227
|
+
return this.asyncExecutionStack.getExclusiveExecutionSlot(async () => {
|
|
228
|
+
const page = await this.getNewPage();
|
|
229
|
+
await this.navigateToPage(page, 'Normal search');
|
|
230
|
+
await page.waitForSelector('#form\\:schlagwoerter', { timeout: 5000 });
|
|
231
|
+
// 1) Type of Register (e.g. HRB, HRA, etc.)
|
|
232
|
+
await page.waitForSelector('#form\\:registerArt_label');
|
|
233
|
+
await page.click('#form\\:registerArt_label');
|
|
234
|
+
await page.waitForSelector('#form\\:registerArt_items');
|
|
235
|
+
await page.evaluate((type) => {
|
|
236
|
+
const options = Array.from(document.querySelectorAll('#form\\:registerArt_items li'));
|
|
237
|
+
const targetOption = options.find((option) => option.textContent?.trim() === type);
|
|
238
|
+
targetOption?.click();
|
|
239
|
+
}, companyArg.type);
|
|
240
|
+
// 2) Register number
|
|
241
|
+
await page.waitForSelector('#form\\:registerNummer');
|
|
242
|
+
await page.type('#form\\:registerNummer', companyArg.number);
|
|
243
|
+
// 3) Register court
|
|
244
|
+
await page.waitForSelector('#form\\:registergericht_label');
|
|
245
|
+
await page.click('#form\\:registergericht_label');
|
|
246
|
+
await page.waitForSelector('#form\\:registergericht_items');
|
|
247
|
+
await page.evaluate((court) => {
|
|
248
|
+
const options = Array.from(document.querySelectorAll('#form\\:registergericht_items li'));
|
|
249
|
+
const targetOption = options.find((option) => option.textContent?.trim() === court);
|
|
250
|
+
targetOption?.click();
|
|
251
|
+
}, companyArg.court);
|
|
252
|
+
// Click 'Find'
|
|
253
|
+
await this.clickFindButton(page);
|
|
254
|
+
// Optionally grab the results, just for logging
|
|
255
|
+
const businessRecords = await this.waitForResults(page);
|
|
256
|
+
console.log(businessRecords);
|
|
257
|
+
const files = [];
|
|
258
|
+
// download files
|
|
259
|
+
files.push(await this.downloadFile(page, 'SI'));
|
|
260
|
+
files.push(await this.downloadFile(page, 'AD'));
|
|
261
|
+
// At this point, the file should have been downloaded automatically
|
|
262
|
+
// to the path specified by `Page.setDownloadBehavior`
|
|
263
|
+
await page.close();
|
|
264
|
+
return {
|
|
265
|
+
businessRecords,
|
|
266
|
+
files,
|
|
267
|
+
};
|
|
268
|
+
}, 60000);
|
|
109
269
|
}
|
|
110
270
|
}
|
|
111
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5oYW5kZWxzcmVnaXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmhhbmRlbHNyZWdpc3Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4Qzs7R0FFRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBSzFCLFlBQVksV0FBcUI7UUFGMUIseUJBQW9CLEdBQUcsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBR3BFLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ2pDLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSztRQUNoQixNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRU0sS0FBSyxDQUFDLElBQUk7UUFDZixNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsY0FBc0I7UUFDbkQsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3ZFLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEQsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDbkQsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUN2QixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUM7WUFDbkYsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxD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
|
|
271
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5oYW5kZWxzcmVnaXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmhhbmRlbHNyZWdpc3Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssS0FBSyxNQUFNLFlBQVksQ0FBQztBQUVwQzs7R0FFRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBUTFCLFlBQVksV0FBcUI7UUFOekIsd0JBQW1CLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDNUQsd0JBQW1CLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFFcEcsNkJBQTZCO1FBQ3RCLHlCQUFvQixHQUFHLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQWtCdEU7OztXQUdHO1FBQ0ksZUFBVSxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQzdCLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUV2RSw2Q0FBNkM7WUFDN0MsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUUxRCxvREFBb0Q7WUFDcEQsTUFBTSxVQUFVLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFO2dCQUNoRCxRQUFRLEVBQUUsT0FBTztnQkFDakIsWUFBWSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxnREFBZ0Q7YUFDekYsQ0FBQyxDQUFDO1lBRUgseUNBQXlDO1lBQ3pDLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdEQsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7WUFDbkQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUM7UUFFTSxtQkFBYyxHQUFHLEtBQUssRUFDNUIsT0FBMkQsRUFDM0QsV0FBbUIsRUFDbkIsRUFBRTtZQUNGLElBQUksQ0FBQztnQkFDSCxNQUFNLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRTtvQkFDdEMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO29CQUNuRixNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLFlBQVksQ0FBQyxDQUFDO29CQUNyRixJQUFJLGFBQWEsRUFBRSxDQUFDO3dCQUNqQixhQUE2QixDQUFDLEtBQUssRUFBRSxDQUFDO29CQUN6QyxDQUFDO2dCQUNILENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsV0FBVyxxQkFBcUIsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsNkJBQTZCLFdBQVcsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3pFLENBQUM7UUFDSCxDQUFDLENBQUM7UUFFTSxtQkFBYyxHQUFHLEtBQUssRUFBRSxPQUEyRCxFQUFFLEVBQUU7WUFDN0YsTUFBTSxPQUFPO2lCQUNWLGVBQWUsQ0FBQyxxREFBcUQsRUFBRTtnQkFDdEUsT0FBTyxFQUFFLEtBQUs7YUFDZixDQUFDO2lCQUNELEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQ25CLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsV0FBVyxHQUFHLFlBQVksRUFBRSxDQUFDLENBQUM7Z0JBQ3JFLE1BQU0sR0FBRyxDQUFDO1lBQ1osQ0FBQyxDQUFDLENBQUM7WUFFTCxNQUFNLGVBQWUsR0FBNkIsTUFBTSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRTtnQkFDNUUsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUNwQywwREFBMEQsQ0FDM0QsQ0FBQztnQkFDRixNQUFNLE9BQU8sR0FBNkIsRUFBRSxDQUFDO2dCQUU3QyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7b0JBQ25CLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsd0NBQXdDLENBQUMsQ0FBQztvQkFDaEYsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO29CQUN0RixNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLHdDQUF3QyxDQUFDLENBQUM7b0JBQ2xGLE1BQU0sd0JBQXdCLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FDaEQsd0NBQXdDLENBQ3pDLENBQUM7b0JBRUYsTUFBTSxJQUFJLEdBQUcsV0FBVyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQztvQkFDOUMsTUFBTSxJQUFJLEdBQUcsV0FBVyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQztvQkFDOUMsTUFBTSxNQUFNLEdBQUcsYUFBYSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQztvQkFDbEQsTUFBTSxjQUFjLEdBQUcsd0JBQXdCLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDO29CQUVyRSxzQ0FBc0M7b0JBQ3RDLE9BQU8sQ0FBQyxJQUFJLENBQUM7d0JBQ1gsSUFBSTt3QkFDSixJQUFJO3dCQUNKLGNBQWM7d0JBQ2QsWUFBWSxFQUFFLE1BQU07cUJBQ3JCLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQztnQkFFSCxPQUFPLE9BQU8sQ0FBQztZQUNqQixDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sZUFBZSxDQUFDO1FBQ3pCLENBQUMsQ0FBQztRQUVNLG9CQUFlLEdBQUcsS0FBSyxFQUFFLE9BQTJELEVBQUUsRUFBRTtZQUM5RixJQUFJLENBQUM7Z0JBQ0gscURBQXFEO2dCQUNyRCxNQUFNLE9BQU8sQ0FBQyxlQUFlLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFFN0UsaUNBQWlDO2dCQUNqQyxNQUFNLE9BQU8sQ0FBQyxNQUFNLENBQUMsa0NBQWtDLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBRWhFLDZDQUE2QztnQkFDN0MsTUFBTSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRTtvQkFDMUIsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO29CQUNsRixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDO29CQUNyRixJQUFJLFlBQVksRUFBRSxDQUFDO3dCQUNqQixNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFlBQVksQ0FBQzt3QkFDbkUsWUFBNEIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDeEMsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFFSCxPQUFPLENBQUMsR0FBRyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7WUFDbkQsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyw0Q0FBNEMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNyRSxDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBeEhBLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ2pDLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSztRQUNoQixvQkFBb0I7UUFDcEIsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDL0QsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJO1FBQ2YsbUJBQW1CO1FBQ25CLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzVELE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUE2R08sS0FBSyxDQUFDLFlBQVksQ0FDeEIsT0FBMkQsRUFDM0QsT0FBb0I7UUFFcEIsNkRBQTZEO1FBQzdELE1BQU0sT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2xDLHdCQUF3QjtZQUN4QixNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUN0QyxxREFBcUQsQ0FDdEQsQ0FBQztZQUNGLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDZixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDMUMsQ0FBQztZQUVELHVCQUF1QjtZQUN2QixNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUN6QyxDQUFDO1lBRUQsd0NBQXdDO1lBQ3hDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztZQUMxRCxDQUFDO1lBRUQsNEJBQTRCO1lBQzVCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUN6RCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztZQUN4RCxDQUFDO1lBRUQsMkNBQTJDO1lBQzNDLFFBQVEsUUFBUSxFQUFFLENBQUM7Z0JBQ2pCLEtBQUssSUFBSTtvQkFDTixNQUFzQixDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNoQyxNQUFNO2dCQUNSLEtBQUssSUFBSTtvQkFDTixNQUFzQixDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNoQyxNQUFNO2dCQUNSO29CQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUN6QyxDQUFDO1FBQ0gsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRVosdUVBQXVFO1FBQ3ZFLGtFQUFrRTtRQUNsRSxNQUFNLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFcEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDNUYsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFFcEUsT0FBTyxLQUFLLENBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLHVCQUF1QixDQUNuQyxLQUFhO1FBRWIseURBQXlEO1FBQ3pELE1BQU0sS0FBSyxHQUNULDhGQUE4RixDQUFDO1FBQ2pHLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFakMsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLE9BQU87Z0JBQ0wsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ2YsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQWtCLEVBQUUsbUJBQW1CO2dCQUNwRCxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQzthQUNqQixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxhQUFhLENBQUMsY0FBc0I7UUFDL0MsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMseUJBQXlCLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDbkUsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQztZQUVqRCxJQUFJLENBQUM7Z0JBQ0gsa0NBQWtDO2dCQUNsQyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFFdkUsK0JBQStCO2dCQUMvQixNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUM7Z0JBQ2pDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO29CQUMzQixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFzQix1QkFBdUIsQ0FBQyxDQUFDO29CQUN0RixJQUFJLFFBQVEsRUFBRSxDQUFDO3dCQUNiLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsZ0JBQWdCO3dCQUN2QyxnREFBZ0Q7d0JBQ2hELE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO3dCQUNyRCxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNoQyxDQUFDO2dCQUNILENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFFZCxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUM7WUFDNUMsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxpREFBaUQsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMxRSxDQUFDO1lBRUQsSUFBSSxDQUFDO2dCQUNILDhDQUE4QztnQkFDOUMsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLHdDQUF3QyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBRXhGLDZDQUE2QztnQkFDN0MsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRTtvQkFDdkIsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FDbEMsd0NBQXdDLENBQ3pDLENBQUM7b0JBQ0YsSUFBSSxLQUFLLEVBQUUsQ0FBQzt3QkFDVixLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ2hCLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1lBQ3BELENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkNBQTJDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDcEUsQ0FBQztZQUVELE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVqQyxNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFeEQsa0NBQWtDO1lBQ2xDLEtBQUssTUFBTSxNQUFNLElBQUksZUFBZSxFQUFFLENBQUM7Z0JBQ3JDLElBQUksTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUMxQixNQUFNLENBQUMsd0JBQXdCLEdBQUcsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQ2xFLE1BQU0sQ0FBQyxjQUFjLENBQ3RCLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQixPQUFPLGVBQWUsQ0FBQztRQUN6QixDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDWixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLGtCQUFrQixDQUFDLFVBQThEO1FBQzVGLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ25FLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFDakQsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLHVCQUF1QixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFFdkUsNENBQTRDO1lBQzVDLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQ3hELE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQ3hELE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUMzQixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RGLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7Z0JBQ2xGLFlBQTRCLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDekMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVwQixxQkFBcUI7WUFDckIsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLHdCQUF3QixDQUFDLENBQUM7WUFDckQsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUU3RCxvQkFBb0I7WUFDcEIsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLCtCQUErQixDQUFDLENBQUM7WUFDNUQsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7WUFDbEQsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLCtCQUErQixDQUFDLENBQUM7WUFDNUQsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQzVCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGtDQUFrQyxDQUFDLENBQUMsQ0FBQztnQkFDMUYsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxLQUFLLENBQUMsQ0FBQztnQkFDbkYsWUFBNEIsRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUN6QyxDQUFDLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXJCLGVBQWU7WUFDZixNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFakMsZ0RBQWdEO1lBQ2hELE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4RCxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBRTdCLE1BQU0sS0FBSyxHQUFrQyxFQUFFLENBQUM7WUFFaEQsaUJBQWlCO1lBQ2pCLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2hELEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBRWhELG9FQUFvRTtZQUNwRSxzREFBc0Q7WUFDdEQsTUFBTSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFbkIsT0FBTztnQkFDTCxlQUFlO2dCQUNmLEtBQUs7YUFDTixDQUFDO1FBQ0osQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ1osQ0FBQztDQUNGIn0=
|
|
@@ -37,6 +37,8 @@ export class JsonlDataProcessor {
|
|
|
37
37
|
continue;
|
|
38
38
|
try {
|
|
39
39
|
entry = JSON.parse(line);
|
|
40
|
+
console.log(JSON.stringify(entry, null, 2));
|
|
41
|
+
process.exit(0);
|
|
40
42
|
}
|
|
41
43
|
catch (err) {
|
|
42
44
|
console.log(line);
|
|
@@ -72,4 +74,4 @@ export class JsonlDataProcessor {
|
|
|
72
74
|
return businessRecord;
|
|
73
75
|
}
|
|
74
76
|
}
|
|
75
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5qc29ubGRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmpzb25sZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssS0FBSyxNQUFNLFlBQVksQ0FBQztBQUdwQyxNQUFNLE9BQU8sa0JBQWtCO0lBRTdCLFlBQVksY0FBd0I7UUFDbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUM7SUFDcEMsQ0FBQztJQUVELDhEQUE4RDtJQUN2RCxLQUFLLENBQUMsa0JBQWtCLENBQUMsVUFBVSxHQUFHLCtEQUErRDtRQUMxRyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFDLE1BQU0sWUFBWSxHQUFtQixFQUFFLENBQUM7UUFDeEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDdkYsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7YUFBTSxDQUFDO1FBQ1IsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLE1BQU0sT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hGLFlBQVk7YUFDVCxJQUFJLEVBRUgsQ0FBQztRQUNMLE1BQU0sZUFBZSxHQUFHLE1BQU0sWUFBWSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDekUsSUFBSSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxRQUFRLEdBQVcsRUFBRSxDQUFDO1FBQzFCLGVBQWUsQ0FB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
|
|
@@ -20,9 +20,12 @@ export class OpenData {
|
|
|
20
20
|
this.handelsregister = new HandelsRegister(this);
|
|
21
21
|
await this.handelsregister.start();
|
|
22
22
|
}
|
|
23
|
+
async buildInitialDb() {
|
|
24
|
+
await this.jsonLDataProcessor.processDataFromUrl();
|
|
25
|
+
}
|
|
23
26
|
async stop() {
|
|
24
27
|
await this.db.close();
|
|
25
28
|
await this.handelsregister.stop();
|
|
26
29
|
}
|
|
27
30
|
}
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5tYWluLm9wZW5kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5tYWluLm9wZW5kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFRLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxLQUFLLEtBQUssTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsTUFBTSxPQUFPLFFBQVE7SUFBckI7UUFFVSxnQkFBVyxHQUFHLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFLdkUsb0JBQWUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztJQXVCM0YsQ0FBQztJQXJCUSxLQUFLLENBQUMsS0FBSztRQUNoQixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7WUFDeEMsVUFBVSxFQUFFLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUM7WUFDbkUsV0FBVyxFQUFFLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUM7WUFDckUsV0FBVyxFQUFFLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUM7WUFDckUsV0FBVyxFQUFFLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUM7U0FDeEUsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakQsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFTSxLQUFLLENBQUMsY0FBYztRQUN6QixNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFFTSxLQUFLLENBQUMsSUFBSTtRQUNmLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN0QixNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEMsQ0FBQztDQUNGIn0=
|
package/dist_ts/paths.d.ts
CHANGED
package/dist_ts/paths.js
CHANGED
|
@@ -2,5 +2,7 @@ import * as plugins from './plugins.js';
|
|
|
2
2
|
export const packageDir = plugins.path.join(plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url), '../');
|
|
3
3
|
export const nogitDir = plugins.path.join(packageDir, './.nogit/');
|
|
4
4
|
plugins.smartfile.fs.ensureDirSync(nogitDir);
|
|
5
|
+
export const downloadDir = plugins.path.join(nogitDir, 'downloads');
|
|
6
|
+
plugins.smartfile.fs.ensureDirSync(downloadDir);
|
|
5
7
|
export const germanBusinessDataDir = plugins.path.join(nogitDir, 'germanbusinessdata');
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9wYXRocy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4QyxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ3pDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQy9ELEtBQUssQ0FDTixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUNuRSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFN0MsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUNwRSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7QUFHaEQsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLG9CQUFvQixDQUFDLENBQUMifQ==
|
package/dist_ts/plugins.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as path from 'path';
|
|
2
2
|
export { path, };
|
|
3
|
+
import * as lik from '@push.rocks/lik';
|
|
3
4
|
import * as qenv from '@push.rocks/qenv';
|
|
4
5
|
import * as smartarchive from '@push.rocks/smartarchive';
|
|
5
6
|
import * as smartbrowser from '@push.rocks/smartbrowser';
|
|
@@ -10,4 +11,7 @@ import * as smartpath from '@push.rocks/smartpath';
|
|
|
10
11
|
import * as smartpromise from '@push.rocks/smartpromise';
|
|
11
12
|
import * as smartrequest from '@push.rocks/smartrequest';
|
|
12
13
|
import * as smartstream from '@push.rocks/smartstream';
|
|
13
|
-
|
|
14
|
+
import * as smartunique from '@push.rocks/smartunique';
|
|
15
|
+
export { lik, qenv, smartarchive, smartbrowser, smartdata, smartdelay, smartfile, smartpath, smartpromise, smartrequest, smartstream, smartunique, };
|
|
16
|
+
import * as tsclass from '@tsclass/tsclass';
|
|
17
|
+
export { tsclass, };
|
package/dist_ts/plugins.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import * as path from 'path';
|
|
3
3
|
export { path, };
|
|
4
4
|
// @push.rocks scope
|
|
5
|
+
import * as lik from '@push.rocks/lik';
|
|
5
6
|
import * as qenv from '@push.rocks/qenv';
|
|
6
7
|
import * as smartarchive from '@push.rocks/smartarchive';
|
|
7
8
|
import * as smartbrowser from '@push.rocks/smartbrowser';
|
|
@@ -12,5 +13,9 @@ import * as smartpath from '@push.rocks/smartpath';
|
|
|
12
13
|
import * as smartpromise from '@push.rocks/smartpromise';
|
|
13
14
|
import * as smartrequest from '@push.rocks/smartrequest';
|
|
14
15
|
import * as smartstream from '@push.rocks/smartstream';
|
|
15
|
-
|
|
16
|
-
|
|
16
|
+
import * as smartunique from '@push.rocks/smartunique';
|
|
17
|
+
export { lik, qenv, smartarchive, smartbrowser, smartdata, smartdelay, smartfile, smartpath, smartpromise, smartrequest, smartstream, smartunique, };
|
|
18
|
+
// @tsclass scope
|
|
19
|
+
import * as tsclass from '@tsclass/tsclass';
|
|
20
|
+
export { tsclass, };
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFDTCxJQUFJLEdBQ0wsQ0FBQTtBQUVELG9CQUFvQjtBQUNwQixPQUFPLEtBQUssR0FBRyxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sS0FBSyxJQUFJLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxXQUFXLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUV2RCxPQUFPLEVBQ0wsR0FBRyxFQUNILElBQUksRUFDSixZQUFZLEVBQ1osWUFBWSxFQUNaLFNBQVMsRUFDVCxVQUFVLEVBQ1YsU0FBUyxFQUNULFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLFdBQVcsRUFDWCxXQUFXLEdBQ1osQ0FBQTtBQUVELGlCQUFpQjtBQUNqQixPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBRTVDLE9BQU8sRUFDTCxPQUFPLEdBQ1IsQ0FBQSJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fin.cx/opendata",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
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",
|
|
@@ -14,19 +14,22 @@
|
|
|
14
14
|
"@git.zone/tsrun": "^1.3.3",
|
|
15
15
|
"@git.zone/tstest": "^1.0.90",
|
|
16
16
|
"@push.rocks/tapbundle": "^5.5.4",
|
|
17
|
-
"@types/node": "^22.10.
|
|
17
|
+
"@types/node": "^22.10.4"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
+
"@push.rocks/lik": "^6.1.0",
|
|
20
21
|
"@push.rocks/qenv": "^6.1.0",
|
|
21
22
|
"@push.rocks/smartarchive": "^4.0.39",
|
|
22
|
-
"@push.rocks/smartbrowser": "^2.0.
|
|
23
|
+
"@push.rocks/smartbrowser": "^2.0.8",
|
|
23
24
|
"@push.rocks/smartdata": "^5.2.10",
|
|
24
25
|
"@push.rocks/smartdelay": "^3.0.5",
|
|
25
26
|
"@push.rocks/smartfile": "^11.0.23",
|
|
26
27
|
"@push.rocks/smartpath": "^5.0.18",
|
|
27
28
|
"@push.rocks/smartpromise": "^4.0.4",
|
|
28
29
|
"@push.rocks/smartrequest": "^2.0.23",
|
|
29
|
-
"@push.rocks/smartstream": "^3.2.5"
|
|
30
|
+
"@push.rocks/smartstream": "^3.2.5",
|
|
31
|
+
"@push.rocks/smartunique": "^3.0.9",
|
|
32
|
+
"@tsclass/tsclass": "^4.2.0"
|
|
30
33
|
},
|
|
31
34
|
"repository": {
|
|
32
35
|
"type": "git",
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -1,32 +1,45 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
2
|
|
|
3
3
|
@plugins.smartdata.Manager()
|
|
4
|
-
export class BusinessRecord extends plugins.smartdata.SmartDataDbDoc<
|
|
5
|
-
|
|
4
|
+
export class BusinessRecord extends plugins.smartdata.SmartDataDbDoc<
|
|
5
|
+
BusinessRecord,
|
|
6
|
+
BusinessRecord
|
|
7
|
+
> {
|
|
6
8
|
@plugins.smartdata.unI()
|
|
7
9
|
id: string;
|
|
8
|
-
|
|
10
|
+
|
|
9
11
|
@plugins.smartdata.svDb()
|
|
10
12
|
data: {
|
|
11
|
-
name?: string
|
|
12
|
-
address?: string
|
|
13
|
-
postalCode?: string
|
|
14
|
-
city?: string
|
|
15
|
-
country?: string
|
|
16
|
-
phone?: string
|
|
17
|
-
fax?: string
|
|
18
|
-
email?: string
|
|
19
|
-
website?: string
|
|
20
|
-
businessType?: string
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
13
|
+
name?: string;
|
|
14
|
+
address?: string;
|
|
15
|
+
postalCode?: string;
|
|
16
|
+
city?: string;
|
|
17
|
+
country?: string;
|
|
18
|
+
phone?: string;
|
|
19
|
+
fax?: string;
|
|
20
|
+
email?: string;
|
|
21
|
+
website?: string;
|
|
22
|
+
businessType?: string;
|
|
23
|
+
registrationId?: string;
|
|
24
|
+
germanParsedRegistration?: {
|
|
25
|
+
court?: string;
|
|
26
|
+
type?: 'HRA' | 'HRB' | 'GnR' | 'PR' | 'VR' | 'GsR';
|
|
27
|
+
number?: string;
|
|
28
|
+
};
|
|
29
|
+
legalForm?:
|
|
30
|
+
| 'GmbH'
|
|
31
|
+
| 'GmbH & Co. KG'
|
|
32
|
+
| 'AG'
|
|
33
|
+
| 'LLC'
|
|
34
|
+
| 'LLP'
|
|
35
|
+
| 'GmbH & Co. KGaA'
|
|
36
|
+
| 'GmbH & Co. KGaA, LLC';
|
|
37
|
+
managingDirectors?: string[];
|
|
38
|
+
boardOfDirectors?: string[];
|
|
39
|
+
supervisoryBoard?: string[];
|
|
40
|
+
foundingDate?: string;
|
|
41
|
+
capital?: string;
|
|
42
|
+
purpose?: string;
|
|
43
|
+
lastUpdate?: string;
|
|
31
44
|
} = {};
|
|
32
|
-
}
|
|
45
|
+
}
|
|
@@ -1,12 +1,17 @@
|
|
|
1
|
+
import type { BusinessRecord } from './classes.businessrecord.js';
|
|
1
2
|
import type { OpenData } from './classes.main.opendata.js';
|
|
2
3
|
import * as plugins from './plugins.js';
|
|
4
|
+
import * as paths from './paths.js';
|
|
3
5
|
|
|
4
6
|
/**
|
|
5
7
|
* the HandlesRegister exposed as a class
|
|
6
8
|
*/
|
|
7
9
|
export class HandelsRegister {
|
|
8
10
|
private openDataRef: OpenData;
|
|
11
|
+
private asyncExecutionStack = new plugins.lik.AsyncExecutionStack();
|
|
12
|
+
private uniqueDowloadFolder = plugins.path.join(paths.downloadDir, plugins.smartunique.uniSimple());
|
|
9
13
|
|
|
14
|
+
// Puppeteer wrapper instance
|
|
10
15
|
public smartbrowserInstance = new plugins.smartbrowser.SmartBrowser();
|
|
11
16
|
|
|
12
17
|
constructor(openDataRef: OpenData) {
|
|
@@ -14,96 +19,72 @@ export class HandelsRegister {
|
|
|
14
19
|
}
|
|
15
20
|
|
|
16
21
|
public async start() {
|
|
22
|
+
// Start the browser
|
|
23
|
+
await plugins.smartfile.fs.ensureDir(this.uniqueDowloadFolder);
|
|
17
24
|
await this.smartbrowserInstance.start();
|
|
18
25
|
}
|
|
19
26
|
|
|
20
27
|
public async stop() {
|
|
28
|
+
// Stop the browser
|
|
29
|
+
await plugins.smartfile.fs.remove(this.uniqueDowloadFolder);
|
|
21
30
|
await this.smartbrowserInstance.stop();
|
|
22
31
|
}
|
|
23
32
|
|
|
24
33
|
/**
|
|
25
|
-
*
|
|
34
|
+
* Creates a new page and configures it to allow file downloads
|
|
35
|
+
* to a predefined path.
|
|
26
36
|
*/
|
|
27
|
-
public async
|
|
37
|
+
public getNewPage = async () => {
|
|
28
38
|
const page = await this.smartbrowserInstance.headlessBrowser.newPage();
|
|
29
|
-
await page.setViewport({ width: 1920, height: 1080 });
|
|
30
|
-
await page.goto('https://www.handelsregister.de/');
|
|
31
|
-
await page.evaluate(() => {
|
|
32
|
-
const elements = Array.from(document.querySelectorAll('.ui-menuitem-text > span'));
|
|
33
|
-
const targetElement = elements.find((el) => el.textContent?.trim() === 'Normal search');
|
|
34
|
-
if (targetElement) {
|
|
35
|
-
(targetElement as HTMLElement).click();
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
39
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
await page.waitForSelector('#form\\:schlagwoerter', { timeout: 5000 });
|
|
40
|
+
// 1) Create a DevTools session for this page
|
|
41
|
+
const cdpSession = await page.target().createCDPSession();
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
textarea.value = text; // Set the value
|
|
49
|
-
// Trigger the change event manually if required
|
|
50
|
-
const event = new Event('change', { bubbles: true });
|
|
51
|
-
textarea.dispatchEvent(event);
|
|
52
|
-
}
|
|
53
|
-
}, inputText);
|
|
43
|
+
// 2) Allow file downloads and set the download path
|
|
44
|
+
await cdpSession.send('Page.setDownloadBehavior', {
|
|
45
|
+
behavior: 'allow',
|
|
46
|
+
downloadPath: this.uniqueDowloadFolder, // <-- Change this to your desired absolute path
|
|
47
|
+
});
|
|
54
48
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
49
|
+
// Optionally set viewport and go to page
|
|
50
|
+
await page.setViewport({ width: 1920, height: 1080 });
|
|
51
|
+
await page.goto('https://www.handelsregister.de/');
|
|
52
|
+
return page;
|
|
53
|
+
};
|
|
59
54
|
|
|
55
|
+
private navigateToPage = async (
|
|
56
|
+
pageArg: plugins.smartbrowser.smartpuppeteer.puppeteer.Page,
|
|
57
|
+
pageNameArg: string
|
|
58
|
+
) => {
|
|
60
59
|
try {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
const label = document.querySelector<HTMLLabelElement>(
|
|
67
|
-
'label[for="form:schlagwortOptionen:0"]'
|
|
68
|
-
);
|
|
69
|
-
if (label) {
|
|
70
|
-
label.click();
|
|
60
|
+
await pageArg.evaluate((pageNameArg2) => {
|
|
61
|
+
const elements = Array.from(document.querySelectorAll('.ui-menuitem-text > span'));
|
|
62
|
+
const targetElement = elements.find((el) => el.textContent?.trim() === pageNameArg2);
|
|
63
|
+
if (targetElement) {
|
|
64
|
+
(targetElement as HTMLElement).click();
|
|
71
65
|
}
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
console.log('Radio button clicked successfully!');
|
|
66
|
+
}, pageNameArg);
|
|
67
|
+
console.log(`Navigated to the ${pageNameArg} page successfully.`);
|
|
75
68
|
} catch (error) {
|
|
76
|
-
console.error(
|
|
69
|
+
console.error(`Failed to navigate to the ${pageNameArg} page:`, error);
|
|
77
70
|
}
|
|
71
|
+
};
|
|
78
72
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
if (targetButton) {
|
|
88
|
-
const parentButton = targetButton.closest('button') || targetButton;
|
|
89
|
-
(parentButton as HTMLElement).click();
|
|
90
|
-
}
|
|
73
|
+
private waitForResults = async (pageArg: plugins.smartbrowser.smartpuppeteer.puppeteer.Page) => {
|
|
74
|
+
await pageArg
|
|
75
|
+
.waitForSelector('#ergebnissForm\\:selectedSuchErgebnisFormTable_data', {
|
|
76
|
+
timeout: 30000,
|
|
77
|
+
})
|
|
78
|
+
.catch(async (err) => {
|
|
79
|
+
await pageArg.screenshot({ path: paths.downloadDir + '/error.png' });
|
|
80
|
+
throw err;
|
|
91
81
|
});
|
|
92
82
|
|
|
93
|
-
|
|
94
|
-
} catch (error) {
|
|
95
|
-
console.error('Failed to find or click the "Find" button:', error);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
await page.waitForSelector('#ergebnissForm\\:selectedSuchErgebnisFormTable_data', {
|
|
99
|
-
timeout: 10000,
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
const businessRecords = await page.evaluate(() => {
|
|
83
|
+
const businessRecords: BusinessRecord['data'][] = await pageArg.evaluate(() => {
|
|
103
84
|
const rows = document.querySelectorAll(
|
|
104
85
|
'#ergebnissForm\\:selectedSuchErgebnisFormTable_data > tr'
|
|
105
86
|
);
|
|
106
|
-
const records = [];
|
|
87
|
+
const records: BusinessRecord['data'][] = [];
|
|
107
88
|
|
|
108
89
|
rows.forEach((row) => {
|
|
109
90
|
const nameElement = row.querySelector('td.ui-panelgrid-cell span.marginLeft20');
|
|
@@ -116,23 +97,243 @@ export class HandelsRegister {
|
|
|
116
97
|
const name = nameElement?.textContent?.trim();
|
|
117
98
|
const city = cityElement?.textContent?.trim();
|
|
118
99
|
const status = statusElement?.textContent?.trim();
|
|
119
|
-
const
|
|
100
|
+
const registrationId = registrationCourtElement?.textContent?.trim();
|
|
120
101
|
|
|
121
102
|
// Push parsed data into records array
|
|
122
103
|
records.push({
|
|
123
104
|
name,
|
|
124
105
|
city,
|
|
125
|
-
|
|
106
|
+
registrationId,
|
|
126
107
|
businessType: status,
|
|
127
108
|
});
|
|
128
109
|
});
|
|
129
110
|
|
|
130
111
|
return records;
|
|
131
112
|
});
|
|
113
|
+
return businessRecords;
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
private clickFindButton = async (pageArg: plugins.smartbrowser.smartpuppeteer.puppeteer.Page) => {
|
|
117
|
+
try {
|
|
118
|
+
// Wait for the button with the text "Find" to appear
|
|
119
|
+
await pageArg.waitForSelector('span.ui-button-text.ui-c', { timeout: 5000 });
|
|
132
120
|
|
|
133
|
-
|
|
121
|
+
// adjust to 100 results per page
|
|
122
|
+
await pageArg.select('#form\\:ergebnisseProSeite_input', '100');
|
|
134
123
|
|
|
135
|
-
|
|
136
|
-
|
|
124
|
+
// Locate and click the button using its text
|
|
125
|
+
await pageArg.evaluate(() => {
|
|
126
|
+
const buttons = Array.from(document.querySelectorAll('span.ui-button-text.ui-c'));
|
|
127
|
+
const targetButton = buttons.find((button) => button.textContent?.trim() === 'Find');
|
|
128
|
+
if (targetButton) {
|
|
129
|
+
const parentButton = targetButton.closest('button') || targetButton;
|
|
130
|
+
(parentButton as HTMLElement).click();
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
console.log('Find button clicked successfully!');
|
|
135
|
+
} catch (error) {
|
|
136
|
+
console.error('Failed to find or click the "Find" button:', error);
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
private async downloadFile(
|
|
141
|
+
pageArg: plugins.smartbrowser.smartpuppeteer.puppeteer.Page,
|
|
142
|
+
typeArg: 'SI' | 'AD'
|
|
143
|
+
) {
|
|
144
|
+
// Trigger the file download by clicking on the relevant link
|
|
145
|
+
await pageArg.evaluate((typeArg2) => {
|
|
146
|
+
// Locate the table body
|
|
147
|
+
const tableBody = document.querySelector(
|
|
148
|
+
'#ergebnissForm\\:selectedSuchErgebnisFormTable_data'
|
|
149
|
+
);
|
|
150
|
+
if (!tableBody) {
|
|
151
|
+
throw new Error('Table body not found');
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Locate the first row
|
|
155
|
+
const firstRow = tableBody.querySelector('tr:nth-child(1)');
|
|
156
|
+
if (!firstRow) {
|
|
157
|
+
throw new Error('First row not found');
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Locate the last cell in the first row
|
|
161
|
+
const lastCell = firstRow.querySelector('td:last-child');
|
|
162
|
+
if (!lastCell) {
|
|
163
|
+
throw new Error('Last cell not found in the first row');
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Locate the download links
|
|
167
|
+
const adLink = lastCell.querySelector('a:first-of-type');
|
|
168
|
+
const siLink = lastCell.querySelector('a:last-of-type');
|
|
169
|
+
if (!siLink) {
|
|
170
|
+
throw new Error('SI link not found in the last cell');
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Simulate a click on the last <a> element
|
|
174
|
+
switch (typeArg2) {
|
|
175
|
+
case 'AD':
|
|
176
|
+
(adLink as HTMLElement).click();
|
|
177
|
+
break;
|
|
178
|
+
case 'SI':
|
|
179
|
+
(siLink as HTMLElement).click();
|
|
180
|
+
break;
|
|
181
|
+
default:
|
|
182
|
+
throw new Error('Invalid file type');
|
|
183
|
+
}
|
|
184
|
+
}, typeArg);
|
|
185
|
+
|
|
186
|
+
// Wait a bit for the download to complete (you might want to implement
|
|
187
|
+
// a more robust file-exists check or a wait-for-download library)
|
|
188
|
+
await pageArg.waitForTimeout(10000);
|
|
189
|
+
|
|
190
|
+
const files = await plugins.smartfile.fs.fileTreeToObject(this.uniqueDowloadFolder, '**/*');
|
|
191
|
+
await plugins.smartfile.fs.ensureEmptyDir(this.uniqueDowloadFolder);
|
|
192
|
+
|
|
193
|
+
return files [0];
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Helper method to parse the German registration string
|
|
198
|
+
*/
|
|
199
|
+
private async parseGermanRegistration(
|
|
200
|
+
input: string
|
|
201
|
+
): Promise<BusinessRecord['data']['germanParsedRegistration']> {
|
|
202
|
+
// e.g. District court Berlin (Charlottenburg) HRB 123456
|
|
203
|
+
const regex =
|
|
204
|
+
/District court (\p{L}[\p{L}\s-]*?(?:\s*\([\p{L}\s-]+\))?)\s+(HRA|HRB|GnR|VR|PR|GsR)\s+(\d+)/u;
|
|
205
|
+
const match = input.match(regex);
|
|
206
|
+
|
|
207
|
+
if (match) {
|
|
208
|
+
return {
|
|
209
|
+
court: match[1],
|
|
210
|
+
type: match[2] as 'HRA' | 'HRB', // Adjust if needed
|
|
211
|
+
number: match[3],
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Search for a company by name and return basic info
|
|
218
|
+
*/
|
|
219
|
+
public async searchCompany(companyNameArg: string) {
|
|
220
|
+
return this.asyncExecutionStack.getExclusiveExecutionSlot(async () => {
|
|
221
|
+
const page = await this.getNewPage();
|
|
222
|
+
await this.navigateToPage(page, 'Normal search');
|
|
223
|
+
|
|
224
|
+
try {
|
|
225
|
+
// Wait for the textarea to appear
|
|
226
|
+
await page.waitForSelector('#form\\:schlagwoerter', { timeout: 5000 });
|
|
227
|
+
|
|
228
|
+
// Enter text into the textarea
|
|
229
|
+
const inputText = companyNameArg;
|
|
230
|
+
await page.evaluate((text) => {
|
|
231
|
+
const textarea = document.querySelector<HTMLTextAreaElement>('#form\\:schlagwoerter');
|
|
232
|
+
if (textarea) {
|
|
233
|
+
textarea.value = text; // Set the value
|
|
234
|
+
// Trigger the change event manually if required
|
|
235
|
+
const event = new Event('change', { bubbles: true });
|
|
236
|
+
textarea.dispatchEvent(event);
|
|
237
|
+
}
|
|
238
|
+
}, inputText);
|
|
239
|
+
|
|
240
|
+
console.log('Text entered successfully!');
|
|
241
|
+
} catch (error) {
|
|
242
|
+
console.error('Failed to find or enter text into the textarea:', error);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
try {
|
|
246
|
+
// Wait for the radio button's label to appear
|
|
247
|
+
await page.waitForSelector('label[for="form:schlagwortOptionen:0"]', { timeout: 5000 });
|
|
248
|
+
|
|
249
|
+
// Click the label to select the radio button
|
|
250
|
+
await page.evaluate(() => {
|
|
251
|
+
const label = document.querySelector<HTMLLabelElement>(
|
|
252
|
+
'label[for="form:schlagwortOptionen:0"]'
|
|
253
|
+
);
|
|
254
|
+
if (label) {
|
|
255
|
+
label.click();
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
console.log('Radio button clicked successfully!');
|
|
260
|
+
} catch (error) {
|
|
261
|
+
console.error('Failed to find or click the radio button:', error);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
await this.clickFindButton(page);
|
|
265
|
+
|
|
266
|
+
const businessRecords = await this.waitForResults(page);
|
|
267
|
+
|
|
268
|
+
// Parse out the registration info
|
|
269
|
+
for (const record of businessRecords) {
|
|
270
|
+
if (record.registrationId) {
|
|
271
|
+
record.germanParsedRegistration = await this.parseGermanRegistration(
|
|
272
|
+
record.registrationId
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
await page.close();
|
|
278
|
+
return businessRecords;
|
|
279
|
+
}, 60000);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Search for a specific company (known register type/number/court),
|
|
284
|
+
* then click on an element that triggers a file download.
|
|
285
|
+
*/
|
|
286
|
+
public async getSpecificCompany(companyArg: BusinessRecord['data']['germanParsedRegistration']) {
|
|
287
|
+
return this.asyncExecutionStack.getExclusiveExecutionSlot(async () => {
|
|
288
|
+
const page = await this.getNewPage();
|
|
289
|
+
await this.navigateToPage(page, 'Normal search');
|
|
290
|
+
await page.waitForSelector('#form\\:schlagwoerter', { timeout: 5000 });
|
|
291
|
+
|
|
292
|
+
// 1) Type of Register (e.g. HRB, HRA, etc.)
|
|
293
|
+
await page.waitForSelector('#form\\:registerArt_label');
|
|
294
|
+
await page.click('#form\\:registerArt_label');
|
|
295
|
+
await page.waitForSelector('#form\\:registerArt_items');
|
|
296
|
+
await page.evaluate((type) => {
|
|
297
|
+
const options = Array.from(document.querySelectorAll('#form\\:registerArt_items li'));
|
|
298
|
+
const targetOption = options.find((option) => option.textContent?.trim() === type);
|
|
299
|
+
(targetOption as HTMLElement)?.click();
|
|
300
|
+
}, companyArg.type);
|
|
301
|
+
|
|
302
|
+
// 2) Register number
|
|
303
|
+
await page.waitForSelector('#form\\:registerNummer');
|
|
304
|
+
await page.type('#form\\:registerNummer', companyArg.number);
|
|
305
|
+
|
|
306
|
+
// 3) Register court
|
|
307
|
+
await page.waitForSelector('#form\\:registergericht_label');
|
|
308
|
+
await page.click('#form\\:registergericht_label');
|
|
309
|
+
await page.waitForSelector('#form\\:registergericht_items');
|
|
310
|
+
await page.evaluate((court) => {
|
|
311
|
+
const options = Array.from(document.querySelectorAll('#form\\:registergericht_items li'));
|
|
312
|
+
const targetOption = options.find((option) => option.textContent?.trim() === court);
|
|
313
|
+
(targetOption as HTMLElement)?.click();
|
|
314
|
+
}, companyArg.court);
|
|
315
|
+
|
|
316
|
+
// Click 'Find'
|
|
317
|
+
await this.clickFindButton(page);
|
|
318
|
+
|
|
319
|
+
// Optionally grab the results, just for logging
|
|
320
|
+
const businessRecords = await this.waitForResults(page);
|
|
321
|
+
console.log(businessRecords);
|
|
322
|
+
|
|
323
|
+
const files: plugins.smartfile.SmartFile[] = [];
|
|
324
|
+
|
|
325
|
+
// download files
|
|
326
|
+
files.push(await this.downloadFile(page, 'SI'));
|
|
327
|
+
files.push(await this.downloadFile(page, 'AD'));
|
|
328
|
+
|
|
329
|
+
// At this point, the file should have been downloaded automatically
|
|
330
|
+
// to the path specified by `Page.setDownloadBehavior`
|
|
331
|
+
await page.close();
|
|
332
|
+
|
|
333
|
+
return {
|
|
334
|
+
businessRecords,
|
|
335
|
+
files,
|
|
336
|
+
};
|
|
337
|
+
}, 60000);
|
|
137
338
|
}
|
|
138
339
|
}
|
package/ts/classes.jsonldata.ts
CHANGED
|
@@ -25,6 +25,11 @@ export class OpenData {
|
|
|
25
25
|
this.handelsregister = new HandelsRegister(this);
|
|
26
26
|
await this.handelsregister.start();
|
|
27
27
|
}
|
|
28
|
+
|
|
29
|
+
public async buildInitialDb() {
|
|
30
|
+
await this.jsonLDataProcessor.processDataFromUrl();
|
|
31
|
+
}
|
|
32
|
+
|
|
28
33
|
public async stop() {
|
|
29
34
|
await this.db.close();
|
|
30
35
|
await this.handelsregister.stop();
|
package/ts/paths.ts
CHANGED
|
@@ -8,4 +8,8 @@ export const packageDir = plugins.path.join(
|
|
|
8
8
|
export const nogitDir = plugins.path.join(packageDir, './.nogit/');
|
|
9
9
|
plugins.smartfile.fs.ensureDirSync(nogitDir);
|
|
10
10
|
|
|
11
|
+
export const downloadDir = plugins.path.join(nogitDir, 'downloads');
|
|
12
|
+
plugins.smartfile.fs.ensureDirSync(downloadDir);
|
|
13
|
+
|
|
14
|
+
|
|
11
15
|
export const germanBusinessDataDir = plugins.path.join(nogitDir, 'germanbusinessdata');
|
package/ts/plugins.ts
CHANGED
|
@@ -6,6 +6,7 @@ export {
|
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
// @push.rocks scope
|
|
9
|
+
import * as lik from '@push.rocks/lik';
|
|
9
10
|
import * as qenv from '@push.rocks/qenv';
|
|
10
11
|
import * as smartarchive from '@push.rocks/smartarchive';
|
|
11
12
|
import * as smartbrowser from '@push.rocks/smartbrowser';
|
|
@@ -16,8 +17,10 @@ import * as smartpath from '@push.rocks/smartpath';
|
|
|
16
17
|
import * as smartpromise from '@push.rocks/smartpromise';
|
|
17
18
|
import * as smartrequest from '@push.rocks/smartrequest';
|
|
18
19
|
import * as smartstream from '@push.rocks/smartstream';
|
|
20
|
+
import * as smartunique from '@push.rocks/smartunique';
|
|
19
21
|
|
|
20
22
|
export {
|
|
23
|
+
lik,
|
|
21
24
|
qenv,
|
|
22
25
|
smartarchive,
|
|
23
26
|
smartbrowser,
|
|
@@ -28,4 +31,12 @@ export {
|
|
|
28
31
|
smartpromise,
|
|
29
32
|
smartrequest,
|
|
30
33
|
smartstream,
|
|
31
|
-
|
|
34
|
+
smartunique,
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// @tsclass scope
|
|
38
|
+
import * as tsclass from '@tsclass/tsclass';
|
|
39
|
+
|
|
40
|
+
export {
|
|
41
|
+
tsclass,
|
|
42
|
+
}
|