from typing import Annotated, List, Literal, Optional from pydantic import BaseModel, Field, field_validator class SortableMixin(BaseModel): sortProperty: Annotated[ Optional[str], Field(default=None, description="Atribút, podľa ktorého budú záznamy zoradené") ] = None sortDirection: Annotated[ Literal["ASC", "DESC"], Field(default="ASC", description="Smer zoradenia (ASC alebo DESC)") ] = "ASC" class PaginatedRequest(SortableMixin): page: Annotated[ Optional[int], Field(default=None, ge=0, description="Číslo stránky (začína od 0, nie od 1!)") ] = None size: Annotated[ Optional[int], Field(default=None, ge=1, description="Počet záznamov na stránku") ] = None #################################################################################################################### # .../v1/sud #################################################################################################################### class CourtSearch(PaginatedRequest): """Zoznam súdov s voliteľnými filtrami. GET /v1/sud""" query: Annotated[ Optional[str], Field(default=None, description="Hľadané slovo alebo slovné spojenie") ] = None typSuduFacetFilter: Annotated[ Optional[List[str]], Field(default=None, description="Typ súdu (fazetový filter), napr. ['Okresný súd', 'Krajský súd']") ] = None krajFacetFilter: Annotated[ Optional[List[str]], Field(default=None, description="Kraj (fazetový filter), napr. ['Bratislavský kraj']") ] = None okresFacetFilter: Annotated[ Optional[List[str]], Field(default=None, description="Okres (fazetový filter), napr. ['Okres Bratislava I']") ] = None zahrnutZaniknuteSudy: Annotated[ Optional[bool], Field(default=None, description="True = zahrnúť zaniknuté súdy, False = len aktívne") ] = None indexDatumOd: Annotated[ Optional[str], Field(default=None, description="Dátum indexácie od") ] = None indexDatumDo: Annotated[ Optional[str], Field(default=None, description="Dátum indexácie do") ] = None class CourtByID(BaseModel): """Jeden súd podľa ID. GET /v1/sud/{id}""" id: Annotated[str, Field(description="Identifikátor súdu, napr. 'sud_175'")] @field_validator("id") @classmethod def normalize(cls, v: str) -> str: v = v.strip() return f"sud_{v}" if v.isdigit() else v class CourtAutocomplete(BaseModel): """Autocomplete pre názvy súdov. GET /v1/sud/autocomplete""" query: Annotated[Optional[str], Field(default=None, description="Hľadané slovo")] = None limit: Annotated[Optional[int], Field(default=None, ge=1, description="Maximálny počet výsledkov")] = None #################################################################################################################### # .../v1/sudca #################################################################################################################### class JudgeSearch(BaseModel): """Zoznam sudcov s voliteľnými filtrami. GET /v1/sudca""" query: Annotated[ Optional[str], Field(default=None, description="Hľadané slovo alebo slovné spojenie") ] = None funkciaFacetFilter: Annotated[ Optional[List[str]], Field(default=None, description="Funkcia (fazetový filter), napr. ['Sudca', 'Predseda', 'Podpredseda']") ] = None typSuduFacetFilter: Annotated[ Optional[List[str]], Field(default=None, description="Typ súdu (fazetový filter)") ] = None krajFacetFilter: Annotated[ Optional[List[str]], Field(default=None, description="Kraj (fazetový filter), napr. ['Bratislavský kraj']") ] = None okresFacetFilter: Annotated[ Optional[List[str]], Field(default=None, description="Okres (fazetový filter)") ] = None stavZapisuFacetFilter: Annotated[ Optional[List[str]], Field( default=None, description=( "Stav zápisu — neprekladať hodnoty: " "'label.sudca.aktivny', 'label.sudca.odvolany', " "'label.sudca.vymazany', " "'label.sudca.prerusenie vykonu - poberatel', " "'label.sudca.prerusenie vykonu - ina funkce'" ) ) ] = None guidSud: Annotated[ Optional[str], Field(default=None, description="Identifikátor súdu, napr. 'sud_100'") ] = None indexDatumOd: Annotated[ Optional[str], Field(default=None, description="Dátum indexácie od") ] = None indexDatumDo: Annotated[ Optional[str], Field(default=None, description="Dátum indexácie do") ] = None page: Annotated[ Optional[int], Field(default=None, ge=0, description="Číslo stránky (začína od 0)") ] = None size: Annotated[ Optional[int], Field(default=None, ge=1, description="Počet záznamov na stránku") ] = None class JudgeByID(BaseModel): """Jeden sudca podľa ID. GET /v1/sudca/{id}""" id: Annotated[str, Field(description="Identifikátor sudcu, napr. 'sudca_1'")] @field_validator("id") @classmethod def normalize(cls, v: str) -> str: v = v.strip() return f"sudca_{v}" if v.isdigit() else v class JudgeAutocomplete(BaseModel): """ Autocomplete pre mená sudcov. GET /v1/sudca/autocomplete PREFEROVANÝ nástroj pri hľadaní sudcu podľa mena — použiť pred JudgeSearch! """ query: Annotated[ Optional[str], Field(default=None, description="Čiastočné meno sudcu") ] = None guidSud: Annotated[ Optional[str], Field(default=None, description="Identifikátor súdu, napr. 'sud_100'") ] = None limit: Annotated[ Optional[int], Field(default=None, ge=1, description="Maximálny počet návrhov") ] = None #################################################################################################################### # .../v1/rozhodnutie #################################################################################################################### class DecisionSearch(PaginatedRequest): """Zoznam rozhodnutí s voliteľnými filtrami. GET /v1/rozhodnutie""" query: Annotated[Optional[str], Field(default=None, description="Hľadané slovo alebo slovné spojenie")] = None typSuduFacetFilter: Annotated[Optional[List[str]], Field(default=None, description="Typ súdu (fazetový filter)")] = None krajFacetFilter: Annotated[Optional[List[str]], Field(default=None, description="Kraj (fazetový filter)")] = None okresFacetFilter: Annotated[Optional[List[str]], Field(default=None, description="Okres (fazetový filter)")] = None oblastPravnejUpravyFacetFilter: Annotated[ Optional[List[str]], Field(default=None, description="Oblasť právnej úpravy (fazetový filter)") ] = None podOblastPravnejUpravyFacetFilter: Annotated[ Optional[List[str]], Field(default=None, description="Podoblasť právnej úpravy (fazetový filter)") ] = None formaRozhodnutiaFacetFilter: Annotated[ Optional[List[str]], Field(default=None, description="Forma rozhodnutia, napr. ['Uznesenie', 'Rozsudok', 'Platobný rozkaz']") ] = None povahaRozhodnutiaFacetFilter: Annotated[ Optional[str], Field(default=None, description="Povaha rozhodnutia") ] = None odkazovanePredpisy: Annotated[ Optional[str], Field(default=None, description="Odkazované predpisy") ] = None vydaniaOd: Annotated[Optional[str], Field(default=None, description="Vydanie od (DD.MM.YYYY)")] = None vydaniaDo: Annotated[Optional[str], Field(default=None, description="Vydanie do (DD.MM.YYYY)")] = None ecli: Annotated[Optional[str], Field(default=None, description="ECLI identifikátor, napr. 'ECLI:SK:OSPO:1965:8114010264.1'")] = None spisovaZnacka: Annotated[Optional[str], Field(default=None, description="Spisová značka, napr. '7C/221/1991'")] = None cisloSpisu: Annotated[Optional[str], Field(default=None, description="Identifikačné číslo spisu")] = None guidSudca: Annotated[Optional[str], Field(default=None, description="Identifikátor sudcu, napr. 'sudca_1'")] = None guidSud: Annotated[Optional[str], Field(default=None, description="Identifikátor súdu, napr. 'sud_100'")] = None indexDatumOd: Annotated[Optional[str], Field(default=None, description="Dátum indexácie od")] = None indexDatumDo: Annotated[Optional[str], Field(default=None, description="Dátum indexácie do")] = None class DecisionByID(BaseModel): """Jedno rozhodnutie podľa ID. GET /v1/rozhodnutie/{id}""" id: Annotated[str, Field(description="Identifikátor rozhodnutia")] class DecisionAutocomplete(BaseModel): """Autocomplete pre rozhodnutia. GET /v1/rozhodnutie/autocomplete""" query: Annotated[Optional[str], Field(default=None, description="Hľadané slovo")] = None guidSud: Annotated[Optional[str], Field(default=None, description="Identifikátor súdu")] = None limit: Annotated[Optional[int], Field(default=None, ge=1, description="Maximálny počet výsledkov")] = None #################################################################################################################### # .../v1/zmluvy #################################################################################################################### class ContractSearch(PaginatedRequest): """Zoznam zmlúv s voliteľnými filtrami. GET /v1/zmluvy""" query: Annotated[Optional[str], Field(default=None, description="Hľadané slovo alebo slovné spojenie")] = None typDokumentuFacetFilter: Annotated[ Optional[List[str]], Field(default=None, description="Typ dokumentu, napr. ['FAKTURA', 'OBJEDNAVKA', 'ZMLUVA', 'DODATOK']") ] = None odberatelFacetFilter: Annotated[ Optional[List[str]], Field(default=None, description="Odberateľ (súd), napr. ['Krajský súd v Bratislave']") ] = None dodavatelFacetFilter: Annotated[ Optional[List[str]], Field(default=None, description="Dodávateľ, napr. ['Slovak Telekom, a.s.']") ] = None hodnotaZmluvyFacetFilter: Annotated[ Optional[List[str]], Field(default=None, description="Hodnota zmluvy: '0-1000', '1000-20000', '20000-100000', '100000-500000', 'Viac ako 500000'") ] = None datumZverejeneniaOd: Annotated[Optional[str], Field(default=None, description="Dátum zverejnenia od")] = None datumZverejeneniaDo: Annotated[Optional[str], Field(default=None, description="Dátum zverejnenia do")] = None guidSud: Annotated[Optional[str], Field(default=None, description="Identifikátor súdu, napr. 'sud_100'")] = None indexDatumOd: Annotated[Optional[str], Field(default=None, description="Dátum indexácie od")] = None indexDatumDo: Annotated[Optional[str], Field(default=None, description="Dátum indexácie do")] = None class ContractByID(BaseModel): """Jedna zmluva podľa ID. GET /v1/zmluvy/{idZmluvy}""" idZmluvy: Annotated[str, Field(description="Identifikátor zmluvy, napr. '2156252'")] class ContractAutocomplete(BaseModel): """Autocomplete pre zmluvy. GET /v1/zmluvy/autocomplete""" query: Annotated[Optional[str], Field(default=None, description="Hľadané slovo")] = None guidSud: Annotated[Optional[str], Field(default=None, description="Identifikátor súdu")] = None limit: Annotated[Optional[int], Field(default=None, ge=1, description="Maximálny počet výsledkov")] = None #################################################################################################################### # .../v1/obcianPojednavania #################################################################################################################### class CivilProceedingsSearch(PaginatedRequest): """Zoznam občianskych pojednávaní. GET /v1/obcianPojednavania""" query: Annotated[Optional[str], Field(default=None, description="Hľadané slovo alebo slovné spojenie")] = None typSuduFacetFilter: Annotated[Optional[List[str]], Field(default=None, description="Typ súdu (fazetový filter)")] = None krajFacetFilter: Annotated[Optional[List[str]], Field(default=None, description="Kraj (fazetový filter)")] = None okresFacetFilter: Annotated[Optional[List[str]], Field(default=None, description="Okres (fazetový filter)")] = None usekFacetFilter: Annotated[ Optional[List[str]], Field(default=None, description="Úsek (fazetový filter), napr. ['C', 'O', 'S']") ] = None formaUkonuFacetFilter: Annotated[ Optional[List[str]], Field(default=None, description="Forma úkonu, napr. ['Pojednávanie bez rozhodnutia', 'Pojednávanie a rozhodnutie']") ] = None pojednavaniaOd: Annotated[Optional[str], Field(default=None, description="Pojednávania od (DD.MM.YYYY)")] = None pojednavaniaDo: Annotated[Optional[str], Field(default=None, description="Pojednávania do (DD.MM.YYYY)")] = None guidSudca: Annotated[Optional[str], Field(default=None, description="Identifikátor sudcu, napr. 'sudca_1'")] = None guidSud: Annotated[Optional[str], Field(default=None, description="Identifikátor súdu, napr. 'sud_100'")] = None spisovaZnacka: Annotated[Optional[str], Field(default=None, description="Spisová značka, napr. '7C/221/1991'")] = None verejneVyhlasenie: Annotated[Optional[bool], Field(default=None, description="Verejné vyhlásenie")] = None indexDatumOd: Annotated[Optional[str], Field(default=None, description="Dátum indexácie od")] = None indexDatumDo: Annotated[Optional[str], Field(default=None, description="Dátum indexácie do")] = None class CivilProceedingsByID(BaseModel): """Jedno pojednávanie podľa ID. GET /v1/obcianPojednavania/{id}""" id: Annotated[str, Field(description="Identifikátor, napr. '121e4d31-695e-41e1-9191-7c9ad5d8d484'")] class CivilProceedingsAutocomplete(BaseModel): """Autocomplete pre občianske pojednávania. GET /v1/obcianPojednavania/autocomplete""" query: Annotated[Optional[str], Field(default=None, description="Hľadané slovo")] = None guidSud: Annotated[Optional[str], Field(default=None, description="Identifikátor súdu")] = None guidSudca: Annotated[Optional[str], Field(default=None, description="Identifikátor sudcu")] = None verejneVyhlasenie: Annotated[Optional[bool], Field(default=None, description="Verejné vyhlásenie")] = None limit: Annotated[Optional[int], Field(default=None, ge=1, description="Maximálny počet výsledkov")] = None #################################################################################################################### # .../v1/spravneKonanie #################################################################################################################### class AdminProceedingsSearch(PaginatedRequest): """Zoznam správnych konaní. GET /v1/spravneKonanie""" query: Annotated[Optional[str], Field(default=None, description="Hľadané slovo alebo slovné spojenie")] = None druhFacetFilter: Annotated[ Optional[List[str]], Field(default=None, description="Druh konania (fazetový filter)") ] = None datumPravoplatnostiOd: Annotated[ Optional[str], Field(default=None, description="Dátum právoplatnosti od (DD.MM.YYYY)") ] = None datumPravoplatnostiDo: Annotated[ Optional[str], Field(default=None, description="Dátum právoplatnosti do (DD.MM.YYYY)") ] = None class AdminProceedingsByID(BaseModel): """Jedno správne konanie podľa ID. GET /v1/spravneKonanie/{id}""" id: Annotated[str, Field(description="Identifikátor, napr. 'spravneKonanie_103'")] @field_validator("id") @classmethod def normalize(cls, v: str) -> str: v = v.strip() return f"spravneKonanie_{v}" if v.isdigit() else v class AdminProceedingsAutocomplete(BaseModel): """Autocomplete pre správne konania. GET /v1/spravneKonanie/autocomplete""" query: Annotated[Optional[str], Field(default=None, description="Hľadané slovo")] = None limit: Annotated[Optional[int], Field(default=None, ge=1, description="Maximálny počet výsledkov")] = None