Skip to content

Commit 85d4f1c

Browse files
committed
people service added
1 parent 02fb889 commit 85d4f1c

File tree

6 files changed

+96
-7
lines changed

6 files changed

+96
-7
lines changed

fiscalapi/models/fiscalapi_models.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from decimal import Decimal
2-
from pydantic import ConfigDict, Field
2+
from pydantic import ConfigDict, EmailStr, Field
33
from fiscalapi.models.common_models import BaseDto, CatalogDto
44
from typing import Literal, Optional
55

@@ -45,3 +45,32 @@ class Product(BaseDto):
4545
populate_by_name=True,
4646
json_encoders={Decimal: str}
4747
)
48+
49+
50+
51+
class Person(BaseDto):
52+
"""Modelo persona en FiscalAPI."""
53+
54+
legal_name: Optional[str] = Field(default=None, alias="legalName", description="Razón social de la persona sin régimen de capital.")
55+
email: Optional[EmailStr] = Field(default=None, alias="email", description="Correo electrónico de la persona.")
56+
password: Optional[str] = Field(default=None, alias="password", description="Contraseña para acceder al dashboard.")
57+
capital_regime: Optional[str] = Field(default=None, alias="CapitalRegime", description="Régimen de capital de la persona.")
58+
sat_tax_regime_id: Optional[Literal["601", "603", "605", "606", "607", "608", "610", "611", "612", "614", "615", "616", "620", "621", "622", "623", "624", "625", "626"]] = Field(default=None, alias="satTaxRegimeId", description="Código del régimen fiscal del emisor.")
59+
sat_tax_regime: Optional[CatalogDto] = Field(default=None, alias="satTaxRegime", description="Código del régimen fiscal expandido.")
60+
sat_cfdi_use_id: Optional[Literal["G01", "G02", "G03", "I01", "I02", "I03", "I04", "I05", "I06", "I07", "I08", "D01", "D02", "D03", "D04", "D05", "D06", "D07", "D08", "D09", "D10", "S01", "CP01", "CN01"]] = Field(default=None, alias="satCfdiUseId", description="Código de uso del CFDI.")
61+
sat_cfdi_use: Optional[CatalogDto] = Field(default=None, alias="cfdiUse", description="Código de uso del CFDI expandido.")
62+
user_type_id: Optional[Literal["T","C", "U"]] = Field(default=None, alias="userTypeId", description="Tipo de persona.")
63+
user_type: Optional[CatalogDto] = Field(default=None, alias="userType", description="Tipo de persona expandido.")
64+
tin: Optional[str] = Field(default=None, alias="tin", description="RFC del emisor (Tax Identification Number).")
65+
zip_code: Optional[str] = Field(default=None, alias="zipCode", description="Código postal del emisor.")
66+
base64_photo: Optional[str] = Field(default=None, alias="base64Photo", description="Foto de perfil en formato base64.")
67+
tax_password: Optional[str] = Field(default=None, alias="taxPassword", description="Contraseña de los certificados CSD del emisor.")
68+
available_balance: Optional[Decimal] = Field(default=None, alias="availableBalance", description="Saldo disponible en la cuenta.")
69+
committed_balance: Optional[Decimal] = Field(default=None, alias="committedBalance", description="Saldo en tránsito.")
70+
tenant_id: Optional[str] = Field(default=None, alias="tenantId", description="ID del tenant al que pertenece el emisor.")
71+
tenant: Optional[CatalogDto] = Field(default=None, alias="tenant", description="Tenant expandido.")
72+
73+
model_config = ConfigDict(
74+
populate_by_name=True,
75+
json_encoders={Decimal: str}
76+
)
Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
import requests
44
from fiscalapi.models.common_models import ApiResponse, FiscalApiSettings, ValidationFailure
55

6-
T = TypeVar('T', bound=BaseModel)
6+
#T = TypeVar('T', bound=BaseModel)
7+
8+
T = TypeVar('T')
9+
710

811
class BaseService:
912
def __init__(self, settings: FiscalApiSettings):
@@ -30,7 +33,24 @@ def _request(self, method: str, endpoint: str, **kwargs) -> requests.Response:
3033
# Disable certificate validation (for development only!)
3134
kwargs.setdefault("verify", False)
3235

