From d8875ce5ba20e39f6ac354e15bd164347af70d07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felipe=20L=C3=B3pez?= Date: Fri, 21 Mar 2025 19:32:07 -0600 Subject: [PATCH 1/5] global field --- facturapi/resources/invoices.py | 5 +++++ facturapi/types/exc.py | 3 +-- facturapi/version.py | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/facturapi/resources/invoices.py b/facturapi/resources/invoices.py index f922d35..c439398 100644 --- a/facturapi/resources/invoices.py +++ b/facturapi/resources/invoices.py @@ -106,6 +106,7 @@ class InvoiceRequest(BaseModel): pdf_custom_section: Optional[str] addenda: Optional[str] namespaces: Optional[Namespace] + global_: Optional[Dict] = None @dataclass @@ -161,6 +162,7 @@ class Invoice(Creatable, Deletable, Downloadable, Queryable, Retrievable): series: Optional[str] = None related: Optional[List[str]] = None relation: Optional[InvoiceRelation] = None + global_: Optional[Dict] = None @classmethod def create(cls, data: InvoiceRequest) -> 'Invoice': @@ -174,6 +176,9 @@ def create(cls, data: InvoiceRequest) -> 'Invoice': """ cleaned_data = data.dict(exclude_unset=True, exclude_none=True) + if data.global_: + cleaned_data['global'] = cleaned_data.pop('global_') + return cast('Invoice', cls._create(**cleaned_data)) @classmethod diff --git a/facturapi/types/exc.py b/facturapi/types/exc.py index 7ae7674..90eede8 100644 --- a/facturapi/types/exc.py +++ b/facturapi/types/exc.py @@ -2,8 +2,7 @@ from typing import Any, Dict -class FacturapiException(Exception): - ... +class FacturapiException(Exception): ... class NoResultFound(FacturapiException): diff --git a/facturapi/version.py b/facturapi/version.py index a8ade31..80507a3 100644 --- a/facturapi/version.py +++ b/facturapi/version.py @@ -1,2 +1,2 @@ -__version__ = '0.1.1' # pragma: no cover +__version__ = '0.1.2.dev0' # pragma: no cover CLIENT_VERSION = __version__ From 056a43ebb8fd8ff30f42d307d49d2f4b65a44581 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felipe=20L=C3=B3pez?= Date: Fri, 21 Mar 2025 20:10:40 -0600 Subject: [PATCH 2/5] add substitution --- facturapi/resources/invoices.py | 7 +++++-- facturapi/version.py | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/facturapi/resources/invoices.py b/facturapi/resources/invoices.py index c439398..1a932af 100644 --- a/facturapi/resources/invoices.py +++ b/facturapi/resources/invoices.py @@ -182,7 +182,7 @@ def create(cls, data: InvoiceRequest) -> 'Invoice': return cast('Invoice', cls._create(**cleaned_data)) @classmethod - def cancel(cls, invoice_id: str, motive: str) -> 'Invoice': + def cancel(cls, invoice_id: str, motive: str, substitution: Optional[str] = None) -> 'Invoice': """Cancel an invoice. Calls a DELETE request on invoice resource. @@ -194,7 +194,10 @@ def cancel(cls, invoice_id: str, motive: str) -> 'Invoice': Invoice: The cancelled invoice resource. """ - return cast('Invoice', cls._delete(invoice_id, **dict(motive=motive))) + data = dict(motive=motive) + if substitution: + data['substitution'] = substitution + return cast('Invoice', cls._delete(invoice_id, **data)) @property def customer(self) -> Customer: diff --git a/facturapi/version.py b/facturapi/version.py index 80507a3..391fc04 100644 --- a/facturapi/version.py +++ b/facturapi/version.py @@ -1,2 +1,2 @@ -__version__ = '0.1.2.dev0' # pragma: no cover +__version__ = '0.1.2.dev1' # pragma: no cover CLIENT_VERSION = __version__ From b36afb51a91e6424fbc6d41dc3037ef26d762ccb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felipe=20L=C3=B3pez?= Date: Fri, 21 Mar 2025 21:00:42 -0600 Subject: [PATCH 3/5] add substitution --- facturapi/types/queries.py | 1 + facturapi/version.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/facturapi/types/queries.py b/facturapi/types/queries.py index 9902fe4..d26f768 100644 --- a/facturapi/types/queries.py +++ b/facturapi/types/queries.py @@ -75,3 +75,4 @@ def dict(self, *args, **kwargs) -> Dict[str, Any]: class InvoiceQuery(BaseQuery): motive: Optional[str] + substitution: Optional[str] diff --git a/facturapi/version.py b/facturapi/version.py index 391fc04..c6876d9 100644 --- a/facturapi/version.py +++ b/facturapi/version.py @@ -1,2 +1,2 @@ -__version__ = '0.1.2.dev1' # pragma: no cover +__version__ = '0.1.2.dev2' # pragma: no cover CLIENT_VERSION = __version__ From 8ac4fad0cbcede179420ea1baca87729df1d59e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felipe=20L=C3=B3pez?= Date: Sat, 22 Mar 2025 11:21:57 -0600 Subject: [PATCH 4/5] add related documents --- .github/workflows/test.yml | 2 +- facturapi/resources/invoices.py | 8 +++++--- facturapi/types/exc.py | 3 ++- facturapi/types/general.py | 6 ++++++ facturapi/version.py | 2 +- 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8b1f1a0..86e2f14 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,7 +20,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [3.7, 3.8, 3.9, '3.10'] + python-version: [3.8, 3.9, '3.10'] steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} diff --git a/facturapi/resources/invoices.py b/facturapi/resources/invoices.py index 1a932af..72af57f 100644 --- a/facturapi/resources/invoices.py +++ b/facturapi/resources/invoices.py @@ -17,6 +17,7 @@ class to create the resource and a class to represent an ItemPart, Namespace, ProductBasicInfo, + RelatedDocument, ) from ..types.queries import InvoiceQuery from .base import Creatable, Deletable, Downloadable, Queryable, Retrievable @@ -101,8 +102,7 @@ class InvoiceRequest(BaseModel): exchange: Optional[float] = 1.0 conditions: Optional[str] foreign_trade: Optional[Dict] - related: Optional[List[str]] - relation: Optional[InvoiceRelation] + related_documents: Optional[List[RelatedDocument]] pdf_custom_section: Optional[str] addenda: Optional[str] namespaces: Optional[Namespace] @@ -182,7 +182,9 @@ def create(cls, data: InvoiceRequest) -> 'Invoice': return cast('Invoice', cls._create(**cleaned_data)) @classmethod - def cancel(cls, invoice_id: str, motive: str, substitution: Optional[str] = None) -> 'Invoice': + def cancel( + cls, invoice_id: str, motive: str, substitution: Optional[str] = None + ) -> 'Invoice': """Cancel an invoice. Calls a DELETE request on invoice resource. diff --git a/facturapi/types/exc.py b/facturapi/types/exc.py index 90eede8..7ae7674 100644 --- a/facturapi/types/exc.py +++ b/facturapi/types/exc.py @@ -2,7 +2,8 @@ from typing import Any, Dict -class FacturapiException(Exception): ... +class FacturapiException(Exception): + ... class NoResultFound(FacturapiException): diff --git a/facturapi/types/general.py b/facturapi/types/general.py index 913db82..9e6b7fc 100644 --- a/facturapi/types/general.py +++ b/facturapi/types/general.py @@ -2,6 +2,7 @@ from pydantic import BaseModel +from ..types.enums import InvoiceRelation from .validators import sanitize_dict @@ -71,3 +72,8 @@ class SanitizedDict(dict): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) sanitize_dict(self) + + +class RelatedDocument(BaseModel): + relationship: InvoiceRelation + documents: List[str] = [] diff --git a/facturapi/version.py b/facturapi/version.py index c6876d9..bb13148 100644 --- a/facturapi/version.py +++ b/facturapi/version.py @@ -1,2 +1,2 @@ -__version__ = '0.1.2.dev2' # pragma: no cover +__version__ = '0.1.2.dev3' # pragma: no cover CLIENT_VERSION = __version__ From f19ea059103980d5d729d10e7c1784691d4bb2b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felipe=20L=C3=B3pez?= Date: Sat, 22 Mar 2025 11:52:10 -0600 Subject: [PATCH 5/5] log --- facturapi/resources/base.py | 8 ++++++-- facturapi/version.py | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/facturapi/resources/base.py b/facturapi/resources/base.py index bf14814..c8ba8b5 100644 --- a/facturapi/resources/base.py +++ b/facturapi/resources/base.py @@ -41,8 +41,12 @@ def __init__(self, **_): # pragma: no cover @classmethod def _from_dict(cls, obj_dict: Dict[str, Any]) -> 'Resource': - cls._filter_excess_fields(obj_dict) - return cls(**obj_dict) + try: + cls._filter_excess_fields(obj_dict) + return cls(**obj_dict) + except Exception as e: + print(obj_dict) + raise e @classmethod def _filter_excess_fields(cls, obj_dict: Dict[str, Any]) -> None: diff --git a/facturapi/version.py b/facturapi/version.py index bb13148..9cb01cb 100644 --- a/facturapi/version.py +++ b/facturapi/version.py @@ -1,2 +1,2 @@ -__version__ = '0.1.2.dev3' # pragma: no cover +__version__ = '0.1.2.dev4' # pragma: no cover CLIENT_VERSION = __version__