Skip to content

Commit db4798f

Browse files
authored
Merge pull request #175 from gisce/imp_rectificadora_send
Enviar fecha operacion para A, B y R
2 parents 50042a8 + c8e3d91 commit db4798f

File tree

4 files changed

+205
-12
lines changed

4 files changed

+205
-12
lines changed

sii/models/invoices_record.py

+1
Original file line numberDiff line numberDiff line change
@@ -537,6 +537,7 @@ class DetalleFactura(MySchema):
537537
TipoRectificativa = CustomStringField() # TODO obligatorio si es una rectificativa
538538
ImporteRectificacion = fields.Nested(ImporteRectificacion) # TODO obligatorio si TipoRectificativa = 'S'
539539
FacturasRectificadas = fields.Nested(FacturasRectificadas) # TODO opcional si TipoFactura = Rectificativa
540+
FechaOperacion = DateString()
540541
# TODO ImporteTotal OBLIGATORIO si:
541542
# 1.Obligatorio si Baseimponible=0 y TipoFactura=”F2” o “R5”
542543
# 2.Obligatorio si Baseimponible=0 y ClaveRegimenEspecialOTranscedencia = “05”o “03”

sii/resource.py

+12-2
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,12 @@ def get_factura_emitida_tipo_desglose(invoice):
286286

287287
return tipo_desglose
288288

289+
def get_fecha_operacion_rec(invoice):
290+
if invoice.rectificative_type == 'N':
291+
return invoice.date_invoice
292+
else:
293+
return get_fecha_operacion_rec(invoice.rectifying_id)
294+
289295

290296
def get_fact_rect_sustitucion_fields(invoice, opcion=False):
291297
"""
@@ -334,7 +340,8 @@ def get_fact_rect_sustitucion_fields(invoice, opcion=False):
334340
:return:
335341
"""
336342
rectificativa_fields = {
337-
'TipoRectificativa': 'S' # Por sustitución
343+
'TipoRectificativa': 'S', # Por sustitución
344+
'FechaOperacion': get_fecha_operacion_rec(invoice)
338345
}
339346

340347
if opcion == 1:
@@ -424,7 +431,10 @@ def get_factura_emitida(invoice, rect_sust_opc1=False, rect_sust_opc2=False):
424431
factura_expedida['DatosInmueble'] = {
425432
'DetalleInmueble': detalle_inmueble
426433
}
427-
434+
if invoice.rectificative_type in ('A', 'B'):
435+
factura_expedida.update(
436+
{'FechaOperacion': get_fecha_operacion_rec(invoice)}
437+
)
428438
if rectificativa:
429439
opcion = 0
430440
if rect_sust_opc1:

spec/serialization_spec.py

+41-3
Original file line numberDiff line numberDiff line change
@@ -917,19 +917,33 @@ def group_by_tax_rate(iva_values, in_invoice):
917917

918918
with description('en los datos de una factura rectificativa emitida'):
919919
with before.all:
920-
self.out_refund = self.data_gen.get_out_refund_invoice()
920+
self.out_refund, self.out_b_inovice = self.data_gen.get_out_refund_invoice()
921921
self.out_refund_obj = SII(self.out_refund).generate_object()
922+
self.out_b_inovice_obj = SII(self.out_b_inovice).generate_object()
922923
self.fact_rect_emit = (
923924
self.out_refund_obj['SuministroLRFacturasEmitidas']
924925
['RegistroLRFacturasEmitidas']
925926
)
926-
927+
self.fact_refund_emit = (
928+
self.out_b_inovice_obj['SuministroLRFacturasEmitidas']
929+
['RegistroLRFacturasEmitidas']
930+
)
931+
with context('en los datos de abonadora'):
932+
with it('la FechaOperacion debe ser por factura original'):
933+
expect(
934+
self.fact_refund_emit['FacturaExpedida']['FechaOperacion']
935+
).to(equal('31-12-2016'))
927936
with context('en los datos de rectificación'):
928937
with it('el TipoRectificativa debe ser por sustitución (S)'):
929938
expect(
930939
self.fact_rect_emit['FacturaExpedida']['TipoRectificativa']
931940
).to(equal('S'))
932941

942+
with it('la FechaOperacion debe ser por factura original'):
943+
expect(
944+
self.fact_rect_emit['FacturaExpedida']['FechaOperacion']
945+
).to(equal('31-12-2016'))
946+
933947
with before.all:
934948
self.importe_rectificacion = (
935949
self.fact_rect_emit['FacturaExpedida']
@@ -961,7 +975,7 @@ def group_by_tax_rate(iva_values, in_invoice):
961975
expect(
962976
self.grouped_detalle_iva[21.0]['BaseImponible']
963977
).to(equal(
964-
-1 * abs(self.out_refund.tax_line[0].base)
978+
self.out_refund.tax_line[0].base
965979
))
966980
with it('la CuotaRepercutida debe ser la original'):
967981
expect(
@@ -976,6 +990,30 @@ def group_by_tax_rate(iva_values, in_invoice):
976990
self.out_refund.tax_line[0].tax_id.amount * 100
977991
))
978992

