Odoo18-Base/addons/purchase_stock/wizard/product_replenish.py
2025-01-06 10:57:38 +07:00

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