cry-bizisi-parser 0.2.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/bizisi.js ADDED
@@ -0,0 +1,623 @@
1
+ /**
2
+ * bizi.si scraper — čisti Bun fetch, brez brskalnika.
3
+ *
4
+ * bizi.si uporablja ASP.NET WebForms, zato je treba:
5
+ * 1. Shranjevati piškotke (ASP.NET_SessionId, .ASPXAUTH)
6
+ * 2. Prenašati __VIEWSTATE in __EVENTVALIDATION med GET in POST
7
+ *
8
+ * Odvisnosti: 0 — samo Bun built-in API-ji.
9
+ */
10
+ var _a;
11
+ import { createWorker } from "tesseract.js";
12
+ // ---------------------------------------------------------------------------
13
+ // Config
14
+ // ---------------------------------------------------------------------------
15
+ const BASE_URL = "https://www.bizi.si";
16
+ // ---------------------------------------------------------------------------
17
+ // Cookie jar — ročno upravljanje prek Set-Cookie / Cookie
18
+ // ---------------------------------------------------------------------------
19
+ class CookieJar {
20
+ cookies = new Map();
21
+ /** Prebere Set-Cookie headerje in shrani (Node.js + Bun). */
22
+ setFromHeaders(headers) {
23
+ // Node.js 19+ ima getSetCookie(), Bun ima getAll()
24
+ let setCookieValues;
25
+ if (typeof headers.getSetCookie === "function") {
26
+ setCookieValues = headers.getSetCookie();
27
+ }
28
+ else if (typeof headers.getAll === "function") {
29
+ const raw = headers.getAll("Set-Cookie");
30
+ setCookieValues = Array.isArray(raw) ? raw : [raw];
31
+ }
32
+ else {
33
+ setCookieValues = [];
34
+ for (const [k, v] of headers) {
35
+ if (k.toLowerCase() === "set-cookie")
36
+ setCookieValues.push(v);
37
+ }
38
+ }
39
+ for (const entry of setCookieValues) {
40
+ if (!entry)
41
+ continue;
42
+ const [nv, ...rest] = entry.split(";");
43
+ if (!nv)
44
+ continue;
45
+ const eq = nv.indexOf("=");
46
+ if (eq < 0)
47
+ continue;
48
+ const name = nv.substring(0, eq).trim();
49
+ const value = nv.substring(eq + 1).trim();
50
+ let domain = ".bizi.si";
51
+ let path = "/";
52
+ for (const attr of rest) {
53
+ const a = attr.trim();
54
+ if (a.toLowerCase().startsWith("domain="))
55
+ domain = a.split("=")[1] ?? domain;
56
+ if (a.toLowerCase().startsWith("path="))
57
+ path = a.split("=")[1] ?? path;
58
+ if (a.toLowerCase() === "max-age=0" || a.toLowerCase().startsWith("expires=")) {
59
+ // Could handle expiry but not critical
60
+ }
61
+ }
62
+ this.cookies.set(name, { value, domain, path });
63
+ }
64
+ }
65
+ /** Vrne Cookie header za dani URL. */
66
+ getRequestHeader() {
67
+ const parts = [];
68
+ for (const [name, c] of this.cookies) {
69
+ if (c.domain && ".bizi.si".endsWith(c.domain)) {
70
+ parts.push(`${name}=${c.value}`);
71
+ }
72
+ }
73
+ return parts.join("; ");
74
+ }
75
+ /** Izbriši vse piškotke. */
76
+ clear() {
77
+ this.cookies.clear();
78
+ }
79
+ }
80
+ // ---------------------------------------------------------------------------
81
+ // HTTP helper — fetch s piškotki
82
+ // ---------------------------------------------------------------------------
83
+ async function fetchWithCookies(url, jar, init = {}) {
84
+ const headers = new Headers(init.headers);
85
+ // Default headers
86
+ if (!headers.has("User-Agent")) {
87
+ headers.set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36");
88
+ }
89
+ if (!headers.has("Accept")) {
90
+ headers.set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
91
+ }
92
+ if (!headers.has("Accept-Language")) {
93
+ headers.set("Accept-Language", "sl-SI,sl;q=0.9,en;q=0.8");
94
+ }
95
+ const cookie = jar.getRequestHeader();
96
+ if (cookie)
97
+ headers.set("Cookie", cookie);
98
+ if (init.body && !headers.has("Content-Type")) {
99
+ headers.set("Content-Type", "application/x-www-form-urlencoded");
100
+ }
101
+ const res = await fetch(url, { ...init, headers, redirect: "manual" });
102
+ // Shrani nove piškotke
103
+ jar.setFromHeaders(res.headers);
104
+ // Sledi redirectom ročno (da ohranimo piškotke)
105
+ if (res.status >= 300 && res.status < 400) {
106
+ const location = res.headers.get("location");
107
+ if (location) {
108
+ const redirectUrl = location.startsWith("http") ? location : `${new URL(url).origin}${location}`;
109
+ return fetchWithCookies(redirectUrl, jar, { method: "GET" });
110
+ }
111
+ }
112
+ return res;
113
+ }
114
+ // ---------------------------------------------------------------------------
115
+ // ASP.NET WebForms helperji
116
+ // ---------------------------------------------------------------------------
117
+ /** Izlušči __VIEWSTATE, __EVENTVALIDATION itd. iz HTML. */
118
+ function extractAspFormFields(html) {
119
+ const fields = {};
120
+ const regex = /<input[^>]*(?:name|id)="(?:__VIEWSTATE|__EVENTVALIDATION|__VIEWSTATEGENERATOR)"[^>]*\/?>/gi;
121
+ let m;
122
+ while ((m = regex.exec(html)) !== null) {
123
+ const nameMatch = m[0].match(/name="([^"]+)"/);
124
+ const valueMatch = m[0].match(/value="([^"]*)"/);
125
+ if (nameMatch) {
126
+ fields[nameMatch[1]] = valueMatch ? valueMatch[1] : "";
127
+ }
128
+ }
129
+ return fields;
130
+ }
131
+ /** Build URL-encoded form body. */
132
+ function encodeForm(data) {
133
+ return Object.entries(data)
134
+ .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
135
+ .join("&");
136
+ }
137
+ // ---------------------------------------------------------------------------
138
+ // Parser helperji
139
+ // ---------------------------------------------------------------------------
140
+ function normalize(str) {
141
+ return str.replace(/\s+/g, " ").trim();
142
+ }
143
+ /** Pretvori slovenski datum "25. 3. 2015" v ISO "2015-03-25". */
144
+ function formatDate(raw) {
145
+ const m = raw.match(/(\d{1,2})\.\s*(\d{1,2})\.\s*(\d{4})/);
146
+ if (!m)
147
+ return raw;
148
+ const d = m[1].padStart(2, "0");
149
+ const mo = m[2].padStart(2, "0");
150
+ const y = m[3];
151
+ return `${y}-${mo}-${d}`;
152
+ }
153
+ function parseEmployees(raw) {
154
+ const s = raw.trim();
155
+ if (!s || /^(ni|brez|ne|\/)/i.test(s))
156
+ return 0;
157
+ const range = s.match(/(\d+)\s*(?:ali|do|-|–|,)\s*(\d+)/i);
158
+ if (range)
159
+ return (parseInt(range[1] ?? "0", 10) + parseInt(range[2] ?? "0", 10)) / 2;
160
+ const single = s.match(/(\d+)/);
161
+ return single ? parseInt(single[1] ?? "0", 10) : 0;
162
+ }
163
+ function parseSlovenianNumber(raw) {
164
+ if (!raw)
165
+ return null;
166
+ let s = raw.trim();
167
+ if (s === "" || s === "-")
168
+ return null;
169
+ if (s === "0")
170
+ return 0;
171
+ s = s.replace(/\./g, "").replace(/,/, ".");
172
+ const n = parseFloat(s);
173
+ return Number.isFinite(n) ? n : null;
174
+ }
175
+ /** Poišči besedilo med dvema oznakama v HTML (brez HTML tagov). */
176
+ function extractBetween(html, startMarker, endMarker) {
177
+ const s = html.indexOf(startMarker);
178
+ if (s < 0)
179
+ return "";
180
+ const start = s + startMarker.length;
181
+ const e = endMarker ? html.indexOf(endMarker, start) : html.length;
182
+ if (e < 0)
183
+ return html.substring(start).trim();
184
+ return html.substring(start, e).trim();
185
+ }
186
+ /** Odstrani HTML tage. */
187
+ function stripTags(html) {
188
+ return html.replace(/<[^>]+>/g, " ").replace(/&nbsp;/g, " ").replace(/&amp;/g, "&");
189
+ }
190
+ /** Poišči tabelo v HTML in vrni vrstice kot array celic. */
191
+ function parseTable(html, tableIdx = 0) {
192
+ const tables = [];
193
+ const tableRegex = /<table[^>]*>([\s\S]*?)<\/table>/gi;
194
+ let tMatch;
195
+ while ((tMatch = tableRegex.exec(html)) !== null) {
196
+ const rows = [];
197
+ const rowRegex = /<tr[^>]*>([\s\S]*?)<\/tr>/gi;
198
+ let rMatch;
199
+ while ((rMatch = rowRegex.exec(tMatch[1])) !== null) {
200
+ const cells = [];
201
+ const cellRegex = /<t[dh][^>]*>([\s\S]*?)<\/t[dh]>/gi;
202
+ let cMatch;
203
+ while ((cMatch = cellRegex.exec(rMatch[1])) !== null) {
204
+ cells.push(normalize(stripTags(cMatch[1])));
205
+ }
206
+ if (cells.length > 0)
207
+ rows.push(cells);
208
+ }
209
+ if (rows.length > 0)
210
+ tables.push(rows.flat());
211
+ }
212
+ return tables;
213
+ }
214
+ // ---------------------------------------------------------------------------
215
+ // FetchBizisiScraper
216
+ // ---------------------------------------------------------------------------
217
+ export class BizisiScraper {
218
+ jar = new CookieJar();
219
+ _loggedIn = false;
220
+ ocrWorker = null;
221
+ /** Vrne (ali ustvari) OCR worker. */
222
+ async #getOcrWorker() {
223
+ if (!this.ocrWorker) {
224
+ this.ocrWorker = await createWorker("slv", 1, {
225
+ logger: () => { }, // utišaj log
226
+ });
227
+ }
228
+ return this.ocrWorker;
229
+ }
230
+ /** Počisti OCR worker (pokliči ko končaš). */
231
+ async close() {
232
+ if (this.ocrWorker) {
233
+ try {
234
+ await this.ocrWorker.terminate();
235
+ }
236
+ catch { }
237
+ this.ocrWorker = null;
238
+ }
239
+ }
240
+ /** OCR ene slike — vrne prepoznano besedilo. */
241
+ async #ocrImage(url) {
242
+ try {
243
+ const resp = await fetch(url);
244
+ const buf = Buffer.from(await resp.arrayBuffer());
245
+ const worker = await this.#getOcrWorker();
246
+ const { data } = await worker.recognize(buf);
247
+ return data.text.trim();
248
+ }
249
+ catch {
250
+ return url; // fallback na URL
251
+ }
252
+ }
253
+ get loggedIn() {
254
+ return this._loggedIn;
255
+ }
256
+ // -----------------------------------------------------------------------
257
+ // Login
258
+ // -----------------------------------------------------------------------
259
+ async login(username, password) {
260
+ const user = username ?? process.env.BIZISI_USERNAME;
261
+ const pass = password ?? process.env.BIZISI_PASSWORD;
262
+ if (!user || !pass)
263
+ throw new Error("Missing BIZISI_USERNAME or BIZISI_PASSWORD");
264
+ // 1. GET login page — poberi __VIEWSTATE itd.
265
+ const loginPage = await fetchWithCookies(`${BASE_URL}/prijava/`, this.jar);
266
+ const html = await loginPage.text();
267
+ const aspFields = extractAspFormFields(html);
268
+ if (!aspFields["__VIEWSTATE"]) {
269
+ throw new Error("Could not find __VIEWSTATE on login page");
270
+ }
271
+ // 2. POST login form
272
+ const formData = {
273
+ ...aspFields,
274
+ "ctl00$cphMain$loginBox1$UserName": user,
275
+ "ctl00$cphMain$loginBox1$Password": pass,
276
+ "ctl00$cphMain$loginBox1$ButtonLogin": "Prijavi se",
277
+ "ctl00$cphMain$loginBox1$cvUN": "",
278
+ "ctl00$cphMain$loginBox1$cvPW": "",
279
+ __LASTFOCUS: "",
280
+ __SCROLLPOSITION: "",
281
+ };
282
+ const loginRes = await fetchWithCookies(`${BASE_URL}/prijava/?rw=1`, this.jar, {
283
+ method: "POST",
284
+ body: encodeForm(formData),
285
+ headers: {
286
+ Referer: `${BASE_URL}/prijava/`,
287
+ Origin: BASE_URL,
288
+ },
289
+ });
290
+ const loginHtml = await loginRes.text();
291
+ // Preveri, če je prijava uspela
292
+ if (loginHtml.includes("Prijavi se") && !loginHtml.includes("Moj Bizi")) {
293
+ if (/napačno|neveljaven|Presegli/i.test(loginHtml)) {
294
+ throw new Error("Login failed: invalid credentials or rate-limited");
295
+ }
296
+ throw new Error("Login failed: could not verify");
297
+ }
298
+ this._loggedIn = true;
299
+ }
300
+ // -----------------------------------------------------------------------
301
+ // Search
302
+ // -----------------------------------------------------------------------
303
+ async search(query) {
304
+ const res = await fetchWithCookies(`${BASE_URL}/iskanje?q=${encodeURIComponent(query)}`, this.jar);
305
+ const html = await res.text();
306
+ return this.#parseSearchResults(html);
307
+ }
308
+ #parseSearchResults(html) {
309
+ const results = [];
310
+ // Najdi vrstice rezultatov: div.row.b-table-row z id-jem, ki vsebuje RepeaterResults
311
+ const rowRegex = /<div[^>]*id="ctl00_cphMain_DisplayRecords1_RepeaterResults_[^"]*"[^>]*class="[^"]*row b-table-row[^"]*"[^>]*>([\s\S]*?)<\/div>\s*<\/div>/gi;
312
+ let rowMatch;
313
+ while ((rowMatch = rowRegex.exec(html)) !== null) {
314
+ const rowHtml = rowMatch[1];
315
+ // Company link
316
+ const linkMatch = rowHtml.match(/<a[^>]*class="[^"]*b-link-company[^"]*"[^>]*href="([^"]*)"[^>]*>[\s\S]*?<span[^>]*class="b-company-title"[^>]*>([\s\S]*?)<\/span>/i);
317
+ if (!linkMatch)
318
+ continue;
319
+ const href = linkMatch[1];
320
+ const name = normalize(stripTags(linkMatch[2]));
321
+ // Celice: div.col.b-table-cell
322
+ const cells = Array.from(rowHtml.matchAll(/<div[^>]*class="[^"]*col b-table-cell[^"]*"[^>]*>([\s\S]*?)<\/div>/gi));
323
+ const getCell = (idx) => {
324
+ if (idx >= cells.length)
325
+ return "";
326
+ return normalize(stripTags(cells[idx][1]));
327
+ };
328
+ // Cells: 0=checkbox, 1=name, 2=address, 3=city, 4=reg#, 5=tax#, 6=activity, 7=employees
329
+ const url = href.startsWith("http") ? "/" + href.split("/").slice(3).join("/") : href;
330
+ results.push({
331
+ name,
332
+ url: url.replace(/\/+$/, "") + "/",
333
+ address: getCell(2),
334
+ city: getCell(3),
335
+ registrationNumber: getCell(4),
336
+ taxNumber: getCell(5),
337
+ activity: getCell(6),
338
+ employees: parseEmployees(getCell(7)),
339
+ });
340
+ }
341
+ return results;
342
+ }
343
+ // -----------------------------------------------------------------------
344
+ // Company detail
345
+ // -----------------------------------------------------------------------
346
+ async getCompanyDetail(relativeUrl) {
347
+ const url = `${BASE_URL}${relativeUrl.startsWith("/") ? "" : "/"}${relativeUrl}`;
348
+ const res = await fetchWithCookies(url, this.jar);
349
+ const html = await res.text();
350
+ // Odstrani skripte in stile za čistejše regex ujemanje
351
+ const cleanHtml = html
352
+ .replace(/<script[\s\S]*?<\/script>/gi, "")
353
+ .replace(/<style[\s\S]*?<\/style>/gi, "")
354
+ .replace(/&nbsp;/g, " ")
355
+ .replace(/&amp;/g, "&");
356
+ const fullText = normalize(stripTags(cleanHtml));
357
+ // Poišči položaj h1 — za njim je glavna vsebina, pred njim sidebar
358
+ const h1Start = cleanHtml.indexOf('<h1');
359
+ const afterH1Html = h1Start >= 0 ? cleanHtml.substring(h1Start) : cleanHtml;
360
+ // Helper: extractBetween na HTML-ju za h1
361
+ const extractAfterH1 = (start, end) => {
362
+ const s = afterH1Html.indexOf(start);
363
+ if (s < 0)
364
+ return '';
365
+ const begin = s + start.length;
366
+ const e = end ? afterH1Html.indexOf(end, begin) : afterH1Html.length;
367
+ if (e < 0)
368
+ return afterH1Html.substring(begin).trim();
369
+ return afterH1Html.substring(begin, e).trim();
370
+ };
371
+ // --- Header info ---
372
+ const h1Match = cleanHtml.match(/<h1[^>]*>([\s\S]*?)<\/h1>/i);
373
+ const h1Name = h1Match ? normalize(stripTags(h1Match[1])) : "";
374
+ const titleMatch = cleanHtml.match(/<title[^>]*>([\s\S]*?)<\/title>/i);
375
+ const title = titleMatch ? titleMatch[1].replace(/ - .*$/, "").trim() : "";
376
+ const name = h1Name || title;
377
+ // Phone: poišči tel: povezavo
378
+ const phoneMatch = cleanHtml.match(/<a[^>]*href="tel:([^"]*)"[^>]*>([\s\S]*?)<\/a>/i);
379
+ const phone = phoneMatch ? normalize(phoneMatch[2] ?? phoneMatch[1]) : "";
380
+ // Email: poišči mailto: povezavo
381
+ const emailMatch = cleanHtml.match(/<a[^>]*href="mailto:([^"]*)"[^>]*>([\s\S]*?)<\/a>/i);
382
+ const email = emailMatch ? normalize(emailMatch[2] ?? emailMatch[1]) : "";
383
+ // Website: poišči v header delu (za h1, pred h5) link z URL-jem kot besedilom
384
+ let website = "";
385
+ const headerHtml = extractAfterH1("</h1>", "Matično podjetje");
386
+ // Poisci <a> brez href (aspNetDisabled) kjer je text URL, ali <a> s href
387
+ const headerLinks = Array.from(headerHtml.matchAll(/<a[^>]*>([\s\S]*?)<\/a>/gi));
388
+ for (const link of headerLinks) {
389
+ const text = normalize(link[1]);
390
+ if (text.startsWith("http") && !text.includes("bizi.si")) {
391
+ website = text;
392
+ break;
393
+ }
394
+ }
395
+ // Address: vzemi samo vrstico z naslovom (vsebuje številko in poštno številko)
396
+ let address = "";
397
+ const addrRaw = extractAfterH1("</h1>", '<h5 class="b-box-title');
398
+ if (addrRaw) {
399
+ const addrText = normalize(stripTags(addrRaw));
400
+ // Vzemi besedilo do prvega emaila, telefona (3 cifre + presledek + 3-6 cifre), "Več" ali "Dodaj"
401
+ const upToMarker = addrText.split(/\s+\S+@\S+|\s+\d{3}\s\d{3,6}|\s+Več\s+|\s+Dodaj\s+|\s+http/i)[0]?.trim() ?? '';
402
+ // Izlušči del s poštno številko (4-mestna)
403
+ const m = upToMarker.match(/([A-ZČŠŽa-zčšž][^,]+\d+[^,]*,\s*[^,]+,\s*\d{4}\s+[A-ZČŠŽa-zčšž][^,]+)/);
404
+ if (m)
405
+ address = m[1].trim();
406
+ }
407
+ // --- Matično podjetje section (only after h1) ---
408
+ const maticnoHtml = extractAfterH1("Matično podjetje", "Ključne osebe");
409
+ const maticnoText = normalize(stripTags(maticnoHtml));
410
+ const davcnaM = maticnoText.match(/Davčna številka.*?(\d{7,9})/i);
411
+ const maticnaM = maticnoText.match(/Matična.*?(\d{7,10})/i);
412
+ const ddvM = maticnoText.match(/Zavezanec za DDV.*?(Da|Ne)/i);
413
+ const skisM = maticnoText.match(/SKIS\s*:?\s*([^\n]+?)(?:\s+(?:Datum|Vir))/i);
414
+ const vpisM = maticnoText.match(/Datum vpisa\s*:?\s*([^\n]+?)(?:\s+(?:Dejavnost|Vir))/i);
415
+ const dejavnostM = maticnoText.match(/Dejavnost TSmedia\s*:?\s*([^\n]+?)(?:\s+Vir)/i);
416
+ const taxNumber = davcnaM ? davcnaM[1] : "";
417
+ const registrationNumber = maticnaM ? maticnaM[1] : "";
418
+ const vatPayer = ddvM ? ddvM[1].toLowerCase() === "da" : false;
419
+ const vatNumM = fullText.match(/SI(\d{7,9})/);
420
+ const vatNumber = vatNumM ? "SI" + vatNumM[1] : "";
421
+ const skis = skisM ? skisM[1].trim() : "";
422
+ const dateOfEntry = vpisM ? formatDate(vpisM[1].trim()) : "";
423
+ const activity = dejavnostM ? dejavnostM[1].trim() : "";
424
+ // --- TRR (only after h1) ---
425
+ const trrHtml = extractAfterH1("TRR in blokade", "Bizi obveščevalec");
426
+ const trrText = normalize(stripTags(trrHtml));
427
+ const bankAccounts = [];
428
+ const ibanRegex = /(SI\d{2}\s*\d{4}\s*\d{4}\s*\d{4}\s*\d{3})/g;
429
+ let ibanM;
430
+ while ((ibanM = ibanRegex.exec(trrText)) !== null) {
431
+ bankAccounts.push({
432
+ iban: ibanM[1].replace(/\s+/g, " ").trim(),
433
+ status: "odprt",
434
+ openedDate: null,
435
+ bank: null,
436
+ });
437
+ }
438
+ // --- Key people (only after h1, before Bonitetna ocena) ---
439
+ const osebeHtml = extractAfterH1("Ključne osebe", "Bonitetna ocena");
440
+ const keyPeople = await this.#ocrKeyPeople(this.#parseKeyPeople(osebeHtml));
441
+ // --- Financiranje iz proračuna (only after h1) ---
442
+ const finHtml = extractAfterH1("Financiranje iz proračuna", "Ne spreglejte");
443
+ const finText = normalize(stripTags(finHtml));
444
+ const financingFromBudget = this.#parseFinancing(finText);
445
+ return {
446
+ name,
447
+ fullAddress: address || "",
448
+ phone,
449
+ website,
450
+ email,
451
+ taxNumber,
452
+ registrationNumber,
453
+ vatPayer,
454
+ vatNumber,
455
+ skis,
456
+ dateOfEntry,
457
+ activity,
458
+ keyPeople,
459
+ bankAccounts,
460
+ financingFromBudget,
461
+ };
462
+ }
463
+ // -----------------------------------------------------------------------
464
+ // Financial data
465
+ // -----------------------------------------------------------------------
466
+ async getFinancialData(relativeUrl) {
467
+ const basePath = relativeUrl.replace(/\/+$/, "");
468
+ const finUrl = `${BASE_URL}${basePath}/financni-podatki/`;
469
+ const res = await fetchWithCookies(finUrl, this.jar);
470
+ const html = await res.text();
471
+ // Preveri paywall
472
+ if (/registriraj.*se.*brezplačno|naroči.*polni.*dostop|preizkusi/i.test(html)) {
473
+ return [];
474
+ }
475
+ const cleanHtml = html
476
+ .replace(/<script[\s\S]*?<\/script>/gi, "")
477
+ .replace(/<style[\s\S]*?<\/style>/gi, "");
478
+ // Poišči tabelo s finančnimi podatki
479
+ const tables = parseTable(cleanHtml);
480
+ const data = [];
481
+ for (const row of tables) {
482
+ const joined = row.join(" ");
483
+ const yearMatch = joined.match(/\b(20[2-9]\d)\b/);
484
+ if (!yearMatch)
485
+ continue;
486
+ const year = parseInt(yearMatch[1], 10);
487
+ // Prvi večji znesek = čisti prihodki, drugi = poslovni izzid
488
+ const amounts = row
489
+ .map((c) => parseSlovenianNumber(c))
490
+ .filter((n) => n !== null && n > 0);
491
+ data.push({
492
+ year,
493
+ netSalesRevenue: amounts[0] ?? null,
494
+ operatingResult: amounts[1] ?? null,
495
+ });
496
+ }
497
+ return data;
498
+ }
499
+ // -----------------------------------------------------------------------
500
+ // Scrape
501
+ // -----------------------------------------------------------------------
502
+ async scrapeCompany(relativeUrl) {
503
+ const company = await this.getCompanyDetail(relativeUrl);
504
+ const financialData = await this.getFinancialData(relativeUrl);
505
+ return { company, financialData };
506
+ }
507
+ async scrape(query, options) {
508
+ const maxResults = options?.maxResults ?? 0;
509
+ const includeFinancial = options?.includeFinancialData ?? true;
510
+ const results = await this.search(query);
511
+ const limited = maxResults > 0 ? results.slice(0, maxResults) : results;
512
+ const output = [];
513
+ for (const result of limited) {
514
+ try {
515
+ const scraped = await this.scrapeCompany(result.url);
516
+ output.push(scraped);
517
+ }
518
+ catch (err) {
519
+ console.error(`Failed to scrape ${result.name}:`, err);
520
+ output.push({
521
+ company: {
522
+ name: result.name,
523
+ fullAddress: "",
524
+ phone: "",
525
+ website: "",
526
+ email: "",
527
+ taxNumber: result.taxNumber,
528
+ registrationNumber: result.registrationNumber,
529
+ vatPayer: false,
530
+ vatNumber: "",
531
+ skis: "",
532
+ dateOfEntry: "",
533
+ activity: result.activity,
534
+ keyPeople: { nadzorniki: [], ustanovitelji: [], zastopniki: [] },
535
+ bankAccounts: [],
536
+ financingFromBudget: {},
537
+ },
538
+ financialData: [],
539
+ });
540
+ }
541
+ }
542
+ return output;
543
+ }
544
+ // -----------------------------------------------------------------------
545
+ // Private helpers
546
+ // -----------------------------------------------------------------------
547
+ /** Statusna sporočila, ki niso imena oseb. */
548
+ static #statusPhrases = [
549
+ 'ni vpisan', 'ni vpisanih', 'ni aktivnih',
550
+ 'trenutno ni', 'ni podatka', 'ni zabeleženih',
551
+ 'ni najdenih', 'brez podatka',
552
+ ];
553
+ static #isStatus(text) {
554
+ const lower = text.toLowerCase();
555
+ return _a.#statusPhrases.some((p) => lower.includes(p));
556
+ }
557
+ /**
558
+ * Razčleni HTML sekcije "Ključne osebe" in vrne KeyPeople z ImageGenerator URL-ji.
559
+ * Vsaka oseba je v svojem <span class="...b-attr-value...">.
560
+ */
561
+ #parseKeyPeople(html) {
562
+ const result = { nadzorniki: [], ustanovitelji: [], zastopniki: [] };
563
+ if (!html)
564
+ return result;
565
+ const cats = [
566
+ { label: 'Nadzorniki:', key: 'nadzorniki' },
567
+ { label: 'Ustanovitelji:', key: 'ustanovitelji' },
568
+ { label: 'Zastopniki:', key: 'zastopniki' },
569
+ ];
570
+ for (let ci = 0; ci < cats.length; ci++) {
571
+ const { label, key } = cats[ci];
572
+ const labelIdx = html.indexOf(label);
573
+ if (labelIdx < 0)
574
+ continue;
575
+ const nextLabel = ci + 1 < cats.length ? cats[ci + 1].label : null;
576
+ const nextIdx = nextLabel ? html.indexOf(nextLabel, labelIdx + label.length) : html.length;
577
+ const sectionHtml = html.substring(labelIdx + label.length, nextIdx > 0 ? nextIdx : html.length);
578
+ // Vsak <span class="...b-attr-value..."> je ena oseba z 1+ slikami
579
+ const personSpans = Array.from(sectionHtml.matchAll(/<span[^>]*class="[^"]*b-attr-value[^"]*"[^>]*>([\s\S]*?)<\/span>/gi));
580
+ for (const span of personSpans) {
581
+ const imgs = Array.from(span[1].matchAll(/<img[^>]*src="([^"]*ImageGenerator[^"]*)"[^>]*>/gi));
582
+ const urls = imgs.map((m) => m[1]);
583
+ if (urls.length > 0)
584
+ result[key].push(urls.join('|||')); // delimiter za OCR
585
+ }
586
+ }
587
+ return result;
588
+ }
589
+ async #ocrKeyPeople(raw) {
590
+ const result = { nadzorniki: [], ustanovitelji: [], zastopniki: [] };
591
+ for (const group of ['nadzorniki', 'ustanovitelji', 'zastopniki']) {
592
+ for (const entry of raw[group]) {
593
+ const urls = entry.split('|||');
594
+ if (urls.length === 0)
595
+ continue;
596
+ const texts = await Promise.all(urls.map((url) => this.#ocrImage(url)));
597
+ const joined = texts.join(' ').trim();
598
+ if (!joined || _a.#isStatus(joined))
599
+ continue;
600
+ // Odstrani vloge (direktor, prokurist, ...)
601
+ const cleaned = joined.replace(/\s*,?\s*(?:direktor|prokurist|član|predsednik|namestnik|vodja)\s*,?\s*/gi, '').trim();
602
+ if (cleaned)
603
+ result[group].push(cleaned);
604
+ }
605
+ }
606
+ return result;
607
+ }
608
+ #parseFinancing(text) {
609
+ const result = {};
610
+ const regex = /\b(20[0-9]{2})\D{1,20}?(\d{1,3}(?:\.\d{3})*(?:,\d{2})?)\s*(?:EUR|€)?/g;
611
+ let m;
612
+ while ((m = regex.exec(text)) !== null) {
613
+ const year = parseInt(m[1], 10);
614
+ const amount = parseSlovenianNumber(m[2] ?? null);
615
+ if (year >= 2010 && year <= 2030 && amount !== null) {
616
+ result[year] = amount;
617
+ }
618
+ }
619
+ return result;
620
+ }
621
+ }
622
+ _a = BizisiScraper;
623
+ //# sourceMappingURL=bizisi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bizisi.js","sourceRoot":"","sources":["../src/bizisi.ts"],"names":[],"mappings":"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"}