93 lines
4.0 KiB
Python
93 lines
4.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import _, api, fields, models
|
|
from odoo.osv.expression import AND
|
|
|
|
|
|
class ProductReplenish(models.TransientModel):
|
|
_inherit = 'product.replenish'
|
|
|
|
@api.model
|
|
def default_get(self, fields):
|
|
res = super().default_get(fields)
|
|
if res.get('product_id'):
|
|
product_id = self.env['product.product'].browse(res['product_id'])
|
|
product_tmpl_id = product_id.product_tmpl_id
|
|
company = product_tmpl_id.company_id or self.env.company
|
|
if 'warehouse_id' not in res:
|
|
res['warehouse_id'] = self.env['stock.warehouse'].search([
|
|
*self.env['stock.warehouse']._check_company_domain(company),
|
|
], limit=1).id
|
|
orderpoint = self.env['stock.warehouse.orderpoint'].search([('product_id', 'in', [product_tmpl_id.product_variant_id.id, product_id.id]), ("warehouse_id", "=", res['warehouse_id'])], limit=1)
|
|
res['supplier_id'] = False
|
|
if orderpoint:
|
|
res['supplier_id'] = orderpoint.supplier_id.id
|
|
elif product_tmpl_id.seller_ids:
|
|
res['supplier_id'] = product_tmpl_id.seller_ids[0].id
|
|
return res
|
|
|
|
@api.depends('route_id', 'supplier_id')
|
|
def _compute_date_planned(self):
|
|
super()._compute_date_planned()
|
|
for rec in self:
|
|
if 'buy' in rec.route_id.rule_ids.mapped('action'):
|
|
rec.date_planned = rec._get_date_planned(rec.route_id, supplier=rec.supplier_id, show_vendor=rec.show_vendor)
|
|
|
|
def _prepare_run_values(self):
|
|
res = super()._prepare_run_values()
|
|
if self.supplier_id:
|
|
res['supplierinfo_id'] = self.supplier_id
|
|
res['group_id'].partner_id = self.supplier_id.partner_id
|
|
return res
|
|
|
|
def action_stock_replenishment_info(self):
|
|
self.ensure_one()
|
|
orderpoint = self.env["stock.warehouse.orderpoint"].search([("product_id", "=", self.product_id.id), ("warehouse_id", "=", self.warehouse_id.id)], limit=1)
|
|
if not orderpoint:
|
|
orderpoint = self.env["stock.warehouse.orderpoint"].create({
|
|
"product_id": self.product_id.id,
|
|
"warehouse_id": self.warehouse_id.id,
|
|
})
|
|
action = orderpoint.action_stock_replenishment_info()
|
|
|
|
action["context"] = {
|
|
'default_orderpoint_id': orderpoint.id,
|
|
'replenish_id': self.id,
|
|
}
|
|
return action
|
|
|
|
def _get_record_to_notify(self, date):
|
|
order_line = self.env['purchase.order.line'].search([('write_date', '>=', date)], limit=1)
|
|
return order_line or super()._get_record_to_notify(date)
|
|
|
|
def _get_replenishment_order_notification_link(self, order_line):
|
|
if order_line._name == 'purchase.order.line':
|
|
return [{
|
|
'label': order_line.order_id.display_name,
|
|
'url': f'/odoo/action-purchase.action_rfq_form/{order_line.order_id.id}',
|
|
}]
|
|
return super()._get_replenishment_order_notification_link(order_line)
|
|
|
|
def _get_date_planned(self, route_id, **kwargs):
|
|
date = super()._get_date_planned(route_id, **kwargs)
|
|
if 'buy' not in route_id.rule_ids.mapped('action'):
|
|
return date
|
|
|
|
supplier = kwargs.get('supplier')
|
|
show_vendor = kwargs.get('show_vendor')
|
|
if not show_vendor or not supplier:
|
|
return date
|
|
|
|
delay = supplier.delay + self.env.company.days_to_purchase
|
|
|
|
if bool(self.env['ir.config_parameter'].sudo().get_param('purchase.use_po_lead')):
|
|
delay += self.env.company.po_lead
|
|
return fields.Datetime.add(date, days=delay)
|
|
|
|
def _get_route_domain(self, product_tmpl_id):
|
|
domain = super()._get_route_domain(product_tmpl_id)
|
|
if not product_tmpl_id.seller_ids:
|
|
domain = AND([domain, [('id', '!=', self.env.ref('purchase_stock.route_warehouse0_buy', raise_if_not_found=False).id)]])
|
|
return domain
|