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.
- package/.claude/settings.local.json +17 -0
- package/CLAUDE.md +82 -0
- package/LICENSE.md +16 -0
- package/README.md +376 -0
- package/a.txt +1643 -0
- package/bun.lock +197 -0
- package/dist/atcvet/opisATCvetKode.d.ts +23 -0
- package/dist/atcvet/podatkiATCvetKode.d.ts +20 -0
- package/dist/atcvet/pomeniNivojevATCvet.d.ts +1 -0
- package/dist/atcvet/types/AtcvetFile.d.ts +19 -0
- package/dist/generated/AtcVet.d.ts +9 -0
- package/dist/generated/RegisterZdravil.d.ts +8 -0
- package/dist/generated/seznamZdravil.d.ts +8 -0
- package/dist/index.d.ts +244 -0
- package/dist/index.js +141786 -0
- package/dist/register/MIN_OCENA_PODOBNOSTI.d.ts +2 -0
- package/dist/register/helper/normalizirajNaziv.d.ts +176 -0
- package/dist/register/helper/oblikujRezultatIskanja.d.ts +8 -0
- package/dist/register/helper/oceniPodobnost.d.ts +37 -0
- package/dist/register/helper/poisciZivalskoVrsto.d.ts +33 -0
- package/dist/register/helper/razcleniNaziv.d.ts +2 -0
- package/dist/register/podobnaZdravilaPoATC.d.ts +16 -0
- package/dist/register/podobnaZdravilaPoUcinkovinah.d.ts +18 -0
- package/dist/register/registerZdravil.d.ts +9 -0
- package/dist/register/types/KarencaZdravila.d.ts +24 -0
- package/dist/register/types/PotUporabeZdravila.d.ts +21 -0
- package/dist/register/types/RazclembaZdravila.d.ts +9 -0
- package/dist/register/types/RegisterZdravil.d.ts +2 -0
- package/dist/register/types/UcinkovinaZdravila.d.ts +20 -0
- package/dist/register/types/Zdravilo.d.ts +65 -0
- package/dist/register/types/ZdraviloZUtemeljitvijo.d.ts +9 -0
- package/dist/register/types/ZivalskeVrste.d.ts +158 -0
- package/dist/register/uganiZdravilo.d.ts +43 -0
- package/dist/register/zdravilaZaAtcVetKodo.d.ts +8 -0
- package/dist/register/zdraviloJeVakcinaZa.d.ts +18 -0
- package/docs/vakcine.md +195 -0
- package/package.json +39 -0
- package/src/atcvet/CLAUDE.md +18 -0
- package/src/atcvet/downloadLatestAtcvetPdf.ts +107 -0
- package/src/atcvet/opisATCvetKode.ts +116 -0
- package/src/atcvet/parseAtcvetPdf.ts +215 -0
- package/src/atcvet/podatkiATCvetKode.ts +34 -0
- package/src/atcvet/pomeniNivojevATCvet.ts +8 -0
- package/src/atcvet/types/AtcvetFile.ts +22 -0
- package/src/generate.ts +111 -0
- package/src/generated/AtcVet.ts +56704 -0
- package/src/generated/seznamZdravil.ts +44833 -0
- package/src/importParseAndBuildAll.ts +97 -0
- package/src/index.ts +289 -0
- package/src/interactive.ts +428 -0
- package/src/register/CLAUDE.md +230 -0
- package/src/register/MIN_OCENA_PODOBNOSTI.ts +3 -0
- package/src/register/downloadRegister.ts +148 -0
- package/src/register/helper/analizaVakcin.ts +90 -0
- package/src/register/helper/checkVrste.ts +72 -0
- package/src/register/helper/hashString.ts +27 -0
- package/src/register/helper/normalizirajNaziv.ts +493 -0
- package/src/register/helper/oblikujRezultatIskanja.ts +15 -0
- package/src/register/helper/oceniPodobnost.ts +194 -0
- package/src/register/helper/poisciZivalskoVrsto.ts +100 -0
- package/src/register/helper/razcleniNaziv.ts +105 -0
- package/src/register/helper/testNormalizacije.ts +89 -0
- package/src/register/helper/testPodobnosti.ts +238 -0
- package/src/register/helper/testVakcin.ts +103 -0
- package/src/register/parseRegister.ts +464 -0
- package/src/register/podobnaZdravilaPoATC.ts +71 -0
- package/src/register/podobnaZdravilaPoUcinkovinah.ts +136 -0
- package/src/register/registerZdravil.ts +22 -0
- package/src/register/stats.ts +114 -0
- package/src/register/types/KarencaZdravila.ts +26 -0
- package/src/register/types/PotUporabeZdravila.ts +21 -0
- package/src/register/types/RazclembaZdravila.ts +10 -0
- package/src/register/types/RegisterRaw.ts +23 -0
- package/src/register/types/RegisterZdravil.ts +3 -0
- package/src/register/types/UcinkovinaZdravila.ts +21 -0
- package/src/register/types/Zdravilo.ts +84 -0
- package/src/register/types/ZdraviloZUtemeljitvijo.ts +11 -0
- package/src/register/types/ZivalskeVrste.ts +7 -0
- package/src/register/uganiZdravilo.ts +142 -0
- package/src/register/zdravilaZaAtcVetKodo.ts +28 -0
- package/src/register/zdraviloJeVakcinaZa.ts +202 -0
- package/src/test/testPodobnosti.test.ts +126 -0
- package/src/test/zdravila.json +38693 -0
- 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;
|
package/docs/vakcine.md
ADDED
|
@@ -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
|
+
}
|