diff --git a/sale_order_batch/models/sale_order.py b/sale_order_batch/models/sale_order.py
index 8c3a378..a853f9d 100644
--- a/sale_order_batch/models/sale_order.py
+++ b/sale_order_batch/models/sale_order.py
@@ -1,4 +1,4 @@
-from odoo import _, fields, models
+from odoo import _, api, fields, models
from odoo.exceptions import UserError
@@ -42,15 +42,21 @@ class SaleOrder(models.Model):
raise UserError(_(f"Sale Order belongs to a Batch: {', '.join(invalid_orders)}"))
return super().action_confirm()
+ @api.model_create_multi
+ def create(self, vals_list):
+ for vals in vals_list:
+ if vals.get("batch_id"):
+ vals["validity_date"] = (
+ self.env["sale.order.batch"].search([("id", "=", vals.get("batch_id"))]).validity_date
+ )
+ return super().create(vals_list)
+
def write(self, vals):
- if "batch_id" in vals:
- invalid_orders = []
- for order in self:
- if order.state not in ["draft", "sent"]:
- invalid_orders.append(order.name)
- if invalid_orders:
- raise UserError(_(f"Sale Order not in State Draft or Sent: {', '.join(invalid_orders)}"))
+ if vals.get("batch_id"):
+ vals["validity_date"] = (
+ self.env["sale.order.batch"].search([("id", "=", vals.get("batch_id"))]).validity_date
+ )
res = super().write(vals)
- if "batch_id" in vals:
+ if vals.get("batch_id"):
self.order_line._update_batch_product()
return res
diff --git a/sale_order_batch/models/sale_order_batch.py b/sale_order_batch/models/sale_order_batch.py
index c374447..ca2b302 100644
--- a/sale_order_batch/models/sale_order_batch.py
+++ b/sale_order_batch/models/sale_order_batch.py
@@ -1,15 +1,19 @@
+from datetime import timedelta
+
from odoo import _, api, fields, models
STATES = [("open", "Open"), ("close", "Close")]
+READONLY_FIELD_STATES = {state: [("readonly", True)] for state in {"close"}}
+
class SaleOrderBatch(models.Model):
"""Group serveral Sale Orders into a batch"""
_name = "sale.order.batch"
- _description = "Sale Order Batch"
- _inherit = "mail.thread"
+ _description = "Sales Order Batch"
+ _inherit = ["mail.thread", "mail.activity.mixin"]
_order = "date_order desc, id desc"
_check_company_auto = True
@@ -42,7 +46,16 @@ class SaleOrderBatch(models.Model):
help="Creation date of order batch,\nConfirmation date of confirmed orders.",
default=fields.Datetime.now,
)
- validity_date = fields.Date(compute="_compute_validity_date")
+ validity_date = fields.Date(
+ string="Expiration",
+ compute="_compute_validity_date",
+ inverse="_inverse_validity_date",
+ store=True,
+ readonly=False,
+ copy=False,
+ precompute=True,
+ states=READONLY_FIELD_STATES,
+ )
sale_order_ids = fields.One2many("sale.order", "batch_id")
sale_order_count = fields.Integer(compute="_compute_sale_order_count")
sale_order_line_ids = fields.Many2many("sale.order.line", compute="_compute_sale_order_line_ids", store=True)
@@ -53,14 +66,28 @@ class SaleOrderBatch(models.Model):
product_count = fields.Integer(compute="_compute_product_count")
partner_credit_warning = fields.Text(compute="_compute_partner_credit_warning")
- @api.depends("sale_order_ids.validity_date")
+ @api.depends("company_id")
def _compute_validity_date(self):
+ enabled_feature = bool(self.env["ir.config_parameter"].sudo().get_param("sale.use_quotation_validity_days"))
+ if not enabled_feature:
+ self.validity_date = False
+ return
+ today = fields.Date.context_today(self)
for batch in self:
- if batch.sale_order_ids:
- batch.validity_date = min(batch.sale_order_ids.mapped("validity_date"))
+ days = batch.company_id.quotation_validity_days
+ if days > 0:
+ batch.validity_date = today + timedelta(days)
else:
batch.validity_date = False
+ def _inverse_validity_date(self):
+ """
+ Set validity date on all Sale Orders
+ """
+ for batch in self:
+ for order in batch.sale_order_ids:
+ order.validity_date = batch.validity_date
+
@api.depends("sale_order_ids.order_line")
def _compute_sale_order_line_ids(self):
for batch in self:
@@ -136,8 +163,7 @@ class SaleOrderBatch(models.Model):
else:
action = {"type": "ir.actions.act_window_close"}
- context = {"default_move_type": "out_invoice"}
- action["context"] = context
+ action["context"] = {"default_move_type": "out_invoice"}
return action
def action_confirm(self):
@@ -153,12 +179,5 @@ class SaleOrderBatch(models.Model):
if "company_id" in vals:
self = self.with_company(vals["company_id"])
if vals.get("name", _("New")) == _("New"):
- seq_date = (
- fields.Datetime.context_timestamp(self, fields.Datetime.to_datetime(vals["date_order"]))
- if "date_order" in vals
- else None
- )
- vals["name"] = self.env["ir.sequence"].next_by_code("sale.order.batch", sequence_date=seq_date) or _(
- "New"
- )
+ vals["name"] = self.env["ir.sequence"].next_by_code("sale.order.batch") or _("New")
return super().create(vals_list)
diff --git a/sale_order_batch/security/ir.model.access.csv b/sale_order_batch/security/ir.model.access.csv
index 899c9f1..1de6396 100644
--- a/sale_order_batch/security/ir.model.access.csv
+++ b/sale_order_batch/security/ir.model.access.csv
@@ -1,4 +1,5 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_sale_order_batch_invoicing_payments,sale.order.batch,model_sale_order_batch,account.group_account_invoice,1,1,0,0
access_sale_order_batch,sale.order.batch,model_sale_order_batch,sales_team.group_sale_salesman,1,1,1,0
-access_sale_order_batch_manager,sale.order.batch.manager,model_sale_order,sales_team.group_sale_manager,1,1,1,1
+access_sale_order_batch_manager,sale.order.batch.manager,model_sale_order_batch,sales_team.group_sale_manager,1,1,1,1
access_sale_order_batch_product,sale.order.batch.product,model_sale_order_batch_product,sales_team.group_sale_salesman,1,1,1,1
diff --git a/sale_order_batch/views/sale_order_batch_views.xml b/sale_order_batch/views/sale_order_batch_views.xml
index 88147e8..b110c25 100644
--- a/sale_order_batch/views/sale_order_batch_views.xml
+++ b/sale_order_batch/views/sale_order_batch_views.xml
@@ -8,6 +8,8 @@
+
+
@@ -91,6 +93,8 @@
+
+
@@ -105,6 +109,7 @@
+
+