Client: obtain specific contact detail

This commit is contained in:
Richard Kubíček
2025-01-15 16:26:46 +01:00
parent 27aaf6fc7d
commit 710acdfc2d
3 changed files with 100 additions and 40 deletions

0
superfaktura/__init__.py Normal file
View File

View File

@@ -1,54 +1,99 @@
import dataclasses import dataclasses
import json
from pprint import pprint from pprint import pprint
from typing import Optional
from superfaktura.api import SuperFakturaAPI from superfaktura.superfaktura_api import SuperFakturaAPI
class ClientException(Exception):
pass
@dataclasses.dataclass @dataclasses.dataclass
class ClientContactModel: class ClientContactModel:
name: str name: str
address: str = None address: Optional[str] = None
bank_account: str = None bank_account: Optional[str] = None
bank_code: str = None bank_code: Optional[str] = None
city: str = None city: Optional[str] = None
comment: str = None comment: Optional[str] = None
country: str = None country: Optional[str] = None
country_id: int = None country_id: Optional[int] = None
currency: str = None currency: Optional[str] = None
default_variable: str = None default_variable: Optional[str] = None
delivery_address: str = None delivery_address: Optional[str] = None
delivery_city: str = None delivery_city: Optional[str] = None
delivery_country: str = None delivery_country: Optional[str] = None
delivery_country_id: int = None delivery_country_id: Optional[int] = None
delivery_name: str = None delivery_name: Optional[str] = None
delivery_phone: str = None delivery_phone: Optional[str] = None
delivery_zip: str = None delivery_zip: Optional[str] = None
dic: str = None dic: Optional[str] = None
discount: float = None discount: Optional[float] = None
due_date: int = None due_date: Optional[int] = None
email: str = None email: Optional[str] = None
fax: str = None fax: Optional[str] = None
iban: str = None iban: Optional[str] = None
ic_dph: str = None ic_dph: Optional[str] = None
ico: str = None ico: Optional[str] = None
match_address: int = None match_address: Optional[int] = None
phone: str = None phone: Optional[str] = None
swift: str = None swift: Optional[str] = None
tags: str = None tags: Optional[str] = None
uuid: str = None uuid: Optional[str] = None
zip: str = None zip: Optional[str] = None
update: bool = None update: Optional[bool] = None
id: Optional[int] = None
def as_dict(self) -> dict:
data = dataclasses.asdict(self)
for key in list(data.keys()):
if data[key] is None:
del data[key]
return data
@staticmethod
def from_dict(data: dict) -> "ClientContactModel":
return ClientContactModel(
**{
k: v
for k, v in data.items()
if k in ClientContactModel.__dataclass_fields__
}
)
class ClientContact(SuperFakturaAPI): class ClientContact(SuperFakturaAPI):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
def add_contact(self, contact: ClientContactModel): def add_contact(self, contact: ClientContactModel) -> bool:
url = "clients/create" url = "clients/create"
return self.post(endpoint=url, data=dataclasses.asdict(contact)) data = {"Client": contact.as_dict()}
resp = self.post(endpoint=url, data=json.dumps(data))
if resp["error_message"] == "Client created":
return True
return False
def list(self) -> dict:
url = "clients/index.json"
return self.get(endpoint=url)
def get_client(self, client_id: int) -> ClientContactModel:
url = f"clients/view/{client_id}"
data = self.get(endpoint=url)
if "Client" not in data:
raise ClientException("Client not found")
data = data["Client"]
return ClientContactModel.from_dict(data)
if __name__ == "__main__": if __name__ == "__main__":
client = ClientContact() client = ClientContact()
resp = client.add_contact(ClientContactModel(name="John Doe")) resp = client.list()
pprint(resp) pprint(resp)
pprint(client.get_client(40019))

View File

@@ -5,22 +5,37 @@ import os
from dotenv import load_dotenv # type: ignore from dotenv import load_dotenv # type: ignore
class SuperFakturaAPIException(Exception):
pass
class SuperFakturaAPI: class SuperFakturaAPI:
def __init__(self) -> None: def __init__(self) -> None:
load_dotenv() load_dotenv()
_api_key = os.getenv("SUPERFAKTURA_API_KEY") _api_key = os.getenv("SUPERFAKTURA_API_KEY")
self._api_url = os.getenv("SUPERFAKTURA_API_URL") self._api_url = os.getenv("SUPERFAKTURA_API_URL")
_api_mail = os.getenv("SUPERFAKTURA_API_EMAIL") _api_mail = os.getenv("SUPERFAKTURA_API_EMAIL")
_api_company_id = os.getenv("SUPERFAKTURA_API_COMPANY_ID")
self._auth_header = { self._auth_header = {
"Authorization": f"SFAPI email={_api_mail}&apikey={_api_key}" "Authorization": f"SFAPI email={_api_mail}&apikey={_api_key}&company_id={_api_company_id}"
} }
def get(self, endpoint: str) -> Dict: def get(self, endpoint: str) -> Dict:
url = f"{self._api_url}/{endpoint}" url = f"{self._api_url}/{endpoint}"
req = requests.get(url=url, headers=self._auth_header) req = requests.get(url=url, headers=self._auth_header)
if req.status_code == 200:
return req.json() return req.json()
else:
raise SuperFakturaAPIException(
f"Get status code: {req.status_code}; {req.json()}"
)
def post(self, endpoint: str, data: dict) -> Dict: def post(self, endpoint: str, data: str) -> Dict:
url = f"{self._api_url}/{endpoint}" url = f"{self._api_url}/{endpoint}"
req = requests.post(url=url, headers=self._auth_header, data=data) req = requests.post(url=url, headers=self._auth_header, data={"data": data})
if req.status_code == 200:
return req.json() return req.json()
else:
raise SuperFakturaAPIException(
f"Post status code: {req.status_code}; {req.json()}"
)