Skip to content

Commit d489f94

Browse files
committed
tax file service initial added
1 parent 85d4f1c commit d489f94

File tree

6 files changed

+159
-5
lines changed

6 files changed

+159
-5
lines changed

certificates/cert.pem

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIFazCCA1OgAwIBAgIUAcW1jm0oxA7uzQRVMCAEebAEPjcwDQYJKoZIhvcNAQEL
3+
BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
4+
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yNTAyMDYxNDM2MjdaFw0yNjAy
5+
MDYxNDM2MjdaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
6+
HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggIiMA0GCSqGSIb3DQEB
7+
AQUAA4ICDwAwggIKAoICAQDLf0fg92cFh5dpGFJ84ArJraOai+kW4YSL9245nJP/
8+
z+XViPFCeQxmocyb5SAkFTrCKIzMFrxLDdkH/rcBNbVCnK0uXjLWWq1am3U5VuyO
9+
OlG4/RqFywynT5Yp+lP8RJErkffVc+ZNYxNHlXUYG8SBX5r3R9c6qBp+idY2DYyJ
10+
p3uJrcY+IwLC+UaUJrWlAG8gbYW+cYf5N42YJGfsk/vN3e+QaCvJa/6R7rTmn4fl
11+
rJP0VPZvjn7ocbnLfVaAIlHSCIrcm6sotVQcMUoKlzhBKqWgYrMvl1WUFKt/q51Y
12+
ciTIFULjgv56ClT0fMTTYZXDah6SNNG7uw+syrBiPDKiw3hTqwRozRgzPOFHRZ3x
13+
6vcEZE4cBvELrfvqCFQC9BBiaRlOXg/L4ZRbyegKzDHK647ijPqdxkXK0weO5fE6
14+
krGTuJrzPhN9Qm06t8y9+FKHxj2navui9Z3o/f7/YHX9u1DplPc1R9QLp23y0Tf3
15+
OwNy07hcegB0/bdazIHmxN5raZdlpI1uqd6mLTZa5eNayWzfwb2oB2Q4aUNVhK/m
16+
PCvZyjqVlvVQKNwpoPAOadGCGXVsBqt0EQ3DqtTRfcBBAx28QFGpyvKCsPbqEZh/
17+
CvUih/HPuHEWvfYuwqMOJSLRwFXwbG0SBpZvtVFitNWORZsbeclhrAENSLURirFM
18+
4wIDAQABo1MwUTAdBgNVHQ4EFgQU7K+3pypdVzXywHi+iJHQ7m+n1HIwHwYDVR0j
19+
BBgwFoAU7K+3pypdVzXywHi+iJHQ7m+n1HIwDwYDVR0TAQH/BAUwAwEB/zANBgkq
20+
hkiG9w0BAQsFAAOCAgEABXUq3WraB77Ylmrd6ECkqcav7fAqbmGPufY8ywa2+/RV
21+
tly7W03xKOv6erQVInctMtscm7WcWD9vkvC8QGdbry9yKRex3xb8Po4yDii7ZHKB
22+
6HPQ7gp4bOJUzuUdRwe0aobycWxaeQrXF7yGHT86bdhLrfSDruAm3BMjYrx109RZ
23+
RL9fvB3qog+Z5Vehgq+RaDEudfNh/kC7nFIHIjviMBwabXZWVsrIJA9NRu8nVqDm
24+
Ve+myGB4xZYct7sfihdAvzs1d/lsdFWy4si4wavfJdiwL4Y19CN9M2o24a3FwB1I
25+
c8c4a8w67KeoRVfin6ascUML3VF5D3AJ8UZtad+NOvoAdSGtPTdWobCzsil0qisb
26+
bnhK5+ZjtmHlQhlnbzG6BeszpqwBL0qtiCCq8rUgzcGm8jPnVo4DNTIhDuJV5IZL
27+
DtnXY71B3pD7aAc27r0J70YCv5aJLUIs+L/arkzsZlYhi7m7ReEoGFrvg4rdWgX3
28+
Y+uGL07g0tnxSUSXgvnHscb/KWYGVREHlkWTS6TXIY3V61DqkHCByHzY386C/DCu
29+
z8cUtXqSralvwQ2kaJ5p+yZ7eh+TFNUPLSMnpVwohVlfHFlkjSw4pyGic9C6Gx/4
30+
UuHkXpWSDlDcwdMEqKBp/os1vvhuGhCSpDgneVYjF4yuIFu3x1AwdnmgmmBvu1w=
31+
-----END CERTIFICATE-----

certificates/key.pem

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
-----BEGIN PRIVATE KEY-----
2+
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
51+
P6iaupM5anRsbT3aPDrWq6kflu9Qhg==
52+
-----END PRIVATE KEY-----

