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"/>