diff --git a/rma_purchase/models/purchase_order.py b/rma_purchase/models/purchase_order.py index a0991b1a..9ced8f41 100644 --- a/rma_purchase/models/purchase_order.py +++ b/rma_purchase/models/purchase_order.py @@ -1,7 +1,8 @@ +# -*- coding: utf-8 -*- # Copyright 2017-18 Eficent Business and IT Consulting Services S.L. # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) -from odoo import api, models +from openerp import api, fields, models class PurchaseOrder(models.Model): @@ -19,8 +20,10 @@ class PurchaseOrder(models.Model): }) line.onchange_product_id() line.update({ - 'product_qty': rma_line.product_qty, + 'product_qty': rma_line.qty_to_purchase, 'product_uom': rma_line.uom_id.id, }) res.order_line = line + # TODO: maybe this line is not needed in v10: + res.date_planned = res._compute_date_planned() return res diff --git a/rma_purchase/models/purchase_order_line.py b/rma_purchase/models/purchase_order_line.py index fe08f86b..c858d122 100644 --- a/rma_purchase/models/purchase_order_line.py +++ b/rma_purchase/models/purchase_order_line.py @@ -1,12 +1,16 @@ # Copyright 2017 Eficent Business and IT Consulting Services S.L. # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) -from odoo import api, fields, models +from odoo import api, models class PurchaseOrderLine(models.Model): _inherit = "purchase.order.line" + # TODO: to be removed on migration to v10: + # This is needed because odoo misspelled `store` in v9 :facepalm: + state = fields.Selection(related='order_id.state', store=True) + rma_line_id = fields.Many2one( comodel_name='rma.order.line', string='RMA', ) diff --git a/rma_purchase/models/rma_order_line.py b/rma_purchase/models/rma_order_line.py index 1a8ee88b..63da1482 100644 --- a/rma_purchase/models/rma_order_line.py +++ b/rma_purchase/models/rma_order_line.py @@ -11,8 +11,14 @@ class RmaOrderLine(models.Model): @api.multi def _compute_purchase_count(self): for rec in self: - rec.purchase_count = len(self.env['purchase.order'].search( - [('origin', 'ilike', rec.name)]).ids) + purchase_list = [] + for procurement_id in rec.procurement_ids: + if procurement_id.purchase_id and \ + procurement_id.purchase_id.id: + purchase_list.append(procurement_id.purchase_id.id) + rec.purchase_count = ( + len(list(set(purchase_list))) + + len(rec.manual_purchase_line_ids.mapped('order_id'))) @api.multi def _compute_purchase_order_lines(self): @@ -24,6 +30,20 @@ class RmaOrderLine(models.Model): purchase_list.append(line.id) rec.purchase_order_line_ids = [(6, 0, purchase_list)] + @api.multi + @api.depends('procurement_ids.purchase_line_id', + 'manual_purchase_line_ids', + 'manual_purchase_line_ids.state', 'qty_delivered') + def _compute_qty_purchase(self): + for rec in self: + rec.qty_purchased = rec._get_rma_purchased_qty() + if rec.purchase_policy == 'ordered': + rec.qty_to_purchase = rec.product_qty - rec.qty_purchased + elif rec.purchase_policy == 'delivered': + rec.qty_to_purchase = rec.qty_delivered - rec.qty_purchased + else: + rec.qty_to_purchase = 0.0 + purchase_count = fields.Integer( compute='_compute_purchase_count', string='# of Purchases', ) @@ -55,6 +75,16 @@ class RmaOrderLine(models.Model): inverse_name='rma_line_id', string='Manual Purchase Order Lines', readonly=True, copy=False) + qty_to_purchase = fields.Float( + string='Qty To Purchase', copy=False, + digits=dp.get_precision('Product Unit of Measure'), + readonly=True, compute='_compute_qty_purchase', store=True, + ) + qty_purchased = fields.Float( + string='Qty Purchased', copy=False, + digits=dp.get_precision('Product Unit of Measure'), + readonly=True, compute='_compute_qty_purchase', store=True, + ) @api.onchange('operation_id') def _onchange_operation_id(self): @@ -150,3 +180,20 @@ class RmaOrderLine(models.Model): orders += self.mapped('manual_purchase_line_ids.order_id') result['domain'] = [('id', 'in', orders.ids)] return result + + @api.multi + def _get_rma_purchased_qty(self): + self.ensure_one() + qty = 0.0 + if self.type == 'customer': + return qty + uom_obj = self.env['product.uom'] + for procurement_id in self.procurement_ids: + purchase_line = procurement_id.purchase_line_id + qty += purchase_line.product_qty + + for line in self.manual_purchase_line_ids.filtered( + lambda p: p.state not in ('draft', 'sent', 'cancel')): + qty += uom_obj._compute_qty( + self.uom_id.id, line.product_qty, line.product_uom.id) + return qty diff --git a/rma_purchase/views/rma_order_line_view.xml b/rma_purchase/views/rma_order_line_view.xml index 23818b65..fb8926e9 100644 --- a/rma_purchase/views/rma_order_line_view.xml +++ b/rma_purchase/views/rma_order_line_view.xml @@ -35,6 +35,12 @@ ('order_id.partner_id', '=', partner_id), ('order_id.partner_id', 'child_of', partner_id)]"/> + + + + + +