Corrección escenario: Factura en dolares pago en dolares
Closed
Corrección escenario: Factura en dolares pago en dolares
Hola Agus buena tarde
Si me puedes apoyar con el siguiente problema con un pago de Odoo 15, por favor.
A continuación describo a detalle el escenario:
Escenario:
Factura en dólares (USD), pago en dólares (USD)
Se crea una factura a un cliente, la factura debe ser emitida en dólares (USD), las líneas de la factura llevarán n productos y x cantidades con IVA 16. La factura se valida. Esta se timbra correctamente.
Se registra un pago en dólares (USD) cubriendo el monto total de la factura. Se valida el pago. Este no se timbra correctamente.
Error:
CRP20999 Error no clasificado. - ImporteDR (1703.12) del traslado es mayor que el ImpPagado (745.35), favor de verificar.
Problemática:
Realizando el debug de las funciones no encuentro en que punto convierte los montos baseDR, baseP, importeDR e importeP en pesos.
Observaciones:
Las funciones ocupadas para estos nodos son las siguientes:
TrasladosDR def impuestos_dr():
TrasladosP def impuestos_p();
El nodo de TrasladosDR debe tener el campo BaseDR e ImporteDR expresados en la moneda del documento relacionado
<pago20:TrasladosDR>
<pago20:TrasladoDR t-foreach="o.impuestos_dr(invoice)" t-as="tax_move"
t-att-BaseDR="format_float(tax_move.tax_base_amount, invoice.currency_id.decimal_places)"
t-att-ImpuestoDR="format_impuesto(tax_move.tax_line_id)"
t-att-ImporteDR="format_float(abs(tax_move.balance), invoice.currency_id.decimal_places)"
t-att-TasaOCuotaDR="format_tasaocuota(tax_move.tax_line_id)"
t-att-TipoFactorDR="tax_move.tax_line_id.l10n_mx_tax_type" />
</pago20:TrasladosDR>
El nodo de TrasladosP debe tener el campo BaseP e ImporteP expresados en la moneda del pago
<pago20:TrasladosP>
<pago20:TrasladoP t-foreach="o.impuestos_p()" t-as="tax_total"
t-att-BaseP="format_float(tax_total['tax_base'], o.currency_id.decimal_places)"
t-att-ImpuestoP="format_impuesto(tax_total['tax_id'])"
t-att-ImporteP="format_float(tax_total['importe'], o.currency_id.decimal_places)"
t-att-TasaOCuotaP="format_tasaocuota(tax_total['tax_id'])"
t-att-TipoFactorP="tax_total['tax_id'].l10n_mx_tax_type" />
</pago20:TrasladosP>
Evidencias:
Al intentar timbrar el pago de la factura en los nodos mencionados anteriormente obtenemos el siguiente resultado
- Nodo TrasladosDR - Expresado en pesos
- Nodo TrasladosP- Expresado en pesos
Adjunto xml de la factura y del pago
Quedo al pendiente de cualquier comentario, gracias.
Saludos
EKU9003173C9_INV_2024_00061.xml EKU9003173C9_BNK1_2024_04_0004.xml
Buenas tardes @noe.izquierdo lo voy a tratar en dos respuestas para separar un node del otro. Aquí empezamos con el nodo
TrasladoDR
.Aquí en este módulo no estamos calculando ningún monto, ni en dólares ni en pesos, esos cálculos los está realizando el módulo de account y nosotros solo los estamos reutilizando para desplegarlos en el pago, por eso es que no ecuentras donde se hace la conversión.
La diferencia que veo entre lo que hacíamos nosotros y lo que hace Odoo es que nosotros, en el campo
tax2_base
, que sería más o menos el equivalente al campotax_base_amount
que estamos usando ahorita, colocábamos el importe de la base del impuesto en la moneda del documento, y teníamos otro campo llamadotax_base_company_currency_amount
donde colocábamos el monto de la base en la moneda de la compañía.Odoo lo que está haciendo es que en el campo
tax_base_amount
es colocar la base del impuesto en la moneda de la compañía, de ahí el problema.Lo primero que haría para resolver este problema es buscar a ver si en la OCA hay algún módulo que nos de un campo con la información que necesitamos, ya busqué pero no encontré nada, sería por confirmar que efectivamente no hay nada que nos ayude.
Si no existe el módulo, yo crearía 2 campos calculados en el objeto
account.move.line
de la siguiente manera:- Campo
l10n_mx_tax_base_dr
: Cuando la moneda del documento es igual a la moneda de la compañía entonces se debe utilizar el campotax_base_amount
como resultado de la función compute, justo como se está haciendo ahorita:tax_base_amount
, pero cuando la moneda del documento es diferente a la moneda de la compañía, entonces se debe utilizar el campotax_move.amount_currency
como resultado de la función compute - Campo l10n_mx_tax_importe_dr
: Cuando la moneda del documento es igual a la moneda de la compañía entonces se debe utilizar el campo balance como resultado de la función compute, justo como se está haciendo ahorita:
tax_move.balance, pero cuando la moneda del documento es diferente a la moneda de la compañía, entonces se debe utilizar el campo
tax_move.amount_currency` del movimiento asociado a la base de esta factura como resultado de la función compute. No he identificado todavía las relaciones que nos llevan a este documento, pero adjunto una captura de pantalla de un ejemplo que hice en runboot para que veas a que campo me refiero.
Ambos campos deben ser de tipo currency y estar referenciados a la moneda del documento por lo que tal vez necesitemos otro campo calculado
l10n_mx_tax_currency_dr
donde el resultado de la función compute sea igual a la moneda del documento relacionado- Campo
Hola @agb80 buenas tardes
Ejecutando los pasos que me mencionas, realicé lo siguiente:
- Crear campo l10n_mx_tax_base_dr
l10n_mx_tax_base_dr = fields.Monetary( compute="_compute_l10n_mx_tax_base_dr" )
- Crear función _compute_l10n_mx_tax_base_dr
def _compute_l10n_mx_tax_base_dr(self): for record in self: if record.move_id.currency_id == record.company_id.currency_id: amount = record.tax_base_amount else: amount = record.tax_move.amount_currency return amount
- Crear campo l10n_mx_tax_importe_dr
l10n_mx_tax_importe_dr = fields.Monetary( compute="_compute_l10n_mx_tax_importe_dr" )
- Crear función _compute_l10n_mx_tax_importe_dr
def _compute_l10n_mx_tax_importe_dr(self): for record in self: if record.move_id.currency_id == record.company_id.currency_id: amount = record.tax_move.balance else: amount = record.tax_move.amount_currency return amount
- Crear campo l10n_mx_tax_currency_dr
l10n_mx_tax_currency_dr = fields.Monetary( compute="_compute_l10n_mx_tax_currency_dr" )
- Crear función _compute_l10n_mx_tax_currency_dr
def _compute_l10n_mx_tax_currency_dr(self): for record in self: currency = record.move_id.currency_id return currency
Pero indícame si lo interpreté de manera correcta. Ya que el último punto no me quedo muy claro
Ambos campos deben ser de tipo currency y estar referenciados a la moneda del documento, por lo que tal vez necesitemos otro campo calculado
l10n_mx_tax_currency_dr
donde el resultado de la función compute sea igual a la moneda del documento relacionado