diff --git a/models/product.py b/models/product.py index fabcaf38565fdf4b12311f282ece7a65768ea297..32dafc2f687a216c3e5aa84615f005756616ea63 100644 --- a/models/product.py +++ b/models/product.py @@ -22,6 +22,7 @@ import json from openerp import _, api, fields, models +import openerp.addons.decimal_precision as dp import logging _logger = logging.getLogger(__name__) @@ -128,6 +129,18 @@ class ProductProduct(models.Model): product.write({"financings": financings}) return True + @api.depends('product_tmpl_id.list_price_with_tax') + def _compute_default_points_price(self): + points_journal = self.env['account.journal'].search([('use_points', '=', True)]) + points_journal.ensure_one() + for pp in self: + points_price = pp.list_price_with_tax * points_journal.points_rate + pp.points_price = points_price + + def _set_points_price(self): + pass + financings = fields.One2many('product.financing', 'product_id', string='Financings') financing_tables = fields.Text(string='Financing Tables', compute="compute_financing_tables", store=True) no_interest = fields.Boolean('Disable interest', help="If enabled the interest wont be calculated") + points_price = fields.Float('Points Price', help="Price expressed in points", compute="_compute_default_points_price", inverse="_set_points_price", store=True, digits=dp.get_precision('Product Price')) diff --git a/static/src/js/calculation.js b/static/src/js/calculation.js new file mode 100644 index 0000000000000000000000000000000000000000..f3465f3d7e207059afc9698d7e2f3691e9aca0d9 --- /dev/null +++ b/static/src/js/calculation.js @@ -0,0 +1,82 @@ +function calcular() { + // Input + var cuotas = tabla_json[$("#cuotas").val()]["cuotas"]; + if ($("#precio").val() == "") $("#precio").val("100"); + + var precio_str = $("#precio").val().replace(/\ /g, "").replace(/\$/g, ""); + if ((precio_str.match(/\./g) || []).length > 1) precio_str = precio_str.replace(/\./g, ""); + if ((precio_str.match(/,/g) || []).length > 1) precio_str = precio_str.replace(/,/g, ""); + else precio_str = precio_str.replace(",", "."); + var precio = precio_str * 1.00; + + if (tabla_json[$("#cuotas").val()]["directo"]) { + // Planes especiales del gobierno, tasa directa + var tea = tabla_json[$("#cuotas").val()]["tea"]; + var cft = tabla_json[$("#cuotas").val()]["cft"]; + var coeficiente_con_iva = tabla_json[$("#cuotas").val()]["coeficiente"]; + } else { + // Resto de los planes, se calculan + + // Input + var tna_str = $("#tna").val().replace(/\ /g, "").replace(/\%/g, ""); + if ((tna_str.match(/\./g) || []).length > 1) tna_str = tna_str.replace(/\./g, ""); + if ((tna_str.match(/,/g) || []).length > 1) tna_str = tna_str.replace(/,/g, ""); + else tna_str = tna_str.replace(",", "."); + var tna = tna_str / 100; + + var tea = (Math.pow((1 + (tna / cuotas)), cuotas) - 1); + + // Constantes + var iva = 0.21; + var arancel = 0.025; + var dias_ano = 360; + var dias_mes = 30; + var dias_adelanto = 2; + var dias_primer = dias_mes - dias_adelanto; + + // Calculos + var pago_comercio = 0; + // Calculo el acumulado de los pagos presenciales al comercio + var cuota_sin_arancel = precio * (1-arancel) / cuotas; + for (c = 0; c < cuotas; c++) { + pago_comercio = pago_comercio + (cuota_sin_arancel / ((1+((dias_primer/dias_ano)*tna)) * Math.pow((1+((dias_mes/dias_ano)*tna)), c))); + } + var coeficiente_sin_iva = precio * (1-arancel) / pago_comercio; + var tasa_directa = (1-arancel) - ((1-arancel) / coeficiente_sin_iva); + var coeficiente_con_iva = (100 / (1-(tasa_directa * (1+iva)))) / 100; + var precio_total_financiado = precio * coeficiente_con_iva; + var descuento_financ_otorgante = precio_total_financiado * tasa_directa; + var cuota_con_iva = (precio * coeficiente_con_iva) / cuotas; + var cuota_financiada = precio_total_financiado / cuotas; + + // CFT + var cft_array = []; + cft_array.push({Date: 0, Flow: (-1 * precio)}); + for (c = 1; c <= cuotas; c++) { + var d = (c == 1 ? dias_primer : dias_mes * c); + cft_array.push({Date: d, Flow: cuota_con_iva}); + } + var cft = XIRR(cft_array); + + // TEA + var tea_array = []; + tea_array.push({Date: 0, Flow: (-1 * (precio_total_financiado - descuento_financ_otorgante))}); + for (c = 1; c <= cuotas; c++) { + var d = (c == 1 ? dias_primer : dias_mes * c); + tea_array.push({Date: d, Flow: cuota_financiada}); + } + var tea = XIRR(tea_array); + } + + var coeficiente = coeficiente_con_iva; + var valor_total = precio * coeficiente; + var valor_cuota = (precio * coeficiente) / cuotas; + + $("#tea").text(numberWithCommas(tea * 100, 2) + "%"); + $("#cft").text(numberWithCommas(cft * 100, 2) + "%"); + $("#valor_contado").text("$" + numberWithCommas(precio, 2)); + $("#cant_cuotas").text($("#cuotas").val()); + $("#valor_total").text("$" + numberWithCommas(valor_total, 2)); + $("#valor_cuota").text("$" + numberWithCommas(valor_cuota, 2)); + $("#coeficiente").text(numberWithCommas(coeficiente, 4)); +} diff --git a/static/src/js/models.js b/static/src/js/models.js index 2f44e6decd50505fb32b03d22c9862e1207ffd29..f9936cb277cb23612f3321f204a0909ca7457568 100644 --- a/static/src/js/models.js +++ b/static/src/js/models.js @@ -16,7 +16,6 @@ ******************************************************************************/ function financing_models(instance, module) { - var _t = instance.web._t; var round_pr = instance.web.round_precision; var round_di = instance.web.round_decimals; @@ -182,6 +181,21 @@ function financing_models(instance, module) { } return lst; }, + + get_points_rate: function() { + var self = this; + var currentOrder = this.pos.get_order(); + var orderlines = currentOrder.get('orderLines').models; + var price_with_tax_sum = 0; + var points_price_sum = 0; + for (var i=0; i < orderlines.length; i++) { + var line = orderlines[i]; + price_with_tax_sum += line.product.price_with_taxes; + points_price_sum += line.product.points_price; + } + var rate = points_price_sum/price_with_tax_sum ; + return rate; + }, getCashRegisterPointsIds: function() { // returns ids of cashregisters with points enabled var self = this; @@ -253,6 +267,9 @@ function financing_models(instance, module) { }, set_client: function(client){ var self = this; + if (client == null) { + return false; + } openerp.web.blockUI(); new instance.web.Model('res.partner').call('get_webservice_data',[client.id]).then(function(partner_data){ self.resolve_partner_data(partner_data); @@ -374,6 +391,7 @@ function financing_models(instance, module) { }); product_model.fields.push('financing_tables'); product_model.fields.push('no_interest'); + product_model.fields.push('points_price'); product_model.loaded = function(self, products) { self.db.add_products_with_pos(products, self) } // fectch account.journal's use_points, credipaz_card and pos_payment_type fields... @@ -515,6 +533,7 @@ function financing_models(instance, module) { }, set_amount_and_points: function(value, repaint){ this.amount = round_di(parseFloat(value) || 0, this.pos.currency.decimals); + var p_rate = this.pos.get_order().get_points_rate(); this.points = round_di(parseFloat(value * this.cashregister.journal.points_rate) || 0, this.pos.currency.decimals); var client_points = this.pos.get_order().attributes.client.ws_points || 0; if (this.points > client_points) { @@ -528,6 +547,7 @@ function financing_models(instance, module) { }, set_points_and_amount: function(value, repaint){ this.points = round_di(parseFloat(value) || 0, this.pos.currency.decimals); + var p_rate = this.pos.get_order().get_points_rate(); var client_points = this.pos.get_order().attributes.client.ws_points || 0; if (this.points > client_points) { return this.pos.pos_widget.screen_selector.show_popup('error',{ diff --git a/views/product_view.xml b/views/product_view.xml index 8a12387cfd4841d3217040b5c9f03247a65eb25b..ef71b63ef033235a5b9c4c7c782e580a29db658d 100644 --- a/views/product_view.xml +++ b/views/product_view.xml @@ -8,6 +8,9 @@ <field name="inherit_id" ref="product.product_normal_form_view"/> <field name="priority" eval="8"/> <field name="arch" type="xml"> + <field name="lst_price" position="before"> + <field name="points_price" /> + </field> <field name="lst_price" position="after"> <button string="⇒ Update financings" type="object" name="button_update_financings" class="oe_inline oe_link"/>