33-
return requests.request(method=method, url=url, headers=headers, **kwargs)
36+
37+
# print payload request
38+
print("***Payload Request:", kwargs.get("json"))
39+
40+
# print line breaks
41+
print("\n\n")
42+
43+
44+
# Send request
45+
response = requests.request(method=method, url=url, headers=headers, **kwargs)
46+
47+
# print payload response
48+
print("***Payload Response:", response.text)
49+
50+
# print line breaks
51+
print("\n\n")
52+
53+
return response
3454

3555
def _process_response(self, response: requests.Response, response_model: Type[T]) -> ApiResponse[T]:
3656
status_code = response.status_code
@@ -48,8 +68,10 @@ def _process_response(self, response: requests.Response, response_model: Type[T]
4868
)
4969

5070
if 200 <= status_code < 300:
51-
if "data" in response_data and response_data["data"] is not None:
71+
72+
if issubclass(response_model, BaseModel) and isinstance(response_data["data"], dict):
5273
response_data["data"] = response_model.model_validate(response_data["data"])
74+
5375
return ApiResponse[T].model_validate(response_data)
5476

5577
try:
@@ -92,6 +114,5 @@ def send_request(self, method: str, endpoint: str, response_model: Type[T], **kw
92114
# Excluir propiedades con valor None
93115
kwargs["json"] = payload.model_dump(mode="json", by_alias=True, exclude_none=True)
94116

95-
print("Payload Request:", kwargs.get("json"))
96117
response = self._request(method, endpoint, **kwargs)
97118
return self._process_response(response, response_model)
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
from fiscalapi.models.common_models import FiscalApiSettings
2-
from fiscalapi.services.products_service import ProductService
2+
from fiscalapi.services.people_service import PeopleService
3+
from fiscalapi.services.product_service import ProductService
34

45

56
class FiscalApiClient:
7+
68
def __init__(self, settings: FiscalApiSettings):
79
self.products = ProductService(settings)
10+
self.people = PeopleService(settings)
11+
12+
813
#self.invoice_service = InvoiceService(settings)
914
# Otros servicios concretos pueden ser inicializados aquí
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from fiscalapi.models.common_models import ApiResponse, PagedList
2+
from fiscalapi.models.fiscalapi_models import Person, Product
3+
from fiscalapi.services.base_service import BaseService
4+
5+
6+
class PeopleService(BaseService):
7+
8+
# get paged list of people
9+
def get_list(self, page_number: int, page_size: int) -> ApiResponse[PagedList[Person]]:
10+
endpoint = f"people?pageNumber={page_number}&pageSize={page_size}"
11+
return self.send_request("GET", endpoint, PagedList[Person])
12+
13+
# get person by id
14+
def get_by_id(self, person_id: int) -> ApiResponse[Person]:
15+
endpoint = f"people/{person_id}"
16+
return self.send_request("GET", endpoint, Person)
17+
18+
# create person
19+
def create(self, person: Person) -> ApiResponse[Person]:
20+
endpoint = "people"
21+
return self.send_request("POST", endpoint, Person, payload=person)
22+
23+
# update person
24+
def update(self, person: Person) -> ApiResponse[Person]:
25+
endpoint = f"people/{person.id}"
26+
return self.send_request("PUT", endpoint, Person, payload=person)
27+
28+
# delete person
29+
def delete(self, person_id: str) -> ApiResponse[bool]:
30+
endpoint = f"people/{person_id}"
31+
return self.send_request("DELETE", endpoint, bool)
32+
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from fiscalapi.models.common_models import ApiResponse, PagedList
22
from fiscalapi.models.fiscalapi_models import Product
3-
from fiscalapi.services.common_services import BaseService
3+
from fiscalapi.services.base_service import BaseService
44

55

66
class ProductService(BaseService):

requirements.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ build==1.2.2.post1
33
certifi==2024.12.14
44
charset-normalizer==3.4.1
55
colorama==0.4.6
6+
dnspython==2.7.0
7+
email_validator==2.2.0
68
idna==3.10
79
packaging==24.2
810
pydantic==2.10.5

0 commit comments

Comments
 (0)