odoo-addon-l10n-es-verifactu-oca 16.0.1.0.0.22__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of odoo-addon-l10n-es-verifactu-oca might be problematic. Click here for more details.

Files changed (68) hide show
  1. odoo/addons/l10n_es_verifactu_oca/README.rst +151 -0
  2. odoo/addons/l10n_es_verifactu_oca/__init__.py +2 -0
  3. odoo/addons/l10n_es_verifactu_oca/__manifest__.py +43 -0
  4. odoo/addons/l10n_es_verifactu_oca/data/account_fiscal_position_template_data.xml +149 -0
  5. odoo/addons/l10n_es_verifactu_oca/data/ir_config_parameter.xml +9 -0
  6. odoo/addons/l10n_es_verifactu_oca/data/ir_cron.xml +14 -0
  7. odoo/addons/l10n_es_verifactu_oca/data/mail_activity_data.xml +11 -0
  8. odoo/addons/l10n_es_verifactu_oca/data/neutralize.sql +2 -0
  9. odoo/addons/l10n_es_verifactu_oca/data/verifactu_map_data.xml +128 -0
  10. odoo/addons/l10n_es_verifactu_oca/data/verifactu_registration_key_data.xml +207 -0
  11. odoo/addons/l10n_es_verifactu_oca/data/verifactu_tax_agency_data.xml +19 -0
  12. odoo/addons/l10n_es_verifactu_oca/i18n/es.po +1640 -0
  13. odoo/addons/l10n_es_verifactu_oca/i18n/l10n_es_verifactu_oca.pot +1598 -0
  14. odoo/addons/l10n_es_verifactu_oca/models/__init__.py +15 -0
  15. odoo/addons/l10n_es_verifactu_oca/models/account_fiscal_position.py +34 -0
  16. odoo/addons/l10n_es_verifactu_oca/models/account_fiscal_position_template.py +18 -0
  17. odoo/addons/l10n_es_verifactu_oca/models/account_journal.py +64 -0
  18. odoo/addons/l10n_es_verifactu_oca/models/account_move.py +558 -0
  19. odoo/addons/l10n_es_verifactu_oca/models/aeat_tax_agency.py +30 -0
  20. odoo/addons/l10n_es_verifactu_oca/models/res_company.py +48 -0
  21. odoo/addons/l10n_es_verifactu_oca/models/res_partner.py +26 -0
  22. odoo/addons/l10n_es_verifactu_oca/models/verifactu_chaining.py +30 -0
  23. odoo/addons/l10n_es_verifactu_oca/models/verifactu_developer.py +16 -0
  24. odoo/addons/l10n_es_verifactu_oca/models/verifactu_invoice_entry.py +378 -0
  25. odoo/addons/l10n_es_verifactu_oca/models/verifactu_invoice_entry_response.py +122 -0
  26. odoo/addons/l10n_es_verifactu_oca/models/verifactu_invoice_entry_response_line.py +35 -0
  27. odoo/addons/l10n_es_verifactu_oca/models/verifactu_map.py +66 -0
  28. odoo/addons/l10n_es_verifactu_oca/models/verifactu_mixin.py +449 -0
  29. odoo/addons/l10n_es_verifactu_oca/models/verifactu_registration_key.py +24 -0
  30. odoo/addons/l10n_es_verifactu_oca/readme/CONFIGURE.rst +18 -0
  31. odoo/addons/l10n_es_verifactu_oca/readme/CONTRIBUTORS.rst +16 -0
  32. odoo/addons/l10n_es_verifactu_oca/readme/DESCRIPTION.rst +1 -0
  33. odoo/addons/l10n_es_verifactu_oca/readme/INSTALL.rst +4 -0
  34. odoo/addons/l10n_es_verifactu_oca/readme/ROADMAP.rst +15 -0
  35. odoo/addons/l10n_es_verifactu_oca/readme/USAGE.rst +1 -0
  36. odoo/addons/l10n_es_verifactu_oca/security/ir.model.access.csv +22 -0
  37. odoo/addons/l10n_es_verifactu_oca/security/verifactu_security.xml +6 -0
  38. odoo/addons/l10n_es_verifactu_oca/static/description/icon.png +0 -0
  39. odoo/addons/l10n_es_verifactu_oca/static/description/index.html +505 -0
  40. odoo/addons/l10n_es_verifactu_oca/tests/__init__.py +2 -0
  41. odoo/addons/l10n_es_verifactu_oca/tests/common.py +276 -0
  42. odoo/addons/l10n_es_verifactu_oca/tests/json/verifactu_mocked_response_1.json +35 -0
  43. odoo/addons/l10n_es_verifactu_oca/tests/json/verifactu_mocked_response_2.json +35 -0
  44. odoo/addons/l10n_es_verifactu_oca/tests/json/verifactu_out_invoice_s_iva10b_s_iva21s_dict.json +59 -0
  45. odoo/addons/l10n_es_verifactu_oca/tests/json/verifactu_out_invoice_s_iva21s_s_req52_dict.json +58 -0
  46. odoo/addons/l10n_es_verifactu_oca/tests/json/verifactu_out_refund_s_iva10b_s_iva10b_s_iva21s_dict.json +66 -0
  47. odoo/addons/l10n_es_verifactu_oca/tests/test_10n_es_verifactu.py +392 -0
  48. odoo/addons/l10n_es_verifactu_oca/tests/test_verifactu_invoice.py +348 -0
  49. odoo/addons/l10n_es_verifactu_oca/views/account_fiscal_position_view.xml +30 -0
  50. odoo/addons/l10n_es_verifactu_oca/views/account_journal_view.xml +28 -0
  51. odoo/addons/l10n_es_verifactu_oca/views/account_move_view.xml +219 -0
  52. odoo/addons/l10n_es_verifactu_oca/views/aeat_tax_agency_view.xml +31 -0
  53. odoo/addons/l10n_es_verifactu_oca/views/report_invoice.xml +26 -0
  54. odoo/addons/l10n_es_verifactu_oca/views/res_company_view.xml +50 -0
  55. odoo/addons/l10n_es_verifactu_oca/views/res_partner_view.xml +14 -0
  56. odoo/addons/l10n_es_verifactu_oca/views/verifactu_chaining_view.xml +47 -0
  57. odoo/addons/l10n_es_verifactu_oca/views/verifactu_developer_view.xml +48 -0
  58. odoo/addons/l10n_es_verifactu_oca/views/verifactu_invoice_entry_response_view.xml +149 -0
  59. odoo/addons/l10n_es_verifactu_oca/views/verifactu_invoice_entry_view.xml +124 -0
  60. odoo/addons/l10n_es_verifactu_oca/views/verifactu_map_lines_view.xml +20 -0
  61. odoo/addons/l10n_es_verifactu_oca/views/verifactu_map_view.xml +53 -0
  62. odoo/addons/l10n_es_verifactu_oca/views/verifactu_registration_keys_view.xml +42 -0
  63. odoo/addons/l10n_es_verifactu_oca/wizards/__init__.py +1 -0
  64. odoo/addons/l10n_es_verifactu_oca/wizards/account_move_reversal.py +16 -0
  65. odoo_addon_l10n_es_verifactu_oca-16.0.1.0.0.22.dist-info/METADATA +168 -0
  66. odoo_addon_l10n_es_verifactu_oca-16.0.1.0.0.22.dist-info/RECORD +68 -0
  67. odoo_addon_l10n_es_verifactu_oca-16.0.1.0.0.22.dist-info/WHEEL +5 -0
  68. odoo_addon_l10n_es_verifactu_oca-16.0.1.0.0.22.dist-info/top_level.txt +1 -0
