summaryrefslogtreecommitdiff
path: root/addons/purchase_requisition_stock/models
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_requisition_stock/models
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/purchase_requisition_stock/models')
-rw-r--r--addons/purchase_requisition_stock/models/__init__.py5
-rw-r--r--addons/purchase_requisition_stock/models/purchase.py14
-rw-r--r--addons/purchase_requisition_stock/models/purchase_requisition.py48
-rw-r--r--addons/purchase_requisition_stock/models/stock.py68
4 files changed, 135 insertions, 0 deletions
diff --git a/addons/purchase_requisition_stock/models/__init__.py b/addons/purchase_requisition_stock/models/__init__.py
new file mode 100644
index 00000000..1590d878
--- /dev/null
+++ b/addons/purchase_requisition_stock/models/__init__.py
@@ -0,0 +1,5 @@
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from . import purchase
+from . import stock
+from . import purchase_requisition
diff --git a/addons/purchase_requisition_stock/models/purchase.py b/addons/purchase_requisition_stock/models/purchase.py
new file mode 100644
index 00000000..9debe4e8
--- /dev/null
+++ b/addons/purchase_requisition_stock/models/purchase.py
@@ -0,0 +1,14 @@
+# -*- encoding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import api, fields, models
+
+
+class PurchaseOrder(models.Model):
+ _inherit = 'purchase.order'
+
+ @api.onchange('requisition_id')
+ def _onchange_requisition_id(self):
+ super(PurchaseOrder, self)._onchange_requisition_id()
+ if self.requisition_id:
+ self.picking_type_id = self.requisition_id.picking_type_id.id
diff --git a/addons/purchase_requisition_stock/models/purchase_requisition.py b/addons/purchase_requisition_stock/models/purchase_requisition.py
new file mode 100644
index 00000000..a2790324
--- /dev/null
+++ b/addons/purchase_requisition_stock/models/purchase_requisition.py
@@ -0,0 +1,48 @@
+# -*- encoding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import fields, models
+
+
+class PurchaseRequisition(models.Model):
+ _inherit = 'purchase.requisition'
+
+ def _get_picking_in(self):
+ pick_in = self.env.ref('stock.picking_type_in', raise_if_not_found=False)
+ company = self.env.company
+ if not pick_in or pick_in.sudo().warehouse_id.company_id.id != company.id:
+ pick_in = self.env['stock.picking.type'].search(
+ [('warehouse_id.company_id', '=', company.id), ('code', '=', 'incoming')],
+ limit=1,
+ )
+ return pick_in
+
+ warehouse_id = fields.Many2one('stock.warehouse', string='Warehouse', domain="[('company_id', '=', company_id)]")
+ picking_type_id = fields.Many2one('stock.picking.type', 'Operation Type', required=True, default=_get_picking_in, domain="['|',('warehouse_id', '=', False), ('warehouse_id.company_id', '=', company_id)]")
+
+ def _prepare_tender_values(self, product_id, product_qty, product_uom, location_id, name, origin, company_id, values):
+ return {
+ 'origin': origin,
+ 'date_end': values['date_planned'],
+ 'user_id': False,
+ 'warehouse_id': values.get('warehouse_id') and values['warehouse_id'].id or False,
+ 'company_id': company_id.id,
+ 'line_ids': [(0, 0, {
+ 'product_id': product_id.id,
+ 'product_uom_id': product_uom.id,
+ 'product_qty': product_qty,
+ 'product_description_variants': values.get('product_description_variants'),
+ 'move_dest_id': values.get('move_dest_ids') and values['move_dest_ids'][0].id or False
+ })],
+ }
+
+
+class PurchaseRequisitionLine(models.Model):
+ _inherit = "purchase.requisition.line"
+
+ move_dest_id = fields.Many2one('stock.move', 'Downstream Move')
+
+ def _prepare_purchase_order_line(self, name, product_qty=0.0, price_unit=0.0, taxes_ids=False):
+ res = super(PurchaseRequisitionLine, self)._prepare_purchase_order_line(name, product_qty, price_unit, taxes_ids)
+ res['move_dest_ids'] = self.move_dest_id and [(4, self.move_dest_id.id)] or []
+ return res
diff --git a/addons/purchase_requisition_stock/models/stock.py b/addons/purchase_requisition_stock/models/stock.py
new file mode 100644
index 00000000..0e1648ec
--- /dev/null
+++ b/addons/purchase_requisition_stock/models/stock.py
@@ -0,0 +1,68 @@
+# -*- encoding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from collections import defaultdict
+
+from odoo import api, fields, models
+
+
+class StockRule(models.Model):
+ _inherit = 'stock.rule'
+
+ @api.model
+ def _run_buy(self, procurements):
+ requisitions_values_by_company = defaultdict(list)
+ other_procurements = []
+ for procurement, rule in procurements:
+ if procurement.product_id.purchase_requisition == 'tenders':
+ values = self.env['purchase.requisition']._prepare_tender_values(*procurement)
+ values['picking_type_id'] = rule.picking_type_id.id
+ requisitions_values_by_company[procurement.company_id.id].append(values)
+ else:
+ other_procurements.append((procurement, rule))
+ for company_id, requisitions_values in requisitions_values_by_company.items():
+ self.env['purchase.requisition'].sudo().with_company(company_id).create(requisitions_values)
+ return super(StockRule, self)._run_buy(other_procurements)
+
+ def _prepare_purchase_order(self, company_id, origins, values):
+ res = super(StockRule, self)._prepare_purchase_order(company_id, origins, values)
+ values = values[0]
+ res['partner_ref'] = values['supplier'].purchase_requisition_id.name
+ res['requisition_id'] = values['supplier'].purchase_requisition_id.id
+ if values['supplier'].purchase_requisition_id.currency_id:
+ res['currency_id'] = values['supplier'].purchase_requisition_id.currency_id.id
+ return res
+
+ def _make_po_get_domain(self, company_id, values, partner):
+ domain = super(StockRule, self)._make_po_get_domain(company_id, values, partner)
+ if 'supplier' in values and values['supplier'].purchase_requisition_id:
+ domain += (
+ ('requisition_id', '=', values['supplier'].purchase_requisition_id.id),
+ )
+ return domain
+
+
+class StockMove(models.Model):
+ _inherit = 'stock.move'
+
+ requisition_line_ids = fields.One2many('purchase.requisition.line', 'move_dest_id')
+
+ def _get_upstream_documents_and_responsibles(self, visited):
+ # People without purchase rights should be able to do this operation
+ requisition_lines_sudo = self.sudo().requisition_line_ids
+ if requisition_lines_sudo:
+ return [(requisition_line.requisition_id, requisition_line.requisition_id.user_id, visited) for requisition_line in requisition_lines_sudo if requisition_line.requisition_id.state not in ('done', 'cancel')]
+ else:
+ return super(StockMove, self)._get_upstream_documents_and_responsibles(visited)
+
+
+class Orderpoint(models.Model):
+ _inherit = "stock.warehouse.orderpoint"
+
+ def _quantity_in_progress(self):
+ res = super(Orderpoint, self)._quantity_in_progress()
+ for op in self:
+ for pr in self.env['purchase.requisition'].search([('state', '=', 'draft'), ('origin', '=', op.name)]):
+ for prline in pr.line_ids.filtered(lambda l: l.product_id.id == op.product_id.id and not l.move_dest_id):
+ res[op.id] += prline.product_uom_id._compute_quantity(prline.product_qty, op.product_uom, round=False)
+ return res