From 157f3d14ec79a1e2120ebb6e6947857922f6b448 Mon Sep 17 00:00:00 2001 From: Julien Denizot Date: Sun, 21 Jun 2026 08:13:50 +0000 Subject: [PATCH] feat: add SuperPDP invoice event creation --- enuxia_einvoice/providers/superpdp/client.py | 50 +++++++++++++++++++ .../providers/superpdp/test_client.py | 46 +++++++++++++++++ 2 files changed, 96 insertions(+) diff --git a/enuxia_einvoice/providers/superpdp/client.py b/enuxia_einvoice/providers/superpdp/client.py index 1bf5832..388cc56 100644 --- a/enuxia_einvoice/providers/superpdp/client.py +++ b/enuxia_einvoice/providers/superpdp/client.py @@ -462,6 +462,56 @@ class SuperPDPClient: return self._read_response(response) + def create_invoice_event( + self, + access_token: str, + *, + invoice_id: int, + status_code: str, + details: dict[str, Any] | None = None, + ) -> dict[str, Any]: + """Créer un événement associé à une facture.""" + + try: + normalized_invoice_id = int(invoice_id) + except (TypeError, ValueError) as exc: + raise ValueError( + "invoice_id doit être un entier valide." + ) from exc + + if normalized_invoice_id <= 0: + raise ValueError( + "invoice_id doit être supérieur à zéro." + ) + + normalized_status_code = str( + status_code or "" + ).strip() + + if not normalized_status_code: + raise ValueError( + "status_code est obligatoire." + ) + + payload: dict[str, Any] = { + "invoice_id": normalized_invoice_id, + "status_code": normalized_status_code, + } + + if details is not None: + payload["details"] = details + + response = self.session.post( + f"{self.base_url}/v1.beta/invoice_events", + headers=self._authorization_headers( + access_token + ), + json=payload, + timeout=self.timeout, + ) + + return self._read_response(response) + @staticmethod def _authorization_headers( access_token: str, diff --git a/enuxia_einvoice/providers/superpdp/test_client.py b/enuxia_einvoice/providers/superpdp/test_client.py index 443c105..02925c4 100644 --- a/enuxia_einvoice/providers/superpdp/test_client.py +++ b/enuxia_einvoice/providers/superpdp/test_client.py @@ -535,6 +535,52 @@ class TestSuperPDPClient(unittest.TestCase): ) + def test_create_invoice_event(self) -> None: + response = Mock() + response.ok = True + response.status_code = 201 + response.json.return_value = { + "id": 42, + "invoice_id": 79635, + "status_code": "fr:212", + } + + self.session.post.return_value = response + + result = self.client.create_invoice_event( + "secret-access-token", + invoice_id=79635, + status_code="fr:212", + ) + + self.assertEqual( + result["status_code"], + "fr:212", + ) + + self.assertEqual( + result["invoice_id"], + 79635, + ) + + self.session.post.assert_called_once_with( + ( + "https://api.superpdp.tech/" + "v1.beta/invoice_events" + ), + headers={ + "Authorization": ( + "Bearer secret-access-token" + ), + }, + json={ + "invoice_id": 79635, + "status_code": "fr:212", + }, + timeout=(5, 30), + ) + + def test_list_incoming_invoices_with_expansion( self, ) -> None: