Buscar en este blog

jueves, 4 de enero de 2018

(VirtualXML) Como redondear importes en CFDI 3.3 y no morir en el intento.

Uno de los principales problemas por los cuales nuestros usuarios nos consultan, es el famoso error:

"La suma de XXXXX no coincide con XXXX" o bien:
"El campo XXXX correspondiente a XXX no es igual a la suma de XXX"

Y el problema recurrente es...... Los malditos decimales.

En este primer articulo de nuestro nuevo blog, trataré de explicar la manera correcta de realizar el redondeo en las facturas CFDI 3.3

Lo primero a tomar en cuenta, es que bajo el nuevo esquema CFDI 3.3, el PAC (Proveedor Autorizado de Certificación), está obligado a revisar que las sumas y cálculos de la factura en general "cuadren" es decir, que las sumas y las operaciones matemáticas sean correctas, cosa que en la versión 3.2 no ocurría.

Otro aspecto importante a tomar en cuenta, es que para expresar los IMPORTES (cantidades monetarias básicamente),  estos deben de utilizar el número de decimales de la moneda con la que se expida la factura, de acuerdo con el catálogo publicado por el SAT.

En las versiones anteriores de CFDI podías utilizar hasta 6 dígitos decimales para expresar los importes de la factura, pero en CFDI 3.3 estas "limitado" a usar el número de decimales para la moneda de acuerdo al catálogo del SAT.

Las monedas mas comúnmente usadas para emitir facturas, además de los Pesos Mexicanos (MXN),son : Dólares Norteamericanos (USD), Dólares Canadienses (CAN), Euros (EUR) y en algunos casos las Libras Esterlinas (GBP) y según el catálogo del SAT, todas estas monedas deben utilizar 2 dígitos decimales para expresar los importes en la factura.

El problema viene cuando hay que calcular y redondear los decimales en los importes de la factura.

Veamos el siguiente ejemplo, supongamos que tenemos una factura con 3 artículos:

Articulo 1: $500.00 IVA Incluido
Articulo 2: $125.75 IVA Incluido
Articulo 3: $534.25 IVA incluido.

En este ejemplo, el total de la factura, puede parecer lógico es de: $1,160.00 pesos, es decir, de $1,000.00 mas IVA, pero vamos a analizarla articulo por articulo y nos vamos a encontrar con alguna sorpresa:

En CFDI 3.3, se debe realizar el cálculo de los impuestos POR CONCEPTO y no por el importe total de la factura, como se hacía en las versiones anteriores, y es en este punto donde surgen la mayoría de los problemas con el redondeo de las cantidades.

Analicemos nuestro primer articulo de $500.00 con IVA incluído:

En el nodo concepto, debemos expresar el IMPORTE del producto SIN el IVA, así que la operación matemática que manda la lógica, es realizar lo siguiente:

$500.00 (precio con IVA)  dividido entre 1.16 (para obtener el precio sin IVA) =  431.034482


Nota por favor que el precio sin IVA, tiene por lo menos 6 dígitos decimales y el catálogo del SAT es claro al respecto: los importes se expresan con el número de decimales de la moneda con la que se expide el documento, en este caso Pesos Mexicano (MXN) y 2 decimales.

En los primeros días del modelo CFDI 3.3, el SAT propuso una manera "irreal" (por no llamarla estúpida) de calcular los decimales para el nuevo modelo de facturación, afortunadamente dicha idea no prosperó, y ahora podemos realizar el "redondeo" mediante las funciones que nuestros propios lenguajes de programación nos proporcionan para ello, y en su mayoría utilizan una función llamada ROUND( cantidad, decimales).

En todos los lenguajes de programación existe una función similar a esta que recibe 2 parámetros, el primero es la cantidad a redondear y el segundo es el número de decimales que queremos para el redondeo, te tal manera que si yo hago algo como esto:

ROUND ( 431.034482, 2)

Obtendré:431.03

Y este es nuestro valor SIN IVA.

Es hora de calcular el IVA:

431.03 * 0.160000 = 68.9648

Que redondeado queda como: 68.97 ( el cuarto digito decimal, 8, sube a 5 el tercer digito decimal (4) y este 5 sube a 7 el segundo digito decimal) y que si sumamos a los 431.03 nos dará el importe correcto de $500.00:

431.03 + 68.97 = 500.00

En este caso la operación matemática fue correcta, porque 500.00 es una cantidad sin mucha complicación, veamos el segundo artículo:

Obtenemos el importe sin IVA

125.75 / 1.16 = 108.405172

Redondeamos:

ROUND( 108.405175, 2) = 108.41

Y ahora calculamos el IVA correspondiente:

108.41 * 0.16 = 17.3456

Redondeado:

ROUND( 17.3456, 2) = 17.35

Y si sumamos los 2 importes tenemos:

108.41 + 17.35 = 125.76

Houston.... tenemos un problema.... 1 centavo de diferencia para ser exactos.

Hasta aquí todo parecía perfecto, la mecánica de cálculo parecía estar clara, dividir, redondear, multiplicar, redondear y sumar ..... y obtener una diferencia de 1 centavo ......

¿ Que pasa con cualquier otra cantidad que tenga decimales ?:

Hagamos las mismas operaciones para el tercer artículo:

534.25 / 1.16 = 460.560344
ROUND(460.560344, 2) = 460.56 importe sin IVA

Calculo del IVA:

460.56 * 0.16 = 73.6896
ROUND(73.6896 ,2) = 73.69

Y ahora podemos observar que la suma del importe sin IVA mas el IVA calculado da:

460.56 + 73.69 =   534.25

Observamos que aqui no tenemos diferencia, luego entonces podemos concluir que no importa si el importe tiene centavos o no, puede que tengas o no diferencias.

Tenemos que tomar en cuenta una cosa importante: entre mas multiplicaciones y mas divisiones hagas, obtendrás muchas mas fracciones decimales contra las cuales luchar, así que para solucionar este problema, en vez de multiplicar y dividir, hagamos las cosas simples: sumas y restas:

Retomemos el segundo articulo de 125.75:

125.75 / 1.16 = 108.405172
ROUND(108.405172, 2) = 108.41 importe sin IVA

y ahora el IVA no provendrá de una multiplicación, sino de una resta:

125.75 - 108.41  =  17.34

Con lo cual, tendremos una suma perfecta en el calculo de los decimales:

108.41 + 17.34 = 125.75

Y la misma regla de la resta la podemos aplicar a los 2 casos anteriores:

500.00 - 431.03 = 68.97
125.75 - 108.41 = 17.34

Con los mismos resultados de la multiplicación y el redondeo a 2 decimales, y con esto garantizamos cálculos exactos a 2 decimales.

Compliquemos mas este ejemplo y digamos ahora que vamos a hacer un descuento del 5% sobre el total de la factura:

Calculemos el precio del producto sin IVA:

Articulo 1: 500.00 / 1.16 = 431.034482, Round(431.034482, 2) = 431.03
Articulo 2: 534.25 / 1.16 = 460.560344, Round(460.560344, 2) = 460.56
Articulo 3: 125.75 / 1.16 = 108.405172, Round(108.405172, 2) = 108.41

En CFDI 3.3 no puedes aplicar un descuento global sobre el total de la factura, si vamos a aplicar un descuento global, es necesario calcular el descuento individual por cada producto. Calculemos el 5% de descuento sobre el precio sin IVA de cada producto:

Articulo 1: 431.03 * 0.05 = 21.5515, Round(21.5515, 2) = 21.55
Articulo 2: 460.56 * 0.05 = 23.028, Round(23.028, 2) = 23.03
Articulo 3: 108.41 * 0.05 = 5.4205, Round(5.4205, 2) = 5.42

Nota que estoy dejando los descuentos a 2 decimales.

Calculemos ahora la "base" sobre la cual vamos determinar el impuesto, y esto lo haremos con una simple resta CON DOS DECIMALES:

Articulo 1: 431.03 - 21.55 = 409.48
Articulo 2: 460.56 - 23.03 = 437.53
Articulo 3: 108.41 - 5.42 = 102.99

Calculemos ahora el impuesto de 16% de IVA:

Articulo 1: 409.48 * 0.16 = 65.5168, Round(65.5168, 2) = 65.52
Articulo 2: 437.53 * 0.16 = 70.0048, Round(70.0048, 2) = 70.01
Articulo 3: 102.99 * 0.16 = 16.4784, Round(16.4784, 2) = 16.48

Y entonces tenemos como resultado para nuestro XML lo siguiente:

Subtotal = 431.03 + 460.56 + 108.41 = 1000.00
Descuento =21.55 + 23.03 + 5.42 = 50.00
Total Impuestos Trasladados = 65.52 + 70.01 + 16.48 =152.01 
Total = (1000.00 - 50) + 152.01 = 1,102.01

El Detalle manda, no el total:

Siguiendo esta sabia frase de mi amigo Mauricio Fragoso, como te habrás podido dar cuenta en los ejemplos anteriores, los importes totales de la factura los he calculado a partir de los detalles (conceptos) de la factura.

¿ Que hubiera pasado si los hubiera calculado sobre los totales ?

Veamos:

Articulo 1: $500.00 IVA Incluido
Articulo 2: $125.75 IVA Incluido
Articulo 3: $534.25 IVA incluido.

Total de la factura con IVA incuido: $1,160.00

Calculemos el importe sin IVA:

1,160 / 1.16 = 1000.00

Hasta aqui vamos biene.

Calculemos el descuento:

1,000.00 * 0.05 = 50.00

En este caso el importe del descuento es correcto.

Calculemos la base imponible:

1,000.00 - 50.00 =  950.00

Y calculando el impuesto:

950 * 0.16 = 152.00

Y nota como en este punto, tenemos 0.01 de diferencia contra el calculo hecho por concepto individual.

(1,000.00 - 50.00) + 152.00 = 1,102.00

Contra 1.102.01 calculados individualmente. Como verás existe una diferencia de 0.01 y este centavo de diferencia es lo que te va a causar los errores de cálculo mencionados al principio de este artículo.

¿ Cual es el calculo correcto ?

El realizado invididualmente.

¿ Cual es la formula mágica para un calculo correcto ?

La podemos resumir en lo siguiente:

Realiza los cálculos individuales por cada partida para los importes y para los impuestos (IVA y IEPS para traslados e ISR e ]IVA para retenciones) súmalos y utiliza estos importes para el Subtotal y el Total de Impuestos Retenidos y trasladados.

Si almacenas los datos de los conceptos en una tabla temporal o en un array en memoria, guárdalos con el número de decimales correcto ( 2 para nuestros ejemplos) y utiliza un campo o elemento individual del array para cada atributo, incluyendo, precio unitario, importe, impuestos trasladados y retenidos.

Reduce tanto como puedas el uso de multiplicaciones y divisiones, recuerda que entre mas multipliques y dividas, tendrás mas decimales para redondear, aunque obviamente hay situaciones en las que forzosamente tienes que multiplicar, como en el caso de la Cantidad X Precio Unitario, solo asegúrate de redondear después de realizar dicha multiplicación.

Mi padre es contador y cuando le estaba planteando este tema de los redondeos  en el CFDI 3.3, me dijo.... "suena lógico, a final de cuentas la contabilidad, toda ella, se expresa con 2 decimales, y en todas las operaciones monetarias que realizas todos los días únicamente manejas 2 dígitos decimales, si te compras un Gansito, cuesta 13.50, no 13.48564, no hay monedas fraccionarias de mas 2 digitos decimales" y creo que por ese lado tiene razón.

Espero que estos consejos te sirvan para reducir los errores de cállculo que puedas tener en tu implementación de CFDI 3.3 y te invito a seguir visitando este blog, donde semanalmente publicaré articulos interesantes sobre VirtualPAC, VirtualXML y facturación electroncia CFDI 3.3.














2 comentarios:

  1. Cuando haces tus calculos con sumas y restas has tenido problemas con los limites inferior y superior?

    ResponderEliminar
  2. No, nunca, y el problema no son los limites precisamente, es que muchos usuarios NO PONEN CORRECTAMENTE LOS IMPUESTOS. Pasa mucho en las retenciones, la retencion del ISR es del 10%, y lo tienes que expresar como 0.100000 con todos los ceros necesarios para alcanzar los 6 digitos decimales, el IVA por otro lado es otra historia, porque son 2/3 partes de 16% es decir 0.106666666666 y lo debes expresar como 0.106667 para que el sistema te lo respete. Ten en cuenta que tienes que hacer el calculo incluyendo los 6 decimales PEEEERO tienes que expresar el resultado de operación redondeado a 2.

    ResponderEliminar