cry-vetzdravila 1.0.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.
Files changed (84) hide show
  1. package/.claude/settings.local.json +17 -0
  2. package/CLAUDE.md +82 -0
  3. package/LICENSE.md +16 -0
  4. package/README.md +376 -0
  5. package/a.txt +1643 -0
  6. package/bun.lock +197 -0
  7. package/dist/atcvet/opisATCvetKode.d.ts +23 -0
  8. package/dist/atcvet/podatkiATCvetKode.d.ts +20 -0
  9. package/dist/atcvet/pomeniNivojevATCvet.d.ts +1 -0
  10. package/dist/atcvet/types/AtcvetFile.d.ts +19 -0
  11. package/dist/generated/AtcVet.d.ts +9 -0
  12. package/dist/generated/RegisterZdravil.d.ts +8 -0
  13. package/dist/generated/seznamZdravil.d.ts +8 -0
  14. package/dist/index.d.ts +244 -0
  15. package/dist/index.js +141786 -0
  16. package/dist/register/MIN_OCENA_PODOBNOSTI.d.ts +2 -0
  17. package/dist/register/helper/normalizirajNaziv.d.ts +176 -0
  18. package/dist/register/helper/oblikujRezultatIskanja.d.ts +8 -0
  19. package/dist/register/helper/oceniPodobnost.d.ts +37 -0
  20. package/dist/register/helper/poisciZivalskoVrsto.d.ts +33 -0
  21. package/dist/register/helper/razcleniNaziv.d.ts +2 -0
  22. package/dist/register/podobnaZdravilaPoATC.d.ts +16 -0
  23. package/dist/register/podobnaZdravilaPoUcinkovinah.d.ts +18 -0
  24. package/dist/register/registerZdravil.d.ts +9 -0
  25. package/dist/register/types/KarencaZdravila.d.ts +24 -0
  26. package/dist/register/types/PotUporabeZdravila.d.ts +21 -0
  27. package/dist/register/types/RazclembaZdravila.d.ts +9 -0
  28. package/dist/register/types/RegisterZdravil.d.ts +2 -0
  29. package/dist/register/types/UcinkovinaZdravila.d.ts +20 -0
  30. package/dist/register/types/Zdravilo.d.ts +65 -0
  31. package/dist/register/types/ZdraviloZUtemeljitvijo.d.ts +9 -0
  32. package/dist/register/types/ZivalskeVrste.d.ts +158 -0
  33. package/dist/register/uganiZdravilo.d.ts +43 -0
  34. package/dist/register/zdravilaZaAtcVetKodo.d.ts +8 -0
  35. package/dist/register/zdraviloJeVakcinaZa.d.ts +18 -0
  36. package/docs/vakcine.md +195 -0
  37. package/package.json +39 -0
  38. package/src/atcvet/CLAUDE.md +18 -0
  39. package/src/atcvet/downloadLatestAtcvetPdf.ts +107 -0
  40. package/src/atcvet/opisATCvetKode.ts +116 -0
  41. package/src/atcvet/parseAtcvetPdf.ts +215 -0
  42. package/src/atcvet/podatkiATCvetKode.ts +34 -0
  43. package/src/atcvet/pomeniNivojevATCvet.ts +8 -0
  44. package/src/atcvet/types/AtcvetFile.ts +22 -0
  45. package/src/generate.ts +111 -0
  46. package/src/generated/AtcVet.ts +56704 -0
  47. package/src/generated/seznamZdravil.ts +44833 -0
  48. package/src/importParseAndBuildAll.ts +97 -0
  49. package/src/index.ts +289 -0
  50. package/src/interactive.ts +428 -0
  51. package/src/register/CLAUDE.md +230 -0
  52. package/src/register/MIN_OCENA_PODOBNOSTI.ts +3 -0
  53. package/src/register/downloadRegister.ts +148 -0
  54. package/src/register/helper/analizaVakcin.ts +90 -0
  55. package/src/register/helper/checkVrste.ts +72 -0
  56. package/src/register/helper/hashString.ts +27 -0
  57. package/src/register/helper/normalizirajNaziv.ts +493 -0
  58. package/src/register/helper/oblikujRezultatIskanja.ts +15 -0
  59. package/src/register/helper/oceniPodobnost.ts +194 -0
  60. package/src/register/helper/poisciZivalskoVrsto.ts +100 -0
  61. package/src/register/helper/razcleniNaziv.ts +105 -0
  62. package/src/register/helper/testNormalizacije.ts +89 -0
  63. package/src/register/helper/testPodobnosti.ts +238 -0
  64. package/src/register/helper/testVakcin.ts +103 -0
  65. package/src/register/parseRegister.ts +464 -0
  66. package/src/register/podobnaZdravilaPoATC.ts +71 -0
  67. package/src/register/podobnaZdravilaPoUcinkovinah.ts +136 -0
  68. package/src/register/registerZdravil.ts +22 -0
  69. package/src/register/stats.ts +114 -0
  70. package/src/register/types/KarencaZdravila.ts +26 -0
  71. package/src/register/types/PotUporabeZdravila.ts +21 -0
  72. package/src/register/types/RazclembaZdravila.ts +10 -0
  73. package/src/register/types/RegisterRaw.ts +23 -0
  74. package/src/register/types/RegisterZdravil.ts +3 -0
  75. package/src/register/types/UcinkovinaZdravila.ts +21 -0
  76. package/src/register/types/Zdravilo.ts +84 -0
  77. package/src/register/types/ZdraviloZUtemeljitvijo.ts +11 -0
  78. package/src/register/types/ZivalskeVrste.ts +7 -0
  79. package/src/register/uganiZdravilo.ts +142 -0
  80. package/src/register/zdravilaZaAtcVetKodo.ts +28 -0
  81. package/src/register/zdraviloJeVakcinaZa.ts +202 -0
  82. package/src/test/testPodobnosti.test.ts +126 -0
  83. package/src/test/zdravila.json +38693 -0
  84. package/tsconfig.json +18 -0
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Identifikacija vakcin in njihovih ciljnih bolezni
3
+ *
4
+ * Na podlagi dokumentacije v docs/vakcine.md
5
+ */
6
+ import type { Zdravilo } from "./types/Zdravilo";
7
+ /**
8
+ * Preveri, ali je zdravilo vakcina (ATC koda se začne z QI)
9
+ */
10
+ export declare function jeVakcina(zdravilo: Zdravilo): boolean;
11
+ /**
12
+ * Vrne seznam bolezni, proti katerim ščiti zdravilo, če je vakcina.
13
+ * Če zdravilo ni vakcina, vrne undefined.
14
+ *
15
+ * @param zdravilo - Zdravilo iz registra
16
+ * @returns Seznam bolezni ali undefined, če zdravilo ni vakcina
17
+ */
18
+ export declare function zdraviloJeVakcinaZa(zdravilo: Zdravilo): string[] | undefined;
@@ -0,0 +1,195 @@
1
+ # Prepoznavanje vakcin v registru
2
+
3
+ Ta dokument opisuje, kako iz podatkov registra veterinarskih zdravil ugotoviti, katera zdravila so vakcine in proti katerim boleznim delujejo.
4
+
5
+ ## Identifikacija vakcin
6
+
7
+ ### ATC koda
8
+
9
+ Najpreprostejši način za identifikacijo vakcin je **ATC koda**. Vse vakcine imajo ATC kodo, ki se začne z **`QI`**.
10
+
11
+ ```typescript
12
+ const jeVakcina = zdravilo.atcKoda?.startsWith("QI");
13
+ ```
14
+
15
+ ### ATC kode po živalskih vrstah
16
+
17
+ | ATC predpona | Živalska vrsta |
18
+ |--------------|----------------|
19
+ | `QI01` | Ptice (perutnina) |
20
+ | `QI02` | Govedo |
21
+ | `QI04` | Ovce in koze |
22
+ | `QI05` | Prašiči |
23
+ | `QI06` | Konji |
24
+ | `QI07` | Psi |
25
+ | `QI08` | Mačke |
26
+ | `QI09` | Več vrst / kombinirane |
27
+ | `QI20` | Druge vakcine |
28
+
29
+ ## Razvrščanje po boleznih
30
+
31
+ ### 1. Steklina (Rabies)
32
+
33
+ **Iskalni kriteriji:**
34
+ - Ime zdravila vsebuje: `rabi`, `steklin`
35
+ - Učinkovina vsebuje: `virus stekline`
36
+ - ATC koda: `QI07AA02` (inaktivirane), `QI07BD` (peroralne za lisice)
37
+
38
+ ```typescript
39
+ const jeProtiSteklini = (z: Zdravilo) => {
40
+ const imeLower = z.ime.toLowerCase();
41
+ const ucinkovineLower = z.ucinkovine?.map(u => u.ucinkovina.toLowerCase()).join(" ") || "";
42
+ return (
43
+ imeLower.includes("rabies") ||
44
+ imeLower.includes("stekli") ||
45
+ ucinkovineLower.includes("rabies") ||
46
+ ucinkovineLower.includes("stekli") ||
47
+ z.atcKoda === "QI07AA02" ||
48
+ z.atcKoda === "QI07BD"
49
+ );
50
+ };
51
+ ```
52
+
53
+ **Primeri zdravil:**
54
+ - BIOCAN RABIES
55
+ - Nobivac Rabies
56
+ - RABISIN
57
+ - Eurican DAPPi-LR (kombinirana)
58
+
59
+ ### 2. Leptospiroza
60
+
61
+ **Iskalni kriteriji:**
62
+ - Ime zdravila vsebuje: `L4`, `Lepto`, `/L`
63
+ - Učinkovina vsebuje: `Leptospira`
64
+ - ATC koda: `QI07AB01` (samo leptospiroza), `QI07AI*` (kombinirane)
65
+
66
+ ```typescript
67
+ const jeProtiLeptospirozi = (z: Zdravilo) => {
68
+ const imeLower = z.ime.toLowerCase();
69
+ const ucinkovineLower = z.ucinkovine?.map(u => u.ucinkovina.toLowerCase()).join(" ") || "";
70
+ return (
71
+ imeLower.includes("lept") ||
72
+ imeLower.includes("/l4") ||
73
+ imeLower.includes("-l") ||
74
+ ucinkovineLower.includes("leptospir")
75
+ );
76
+ };
77
+ ```
78
+
79
+ **Primeri zdravil:**
80
+ - Nobivac Lepto
81
+ - Eurican Lmulti
82
+ - Biocan Novel DHPPi/L4
83
+ - CANIGEN L
84
+
85
+ ### 3. Kužne bolezni (nalezljive bolezni psov)
86
+
87
+ Kužne bolezni vključujejo:
88
+ - **Pasja kuga** (Distemper, CDV)
89
+ - **Parvoviroza** (Parvo, CPV)
90
+ - **Pasji hepatitis** (Adenovirus, CAV)
91
+ - **Parainfluenca** (Pi)
92
+
93
+ **Iskalni kriteriji:**
94
+ - Ime zdravila vsebuje: `DHPPi`, `DAPP`, `DAP`
95
+ - Učinkovina vsebuje: `pasje kuge`, `parvo`, `adenovirus`, `distemper`
96
+ - ATC koda: `QI07AD*` (žive), `QI07AI*` (kombinirane)
97
+
98
+ ```typescript
99
+ const jeProtiKuznimBoleznim = (z: Zdravilo) => {
100
+ const imeLower = z.ime.toLowerCase();
101
+ const ucinkovineLower = z.ucinkovine?.map(u => u.ucinkovina.toLowerCase()).join(" ") || "";
102
+ return (
103
+ imeLower.includes("dhpp") ||
104
+ imeLower.includes("dapp") ||
105
+ imeLower.match(/\bdap\b/) ||
106
+ ucinkovineLower.includes("pasje kuge") ||
107
+ ucinkovineLower.includes("parvo") ||
108
+ ucinkovineLower.includes("adenovirus") ||
109
+ ucinkovineLower.includes("distemper")
110
+ );
111
+ };
112
+ ```
113
+
114
+ **Kratice v imenih:**
115
+ - **D** = Distemper (pasja kuga)
116
+ - **H/A** = Hepatitis / Adenovirus
117
+ - **P** = Parvoviroza
118
+ - **Pi** = Parainfluenca
119
+
120
+ **Primeri zdravil:**
121
+ - Nobivac DHPPi
122
+ - Eurican DAPPi
123
+ - Biocan Novel DHPPi
124
+ - Canigen DHPPi
125
+
126
+ ### 4. Druge bolezni
127
+
128
+ #### Mačke
129
+ - **Panleukopenia, Calicivirus, Herpesvirus**: Ime vsebuje `RCP`, `Tricat`
130
+ - ATC koda: `QI06A*`
131
+
132
+ #### Perutnina
133
+ - **Atipična kokošja kuga (Newcastle)**: Učinkovina vsebuje `kokošje kuge`
134
+ - **Salmonela**: Učinkovina vsebuje `Salmonella`
135
+ - **Gumboro (IBD)**: Ime vsebuje `IBD`, `Gumboro`
136
+ - ATC koda: `QI01A*`
137
+
138
+ #### Govedo
139
+ - **IBR (Infekciozni bovini rinotraheitis)**: Ime vsebuje `IBR`
140
+ - **BVD (Bovine Viral Diarrhea)**: Ime vsebuje `BVD`
141
+ - ATC koda: `QI02A*`
142
+
143
+ ## Implementacija
144
+
145
+ ### Funkcija za razvrščanje vakcin
146
+
147
+ ```typescript
148
+ type VrstaVakcine = "steklina" | "leptospiroza" | "kužne bolezni" | "drugo";
149
+
150
+ /**
151
+ * Funkcija vrne seznam bolezni, proti katerim ščiti zdravilo, če je vakcina.
152
+ * Če zdravilo ni vakcina, vrne undefined.
153
+ */
154
+ function zdraviloJeVakcinaZa(zdravilo: Zdravilo): VrstaVakcine[] | undefined {
155
+ const vrste: VrstaVakcine[] = [];
156
+
157
+ if (jeProtiSteklini(zdravilo)) vrste.push("steklina");
158
+ if (jeProtiLeptospirozi(zdravilo)) vrste.push("leptospiroza");
159
+ if (jeProtiKuznimBoleznim(zdravilo)) vrste.push("nalezljive bolezni");
160
+
161
+ // če je vakcina za kaj drugega, vrni ime bolezni
162
+ // če ni vakcina, vrni undefined
163
+
164
+ return vrste;
165
+ }
166
+ ```
167
+
168
+ ### Kombinirane vakcine
169
+
170
+ Mnoge vakcine so **kombinirane** in ščitijo pred več boleznimi hkrati. Primer:
171
+
172
+ **Eurican DAPPi-LR**:
173
+ - Pasja kuga (D)
174
+ - Adenovirus/Hepatitis (A)
175
+ - Parvoviroza (P)
176
+ - Parainfluenca (Pi)
177
+ - Leptospiroza (L)
178
+ - Steklina (R = Rabies)
179
+
180
+ Takšna vakcina bo razvrščena v vse tri kategorije: `steklina`, `leptospiroza`, `kuzne_bolezni`.
181
+
182
+ ## Statistika registra
183
+
184
+ Na podlagi analize registra (november 2025):
185
+
186
+ | Kategorija | Število vakcin |
187
+ |------------|----------------|
188
+ | Skupaj vakcin | 130 |
189
+ | Proti steklini | 8 |
190
+ | Proti leptospirozi | 14 |
191
+ | Proti kužnim boleznim | 15 |
192
+ | Za perutnino | 53 |
193
+ | Za govedo | 15 |
194
+ | Za pse | 35 |
195
+ | Za mačke | 4 |
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "cry-vetzdravila",
3
+ "version": "1.0.0",
4
+ "license": "CC-BY-NC-ND-4.0",
5
+ "description": "",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "type": "module",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ }
14
+ },
15
+ "scripts": {
16
+ "import:all": "bun run src/importParseAndBuildAll.ts",
17
+ "generate": "bun run src/generate.ts",
18
+ "download:register": "bun run src/register/downloadRegister.ts",
19
+ "parse:register": "bun run src/register/parseRegister.ts",
20
+ "download:atcvet": "bun run src/atcvet/downloadLatestAtcvetPdf.ts",
21
+ "parse:atcvet": "bun run src/atcvet/parseAtcvetPdf.ts",
22
+ "stats": "bun run src/register/stats.ts",
23
+ "interactive": "bun run src/interactive.ts",
24
+ "test": "bun test",
25
+ "test:podobnost": "bun run src/register/helper/testPodobnosti.ts",
26
+ "test:normalizacija": "bun run src/register/helper/testNormalizacije.ts",
27
+ "build": "bun build src/index.ts --outdir dist --target node && tsc"
28
+ },
29
+ "dependencies": {
30
+ "cry-klikvet-logic": "^1.0.458",
31
+ "cry-pmz": "^1.1.8",
32
+ "pdfjs-dist": "^5.4.530",
33
+ "xlsx": "^0.18.5"
34
+ },
35
+ "devDependencies": {
36
+ "@types/bun": "latest",
37
+ "typescript": "^5.0.0"
38
+ }
39
+ }
@@ -0,0 +1,18 @@
1
+ # Podprojekt ATCVet
2
+
3
+ Ta podprojekt:
4
+ - prenese s strani https://www.jazmp.si/veterinarska-zdravila/podatki-o-zdravilih/atcvet-klasifikacija/ seznam vseh ATC kod za veterino
5
+ - prenešeni PDF dokument sparsa in kreira data/atcvet.json
6
+
7
+
8
+ ## Funkcija downloadLatestAtcvetPdf
9
+ 1. namen: naloži ATC seznam za veterino
10
+ 2. implementacija
11
+ 1. Na spletni strani https://www.jazmp.si/veterinarska-zdravila/podatki-o-zdravilih/atcvet-klasifikacija/ poišči vse html <> elemente, kateri href se začne s "https://www.jazmp.si/fileadmin/datoteke/dokumenti/SRZV/ATC_Vet_"
12
+ 1. primer: "https://www.jazmp.si/fileadmin/datoteke/dokumenti/SRZV/ATC_Vet_2025.pdf
13
+ 2. poišči tistega z najnovejšo letnico
14
+ 3. downloadaj pdf kot data/atcvet.pdf
15
+
16
+ ## Funkcija parseAtcvetPdf
17
+ 1. sparsa AtcVet pdf data/atcvet.pdf v in ga posname v data/atcvet.json
18
+ 2. pri tem upošteva tip AtcvetFile iz src/atcvet/types/AtcvetFile.ts
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Prenos najnovejšega ATCVet PDF dokumenta
3
+ *
4
+ * Prenese PDF s seznamom ATC kod za veterino s strani JAZMP.
5
+ */
6
+
7
+ const JAZMP_ATCVET_URL = "https://www.jazmp.si/veterinarska-zdravila/podatki-o-zdravilih/atcvet-klasifikacija/";
8
+ const ATCVET_PDF_PREFIX = "https://www.jazmp.si/fileadmin/datoteke/dokumenti/SRZV/ATC_Vet_";
9
+
10
+ /**
11
+ * Poišče vse povezave do ATCVet PDF-jev na strani JAZMP
12
+ */
13
+ async function findAtcvetPdfLinks(): Promise<string[]> {
14
+ const response = await fetch(JAZMP_ATCVET_URL);
15
+ if (!response.ok) {
16
+ throw new Error(`Napaka pri pridobivanju strani: ${response.status} ${response.statusText}`);
17
+ }
18
+
19
+ const html = await response.text();
20
+
21
+ // Poišči vse href-e, ki se začnejo z ATCVET_PDF_PREFIX
22
+ const hrefPattern = new RegExp(`href=["'](${ATCVET_PDF_PREFIX.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}[^"']+)["']`, "gi");
23
+ const links: string[] = [];
24
+ let match;
25
+
26
+ while ((match = hrefPattern.exec(html)) !== null) {
27
+ links.push(match[1]);
28
+ }
29
+
30
+ return [...new Set(links)]; // Unikatne vrednosti
31
+ }
32
+
33
+ /**
34
+ * Izlušči letnico iz URL-ja ATCVet PDF-ja
35
+ * Primer: "https://...ATC_Vet_2025.pdf" => 2025
36
+ */
37
+ function extractYear(url: string): number | null {
38
+ const match = url.match(/ATC_Vet_(\d{4})\.pdf/i);
39
+ return match ? parseInt(match[1]) : null;
40
+ }
41
+
42
+ /**
43
+ * Poišče URL najnovejšega ATCVet PDF-ja
44
+ */
45
+ async function findLatestAtcvetPdfUrl(): Promise<string | null> {
46
+ const links = await findAtcvetPdfLinks();
47
+
48
+ if (links.length === 0) {
49
+ return null;
50
+ }
51
+
52
+ // Razvrsti po letnici (padajoče)
53
+ const sortedLinks = links
54
+ .map((url) => ({ url, year: extractYear(url) }))
55
+ .filter((item) => item.year !== null)
56
+ .sort((a, b) => (b.year ?? 0) - (a.year ?? 0));
57
+
58
+ return sortedLinks.length > 0 ? sortedLinks[0].url : null;
59
+ }
60
+
61
+ /**
62
+ * Prenese najnovejši ATCVet PDF v mapo data
63
+ *
64
+ * @param outputDir - Ciljna mapa za shranjevanje (privzeto: "./data")
65
+ * @returns Pot do prenesenega PDF-ja ali null, če prenos ni uspel
66
+ */
67
+ export async function downloadLatestAtcvetPdf(outputDir: string = "./data"): Promise<string | null> {
68
+ console.log("Iščem najnovejši ATCVet PDF...");
69
+
70
+ const pdfUrl = await findLatestAtcvetPdfUrl();
71
+
72
+ if (!pdfUrl) {
73
+ console.error("Ni mogoče najti ATCVet PDF povezave.");
74
+ return null;
75
+ }
76
+
77
+ console.log(`Najden PDF: ${pdfUrl}`);
78
+
79
+ // Shrani vedno kot atcvet.pdf
80
+ const outputPath = `${outputDir}/atcvet.pdf`;
81
+
82
+ console.log(`Prenašam v: ${outputPath}`);
83
+
84
+ const response = await fetch(pdfUrl);
85
+ if (!response.ok) {
86
+ console.error(`Napaka pri prenosu PDF: ${response.status} ${response.statusText}`);
87
+ return null;
88
+ }
89
+
90
+ const arrayBuffer = await response.arrayBuffer();
91
+ await Bun.write(outputPath, arrayBuffer);
92
+
93
+ console.log(`PDF uspešno prenesen: ${outputPath} (${(arrayBuffer.byteLength / 1024).toFixed(1)} KB)`);
94
+
95
+ return outputPath;
96
+ }
97
+
98
+ // Če se izvaja direktno
99
+ if (import.meta.main) {
100
+ const outputPath = await downloadLatestAtcvetPdf();
101
+ if (outputPath) {
102
+ console.log(`\nKončano. Datoteka: ${outputPath}`);
103
+ } else {
104
+ console.error("\nPrenes ni uspel.");
105
+ process.exit(1);
106
+ }
107
+ }
@@ -0,0 +1,116 @@
1
+ import { AtcVet } from "../generated/AtcVet";
2
+
3
+ export interface RazlagaATCvetKode {
4
+ nivo: number;
5
+ /** opis nivoja iz pomenNivojevATCvet, na primer "terapevtska podskupina" */
6
+ pomenNivoja: string;
7
+ /** slovenski opis nivoja iz AtcvetRow, na primer "običajne kombinacije soli" */
8
+ opisNivoja: string;
9
+ }
10
+
11
+ /**
12
+ * Pomeni nivojev ATCvet klasifikacije
13
+ */
14
+ const pomenNivojevATCvet: Record<number, string> = {
15
+ 0: "veterinarska uporaba",
16
+ 1: "anatomska glavna skupina",
17
+ 2: "terapevtska podskupina",
18
+ 3: "farmakološka podskupina",
19
+ 4: "kemijska podskupina",
20
+ 5: "kemijska učinkovina",
21
+ };
22
+
23
+ /**
24
+ * Cache za hitrejši dostop do ATCvet kod
25
+ */
26
+ let atcvetCache: Map<string, { level: number; desc_si: string }> | null = null;
27
+
28
+ /**
29
+ * Pripravi cache ATCvet kod
30
+ */
31
+ function pripraviCache(): Map<string, { level: number; desc_si: string }> {
32
+ if (atcvetCache !== null) {
33
+ return atcvetCache;
34
+ }
35
+
36
+ atcvetCache = new Map();
37
+ for (const row of AtcVet) {
38
+ atcvetCache.set(row.code, { level: row.level, desc_si: row.desc_si });
39
+ }
40
+
41
+ return atcvetCache;
42
+ }
43
+
44
+ /**
45
+ * Izračunaj starševske kode za dano ATCvet kodo
46
+ * Primer: "QA01AA01" => ["Q", "QA", "QA01", "QA01A", "QA01AA", "QA01AA01"]
47
+ */
48
+ export function izracunajNivoje(koda: string): string[] {
49
+ const nivoji: string[] = [];
50
+
51
+ // Nivo 0: Q (veterinarska uporaba) - prvi znak
52
+ if (koda.length >= 1 && koda.startsWith("Q")) {
53
+ nivoji.push("Q");
54
+ }
55
+
56
+ // Nivo 1: QA (anatomska glavna skupina) - 2 znaka
57
+ if (koda.length >= 2) {
58
+ nivoji.push(koda.substring(0, 2));
59
+ }
60
+
61
+ // Nivo 2: QA01 (terapevtska podskupina) - 4 znaki
62
+ if (koda.length >= 4) {
63
+ nivoji.push(koda.substring(0, 4));
64
+ }
65
+
66
+ // Nivo 3: QA01A (farmakološka podskupina) - 5 znakov
67
+ if (koda.length >= 5) {
68
+ nivoji.push(koda.substring(0, 5));
69
+ }
70
+
71
+ // Nivo 4: QA01AA (kemijska podskupina) - 6 znakov
72
+ if (koda.length >= 6) {
73
+ nivoji.push(koda.substring(0, 6));
74
+ }
75
+
76
+ // Nivo 5: QA01AA01 (kemijska učinkovina) - polna koda
77
+ if (koda.length >= 8) {
78
+ nivoji.push(koda);
79
+ }
80
+
81
+ return nivoji;
82
+ }
83
+
84
+ /**
85
+ * Vrne opis ATCvet kode na njenem nivoju
86
+ * @param koda ATCvet koda (npr. "QA01AA01")
87
+ * @returns Razlaga kode z nivojem, pomenom nivoja in opisom
88
+ * @example
89
+ * ```typescript
90
+ * const rezultat = opisATCvetKode("QA01AA01");
91
+ * // Vrne: { nivo: 5, pomenNivoja: "kemijska učinkovina", opisNivoja: "..." }
92
+ * ```
93
+ */
94
+ export function opisATCvetKode(koda: string): RazlagaATCvetKode | null {
95
+ const cache = pripraviCache();
96
+ const podatki = cache.get(koda);
97
+
98
+ if (podatki) {
99
+ return {
100
+ nivo: podatki.level,
101
+ pomenNivoja: pomenNivojevATCvet[podatki.level] || `nivo ${podatki.level}`,
102
+ opisNivoja: podatki.desc_si,
103
+ };
104
+ }
105
+
106
+ // Posebni primer za Q (veterinarska uporaba)
107
+ if (koda === "Q") {
108
+ return {
109
+ nivo: 0,
110
+ pomenNivoja: pomenNivojevATCvet[0],
111
+ opisNivoja: "Veterinarska zdravila",
112
+ };
113
+ }
114
+
115
+ return null;
116
+ }