diff --git a/mrp_repair_discount/README.rst b/mrp_repair_discount/README.rst index 9d48f3e50..fae3a03f4 100644 --- a/mrp_repair_discount/README.rst +++ b/mrp_repair_discount/README.rst @@ -7,7 +7,7 @@ MRP Repair Discount =================== This module extends the functionality of mrp repair adding -new field discount on operation's lines +new field discount on operations lines Usage ===== @@ -27,16 +27,12 @@ help us smash it by providing detailed and welcomed feedback. Credits ======= -Images ------- - -* Odoo Community Association: `Icon `_. - Contributors ------------ * Nicola Malcontenti * Pedro M. Baeza +* Lorenzo Battistini Maintainer ---------- diff --git a/mrp_repair_discount/__openerp__.py b/mrp_repair_discount/__openerp__.py index 527adf515..b2fdb454e 100644 --- a/mrp_repair_discount/__openerp__.py +++ b/mrp_repair_discount/__openerp__.py @@ -12,10 +12,10 @@ "Tecnativa, " "Odoo Community Association (OCA)", "website": "http://www.agilebg.com", - "contributors": [ - "Nicola Malcontenti ", - ], 'depends': ['mrp_repair'], "data": ["views/mrp_repair_view.xml"], + "test": [ + 'test/mrp_repair_discount.yml', + ], "installable": True, } diff --git a/mrp_repair_discount/models/mrp_repair.py b/mrp_repair_discount/models/mrp_repair.py index 90961d3e9..1d0143442 100644 --- a/mrp_repair_discount/models/mrp_repair.py +++ b/mrp_repair_discount/models/mrp_repair.py @@ -42,3 +42,62 @@ class MrpRepair(models.Model): if operations: repair.invoice_id.button_reset_taxes() return res + + def _calc_line_base_price(self, line): + return line.price_unit * (1 - (line.discount or 0.0) / 100.0) + + def _get_lines(self, cr, uid, ids, context=None): + return self.pool['mrp.repair'].search( + cr, uid, [('operations', 'in', ids)], context=context) + + def _get_fee_lines(self, cr, uid, ids, context=None): + return self.pool['mrp.repair'].search( + cr, uid, [('fees_lines', 'in', ids)], context=context) + + def _amount_tax(self, cr, uid, ids, field_name, arg, context=None): + # Can't call super because we have to call compute_all with different + # parameter for each line and compute the total amount + res = {} + cur_obj = self.pool.get('res.currency') + tax_obj = self.pool.get('account.tax') + for repair in self.browse(cr, uid, ids, context=context): + val = 0.0 + cur = repair.pricelist_id.currency_id + for line in repair.operations: + if line.to_invoice: + tax_calculate = tax_obj.compute_all( + cr, uid, line.tax_id, self._calc_line_base_price(line), + line.product_uom_qty, line.product_id, + repair.partner_id) + for c in tax_calculate['taxes']: + val += c['amount'] + for line in repair.fees_lines: + if line.to_invoice: + tax_calculate = tax_obj.compute_all( + cr, uid, line.tax_id, line.price_unit, + line.product_uom_qty, line.product_id, + repair.partner_id) + for c in tax_calculate['taxes']: + val += c['amount'] + res[repair.id] = cur_obj.round(cr, uid, cur, val) + return res + + _columns = { + 'amount_tax': old_fields.function( + _amount_tax, string='Taxes', + store={ + 'mrp.repair': ( + lambda self, cr, uid, ids, c={}: ids, + ['operations', 'fees_lines'], 10), + 'mrp.repair.line': ( + _get_lines, [ + 'price_unit', 'price_subtotal', 'product_id', 'tax_id', + 'product_uom_qty', 'product_uom', 'discount', + ], 10), + 'mrp.repair.fee': ( + _get_fee_lines, [ + 'price_unit', 'price_subtotal', 'product_id', 'tax_id', + 'product_uom_qty', 'product_uom' + ], 10), + }), + } diff --git a/mrp_repair_discount/test/mrp_repair_discount.yml b/mrp_repair_discount/test/mrp_repair_discount.yml new file mode 100644 index 000000000..39b87d57c --- /dev/null +++ b/mrp_repair_discount/test/mrp_repair_discount.yml @@ -0,0 +1,48 @@ +- + I create a Tax Codes +- + !record {model: account.tax.code, id: tax_case}: + name: Tax_case + company_id: base.main_company + sign: 1 +- + I create a Tax +- + !record {model: account.tax, id: tax10}: + name: Tax 10 % + amount: 0.1 + type: percent + sequence: 1 + company_id: base.main_company + type_tax_use: all + tax_code_id: tax_case +- + !record {model: mrp.repair, id: mrp_repair_discount}: + address_id: base.res_partner_address_1 + guarantee_limit: !eval datetime.today().strftime("%Y-%m-%d") + invoice_method: 'none' + product_id: product.product_product_3 + product_uom: product.product_uom_unit + partner_invoice_id: base.res_partner_address_1 + location_dest_id: stock.stock_location_14 + location_id: stock.stock_location_stock + operations: + - location_dest_id: stock.location_production + location_id: stock.stock_location_stock + name: '[M-Las] Mouse, Laser' + price_unit: 50.0 + product_id: product.product_product_11 + product_uom: product.product_uom_unit + product_uom_qty: 1.0 + state: draft + to_invoice: 1 + type: add + discount: 10 + tax_id: + - tax10 + partner_id: base.res_partner_9 +- + I check the total amount of mrp_repair_rmrp1 is 49.5 +- + !assert {model: mrp.repair, id: mrp_repair_discount, string=amount_total should be 49.5}: + - amount_total == 49.5 \ No newline at end of file