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,202 @@
1
+ /**
2
+ * Identifikacija vakcin in njihovih ciljnih bolezni
3
+ *
4
+ * Na podlagi dokumentacije v docs/vakcine.md
5
+ */
6
+
7
+ import type { Zdravilo } from "./types/Zdravilo";
8
+
9
+ /**
10
+ * Preveri, ali je zdravilo vakcina (ATC koda se začne z QI)
11
+ */
12
+ export function jeVakcina(zdravilo: Zdravilo): boolean {
13
+ return zdravilo.atcKoda?.startsWith("QI") ?? false;
14
+ }
15
+
16
+ /**
17
+ * Preveri, ali je zdravilo vakcina proti steklini (rabies)
18
+ */
19
+ function jeProtiSteklini(zdravilo: Zdravilo): boolean {
20
+ const imeLower = zdravilo.ime.toLowerCase();
21
+ const ucinkovineLower =
22
+ zdravilo.ucinkovine?.map((u) => u.ucinkovina.toLowerCase()).join(" ") || "";
23
+
24
+ return (
25
+ imeLower.includes("rabies") ||
26
+ imeLower.includes("stekli") ||
27
+ ucinkovineLower.includes("rabies") ||
28
+ ucinkovineLower.includes("stekli") ||
29
+ zdravilo.atcKoda === "QI07AA02" ||
30
+ zdravilo.atcKoda?.startsWith("QI07BD") === true
31
+ );
32
+ }
33
+
34
+ /**
35
+ * Preveri, ali je zdravilo vakcina proti leptospirozi
36
+ */
37
+ function jeProtiLeptospirozi(zdravilo: Zdravilo): boolean {
38
+ const imeLower = zdravilo.ime.toLowerCase();
39
+ const ucinkovineLower =
40
+ zdravilo.ucinkovine?.map((u) => u.ucinkovina.toLowerCase()).join(" ") || "";
41
+
42
+ return (
43
+ imeLower.includes("lept") ||
44
+ imeLower.includes("/l4") ||
45
+ imeLower.includes("-l") ||
46
+ ucinkovineLower.includes("leptospir")
47
+ );
48
+ }
49
+
50
+ /**
51
+ * Preveri, ali je zdravilo vakcina proti kužnim boleznim psov
52
+ * (pasja kuga, parvoviroza, pasji hepatitis, parainfluenca)
53
+ */
54
+ function jeProtiKuznimBoleznim(zdravilo: Zdravilo): boolean {
55
+ const imeLower = zdravilo.ime.toLowerCase();
56
+ const ucinkovineLower =
57
+ zdravilo.ucinkovine?.map((u) => u.ucinkovina.toLowerCase()).join(" ") || "";
58
+
59
+ return (
60
+ imeLower.includes("dhpp") ||
61
+ imeLower.includes("dapp") ||
62
+ /\bdap\b/.test(imeLower) ||
63
+ ucinkovineLower.includes("pasje kuge") ||
64
+ ucinkovineLower.includes("parvo") ||
65
+ ucinkovineLower.includes("adenovirus") ||
66
+ ucinkovineLower.includes("distemper")
67
+ );
68
+ }
69
+
70
+ /**
71
+ * Vzorci za prepoznavanje bolezni iz učinkovin ali imena zdravila
72
+ */
73
+ const BOLEZNI_VZORCI: { bolezen: string; vzorci: RegExp[] }[] = [
74
+ // Salmonela
75
+ { bolezen: "salmoneloza", vzorci: [/salmonell?a/i, /salenvac/i] },
76
+ // Atipična kokošja kuga (Newcastle disease)
77
+ { bolezen: "atipična kokošja kuga", vzorci: [/kokošje kuge/i, /newcastle/i, /\bnd\b/i] },
78
+ // Gumboro (IBD)
79
+ { bolezen: "gumboro", vzorci: [/gumboro/i, /\bibd\b/i, /bursa/i] },
80
+ // Infekciozni bronhitis (IB)
81
+ { bolezen: "infekciozni bronhitis", vzorci: [/\bib\b/i, /bronhitis/i] },
82
+ // Marekova bolezen
83
+ { bolezen: "marekova bolezen", vzorci: [/marek/i, /\bhvt\b/i, /rispens/i] },
84
+ // Kokcidia
85
+ { bolezen: "kokcidioza", vzorci: [/coccid/i, /kokcid/i, /paracox/i, /livacox/i] },
86
+ // E. coli
87
+ { bolezen: "escherichia coli", vzorci: [/e\.?\s*coli/i, /escherichia/i] },
88
+ // Clostridium
89
+ { bolezen: "klostridijske okužbe", vzorci: [/clostrid/i, /covexin/i] },
90
+ // IBR (Infekciozni bovini rinotraheitis)
91
+ { bolezen: "IBR", vzorci: [/\bibr\b/i, /rinotraheit/i] },
92
+ // BVD (Bovine Viral Diarrhea)
93
+ { bolezen: "BVD", vzorci: [/\bbvd\b/i, /bovine viral diarr/i] },
94
+ // BRSV (Bovini respiratorni sincicijski virus)
95
+ { bolezen: "BRSV", vzorci: [/\bbrsv\b/i, /sincicijski/i] },
96
+ // Parainfluenca goveda
97
+ { bolezen: "parainfluenca Pi3", vzorci: [/\bpi3\b/i, /parainfluenc/i] },
98
+ // PRRS (Prašičji reproduktivni in respiratorni sindrom)
99
+ { bolezen: "PRRS", vzorci: [/\bprrs\b/i] },
100
+ // Mikoplazma
101
+ { bolezen: "mikoplazmoza", vzorci: [/myco/i, /m\+pac/i, /mh-one/i, /hyogen/i] },
102
+ // Lawsonia
103
+ { bolezen: "lawsonija", vzorci: [/lawson/i, /ileitis/i] },
104
+ // Erizipel
105
+ { bolezen: "erizipel", vzorci: [/ery/i, /erysipel/i] },
106
+ // Borelia
107
+ { bolezen: "borelija", vzorci: [/borrel/i, /lyme/i] },
108
+ // Bordetela
109
+ { bolezen: "pasji kašelj", vzorci: [/bordetell?a/i, /\bbb\b/i, /kennel cough/i] },
110
+ // Mačji herpes, kalici, panleukopenia
111
+ { bolezen: "mačje virusne okužbe", vzorci: [/tricat/i, /\brcp\b/i, /cvr\b/i, /panleukopen/i, /calici/i, /herpes/i] },
112
+ // Rotavirus
113
+ { bolezen: "rotaviroza", vzorci: [/rotav/i, /rotavec/i] },
114
+ // Koronavirus
115
+ { bolezen: "koronaviroza", vzorci: [/corona/i] },
116
+ // Trichophyton (dermatofitoza)
117
+ { bolezen: "dermatofitoza", vzorci: [/trichophyt/i] },
118
+ // Pljučnica aktinobaciloza
119
+ { bolezen: "aktinobaciloza", vzorci: [/\bapp\b/i, /actinobacill/i, /coglapix/i] },
120
+ // Bluetongue
121
+ { bolezen: "bolezen modrikastega jezika", vzorci: [/bluetongue/i, /\bbtv\b/i, /bluevac/i] },
122
+ // Kunčja hemoragična bolezen
123
+ { bolezen: "kunčja hemoragična bolezen", vzorci: [/\brhdv\b/i, /hemoragičn/i] },
124
+ // Reoviroza
125
+ { bolezen: "reoviroza", vzorci: [/reovir/i, /\breo\b/i] },
126
+ // EDS (Egg Drop Syndrome)
127
+ { bolezen: "EDS", vzorci: [/\beds\b/i, /egg drop/i] },
128
+ // ART (Avian rhinotracheitis)
129
+ { bolezen: "ptičji rinotraheitis", vzorci: [/\bart\b/i, /rhinotrache/i] },
130
+ // Metapneumovirus
131
+ { bolezen: "metapneumoviroza", vzorci: [/metapneumo/i, /\bmmat\b/i] },
132
+ // Anemija piščancev
133
+ { bolezen: "kokošja anemija", vzorci: [/anemij/i, /thymovac/i] },
134
+ // Encefalomielitis
135
+ { bolezen: "encefalomielitis", vzorci: [/encefalomielit/i] },
136
+ ];
137
+
138
+ /**
139
+ * Poišči bolezni iz učinkovin in imena zdravila
140
+ */
141
+ function poiscibolezni(zdravilo: Zdravilo): string[] {
142
+ const imeLower = zdravilo.ime.toLowerCase();
143
+ const ucinkovineLower =
144
+ zdravilo.ucinkovine?.map((u) => u.ucinkovina.toLowerCase()).join(" ") || "";
145
+ const iskalniBesedilo = imeLower + " " + ucinkovineLower;
146
+
147
+ const najdene: string[] = [];
148
+
149
+ for (const { bolezen, vzorci } of BOLEZNI_VZORCI) {
150
+ for (const vzorec of vzorci) {
151
+ if (vzorec.test(iskalniBesedilo)) {
152
+ if (!najdene.includes(bolezen)) {
153
+ najdene.push(bolezen);
154
+ }
155
+ break;
156
+ }
157
+ }
158
+ }
159
+
160
+ return najdene;
161
+ }
162
+
163
+ /**
164
+ * Vrne seznam bolezni, proti katerim ščiti zdravilo, če je vakcina.
165
+ * Če zdravilo ni vakcina, vrne undefined.
166
+ *
167
+ * @param zdravilo - Zdravilo iz registra
168
+ * @returns Seznam bolezni ali undefined, če zdravilo ni vakcina
169
+ */
170
+ export function zdraviloJeVakcinaZa(zdravilo: Zdravilo): string[] | undefined {
171
+ // Če zdravilo ni vakcina, vrni undefined
172
+ if (!jeVakcina(zdravilo)) {
173
+ return undefined;
174
+ }
175
+
176
+ const bolezni: string[] = [];
177
+
178
+ if (jeProtiSteklini(zdravilo)) {
179
+ bolezni.push("steklina");
180
+ }
181
+ if (jeProtiLeptospirozi(zdravilo)) {
182
+ bolezni.push("leptospiroza");
183
+ }
184
+ if (jeProtiKuznimBoleznim(zdravilo)) {
185
+ bolezni.push("kužne bolezni psov");
186
+ }
187
+
188
+ // Poišči dodatne bolezni iz učinkovin
189
+ const dodatneBolezni = poiscibolezni(zdravilo);
190
+ for (const bolezen of dodatneBolezni) {
191
+ if (!bolezni.includes(bolezen)) {
192
+ bolezni.push(bolezen);
193
+ }
194
+ }
195
+
196
+ // Če ni nobene bolezni, vrni "neznana bolezen"
197
+ if (bolezni.length === 0) {
198
+ bolezni.push("neznana bolezen");
199
+ }
200
+
201
+ return bolezni;
202
+ }
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Test podobnosti - preverja, ali oceniPodobnost pravilno prepozna zdravila
3
+ *
4
+ * Za vsako zdravilo iz registra preveri, ali se pri iskanju samega sebe
5
+ * zdravilo pojavi na prvem mestu (ali med enako ocenjenimi z enakim normaliziranim nazivom).
6
+ */
7
+
8
+ import { describe, test, expect } from "bun:test";
9
+ import { seznamZdravil } from "../generated/seznamZdravil";
10
+ import { razcleniNaziv } from "../register/helper/razcleniNaziv";
11
+ import { oceniPodobnost } from "../register/helper/oceniPodobnost";
12
+ import type { RazclenjeniNaziv } from "../register/helper/normalizirajNaziv";
13
+
14
+ interface RazclembaZdravila {
15
+ ime: string;
16
+ razclemba: RazclenjeniNaziv;
17
+ }
18
+
19
+ // Predpripravi razčlembe vseh zdravil iz registra
20
+ function pripraviRazclembeRegistra(): RazclembaZdravila[] {
21
+ return seznamZdravil.map((zdravilo) => ({
22
+ ime: zdravilo.ime,
23
+ razclemba: razcleniNaziv(zdravilo.ime),
24
+ }));
25
+ }
26
+
27
+ interface RezultatIskanja {
28
+ ime: string;
29
+ ocena: number;
30
+ }
31
+
32
+ // Poišči najboljša ujemanja za dano razčlembo
33
+ function poisciNajboljsa(
34
+ razclembaVhoda: RazclenjeniNaziv,
35
+ razclembeRegistra: RazclembaZdravila[]
36
+ ): RezultatIskanja[] {
37
+ const rezultati: RezultatIskanja[] = [];
38
+
39
+ for (const { ime, razclemba } of razclembeRegistra) {
40
+ const utemeljitev = oceniPodobnost(razclembaVhoda, razclemba);
41
+ rezultati.push({ ime, ocena: utemeljitev.ocena });
42
+ }
43
+
44
+ // Sortiraj po oceni padajoče
45
+ rezultati.sort((a, b) => b.ocena - a.ocena);
46
+
47
+ return rezultati;
48
+ }
49
+
50
+ describe("testPodobnosti - vsa zdravila registra", () => {
51
+ const razclembeRegistra = pripraviRazclembeRegistra();
52
+
53
+ test("vsako zdravilo mora biti najdeno na prvem mestu ali med enakimi", () => {
54
+ let uspesno = 0;
55
+ let neuspesno = 0;
56
+ const napake: string[] = [];
57
+
58
+ for (const { ime, razclemba } of razclembeRegistra) {
59
+ // Poišči najboljša ujemanja
60
+ const rezultati = poisciNajboljsa(razclemba, razclembeRegistra);
61
+
62
+ if (rezultati.length === 0) {
63
+ neuspesno++;
64
+ napake.push(`[NI ZADETKA] ${ime}`);
65
+ continue;
66
+ }
67
+
68
+ const najvisjaOcena = rezultati[0].ocena;
69
+
70
+ // Poišči vse z najvišjo oceno
71
+ const najboljsi = rezultati.filter((r) => r.ocena === najvisjaOcena);
72
+
73
+ // Preveri, ali je pravi med najboljšimi
74
+ const praviIndex = najboljsi.findIndex((r) => r.ime === ime);
75
+
76
+ if (najboljsi.length === 1) {
77
+ // Natanko en zadetek
78
+ if (najboljsi[0].ime === ime) {
79
+ uspesno++;
80
+ } else {
81
+ neuspesno++;
82
+ napake.push(`[NAPAČEN ZADETEK] ${ime} -> ${najboljsi[0].ime}`);
83
+ }
84
+ } else if (praviIndex >= 0) {
85
+ // Več zadetkov, pravi je med njimi
86
+ // Preveri, ali imajo vsi zadetki pred pravim enak normaliziran naziv (podvojeno zdravilo)
87
+ const normaliziranNaziv = razclemba.normaliziran_naziv;
88
+ const vsiEnaki = najboljsi.slice(0, praviIndex + 1).every((r) => {
89
+ const rRazclemba = razclembeRegistra.find((reg) => reg.ime === r.ime)!.razclemba;
90
+ return rRazclemba.normaliziran_naziv === normaliziranNaziv;
91
+ });
92
+
93
+ if (vsiEnaki || praviIndex === 0) {
94
+ // Podvojeno zdravilo ali prvi je pravi - štejemo kot uspeh
95
+ uspesno++;
96
+ } else {
97
+ neuspesno++;
98
+ napake.push(`[VEČ ZADETKOV, PRAVI NI PRVI] ${ime}`);
99
+ }
100
+ } else {
101
+ // Pravi ni med zadetki z najvišjo oceno
102
+ neuspesno++;
103
+ napake.push(`[NI MED NAJBOLJŠIMI] ${ime} (najboljši: ${najboljsi.slice(0, 3).map((r) => r.ime).join(", ")})`);
104
+ }
105
+ }
106
+
107
+ // Izpis napak za lažje odpravljanje
108
+ if (napake.length > 0) {
109
+ console.log("\nNapake:");
110
+ for (const napaka of napake.slice(0, 10)) {
111
+ console.log(` ${napaka}`);
112
+ }
113
+ if (napake.length > 10) {
114
+ console.log(` ... in še ${napake.length - 10} napak`);
115
+ }
116
+ }
117
+
118
+ const skupaj = uspesno + neuspesno;
119
+ const uspesnost = (uspesno / skupaj) * 100;
120
+ console.log(`\nUspešnost: ${uspesno}/${skupaj} (${uspesnost.toFixed(1)}%)`);
121
+
122
+ // Test mora imeti 100% uspešnost
123
+ expect(neuspesno).toBe(0);
124
+ expect(uspesnost).toBe(100);
125
+ });
126
+ });