Skip to content

Commit 7b87d34

Browse files
committed
calcular traslados sobre totales
1 parent 9516d7c commit 7b87d34

File tree

6 files changed

+540
-4
lines changed

6 files changed

+540
-4
lines changed

satcfdi/create/cfd/cfdi40.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,7 @@ def __init__(
425425
complemento: CFDI | Sequence[CFDI] = None,
426426
addenda: CFDI | Sequence[CFDI] = None,
427427
fecha: datetime = None,
428+
_traslados_sobre_totales: bool = False
428429
):
429430
super().__init__({
430431
'Version': self.version,
@@ -455,14 +456,14 @@ def __init__(
455456
'NoCertificado': '',
456457
'Certificado': '',
457458
})
458-
self.compute()
459+
self.compute(traslados_sobre_totales=_traslados_sobre_totales)
459460

460-
def compute(self):
461+
def compute(self, traslados_sobre_totales):
461462
self["Conceptos"] = conceptos = _make_conceptos(self["Conceptos"], rnd_fn=rounder(self["Moneda"]))
462463
self["SubTotal"] = sub_total = sum(c['Importe'] for c in conceptos)
463464
descuento = sum(c.get('Descuento') or 0 for c in conceptos)
464465
self['Descuento'] = descuento or None
465-
self['Impuestos'] = impuestos = make_impuestos(conceptos)
466+
self['Impuestos'] = impuestos = make_impuestos(conceptos, rnd_fn=rounder(self["Moneda"]), traslados_sobre_totales=traslados_sobre_totales)
466467
total = sub_total - descuento
467468
if impuestos:
468469
total += impuestos.get('TotalImpuestosTrasladados') or 0

satcfdi/create/compute.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ def group_impuestos(elements, pfx="", ofx=""):
101101
return impuestos
102102

103103

104-
def make_impuestos(conceptos):
104+
def make_impuestos(conceptos, rnd_fn, traslados_sobre_totales):
105105
impuestos = group_impuestos(conceptos)
106106

107107
if retenciones := impuestos.get('Retenciones'):
@@ -111,6 +111,10 @@ def make_impuestos(conceptos):
111111
impuestos['TotalImpuestosRetenidos'] = sum(imp)
112112

113113
if traslados := impuestos.get('Traslados'):
114+
if traslados_sobre_totales:
115+
for i in traslados:
116+
if i["TipoFactor"] == 'Tasa':
117+
i["Importe"] = rnd_fn(i["Base"] * i["TasaOCuota"])
114118
impuestos['Traslados'] = traslados
115119
imp = list(i["Importe"] for i in traslados if i["Importe"] is not None)
116120
if imp:

tests/test_create_cfdi40.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,3 +424,61 @@ def test_iva_exento():
424424

425425
verify_invoice(invoice, "iva_exento")
426426

427+
428+
def test_suma_conceptos_iva():
429+
rfc = 'xiqb891116qe4'
430+
signer = get_signer(rfc)
431+
432+
invoice = cfdi40.Comprobante(
433+
emisor=cfdi40.Emisor(
434+
rfc=signer.rfc,
435+
nombre=signer.legal_name,
436+
regimen_fiscal="601"
437+
),
438+
lugar_expedicion="56820",
439+
fecha=datetime.fromisoformat("2020-01-01T22:40:38"),
440+
receptor=cfdi40.Receptor(
441+
rfc='KIJ0906199R1',
442+
nombre='KIJ, S.A DE C.V.',
443+
uso_cfdi='G03',
444+
domicilio_fiscal_receptor="59820",
445+
regimen_fiscal_receptor="601"
446+
),
447+
metodo_pago='PPD',
448+
serie="A",
449+
folio="123456",
450+
conceptos=[
451+
cfdi40.Concepto(
452+
clave_prod_serv='10101702',
453+
cantidad=1,
454+
clave_unidad='E48',
455+
descripcion='SERVICIOS DE FACTURACION',
456+
valor_unitario=Decimal('100.03'),
457+
impuestos=cfdi40.Impuestos(
458+
traslados=cfdi40.Traslado(
459+
impuesto=Impuesto.IVA,
460+
tipo_factor=TipoFactor.TASA,
461+
tasa_o_cuota=Decimal('0.160000'),
462+
)
463+
),
464+
),
465+
cfdi40.Concepto(
466+
clave_prod_serv='10101702',
467+
cantidad=1,
468+
clave_unidad='E48',
469+
descripcion='SERVICIOS DE FACTURACION',
470+
valor_unitario=Decimal('100.03'),
471+
impuestos=cfdi40.Impuestos(
472+
traslados=cfdi40.Traslado(
473+
impuesto=Impuesto.IVA,
474+
tipo_factor=TipoFactor.TASA,
475+
tasa_o_cuota=Decimal('0.160000'),
476+
)
477+
),
478+
)
479+
],
480+
_traslados_sobre_totales=True
481+
)
482+
invoice.sign(signer)
483+
484+
verify_invoice(invoice, "iva_concepto_suma")

0 commit comments

Comments
 (0)