From 0c6652f994a292ccfc06adfc8a1689ec3adb7002 Mon Sep 17 00:00:00 2001 From: lreficent Date: Wed, 18 Oct 2017 16:47:35 +0200 Subject: [PATCH] [9.0][REW] rma_account: adapt. --- rma_account/models/invoice.py | 14 ++-- rma_account/models/rma_order.py | 7 +- rma_account/models/rma_order_line.py | 99 +++++++++++++++++++---- rma_account/views/rma_order_line_view.xml | 12 ++- rma_account/wizards/rma_add_invoice.xml | 14 ++-- rma_account/wizards/rma_refund.xml | 8 +- 6 files changed, 114 insertions(+), 40 deletions(-) diff --git a/rma_account/models/invoice.py b/rma_account/models/invoice.py index 55dc4f26..a834d551 100644 --- a/rma_account/models/invoice.py +++ b/rma_account/models/invoice.py @@ -11,7 +11,7 @@ class AccountInvoice(models.Model): @api.one def _compute_rma_count(self): for inv in self: - rmas = self.mapped('invoice_line_ids.rma_line_ids.rma_id') + rmas = self.mapped('invoice_line_ids.rma_line_ids') inv.rma_count = len(rmas) rma_count = fields.Integer( @@ -19,28 +19,28 @@ class AccountInvoice(models.Model): @api.multi def action_view_rma_supplier(self): - action = self.env.ref('rma.action_rma_supplier') + action = self.env.ref('rma.action_rma_supplier_lines') result = action.read()[0] - rma_list = self.mapped('invoice_line_ids.rma_line_ids.rma_id').ids + rma_list = self.mapped('invoice_line_ids.rma_line_ids').ids # choose the view_mode accordingly if len(rma_list) != 1: result['domain'] = [('id', 'in', rma_list)] elif len(rma_list) == 1: - res = self.env.ref('rma.view_rma_supplier_form', False) + res = self.env.ref('rma.view_rma_line_supplier_form', False) result['views'] = [(res and res.id or False, 'form')] result['res_id'] = rma_list[0] return result @api.multi def action_view_rma_customer(self): - action = self.env.ref('rma.action_rma_customer') + action = self.env.ref('rma.action_rma_customer_lines') result = action.read()[0] - rma_list = self.mapped('invoice_line_ids.rma_line_ids.rma_id').ids + rma_list = self.mapped('invoice_line_ids.rma_line_ids').ids # choose the view_mode accordingly if len(rma_list) != 1: result['domain'] = [('id', 'in', rma_list)] elif len(rma_list) == 1: - res = self.env.ref('rma.view_rma_form', False) + res = self.env.ref('rma.view_rma_line_form', False) result['views'] = [(res and res.id or False, 'form')] result['res_id'] = rma_list[0] return result diff --git a/rma_account/models/rma_order.py b/rma_account/models/rma_order.py index 4f6c6868..b925ee93 100644 --- a/rma_account/models/rma_order.py +++ b/rma_account/models/rma_order.py @@ -20,9 +20,10 @@ class RmaOrder(models.Model): invoices = rec.mapped('rma_line_ids.invoice_id') rec.invoice_count = len(invoices) - add_invoice_id = fields.Many2one('account.invoice', string='Add Invoice', - ondelete='set null', readonly=True, - states={'draft': [('readonly', False)]}) + add_invoice_id = fields.Many2one( + comodel_name='account.invoice', string='Add Invoice', + ondelete='set null', readonly=True, + ) invoice_refund_count = fields.Integer( compute=_compute_invoice_refund_count, string='# of Refunds') invoice_count = fields.Integer( diff --git a/rma_account/models/rma_order_line.py b/rma_account/models/rma_order_line.py index 7f659d47..077b101e 100644 --- a/rma_account/models/rma_order_line.py +++ b/rma_account/models/rma_order_line.py @@ -2,8 +2,8 @@ # © 2017 Eficent Business and IT Consulting Services S.L. # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) from openerp import _, api, fields, models +from openerp.exceptions import ValidationError, UserError from openerp.addons import decimal_precision as dp -from openerp.exceptions import UserError class RmaOrderLine(models.Model): @@ -44,14 +44,18 @@ class RmaOrderLine(models.Model): invoice_address_id = fields.Many2one( 'res.partner', string='Partner invoice address', default=_default_invoice_address, - help="Invoice address for current rma order.") - + readonly=True, states={'draft': [('readonly', False)]}, + help="Invoice address for current rma order.", + ) refund_count = fields.Integer( compute=_compute_refund_count, string='# of Refunds', default=0) - invoice_line_id = fields.Many2one('account.invoice.line', - string='Invoice Line', - ondelete='restrict', - index=True) + invoice_line_id = fields.Many2one( + comodel_name='account.invoice.line', + string='Originating Invoice Line', + ondelete='restrict', + index=True, + readonly=True, states={'draft': [('readonly', False)]}, + ) refund_line_ids = fields.One2many(comodel_name='account.invoice.line', inverse_name='rma_line_id', string='Refund Lines', @@ -62,7 +66,9 @@ class RmaOrderLine(models.Model): refund_policy = fields.Selection([ ('no', 'No refund'), ('ordered', 'Based on Ordered Quantities'), ('received', 'Based on Received Quantities')], string="Refund Policy", - required=True, default='no') + required=True, default='no', + readonly=True, states={'draft': [('readonly', False)]}, + ) qty_to_refund = fields.Float( string='Qty To Refund', copy=False, digits=dp.get_precision('Product Unit of Measure'), readonly=True, @@ -72,6 +78,75 @@ class RmaOrderLine(models.Model): digits=dp.get_precision('Product Unit of Measure'), readonly=True, compute=_compute_qty_refunded, store=True) + @api.multi + def _prepare_rma_line_from_inv_line(self, line): + self.ensure_one() + if not self.type: + self.type = self._get_default_type() + if self.type == 'customer': + operation = line.product_id.rma_customer_operation_id or \ + line.product_id.categ_id.rma_customer_operation_id + else: + operation = line.product_id.rma_supplier_operation_id or \ + line.product_id.categ_id.rma_supplier_operation_id + if not operation: + operation = self.env['rma.operation'].search( + [('type', '=', self.type)], limit=1) + if not operation: + raise ValidationError("Please define an operation first") + + if not operation.in_route_id or not operation.out_route_id: + route = self.env['stock.location.route'].search( + [('rma_selectable', '=', True)], limit=1) + if not route: + raise ValidationError("Please define an rma route") + + if not operation.in_warehouse_id or not operation.out_warehouse_id: + warehouse = self.env['stock.warehouse'].search( + [('company_id', '=', self.company_id.id), + ('lot_rma_id', '!=', False)], limit=1) + if not warehouse: + raise ValidationError("Please define a warehouse with a" + " default rma location") + data = { + 'product_id': line.product_id.id, + 'origin': line.invoice_id.number, + 'uom_id': line.uom_id.id, + 'operation_id': operation.id, + 'product_qty': line.quantity, + 'price_unit': line.invoice_id.currency_id.compute( + line.price_unit, line.currency_id, round=False), + 'delivery_address_id': line.invoice_id.partner_id.id, + 'invoice_address_id': line.invoice_id.partner_id.id, + 'receipt_policy': operation.receipt_policy, + 'refund_policy': operation.refund_policy, + 'delivery_policy': operation.delivery_policy, + 'in_warehouse_id': operation.in_warehouse_id.id or warehouse.id, + 'out_warehouse_id': operation.out_warehouse_id.id or warehouse.id, + 'in_route_id': operation.in_route_id.id or route.id, + 'out_route_id': operation.out_route_id.id or route.id, + 'location_id': (operation.location_id.id or + operation.in_warehouse_id.lot_rma_id.id or + warehouse.lot_rma_id.id), + } + return data + + @api.onchange('invoice_line_id') + def _onchange_invoice_line_id(self): + if not self.invoice_line_id: + return + data = self._prepare_rma_line_from_inv_line( + self.invoice_line_id) + self.update(data) + self._remove_other_data_origin('invoice_line_id') + + @api.multi + def _remove_other_data_origin(self, exception): + res = super(RmaOrderLine, self)._remove_other_data_origin(exception) + if not exception == 'invoice_line_id': + self.invoice_line_id = False + return res + @api.onchange('operation_id') def _onchange_operation_id(self): result = super(RmaOrderLine, self)._onchange_operation_id() @@ -80,14 +155,6 @@ class RmaOrderLine(models.Model): self.refund_policy = self.operation_id.refund_policy return result - @api.onchange('invoice_line_id') - def _onchange_invoice_line_id(self): - result = {} - if not self.invoice_line_id: - return result - self.origin = self.invoice_id.number - return result - @api.multi @api.constrains('invoice_line_id') def _check_duplicated_lines(self): diff --git a/rma_account/views/rma_order_line_view.xml b/rma_account/views/rma_order_line_view.xml index ed32313c..58b5b8ba 100644 --- a/rma_account/views/rma_order_line_view.xml +++ b/rma_account/views/rma_order_line_view.xml @@ -15,9 +15,13 @@ string="Refunds"/> + + + - @@ -51,9 +55,13 @@ string="Refunds"/> + + + - diff --git a/rma_account/wizards/rma_add_invoice.xml b/rma_account/wizards/rma_add_invoice.xml index 9ecacff3..c0d9e412 100644 --- a/rma_account/wizards/rma_add_invoice.xml +++ b/rma_account/wizards/rma_add_invoice.xml @@ -109,12 +109,11 @@ rma.order - + type="action"/> + @@ -123,12 +122,11 @@ rma.order - + type="action"/> + diff --git a/rma_account/wizards/rma_refund.xml b/rma_account/wizards/rma_refund.xml index a2363c48..65b07fe0 100644 --- a/rma_account/wizards/rma_refund.xml +++ b/rma_account/wizards/rma_refund.xml @@ -50,11 +50,11 @@ rma.order.line -
+
+
@@ -63,11 +63,11 @@ rma.order.line -
+
+