ai-lawyer-agent/api/schemas.py
2026-03-16 03:16:02 +01:00

342 lines
16 KiB
Python

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