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,114 @@
1
+ /**
2
+ * Statistika učinkovitosti uganiZdravilo
3
+ *
4
+ * Izvede teste na zdravilih iz zdravila.json in izpiše statistiko po številu najdenih zadetkov.
5
+ */
6
+
7
+ import testData from "../test/zdravila.json";
8
+ import { uganiZdraviloInUtemelji } from "./uganiZdravilo";
9
+
10
+ interface ZdraviloTest {
11
+ naziv: string;
12
+ skupine: string[];
13
+ }
14
+
15
+ interface TestResult {
16
+ naziv: string;
17
+ resultCount: number;
18
+ topMatches: { ime: string; ocena: number }[];
19
+ }
20
+
21
+ function runTest(zdravilo: ZdraviloTest): TestResult {
22
+ const results = uganiZdraviloInUtemelji(zdravilo.naziv, { limit: 5 });
23
+
24
+ return {
25
+ naziv: zdravilo.naziv,
26
+ resultCount: results.length,
27
+ topMatches: results.slice(0, 3).map((r) => ({
28
+ ime: r.zdravilo.ime,
29
+ ocena: r.utemeljitev.ocena,
30
+ })),
31
+ };
32
+ }
33
+
34
+ async function main() {
35
+ console.log("═══════════════════════════════════════════════════════════════");
36
+ console.log(" STATISTIKA UČINKOVITOSTI uganiZdravilo");
37
+ console.log("═══════════════════════════════════════════════════════════════\n");
38
+
39
+ const zdravila = testData as ZdraviloTest[];
40
+ const results: TestResult[] = [];
41
+
42
+ console.log(`Testiram ${zdravila.length} zdravil iz zdravila.json...\n`);
43
+
44
+ for (const zdravilo of zdravila) {
45
+ const result = runTest(zdravilo);
46
+ results.push(result);
47
+ }
48
+
49
+ // Razvrsti rezultate po številu zadetkov
50
+ const poSteviluZadetkov: Record<number, TestResult[]> = {};
51
+
52
+ for (const result of results) {
53
+ const count = result.resultCount;
54
+ if (!poSteviluZadetkov[count]) {
55
+ poSteviluZadetkov[count] = [];
56
+ }
57
+ poSteviluZadetkov[count].push(result);
58
+ }
59
+
60
+ // Izpis statistike
61
+ console.log("═══════════════════════════════════════════════════════════════");
62
+ console.log(" STATISTIKA PO ŠTEVILU ZADETKOV");
63
+ console.log("═══════════════════════════════════════════════════════════════\n");
64
+
65
+ const skupaj = results.length;
66
+ const stevilke = Object.keys(poSteviluZadetkov)
67
+ .map(Number)
68
+ .sort((a, b) => a - b);
69
+
70
+ for (const stevilo of stevilke) {
71
+ const seznam = poSteviluZadetkov[stevilo];
72
+ const procent = ((seznam.length / skupaj) * 100).toFixed(1);
73
+ console.log(` ${stevilo} zadetkov: ${seznam.length} (${procent}%)`);
74
+ }
75
+
76
+ console.log(`\n SKUPAJ: ${skupaj} zdravil`);
77
+
78
+ // Izpis zdravil brez zadetka
79
+ const brezZadetka = poSteviluZadetkov[0] || [];
80
+ if (brezZadetka.length > 0) {
81
+ console.log("\n───────────────────────────────────────────────────────────────");
82
+ console.log("ZDRAVILA BREZ ZADETKA:");
83
+ console.log("───────────────────────────────────────────────────────────────\n");
84
+
85
+ for (const z of brezZadetka) {
86
+ console.log(` • ${z.naziv}`);
87
+ }
88
+ }
89
+
90
+ // Izpis vzorca zdravil z zadetki
91
+ const zZadetki = results.filter((r) => r.resultCount > 0).slice(0, 10);
92
+ if (zZadetki.length > 0) {
93
+ console.log("\n───────────────────────────────────────────────────────────────");
94
+ console.log("VZOREC ZDRAVIL Z ZADETKI (prvih 10):");
95
+ console.log("───────────────────────────────────────────────────────────────\n");
96
+
97
+ for (const z of zZadetki) {
98
+ console.log(` • ${z.naziv}`);
99
+ for (let i = 0; i < z.topMatches.length; i++) {
100
+ const match = z.topMatches[i];
101
+ console.log(` ${i + 1}. ${match.ime} (ocena: ${match.ocena})`);
102
+ }
103
+ }
104
+ }
105
+
106
+ console.log("\n═══════════════════════════════════════════════════════════════\n");
107
+ }
108
+
109
+ if (import.meta.main) {
110
+ main().catch((e) => {
111
+ console.error("Napaka:", e);
112
+ process.exit(1);
113
+ });
114
+ }
@@ -0,0 +1,26 @@
1
+ import { ZivalskeVrste } from "./ZivalskeVrste"
2
+
3
+ import { MozneKarenceZa, PotiAplikacijeZdravila } from "cry-klikvet-logic";
4
+ /**
5
+ * Karance po živalskih vrsta in morebiti po poteh aplikacije
6
+ *
7
+ * primer 1:
8
+ * {
9
+ * 'prašiči': { meso: 20, 'not. organi': 20 },
10
+ * konji: { meso: 10, 'not. organi': 10 },
11
+ * govedo: {
12
+ * meso: 31,
13
+ * 'not. organi': 31,
14
+ * mleko: 2,
15
+ * pot: { IV: { meso: 10, 'not. organi': 10, mleko: 1 } }
16
+ * }
17
+ * }
18
+ */
19
+
20
+ type KarencaVrste = {
21
+ vrsta: keyof typeof ZivalskeVrste;
22
+ pot?: keyof typeof PotiAplikacijeZdravila;
23
+ karence: Partial<Record<MozneKarenceZa, number>>;
24
+ };
25
+
26
+ export type KarencaZdravila = KarencaVrste;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Pot uporabe zdravila
3
+ * Na primer, za podatek v stolpcu xslx "-1081\Subkutana uporaba"
4
+ * const potUpora : PotUporabeZdravila = {
5
+ * sifra: 1081,
6
+ * opis: "Subkutana uporaba",
7
+ * koda: "SC"
8
+ * }
9
+ */
10
+ export interface PotUporabeZdravila {
11
+ /** numerična šifra poti uprabe
12
+ * primer: 1081
13
+ */
14
+ sifra: number
15
+ /**
16
+ * opis uporabe
17
+ * primer: Subkutana uporaba
18
+ */
19
+ opis: string
20
+ koda: string[]
21
+ }
@@ -0,0 +1,10 @@
1
+ import type { RazclenjeniNaziv } from "../helper/normalizirajNaziv";
2
+ import type { Zdravilo } from "./Zdravilo";
3
+
4
+ /**
5
+ * Predpripravljena razčlemba zdravila
6
+ */
7
+ export interface RazclembaZdravila {
8
+ zdravilo: Zdravilo;
9
+ razclemba: RazclenjeniNaziv;
10
+ }
@@ -0,0 +1,23 @@
1
+ import { Zdravilo } from "./Zdravilo";
2
+
3
+ /**
4
+ * Register veterinarskih zdravil
5
+ *
6
+ * Vsebuje seznam vseh zdravil in metapodatke o registru.
7
+ */
8
+ export interface RegisterRaw {
9
+ /** Datum datoteke iz katere je bil register ustvarjen */
10
+ datumDatoteke: Date;
11
+
12
+ /** Datum in čas parsanja */
13
+ datumParsanja: Date;
14
+
15
+ /** Pot do izvorne xlsx datoteke */
16
+ izvornaDateteka: string;
17
+
18
+ /** Seznam vseh zdravil v registru */
19
+ zdravila: Zdravilo[];
20
+
21
+ /** Število zdravil v registru */
22
+ steviloZdravil: number;
23
+ }
@@ -0,0 +1,3 @@
1
+ import { Zdravilo } from "./Zdravilo";
2
+
3
+ export type RegisterZdravil = Map<number, Zdravilo>;
@@ -0,0 +1,21 @@
1
+
2
+ /**
3
+ * Opisuje učinkovino zdravila in njeno količino v pakiranju.
4
+ * Primer: za stolpca v xslx
5
+ * - " -1\prokainijev benzilpenicilinat monohidrat -2\dihidrostreptomicinijev sulfat -3\vitamin A palmitat -4\kalcijev pantotenat"
6
+ * - " -1\ 1000000,0 IU -2\ 1000000,0 IU -3\ 10000,0 IU -4\ 100,0 mg"
7
+ * so ucinkovine
8
+ * const ucinkovine : UcinkovinaZdravila[] = [
9
+ * { ucinkovina: "prokainijev benzilpenicilinat monohidrat", kolicina: 1000000.0, enota: "IU" },
10
+ * { ucinkovina: "dihidrostreptomicinijev sulfat", kolicina: 1000000.0, enota: "IU" },
11
+ * { ucinkovina: "dihidrostreptomicinijev sulfat", kolicina: 1000000.0, enota: "IU" },
12
+ * { ucinkovina: "vitamin A palmitat", kolicina: 10000.0, enota: "IU" },
13
+ * { ucinkovina: "kalcijev pantotenat", kolicina: 100.0, enota: "mg" },
14
+ * ]
15
+ */
16
+ export interface UcinkovinaZdravila {
17
+ ucinkovina: string
18
+ kolicina?: number
19
+ enota: string
20
+ dodatneInformacije?: string
21
+ }
@@ -0,0 +1,84 @@
1
+ import { UcinkovinaZdravila } from "./UcinkovinaZdravila";
2
+ import { PotUporabeZdravila } from "./PotUporabeZdravila";
3
+ import { KarencaZdravila } from "./KarencaZdravila";
4
+
5
+ /**
6
+ * Podatki o veterinarskem zdravilu iz registra JAZMP
7
+ */
8
+ export interface Zdravilo {
9
+
10
+ /** id zdravila, izračunan kot hash */
11
+ id: number
12
+
13
+ /** Ime zdravila */
14
+ ime: string;
15
+
16
+ /** Imetnik dovoljenja za promet z zdravilom */
17
+ imetnikDovoljenja: string;
18
+
19
+ /** Podatki o sproščanju zdravila */
20
+ sproscanjeZdravila: string;
21
+
22
+ /** Številka dovoljenja za promet */
23
+ stevilkaDovoljenja: string;
24
+
25
+ /** Datum veljavnosti dovoljenja */
26
+ datumVeljavnosti: string | null;
27
+
28
+ /** Režim izdaje (npr. Rp - na recept) */
29
+ rezimIzdaje: string;
30
+
31
+ /** ATC koda zdravila */
32
+ atcKoda: string;
33
+
34
+ /** Poti uporabe zdravila */
35
+ potiUporabe: PotUporabeZdravila[];
36
+
37
+ /** Farmacevtska oblika zdravila */
38
+ farmacevtskaOblika: string;
39
+
40
+ /** Opis pakiranj */
41
+ pakiranja: string;
42
+
43
+ /** Enota količine za sestavo */
44
+ enotaKolicine: string;
45
+
46
+ /** Seznam učinkovin in njihovih količin */
47
+ ucinkovine: UcinkovinaZdravila[];
48
+
49
+ /** Pomožne snovi v zdravilu */
50
+ pomocneSnovi: string[];
51
+
52
+ /** Ciljne živalske vrste */
53
+ ciljneVrste: string[];
54
+
55
+ /** Karenca zdravila po vrstah */
56
+ karence: KarencaZdravila[];
57
+
58
+ /** Če je zdravilo vakcina, proti čemu varuje */
59
+ vakcinaZa?: string[]
60
+ }
61
+
62
+ /**
63
+ * Stolpci v xlsx datoteki JAZMP registra
64
+ */
65
+ export const XLSX_COLUMNS = {
66
+ IME_ZDRAVILA: 0,
67
+ IMETNIK_DOVOLJENJA: 1,
68
+ SPROSCANJE_ZDRAVILA: 2,
69
+ STEVILKA_DZP: 3,
70
+ DATUM_VELJAVNOSTI: 4,
71
+ REZIM_IZDAJE: 5,
72
+ ATC: 6,
73
+ POTI_UPORABE: 7,
74
+ FARMACEVTSKA_OBLIKA: 8,
75
+ PAKIRANJA: 9,
76
+ ENOTA_KOLICINE: 10,
77
+ UCINKOVINE: 11,
78
+ KOLICINE_UCINKOVIN: 12,
79
+ UCINKOVINE_DODATNE_INFO: 13,
80
+ POMOCNE_SNOVI: 14,
81
+ CILJNE_VRSTE: 15,
82
+ KARENCA_START: 16,
83
+ KARENCA_END: 54,
84
+ } as const;
@@ -0,0 +1,11 @@
1
+ import type { UtemeljitevOcene } from "../helper/oceniPodobnost";
2
+ import type { Zdravilo } from "./Zdravilo";
3
+
4
+ /**
5
+ * Rezultat iskanja zdravila z utemeljitvijo
6
+ */
7
+
8
+ export interface ZdraviloZUtemeljitvijo {
9
+ zdravilo: Zdravilo;
10
+ utemeljitev: UtemeljitevOcene;
11
+ }
@@ -0,0 +1,7 @@
1
+ import { skupneEntitete } from "cry-klikvet-logic"
2
+
3
+
4
+ /**
5
+ * Širant živalskih vrst
6
+ */
7
+ export const ZivalskeVrste = skupneEntitete.vrsteZivali;
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Iskanje zdravil po imenu
3
+ *
4
+ * Omogoča iskanje zdravil iz registra po podobnosti imena.
5
+ */
6
+
7
+ import type { Zdravilo } from "./types/Zdravilo";
8
+ import { razcleniNaziv } from "./helper/razcleniNaziv";
9
+ import { oceniPodobnost } from "./helper/oceniPodobnost";
10
+ import { RazclembaZdravila } from "./types/RazclembaZdravila";
11
+ import { ZdraviloZUtemeljitvijo } from "./types/ZdraviloZUtemeljitvijo";
12
+ import { oblikujRezultatIskanja } from "./helper/oblikujRezultatIskanja";
13
+ import { MIN_OCENA_PODOBNOSTI } from "./MIN_OCENA_PODOBNOSTI";
14
+ import { seznamZdravil } from "../generated/seznamZdravil";
15
+
16
+ /**
17
+ * Opcije za iskanje zdravil
18
+ */
19
+ export interface UganiZdraviloOpts {
20
+ /** Maksimalno število rezultatov (privzeto 10) */
21
+ limit?: number;
22
+ /** Minimalna ocena podobnosti (privzeto MIN_OCENA_PODOBNOSTI) */
23
+ minOcena?: number;
24
+ /** Išči samo med zdravili s temi ID-ji */
25
+ isciMed?: number[];
26
+ }
27
+
28
+ /**
29
+ * Cache razčlemb registra (module scope)
30
+ */
31
+ let razclembeRegistra: RazclembaZdravila[] | null = null;
32
+
33
+ /**
34
+ * Cache razčlemb registra po ID-ju
35
+ */
36
+ let razclembeRegistraPoId: Map<number, RazclembaZdravila> | null = null;
37
+
38
+ /**
39
+ * Pripravi razčlembe vseh zdravil iz registra
40
+ */
41
+ function pripraviRazclembeRegistra(): RazclembaZdravila[] {
42
+ if (razclembeRegistra !== null) {
43
+ return razclembeRegistra;
44
+ }
45
+
46
+ razclembeRegistra = seznamZdravil.map((zdravilo) => ({
47
+ zdravilo,
48
+ razclemba: razcleniNaziv(zdravilo.ime),
49
+ }));
50
+
51
+ // Pripravi tudi mapo po ID-ju
52
+ razclembeRegistraPoId = new Map();
53
+ for (const r of razclembeRegistra) {
54
+ razclembeRegistraPoId.set(r.zdravilo.id, r);
55
+ }
56
+
57
+ return razclembeRegistra;
58
+ }
59
+
60
+ /**
61
+ * Vrne razčlembe za dane ID-je zdravil
62
+ */
63
+ function razclembeZaIdje(idji: number[]): RazclembaZdravila[] {
64
+ // Zagotovi, da je cache pripravljen
65
+ pripraviRazclembeRegistra();
66
+
67
+ const rezultat: RazclembaZdravila[] = [];
68
+ for (const id of idji) {
69
+ const razclemba = razclembeRegistraPoId!.get(id);
70
+ if (razclemba) {
71
+ rezultat.push(razclemba);
72
+ }
73
+ }
74
+ return rezultat;
75
+ }
76
+
77
+ /**
78
+ * Poišči zdravila po podobnosti imena in vrni z utemeljitvami
79
+ *
80
+ * @param vhodniNaziv - Iskalni niz (ime zdravila)
81
+ * @param opts - Opcije iskanja (limit, minOcena, isciMed)
82
+ * @returns Seznam zdravil z utemeljitvami, sortirano po oceni padajoče
83
+ */
84
+ export function uganiZdraviloInUtemelji(
85
+ vhodniNaziv: string,
86
+ opts: UganiZdraviloOpts = {}
87
+ ): ZdraviloZUtemeljitvijo[] {
88
+ const { limit = 10, minOcena = MIN_OCENA_PODOBNOSTI, isciMed } = opts;
89
+
90
+ // Pripravi razčlembe - če je isciMed podan, išči samo med njimi
91
+ const razclembe = isciMed
92
+ ? razclembeZaIdje(isciMed)
93
+ : pripraviRazclembeRegistra();
94
+
95
+ // Razčleni vhodni naziv
96
+ const razclembaVhoda = razcleniNaziv(vhodniNaziv);
97
+
98
+ // Izračunaj podobnosti
99
+ const rezultati: ZdraviloZUtemeljitvijo[] = [];
100
+
101
+ for (const { zdravilo, razclemba } of razclembe) {
102
+ const utemeljitev = oceniPodobnost(razclembaVhoda, razclemba);
103
+ // Dodaj samo zadetke z oceno >= minOcena
104
+ if (utemeljitev.ocena >= minOcena) {
105
+ rezultati.push({ zdravilo, utemeljitev });
106
+ }
107
+ }
108
+
109
+ // Sortiraj po oceni padajoče
110
+ rezultati.sort((a, b) => b.utemeljitev.ocena - a.utemeljitev.ocena);
111
+
112
+ // Vrni prvih "limit" rezultatov
113
+ return rezultati.slice(0, limit);
114
+ }
115
+
116
+ /**
117
+ * Poišče zdravila v registru zdravil po podobnosti imena.
118
+ * Vrne seznam `limit` najboljših zadetkov in, če obstaja, najboljši zadetek.
119
+ *
120
+ * Zadetek je najboljši, če je edini ali če ima edini najvišjo oceno.
121
+ *
122
+ * @param vhodniNaziv - Iskalni niz (ime zdravila)
123
+ * @param opts - Opcije iskanja (limit, minOcena, isciMed)
124
+ * @returns { zadetki, najboljsi }
125
+ */
126
+ export function uganiZdravilo(
127
+ vhodniNaziv: string,
128
+ opts: UganiZdraviloOpts = {}
129
+ ): {
130
+ zadetki: { zdravilo: Zdravilo, ocena: number }[],
131
+ najboljsi: Zdravilo | undefined
132
+ }
133
+ {
134
+ const rezultati = uganiZdraviloInUtemelji(vhodniNaziv, opts);
135
+ const { zadetki, najboljsi } = oblikujRezultatIskanja(rezultati);
136
+
137
+ return {
138
+ zadetki,
139
+ najboljsi,
140
+ }
141
+ }
142
+
@@ -0,0 +1,28 @@
1
+ import { seznamZdravil } from "../generated/seznamZdravil";
2
+ import type { Zdravilo } from "./types/Zdravilo";
3
+
4
+ /**
5
+ * Vrne seznam zdravil, ki se začnejo z dano atcVet kodo.
6
+ * Seznam je urejen po ATCvet kodah.
7
+ * @param atcVetKoda ATCvet koda ali njen prefiks (npr. "QJ01", "QJ01CA04")
8
+ * @returns Seznam zdravil z ustrezno ATCvet kodo, urejen po kodah
9
+ */
10
+ export function zdravilaZaAtcVetKodo(atcVetKoda: string): Zdravilo[] {
11
+
12
+ if (!atcVetKoda) return [];
13
+ if (!atcVetKoda.toUpperCase().startsWith("Q")) return [];
14
+
15
+ const koda = atcVetKoda.toUpperCase();
16
+ const zdravila = seznamZdravil.filter(z =>
17
+ z.atcKoda && z.atcKoda.toUpperCase().startsWith(koda)
18
+ );
19
+
20
+ // Uredi po ATCvet kodi
21
+ zdravila.sort((a, b) => {
22
+ const kodaA = a.atcKoda || "";
23
+ const kodaB = b.atcKoda || "";
24
+ return kodaA.localeCompare(kodaB);
25
+ });
26
+
27
+ return zdravila;
28
+ }