993+
with description('en los datos de una factura rectificativa de una rectificativa emitida'):
994+
with before.all:
995+
self.out_refund, self.out_b_inovice = self.data_gen.get_out_refund_mulitple_invoice()
996+
self.out_refund_obj = SII(self.out_refund).generate_object()
997+
self.out_b_inovice_obj = SII(self.out_b_inovice).generate_object()
998+
self.fact_rect_emit = (
999+
self.out_refund_obj['SuministroLRFacturasEmitidas']
1000+
['RegistroLRFacturasEmitidas']
1001+
)
1002+
self.fact_refund_emit = (
1003+
self.out_b_inovice_obj['SuministroLRFacturasEmitidas']
1004+
['RegistroLRFacturasEmitidas']
1005+
)
1006+
with context('en los datos de abonadora'):
1007+
with it('la FechaOperacion debe ser por factura original'):
1008+
expect(
1009+
self.fact_refund_emit['FacturaExpedida']['FechaOperacion']
1010+
).to(equal('07-12-2023'))
1011+
with context('en los datos de rectificación'):
1012+
with it('la FechaOperacion debe ser por factura original'):
1013+
expect(
1014+
self.fact_rect_emit['FacturaExpedida']['FechaOperacion']
1015+
).to(equal('07-12-2023'))
1016+
9791017
with description('en los datos de una factura rectificativa recibida'):
9801018
with before.all:
9811019
self.in_refund = self.data_gen.get_in_refund_invoice()

spec/testing_data.py

+151-7
Original file line numberDiff line numberDiff line change
@@ -354,9 +354,12 @@ def get_out_refund_invoice(self):
354354
journal = Journal(
355355
name=u'Factura de Energía Rectificativa Emitida'
356356
)
357+
rect_tax_line = self.tax_line[:]
358+
for invoice_tax in rect_tax_line:
359+
invoice_tax.tax_amount = -1 * abs(invoice_tax.tax_amount)
357360

358-
tax_line = self.tax_line
359-
for invoice_tax in tax_line:
361+
refund_tax_line = self.tax_line[:]
362+
for invoice_tax in refund_tax_line:
360363
invoice_tax.tax_amount = -1 * abs(invoice_tax.tax_amount)
361364

362365
rect_invoice = Invoice(
@@ -381,8 +384,8 @@ def get_out_refund_invoice(self):
381384
sii_out_clave_regimen_especial=self.sii_out_clave_regimen_especial,
382385
)
383386

