From 811a04aadd63fec1aa5f2ef66e0de5c1bcff2428 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?NIels=20G=C3=B6ttsch?= Date: Sat, 19 Oct 2024 22:11:19 +0200 Subject: [PATCH] [imp] make validity_date a real field, fix company relation, fix security groups --- sale_order_batch/models/sale_order.py | 24 +++++---- sale_order_batch/models/sale_order_batch.py | 51 +++++++++++++------ sale_order_batch/security/ir.model.access.csv | 3 +- .../views/sale_order_batch_views.xml | 6 +++ 4 files changed, 58 insertions(+), 26 deletions(-) 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 @@ + +