# generated by datamodel-codegen:
#   filename:  openapi.json

from __future__ import annotations

from datetime import date
from enum import StrEnum
from typing import Annotated

from pydantic import (
    AnyUrl,
    AwareDatetime,
    Base64Str,
    BaseModel,
    ConfigDict,
    Field,
    RootModel,
)


class Ip4Address(RootModel[str]):
    root: Annotated[
        str, Field(pattern="^((25[0-5]|(2[0-4]|1\\d|[1-9]|)\\d)\\.?\\b){4}$")
    ]


class Ip4Range(RootModel[str]):
    root: Annotated[
        str,
        Field(
            pattern="^((25[0-5]|(2[0-4]|1\\d|[1-9]|)\\d)\\.?\\b){4}-((25[0-5]|(2[0-4]|1\\d|[1-9]|)\\d)\\.?\\b){4}$"
        ),
    ]


class Ip4Mask(RootModel[str]):
    root: Annotated[
        str,
        Field(
            pattern="^((25[0-5]|(2[0-4]|1\\d|[1-9]|)\\d)\\.?\\b){4}\\/(0|[1-9]|1[0-9]|2[0-9]|3[0-2])$"
        ),
    ]


class AllowedIps(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    ip4Addresses: list[Ip4Address] | None = None
    """
    Lista adresów IPv4 w notacji dziesiętnej kropkowanej, np. `192.168.0.10`.
    """
    ip4Ranges: list[Ip4Range] | None = None
    """
    Lista adresów IPv4 podana w formie zakresu początek–koniec, oddzielonego pojedynczym myślnikiem, np. `10.0.0.1–10.0.0.254`.
    """
    ip4Masks: list[Ip4Mask] | None = None
    """
    Lista adresów IPv4 w notacji CIDR, np. `172.16.0.0/16`.
    """


class AmountType(StrEnum):
    Brutto = "Brutto"
    Netto = "Netto"
    Vat = "Vat"


class ApiRateLimitValuesOverride(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    perSecond: int
    """
    Limit na sekundę.
    """
    perMinute: int
    """
    Limit na minutę.
    """
    perHour: int
    """
    Limit na godzinę.
    """


class ApiRateLimitsOverride(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    onlineSession: ApiRateLimitValuesOverride
    """
    Limity dla otwierania/zamykania sesji interaktywnych.
    """
    batchSession: ApiRateLimitValuesOverride
    """
    Limity dla otwierania/zamykania sesji wsadowych.
    """
    invoiceSend: ApiRateLimitValuesOverride
    """
    Limity dla wysyłki faktur.
    """
    invoiceStatus: ApiRateLimitValuesOverride
    """
    Limity dla pobierania statusu faktury z sesji.
    """
    sessionList: ApiRateLimitValuesOverride
    """
    Limity dla pobierania listy sesji.
    """
    sessionInvoiceList: ApiRateLimitValuesOverride
    """
    Limity dla pobierania listy faktur w sesji.
    """
    sessionMisc: ApiRateLimitValuesOverride
    """
    Limity dla pozostałych operacji w ramach sesji.
    """
    invoiceMetadata: ApiRateLimitValuesOverride
    """
    Limity dla pobierania metadanych faktur.
    """
    invoiceExport: ApiRateLimitValuesOverride
    """
    Limity dla eksportu paczki faktur.
    """
    invoiceExportStatus: ApiRateLimitValuesOverride
    """
    Limity dla pobierania statusu eksportu paczki faktur.
    """
    invoiceDownload: ApiRateLimitValuesOverride
    """
    Limity dla pobierania faktur po numerze KSeF.
    """
    other: ApiRateLimitValuesOverride
    """
    Limity dla pozostałych operacji API.
    """


class AuthenticationContextIdentifierType(StrEnum):
    Nip = "Nip"
    InternalId = "InternalId"
    NipVatUe = "NipVatUe"
    PeppolId = "PeppolId"


class AuthenticationMethod(StrEnum):
    """
    Metoda uwierzytelnienia.
    | Wartość | Opis |
    | --- | --- |
    | Token | Token KSeF. |
    | TrustedProfile | Profil Zaufany. |
    | InternalCertificate | Certyfikat KSeF. |
    | QualifiedSignature | Podpis kwalifikowany. |
    | QualifiedSeal | Pieczęć kwalifikowana. |
    | PersonalSignature | Podpis osobisty. |
    | PeppolSignature | Podpis dostawcy usług Peppol. |

    """

    Token = "Token"
    TrustedProfile = "TrustedProfile"
    InternalCertificate = "InternalCertificate"
    QualifiedSignature = "QualifiedSignature"
    QualifiedSeal = "QualifiedSeal"
    PersonalSignature = "PersonalSignature"
    PeppolSignature = "PeppolSignature"


class AuthenticationMethodCategory(StrEnum):
    """
    | Wartość | Opis |
    | --- | --- |
    | XadesSignature | Uwierzytelnienie podpisem Xades. |
    | NationalNode | Uwierzytelnienie za pomocą Węzła Krajowego (login.gov.pl). |
    | Token | Uwierzytelnienie tokenem. |
    | Other | Uwierzytelnienie inną metodą. |

    """

    XadesSignature = "XadesSignature"
    NationalNode = "NationalNode"
    Token = "Token"
    Other = "Other"


class AuthenticationMethodInfo(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    category: AuthenticationMethodCategory
    """
    Kategoria metody uwierzytelnienia.
    | Wartość | Opis |
    | --- | --- |
    | XadesSignature | Uwierzytelnienie podpisem Xades. |
    | NationalNode | Uwierzytelnienie za pomocą Węzła Krajowego (login.gov.pl). |
    | Token | Uwierzytelnienie tokenem. |
    | Other | Uwierzytelnienie inną metodą. |

    """
    code: str
    """
    Kod metody uwierzytelnienia.
    """
    displayName: str
    """
    Nazwa metody uwierzytelnienia do wyświetlenia użytkownikowi.
    """


class AuthenticationTokenStatus(StrEnum):
    """
    | Wartość | Opis |
    | --- | --- |
    | Pending | Token został utworzony ale jest jeszcze w trakcie aktywacji i nadawania uprawnień. Nie może być jeszcze wykorzystywany do uwierzytelniania. |
    | Active | Token jest aktywny i może być wykorzystywany do uwierzytelniania. |
    | Revoking | Token jest w trakcie unieważniania. Nie może już być wykorzystywany do uwierzytelniania. |
    | Revoked | Token został unieważniony i nie może być wykorzystywany do uwierzytelniania. |
    | Failed | Nie udało się aktywować tokena. Należy wygenerować nowy token, obecny nie może być wykorzystywany do uwierzytelniania. |

    """

    Pending = "Pending"
    Active = "Active"
    Revoking = "Revoking"
    Revoked = "Revoked"
    Failed = "Failed"


class AuthorizationPolicy(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    allowedIps: AllowedIps | None = None
    """
    Lista dozwolonych adresów IP.
    """


class BatchSessionContextLimitsOverride(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    maxInvoiceSizeInMB: Annotated[int, Field(ge=0, le=5)]
    """
    Maksymalny rozmiar faktury w MB.
    """
    maxInvoiceWithAttachmentSizeInMB: Annotated[int, Field(ge=0, le=10)]
    """
    Maksymalny rozmiar faktury z załącznikiem w MB.
    """
    maxInvoices: Annotated[int, Field(ge=0, le=100000)]
    """
    Maksymalna ilość faktur które można przesłać w pojedynczej sesji.
    """


class BatchSessionEffectiveContextLimits(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    maxInvoiceSizeInMB: Annotated[int, Field(ge=0)]
    """
    Maksymalny rozmiar faktury w MB.
    """
    maxInvoiceWithAttachmentSizeInMB: Annotated[int, Field(ge=0)]
    """
    Maksymalny rozmiar faktury z załącznikiem w MB.
    """
    maxInvoices: Annotated[int, Field(ge=0)]
    """
    Maksymalna ilość faktur które można przesłać w pojedynczej sesji.
    """


class BuyerIdentifierType(StrEnum):
    """
    | Wartość | Opis |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | VatUe | Identyfikator VAT UE podmiotu unijnego |
    | Other | Inny identyfikator |
    | None | Brak identyfikatora nabywcy |

    """

    Nip = "Nip"
    VatUe = "VatUe"
    Other = "Other"
    None_ = "None"


class CertificateEffectiveSubjectLimits(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    maxCertificates: int | None = None


class CertificateEnrollmentDataResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    commonName: str
    """
    Nazwa powszechna.
    """
    countryName: str
    """
    Kraj, kod ISO 3166.
    """
    givenName: str | None = None
    """
    Imię.
    """
    surname: str | None = None
    """
    Nazwisko.
    """
    serialNumber: str | None = None
    """
    Numer seryjny podmiotu.
    """
    uniqueIdentifier: str | None = None
    """
    Unikalny identyfikator.
    """
    organizationName: str | None = None
    """
    Nazwa organizacji.
    """
    organizationIdentifier: str | None = None
    """
    Identyfikator organizacji.
    """


class CertificateLimit(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    remaining: int
    """
    Pozostała wartość limitu.
    """
    limit: int
    """
    Maksymalna liczba zasobów dozwolona w ramach limitu.
    """


class CertificateLimitsResponse(BaseModel):
    """
    Informacje o limitach wniosków oraz certyfikatów dla uwierzytelnionego podmiotu.
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    canRequest: bool
    """
    Flaga informująca czy uwierzytelniony podmiot może złożyć nowy wniosek o certyfikat.
    """
    enrollment: CertificateLimit
    """
    Informacje o limitach związanych z liczbą możliwych do złożenia wniosków certyfikacyjnych.
    """
    certificate: CertificateLimit
    """
    Informacje o limitach dotyczących liczby aktywnych certyfikatów wydanych dla danego podmiotu.
    """


class CertificateListItemStatus(StrEnum):
    """
    | Wartość | Opis |
    | --- | --- |
    | Active | Certyfikat jest aktywny i może zostać użyty do uwierzytelnienia lub realizacji operacji w trybie offline (w zależności od typu certyfikatu). |
    | Blocked | Certyfikat został zablokowany i nie może zostać użyty do uwierzytelnienia i realizacji operacji w trybie offline.            Status przejściowy do czasu zakończenia procesu unieważniania. |
    | Revoked | Certyfikat został unieważniony i nie może zostać użyty do uwierzytelnienia i realizacji operacji w trybie offline. |
    | Expired | Certyfikat wygasł i nie może zostać użyty do uwierzytelnienia i realizacji operacji w trybie offline. |

    """

    Active = "Active"
    Blocked = "Blocked"
    Revoked = "Revoked"
    Expired = "Expired"


class CertificateRevocationReason(StrEnum):
    """
    | Wartość | Opis |
    | --- | --- |
    | Unspecified | Nieokreślony. |
    | Superseded | Certyfikat został zastąpiony przez inny. |
    | KeyCompromise | Klucz prywatny powiązany z certyfikatem został skompromitowany. |

    """

    Unspecified = "Unspecified"
    Superseded = "Superseded"
    KeyCompromise = "KeyCompromise"


class CertificateSubjectIdentifierType(StrEnum):
    Nip = "Nip"
    Pesel = "Pesel"
    Fingerprint = "Fingerprint"


class CertificateSubjectLimitsOverride(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    maxCertificates: Annotated[int | None, Field(ge=0)] = None


class CheckAttachmentPermissionStatusResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    isAttachmentAllowed: bool | None = None
    """
    Informacja czy Podmiot ma obecnie możliwość dodawania Załączników do Faktur
    """
    revokedDate: AwareDatetime | None = None
    """
    Data i czas zakończenia możliwość dodawania przez Podmiot Załączników do Faktur.
    Brak podanej daty oznacza bezterminową możliwość dodawania Załączników do Faktur
    """


class CommonSessionStatus(StrEnum):
    """
    | Wartość | Opis |
    | --- | --- |
    | InProgress | Sesja aktywna. |
    | Succeeded | Sesja przetworzona poprawnie.            W trakcie przetwarzania sesji nie wystąpiły żadne błędy, ale część faktur nadal mogła zostać odrzucona. |
    | Failed | Sesja nie przetworzona z powodu błędów.            Na etapie rozpoczynania lub kończenia sesji wystąpiły błędy, które nie pozwoliły na jej poprawne przetworzenie. |
    | Cancelled | Sesja anulowania.            Został przekroczony czas na wysyłkę w sesji wsadowej, lub nie przesłano żadnych faktur w sesji interaktywnej. |

    """

    InProgress = "InProgress"
    Succeeded = "Succeeded"
    Failed = "Failed"
    Cancelled = "Cancelled"


class CurrencyCode(StrEnum):
    AED = "AED"
    AFN = "AFN"
    ALL = "ALL"
    AMD = "AMD"
    ANG = "ANG"
    AOA = "AOA"
    ARS = "ARS"
    AUD = "AUD"
    AWG = "AWG"
    AZN = "AZN"
    BAM = "BAM"
    BBD = "BBD"
    BDT = "BDT"
    BGN = "BGN"
    BHD = "BHD"
    BIF = "BIF"
    BMD = "BMD"
    BND = "BND"
    BOB = "BOB"
    BOV = "BOV"
    BRL = "BRL"
    BSD = "BSD"
    BTN = "BTN"
    BWP = "BWP"
    BYN = "BYN"
    BZD = "BZD"
    CAD = "CAD"
    CDF = "CDF"
    CHE = "CHE"
    CHF = "CHF"
    CHW = "CHW"
    CLF = "CLF"
    CLP = "CLP"
    CNY = "CNY"
    COP = "COP"
    COU = "COU"
    CRC = "CRC"
    CUC = "CUC"
    CUP = "CUP"
    CVE = "CVE"
    CZK = "CZK"
    DJF = "DJF"
    DKK = "DKK"
    DOP = "DOP"
    DZD = "DZD"
    EGP = "EGP"
    ERN = "ERN"
    ETB = "ETB"
    EUR = "EUR"
    FJD = "FJD"
    FKP = "FKP"
    GBP = "GBP"
    GEL = "GEL"
    GGP = "GGP"
    GHS = "GHS"
    GIP = "GIP"
    GMD = "GMD"
    GNF = "GNF"
    GTQ = "GTQ"
    GYD = "GYD"
    HKD = "HKD"
    HNL = "HNL"
    HRK = "HRK"
    HTG = "HTG"
    HUF = "HUF"
    IDR = "IDR"
    ILS = "ILS"
    IMP = "IMP"
    INR = "INR"
    IQD = "IQD"
    IRR = "IRR"
    ISK = "ISK"
    JEP = "JEP"
    JMD = "JMD"
    JOD = "JOD"
    JPY = "JPY"
    KES = "KES"
    KGS = "KGS"
    KHR = "KHR"
    KMF = "KMF"
    KPW = "KPW"
    KRW = "KRW"
    KWD = "KWD"
    KYD = "KYD"
    KZT = "KZT"
    LAK = "LAK"
    LBP = "LBP"
    LKR = "LKR"
    LRD = "LRD"
    LSL = "LSL"
    LYD = "LYD"
    MAD = "MAD"
    MDL = "MDL"
    MGA = "MGA"
    MKD = "MKD"
    MMK = "MMK"
    MNT = "MNT"
    MOP = "MOP"
    MRU = "MRU"
    MUR = "MUR"
    MVR = "MVR"
    MWK = "MWK"
    MXN = "MXN"
    MXV = "MXV"
    MYR = "MYR"
    MZN = "MZN"
    NAD = "NAD"
    NGN = "NGN"
    NIO = "NIO"
    NOK = "NOK"
    NPR = "NPR"
    NZD = "NZD"
    OMR = "OMR"
    PAB = "PAB"
    PEN = "PEN"
    PGK = "PGK"
    PHP = "PHP"
    PKR = "PKR"
    PLN = "PLN"
    PYG = "PYG"
    QAR = "QAR"
    RON = "RON"
    RSD = "RSD"
    RUB = "RUB"
    RWF = "RWF"
    SAR = "SAR"
    SBD = "SBD"
    SCR = "SCR"
    SDG = "SDG"
    SEK = "SEK"
    SGD = "SGD"
    SHP = "SHP"
    SLL = "SLL"
    SOS = "SOS"
    SRD = "SRD"
    SSP = "SSP"
    STN = "STN"
    SVC = "SVC"
    SYP = "SYP"
    SZL = "SZL"
    THB = "THB"
    TJS = "TJS"
    TMT = "TMT"
    TND = "TND"
    TOP = "TOP"
    TRY = "TRY"
    TTD = "TTD"
    TWD = "TWD"
    TZS = "TZS"
    UAH = "UAH"
    UGX = "UGX"
    USD = "USD"
    USN = "USN"
    UYI = "UYI"
    UYU = "UYU"
    UYW = "UYW"
    UZS = "UZS"
    VES = "VES"
    VND = "VND"
    VUV = "VUV"
    WST = "WST"
    XAF = "XAF"
    XAG = "XAG"
    XAU = "XAU"
    XBA = "XBA"
    XBB = "XBB"
    XBC = "XBC"
    XBD = "XBD"
    XCD = "XCD"
    XCG = "XCG"
    XDR = "XDR"
    XOF = "XOF"
    XPD = "XPD"
    XPF = "XPF"
    XPT = "XPT"
    XSU = "XSU"
    XUA = "XUA"
    XXX = "XXX"
    YER = "YER"
    ZAR = "ZAR"
    ZMW = "ZMW"
    ZWL = "ZWL"


class EffectiveApiRateLimitValues(ApiRateLimitValuesOverride):
    pass


class EffectiveApiRateLimits(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    onlineSession: EffectiveApiRateLimitValues
    """
    Limity dla otwierania/zamykania sesji interaktywnych.
    """
    batchSession: EffectiveApiRateLimitValues
    """
    Limity dla otwierania/zamykania sesji wsadowych.
    """
    invoiceSend: EffectiveApiRateLimitValues
    """
    Limity dla wysyłki faktur.
    """
    invoiceStatus: EffectiveApiRateLimitValues
    """
    Limity dla pobierania statusu faktury z sesji.
    """
    sessionList: EffectiveApiRateLimitValues
    """
    Limity dla pobierania listy sesji.
    """
    sessionInvoiceList: EffectiveApiRateLimitValues
    """
    Limity dla pobierania listy faktur w sesji.
    """
    sessionMisc: EffectiveApiRateLimitValues
    """
    Limity dla pozostałych operacji w ramach sesji.
    """
    invoiceMetadata: EffectiveApiRateLimitValues
    """
    Limity dla pobierania metadanych faktur.
    """
    invoiceExport: EffectiveApiRateLimitValues
    """
    Limity dla eksportu paczki faktur.
    """
    invoiceExportStatus: EffectiveApiRateLimitValues
    """
    Limity dla pobierana statusu eksportu paczki faktur.
    """
    invoiceDownload: EffectiveApiRateLimitValues
    """
    Limity dla pobierania faktur po numerze KSeF.
    """
    other: EffectiveApiRateLimitValues
    """
    Limity dla pozostałych operacji API.
    """


class EncryptionInfo(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    encryptedSymmetricKey: Base64Str
    """
    Klucz symetryczny o długości 32 bajtów, zaszyfrowany algorytmem RSA (Padding: OAEP z SHA-256), zakodowany w formacie Base64.

    [Klucz publiczny Ministerstwa Finansów](/docs/v2/index.html#tag/Certyfikaty-klucza-publicznego)
    """
    initializationVector: Base64Str
    """
    Wektor inicjalizujący (IV) o długości 16 bajtów, używany do szyfrowania symetrycznego, zakodowany w formacie Base64.
    """


class EnrollmentEffectiveSubjectLimits(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    maxEnrollments: int | None = None


class EnrollmentSubjectLimitsOverride(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    maxEnrollments: Annotated[int | None, Field(ge=0)] = None


class EntityAuthorizationPermissionType(StrEnum):
    SelfInvoicing = "SelfInvoicing"
    RRInvoicing = "RRInvoicing"
    TaxRepresentative = "TaxRepresentative"
    PefInvoicing = "PefInvoicing"


class EntityAuthorizationPermissionsSubjectIdentifierType(StrEnum):
    Nip = "Nip"
    PeppolId = "PeppolId"


class EntityAuthorizationsAuthorizingEntityIdentifierType(StrEnum):
    Nip = "Nip"


class EntityByFingerprintDetails(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    fullName: Annotated[str, Field(max_length=100)]
    """
    Pełna nazwa podmiotu.
    """
    address: Annotated[str, Field(max_length=512)]
    """
    Adres podmiotu.
    """


class EntityDetails(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    fullName: Annotated[str, Field(max_length=90, min_length=5)]
    """
    Pełna nazwa podmiotu.
    """


class EntityPermissionType(StrEnum):
    InvoiceWrite = "InvoiceWrite"
    InvoiceRead = "InvoiceRead"


class EntityRoleType(StrEnum):
    CourtBailiff = "CourtBailiff"
    EnforcementAuthority = "EnforcementAuthority"
    LocalGovernmentUnit = "LocalGovernmentUnit"
    LocalGovernmentSubUnit = "LocalGovernmentSubUnit"
    VatGroupUnit = "VatGroupUnit"
    VatGroupSubUnit = "VatGroupSubUnit"


class EntitySubjectByFingerprintDetailsType(StrEnum):
    """
    | Wartość | Opis |
    | --- | --- |
    | EntityByFingerprint | Podmiot identyfikowany odciskiem palca pieczęci kwalifikowanej. |

    """

    EntityByFingerprint = "EntityByFingerprint"


class EntitySubjectByIdentifierDetailsType(StrEnum):
    """
    | Wartość | Opis |
    | --- | --- |
    | EntityByIdentifier | Podmiot identyfikowany numerem NIP. |

    """

    EntityByIdentifier = "EntityByIdentifier"


class EntitySubjectDetailsType(StrEnum):
    """
    | Wartość | Opis |
    | --- | --- |
    | EntityByIdentifier | Podmiot identyfikowany numerem NIP. |
    | EntityByFingerprint | Podmiot identyfikowany odciskiem palca pieczęci kwalifikowanej. |

    """

    EntityByIdentifier = "EntityByIdentifier"
    EntityByFingerprint = "EntityByFingerprint"


class EuEntityAdministrationPermissionsContextIdentifierType(StrEnum):
    NipVatUe = "NipVatUe"


class EuEntityAdministrationPermissionsSubjectIdentifierType(StrEnum):
    Fingerprint = "Fingerprint"


class EuEntityDetails(EntityByFingerprintDetails):
    pass


class EuEntityPermissionSubjectDetailsType(StrEnum):
    """
    | Wartość | Opis |
    | --- | --- |
    | PersonByFingerprintWithIdentifier | Osoba fizyczna posługująca się certyfikatem niezawierającym identyfikatora NIP ani PESEL, ale mająca NIP lub PESEL. |
    | PersonByFingerprintWithoutIdentifier | Osoba fizyczna posługująca się certyfikatem niezawierającym identyfikatora NIP ani PESEL i niemająca NIP ani PESEL. |
    | EntityByFingerprint | Podmiot identyfikowany odciskiem palca pieczęci kwalifikowanej. |

    """

    PersonByFingerprintWithIdentifier = "PersonByFingerprintWithIdentifier"
    PersonByFingerprintWithoutIdentifier = "PersonByFingerprintWithoutIdentifier"
    EntityByFingerprint = "EntityByFingerprint"


class EuEntityPermissionsQueryPermissionType(StrEnum):
    VatUeManage = "VatUeManage"
    InvoiceWrite = "InvoiceWrite"
    InvoiceRead = "InvoiceRead"
    Introspection = "Introspection"


class EuEntityPermissionsQueryRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    vatUeIdentifier: Annotated[
        str | None,
        Field(
            pattern="^(ATU\\d{8}|BE[01]{1}\\d{9}|BG\\d{9,10}|CY\\d{8}[A-Z]|CZ\\d{8,10}|DE\\d{9}|DK\\d{8}|EE\\d{9}|EL\\d{9}|ES([A-Z]\\d{8}|\\d{8}[A-Z]|[A-Z]\\d{7}[A-Z])|FI\\d{8}|FR[A-Z0-9]{2}\\d{9}|HR\\d{11}|HU\\d{8}|IE(\\d{7}[A-Z]{2}|\\d[A-Z0-9+*]\\d{5}[A-Z])|IT\\d{11}|LT(\\d{9}|\\d{12})|LU\\d{8}|LV\\d{11}|MT\\d{8}|NL[A-Z0-9+*]{12}|PT\\d{9}|RO\\d{2,10}|SE\\d{12}|SI\\d{8}|SK\\d{10}|XI((\\d{9}|\\d{12})|(GD|HA)\\d{3}))$"
        ),
    ] = None
    """
    Wartość identyfikatora (numeru identyfikacyjnego VAT) podmiotu unijnego (exact match).
    """
    authorizedFingerprintIdentifier: str | None = None
    """
    Odcisk palca certyfikatu kwalifikowanego uprawnionego (contains).
    """
    permissionTypes: list[EuEntityPermissionsQueryPermissionType] | None = None
    """
    Lista rodzajów wyszukiwanych uprawnień.
    """


class ExceptionDetails(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    exceptionCode: int | None = None
    exceptionDescription: str | None = None
    details: list[str] | None = None


class FormCode(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    systemCode: str
    """
    Kod systemowy
    """
    schemaVersion: str
    """
    Wersja schematu
    """
    value: str
    """
    Wartość
    """


class IdDocument(BaseModel):
    """
    Dane dokumentu tożsamości osoby fizycznej.
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: Annotated[str, Field(max_length=20)]
    """
    Rodzaj dokumentu tożsamości.
    """
    number: Annotated[str, Field(max_length=20)]
    """
    Seria i numer dokumentu tożsamości.
    """
    country: Annotated[str, Field(max_length=2, min_length=2)]
    """
    Kraj wydania dokumentu tożsamości. Musi być zgodny z ISO 3166-1 alpha-2 (np. PL, DE, US) oraz zawierać dokładnie 2 wielkie litery.
    """


class IndirectPermissionType(StrEnum):
    InvoiceRead = "InvoiceRead"
    InvoiceWrite = "InvoiceWrite"


class IndirectPermissionsTargetIdentifierType(StrEnum):
    Nip = "Nip"
    AllPartners = "AllPartners"
    InternalId = "InternalId"


class InternalId(RootModel[str]):
    root: Annotated[
        str,
        Field(
            max_length=16,
            min_length=16,
            pattern="^[1-9]((\\d[1-9])|([1-9]\\d))\\d{7}-\\d{5}$",
        ),
    ]
    """
    Identyfikator wewnętrzny, składający się z numeru NIP i 5 cyfr.
    """


class InvoiceMetadataBuyerIdentifier(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    type: BuyerIdentifierType
    """
    Typ identyfikatora nabywcy.
    | Wartość | Opis |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | VatUe | Identyfikator VAT UE podmiotu unijnego |
    | Other | Inny identyfikator |
    | None | Brak identyfikatora nabywcy |

    """
    value: Annotated[str | None, Field(max_length=50)] = None
    """
    Wartość identyfikatora nabywcy.
    """


class InvoicePermissionType(StrEnum):
    SelfInvoicing = "SelfInvoicing"
    TaxRepresentative = "TaxRepresentative"
    RRInvoicing = "RRInvoicing"
    PefInvoicing = "PefInvoicing"


class InvoiceQueryAmount(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    type: AmountType
    from_: Annotated[float | None, Field(alias="from")] = None
    to: float | None = None


class InvoiceQueryBuyerIdentifier(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    type: BuyerIdentifierType
    """
    Typ identyfikatora nabywcy.
    | Wartość | Opis |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | VatUe | Identyfikator VAT UE podmiotu unijnego |
    | Other | Inny identyfikator |
    | None | Brak identyfikatora nabywcy |

    """
    value: Annotated[str | None, Field(max_length=50)] = None
    """
    Wartość identyfikatora nabywcy (exact match).
    """


class InvoiceQueryDateType(StrEnum):
    """
    | Wartość | Opis |
    | --- | --- |
    | Issue | Data wystawienia faktury. |
    | Invoicing | Data przyjęcia faktury w systemie KSeF (do dalszego przetwarzania). |
    | PermanentStorage | Data trwałego zapisu faktury w repozytorium systemu KSeF. |

    """

    Issue = "Issue"
    Invoicing = "Invoicing"
    PermanentStorage = "PermanentStorage"


class InvoiceQueryFormType(StrEnum):
    """
    | Wartość | Opis |
    | --- | --- |
    | FA | Faktura VAT |
    | PEF | Faktura PEF |
    | RR | Faktura RR |

    """

    FA = "FA"
    PEF = "PEF"
    RR = "RR"


class InvoiceQuerySubjectType(StrEnum):
    """
    | Wartość | Opis |
    | --- | --- |
    | Subject1 | Podmiot 1 - sprzedawca |
    | Subject2 | Podmiot 2 - nabywca |
    | Subject3 | Podmiot 3 |
    | SubjectAuthorized | Podmiot upoważniony |

    """

    Subject1 = "Subject1"
    Subject2 = "Subject2"
    Subject3 = "Subject3"
    SubjectAuthorized = "SubjectAuthorized"


class InvoiceStatusInfo(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    code: int
    """
    Kod statusu faktury
    """
    description: Annotated[str, Field(min_length=1)]
    """
    Opis statusu
    """
    details: list[str] | None = None
    """
    Dodatkowe szczegóły statusu
    """
    extensions: dict[str, str | None] | None = None
    """
    Zbiór dodatkowych informacji związanych ze statusem faktury, zapisanych jako pary klucz–wartość.
    Umożliwia rozszerzenie modelu o dane specyficzne dla danego przypadku.
    """


class InvoiceType(StrEnum):
    """
    | Wartość | Opis |
    | --- | --- |
    | Vat | (FA) Podstawowa |
    | Zal | (FA) Zaliczkowa |
    | Kor | (FA) Korygująca |
    | Roz | (FA) Rozliczeniowa |
    | Upr | (FA) Uproszczona |
    | KorZal | (FA) Korygująca fakturę zaliczkową |
    | KorRoz | (FA) Korygująca fakturę rozliczeniową |
    | VatPef | (PEF) Podstawowa |
    | VatPefSp | (PEF) Specjalizowana |
    | KorPef | (PEF) Korygująca |
    | VatRr | (RR) Podstawowa |
    | KorVatRr | (RR) Korygująca |

    """

    Vat = "Vat"
    Zal = "Zal"
    Kor = "Kor"
    Roz = "Roz"
    Upr = "Upr"
    KorZal = "KorZal"
    KorRoz = "KorRoz"
    VatPef = "VatPef"
    VatPefSp = "VatPefSp"
    KorPef = "KorPef"
    VatRr = "VatRr"
    KorVatRr = "KorVatRr"


class InvoicingMode(StrEnum):
    Online = "Online"
    Offline = "Offline"


class KsefCertificateType(StrEnum):
    """
    | Wartość | Opis |
    | --- | --- |
    | Authentication | Certyfikat używany do uwierzytelnienia w systemie. |
    | Offline | Certyfikat używany wyłącznie do potwierdzania autentyczności wystawcy i integralności faktury w trybie offline |

    """

    Authentication = "Authentication"
    Offline = "Offline"


class Nip(RootModel[str]):
    root: Annotated[
        str,
        Field(
            max_length=10, min_length=10, pattern="^[1-9]((\\d[1-9])|([1-9]\\d))\\d{7}$"
        ),
    ]
    """
    10 cyfrowy numer NIP.
    """


class NipVatUe(RootModel[str]):
    root: Annotated[
        str,
        Field(
            pattern="^[1-9]((\\d[1-9])|([1-9]\\d))\\d{7}-(ATU\\d{8}|BE[01]{1}\\d{9}|BG\\d{9,10}|CY\\d{8}[A-Z]|CZ\\d{8,10}|DE\\d{9}|DK\\d{8}|EE\\d{9}|EL\\d{9}|ES([A-Z]\\d{8}|\\d{8}[A-Z]|[A-Z]\\d{7}[A-Z])|FI\\d{8}|FR[A-Z0-9]{2}\\d{9}|HR\\d{11}|HU\\d{8}|IE(\\d{7}[A-Z]{2}|\\d[A-Z0-9+*]\\d{5}[A-Z])|IT\\d{11}|LT(\\d{9}|\\d{12})|LU\\d{8}|LV\\d{11}|MT\\d{8}|NL[A-Z0-9+*]{12}|PT\\d{9}|RO\\d{2,10}|SE\\d{12}|SI\\d{8}|SK\\d{10}|XI((\\d{9}|\\d{12})|(GD|HA)\\d{3}))$"
        ),
    ]
    """
    Identyfikator złożony, czyli dwuczłonowy identyfikator składający się z nr NIP podmiotu polskiego oraz numeru VAT UE podmiotu unijnego.
    """


class OnlineSessionContextLimitsOverride(BatchSessionContextLimitsOverride):
    pass


class OnlineSessionEffectiveContextLimits(BatchSessionEffectiveContextLimits):
    pass


class OpenOnlineSessionRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    formCode: FormCode
    """
    Schemat faktur wysyłanych w ramach sesji.

    Obsługiwane schematy:
    | SystemCode | SchemaVersion | Value |
    | --- | --- | --- |
    | [FA (2)](https://github.com/CIRFMF/ksef-docs/blob/main/faktury/schemy/FA/schemat_FA(2)_v1-0E.xsd) | 1-0E | FA |
    | [FA (3)](https://github.com/CIRFMF/ksef-docs/blob/main/faktury/schemy/FA/schemat_FA(3)_v1-0E.xsd) | 1-0E | FA |
    | [PEF (3)](https://github.com/CIRFMF/ksef-docs/blob/main/faktury/schemy/PEF/Schemat_PEF(3)_v2-1.xsd) | 2-1 | PEF |
    | [PEF_KOR (3)](https://github.com/CIRFMF/ksef-docs/blob/main/faktury/schemy/PEF/Schemat_PEF_KOR(3)_v2-1.xsd) | 2-1 | PEF |

    """
    encryption: EncryptionInfo
    """
    Symetryczny klucz szyfrujący pliki XML, zaszyfrowany kluczem publicznym Ministerstwa Finansów.
    """


class PartUploadRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    ordinalNumber: Annotated[int, Field(ge=1)]
    """
    Numer sekwencyjny części pliku paczki.
    """
    method: str
    """
    Metoda HTTP, której należy użyć przy wysyłce części pliku paczki.
    """
    url: AnyUrl
    """
    Adres pod który należy wysłać część pliku paczki.
    """
    headers: dict[str, str | None]
    """
    Nagłówki, których należy użyć przy wysyłce części pliku paczki.
    """


class PeppolProvider(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    id: Annotated[str, Field(max_length=9, min_length=9, pattern="^P[A-Z]{2}[0-9]{6}$")]
    """
    Identyfikator dostawcy usług Peppol.
    """
    name: Annotated[str, Field(max_length=256)]
    """
    Nazwa dostawcy usług Peppol.
    """
    dateCreated: AwareDatetime
    """
    Data rejestracji dostawcy usług Peppol w systemie.
    """


class PermissionState(StrEnum):
    Active = "Active"
    Inactive = "Inactive"


class PermissionsEuEntityDetails(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    fullName: Annotated[str, Field(max_length=100)]
    """
    Pełna nazwa podmiotu unijnego.
    """
    address: Annotated[str, Field(max_length=512)]
    """
    Adres podmiotu unijnego.
    """


class PermissionsSubjectEntityByFingerprintDetails(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    subjectDetailsType: EntitySubjectByFingerprintDetailsType
    """
    Typ danych podmiotu uprawnionego.
    | Wartość | Opis |
    | --- | --- |
    | EntityByFingerprint | Podmiot identyfikowany odciskiem palca pieczęci kwalifikowanej. |

    """
    fullName: Annotated[str, Field(max_length=100)]
    """
    Pełna nazwa podmiotu.
    """
    address: Annotated[str | None, Field(max_length=512)] = None
    """
    Adres podmiotu.
    """


class PermissionsSubjectEntityByIdentifierDetails(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    subjectDetailsType: EntitySubjectByIdentifierDetailsType
    """
    Typ danych podmiotu uprawnionego.
    | Wartość | Opis |
    | --- | --- |
    | EntityByIdentifier | Podmiot identyfikowany numerem NIP. |

    """
    fullName: Annotated[str, Field(max_length=100)]
    """
    Pełna nazwa podmiotu.
    """


class PermissionsSubjectEntityDetails(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    subjectDetailsType: EntitySubjectDetailsType
    """
    Typ danych podmiotu uprawnionego.
    | Wartość | Opis |
    | --- | --- |
    | EntityByIdentifier | Podmiot identyfikowany numerem NIP. |
    | EntityByFingerprint | Podmiot identyfikowany odciskiem palca pieczęci kwalifikowanej. |

    """
    fullName: Annotated[str, Field(max_length=100)]
    """
    Pełna nazwa podmiotu.
    """
    address: Annotated[str | None, Field(max_length=512)] = None
    """
    Adres podmiotu.
    """


class PersonByFingerprintWithoutIdentifierDetails(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    firstName: Annotated[str, Field(max_length=30, min_length=2)]
    """
    Imię osoby fizycznej.
    """
    lastName: Annotated[str, Field(max_length=81, min_length=2)]
    """
    Nazwisko osoby fizycznej.
    """
    birthDate: date
    """
    Data urodzenia osoby fizycznej.
    """
    idDocument: IdDocument
    """
    Dane dokumentu tożsamości osoby fizycznej.
    """


class PersonDetails(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    firstName: Annotated[str, Field(max_length=30, min_length=2)]
    """
    Imię osoby fizycznej.
    """
    lastName: Annotated[str, Field(max_length=81, min_length=2)]
    """
    Nazwisko osoby fizycznej.
    """


class PersonIdentifierType(StrEnum):
    """
    Typ identyfikatora osoby fizycznej.
    """

    Pesel = "Pesel"
    Nip = "Nip"


class PersonPermissionScope(StrEnum):
    CredentialsManage = "CredentialsManage"
    CredentialsRead = "CredentialsRead"
    InvoiceWrite = "InvoiceWrite"
    InvoiceRead = "InvoiceRead"
    Introspection = "Introspection"
    SubunitManage = "SubunitManage"
    EnforcementOperations = "EnforcementOperations"


class PersonPermissionSubjectDetailsType(StrEnum):
    """
    | Wartość | Opis |
    | --- | --- |
    | PersonByIdentifier | Osoba fizyczna posługująca się Profilem Zaufanym lub certyfikatem zawierającym identyfikator NIP lub PESEL. |
    | PersonByFingerprintWithIdentifier | Osoba fizyczna posługująca się certyfikatem niezawierającym identyfikatora NIP ani PESEL, ale mająca NIP lub PESEL. |
    | PersonByFingerprintWithoutIdentifier | Osoba fizyczna posługująca się certyfikatem niezawierającym identyfikatora NIP ani PESEL i niemająca NIP ani PESEL. |

    """

    PersonByIdentifier = "PersonByIdentifier"
    PersonByFingerprintWithIdentifier = "PersonByFingerprintWithIdentifier"
    PersonByFingerprintWithoutIdentifier = "PersonByFingerprintWithoutIdentifier"


class PersonPermissionsAuthorIdentifierType(StrEnum):
    Nip = "Nip"
    Pesel = "Pesel"
    Fingerprint = "Fingerprint"
    System = "System"


class PersonPermissionsContextIdentifierType(StrEnum):
    Nip = "Nip"
    InternalId = "InternalId"


class PersonPermissionsQueryType(StrEnum):
    PermissionsInCurrentContext = "PermissionsInCurrentContext"
    PermissionsGrantedInCurrentContext = "PermissionsGrantedInCurrentContext"


class PersonRemoveRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    nip: Annotated[
        str,
        Field(
            max_length=10, min_length=10, pattern="^[1-9]((\\d[1-9])|([1-9]\\d))\\d{7}$"
        ),
    ]
    """
    10 cyfrowy numer NIP.
    """


class PersonSubjectByFingerprintDetailsType(StrEnum):
    """
    | Wartość | Opis |
    | --- | --- |
    | PersonByFingerprintWithIdentifier | Osoba fizyczna posługująca się certyfikatem niezawierającym identyfikatora NIP ani PESEL, ale mająca NIP lub PESEL. |
    | PersonByFingerprintWithoutIdentifier | Osoba fizyczna posługująca się certyfikatem niezawierającym identyfikatora NIP ani PESEL i niemająca NIP ani PESEL. |

    """

    PersonByFingerprintWithIdentifier = "PersonByFingerprintWithIdentifier"
    PersonByFingerprintWithoutIdentifier = "PersonByFingerprintWithoutIdentifier"


class PersonalPermissionScope(StrEnum):
    CredentialsManage = "CredentialsManage"
    CredentialsRead = "CredentialsRead"
    InvoiceWrite = "InvoiceWrite"
    InvoiceRead = "InvoiceRead"
    Introspection = "Introspection"
    SubunitManage = "SubunitManage"
    EnforcementOperations = "EnforcementOperations"
    VatUeManage = "VatUeManage"


class PublicKeyCertificateUsage(StrEnum):
    """
    | Wartość | Opis |
    | --- | --- |
    | KsefTokenEncryption | Szyfrowanie tokenów KSeF przesyłanych w trakcie procesu uwierzytelniania. |
    | SymmetricKeyEncryption | Szyfrowanie klucza symetrycznego wykorzystywanego do szyfrowania przesyłanych faktur. |

    """

    KsefTokenEncryption = "KsefTokenEncryption"
    SymmetricKeyEncryption = "SymmetricKeyEncryption"


class QueryCertificatesRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    certificateSerialNumber: str | None = None
    """
    Numer seryjny certyfikatu. Wyszukiwanie odbywa się na zasadzie dokładnego dopasowania (exact match).
    """
    name: str | None = None
    """
    Nazwa własna certyfikatu. Wyszukiwanie jest częściowe, czyli zwracane są certyfikaty, których nazwa zawiera podany ciąg znaków (contains).
    """
    type: KsefCertificateType | None = None
    """
    Typ certyfikatu KSeF.
    | Wartość | Opis |
    | --- | --- |
    | Authentication | Certyfikat używany do uwierzytelnienia w systemie. |
    | Offline | Certyfikat używany wyłącznie do potwierdzania autentyczności wystawcy i integralności faktury w trybie offline |

    """
    status: CertificateListItemStatus | None = None
    """
    Status certyfikatu.
    | Wartość | Opis |
    | --- | --- |
    | Active | Certyfikat jest aktywny i może zostać użyty do uwierzytelnienia lub realizacji operacji w trybie offline (w zależności od typu certyfikatu). |
    | Blocked | Certyfikat został zablokowany i nie może zostać użyty do uwierzytelnienia i realizacji operacji w trybie offline.            Status przejściowy do czasu zakończenia procesu unieważniania. |
    | Revoked | Certyfikat został unieważniony i nie może zostać użyty do uwierzytelnienia i realizacji operacji w trybie offline. |
    | Expired | Certyfikat wygasł i nie może zostać użyty do uwierzytelnienia i realizacji operacji w trybie offline. |

    """
    expiresAfter: AwareDatetime | None = None
    """
    Filtruje certyfikaty, które wygasają po podanej dacie.
    """


class QueryPeppolProvidersResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    peppolProviders: list[PeppolProvider]
    """
    Lista dostawców usług Peppol.
    """
    hasMore: bool
    """
    Flaga informująca o dostępności kolejnej strony wyników.
    """


class QueryType(StrEnum):
    Granted = "Granted"
    Received = "Received"


class ReferenceNumber(RootModel[str]):
    root: Annotated[str, Field(max_length=36, min_length=36)]
    """
    Numer referencyjny.
    """


class RetrieveCertificatesListItem(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    certificate: Base64Str
    """
    Certyfikat w formacie DER, zakodowany w formacie Base64.
    """
    certificateName: str
    """
    Nazwa własna certyfikatu.
    """
    certificateSerialNumber: str
    """
    Numer seryjny certyfikatu.
    """
    certificateType: KsefCertificateType
    """
    Typ certyfikatu.
    | Wartość | Opis |
    | --- | --- |
    | Authentication | Certyfikat używany do uwierzytelnienia w systemie. |
    | Offline | Certyfikat używany wyłącznie do potwierdzania autentyczności wystawcy i integralności faktury w trybie offline |

    """


class RetrieveCertificatesRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    certificateSerialNumbers: Annotated[list[str], Field(max_length=10, min_length=1)]
    """
    Numery seryjne certyfikatów do pobrania.
    """


class RetrieveCertificatesResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    certificates: list[RetrieveCertificatesListItem]
    """
    Pobrane certyfikaty.
    """


class RetryAfter(RootModel[int]):
    root: Annotated[int, Field(examples=[30])]
    """
    Liczba sekund po których można ponowić żądanie.
    """


class RevokeCertificateRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    revocationReason: CertificateRevocationReason | None = None
    """
    Powód unieważnienia certyfikatu.
    | Wartość | Opis |
    | --- | --- |
    | Unspecified | Nieokreślony. |
    | Superseded | Certyfikat został zastąpiony przez inny. |
    | KeyCompromise | Klucz prywatny powiązany z certyfikatem został skompromitowany. |

    """


class SendInvoiceResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    referenceNumber: Annotated[str, Field(max_length=36, min_length=36)]
    """
    Numer referencyjny faktury.
    """


class SessionType(StrEnum):
    """
    | Wartość | Opis |
    | --- | --- |
    | Online | Wysyłka interaktywna (pojedyncze faktury). |
    | Batch | Wysyłka wsadowa (paczka faktur). |

    """

    Online = "Online"
    Batch = "Batch"


class SetRateLimitsRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    rateLimits: ApiRateLimitsOverride
    """
    Limity dla ilości żądań do API.
    """


class SetSessionLimitsRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    onlineSession: OnlineSessionContextLimitsOverride
    """
    Limity dla sesji interaktywnych.
    """
    batchSession: BatchSessionContextLimitsOverride
    """
    Limity dla sesji wsadowych.
    """


class SortOrder(StrEnum):
    """
    | Wartość | Opis |
    | --- | --- |
    | Asc | Sortowanie rosnąco. |
    | Desc | Sortowanie malejąco. |

    """

    Asc = "Asc"
    Desc = "Desc"


class StatusInfo(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    code: int
    """
    Kod statusu
    """
    description: Annotated[str, Field(min_length=1)]
    """
    Opis statusu
    """
    details: list[str] | None = None
    """
    Dodatkowe szczegóły statusu
    """


class SubjectRemoveRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    subjectNip: Annotated[
        str,
        Field(
            max_length=10, min_length=10, pattern="^[1-9]((\\d[1-9])|([1-9]\\d))\\d{7}$"
        ),
    ]
    """
    10 cyfrowy numer NIP.
    """


class SubjectType(StrEnum):
    EnforcementAuthority = "EnforcementAuthority"
    VatGroup = "VatGroup"
    JST = "JST"


class SubordinateEntityRoleType(StrEnum):
    LocalGovernmentSubUnit = "LocalGovernmentSubUnit"
    VatGroupSubUnit = "VatGroupSubUnit"


class Subunit(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    subjectNip: Annotated[
        str,
        Field(
            max_length=10, min_length=10, pattern="^[1-9]((\\d[1-9])|([1-9]\\d))\\d{7}$"
        ),
    ]
    """
    10 cyfrowy numer NIP.
    """
    description: Annotated[str, Field(max_length=256, min_length=5)]


class SubunitPermissionScope(StrEnum):
    CredentialsManage = "CredentialsManage"


class SubunitPermissionsContextIdentifierType(StrEnum):
    InternalId = "InternalId"
    Nip = "Nip"


class TestDataPermissionType(StrEnum):
    InvoiceRead = "InvoiceRead"
    InvoiceWrite = "InvoiceWrite"
    Introspection = "Introspection"
    CredentialsRead = "CredentialsRead"
    CredentialsManage = "CredentialsManage"
    EnforcementOperations = "EnforcementOperations"
    SubunitManage = "SubunitManage"


class ThirdSubjectIdentifierType(StrEnum):
    """
    | Wartość | Opis |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | InternalId | Identyfikator wewnętrzny, składający się z numeru NIP i 5 cyfr. |
    | VatUe | Identyfikator VAT UE podmiotu unijnego |
    | Other | Inny identyfikator |
    | None | Brak identyfikatora podmiotu trzeciego |

    """

    Nip = "Nip"
    InternalId = "InternalId"
    VatUe = "VatUe"
    Other = "Other"
    None_ = "None"


class TokenAuthorIdentifierType(StrEnum):
    """
    | Wartość | Opis |
    | --- | --- |
    | Nip | NIP. |
    | Pesel | PESEL. |
    | Fingerprint | Odcisk palca certyfikatu. |

    """

    Nip = "Nip"
    Pesel = "Pesel"
    Fingerprint = "Fingerprint"


class TokenAuthorIdentifierTypeIdentifier(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    type: TokenAuthorIdentifierType
    """
    Typ identyfikatora.
    | Wartość | Opis |
    | --- | --- |
    | Nip | NIP. |
    | Pesel | PESEL. |
    | Fingerprint | Odcisk palca certyfikatu. |

    """
    value: str
    """
    Wartość identyfikatora.
    """


class TokenContextIdentifierType(StrEnum):
    """
    | Wartość | Opis |
    | --- | --- |
    | Nip | NIP. |
    | InternalId | Identyfikator wewnętrzny. |
    | NipVatUe | Dwuczłonowy identyfikator składający się z numeru NIP i numeru VAT-UE: `{nip}-{vat_ue}`. |
    | PeppolId | Identyfikator dostawcy usług Peppol. |

    """

    Nip = "Nip"
    InternalId = "InternalId"
    NipVatUe = "NipVatUe"
    PeppolId = "PeppolId"


class TokenContextIdentifierTypeIdentifier(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    type: TokenContextIdentifierType
    """
    Typ identyfikatora.
    | Wartość | Opis |
    | --- | --- |
    | Nip | NIP. |
    | InternalId | Identyfikator wewnętrzny. |
    | NipVatUe | Dwuczłonowy identyfikator składający się z numeru NIP i numeru VAT-UE: `{nip}-{vat_ue}`. |
    | PeppolId | Identyfikator dostawcy usług Peppol. |

    """
    value: str
    """
    Wartość identyfikatora.
    """


class TokenInfo(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    token: str
    """
    Token w formacie JWT.
    """
    validUntil: AwareDatetime
    """
    Data ważności tokena.
    """


class TokenPermissionType(StrEnum):
    InvoiceRead = "InvoiceRead"
    InvoiceWrite = "InvoiceWrite"
    CredentialsRead = "CredentialsRead"
    CredentialsManage = "CredentialsManage"
    SubunitManage = "SubunitManage"
    EnforcementOperations = "EnforcementOperations"


class TokenStatusResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    referenceNumber: Annotated[str, Field(max_length=36, min_length=36)]
    """
    Numer referencyjny tokena KSeF.
    """
    authorIdentifier: TokenAuthorIdentifierTypeIdentifier
    """
    Identyfikator osoby która wygenerowała token.
    """
    contextIdentifier: TokenContextIdentifierTypeIdentifier
    """
    Identyfikator kontekstu, w którym został wygenerowany token i do którego daje dostęp.
    """
    description: Annotated[str, Field(max_length=256, min_length=5)]
    """
    Opis tokena.
    """
    requestedPermissions: list[TokenPermissionType]
    """
    Uprawnienia przypisane tokenowi.
    """
    dateCreated: AwareDatetime
    """
    Data i czas utworzenia tokena.
    """
    lastUseDate: AwareDatetime | None = None
    """
    Data ostatniego użycia tokena.
    """
    status: AuthenticationTokenStatus
    """
    Status tokena.
    | Wartość | Opis |
    | --- | --- |
    | Pending | Token został utworzony ale jest jeszcze w trakcie aktywacji i nadawania uprawnień. Nie może być jeszcze wykorzystywany do uwierzytelniania. |
    | Active | Token jest aktywny i może być wykorzystywany do uwierzytelniania. |
    | Revoking | Token jest w trakcie unieważniania. Nie może już być wykorzystywany do uwierzytelniania. |
    | Revoked | Token został unieważniony i nie może być wykorzystywany do uwierzytelniania. |
    | Failed | Nie udało się aktywować tokena. Należy wygenerować nowy token, obecny nie może być wykorzystywany do uwierzytelniania. |

    """
    statusDetails: list[str] | None = None
    """
    Dodatkowe informacje na temat statusu, zwracane w przypadku błędów.
    """


class Status(BaseModel):
    """
    Informacje o błędzie związanym z przekroczeniem limitu żądań.
    """

    code: int
    """
    Kod statusu HTTP odpowiadający błędowi. Zawsze ma wartość 429.
    """
    description: str
    """
    Opis błędu zgodny z nazwą statusu HTTP.
    """
    details: list[str]
    """
    Lista szczegółowych informacji opisujących przyczynę przekroczenia limitu żądań oraz wskazówki dotyczące ponowienia żądania.
    """


class TooManyRequestsResponse(BaseModel):
    status: Status
    """
    Informacje o błędzie związanym z przekroczeniem limitu żądań.
    """


class UpoPageResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    referenceNumber: Annotated[str, Field(max_length=36, min_length=36)]
    """
    Numer referencyjny strony UPO.
    """
    downloadUrl: AnyUrl
    """
    Adres do pobrania strony UPO. Link generowany jest przy każdym odpytaniu o status. 
    Dostęp odbywa się metodą `HTTP GET` i <b>nie należy</b> wysyłać tokenu dostępowego. 
    Link nie podlega limitom API i wygasa po określonym czasie w `DownloadUrlExpirationDate`.

    Odpowiedź HTTP zawiera dodatkowe nagłówki:
    - `x-ms-meta-hash` – skrót SHA-256 dokumentu UPO, zakodowany w formacie Base64.
    """
    downloadUrlExpirationDate: AwareDatetime
    """
    Data i godzina wygaśnięcia adresu. Po tej dacie link `DownloadUrl` nie będzie już aktywny.
    """


class UpoResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    pages: list[UpoPageResponse]
    """
    Lista stron UPO.
    """


class AttachmentPermissionGrantRequest(PersonRemoveRequest):
    pass


class AttachmentPermissionRevokeRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    nip: Annotated[
        str,
        Field(
            max_length=10, min_length=10, pattern="^[1-9]((\\d[1-9])|([1-9]\\d))\\d{7}$"
        ),
    ]
    """
    10 cyfrowy numer NIP.
    """
    expectedEndDate: date | None = None
    """
    Data wycofania zgody na przesyłanie faktur z załącznikiem.
    """


class AuthenticationChallengeResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    challenge: Annotated[str, Field(max_length=36, min_length=36)]
    """
    Unikalny challenge.
    """
    timestamp: AwareDatetime
    """
    Czas wygenerowania challenge-a.
    """
    timestampMs: int
    """
    Czas wygenerowania challenge-a w milisekundach od 1 stycznia 1970 roku (Unix timestamp).
    """


class AuthenticationContextIdentifier(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    type: AuthenticationContextIdentifierType
    """
    Typ identyfikatora
    """
    value: str
    """
    Wartość identyfikatora
    """


class AuthenticationInitResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    referenceNumber: Annotated[str, Field(max_length=36, min_length=36)]
    """
    Numer referencyjny sesji uwierzytelnienia.
    """
    authenticationToken: TokenInfo
    """
    Token operacji uwierzytelnienia.
    """


class AuthenticationListItem(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    startDate: AwareDatetime
    """
    Data rozpoczęcia operacji uwierzytelnienia.
    """
    authenticationMethod: Annotated[AuthenticationMethod, Field(deprecated=True)]
    """
    Metoda uwierzytelnienia.
    | Wartość | Opis |
    | --- | --- |
    | Token | Token KSeF. |
    | TrustedProfile | Profil Zaufany. |
    | InternalCertificate | Certyfikat KSeF. |
    | QualifiedSignature | Podpis kwalifikowany. |
    | QualifiedSeal | Pieczęć kwalifikowana. |
    | PersonalSignature | Podpis osobisty. |
    | PeppolSignature | Podpis dostawcy usług Peppol. |

    """
    authenticationMethodInfo: AuthenticationMethodInfo
    """
    Użyta metoda uwierzytelnienia.
    """
    status: StatusInfo
    """
    Informacje o aktualnym statusie.
    | Code | Description | Details |
    | --- | --- | --- |
    | 100 | Uwierzytelnianie w toku | - |
    | 200 | Uwierzytelnianie zakończone sukcesem | - |
    | 415 | Uwierzytelnianie zakończone niepowodzeniem | Brak przypisanych uprawnień |
    | 425 | Uwierzytelnienie unieważnione  | Uwierzytelnienie i powiązane refresh tokeny zostały unieważnione przez użytkownika |
    | 450 | Uwierzytelnianie zakończone niepowodzeniem z powodu błędnego tokenu | Nieprawidłowe wyzwanie autoryzacyjne |
    | 450 | Uwierzytelnianie zakończone niepowodzeniem z powodu błędnego tokenu | Nieprawidłowy token |
    | 450 | Uwierzytelnianie zakończone niepowodzeniem z powodu błędnego tokenu | Nieprawidłowy czas tokena |
    | 450 | Uwierzytelnianie zakończone niepowodzeniem z powodu błędnego tokenu | Token unieważniony |
    | 450 | Uwierzytelnianie zakończone niepowodzeniem z powodu błędnego tokenu | Token nieaktywny |
    | 460 | Uwierzytelnianie zakończone niepowodzeniem z powodu błędu certyfikatu | Nieważny certyfikat |
    | 460 | Uwierzytelnianie zakończone niepowodzeniem z powodu błędu certyfikatu | Błąd weryfikacji łańcucha certyfikatów |
    | 460 | Uwierzytelnianie zakończone niepowodzeniem z powodu błędu certyfikatu | Niezaufany łańcuch certyfikatów |
    | 460 | Uwierzytelnianie zakończone niepowodzeniem z powodu błędu certyfikatu | Certyfikat odwołany |
    | 460 | Uwierzytelnianie zakończone niepowodzeniem z powodu błędu certyfikatu | Certyfikat zawieszony |
    | 460 | Uwierzytelnianie zakończone niepowodzeniem z powodu błędu certyfikatu | Niepoprawny certyfikat |
    | 470 | Uwierzytelnianie zakończone niepowodzeniem | Próba wykorzystania metod autoryzacyjnych osoby zmarłej |
    | 480 | Uwierzytelnienie zablokowane | Podejrzenie incydentu bezpieczeństwa. Skontaktuj się z Ministerstwem Finansów przez formularz zgłoszeniowy. |
    | 500 | Nieznany błąd | - |
    | 550 | Operacja została anulowana przez system | Przetwarzanie zostało przerwane z przyczyn wewnętrznych systemu. Spróbuj ponownie |
    """
    isTokenRedeemed: bool | None = None
    """
    Czy został już wydany refresh token powiązany z danym uwierzytelnieniem.
    """
    lastTokenRefreshDate: AwareDatetime | None = None
    """
    Data ostatniego odświeżenia tokena.
    """
    refreshTokenValidUntil: AwareDatetime | None = None
    """
    Termin ważności refresh tokena (o ile nie zostanie wcześniej unieważniony).
    """
    referenceNumber: Annotated[str, Field(max_length=36, min_length=36)]
    """
    Numer referencyjny sesji uwierzytelnienia.
    """
    isCurrent: bool | None = None
    """
    Czy sesja jest powiązana z aktualnie używanym tokenem.
    """


class AuthenticationListResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    continuationToken: str | None = None
    """
    Token służący do pobrania kolejnej strony wyników. Jeśli jest pusty, to nie ma kolejnych stron.
    """
    items: list[AuthenticationListItem]
    """
    Lista sesji uwierzytelniania.
    """


class AuthenticationOperationStatusResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    startDate: AwareDatetime
    """
    Data rozpoczęcia operacji uwierzytelnienia.
    """
    authenticationMethod: Annotated[AuthenticationMethod, Field(deprecated=True)]
    """
    Metoda uwierzytelnienia.
    | Wartość | Opis |
    | --- | --- |
    | Token | Token KSeF. |
    | TrustedProfile | Profil Zaufany. |
    | InternalCertificate | Certyfikat KSeF. |
    | QualifiedSignature | Podpis kwalifikowany. |
    | QualifiedSeal | Pieczęć kwalifikowana. |
    | PersonalSignature | Podpis osobisty. |
    | PeppolSignature | Podpis dostawcy usług Peppol. |

    """
    authenticationMethodInfo: AuthenticationMethodInfo
    """
    Użyta metoda uwierzytelnienia.
    """
    status: StatusInfo
    """
    Informacje o aktualnym statusie.
    | Code | Description | Details |
    | --- | --- | --- |
    | 100 | Uwierzytelnianie w toku | - |
    | 200 | Uwierzytelnianie zakończone sukcesem | - |
    | 415 | Uwierzytelnianie zakończone niepowodzeniem | Brak przypisanych uprawnień |
    | 425 | Uwierzytelnienie unieważnione  | Uwierzytelnienie i powiązane refresh tokeny zostały unieważnione przez użytkownika |
    | 450 | Uwierzytelnianie zakończone niepowodzeniem z powodu błędnego tokenu | Nieprawidłowe wyzwanie autoryzacyjne |
    | 450 | Uwierzytelnianie zakończone niepowodzeniem z powodu błędnego tokenu | Nieprawidłowy token |
    | 450 | Uwierzytelnianie zakończone niepowodzeniem z powodu błędnego tokenu | Nieprawidłowy czas tokena |
    | 450 | Uwierzytelnianie zakończone niepowodzeniem z powodu błędnego tokenu | Token unieważniony |
    | 450 | Uwierzytelnianie zakończone niepowodzeniem z powodu błędnego tokenu | Token nieaktywny |
    | 460 | Uwierzytelnianie zakończone niepowodzeniem z powodu błędu certyfikatu | Nieważny certyfikat |
    | 460 | Uwierzytelnianie zakończone niepowodzeniem z powodu błędu certyfikatu | Błąd weryfikacji łańcucha certyfikatów |
    | 460 | Uwierzytelnianie zakończone niepowodzeniem z powodu błędu certyfikatu | Niezaufany łańcuch certyfikatów |
    | 460 | Uwierzytelnianie zakończone niepowodzeniem z powodu błędu certyfikatu | Certyfikat odwołany |
    | 460 | Uwierzytelnianie zakończone niepowodzeniem z powodu błędu certyfikatu | Certyfikat zawieszony |
    | 460 | Uwierzytelnianie zakończone niepowodzeniem z powodu błędu certyfikatu | Niepoprawny certyfikat |
    | 470 | Uwierzytelnianie zakończone niepowodzeniem | Próba wykorzystania metod autoryzacyjnych osoby zmarłej |
    | 480 | Uwierzytelnienie zablokowane | Podejrzenie incydentu bezpieczeństwa. Skontaktuj się z Ministerstwem Finansów przez formularz zgłoszeniowy. |
    | 500 | Nieznany błąd | - |
    | 550 | Operacja została anulowana przez system | Przetwarzanie zostało przerwane z przyczyn wewnętrznych systemu. Spróbuj ponownie |
    """
    isTokenRedeemed: bool | None = None
    """
    Czy został już wydany refresh token powiązany z danym uwierzytelnieniem.
    """
    lastTokenRefreshDate: AwareDatetime | None = None
    """
    Data ostatniego odświeżenia tokena.
    """
    refreshTokenValidUntil: AwareDatetime | None = None
    """
    Termin ważności refresh tokena (o ile nie zostanie wcześniej unieważniony).
    """


class AuthenticationTokenRefreshResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    accessToken: TokenInfo
    """
    Token dostępu, którego należy używać w wywołaniach chronionych zasobów API.
    """


class AuthenticationTokensResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    accessToken: TokenInfo
    """
    Token dostępu.
    """
    refreshToken: TokenInfo
    """
    Token umożliwiający odświeżenie tokenu dostępu.
    > Więcej informacji:
    > - [Odświeżanie tokena](https://github.com/CIRFMF/ksef-docs/blob/main/uwierzytelnianie.md#5-od%C5%9Bwie%C5%BCenie-tokena-dost%C4%99powego-accesstoken)
    """


class BatchFilePartInfo(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    ordinalNumber: Annotated[int, Field(ge=1)]
    """
    Numer sekwencyjny części pliku paczki.
    """
    fileSize: Annotated[int, Field(ge=1)]
    """
    Rozmiar zaszyfrowanej części pliku paczki w bajtach.
    """
    fileHash: Annotated[Base64Str, Field(max_length=44, min_length=44)]
    """
    Skrót SHA256 zaszyfrowanej części pliku paczki, zakodowany w formacie Base64.
    """


class CertificateEnrollmentStatusResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    requestDate: AwareDatetime
    """
    Data złożenia wniosku certyfikacyjnego.
    """
    status: StatusInfo
    """
    Informacje o aktualnym statusie.
    | Code | Description | Details |
    | --- | --- | --- |
    | 100 | Wniosek przyjęty do realizacji | - |
    | 200 | Wniosek obsłużony (certyfikat wygenerowany) | - |
    | 400 | Wniosek odrzucony | Klucz publiczny został już certyfikowany przez inny podmiot. |
    | 400 | Wniosek odrzucony | Osiągnięto dopuszczalny limit posiadanych certyfikatów. |
    | 500 | Nieznany błąd | - |
    | 550 | Operacja została anulowana przez system | Przetwarzanie zostało przerwane z przyczyn wewnętrznych systemu. Spróbuj ponownie |
    """
    certificateSerialNumber: str | None = None
    """
    Numer seryjny wygenerowanego certyfikatu (w formacie szesnastkowym). 
    Zwracany w przypadku prawidłowego przeprocesowania wniosku certyfikacyjnego.
    """


class CertificateSubjectIdentifier(BaseModel):
    """
    Identyfikator podmiotu dla którego wystawiono certyfikat.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | Pesel | 11 cyfrowy numer PESEL |
    | Fingerprint | Odcisk palca certyfikatu |
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: CertificateSubjectIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str, Field(max_length=64, min_length=10)]
    """
    Wartość identyfikatora.
    """


class EffectiveContextLimits(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    onlineSession: OnlineSessionEffectiveContextLimits
    """
    Limity dla sesji interaktywnych.
    """
    batchSession: BatchSessionEffectiveContextLimits
    """
    Limity dla sesji wsadowych.
    """


class EffectiveSubjectLimits(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    enrollment: EnrollmentEffectiveSubjectLimits | None = None
    certificate: CertificateEffectiveSubjectLimits | None = None


class EnrollCertificateRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    certificateName: Annotated[
        str,
        Field(
            max_length=100,
            min_length=5,
            pattern="^[a-zA-Z0-9_\\-\\ ąćęłńóśźżĄĆĘŁŃÓŚŹŻ]+$",
        ),
    ]
    """
    Nazwa własna certyfikatu.
    """
    certificateType: KsefCertificateType
    """
    Typ certyfikatu.
    | Wartość | Opis |
    | --- | --- |
    | Authentication | Certyfikat używany do uwierzytelnienia w systemie. |
    | Offline | Certyfikat używany wyłącznie do potwierdzania autentyczności wystawcy i integralności faktury w trybie offline |

    """
    csr: Base64Str
    """
    Wniosek certyfikacyjny PKCS#10 (CSR) w formacie DER, zakodowany w formacie Base64.
    """
    validFrom: AwareDatetime | None = None
    """
    Data rozpoczęcia ważności certyfikatu.
    Jeśli nie zostanie podana, certyfikat będzie ważny od momentu jego wystawienia.
    """


class EnrollCertificateResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    referenceNumber: Annotated[str, Field(max_length=36, min_length=36)]
    """
    Numer referencyjny wniosku certyfikacyjnego.
    """
    timestamp: AwareDatetime
    """
    Data złożenia wniosku certyfikacyjnego.
    """


class EntityAuthorizationPermissionsSubjectIdentifier(BaseModel):
    """
    Identyfikator podmiotu uprawnianego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | PeppolId | Identyfikator dostawcy usług Peppol |
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: EntityAuthorizationPermissionsSubjectIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str, Field(max_length=10, min_length=9)]
    """
    Wartość identyfikatora.
    """


class EntityAuthorizationsAuthorIdentifier(BaseModel):
    """
    Identyfikator osoby nadającej uprawnienie.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | Pesel | 11 cyfrowy numer PESEL |
    | Fingerprint | Odcisk palca certyfikatu |
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: CertificateSubjectIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str, Field(max_length=64, min_length=10)]
    """
    Wartość identyfikatora.
    """


class EntityAuthorizationsAuthorizedEntityIdentifier(BaseModel):
    """
    Identyfikator podmiotu uprawnionego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | PeppolId | Identyfikator dostawcy usług Peppol |
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: EntityAuthorizationPermissionsSubjectIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str, Field(max_length=10, min_length=9)]
    """
    Wartość identyfikatora.
    """


class EntityAuthorizationsAuthorizingEntityIdentifier(BaseModel):
    """
    Identyfikator podmiotu uprawniającego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: EntityAuthorizationsAuthorizingEntityIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str, Field(max_length=10, min_length=10)]
    """
    Wartość identyfikatora.
    """


class EntityPermission(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    type: EntityPermissionType
    """
    Rodzaj uprawnienia.
    """
    canDelegate: bool | None = None
    """
    Flaga pozwalająca na pośrednie przekazywanie danego uprawnienia
    """


class EntityPermissionsSubjectIdentifier(BaseModel):
    """
    Identyfikator podmiotu.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: EntityAuthorizationsAuthorizingEntityIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str, Field(max_length=10, min_length=10)]
    """
    Wartość identyfikatora.
    """


class EntityPermissionsSubordinateEntityIdentifier(BaseModel):
    """
    Identyfikator podmiotu podrzędnego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: EntityAuthorizationsAuthorizingEntityIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str, Field(max_length=10, min_length=10)]
    """
    Wartość identyfikatora.
    """


class EntityRolesParentEntityIdentifier(BaseModel):
    """
    Identyfikator podmiotu nadrzędnego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: EntityAuthorizationsAuthorizingEntityIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str, Field(max_length=10, min_length=10)]
    """
    Wartość identyfikatora.
    """


class EuEntityAdministrationPermissionsContextIdentifier(BaseModel):
    """
    Identyfikator kontekstu złożonego.
    | Type | Value |
    | --- | --- |
    | NipVatUe | Dwuczłonowy identyfikator składający się z numeru NIP i numeru VAT-UE: `{nip}-{vat_ue}` |
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: EuEntityAdministrationPermissionsContextIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str, Field(max_length=25, min_length=15)]
    """
    Wartość identyfikatora.
    """


class EuEntityAdministrationPermissionsSubjectIdentifier(BaseModel):
    """
    Identyfikator podmiotu uprawnionego.
    | Type | Value |
    | --- | --- |
    | Fingerprint | Odcisk palca certyfikatu |
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: EuEntityAdministrationPermissionsSubjectIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str, Field(max_length=64, min_length=64)]
    """
    Wartość identyfikatora.
    """


class EuEntityPermissionsAuthorIdentifier(BaseModel):
    """
    Identyfikator uprawniającego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | Pesel | 11 cyfrowy numer PESEL |
    | Fingerprint | Odcisk palca certyfikatu |
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: CertificateSubjectIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str, Field(max_length=64, min_length=10)]
    """
    Wartość identyfikatora.
    """


class EuEntityPermissionsSubjectIdentifier(BaseModel):
    """
    Identyfikator podmiotu uprawnianego.
    | Type | Value |
    | --- | --- |
    | Fingerprint | Odcisk palca certyfikatu |
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: EuEntityAdministrationPermissionsSubjectIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str, Field(max_length=64, min_length=64)]
    """
    Wartość identyfikatora.
    """


class ExceptionInfo(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    exceptionDetailList: list[ExceptionDetails] | None = None
    referenceNumber: Annotated[str | None, Field(max_length=36, min_length=36)] = None
    """
    Numer referencyjny.
    """
    serviceCode: str | None = None
    serviceCtx: str | None = None
    serviceName: str | None = None
    timestamp: AwareDatetime | None = None


class ExceptionResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    exception: ExceptionInfo | None = None


class ExportInvoicesResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    referenceNumber: Annotated[str, Field(max_length=36, min_length=36)]
    """
    Numer referencyjny eksportu faktur.
    """


class GenerateTokenRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    permissions: list[TokenPermissionType]
    """
    Uprawnienia przypisane tokenowi.
    """
    description: Annotated[str, Field(max_length=256, min_length=5)]
    """
    Opis tokena.
    """


class GenerateTokenResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    referenceNumber: Annotated[str, Field(max_length=36, min_length=36)]
    """
    Numer referencyjny tokena KSeF.
    """
    token: Annotated[str, Field(max_length=160)]
    """
    Token KSeF.
    """


class IndirectPermissionsSubjectIdentifier(BaseModel):
    """
    Identyfikator osoby fizycznej.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | Pesel | 11 cyfrowy numer PESEL |
    | Fingerprint | Odcisk palca certyfikatu |
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: CertificateSubjectIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str, Field(max_length=64, min_length=10)]
    """
    Wartość identyfikatora.
    """


class IndirectPermissionsTargetIdentifier(BaseModel):
    """
    Identyfikator kontekstu klienta. Nie przekazanie identyfikatora oznacza, że uprawnienie nadane w sposób pośredni jest typu generalnego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | AllPartners | Identyfikator oznaczający, że uprawnienie nadane w sposób pośredni jest typu generalnego |
    | InternalId | Dwuczłonowy identyfikator składający się z numeru NIP i 5 cyfr: `{nip}-{5_cyfr}` |
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: IndirectPermissionsTargetIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str | None, Field(max_length=16, min_length=10)] = None
    """
    Wartość identyfikatora. W przypadku typu AllPartners należy pozostawić puste. W pozostałych przypadkach pole jest wymagane.
    """


class InitTokenAuthenticationRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    challenge: Annotated[str, Field(max_length=36, min_length=36)]
    """
    Wygenerowany wcześniej challenge.
    """
    contextIdentifier: AuthenticationContextIdentifier
    """
    Identyfikator kontekstu do którego następuje uwierzytelnienie.
    """
    encryptedToken: Base64Str
    """
    Zaszyfrowany token wraz z timestampem z challenge'a, w postaci `token|timestamp`, zakodowany w formacie Base64.
    """
    authorizationPolicy: AuthorizationPolicy | None = None
    """
    Polityka autoryzacji żądań przy każdym użyciu tokena dostępu.
    """


class InvoiceMetadataAuthorizedSubject(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    nip: Annotated[
        str,
        Field(
            max_length=10, min_length=10, pattern="^[1-9]((\\d[1-9])|([1-9]\\d))\\d{7}$"
        ),
    ]
    """
    Nip podmiotu upoważnionego
    """
    name: Annotated[str | None, Field(max_length=512)] = None
    """
    Nazwa podmiotu upoważnionego.
    """
    role: int
    """
    Rola podmiotu upoważnionego.
    | Wartość | Opis |
    | ---- | --- |
    | 1 | Organ egzekucyjny - w przypadku, o którym mowa w art. 106c pkt 1 ustawy |
    | 2 | Komornik sądowy - w przypadku, o którym mowa w art. 106c pkt 2 ustawy |
    | 3 | Przedstawiciel podatkowy - w przypadku gdy na fakturze występują dane przedstawiciela podatkowego, o którym mowa w art. 18a - 18d ustawy |
    """


class InvoiceMetadataBuyer(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    identifier: InvoiceMetadataBuyerIdentifier
    """
    Identyfikator nabywcy.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | VatUe | Identyfikator VAT UE podmiotu unijnego |
    | Other | Inny identyfikator|
    | None  | Brak identyfikatora nabywcy |
    """
    name: Annotated[str | None, Field(max_length=512)] = None
    """
    Nazwa nabywcy.
    """


class InvoiceMetadataSeller(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    nip: Annotated[
        str,
        Field(
            max_length=10, min_length=10, pattern="^[1-9]((\\d[1-9])|([1-9]\\d))\\d{7}$"
        ),
    ]
    """
    Nip sprzedawcy.
    """
    name: Annotated[str | None, Field(max_length=512)] = None
    """
    Nazwa sprzedawcy.
    """


class InvoiceMetadataThirdSubjectIdentifier(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    type: ThirdSubjectIdentifierType
    """
    Typ identyfikatora podmiotu trzeciego.
    | Wartość | Opis |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | InternalId | Identyfikator wewnętrzny, składający się z numeru NIP i 5 cyfr. |
    | VatUe | Identyfikator VAT UE podmiotu unijnego |
    | Other | Inny identyfikator |
    | None | Brak identyfikatora podmiotu trzeciego |

    """
    value: Annotated[str | None, Field(max_length=50)] = None
    """
    Wartość identyfikatora podmiotu trzeciego.
    """


class InvoicePackagePart(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    ordinalNumber: Annotated[int, Field(ge=1)]
    """
    Numer sekwencyjny pliku części paczki.
    """
    partName: Annotated[str, Field(max_length=100)]
    """
    Nazwa pliku części paczki.
    """
    method: str
    """
    Metoda HTTP, której należy użyć przy pobieraniu pliku.
    """
    url: AnyUrl
    """
    Adres URL, pod który należy wysłać żądanie pobrania części paczki.
    Link jest generowany dynamicznie w momencie odpytania o status operacji eksportu.
    Nie podlega limitom API i nie wymaga przesyłania tokenu dostępowego przy pobraniu.

    Odpowiedź HTTP zawiera dodatkowe nagłówki:
    - `x-ms-meta-hash` – zaszyfrowanej części paczki, zakodowany w formacie Base64.
    """
    partSize: Annotated[int, Field(ge=1)]
    """
    Rozmiar części paczki w bajtach.
    """
    partHash: Annotated[Base64Str, Field(max_length=44, min_length=44)]
    """
    Skrót SHA256 pliku części paczki, zakodowany w formacie Base64.
    """
    encryptedPartSize: Annotated[int, Field(ge=1)]
    """
    Rozmiar zaszyfrowanej części paczki w bajtach.
    """
    encryptedPartHash: Annotated[Base64Str, Field(max_length=44, min_length=44)]
    """
    Skrót SHA256 zaszyfrowanej części paczki, zakodowany w formacie Base64.
    """
    expirationDate: AwareDatetime
    """
    Data i godzina wygaśnięcia linku umożliwiającego pobranie części paczki.
    Po upływie tego momentu link przestaje być aktywny.
    """


class InvoiceQueryDateRange(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    dateType: InvoiceQueryDateType
    """
    Typ daty, według której ma być zastosowany zakres.
    | Wartość | Opis |
    | --- | --- |
    | Issue | Data wystawienia faktury. |
    | Invoicing | Data przyjęcia faktury w systemie KSeF (do dalszego przetwarzania). |
    | PermanentStorage | Data trwałego zapisu faktury w repozytorium systemu KSeF. |

    """
    from_: Annotated[AwareDatetime, Field(alias="from")]
    """
    Data początkowa zakresu w formacie ISO-8601 np. 2026-01-03T13:45:00+00:00.
    """
    to: AwareDatetime | None = None
    """
    Data końcowa zakresu w formacie ISO-8601. Jeśli nie zostanie podana, przyjmowana jest bieżąca data i czas w UTC.
    """
    restrictToPermanentStorageHwmDate: bool | None = None
    """
    Określa, czy system ma ograniczyć filtrowanie (zakres dateRange.to) do wartości `PermanentStorageHwmDate`.

    * Dotyczy wyłącznie zapytań z `dateType = PermanentStorage`,  
    * Gdy `true`, system ogranicza filtrowanie tak, aby wartość `dateRange.to` nie przekraczała wartości `PermanentStorageHwmDate`,  
    * Gdy `null` lub `false`, filtrowanie może wykraczać poza `PermanentStorageHwmDate`.
    """


class InvoiceQueryFilters(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    subjectType: InvoiceQuerySubjectType
    """
    Typ podmiotu, którego dotyczą kryteria filtrowania metadanych faktur.
    Określa kontekst, w jakim przeszukiwane są dane.
    | Wartość | Opis |
    | --- | --- |
    | Subject1 | Podmiot 1 - sprzedawca |
    | Subject2 | Podmiot 2 - nabywca |
    | Subject3 | Podmiot 3 |
    | SubjectAuthorized | Podmiot upoważniony |

    """
    dateRange: InvoiceQueryDateRange
    """
    Typ i zakres dat, według którego filtrowane są faktury.
    Maksymalny dozwolony okres wynosi 3 miesiące w strefie UTC lub w strefie Europe/Warsaw (WAW).
                
    Format daty:
     * Daty muszą być przekazane w formacie ISO 8601, np. `yyyy-MM-ddTHH:mm:ss`.
     * Dopuszczalne są następujące warianty:
       - z sufiksem `Z` (czas UTC),
       - z jawnym offsetem, np. `+01:00`, `+03:00`,
       - bez offsetu (interpretowane jako czas lokalny strefy Europe/Warsaw).
    """
    ksefNumber: Annotated[
        str | None,
        Field(
            max_length=36,
            min_length=35,
            pattern="^([1-9](\\d[1-9]|[1-9]\\d)\\d{7})-(20[2-9][0-9]|2[1-9]\\d{2}|[3-9]\\d{3})(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])-([0-9A-F]{6})-?([0-9A-F]{6})-([0-9A-F]{2})$",
        ),
    ] = None
    """
    Numer KSeF faktury (exact match).
    """
    invoiceNumber: Annotated[str | None, Field(max_length=256)] = None
    """
    Numer faktury nadany przez wystawcę (exact match).
    """
    amount: InvoiceQueryAmount | None = None
    """
    Filtr kwotowy – brutto, netto lub VAT (z wartością).
    """
    sellerNip: Annotated[
        str | None,
        Field(
            max_length=10, min_length=10, pattern="^[1-9]((\\d[1-9])|([1-9]\\d))\\d{7}$"
        ),
    ] = None
    """
    Nip sprzedawcy (exact match).
    """
    buyerIdentifier: InvoiceQueryBuyerIdentifier | None = None
    """
    Identyfikator nabywcy.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | VatUe | Identyfikator VAT UE podmiotu unijnego. |
    | Other | Inny identyfikator|
    | None  | Brak identyfikatora nabywcy |
    """
    currencyCodes: list[CurrencyCode] | None = None
    """
    Kody walut.
    """
    invoicingMode: InvoicingMode | None = None
    """
    Tryb wystawienia faktury: online lub offline.
    """
    isSelfInvoicing: bool | None = None
    """
    Czy faktura została wystawiona w trybie samofakturowania.
    """
    formType: InvoiceQueryFormType | None = None
    """
    Typ dokumentu.
    | Wartość | Opis |
    | --- | --- |
    | FA | Faktura VAT |
    | PEF | Faktura PEF |
    | RR | Faktura RR |

    """
    invoiceTypes: list[InvoiceType] | None = None
    """
    Rodzaje faktur.
    | Wartość | Opis |
    | --- | --- |
    | Vat | (FA) Podstawowa |
    | Zal | (FA) Zaliczkowa |
    | Kor | (FA) Korygująca |
    | Roz | (FA) Rozliczeniowa |
    | Upr | (FA) Uproszczona |
    | KorZal | (FA) Korygująca fakturę zaliczkową |
    | KorRoz | (FA) Korygująca fakturę rozliczeniową |
    | VatPef | (PEF) Podstawowa |
    | VatPefSp | (PEF) Specjalizowana |
    | KorPef | (PEF) Korygująca |
    | VatRr | (RR) Podstawowa |
    | KorVatRr | (RR) Korygująca |

    """
    hasAttachment: bool | None = None
    """
    Czy faktura ma załącznik.
    """


class OpenBatchSessionResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    referenceNumber: Annotated[str, Field(max_length=36, min_length=36)]
    """
    Numer referencyjny sesji.
    """
    partUploadRequests: list[PartUploadRequest]
    """
    Dane wymagane do poprawnego przesłania poszczególnych części pliku paczki faktur.

    Każdą część pliku paczki zadeklarowaną w <b>fileParts</b> należy przesłać zgodnie z odpowiadającym jej obiektem w <b>partUploadRequests</b>.
    Łącznikiem pomiędzy deklaracją a instrukcją wysyłki jest pole <b>ordinalNumber</b>.

    Dla każdej części należy:
    * zastosować metodę HTTP wskazaną w <b>method</b>,
    * ustawić adres z <b>url</b>,
    * dołączyć nagłówki z <b>headers</b>,
    * dołączyć treść części pliku w korpusie żądania.

    `Uwaga: nie należy dodawać do nagłówków token dostępu (accessToken).`
     
    Każdą część przesyła się oddzielnym żądaniem HTTP.Zwracane kody odpowiedzi:
     * <b>201</b> – poprawne przyjęcie pliku,
     * <b>400</b> – błędne dane,
     * <b>401</b> – nieprawidłowe uwierzytelnienie,
     * <b>403</b> – brak uprawnień do zapisu (np.upłynął czas na zapis).
    """


class OpenOnlineSessionResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    referenceNumber: Annotated[str, Field(max_length=36, min_length=36)]
    """
    Numer referencyjny sesji.
    """
    validUntil: AwareDatetime
    """
    Termin ważności sesji. Po jego upływie sesja zostanie automatycznie zamknięta.
    """


class PermissionsOperationResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    referenceNumber: Annotated[str, Field(max_length=36, min_length=36)]
    """
    Numer referencyjny operacji nadania lub odbierania uprawnień.
    """


class PermissionsOperationStatusResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    status: StatusInfo
    """
    Informacje o aktualnym statusie.
    | Code | Description | Details |
    | --- | --- | --- |
    | 100 | Operacja przyjęta do realizacji | - |
    | 200 | Operacja zakończona sukcesem | - |
    | 400 | Operacja zakończona niepowodzeniem | - |
    | 410 | Podane identyfikatory są niezgodne lub pozostają w niewłaściwej relacji | - |
    | 420 | Użyte poświadczenia nie mają uprawnień do wykonania tej operacji | - |
    | 430 | Kontekst identyfikatora nie odpowiada wymaganej roli lub uprawnieniom | - |
    | 440 | Operacja niedozwolona dla wskazanych powiązań identyfikatorów | - |
    | 450 | Operacja niedozwolona dla wskazanego identyfikatora lub jego typu | - |
    | 500 | Nieznany błąd | - |
    | 550 | Operacja została anulowana przez system | Przetwarzanie zostało przerwane z przyczyn wewnętrznych systemu. Spróbuj ponownie później. |
    """


class PersonCreateRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    nip: Annotated[
        str,
        Field(
            max_length=10, min_length=10, pattern="^[1-9]((\\d[1-9])|([1-9]\\d))\\d{7}$"
        ),
    ]
    """
    10 cyfrowy numer NIP.
    """
    pesel: Annotated[
        str,
        Field(
            max_length=11,
            min_length=11,
            pattern="^\\d{2}(?:0[1-9]|1[0-2]|2[1-9]|3[0-2]|4[1-9]|5[0-2]|6[1-9]|7[0-2]|8[1-9]|9[0-2])\\d{7}$",
        ),
    ]
    """
    11 cyfrowy numer PESEL.
    """
    isBailiff: bool
    description: Annotated[str, Field(max_length=256, min_length=5)]
    isDeceased: bool | None = None
    createdDate: AwareDatetime | None = None
    """
    W przypadku wielokrotnego tworzenia danych testowych z tym samym identyfikatorem nie można podawać daty wcześniejszej ani takiej samej jak poprzednia.
    """


class PersonIdentifier(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    type: PersonIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str, Field(max_length=11, min_length=10)]
    """
    Wartość identyfikatora.
    """


class PersonPermissionsAuthorIdentifier(BaseModel):
    """
    Identyfikator osoby lub podmiotu nadającego uprawnienie.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | Pesel | 11 cyfrowy numer PESEL |
    | Fingerprint | Odcisk palca certyfikatu |
    | System | Identyfikator systemowy KSeF |
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: PersonPermissionsAuthorIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str | None, Field(max_length=64, min_length=10)] = None
    """
    Wartość identyfikatora. W przypadku typu System należy pozostawić puste. W pozostałych przypadkach pole jest wymagane.
    """


class PersonPermissionsAuthorizedIdentifier(BaseModel):
    """
    Identyfikator osoby lub podmiotu uprawnionego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | Pesel | 11 cyfrowy numer PESEL |
    | Fingerprint | Odcisk palca certyfikatu |
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: CertificateSubjectIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str, Field(max_length=64, min_length=10)]
    """
    Wartość identyfikatora.
    """


class PersonPermissionsContextIdentifier(BaseModel):
    """
    Identyfikator kontekstu uprawnienia (dla uprawnień nadanych administratorom jednostek podrzędnych).
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | InternalId | Dwuczłonowy identyfikator składający się z numeru NIP i 5 cyfr: `{nip}-{5_cyfr}` |
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: PersonPermissionsContextIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str, Field(max_length=16, min_length=10)]
    """
    Wartość identyfikatora.
    """


class PersonPermissionsSubjectIdentifier(IndirectPermissionsSubjectIdentifier):
    """
    Identyfikator osoby fizycznej.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | Pesel | 11 cyfrowy numer PESEL |
    | Fingerprint | Odcisk palca certyfikatu |
    """


class PersonPermissionsTargetIdentifier(BaseModel):
    """
    Identyfikator podmiotu docelowego dla uprawnień nadanych pośrednio.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | AllPartners | Identyfikator oznaczający, że uprawnienie nadane w sposób pośredni jest typu generalnego |
    | InternalId | Dwuczłonowy identyfikator składający się z numeru NIP i 5 cyfr: `{nip}-{5_cyfr}` |
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: IndirectPermissionsTargetIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str | None, Field(max_length=16, min_length=10)] = None
    """
    Wartość identyfikatora. W przypadku typu AllPartners należy pozostawić puste. W pozostałych przypadkach pole jest wymagane.
    """


class PersonalPermissionsAuthorizedIdentifier(BaseModel):
    """
    Identyfikator podmiotu uprawnionego, jeżeli jest inny niż identyfikator uwierzytelnionego klienta API.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: CertificateSubjectIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str, Field(max_length=64, min_length=10)]
    """
    Wartość identyfikatora.
    """


class PersonalPermissionsContextIdentifier(BaseModel):
    """
    Identyfikator kontekstu podmiotu, który nadał uprawnienia do obsługi faktur.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | InternalId | Dwuczłonowy identyfikator składający się z numeru NIP i 5 cyfr: `{nip}-{5_cyfr}` |
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: PersonPermissionsContextIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str, Field(max_length=16, min_length=10)]
    """
    Wartość identyfikatora.
    """


class PersonalPermissionsTargetIdentifier(BaseModel):
    """
    Identyfikator podmiotu docelowego dla uprawnień selektywnych nadanych pośrednio.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | AllPartners | Identyfikator oznaczający, że wyszukiwanie dotyczy uprawnień generalnych nadanych w sposób pośredni |
    | InternalId | Dwuczłonowy identyfikator składający się z numeru NIP i 5 cyfr: `{nip}-{5_cyfr}` |
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: IndirectPermissionsTargetIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str | None, Field(max_length=16, min_length=10)] = None
    """
    Wartość identyfikatora. W przypadku typu AllPartners należy pozostawić puste. W pozostałych przypadkach pole jest wymagane.
    """


class PublicKeyCertificate(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    certificate: Base64Str
    """
    Certyfikat klucza publicznego w formacie DER, zakodowany w formacie Base64.
    """
    validFrom: AwareDatetime
    """
    Data początku obowiązywania certyfikatu.
    """
    validTo: AwareDatetime
    """
    Data końca obowiązywania certyfikatu.
    """
    usage: list[PublicKeyCertificateUsage]
    """
    Operacje do których może być używany certyfikat.
    | Wartość | Opis |
    | --- | --- |
    | KsefTokenEncryption | Szyfrowanie tokenów KSeF przesyłanych w trakcie procesu uwierzytelniania. |
    | SymmetricKeyEncryption | Szyfrowanie klucza symetrycznego wykorzystywanego do szyfrowania przesyłanych faktur. |

    """


class QueryTokensResponseItem(TokenStatusResponse):
    pass


class SendInvoiceRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    invoiceHash: Annotated[Base64Str, Field(max_length=44, min_length=44)]
    """
    Skrót SHA256 oryginalnej faktury, zakodowany w formacie Base64.
    """
    invoiceSize: Annotated[int, Field(ge=1)]
    """
    Rozmiar oryginalnej faktury w bajtach. Maksymalny rozmiar zależy od limitów ustawionych dla uwierzytelnionego kontekstu.
    """
    encryptedInvoiceHash: Annotated[Base64Str, Field(max_length=44, min_length=44)]
    """
    Skrót SHA256 zaszyfrowanej faktury, zakodowany w formacie Base64.
    """
    encryptedInvoiceSize: Annotated[int, Field(ge=1)]
    """
    Rozmiar zaszyfrowanej faktury w bajtach.
    """
    encryptedInvoiceContent: Base64Str
    """
    Faktura zaszyfrowana algorytmem AES-256-CBC z dopełnianiem PKCS#7 (kluczem przekazanym przy otwarciu sesji), zakodowana w formacie Base64.
    """
    offlineMode: bool = False
    """
    Określa, czy podatnik deklaruje tryb fakturowania "offline" dla przesyłanego dokumentu.
    """
    hashOfCorrectedInvoice: Annotated[
        Base64Str | None, Field(max_length=44, min_length=44)
    ] = None
    """
    Skrót SHA256 korygowanej faktury, zakodowany w formacie Base64. Wymagany przy wysyłaniu korekty technicznej faktury.
    """


class SessionInvoiceStatusResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    ordinalNumber: Annotated[int, Field(ge=1)]
    """
    Numer sekwencyjny faktury w ramach sesji.
    """
    invoiceNumber: Annotated[str | None, Field(max_length=256)] = None
    """
    Numer faktury.
    """
    ksefNumber: Annotated[
        str | None,
        Field(
            max_length=36,
            min_length=35,
            pattern="^([1-9](\\d[1-9]|[1-9]\\d)\\d{7})-(20[2-9][0-9]|2[1-9]\\d{2}|[3-9]\\d{3})(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])-([0-9A-F]{6})-?([0-9A-F]{6})-([0-9A-F]{2})$",
        ),
    ] = None
    """
    Numer KSeF.
    """
    referenceNumber: Annotated[str, Field(max_length=36, min_length=36)]
    """
    Numer referencyjny faktury.
    """
    invoiceHash: Annotated[Base64Str, Field(max_length=44, min_length=44)]
    """
    Skrót SHA256 faktury, zakodowany w formacie Base64.
    """
    invoiceFileName: Annotated[str | None, Field(max_length=128)] = None
    """
    Nazwa pliku faktury (zwracana dla faktur wysyłanych wsadowo).
    """
    acquisitionDate: AwareDatetime | None = None
    """
    Data nadania numeru KSeF.
    """
    invoicingDate: AwareDatetime
    """
    Data przyjęcia faktury w systemie KSeF (do dalszego przetwarzania).
    """
    permanentStorageDate: AwareDatetime | None = None
    """
    Data trwałego zapisu faktury w repozytorium KSeF. Wartość uzupełniana asynchronicznie w momencie trwałego zapisu; zawsze późniejsza niż <b>acquisitionDate</b>. Podczas sprawdzania statusu może być jeszcze niedostępna.
    """
    upoDownloadUrl: AnyUrl | None = None
    """
    Adres do pobrania UPO. Link generowany jest przy każdym odpytaniu o status. 
    Dostęp odbywa się metodą `HTTP GET` i <b>nie należy</b> wysyłać tokenu dostępowego. 
    Link nie podlega limitom API i wygasa po określonym czasie w `UpoDownloadUrlExpirationDate`.

    Odpowiedź HTTP zawiera dodatkowe nagłówki:
    - `x-ms-meta-hash` – skrót SHA-256 dokumentu UPO, zakodowany w formacie Base64.
    """
    upoDownloadUrlExpirationDate: AwareDatetime | None = None
    """
    Data i godzina wygaśnięcia adresu. Po tej dacie link `UpoDownloadUrl` nie będzie już aktywny.
    """
    invoicingMode: InvoicingMode | None = None
    """
    Tryb fakturowania (online/offline).
    """
    status: InvoiceStatusInfo
    """
    Status faktury.

    | Code | Description | Details | Extensions |
    | --- | --- | --- | ---|
    | 100 | Faktura przyjęta do dalszego przetwarzania | - | - |
    | 150 | Trwa przetwarzanie | - | - |
    | 200 | Sukces | - | - |
    | 405 | Przetwarzanie anulowane z powodu błędu sesji | - | - |
    | 410 | Nieprawidłowy zakres uprawnień | - |  - |
    | 415 | Brak możliwości wysyłania faktury z załącznikiem | - | - |
    | 430 | Błąd weryfikacji pliku faktury | - | -  |
    | 435 | Błąd odszyfrowania pliku | - | - |
    | 440 | Duplikat faktury | - | 'originalSessionReferenceNumber', 'originalKsefNumber'|
    | 450 | Błąd weryfikacji semantyki dokumentu faktury | - | - |
    | 500 | Nieznany błąd ({statusCode}) | - | - |
    | 550 | Operacja została anulowana przez system | Przetwarzanie zostało przerwane z przyczyn wewnętrznych systemu. Spróbuj ponownie |- |
    """


class SessionInvoicesResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    continuationToken: str | None = None
    """
    Token służący do pobrania kolejnej strony wyników. Jeśli jest pusty, to nie ma kolejnych stron.
    """
    invoices: list[SessionInvoiceStatusResponse]
    """
    Lista pobranych faktur.
    """


class SessionStatusResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    status: StatusInfo
    """
    Informacje o aktualnym statusie.
                
    Sesja wsadowa:
    | Code | Description | Details |
    | --- | --- | --- |
    | 100 | Sesja wsadowa rozpoczęta | - |
    | 150 | Trwa przetwarzanie | - |
    | 200 | Sesja wsadowa przetworzona pomyślnie | - |
    | 405 | Błąd weryfikacji poprawności dostarczonych elementów paczki | - |
    | 415 | Błąd odszyfrowania dostarczonego klucza | - |
    | 420 | Przekroczony limit faktur w sesji | - |
    | 430 | Błąd dekompresji pierwotnego archiwum | - |
    | 435 | Błąd odszyfrowania zaszyfrowanych części archiwum | - |
    | 440 | Sesja anulowana | Przekroczono czas wysyłki |
    | 440 | Sesja anulowana | Nie przesłano faktur |
    | 445 | Błąd weryfikacji, brak poprawnych faktur | - |
    | 500 | Nieznany błąd ({statusCode}) | - |

    Sesja interaktywna:
    | Code | Description | Details |
    | --- | --- | --- |
    | 100 | Sesja interaktywna otwarta | - |
    | 170 | Sesja interaktywna zamknięta | - |
    | 200 | Sesja interaktywna przetworzona pomyślnie | - |
    | 415 | Błąd odszyfrowania dostarczonego klucza | - |
    | 440 | Sesja anulowana | Nie przesłano faktur |
    | 445 | Błąd weryfikacji, brak poprawnych faktur | - |
    | * | description missing | - |
    """
    dateCreated: AwareDatetime
    """
    Data utworzenia sesji.
    """
    dateUpdated: AwareDatetime
    """
    Data ostatniej aktywności w ramach sesji.
    """
    validUntil: AwareDatetime | None = None
    """
    Termin ważności sesji. Po jego upływie sesja zostanie automatycznie zamknięta.
    """
    upo: UpoResponse | None = None
    """
    Informacja o UPO sesyjnym, zwracana gdy sesja została zamknięta i UPO zostało wygenerowane.
    """
    invoiceCount: Annotated[int | None, Field(ge=0)] = None
    """
    Liczba przyjętych faktur w ramach sesji.
    """
    successfulInvoiceCount: Annotated[int | None, Field(ge=0)] = None
    """
    Liczba faktur przeprocesowanych w ramach sesji z sukcesem .
    """
    failedInvoiceCount: Annotated[int | None, Field(ge=0)] = None
    """
    Liczba faktur przeprocesowanych w ramach sesji z błędem.
    """


class SessionsQueryResponseItem(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    referenceNumber: Annotated[str, Field(max_length=36, min_length=36)]
    """
    Numer referencyjny sesji.
    """
    status: StatusInfo
    """
    Status sesji.
    """
    dateCreated: AwareDatetime
    """
    Data utworzenia sesji.
    """
    dateUpdated: AwareDatetime
    """
    Data ostatniej aktywności w ramach sesji.
    """
    validUntil: AwareDatetime | None = None
    """
    Termin ważności sesji. Po jego upływie sesja interaktywna zostanie automatycznie zamknięta.
    """
    totalInvoiceCount: Annotated[int, Field(ge=0)]
    """
    Łączna liczba faktur (uwzględnia również te w trakcie przetwarzania).
    """
    successfulInvoiceCount: Annotated[int, Field(ge=0)]
    """
    Liczba poprawnie przetworzonych faktur.
    """
    failedInvoiceCount: Annotated[int, Field(ge=0)]
    """
    Liczba błędnie przetworzonych faktur.
    """


class SetSubjectLimitsRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    subjectIdentifierType: CertificateSubjectIdentifierType | None = None
    enrollment: EnrollmentSubjectLimitsOverride | None = None
    certificate: CertificateSubjectLimitsOverride | None = None


class SubjectCreateRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    subjectNip: Annotated[
        str,
        Field(
            max_length=10, min_length=10, pattern="^[1-9]((\\d[1-9])|([1-9]\\d))\\d{7}$"
        ),
    ]
    """
    10 cyfrowy numer NIP.
    """
    subjectType: SubjectType
    subunits: list[Subunit] | None = None
    description: Annotated[str, Field(max_length=256, min_length=5)]
    createdDate: AwareDatetime | None = None
    """
    W przypadku wielokrotnego tworzenia danych testowych z tym samym identyfikatorem nie można podawać daty wcześniejszej ani takiej samej jak poprzednia.
    """


class SubordinateEntityRolesQueryRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    subordinateEntityIdentifier: EntityPermissionsSubordinateEntityIdentifier | None = (
        None
    )
    """
    Identyfikator podmiotu podrzędnego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    """


class SubordinateRoleSubordinateEntityIdentifier(
    EntityPermissionsSubordinateEntityIdentifier
):
    """
    Identyfikator podmiotu podrzędnego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    """


class SubunitPermissionsAuthorIdentifier(EuEntityPermissionsAuthorIdentifier):
    """
    Identyfikator uprawniającego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | Pesel | 11 cyfrowy numer PESEL |
    | Fingerprint | Odcisk palca certyfikatu |
    """


class SubunitPermissionsAuthorizedIdentifier(BaseModel):
    """
    Identyfikator uprawnionego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | Pesel | 11 cyfrowy numer PESEL |
    | Fingerprint | Odcisk palca certyfikatu |
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: CertificateSubjectIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str, Field(max_length=64, min_length=10)]
    """
    Wartość identyfikatora.
    """


class SubunitPermissionsContextIdentifier(BaseModel):
    """
    Identyfikator podmiotu podrzędnego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | InternalId | Dwuczłonowy identyfikator składający się z numeru NIP i 5 cyfr: `{nip}-{5_cyfr}` |
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: SubunitPermissionsContextIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str, Field(max_length=16, min_length=10)]
    """
    Wartość identyfikatora.
    """


class SubunitPermissionsSubjectIdentifier(BaseModel):
    """
    Identyfikator podmiotu lub osoby fizycznej.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | Pesel | 11 cyfrowy numer PESEL |
    | Fingerprint | Odcisk palca certyfikatu |
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: CertificateSubjectIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str, Field(max_length=64, min_length=10)]
    """
    Wartość identyfikatora.
    """


class SubunitPermissionsSubunitIdentifier(BaseModel):
    """
    Identyfikator jednostki lub podmiotu podrzędnego.
    | Type | Value |
    | --- | --- |
    | InternalId | Dwuczłonowy identyfikator składający się z numeru NIP i 5 cyfr: `{nip}-{5_cyfr}` |
    | Nip | 10 cyfrowy numer NIP |
    """

    model_config = ConfigDict(
        extra="forbid",
    )
    type: SubunitPermissionsContextIdentifierType
    """
    Typ identyfikatora.
    """
    value: Annotated[str, Field(max_length=16, min_length=10)]
    """
    Wartość identyfikatora.
    """


class TestDataAuthenticationContextIdentifier(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    value: str
    type: AuthenticationContextIdentifierType


class TestDataAuthorizedIdentifier(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    type: CertificateSubjectIdentifierType
    value: Annotated[str, Field(max_length=64, min_length=10)]


class TestDataContextIdentifier(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    type: EntityAuthorizationsAuthorizingEntityIdentifierType
    value: Annotated[str, Field(max_length=10, min_length=10)]


class TestDataPermission(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    description: Annotated[str, Field(max_length=256, min_length=5)]
    permissionType: TestDataPermissionType


class TestDataPermissionsGrantRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    contextIdentifier: TestDataContextIdentifier
    authorizedIdentifier: TestDataAuthorizedIdentifier
    permissions: list[TestDataPermission]


class TestDataPermissionsRevokeRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    contextIdentifier: TestDataContextIdentifier
    authorizedIdentifier: TestDataAuthorizedIdentifier


class UnblockContextAuthenticationRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    contextIdentifier: TestDataAuthenticationContextIdentifier | None = None


class BatchFileInfo(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    fileSize: Annotated[int, Field(ge=1, le=5000000000)]
    """
    Rozmiar pliku paczki w bajtach. Maksymalny rozmiar paczki to 5GB.
    """
    fileHash: Annotated[Base64Str, Field(max_length=44, min_length=44)]
    """
    Skrót SHA256 pliku paczki, zakodowany w formacie Base64.
    """
    fileParts: Annotated[list[BatchFilePartInfo], Field(max_length=50, min_length=1)]
    """
    Informacje o częściach pliku paczki. Maksymalna liczba części to 50. Maksymalny dozwolony rozmiar części przed zaszyfrowaniem to 100MB.
    """


class BlockContextAuthenticationRequest(UnblockContextAuthenticationRequest):
    pass


class CertificateListItem(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    certificateSerialNumber: str
    """
    Numer seryjny certyfikatu (w formacie szesnastkowym).
    """
    name: Annotated[str, Field(max_length=100)]
    """
    Nazwa własna certyfikatu.
    """
    type: KsefCertificateType
    """
    Typ certyfikatu.
    | Wartość | Opis |
    | --- | --- |
    | Authentication | Certyfikat używany do uwierzytelnienia w systemie. |
    | Offline | Certyfikat używany wyłącznie do potwierdzania autentyczności wystawcy i integralności faktury w trybie offline |

    """
    commonName: str
    """
    Nazwa powszechna (CN) podmiotu, dla którego wystawiono certyfikat.
    """
    status: CertificateListItemStatus
    """
    Status certyfikatu.
    | Wartość | Opis |
    | --- | --- |
    | Active | Certyfikat jest aktywny i może zostać użyty do uwierzytelnienia lub realizacji operacji w trybie offline (w zależności od typu certyfikatu). |
    | Blocked | Certyfikat został zablokowany i nie może zostać użyty do uwierzytelnienia i realizacji operacji w trybie offline.            Status przejściowy do czasu zakończenia procesu unieważniania. |
    | Revoked | Certyfikat został unieważniony i nie może zostać użyty do uwierzytelnienia i realizacji operacji w trybie offline. |
    | Expired | Certyfikat wygasł i nie może zostać użyty do uwierzytelnienia i realizacji operacji w trybie offline. |

    """
    subjectIdentifier: CertificateSubjectIdentifier
    """
    Identyfikator podmiotu, dla którego wystawiono certyfikat.
    """
    validFrom: AwareDatetime
    """
    Data rozpoczęcia ważności certyfikatu.
    """
    validTo: AwareDatetime
    """
    Data wygaśnięcia certyfikatu.
    """
    lastUseDate: AwareDatetime | None = None
    """
    Data ostatniego użycia certyfikatu.
    """
    requestDate: AwareDatetime
    """
    Data złożenia wniosku certyfikacyjnego.
    """


class EntityAuthorizationGrant(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    id: Annotated[str, Field(max_length=36, min_length=36)]
    """
    Identyfikator uprawnienia.
    """
    authorIdentifier: EntityAuthorizationsAuthorIdentifier | None = None
    """
    Identyfikator osoby nadającej uprawnienie.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | Pesel | 11 cyfrowy numer PESEL |
    | Fingerprint | Odcisk palca certyfikatu |
    """
    authorizedEntityIdentifier: EntityAuthorizationsAuthorizedEntityIdentifier
    """
    Identyfikator podmiotu uprawnionego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | PeppolId | Identyfikator dostawcy usług Peppol |
    """
    authorizingEntityIdentifier: EntityAuthorizationsAuthorizingEntityIdentifier
    """
    Identyfikator podmiotu uprawniającego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    """
    authorizationScope: InvoicePermissionType
    """
    Rodzaj uprawnienia.
    """
    description: Annotated[str, Field(max_length=256, min_length=5)]
    """
    Opis uprawnienia.
    """
    subjectEntityDetails: PermissionsSubjectEntityByIdentifierDetails | None = None
    """
    Dane podmiotu uprawnionego.
    """
    startDate: AwareDatetime
    """
    Data rozpoczęcia obowiązywania uprawnienia.
    """


class EntityAuthorizationPermissionsGrantRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    subjectIdentifier: EntityAuthorizationPermissionsSubjectIdentifier
    """
    Identyfikator podmiotu uprawnianego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | PeppolId | Identyfikator dostawcy usług Peppol |
    """
    permission: EntityAuthorizationPermissionType
    """
    Rodzaj uprawnienia.
    """
    description: Annotated[str, Field(max_length=256, min_length=5)]
    """
    Opis uprawnienia
    """
    subjectDetails: EntityDetails
    """
    Dane podmiotu, któremu nadawane są uprawnienia.
    """


class EntityAuthorizationPermissionsQueryRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    authorizingIdentifier: EntityAuthorizationsAuthorizingEntityIdentifier | None = None
    """
    Identyfikator podmiotu uprawniającego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    """
    authorizedIdentifier: EntityAuthorizationsAuthorizedEntityIdentifier | None = None
    """
    Identyfikator podmiotu uprawnionego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | PeppolId | Identyfikator dostawcy usług Peppol |
    """
    queryType: QueryType
    """
    Typ zapytania.
    | Type | Value |
    | --- | --- |
    | Granted | Uprawnienia nadane innym podmiotom |
    | Received | Uprawnienia otrzymane od innych podmiotów |
    """
    permissionTypes: list[InvoicePermissionType] | None = None
    """
    Lista rodzajów wyszukiwanych uprawnień.
    """


class EntityPermissionsGrantRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    subjectIdentifier: EntityPermissionsSubjectIdentifier
    """
    Identyfikator podmiotu.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    """
    permissions: list[EntityPermission]
    """
    Lista nadawanych uprawnień. Każda wartość może wystąpić tylko raz.
    """
    description: Annotated[str, Field(max_length=256, min_length=5)]
    """
    Opis uprawnienia
    """
    subjectDetails: EntityDetails
    """
    Dane podmiotu, któremu nadawane są uprawnienia.
    """


class EntityRole(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    parentEntityIdentifier: EntityRolesParentEntityIdentifier | None = None
    """
    Identyfikator podmiotu nadrzędnego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    """
    role: EntityRoleType
    """
    Typ roli - powiązania z podmiotem nadrzędnym.
    """
    description: Annotated[str, Field(max_length=256, min_length=5)]
    """
    Opis roli.
    """
    startDate: AwareDatetime
    """
    Data rozpoczęcia obowiązywania roli.
    """


class InvoiceExportRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    encryption: EncryptionInfo
    """
    Informacje wymagane do zaszyfrowania wyniku zapytania.
    """
    filters: InvoiceQueryFilters
    """
    Zestaw filtrów do wyszukiwania faktur.
    """


class InvoiceMetadataThirdSubject(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    identifier: InvoiceMetadataThirdSubjectIdentifier
    name: Annotated[str | None, Field(max_length=512)] = None
    """
    Nazwa podmiotu trzeciego.
    """
    role: int
    """
    Rola podmiotu trzeciego.
    | Wartość | Opis |
    | ---- | --- |
    | 0 | Inna rola |
    | 1 | Faktor - w przypadku gdy na fakturze występują dane faktora |
    | 2 | Odbiorca - w przypadku gdy na fakturze występują dane jednostek wewnętrznych, oddziałów, wyodrębnionych w ramach nabywcy, które same nie stanowią nabywcy w rozumieniu ustawy |
    | 3 | Podmiot pierwotny - w przypadku gdy na fakturze występują dane podmiotu będącego w stosunku do podatnika podmiotem przejętym lub przekształconym, który dokonywał dostawy lub świadczył usługę. Z wyłączeniem przypadków, o których mowa w art. 106j ust.2 pkt 3 ustawy, gdy dane te wykazywane są w części Podmiot1K |
    | 4 | Dodatkowy nabywca - w przypadku gdy na fakturze występują dane kolejnych (innych niż wymieniony w części Podmiot2) nabywców |
    | 5 | Wystawca faktury - w przypadku gdy na fakturze występują dane podmiotu wystawiającego fakturę w imieniu podatnika. Nie dotyczy przypadku, gdy wystawcą faktury jest nabywca |
    | 6 | Dokonujący płatności - w przypadku gdy na fakturze występują dane podmiotu regulującego zobowiązanie w miejsce nabywcy |
    | 7 | Jednostka samorządu terytorialnego - wystawca |
    | 8 | Jednostka samorządu terytorialnego - odbiorca |
    | 9 | Członek grupy VAT - wystawca |
    | 10 | Członek grupy VAT - odbiorca |
    | 11 | Pracownik |
    """


class InvoicePackage(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    invoiceCount: Annotated[int, Field(ge=0, le=10000)]
    """
    Łączna liczba faktur w paczce.
    """
    size: Annotated[int, Field(ge=0)]
    """
    Rozmiar paczki w bajtach.
    """
    parts: list[InvoicePackagePart]
    """
    Lista dostępnych części paczki do pobrania.
    """
    isTruncated: bool
    """
    Określa, czy wynik eksportu został ucięty z powodu przekroczenia limitu liczby faktur lub wielkości paczki.
    """
    lastIssueDate: date | None = None
    """
    Data wystawienia ostatniej faktury ujętej w paczce.
    Pole występuje wyłącznie wtedy, gdy paczka została ucięta i eksport był filtrowany po typie daty `Issue`.
    """
    lastInvoicingDate: AwareDatetime | None = None
    """
    Data przyjęcia ostatniej faktury ujętej w paczce.
    Pole występuje wyłącznie wtedy, gdy paczka została ucięta i eksport był filtrowany po typie daty `Invoicing`.
    """
    lastPermanentStorageDate: AwareDatetime | None = None
    """
    Data trwałego zapisu ostatniej faktury ujętej w paczce.
    Pole występuje wyłącznie wtedy, gdy paczka została ucięta i eksport był filtrowany po typie daty `PermanentStorage`.
    """
    permanentStorageHwmDate: AwareDatetime | None = None
    """
    Dotyczy wyłącznie zapytań filtrowanych po typie daty <b>PermanentStorage</b>.
    Jeśli zapytanie dotyczyło najnowszego okresu, wartość ta może być wartością nieznacznie skorygowaną względem górnej granicy podanej w warunkach zapytania.
    Dla okresów starszych, będzie to zgodne z warunkami zapytania. 

    System gwarantuje, że dane poniżej tej wartości są spójne i kompletne.
    Ponowne zapytania obejmujące zakresem dane poniżej tego kroczącego znacznika czasu nie zwrócą w przyszłości innych wyników (np.dodatkowych faktur). 

    Dla dateType = Issue lub Invoicing – null.
    """


class OpenBatchSessionRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    formCode: FormCode
    """
    Schemat faktur wysyłanych w ramach sesji.

    Obsługiwane schematy:
    | SystemCode | SchemaVersion | Value |
    | --- | --- | --- |
    | [FA (2)](https://github.com/CIRFMF/ksef-docs/blob/main/faktury/schemy/FA/schemat_FA(2)_v1-0E.xsd) | 1-0E | FA |
    | [FA (3)](https://github.com/CIRFMF/ksef-docs/blob/main/faktury/schemy/FA/schemat_FA(3)_v1-0E.xsd) | 1-0E | FA |

    """
    batchFile: BatchFileInfo
    """
    Informacje o przesyłanej paczce faktur.
    """
    encryption: EncryptionInfo
    """
    Symetryczny klucz szyfrujący plik paczki, zaszyfrowany kluczem publicznym Ministerstwa Finansów.
    """
    offlineMode: bool = False
    """
    Określa, czy podatnik deklaruje tryb fakturowania "offline" dla dokumentów przesyłanych w sesji wsadowej.
    """


class PermissionsSubjectPersonByFingerprintDetails(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    subjectDetailsType: PersonSubjectByFingerprintDetailsType
    """
    Typ danych uprawnionej osoby fizycznej.
    | Wartość | Opis |
    | --- | --- |
    | PersonByFingerprintWithIdentifier | Osoba fizyczna posługująca się certyfikatem niezawierającym identyfikatora NIP ani PESEL, ale mająca NIP lub PESEL. |
    | PersonByFingerprintWithoutIdentifier | Osoba fizyczna posługująca się certyfikatem niezawierającym identyfikatora NIP ani PESEL i niemająca NIP ani PESEL. |

    """
    firstName: Annotated[str, Field(max_length=30, min_length=2)]
    """
    Imię osoby fizycznej.
    """
    lastName: Annotated[str, Field(max_length=81, min_length=2)]
    """
    Nazwisko osoby fizycznej.
    """
    personIdentifier: PersonIdentifier | None = None
    """
    Identyfikator osoby fizycznej.
    """
    birthDate: date | None = None
    """
    Data urodzenia osoby fizycznej.
    """
    idDocument: IdDocument | None = None
    """
    Dane dokumentu tożsamości osoby fizycznej.
    """


class PermissionsSubjectPersonDetails(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    subjectDetailsType: PersonPermissionSubjectDetailsType
    """
    Typ danych uprawnionej osoby fizycznej.
    | Wartość | Opis |
    | --- | --- |
    | PersonByIdentifier | Osoba fizyczna posługująca się Profilem Zaufanym lub certyfikatem zawierającym identyfikator NIP lub PESEL. |
    | PersonByFingerprintWithIdentifier | Osoba fizyczna posługująca się certyfikatem niezawierającym identyfikatora NIP ani PESEL, ale mająca NIP lub PESEL. |
    | PersonByFingerprintWithoutIdentifier | Osoba fizyczna posługująca się certyfikatem niezawierającym identyfikatora NIP ani PESEL i niemająca NIP ani PESEL. |

    """
    firstName: Annotated[str, Field(max_length=30, min_length=2)]
    """
    Imię osoby fizycznej.
    """
    lastName: Annotated[str, Field(max_length=81, min_length=2)]
    """
    Nazwisko osoby fizycznej.
    """
    personIdentifier: PersonIdentifier | None = None
    """
    Identyfikator osoby fizycznej.
    """
    birthDate: date | None = None
    """
    Data urodzenia osoby fizycznej.
    """
    idDocument: IdDocument | None = None
    """
    Dane dokumentu tożsamości osoby fizycznej.
    """


class PersonByFingerprintWithIdentifierDetails(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    firstName: Annotated[str, Field(max_length=30, min_length=2)]
    """
    Imię osoby fizycznej.
    """
    lastName: Annotated[str, Field(max_length=81, min_length=2)]
    """
    Nazwisko osoby fizycznej.
    """
    identifier: PersonIdentifier
    """
    Identyfikator osoby fizycznej.
    """


class PersonPermission(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    id: Annotated[str, Field(max_length=36, min_length=36)]
    """
    Identyfikator uprawnienia.
    """
    authorizedIdentifier: PersonPermissionsAuthorizedIdentifier
    """
    Identyfikator osoby lub podmiotu uprawnionego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | Pesel | 11 cyfrowy numer PESEL |
    | Fingerprint | Odcisk palca certyfikatu |
    """
    contextIdentifier: PersonPermissionsContextIdentifier | None = None
    """
    Identyfikator kontekstu uprawnienia (dla uprawnień nadanych administratorom jednostek podrzędnych).
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | InternalId | Dwuczłonowy identyfikator składający się z numeru NIP i 5 cyfr: `{nip}-{5_cyfr}` |
    """
    targetIdentifier: PersonPermissionsTargetIdentifier | None = None
    """
    Identyfikator podmiotu docelowego dla uprawnień nadanych pośrednio.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | AllPartners | Identyfikator oznaczający, że uprawnienie nadane w sposób pośredni jest typu generalnego |
    | InternalId | Dwuczłonowy identyfikator składający się z numeru NIP i 5 cyfr: `{nip}-{5_cyfr}` |
    """
    authorIdentifier: PersonPermissionsAuthorIdentifier
    """
    Identyfikator osoby lub podmiotu nadającego uprawnienie.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | Pesel | 11 cyfrowy numer PESEL |
    | Fingerprint | Odcisk palca certyfikatu |
    | System | Identyfikator systemowy KSeF |
    """
    permissionScope: PersonPermissionScope
    """
    Rodzaj uprawnienia.
    """
    description: Annotated[str, Field(max_length=256, min_length=5)]
    """
    Opis uprawnienia.
    """
    subjectPersonDetails: PermissionsSubjectPersonDetails | None = None
    """
    Dane osoby uprawnionej.
    """
    subjectEntityDetails: PermissionsSubjectEntityDetails | None = None
    """
    Dane podmiotu uprawnionego.
    """
    permissionState: PermissionState
    """
    Stan uprawnienia.
    """
    startDate: AwareDatetime
    """
    Data rozpoczęcia obowiązywania uprawnienia.
    """
    canDelegate: bool
    """
    Flaga określająca, czy uprawnienie ma być możliwe do dalszego przekazywania.
    """


class PersonPermissionSubjectDetails(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    subjectDetailsType: PersonPermissionSubjectDetailsType
    """
    Typ danych podmiotu.
    | Wartość | Opis |
    | --- | --- |
    | PersonByIdentifier | Osoba fizyczna posługująca się Profilem Zaufanym lub certyfikatem zawierającym identyfikator NIP lub PESEL. |
    | PersonByFingerprintWithIdentifier | Osoba fizyczna posługująca się certyfikatem niezawierającym identyfikatora NIP ani PESEL, ale mająca NIP lub PESEL. |
    | PersonByFingerprintWithoutIdentifier | Osoba fizyczna posługująca się certyfikatem niezawierającym identyfikatora NIP ani PESEL i niemająca NIP ani PESEL. |

    """
    personById: PersonDetails | None = None
    """
    Dane podmiotu.
    *Wymagane, gdy subjectDetailsType = PersonByIdentifier.*
    """
    personByFpWithId: PersonByFingerprintWithIdentifierDetails | None = None
    """
    Dane podmiotu.
    *Wymagane, gdy subjectDetailsType = PersonByFingerprintWithIdentifier.*
    """
    personByFpNoId: PersonByFingerprintWithoutIdentifierDetails | None = None
    """
    Dane podmiotu.
    *Wymagane, gdy subjectDetailsType = PersonByFingerprintWithoutIdentifier.*
    """


class PersonPermissionsGrantRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    subjectIdentifier: PersonPermissionsSubjectIdentifier
    """
    Identyfikator osoby fizycznej.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | Pesel | 11 cyfrowy numer PESEL |
    | Fingerprint | Odcisk palca certyfikatu |
    """
    permissions: list[PersonPermissionScope]
    """
    Lista nadawanych uprawnień. Każda wartość może wystąpić tylko raz.
    """
    description: Annotated[str, Field(max_length=256, min_length=5)]
    """
    Opis uprawnienia
    """
    subjectDetails: PersonPermissionSubjectDetails
    """
    Dane podmiotu, któremu nadawane są uprawnienia.
    """


class PersonPermissionsQueryRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    authorIdentifier: PersonPermissionsAuthorIdentifier | None = None
    """
    Identyfikator osoby lub podmiotu nadającego uprawnienie.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | Pesel | 11 cyfrowy numer PESEL |
    | Fingerprint | Odcisk palca certyfikatu |
    | System | Identyfikator systemowy KSeF |
    """
    authorizedIdentifier: PersonPermissionsAuthorizedIdentifier | None = None
    """
    Identyfikator osoby lub podmiotu uprawnionego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | Pesel | 11 cyfrowy numer PESEL |
    | Fingerprint | Odcisk palca certyfikatu |
    """
    contextIdentifier: PersonPermissionsContextIdentifier | None = None
    """
    Identyfikator kontekstu uprawnienia (dla uprawnień nadanych administratorom jednostek podrzędnych).
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | InternalId | Dwuczłonowy identyfikator składający się z numeru NIP i 5 cyfr: `{nip}-{5_cyfr}` |
    """
    targetIdentifier: PersonPermissionsTargetIdentifier | None = None
    """
    Identyfikator podmiotu docelowego dla uprawnień nadanych pośrednio.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | AllPartners | Identyfikator oznaczający, że uprawnienie nadane w sposób pośredni jest typu generalnego |
    | InternalId | Dwuczłonowy identyfikator składający się z numeru NIP i 5 cyfr: `{nip}-{5_cyfr}` |
    """
    permissionTypes: list[PersonPermissionScope] | None = None
    """
    Lista rodzajów wyszukiwanych uprawnień.
    """
    permissionState: PermissionState | None = None
    """
    Stan uprawnienia. 
    | Type | Value |
    | --- | --- |
    | Active | Uprawnienia aktywne |
    | Inactive | Uprawnienia nieaktywne, nadane w sposób pośredni |
    """
    queryType: PersonPermissionsQueryType
    """
    Typ zapytania.
    | Type | Value |
    | --- | --- |
    | PermissionsInCurrentContext | Lista uprawnień obowiązujących w bieżącym kontekście |
    | PermissionsGrantedInCurrentContext | Lista uprawnień nadanych w bieżącym kontekście |
    """


class PersonalPermission(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    id: Annotated[str, Field(max_length=36, min_length=36)]
    """
    Identyfikator uprawnienia.
    """
    contextIdentifier: PersonalPermissionsContextIdentifier | None = None
    """
    Identyfikator kontekstu podmiotu, który nadał uprawnienia do obsługi faktur.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | InternalId | Dwuczłonowy identyfikator składający się z numeru NIP i 5 cyfr: `{nip}-{5_cyfr}` |
    """
    authorizedIdentifier: PersonalPermissionsAuthorizedIdentifier | None = None
    """
    Identyfikator podmiotu uprawnionego, jeżeli jest inny niż identyfikator uwierzytelnionego klienta API.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    """
    targetIdentifier: PersonalPermissionsTargetIdentifier | None = None
    """
    Identyfikator podmiotu docelowego dla uprawnień selektywnych nadanych pośrednio.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | AllPartners | Identyfikator oznaczający, że wyszukiwanie dotyczy uprawnień generalnych nadanych w sposób pośredni |
    | InternalId | Dwuczłonowy identyfikator składający się z numeru NIP i 5 cyfr: `{nip}-{5_cyfr}` |
    """
    permissionScope: PersonalPermissionScope
    """
    Rodzaj uprawnienia.
    """
    description: Annotated[str, Field(max_length=256, min_length=5)]
    """
    Opis uprawnienia.
    """
    subjectPersonDetails: PermissionsSubjectPersonDetails | None = None
    """
    Dane osoby uprawnionej.
    """
    subjectEntityDetails: PermissionsSubjectEntityDetails | None = None
    """
    Dane podmiotu uprawnionego.
    """
    permissionState: PermissionState
    """
    Stan uprawnienia.
    """
    startDate: AwareDatetime
    """
    Data rozpoczęcia obowiązywania uprawnienia.
    """
    canDelegate: bool
    """
    Flaga określająca, czy uprawnienie ma być możliwe do dalszego przekazywania.
    """


class PersonalPermissionsQueryRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    contextIdentifier: PersonalPermissionsContextIdentifier | None = None
    """
    Identyfikator kontekstu podmiotu, który nadał uprawnienia do obsługi faktur.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | InternalId | Dwuczłonowy identyfikator składający się z numeru NIP i 5 cyfr: `{nip}-{5_cyfr}` |
    """
    targetIdentifier: PersonalPermissionsTargetIdentifier | None = None
    """
    Identyfikator podmiotu docelowego dla uprawnień selektywnych nadanych pośrednio.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | AllPartners | Identyfikator oznaczający, że wyszukiwanie dotyczy uprawnień generalnych nadanych w sposób pośredni |
    | InternalId | Dwuczłonowy identyfikator składający się z numeru NIP i 5 cyfr: `{nip}-{5_cyfr}` |
    """
    permissionTypes: list[PersonalPermissionScope] | None = None
    """
    Lista rodzajów wyszukiwanych uprawnień.
    """
    permissionState: PermissionState | None = None
    """
    Stan uprawnienia. 
    | Type | Value |
    | --- | --- |
    | Active | Uprawnienia aktywne |
    | Inactive | Uprawnienia nieaktywne |
    """


class QueryCertificatesResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    certificates: list[CertificateListItem]
    """
    Lista certyfikatów spełniających kryteria wyszukiwania.
    """
    hasMore: bool
    """
    Flaga informująca o dostępności kolejnej strony wyników.
    """


class QueryEntityAuthorizationPermissionsResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    authorizationGrants: list[EntityAuthorizationGrant]
    """
    Lista odczytanych uprawnień.
    """
    hasMore: bool
    """
    Flaga informująca o dostępności kolejnej strony wyników.
    """


class QueryEntityRolesResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    roles: list[EntityRole]
    """
    Lista odczytanych ról podmiotu.
    """
    hasMore: bool
    """
    Flaga informująca o dostępności kolejnej strony wyników.
    """


class QueryPersonPermissionsResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    permissions: list[PersonPermission]
    """
    Lista odczytanych uprawnień.
    """
    hasMore: bool
    """
    Flaga informująca o dostępności kolejnej strony wyników.
    """


class QueryPersonalPermissionsResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    permissions: list[PersonalPermission]
    """
    Lista odczytanych uprawnień.
    """
    hasMore: bool
    """
    Flaga informująca o dostępności kolejnej strony wyników.
    """


class QueryTokensResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    continuationToken: str | None = None
    """
    Token służący do pobrania kolejnej strony wyników. Jeśli jest pusty, to nie ma kolejnych stron.
    """
    tokens: list[QueryTokensResponseItem]
    """
    Lista tokenów uwierzytelniających.
    """


class SessionsQueryResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    continuationToken: str | None = None
    """
    Token służący do pobrania kolejnej strony wyników. Jeśli jest pusty, to nie ma kolejnych stron.
    """
    sessions: list[SessionsQueryResponseItem]
    """
    Lista sesji.
    """


class SubordinateEntityRole(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    subordinateEntityIdentifier: SubordinateRoleSubordinateEntityIdentifier
    """
    Identyfikator podmiotu podrzędnego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    """
    role: SubordinateEntityRoleType
    """
    Typ roli - powiązania z podmiotem nadrzędnym.
    """
    description: Annotated[str, Field(max_length=256, min_length=5)]
    """
    Opis powiązania.
    """
    startDate: AwareDatetime
    """
    Data rozpoczęcia obowiązywania powiązania.
    """


class SubunitPermission(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    id: Annotated[str, Field(max_length=36, min_length=36)]
    """
    Identyfikator uprawnienia.
    """
    authorizedIdentifier: SubunitPermissionsAuthorizedIdentifier
    """
    Identyfikator uprawnionego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | Pesel | 11 cyfrowy numer PESEL |
    | Fingerprint | Odcisk palca certyfikatu |
    """
    subunitIdentifier: SubunitPermissionsSubunitIdentifier
    """
    Identyfikator jednostki lub podmiotu podrzędnego.
    | Type | Value |
    | --- | --- |
    | InternalId | Dwuczłonowy identyfikator składający się z numeru NIP i 5 cyfr: `{nip}-{5_cyfr}` |
    | Nip | 10 cyfrowy numer NIP |
    """
    authorIdentifier: SubunitPermissionsAuthorIdentifier
    """
    Identyfikator uprawniającego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | Pesel | 11 cyfrowy numer PESEL |
    | Fingerprint | Odcisk palca certyfikatu |
    """
    permissionScope: SubunitPermissionScope
    """
    Rodzaj uprawnienia.
    """
    description: Annotated[str, Field(max_length=256, min_length=5)]
    """
    Opis uprawnienia.
    """
    subjectPersonDetails: PermissionsSubjectPersonDetails | None = None
    """
    Dane osoby uprawnionej.
    """
    subunitName: Annotated[str | None, Field(max_length=256, min_length=5)] = None
    """
    Nazwa jednostki podrzędnej.
    """
    startDate: AwareDatetime
    """
    Data rozpoczęcia obowiązywania uprawnienia.
    """


class SubunitPermissionsGrantRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    subjectIdentifier: SubunitPermissionsSubjectIdentifier
    """
    Identyfikator podmiotu lub osoby fizycznej.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | Pesel | 11 cyfrowy numer PESEL |
    | Fingerprint | Odcisk palca certyfikatu |
    """
    contextIdentifier: SubunitPermissionsContextIdentifier
    """
    Identyfikator podmiotu podrzędnego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | InternalId | Dwuczłonowy identyfikator składający się z numeru NIP i 5 cyfr: `{nip}-{5_cyfr}` |
    """
    description: Annotated[str, Field(max_length=256, min_length=5)]
    """
    Opis uprawnienia
    """
    subunitName: Annotated[str | None, Field(max_length=256, min_length=5)] = None
    """
    Nazwa jednostki podrzędnej. W przypadku jednostki podrzędnej z identyfikatorem wewnętrznym pole jest wymagane.
    """
    subjectDetails: PersonPermissionSubjectDetails
    """
    Dane podmiotu, któremu nadawane są uprawnienia.
    """


class SubunitPermissionsQueryRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    subunitIdentifier: SubunitPermissionsSubunitIdentifier | None = None
    """
    Identyfikator jednostki lub podmiotu podrzędnego.
    | Type | Value |
    | --- | --- |
    | InternalId | Dwuczłonowy identyfikator składający się z numeru NIP i 5 cyfr: `{nip}-{5_cyfr}` |
    | Nip | 10 cyfrowy numer NIP |
    """


class EuEntityPermission(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    id: Annotated[str, Field(max_length=36, min_length=36)]
    """
    Identyfikator uprawnienia.
    """
    authorIdentifier: EuEntityPermissionsAuthorIdentifier
    """
    Identyfikator uprawniającego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | Pesel | 11 cyfrowy numer PESEL |
    | Fingerprint | Odcisk palca certyfikatu |
    """
    vatUeIdentifier: str
    """
    Identyfikator podmiotu unijnego.
    """
    euEntityName: Annotated[str, Field(max_length=256, min_length=5)]
    """
    Nazwa podmiotu unijnego.
    """
    authorizedFingerprintIdentifier: Annotated[str, Field(max_length=64, min_length=64)]
    """
    Uprawniony odcisk palca certyfikatu.
    """
    permissionScope: EuEntityPermissionsQueryPermissionType
    """
    Uprawnienie.
    """
    description: Annotated[str, Field(max_length=256, min_length=5)]
    """
    Opis uprawnienia.
    """
    subjectPersonDetails: PermissionsSubjectPersonByFingerprintDetails | None = None
    """
    Dane osoby uprawnionej.
    """
    subjectEntityDetails: PermissionsSubjectEntityByFingerprintDetails | None = None
    """
    Dane podmiotu uprawnionego.
    """
    euEntityDetails: PermissionsEuEntityDetails | None = None
    """
    Dane podmiotu unijnego, w kontekście którego nadane jest uprawnienie.
    """
    startDate: AwareDatetime
    """
    Data rozpoczęcia obowiązywania uprawnienia.
    """


class EuEntityPermissionSubjectDetails(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    subjectDetailsType: EuEntityPermissionSubjectDetailsType
    """
    Typ danych podmiotu.
    | Wartość | Opis |
    | --- | --- |
    | PersonByFingerprintWithIdentifier | Osoba fizyczna posługująca się certyfikatem niezawierającym identyfikatora NIP ani PESEL, ale mająca NIP lub PESEL. |
    | PersonByFingerprintWithoutIdentifier | Osoba fizyczna posługująca się certyfikatem niezawierającym identyfikatora NIP ani PESEL i niemająca NIP ani PESEL. |
    | EntityByFingerprint | Podmiot identyfikowany odciskiem palca pieczęci kwalifikowanej. |

    """
    personByFpWithId: PersonByFingerprintWithIdentifierDetails | None = None
    """
    Dane podmiotu.
    *Wymagane, gdy subjectDetailsType = PersonByFingerprintWithIdentifier.*
    """
    personByFpNoId: PersonByFingerprintWithoutIdentifierDetails | None = None
    """
    Dane podmiotu.
    *Wymagane, gdy subjectDetailsType = PersonByFingerprintWithoutIdentifier.*
    """
    entityByFp: EntityByFingerprintDetails | None = None
    """
    Dane podmiotu.
    *Wymagane, gdy subjectDetailsType = EntityByFingerprint.*
    """


class EuEntityPermissionsGrantRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    subjectIdentifier: EuEntityPermissionsSubjectIdentifier
    """
    Identyfikator podmiotu uprawnianego.
    | Type | Value |
    | --- | --- |
    | Fingerprint | Odcisk palca certyfikatu |
    """
    permissions: list[EntityPermissionType]
    """
    Lista nadawanych uprawnień. Każda wartość może wystąpić tylko raz.
    """
    description: Annotated[str, Field(max_length=256, min_length=5)]
    """
    Opis uprawnienia
    """
    subjectDetails: EuEntityPermissionSubjectDetails
    """
    Dane podmiotu, któremu nadawane są uprawnienia.
    """


class IndirectPermissionsGrantRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    subjectIdentifier: IndirectPermissionsSubjectIdentifier
    """
    Identyfikator osoby fizycznej.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | Pesel | 11 cyfrowy numer PESEL |
    | Fingerprint | Odcisk palca certyfikatu |
    """
    targetIdentifier: IndirectPermissionsTargetIdentifier | None = None
    """
    Identyfikator kontekstu klienta. Nie przekazanie identyfikatora oznacza, że uprawnienie nadane w sposób pośredni jest typu generalnego.
    | Type | Value |
    | --- | --- |
    | Nip | 10 cyfrowy numer NIP |
    | AllPartners | Identyfikator oznaczający, że uprawnienie nadane w sposób pośredni jest typu generalnego |
    | InternalId | Dwuczłonowy identyfikator składający się z numeru NIP i 5 cyfr: `{nip}-{5_cyfr}` |
    """
    permissions: list[IndirectPermissionType]
    """
    Lista nadawanych uprawnień. Każda wartość może wystąpić tylko raz.
    """
    description: Annotated[str, Field(max_length=256, min_length=5)]
    """
    Opis uprawnienia
    """
    subjectDetails: PersonPermissionSubjectDetails
    """
    Dane podmiotu, któremu nadawane są uprawnienia.
    """


class InvoiceExportStatusResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    status: StatusInfo
    """
    Status eksportu.

    | Code | Description | Details |
    | --- | --- | --- |
    | 100 | Eksport faktur w toku | - |
    | 200 | Eksport faktur zakończony sukcesem | - |
    | 210 | Eksport faktur wygasł i nie jest już dostępny do pobrania | - |
    | 415 | Błąd odszyfrowania dostarczonego klucza  | - |
    | 420 | Zakres filtrowania wykracza poza dostępny zakres danych | Parametr dateRange.from jest późniejszy niż PermanentStorageHwmDate przy włączonym restrictToPermanentStorageHwmDate. |
    | 500 | Nieznany błąd ({statusCode}) | - |
    | 550 | Operacja została anulowana przez system | Przetwarzanie zostało przerwane z przyczyn wewnętrznych systemu. Spróbuj ponownie |
    """
    completedDate: AwareDatetime | None = None
    """
    Data zakończenia przetwarzania żądania eksportu faktur.
    """
    packageExpirationDate: AwareDatetime | None = None
    """
    Data wygaśnięcia paczki faktur przygotowanej do pobrania.
    Po upływie tej daty paczka nie będzie już dostępna do pobrania.
    """
    package: InvoicePackage | None = None
    """
    Dane paczki faktur przygotowanej do pobrania.
    """


class InvoiceMetadata(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    ksefNumber: Annotated[
        str,
        Field(
            max_length=36,
            min_length=35,
            pattern="^([1-9](\\d[1-9]|[1-9]\\d)\\d{7})-(20[2-9][0-9]|2[1-9]\\d{2}|[3-9]\\d{3})(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])-([0-9A-F]{6})-?([0-9A-F]{6})-([0-9A-F]{2})$",
        ),
    ]
    """
    Numer KSeF faktury.
    """
    invoiceNumber: Annotated[str, Field(max_length=256)]
    """
    Numer faktury nadany przez wystawcę.
    """
    issueDate: date
    """
    Data wystawienia faktury.
    """
    invoicingDate: AwareDatetime
    """
    Data przyjęcia faktury w systemie KSeF (do dalszego przetwarzania).
    """
    acquisitionDate: AwareDatetime
    """
    Data nadania numeru KSeF.
    """
    permanentStorageDate: AwareDatetime
    """
    Data trwałego zapisu faktury w repozytorium systemu KSeF.
    """
    seller: InvoiceMetadataSeller
    """
    Dane identyfikujące sprzedawcę.
    """
    buyer: InvoiceMetadataBuyer
    """
    Dane identyfikujące nabywcę.
    """
    netAmount: float
    """
    Łączna kwota netto.
    """
    grossAmount: float
    """
    Łączna kwota brutto.
    """
    vatAmount: float
    """
    Łączna kwota VAT.
    """
    currency: Annotated[str, Field(max_length=3, min_length=3)]
    """
    Kod waluty.
    """
    invoicingMode: InvoicingMode
    """
    Tryb fakturowania (online/offline).
    """
    invoiceType: InvoiceType
    """
    Rodzaj faktury.
    | Wartość | Opis |
    | --- | --- |
    | Vat | (FA) Podstawowa |
    | Zal | (FA) Zaliczkowa |
    | Kor | (FA) Korygująca |
    | Roz | (FA) Rozliczeniowa |
    | Upr | (FA) Uproszczona |
    | KorZal | (FA) Korygująca fakturę zaliczkową |
    | KorRoz | (FA) Korygująca fakturę rozliczeniową |
    | VatPef | (PEF) Podstawowa |
    | VatPefSp | (PEF) Specjalizowana |
    | KorPef | (PEF) Korygująca |
    | VatRr | (RR) Podstawowa |
    | KorVatRr | (RR) Korygująca |

    """
    formCode: FormCode
    """
    Struktura dokumentu faktury.

    Obsługiwane schematy:
    | SystemCode | SchemaVersion | Value |
    | --- | --- | --- |
    | [FA (2)](https://github.com/CIRFMF/ksef-docs/blob/main/faktury/schemy/FA/schemat_FA(2)_v1-0E.xsd) | 1-0E | FA |
    | [FA (3)](https://github.com/CIRFMF/ksef-docs/blob/main/faktury/schemy/FA/schemat_FA(3)_v1-0E.xsd) | 1-0E | FA |
    | [PEF (3)](https://github.com/CIRFMF/ksef-docs/blob/main/faktury/schemy/PEF/Schemat_PEF(3)_v2-1.xsd) | 2-1 | PEF |
    | [PEF_KOR (3)](https://github.com/CIRFMF/ksef-docs/blob/main/faktury/schemy/PEF/Schemat_PEF_KOR(3)_v2-1.xsd) | 2-1 | PEF |
    | FA_RR (1) | 1-0E | RR |

    """
    isSelfInvoicing: bool
    """
    Czy faktura została wystawiona w trybie samofakturowania.
    """
    hasAttachment: bool
    """
    Określa, czy faktura posiada załącznik.
    """
    invoiceHash: Annotated[Base64Str, Field(max_length=44, min_length=44)]
    """
    Skrót SHA256 faktury, zakodowany w formacie Base64.
    """
    hashOfCorrectedInvoice: Annotated[
        Base64Str | None, Field(max_length=44, min_length=44)
    ] = None
    """
    Skrót SHA256 korygowanej faktury, zakodowany w formacie Base64.
    """
    thirdSubjects: list[InvoiceMetadataThirdSubject] | None = None
    """
    Lista podmiotów trzecich.
    """
    authorizedSubject: InvoiceMetadataAuthorizedSubject | None = None
    """
    Podmiot upoważniony.
    """


class QueryEuEntityPermissionsResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    permissions: list[EuEntityPermission]
    """
    Lista odczytanych uprawnień.
    """
    hasMore: bool
    """
    Flaga informująca o dostępności kolejnej strony wyników.
    """


class QueryInvoicesMetadataResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    hasMore: bool
    """
    Określa, czy istnieją kolejne wyniki zapytania.
    """
    isTruncated: bool
    """
    Określa, czy osiągnięto maksymalny dopuszczalny zakres wyników zapytania (10 000).
    """
    permanentStorageHwmDate: AwareDatetime | None = None
    """
    Dotyczy wyłącznie zapytań filtrowanych po typie daty <b>PermanentStorage</b>.
    Jeśli zapytanie dotyczyło najnowszego okresu, wartość ta może być wartością nieznacznie skorygowaną względem górnej granicy podanej w warunkach zapytania.
    Dla okresów starszych, będzie to zgodne z warunkami zapytania. 

    Wartość jest stała dla wszystkich stron tego samego zapytania
    i nie zależy od paginacji ani sortowania.

    System gwarantuje, że dane poniżej tej wartości są spójne i kompletne.
    Ponowne zapytania obejmujące zakresem dane poniżej tego kroczącego znacznika czasu nie zwrócą w przyszłości innych wyników (np.dodatkowych faktur). 

    Dla dateType = Issue lub Invoicing – null.
    """
    invoices: list[InvoiceMetadata]
    """
    Lista faktur spełniających kryteria.
    """


class QuerySubordinateEntityRolesResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    roles: list[SubordinateEntityRole]
    """
    Lista odczytanych podmiotów podrzędnych i ich ról.
    """
    hasMore: bool
    """
    Flaga informująca o dostępności kolejnej strony wyników.
    """


class QuerySubunitPermissionsResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    permissions: list[SubunitPermission]
    """
    Lista odczytanych uprawnień.
    """
    hasMore: bool
    """
    Flaga informująca o dostępności kolejnej strony wyników.
    """


class EuEntityAdministrationPermissionsGrantRequest(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    subjectIdentifier: EuEntityAdministrationPermissionsSubjectIdentifier
    """
    Identyfikator podmiotu uprawnionego.
    | Type | Value |
    | --- | --- |
    | Fingerprint | Odcisk palca certyfikatu |
    """
    contextIdentifier: EuEntityAdministrationPermissionsContextIdentifier
    """
    Identyfikator kontekstu złożonego.
    | Type | Value |
    | --- | --- |
    | NipVatUe | Dwuczłonowy identyfikator składający się z numeru NIP i numeru VAT-UE: `{nip}-{vat_ue}` |
    """
    description: Annotated[str, Field(max_length=256, min_length=5)]
    """
    Opis uprawnienia
    """
    euEntityName: Annotated[str, Field(max_length=256, min_length=5)]
    """
    Nazwa i adres podmiotu unijnego w formacie: 
    `{euSubjectName}, {euSubjectAddress}`
    """
    subjectDetails: EuEntityPermissionSubjectDetails
    """
    Dane podmiotu, któremu nadawane są uprawnienia.
    """
    euEntityDetails: EuEntityDetails
    """
    Dane podmiotu unijnego, w kontekście którego nadawane są uprawnienia.
    """
