118 lines
3.9 KiB
Python
118 lines
3.9 KiB
Python
"""Pydantic modely pro RAYNET endpointy.
|
||
|
||
Modely odpovídají RAYNET CRM API v2 (CompanyInsertDto). Slouží zároveň jako
|
||
zdroj pro Swagger/OpenAPI dokumentaci.
|
||
"""
|
||
|
||
from enum import Enum
|
||
from typing import Optional
|
||
|
||
from pydantic import BaseModel, Field
|
||
|
||
|
||
class Rating(str, Enum):
|
||
A = "A"
|
||
B = "B"
|
||
C = "C"
|
||
|
||
|
||
class CompanyState(str, Enum):
|
||
A_POTENTIAL = "A_POTENTIAL"
|
||
B_ACTUAL = "B_ACTUAL"
|
||
C_DEFERRED = "C_DEFERRED"
|
||
D_UNATTRACTIVE = "D_UNATTRACTIVE"
|
||
|
||
|
||
class CompanyRole(str, Enum):
|
||
A_SUBSCRIBER = "A_SUBSCRIBER"
|
||
B_PARTNER = "B_PARTNER"
|
||
C_SUPPLIER = "C_SUPPLIER"
|
||
D_RIVAL = "D_RIVAL"
|
||
|
||
|
||
class TaxPayer(str, Enum):
|
||
YES = "YES"
|
||
NO = "NO"
|
||
|
||
|
||
class Address(BaseModel):
|
||
name: Optional[str] = Field(default=None, examples=["Sídlo klienta"])
|
||
street: Optional[str] = Field(default=None, examples=["Francouzská 6167/5"])
|
||
city: Optional[str] = Field(default=None, examples=["Ostrava"])
|
||
province: Optional[str] = Field(default=None, examples=["Morava"])
|
||
zipCode: Optional[str] = Field(default=None, examples=["708 00"])
|
||
country: Optional[str] = Field(default=None, examples=["CZ"])
|
||
lat: Optional[float] = None
|
||
lng: Optional[float] = None
|
||
|
||
|
||
class ContactInfo(BaseModel):
|
||
email: Optional[str] = Field(default=None, examples=["info@raynet.cz"])
|
||
email2: Optional[str] = None
|
||
fax: Optional[str] = None
|
||
tel1: Optional[str] = Field(default=None, examples=["+420 553 401 520"])
|
||
tel1Type: Optional[str] = Field(default=None, examples=["recepce"])
|
||
tel2: Optional[str] = None
|
||
tel2Type: Optional[str] = None
|
||
www: Optional[str] = Field(default=None, examples=["www.raynet.cz"])
|
||
doNotSendMM: Optional[bool] = None
|
||
otherContact: Optional[str] = None
|
||
|
||
|
||
class CompanyAddress(BaseModel):
|
||
address: Optional[Address] = None
|
||
contactInfo: Optional[ContactInfo] = None
|
||
|
||
|
||
class CompanyData(BaseModel):
|
||
"""Tělo požadavku pro vytvoření firmy (CompanyInsertDto).
|
||
|
||
Povinná pole: ``name``, ``rating``, ``state``, ``role``.
|
||
"""
|
||
|
||
# Povinná pole
|
||
name: str = Field(..., examples=["ACME s.r.o."])
|
||
rating: Rating = Field(..., examples=[Rating.A])
|
||
state: CompanyState = Field(..., examples=[CompanyState.A_POTENTIAL])
|
||
role: CompanyRole = Field(..., examples=[CompanyRole.A_SUBSCRIBER])
|
||
|
||
# Volitelná pole
|
||
regNumber: Optional[str] = Field(default=None, examples=["12345678"])
|
||
taxNumber: Optional[str] = Field(default=None, examples=["CZ12345678"])
|
||
taxNumber2: Optional[str] = None
|
||
taxPayer: Optional[TaxPayer] = None
|
||
bankAccount: Optional[str] = None
|
||
notice: Optional[str] = None
|
||
owner: Optional[int] = Field(default=None, description="ID vlastníka (uživatele)")
|
||
category: Optional[int] = None
|
||
contactSource: Optional[int] = None
|
||
employeesNumber: Optional[int] = None
|
||
legalForm: Optional[int] = None
|
||
paymentTerm: Optional[int] = None
|
||
turnover: Optional[int] = None
|
||
territory: Optional[int] = None
|
||
addresses: Optional[list[CompanyAddress]] = None
|
||
tags: Optional[list[str]] = None
|
||
customFields: Optional[dict] = None
|
||
|
||
# Umožní i pole, která zde nejsou explicitně vyjmenovaná (RAYNET jich má víc).
|
||
model_config = {"extra": "allow"}
|
||
|
||
|
||
class CreateCompanyRequest(BaseModel):
|
||
"""Vstup endpointu /company.
|
||
|
||
API klíč (secret) se předává hlavičkou ``X-Api-Key`` – NENÍ součástí tohoto
|
||
těla. Email a název instance jsou běžné identifikátory, proto jdou v těle.
|
||
"""
|
||
|
||
email: str = Field(..., examples=["user@firma.cz"], description="Email uživatele RAYNET")
|
||
instance_name: str = Field(..., examples=["moje-instance"], description="Název RAYNET instance")
|
||
company: CompanyData
|
||
|
||
|
||
class CreateCompanyResponse(BaseModel):
|
||
id: Optional[int] = Field(default=None, description="ID nově vytvořené firmy")
|
||
success: bool = True
|
||
raw: Optional[dict] = Field(default=None, description="Surová odpověď RAYNET API")
|