diff --git a/sf_demand_plan/models/sf_demand_plan.py b/sf_demand_plan/models/sf_demand_plan.py
index 7707eec3..705a4e6f 100644
--- a/sf_demand_plan/models/sf_demand_plan.py
+++ b/sf_demand_plan/models/sf_demand_plan.py
@@ -72,6 +72,8 @@ class SfDemandPlan(models.Model):
('4', '低'),
], string='优先级', default='3')
+ overdelivery_allowed = fields.Boolean('可超量发货', default=False)
+
hide_button_release_plan = fields.Boolean(
string='显示下达计划按钮',
compute='_compute_hide_button_release_plan',
@@ -211,7 +213,13 @@ class SfDemandPlan(models.Model):
def button_production_release_plan(self):
line_ids = self.line_ids.filtered(lambda p: p.status == '30')
sum_product_uom_qty = sum(line_ids.mapped('plan_uom_qty'))
- if sum_product_uom_qty > self.product_uom_qty:
+ customer_location_id = self.env['ir.model.data']._xmlid_to_res_id('stock.stock_location_customers')
+ if not self.overdelivery_allowed and line_ids.filtered(lambda p: p.location_id.id == customer_location_id):
+ if float_compare(sum_product_uom_qty, self.product_uom_qty,
+ precision_rounding=self.product_id.uom_id.rounding) == 1:
+ raise ValidationError(f"已禁止向合作伙伴/客户超量发货,请更换“补货原因”或将“可超量发货”设置为“是”。")
+ elif float_compare(sum_product_uom_qty, self.product_uom_qty,
+ precision_rounding=self.product_id.uom_id.rounding) == 1:
return {
'name': _('需求计划'),
'type': 'ir.actions.act_window',
diff --git a/sf_demand_plan/models/sf_production_demand_plan.py b/sf_demand_plan/models/sf_production_demand_plan.py
index d0005ca0..1d4b616a 100644
--- a/sf_demand_plan/models/sf_production_demand_plan.py
+++ b/sf_demand_plan/models/sf_production_demand_plan.py
@@ -595,6 +595,11 @@ class SfProductionDemandPlan(models.Model):
filtered_plan = self.filtered(lambda mo: mo.status == '30')
if not filtered_plan:
raise UserError(_("没有需要下达的计划!"))
+ check_overdelivery_allowed = False
+ if not self.demand_plan_id.overdelivery_allowed:
+ customer_location_id = self.env['ir.model.data']._xmlid_to_res_id('stock.stock_location_customers')
+ if self.location_id.id == customer_location_id:
+ check_overdelivery_allowed = True
# 按产品分组并计算总数
product_data = {}
for plan in filtered_plan:
@@ -610,12 +615,15 @@ class SfProductionDemandPlan(models.Model):
# 检查需求超过计划数量的产品
warning_messages = []
for product, data in product_data.items():
- if data['plan_uom_qty'] > data['product_uom_qty']:
+ if float_compare(data['plan_uom_qty'], data['product_uom_qty'],
+ precision_rounding=product.uom_id.rounding) == 1:
warning_messages.append(
_("您正在下达的产品 %s,计划量%s,需求数量为%s,已超过需求数量") %
(product.display_name, data['plan_uom_qty'], data['product_uom_qty'])
)
- if warning_messages:
+ if warning_messages and check_overdelivery_allowed:
+ raise ValidationError(f"已禁止向合作伙伴/客户超量发货,请更换“补货原因”或将“可超量发货”设置为“是”。")
+ elif warning_messages:
warning_message = "\n".join(warning_messages)
return {
'name': _('需求计划'),
@@ -634,7 +642,15 @@ class SfProductionDemandPlan(models.Model):
self.ensure_one()
if not self.new_supply_method:
raise ValidationError(f"供货方式不能为空!")
- if self.plan_uom_qty > self.product_uom_qty:
+ check_overdelivery_allowed = False
+ if not self.demand_plan_id.overdelivery_allowed:
+ customer_location_id = self.env['ir.model.data']._xmlid_to_res_id('stock.stock_location_customers')
+ if self.location_id.id == customer_location_id:
+ check_overdelivery_allowed = True
+ if check_overdelivery_allowed:
+ if float_compare(self.plan_uom_qty, self.product_uom_qty,precision_rounding=self.product_id.uom_id.rounding) == 1:
+ raise ValidationError(f"已禁止向合作伙伴/客户超量发货,请更换“补货原因”或将“可超量发货”设置为“是”。")
+ elif float_compare(self.plan_uom_qty, self.product_uom_qty,precision_rounding=self.product_id.uom_id.rounding) == 1:
return {
'name': _('需求计划'),
'type': 'ir.actions.act_window',
diff --git a/sf_demand_plan/views/demand_plan_info.xml b/sf_demand_plan/views/demand_plan_info.xml
index 13718b51..7e7ff61b 100644
--- a/sf_demand_plan/views/demand_plan_info.xml
+++ b/sf_demand_plan/views/demand_plan_info.xml
@@ -35,6 +35,7 @@
+