From 2a49a11446af35e06f43c353f827ae74249c9a48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guillem=20Juli=C3=A0?= Date: Fri, 11 Oct 2024 12:31:41 +0200 Subject: [PATCH] Add test and validation --- spec/serialization_spec.py | 84 ++++++++++++++++++++++++++++++++++++++ spec/testing_data.py | 74 +++++++++++++++++++++++++++++++++ 2 files changed, 158 insertions(+) diff --git a/spec/serialization_spec.py b/spec/serialization_spec.py index a874fee..a06a3bc 100644 --- a/spec/serialization_spec.py +++ b/spec/serialization_spec.py @@ -1213,6 +1213,90 @@ def group_by_tax_rate(iva_values, in_invoice): cuota_presentada )) + with description('en los datos de una factura recibida rectificativa ' + 'sin anuladora RA sobre una factura original negativa'): + with before.all: + self.in_invoice_RA = self.data_gen.get_in_invoice_RA_N_negative() + self.in_invoice_RA.rectifying_id.sii_registered = True + self.in_invoice_RA_obj = SII(self.in_invoice_RA).generate_object() + factura_rectificada = self.in_invoice_RA.rectifying_id + self.in_invoice_origin_obj = SII(factura_rectificada).generate_object() + self.fact_RA_recibida = ( + self.in_invoice_RA_obj['SuministroLRFacturasRecibidas'] + ['RegistroLRFacturasRecibidas'] + ) + self.fact_origin = ( + self.in_invoice_origin_obj['SuministroLRFacturasRecibidas'] + ['RegistroLRFacturasRecibidas'] + ) + + with context('en los datos de rectificación'): + with it('el TipoRectificativa debe ser por sustitución (S)'): + expect( + self.fact_RA_recibida['FacturaRecibida']['TipoRectificativa'] + ).to(equal('S')) + with it('la FechaOperacion NO debe existir'): + expect( + self.fact_RA_recibida['FacturaRecibida'].get('FechaOperacion', False) + ).to(equal(False)) + with it('debe contener las FacturasRectificadas'): + expect( + self.fact_RA_recibida['FacturaRecibida'] + ['FacturasRectificadas']['IDFacturaRectificada'][0] + ['NumSerieFacturaEmisor'] + ).to(equal( + self.in_invoice_RA.rectifying_id.origin + )) + + fecha_expedicion = ( + self.fact_RA_recibida['FacturaRecibida'] + ['FacturasRectificadas']['IDFacturaRectificada'][0] + ['FechaExpedicionFacturaEmisor'] + ) + expect( + datetime.strptime( + fecha_expedicion, '%d-%m-%Y' + ).strftime('%Y-%m-%d') + ).to(equal( + self.in_invoice_RA.rectifying_id.origin_date_invoice + )) + + with it('debe contener el ImporteRectificacion'): + expect( + self.fact_RA_recibida['FacturaRecibida'] + ['ImporteRectificacion']['BaseRectificada'] + ).to(equal( + -5.13 + )) + + expect( + self.fact_RA_recibida['FacturaRecibida'] + ['ImporteRectificacion']['CuotaRectificada'] + ).to(equal( + -1.08 + )) + with it('los Importes de rectificacion debe ser igual que los datos de la factura original'): + base_presentada = sum(x['BaseImponible'] for x in + self.fact_origin['FacturaRecibida']['DesgloseFactura'][ + 'DesgloseIVA']['DetalleIVA']) + cuota_presentada = sum( + x.get('CuotaSoportada', 0.0) for x in + self.fact_origin['FacturaRecibida'][ + 'DesgloseFactura']['DesgloseIVA']['DetalleIVA']) + expect( + self.fact_RA_recibida['FacturaRecibida'] + ['ImporteRectificacion']['BaseRectificada'] + ).to(equal( + base_presentada + )) + + expect( + self.fact_RA_recibida['FacturaRecibida'] + ['ImporteRectificacion']['CuotaRectificada'] + ).to(equal( + cuota_presentada + )) + with description('El XML Generado en una baja de una factura emitida'): with before.all: self.data_gen = DataGenerator() diff --git a/spec/testing_data.py b/spec/testing_data.py index 055e97c..79fcd4c 100644 --- a/spec/testing_data.py +++ b/spec/testing_data.py @@ -658,6 +658,80 @@ def get_in_invoice_RA(self): ) return invoice + def get_in_invoice_RA_N_negative(self): + journal = Journal( + name=u'Factura de Energía Rectificativa Recibida', + article=self.article + ) + tax_iva_21 = Tax(name='21% IVA Soportado', amount=0.21, type='percent') + amount_total_n = -6.21 + amount_tax_n = -1.08 + base_amount_n = -5.13 + tax_line_n = [ + InvoiceTax( + name='21% IVA Soportado', base=-5.13, + tax_amount=-1.08, tax_id=tax_iva_21 + ) + ] + amount_total_ra = 14.65 + amount_tax_ra = 2.54 + base_amount_ra = 12.11 + tax_line_ra = [ + InvoiceTax( + name='21% IVA Soportado', base=-5.13, + tax_amount=-1.08, tax_id=tax_iva_21 + ) + ] + + rect_invoice = Invoice( + invoice_type='in_invoice', + journal_id=journal, + rectificative_type='N', + rectifying_id=False, + number='FRecibRectificada{}'.format(self.invoice_number), + origin='FRectRecibRectificadaOrigen{}'.format(self.invoice_number), + partner_id=self.partner_invoice, + address_contact_id=self.address_contact_id, + company_id=self.company, + amount_total=amount_total_n, + amount_untaxed=base_amount_n, + amount_tax=amount_tax_n, + period_id=self.period, + origin_date_invoice=self.origin_date_invoice, + date_invoice=self.date_invoice, + tax_line=tax_line_n, + invoice_line=self.invoice_line, + sii_registered=self.sii_registered, + fiscal_position=self.fiscal_position, + sii_description=self.sii_description, + sii_in_clave_regimen_especial=self.sii_in_clave_regimen_especial, + ) + + invoice = Invoice( + invoice_type='in_invoice', + journal_id=journal, + rectificative_type='RA', + rectifying_id=rect_invoice, + number='FRectRecib{}'.format(self.invoice_number), + origin='FRectRecibOrigen{}'.format(self.invoice_number), + partner_id=self.partner_invoice, + address_contact_id=self.address_contact_id, + company_id=self.company, + amount_total=amount_total_ra, + amount_untaxed=base_amount_ra, + amount_tax=amount_tax_ra, + period_id=self.period, + origin_date_invoice=self.origin_date_invoice, + date_invoice=self.date_invoice, + tax_line=tax_line_ra, + invoice_line=self.invoice_line, + sii_registered=self.sii_registered, + fiscal_position=self.fiscal_position, + sii_description=self.sii_description, + sii_in_clave_regimen_especial=self.sii_in_clave_regimen_especial, + ) + return invoice + def get_out_invoice_rescision(self): journal = Journal( name=u'Factura de Energía Rectificativa Rescision Emitida',