384-
invoice = Invoice(
385-
invoice_type='out_refund',
387+
r_invoice = Invoice(
388+
invoice_type='out_invoice',
386389
journal_id=journal,
387390
rectificative_type='R',
388391
rectifying_id=rect_invoice,
@@ -395,14 +398,155 @@ def get_out_refund_invoice(self):
395398
amount_tax=self.amount_tax,
396399
period_id=self.period,
397400
date_invoice=self.date_invoice,
398-
tax_line=tax_line,
401+
tax_line=rect_tax_line,
399402
invoice_line=self.invoice_line,
400403
sii_registered=self.sii_registered,
401404
fiscal_position=self.fiscal_position,
402405
sii_description=self.sii_description,
403406
sii_out_clave_regimen_especial=self.sii_out_clave_regimen_especial,
404407
)
405-
return invoice
408+
b_invoice = Invoice(
409+
invoice_type='out_refund',
410+
journal_id=journal,
411+
rectificative_type='B',
412+
rectifying_id=rect_invoice,
413+
number='FAboEmit{}'.format(self.invoice_number),
414+
partner_id=self.partner_invoice,
415+
address_contact_id=self.address_contact_id,
416+
company_id=self.company,
417+
amount_total=-1.0 * self.amount_total,
418+
amount_untaxed=-1.0 * self.amount_untaxed,
419+
amount_tax=-1.0 * self.amount_tax,
420+
period_id=self.period,
421+
date_invoice=self.date_invoice,
422+
tax_line=refund_tax_line,
423+
invoice_line=self.invoice_line,
424+
sii_registered=self.sii_registered,
425+
fiscal_position=self.fiscal_position,
426+
sii_description=self.sii_description,
427+
sii_out_clave_regimen_especial=self.sii_out_clave_regimen_especial,
428+
)
429+
return r_invoice, b_invoice
430+
431+
def get_out_refund_mulitple_invoice(self):
432+
journal = Journal(
433+
name=u'Factura de Energía Rectificativa Emitida'
434+
)
435+
rect_tax_line = self.tax_line[:]
436+
for invoice_tax in rect_tax_line:
437+
invoice_tax.tax_amount = -1 * abs(invoice_tax.tax_amount)
438+
439+
refund_tax_line = self.tax_line[:]
440+
for invoice_tax in refund_tax_line:
441+
invoice_tax.tax_amount = -1 * abs(invoice_tax.tax_amount)
442+
443+
orig_invoice = Invoice(
444+
invoice_type='out_invoice',
445+
journal_id=journal,
446+
rectificative_type='N',
447+
rectifying_id=False,
448+
number='FEmitRectificada{}'.format(self.invoice_number),
449+
partner_id=self.partner_invoice,
450+
address_contact_id=self.address_contact_id,
451+
company_id=self.company,
452+
amount_total=self.amount_total,
453+
amount_untaxed=self.amount_untaxed,
454+
amount_tax=self.amount_tax,
455+
period_id=self.period,
456+
date_invoice='2023-12-07',
457+
tax_line=self.tax_line,
458+
invoice_line=self.invoice_line,
459+
sii_registered=self.sii_registered,
460+
fiscal_position=self.fiscal_position,
461+
sii_description=self.sii_description,
462+
sii_out_clave_regimen_especial=self.sii_out_clave_regimen_especial,
463+
)
464+
465+
r1_invoice = Invoice(
466+
invoice_type='out_invoice',
467+
journal_id=journal,
468+
rectificative_type='R',
469+
rectifying_id=orig_invoice,
470+
number='FRectEmit{}'.format(self.invoice_number),
471+
partner_id=self.partner_invoice,
472+
address_contact_id=self.address_contact_id,
473+
company_id=self.company,
474+
amount_total=self.amount_total,
475+
amount_untaxed=self.amount_untaxed,
476+
amount_tax=self.amount_tax,
477+
period_id=self.period,
478+
date_invoice='2024-01-07',
479+
tax_line=rect_tax_line,
480+
invoice_line=self.invoice_line,
481+
sii_registered=self.sii_registered,
482+
fiscal_position=self.fiscal_position,
483+
sii_description=self.sii_description,
484+
sii_out_clave_regimen_especial=self.sii_out_clave_regimen_especial,
485+
)
486+
b1_invoice = Invoice(
487+
invoice_type='out_refund',
488+
journal_id=journal,
489+
rectificative_type='B',
490+
rectifying_id=orig_invoice,
491+
number='FAboEmit{}'.format(self.invoice_number),
492+
partner_id=self.partner_invoice,
493+
address_contact_id=self.address_contact_id,
494+
company_id=self.company,
495+
amount_total=-1.0 * self.amount_total,
496+
amount_untaxed=-1.0 * self.amount_untaxed,
497+
amount_tax=-1.0 * self.amount_tax,
498+
period_id=self.period,
499+
date_invoice='2024-01-07',
500+
tax_line=refund_tax_line,
501+
invoice_line=self.invoice_line,
502+
sii_registered=self.sii_registered,
503+
fiscal_position=self.fiscal_position,
504+
sii_description=self.sii_description,
505+
sii_out_clave_regimen_especial=self.sii_out_clave_regimen_especial,
506+
)
507+
r2_invoice = Invoice(
508+
invoice_type='out_invoice',
509+
journal_id=journal,
510+
rectificative_type='R',
511+
rectifying_id=r1_invoice,
512+
number='FRect2Emit{}'.format(self.invoice_number),
513+
partner_id=self.partner_invoice,
514+
address_contact_id=self.address_contact_id,
515+
company_id=self.company,
516+
amount_total=self.amount_total,
517+
amount_untaxed=self.amount_untaxed,
518+
amount_tax=self.amount_tax,
519+
period_id=self.period,
520+
date_invoice='2024-02-07',
521+
tax_line=rect_tax_line,
522+
invoice_line=self.invoice_line,
523+
sii_registered=self.sii_registered,
524+
fiscal_position=self.fiscal_position,
525+
sii_description=self.sii_description,
526+
sii_out_clave_regimen_especial=self.sii_out_clave_regimen_especial,
527+
)
528+
b2_invoice = Invoice(
529+
invoice_type='out_refund',
530+
journal_id=journal,
531+
rectificative_type='B',
532+
rectifying_id=r1_invoice,
533+
number='FAbo2Emit{}'.format(self.invoice_number),
534+
partner_id=self.partner_invoice,
535+
address_contact_id=self.address_contact_id,
536+
company_id=self.company,
537+
amount_total=-1.0 * self.amount_total,
538+
amount_untaxed=-1.0 * self.amount_untaxed,
539+
amount_tax=-1.0 * self.amount_tax,
540+
period_id=self.period,
541+
date_invoice='2024-02-07',
542+
tax_line=refund_tax_line,
543+
invoice_line=self.invoice_line,
544+
sii_registered=self.sii_registered,
545+
fiscal_position=self.fiscal_position,
546+
sii_description=self.sii_description,
547+
sii_out_clave_regimen_especial=self.sii_out_clave_regimen_especial,
548+
)
549+
return r2_invoice, b2_invoice
406550

407551
def get_out_invoice_RA(self):
408552
journal = Journal(
@@ -550,7 +694,7 @@ def get_out_invoice_rescision(self):
550694
invoice_type='out_refund',
551695
journal_id=journal,
552696
rectificative_type='A',
553-
rectifying_id=False,
697+
rectifying_id=rect_invoice,
554698
number='FRectEmit{}'.format(self.invoice_number),
555699
partner_id=self.partner_invoice,
556700
address_contact_id=self.address_contact_id,

0 commit comments

Comments
 (0)