fiscalapi/models/fiscalapi_models.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import datetime
12
from decimal import Decimal
23
from pydantic import ConfigDict, EmailStr, Field
34
from fiscalapi.models.common_models import BaseDto, CatalogDto
@@ -73,4 +74,21 @@ class Person(BaseDto):
7374
model_config = ConfigDict(
7475
populate_by_name=True,
7576
json_encoders={Decimal: str}
76-
)
77+
)
78+
79+
80+
class TaxFile(BaseDto):
81+
"""Modelo TaxFile que representa un componente de un par CSD: certificado (.cer) o llave privada (.key)."""
82+
83+
person_id: Optional[str] = Field(default=None, alias="personId", description="Id de la persona propietaria del certificado.")
84+
tin: Optional[str] = Field(default=None, alias="tin", description="RFC del propietario del certificado. Debe coincidir con el RFC del certificado.")
85+
base64_file: Optional[str] = Field(default=None, alias="base64File", description="Archivo certificado o llave privada en formato base64.")
86+
file_type: Literal[0, 1] = Field(default=None, alias="fileType", description="Tipo de archivo: 0 para certificado, 1 para llave privada.")
87+
password: Optional[str] = Field(default=None, alias="password", description="Contraseña de la llave privada.")
88+
valid_from: Optional[datetime.datetime] = Field(default=None, alias="validFrom", description="Fecha de inicio de vigencia del certificado o llave privada.")
89+
valid_to: Optional[datetime.datetime] = Field(default=None, alias="validTo", description="Fecha de fin de vigencia del certificado o llave privada.")
90+
sequence: Optional[int] = Field(default=None, alias="sequence", description="Numero de secuencia que identifica el par entre certificado y llave privada.")
91+
92+
model_config = ConfigDict(
93+
populate_by_name=True
94+
)

fiscalapi/services/base_service.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
import urllib3
2+
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
13
from typing import Type, TypeVar
4+
import certifi
25
from pydantic import BaseModel
36
import requests
47
from fiscalapi.models.common_models import ApiResponse, FiscalApiSettings, ValidationFailure
58

6-
#T = TypeVar('T', bound=BaseModel)
7-
89
T = TypeVar('T')
910

1011

@@ -31,7 +32,7 @@ def _request(self, method: str, endpoint: str, **kwargs) -> requests.Response:
3132
headers.update(kwargs.pop("headers"))
3233

3334
# Disable certificate validation (for development only!)
34-
kwargs.setdefault("verify", False)
35+
# kwargs.setdefault("verify", False)
3536

3637

3738
# print payload request
@@ -40,8 +41,16 @@ def _request(self, method: str, endpoint: str, **kwargs) -> requests.Response:
4041
# print line breaks
4142
print("\n\n")
4243

44+
45+
# *** DEV ONLY: Disable SSL verification for localhost ***
46+
if "localhost" in url or "127.0.0.1" in url:
47+
kwargs["verify"] = False
48+
else:
49+
# Use the default cert store
50+
kwargs["verify"] = certifi.where()
51+
4352

44-
# Send request
53+
# send request
4554
response = requests.request(method=method, url=url, headers=headers, **kwargs)
4655

4756
# print payload response

fiscalapi/services/fiscalapi_client.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
from fiscalapi.models.common_models import FiscalApiSettings
22
from fiscalapi.services.people_service import PeopleService
33
from fiscalapi.services.product_service import ProductService
4+
from fiscalapi.services.tax_file_servive import TaxFileService
5+
46

57

68
class FiscalApiClient:
79

810
def __init__(self, settings: FiscalApiSettings):
911
self.products = ProductService(settings)
1012
self.people = PeopleService(settings)
13+
self.tax_files = TaxFileService(settings)
1114

1215

1316
#self.invoice_service = InvoiceService(settings)
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from fiscalapi.models.common_models import ApiResponse, PagedList
2+
from fiscalapi.models.fiscalapi_models import TaxFile
3+
from fiscalapi.services.base_service import BaseService
4+
5+
class TaxFileService(BaseService):
6+
7+
# get paged list of tax files
8+
def get_list(self, page_number: int, page_size: int) -> ApiResponse[PagedList[TaxFile]]:
9+
endpoint = f"tax-files?pageNumber={page_number}&pageSize={page_size}"
10+
return self.send_request("GET", endpoint, PagedList[TaxFile])
11+
12+
# get tax file by id
13+
def get_by_id(self, tax_file_id: int) -> ApiResponse[TaxFile]:
14+
endpoint = f"tax-files/{tax_file_id}"
15+
return self.send_request("GET", endpoint, TaxFile)
16+
17+
18+
# create tax file (upload tax file)
19+
def create(self, tax_file: TaxFile) -> ApiResponse[TaxFile]:
20+
endpoint = "tax-files"
21+
return self.send_request("POST", endpoint, TaxFile, payload=tax_file)
22+
23+
24+
# delete tax file
25+
def delete(self, tax_file_id: str) -> ApiResponse[bool]:
26+
endpoint = f"tax-files/{tax_file_id}"
27+
return self.send_request("DELETE", endpoint, bool)
28+
29+
# get default tax files for a given person)
30+
# obtiene el último par de certificados válidos y vigente de una persona. Es decir sus certificados por defecto.
31+
def get_default_values(self, person_id: int) -> ApiResponse[list[TaxFile]]:
32+
endpoint = f"tax-files/{person_id}/default-values"
33+
return self.send_request("GET", endpoint, list[TaxFile])
34+
35+
36+
# get default references for a given person
37+
# obtiene el último par de ids de certificados válidos y vigente de una persona. Es decir sus certificados por defecto (solo los ids)
38+
def get_default_references(self, person_id: int) -> ApiResponse[list[TaxFile]]:
39+
endpoint = f"tax-files/{person_id}/default-references"
40+
return self.send_request("GET", endpoint, list[TaxFile])
41+

0 commit comments

Comments
 (0)