summaryrefslogtreecommitdiff
path: root/addons/purchase_stock/models/product.py
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/purchase_stock/models/product.py
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/purchase_stock/models/product.py')
-rw-r--r--addons/purchase_stock/models/product.py71
1 files changed, 71 insertions, 0 deletions
diff --git a/addons/purchase_stock/models/product.py b/addons/purchase_stock/models/product.py
new file mode 100644
index 00000000..66bfb199
--- /dev/null
+++ b/addons/purchase_stock/models/product.py
@@ -0,0 +1,71 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import api, fields, models
+from odoo.osv import expression
+
+
+class ProductTemplate(models.Model):
+ _name = 'product.template'
+ _inherit = 'product.template'
+
+ @api.model
+ def _get_buy_route(self):
+ buy_route = self.env.ref('purchase_stock.route_warehouse0_buy', raise_if_not_found=False)
+ if buy_route:
+ return buy_route.ids
+ return []
+
+ route_ids = fields.Many2many(default=lambda self: self._get_buy_route())
+
+
+class ProductProduct(models.Model):
+ _name = 'product.product'
+ _inherit = 'product.product'
+
+ purchase_order_line_ids = fields.One2many('purchase.order.line', 'product_id', help='Technical: used to compute quantities.')
+
+ def _get_quantity_in_progress(self, location_ids=False, warehouse_ids=False):
+ if not location_ids:
+ location_ids = []
+ if not warehouse_ids:
+ warehouse_ids = []
+
+ qty_by_product_location, qty_by_product_wh = super()._get_quantity_in_progress(location_ids, warehouse_ids)
+ domain = []
+ rfq_domain = [
+ ('state', 'in', ('draft', 'sent', 'to approve')),
+ ('product_id', 'in', self.ids)
+ ]
+ if location_ids:
+ domain = expression.AND([rfq_domain, [
+ '|',
+ ('order_id.picking_type_id.default_location_dest_id', 'in', location_ids),
+ '&',
+ ('move_dest_ids', '=', False),
+ ('orderpoint_id.location_id', 'in', location_ids)
+ ]])
+ if warehouse_ids:
+ wh_domain = expression.AND([rfq_domain, [
+ '|',
+ ('order_id.picking_type_id.warehouse_id', 'in', warehouse_ids),
+ '&',
+ ('move_dest_ids', '=', False),
+ ('orderpoint_id.warehouse_id', 'in', warehouse_ids)
+ ]])
+ domain = expression.OR([domain, wh_domain])
+ groups = self.env['purchase.order.line'].read_group(domain,
+ ['product_id', 'product_qty', 'order_id', 'product_uom', 'orderpoint_id'],
+ ['order_id', 'product_id', 'product_uom', 'orderpoint_id'], lazy=False)
+ for group in groups:
+ if group.get('orderpoint_id'):
+ location = self.env['stock.warehouse.orderpoint'].browse(group['orderpoint_id'][:1]).location_id
+ else:
+ order = self.env['purchase.order'].browse(group['order_id'][0])
+ location = order.picking_type_id.default_location_dest_id
+ product = self.env['product.product'].browse(group['product_id'][0])
+ uom = self.env['uom.uom'].browse(group['product_uom'][0])
+ product_qty = uom._compute_quantity(group['product_qty'], product.uom_id, round=False)
+ qty_by_product_location[(product.id, location.id)] += product_qty
+ qty_by_product_wh[(product.id, location.get_warehouse().id)] += product_qty
+ return qty_by_product_location, qty_by_product_wh