@@ -0,0 +1,276 @@
1
+ # Copyright 2024 FactorLibre - Luis J. Salvatierra
2
+ # Copyright 2025 Tecnativa - Pedro M. Baeza
3
+ from odoo import Command, fields
4
+
5
+ from odoo.addons.l10n_es_aeat.tests.test_l10n_es_aeat_certificate import (
6
+ TestL10nEsAeatCertificateBase,
7
+ )
8
+ from odoo.addons.l10n_es_aeat.tests.test_l10n_es_aeat_mod_base import (
9
+ TestL10nEsAeatModBase,
10
+ )
11
+
12
+
13
+ class TestVerifactuCommon(TestL10nEsAeatModBase, TestL10nEsAeatCertificateBase):
14
+ """Common base class for VeriFactu tests with shared setup and utilities."""
15
+
16
+ @classmethod
17
+ def setUpClass(cls):
18
+ super().setUpClass()
19
+ cls.maxDiff = None
20
+ cls.fp_nacional = cls.env.ref(f"l10n_es.{cls.company.id}_fp_nacional")
21
+ cls.fp_registration_key_01 = cls.env.ref(
22
+ "l10n_es_verifactu_oca.verifactu_registration_keys_01"
23
+ )
24
+ cls.fp_nacional.verifactu_registration_key = cls.fp_registration_key_01
25
+ cls.fp_recargo = cls.env.ref(f"l10n_es.{cls.company.id}_fp_recargo")
26
+ cls.fp_recargo.verifactu_registration_key = cls.fp_registration_key_01
27
+ cls.partner = cls.env["res.partner"].create(
28
+ {
29
+ "name": "Test partner",
30
+ "vat": "89890001K",
31
+ "country_id": cls.env.ref("base.es").id,
32
+ }
33
+ )
34
+ cls.product = cls.env["product.product"].create({"name": "Test product"})
35
+ cls.account_expense = cls.env.ref(
36
+ "l10n_es.%s_account_common_600" % cls.company.id
37
+ )
38
+ cls.verifactu_developer = cls.env["verifactu.developer"].create(
39
+ {
40
+ "name": "Odoo Developer",
41
+ "vat": "A12345674",
42
+ "sif_name": "odoo",
43
+ "version": "1.0",
44
+ }
45
+ )
46
+ cls.verifactu_chaining = cls.env["verifactu.chaining"].create(
47
+ {"name": "VERI*FACTU Chaining", "sif_id": "11", "installation_number": 1}
48
+ )
49
+ cls.company.write(
50
+ {
51
+ "verifactu_enabled": True,
52
+ "verifactu_test": True,
53
+ "vat": "G87846952",
54
+ "country_id": cls.env.ref("base.es").id,
55
+ "tax_agency_id": cls.env.ref("l10n_es_aeat.aeat_tax_agency_spain"),
56
+ "verifactu_developer_id": cls.verifactu_developer.id,
57
+ "verifactu_chaining_id": cls.verifactu_chaining.id,
58
+ }
59
+ )
60
+ cls.invoice = cls.env["account.move"].create(
61
+ {
62
+ "company_id": cls.company.id,
63
+ "partner_id": cls.partner.id,
64
+ "invoice_date": "2026-01-01",
65
+ "move_type": "out_invoice",
66
+ "invoice_line_ids": [
67
+ Command.create(
68
+ {
69
+ "product_id": cls.product.id,
70
+ "account_id": cls.account_expense.id,
71
+ "name": "Test line",
72
+ "price_unit": 100,
73
+ "quantity": 1,
74
+ },
75
+ )
76
+ ],
77
+ }
78
+ )
79
+
80
+ def _create_test_invoice(
81
+ self,
82
+ company=None,
83
+ date="2024-01-01",
84
+ amount=100,
85
+ partner=None,
86
+ move_type="out_invoice",
87
+ product=None,
88
+ account=None,
89
+ name=None,
90
+ ):
91
+ """
92
+ Helper method to create a test invoice with customizable parameters.
93
+
94
+ Args:
95
+ company: Company for the invoice (defaults to self.company)
96
+ date: Invoice date (defaults to "2024-01-01")
97
+ amount: Invoice line amount (defaults to 100)
98
+ partner: Invoice partner (defaults to self.partner)
99
+ move_type: Invoice type (defaults to "out_invoice")
100
+ product: Product for invoice line (defaults to self.product)
101
+ account: Account for invoice line (defaults to self.account_expense)
102
+ name: Invoice line description (defaults to "Test line")
103
+
104
+ Returns:
105
+ account.move: Created invoice record
106
+ """
107
+ company = company or self.company
108
+ partner = partner or self.partner
109
+ product = product or self.product
110
+ if account is None:
111
+ if company == self.company:
112
+ account = self.account_expense
113
+ else:
114
+ account = self.env["account.account"].search(
115
+ [("company_id", "=", company.id), ("account_type", "=", "expense")],
116
+ limit=1,
117
+ )
118
+ if not account:
119
+ account = self.env["account.account"].search(
120
+ [("company_id", "=", company.id)], limit=1
121
+ )
122
+ if name is None:
123
+ name = f"Test line - {amount}"
124
+ return self.env["account.move"].create(
125
+ {
126
+ "company_id": company.id,
127
+ "partner_id": partner.id,
128
+ "invoice_date": date,
129
+ "move_type": move_type,
130
+ "invoice_line_ids": [
131
+ Command.create(
132
+ {
133
+ "product_id": product.id,
134
+ "account_id": account.id,
135
+ "name": name,
136
+ "price_unit": amount,
137
+ "quantity": 1,
138
+ },
139
+ )
140
+ ],
141
+ "aeat_state": "sent",
142
+ }
143
+ )
144
+
145
+ def _create_test_company(
146
+ self,
147
+ name="Test Company",
148
+ vat="B87654321",
149
+ verifactu_enabled=True,
150
+ ):
151
+ """
152
+ Helper method to create a test company configured for verifactu.
153
+
154
+ Args:
155
+ name: Company name
156
+ vat: Company VAT number (must be in valid Spanish format without country code)
157
+ verifactu_enabled: Enable verifactu for the company
158
+ verifactu_test: Set verifactu test mode
159
+
160
+ Returns:
161
+ res.company: Created company record
162
+ """
163
+ company = self.env["res.company"].create(
164
+ {"name": name, "vat": vat, "country_id": self.env.ref("base.es").id}
165
+ )
166
+ if not company.chart_template_id:
167
+ coa = self.env.ref("l10n_es.account_chart_template_pymes", False)
168
+ coa.try_loading(company=company, install_demo=False)
169
+ company.write(
170
+ {
171
+ "verifactu_enabled": verifactu_enabled,
172
+ "verifactu_test": True,
173
+ "tax_agency_id": self.env.ref("l10n_es_aeat.aeat_tax_agency_spain").id,
174
+ "verifactu_developer_id": self.verifactu_developer.id,
175
+ }
176
+ )
177
+ return company
178
+
179
+ def _prepare_invoice_for_verifactu(self, invoice):
180
+ """
181
+ Helper method to prepare an invoice for verifactu processing.
182
+ This includes posting the invoice and setting the registration date.
183
+
184
+ Args:
185
+ invoice: Invoice to prepare
186
+
187
+ Returns:
188
+ account.move: The prepared invoice
189
+ """
190
+ invoice.action_post()
191
+ invoice.verifactu_registration_date = fields.Datetime.now()
192
+ return invoice
193
+
194
+ def _create_and_prepare_invoice(self, **kwargs):
195
+ """
196
+ Helper method to create and prepare an invoice for verifactu in one step.
197
+
198
+ Args:
199
+ **kwargs: Arguments passed to _create_test_invoice
200
+
201
+ Returns:
202
+ account.move: Created and prepared invoice
203
+ """
204
+ invoice = self._create_test_invoice(**kwargs)
205
+ return self._prepare_invoice_for_verifactu(invoice)
206
+
207
+ def _verify_queue_creation(self, invoice):
208
+ """
209
+ Helper method to verify that a queue record was created for an invoice.
210
+
211
+ Args:
212
+ invoice: Invoice to verify queue creation for
213
+
214
+ Returns:
215
+ verifactu.invoice.entry: The created queue record
216
+ """
217
+ entry = invoice.last_verifactu_invoice_entry_id
218
+ self.assertTrue(
219
+ entry,
220
+ "Invoice should have a VERI*FACTU invoice entry after posting",
221
+ )
222
+ response_lines = entry.response_line_ids
223
+ self.assertEqual(len(response_lines), 1, "Should have exactly one queue record")
224
+ response_line = response_lines[-1]
225
+ self.assertEqual(
226
+ response_line.entry_id,
227
+ entry,
228
+ "Queue record should link to the VERI*FACTU invoice entry",
229
+ )
230
+ self.assertEqual(
231
+ response_line.company_id,
232
+ invoice.company_id,
233
+ "Queue record should belong to the same company",
234
+ )
235
+ return response_line
236
+
237
+ def _verify_response_integration(self, invoice, response_line):
238
+ """
239
+ Helper method to verify response line integration with verifactu.invoice.
240
+
241
+ Args:
242
+ invoice: Original invoice
243
+ response_line: Response line to verify
244
+
245
+ Returns:
246
+ bool: True if integration is correct
247
+ """
248
+ self.assertTrue(
249
+ response_line.document_id,
250
+ "Response line should have verifactu invoice reference",
251
+ )
252
+ self.assertEqual(
253
+ response_line.entry_id,
254
+ invoice.last_verifactu_invoice_entry_id,
255
+ "Response line should link to the correct VERI*FACTU invoice entry",
256
+ )
257
+ self.assertEqual(
258
+ response_line.entry_id.document_id,
259
+ invoice,
260
+ "Response line should reference the original invoice through verifactu entry",
261
+ )
262
+ return True
263
+
264
+ def _generate_invoice_entry(self, invoice):
265
+ """
266
+ Helper method to generate VERI*FACTU invoice entry for an invoice.
267
+ This assumes the invoice is already prepared for verifactu.
268
+
269
+ Args:
270
+ invoice: Prepared invoice
271
+
272
+ Returns:
273
+ verifactu.invoice: Created invoice entry
274
+ """
275
+ invoice._generate_verifactu_chaining()
276
+ return invoice.last_verifactu_invoice_entry_id
@@ -0,0 +1,35 @@
1
+ {
2
+ "CSV": "A-Y23JP3582934",
3
+ "DatosPresentacion": {
4
+ "NIFPresentador": "G87846952",
5
+ "TimestampPresentacion": "2026-01-01T16:54:41+02:00"
6
+ },
7
+ "Cabecera": {
8
+ "ObligadoEmision": {
9
+ "NombreRazon": "Spanish test company",
10
+ "NIF": "G87846952"
11
+ },
12
+ "Representante": "",
13
+ "RemisionVoluntaria": "",
14
+ "RemisionRequerimiento": ""
15
+ },
16
+ "TiempoEsperaEnvio": "60",
17
+ "EstadoEnvio": "Correcto",
18
+ "RespuestaLinea": [
19
+ {
20
+ "IDFactura": {
21
+ "IDEmisorFactura": "89890001K",
22
+ "NumSerieFactura": "INV/2026/00001",
23
+ "FechaExpedicionFactura": "01-01-2026"
24
+ },
25
+ "Operacion": {
26
+ "TipoOperacion": "Alta",
27
+ "Subsanacion": "",
28
+ "RechazoPrevio": "",
29
+ "SinRegistroPrevio": ""
30
+ },
31
+ "RefExterna": "",
32
+ "EstadoRegistro": "Correcto"
33
+ }
34
+ ]
35
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "CSV": "A-Y23JP3582934",
3
+ "DatosPresentacion": {
4
+ "NIFPresentador": "G87846952",
5
+ "TimestampPresentacion": "2026-01-01T16:54:41+02:00"
6
+ },
7
+ "Cabecera": {
8
+ "ObligadoEmision": {
9
+ "NombreRazon": "Spanish test company",
10
+ "NIF": "G87846952"
11
+ },
12
+ "Representante": "",
13
+ "RemisionVoluntaria": "",
14
+ "RemisionRequerimiento": ""
15
+ },
16
+ "TiempoEsperaEnvio": "60",
17
+ "EstadoEnvio": "Correcto",
18
+ "RespuestaLinea": [
19
+ {
20
+ "IDFactura": {
21
+ "IDEmisorFactura": "89890001K",
22
+ "NumSerieFactura": "INV/2026/00001",
23
+ "FechaExpedicionFactura": "01-01-2026"
24
+ },
25
+ "Operacion": {
26
+ "TipoOperacion": "Alta",
27
+ "Subsanacion": "",
28
+ "RechazoPrevio": "",
29
+ "SinRegistroPrevio": ""
30
+ },
31
+ "RefExterna": "",
32
+ "EstadoRegistro": "AceptadoConErrores"
33
+ }
34
+ ]
35
+ }
@@ -0,0 +1,59 @@
1
+ {
2
+ "RegistroAlta": {
3
+ "IDVersion": 1.0,
4
+ "IDFactura": {
5
+ "IDEmisorFactura": "G87846952",
6
+ "NumSerieFactura": "TEST001",
7
+ "FechaExpedicionFactura": "01-01-2026"
8
+ },
9
+ "NombreRazonEmisor": "Spanish test company",
10
+ "TipoFactura": "F1",
11
+ "DescripcionOperacion": "/",
12
+ "Destinatarios": {
13
+ "IDDestinatario": {
14
+ "NombreRazon": "Test partner",
15
+ "NIF": "89890001K"
16
+ }
17
+ },
18
+ "Desglose": {
19
+ "DetalleDesglose": [
20
+ {
21
+ "Impuesto": "01",
22
+ "ClaveRegimen": "01",
23
+ "CalificacionOperacion": "S1",
24
+ "TipoImpositivo": "10.0",
25
+ "BaseImponibleOimporteNoSujeto": 100.0,
26
+ "CuotaRepercutida": 10.0
27
+ },
28
+ {
29
+ "Impuesto": "01",
30
+ "ClaveRegimen": "01",
31
+ "CalificacionOperacion": "S1",
32
+ "TipoImpositivo": "21.0",
33
+ "BaseImponibleOimporteNoSujeto": 200.0,
34
+ "CuotaRepercutida": 42.0
35
+ }
36
+ ]
37
+ },
38
+ "CuotaTotal": 52.0,
39
+ "ImporteTotal": 352.0,
40
+ "Encadenamiento": {
41
+ "PrimerRegistro": "S"
42
+ },
43
+ "SistemaInformatico": {
44
+ "NombreRazon": "Odoo Developer",
45
+ "NIF": "A12345674",
46
+ "NombreSistemaInformatico": "odoo",
47
+ "IdSistemaInformatico": "11",
48
+ "Version": "1.0",
49
+ "NumeroInstalacion": 1,
50
+ "TipoUsoPosibleSoloVerifactu": "S",
51
+ "TipoUsoPosibleMultiOT": "S",
52
+ "IndicadorMultiplesOT": "N",
53
+ "IDOtro": {
54
+ "IDType": "",
55
+ "ID": ""
56
+ }
57
+ }
58
+ }
59
+ }
@@ -0,0 +1,58 @@
1
+ {
2
+ "RegistroAlta": {
3
+ "IDVersion": 1.0,
4
+ "IDFactura": {
5
+ "IDEmisorFactura": "G87846952",
6
+ "NumSerieFactura": "TEST003",
7
+ "FechaExpedicionFactura": "01-01-2026"
8
+ },
9
+ "NombreRazonEmisor": "Spanish test company",
10
+ "TipoFactura": "F1",
11
+ "DescripcionOperacion": "/",
12
+ "Destinatarios": {
13
+ "IDDestinatario": {
14
+ "NombreRazon": "Test partner",
15
+ "NIF": "89890001K"
16
+ }
17
+ },
18
+ "Desglose": {
19
+ "DetalleDesglose": [
20
+ {
21
+ "Impuesto": "01",
22
+ "ClaveRegimen": "01",
23
+ "CalificacionOperacion": "S1",
24
+ "TipoImpositivo": "21.0",
25
+ "BaseImponibleOimporteNoSujeto": 200.0,
26
+ "CuotaRepercutida": 42.0,
27
+ "TipoRecargoEquivalencia": 5.2,
28
+ "CuotaRecargoEquivalencia": 10.4
29
+ }
30
+ ]
31
+ },
32
+ "CuotaTotal": 52.4,
33
+ "ImporteTotal": 252.4,
34
+ "Encadenamiento": {
35
+ "RegistroAnterior": {
36
+ "FechaExpedicionFactura": "01-01-2026",
37
+ "Huella": "97303DAE5BDF62521F9462A1F431A4F88F1B68C4A8E1A72B067000668FACB023",
38
+ "IDEmisorFactura": "G87846952",
39
+ "NumSerieFactura": "TEST002"
40
+ }
41
+ },
42
+ "SistemaInformatico": {
43
+ "NombreRazon": "Odoo Developer",
44
+ "NIF": "A12345674",
45
+ "NombreSistemaInformatico": "odoo",
46
+ "IdSistemaInformatico": "11",
47
+ "Version": "1.0",
48
+ "NumeroInstalacion": 1,
49
+ "TipoUsoPosibleSoloVerifactu": "S",
50
+ "TipoUsoPosibleMultiOT": "S",
51
+ "IndicadorMultiplesOT": "N",
52
+ "IDOtro": {
53
+ "IDType": "",
54
+ "ID": ""
55
+ }
56
+ }
57
+ }
58
+ }
@@ -0,0 +1,66 @@
1
+ {
2
+ "RegistroAlta": {
3
+ "IDVersion": 1.0,
4
+ "IDFactura": {
5
+ "IDEmisorFactura": "G87846952",
6
+ "NumSerieFactura": "TEST002",
7
+ "FechaExpedicionFactura": "01-01-2026"
8
+ },
9
+ "NombreRazonEmisor": "Spanish test company",
10
+ "TipoFactura": "R1",
11
+ "TipoRectificativa": "I",
12
+ "DescripcionOperacion": "/",
13
+ "Destinatarios": {
14
+ "IDDestinatario": {
15
+ "NombreRazon": "Test partner",
16
+ "NIF": "89890001K"
17
+ }
18
+ },
19
+ "Desglose": {
20
+ "DetalleDesglose": [
21
+ {
22
+ "Impuesto": "01",
23
+ "ClaveRegimen": "01",
24
+ "CalificacionOperacion": "S1",
25
+ "TipoImpositivo": "10.0",
26
+ "BaseImponibleOimporteNoSujeto": -200.0,
27
+ "CuotaRepercutida": -20.0
28
+ },
29
+ {
30
+ "Impuesto": "01",
31
+ "ClaveRegimen": "01",
32
+ "CalificacionOperacion": "S1",
33
+ "TipoImpositivo": "21.0",
34
+ "BaseImponibleOimporteNoSujeto": -200.0,
35
+ "CuotaRepercutida": -42.0
36
+ }
37
+ ]
38
+ },
39
+ "CuotaTotal": -62.0,
40
+ "ImporteTotal": -462.0,
41
+ "Encadenamiento": {
42
+ "RegistroAnterior": {
43
+ "FechaExpedicionFactura": "01-01-2026",
44
+ "Huella": "27656D2A18B1F7E6823B7C134F0AFA3B979D0DCDB37846593F9E4E089F9383B0",
45
+ "IDEmisorFactura": "G87846952",
46
+ "NumSerieFactura": "TEST001"
47
+ }
48
+ },
49
+ "FacturasRectificadas": [],
50
+ "SistemaInformatico": {
51
+ "NombreRazon": "Odoo Developer",
52
+ "NIF": "A12345674",
53
+ "NombreSistemaInformatico": "odoo",
54
+ "IdSistemaInformatico": "11",
55
+ "Version": "1.0",
56
+ "NumeroInstalacion": 1,
57
+ "TipoUsoPosibleSoloVerifactu": "S",
58
+ "TipoUsoPosibleMultiOT": "S",
59
+ "IndicadorMultiplesOT": "N",
60
+ "IDOtro": {
61
+ "IDType": "",
62
+ "ID": ""
63
+ }
64
+ }
65
+ }
66
+ }