diff --git a/sale_certificat_typology/i18n/fr.po b/sale_certificat_typology/i18n/fr.po index 64e99185..53154273 100644 --- a/sale_certificat_typology/i18n/fr.po +++ b/sale_certificat_typology/i18n/fr.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-05 08:44+0000\n" -"PO-Revision-Date: 2023-10-05 08:44+0000\n" +"POT-Creation-Date: 2023-12-01 18:22+0000\n" +"PO-Revision-Date: 2023-12-01 18:22+0000\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -83,11 +83,6 @@ msgstr "Justificatifs: Supprimer les documents stockés" msgid "Company" msgstr "Société" -#. module: sale_certificat_typology -#: model:ir.model.fields,field_description:sale_certificat_typology.field_sale_order_certificat_item__product_ids -msgid "Concerned products" -msgstr "Produits concernés" - #. module: sale_certificat_typology #: model:ir.model.fields,field_description:sale_certificat_typology.field_certificat_typology__create_uid #: model:ir.model.fields,field_description:sale_certificat_typology.field_sale_order_certificat_item__create_uid @@ -112,7 +107,6 @@ msgstr "" #. module: sale_certificat_typology #: model:ir.model.fields,field_description:sale_certificat_typology.field_certificat_typology__display_name -#: model:ir.model.fields,field_description:sale_certificat_typology.field_product_product__display_name #: model:ir.model.fields,field_description:sale_certificat_typology.field_product_template__display_name #: model:ir.model.fields,field_description:sale_certificat_typology.field_sale_order__display_name #: model:ir.model.fields,field_description:sale_certificat_typology.field_sale_order_certificat_item__display_name @@ -127,7 +121,6 @@ msgstr "Saisir le nombre de jours durant lesquels on doit stocker le document" #. module: sale_certificat_typology #: model:ir.model.fields,field_description:sale_certificat_typology.field_certificat_typology__id -#: model:ir.model.fields,field_description:sale_certificat_typology.field_product_product__id #: model:ir.model.fields,field_description:sale_certificat_typology.field_product_template__id #: model:ir.model.fields,field_description:sale_certificat_typology.field_sale_order__id #: model:ir.model.fields,field_description:sale_certificat_typology.field_sale_order_certificat_item__id @@ -142,7 +135,6 @@ msgstr "Est valide ?" #. module: sale_certificat_typology #: model:ir.model.fields,field_description:sale_certificat_typology.field_certificat_typology____last_update -#: model:ir.model.fields,field_description:sale_certificat_typology.field_product_product____last_update #: model:ir.model.fields,field_description:sale_certificat_typology.field_product_template____last_update #: model:ir.model.fields,field_description:sale_certificat_typology.field_sale_order____last_update #: model:ir.model.fields,field_description:sale_certificat_typology.field_sale_order_certificat_item____last_update @@ -162,21 +154,11 @@ msgstr "Dernière mise à jour par" msgid "Last Updated on" msgstr "Dernière mise à jour le" -#. module: sale_certificat_typology -#: model:ir.model.fields,field_description:sale_certificat_typology.field_sale_order_line__certificat_item_ids -msgid "Linked certificat items" -msgstr "Justificatifs liés" - #. module: sale_certificat_typology #: model:ir.model.fields,field_description:sale_certificat_typology.field_sale_order_certificat_item__order_id msgid "Linked order" msgstr "Commande liée" -#. module: sale_certificat_typology -#: model:ir.model.fields,field_description:sale_certificat_typology.field_sale_order_certificat_item__order_line_ids -msgid "Linked order lines" -msgstr "Lignes de commande liées" - #. module: sale_certificat_typology #: model:ir.model.fields,field_description:sale_certificat_typology.field_certificat_typology__name #: model_terms:ir.ui.view,arch_db:sale_certificat_typology.view_certificat_typology_form @@ -188,11 +170,6 @@ msgstr "Nom" msgid "None" msgstr "Non" -#. module: sale_certificat_typology -#: model:ir.model,name:sale_certificat_typology.model_product_product -msgid "Product" -msgstr "Article" - #. module: sale_certificat_typology #: model:ir.model,name:sale_certificat_typology.model_product_template msgid "Product Template (Multi-Company)" @@ -201,6 +178,7 @@ msgstr "Modèle de produit (Multi-Sociétés)" #. module: sale_certificat_typology #: model:ir.model.fields,field_description:sale_certificat_typology.field_product_product__required_certificat_ids #: model:ir.model.fields,field_description:sale_certificat_typology.field_product_template__required_certificat_ids +#: model:ir.model.fields,field_description:sale_certificat_typology.field_sale_order_line__required_certificat_ids msgid "Requested certificats" msgstr "Justificatifs demandés" diff --git a/sale_certificat_typology/models/product.py b/sale_certificat_typology/models/product.py index 517995ab..ea3c6cbe 100644 --- a/sale_certificat_typology/models/product.py +++ b/sale_certificat_typology/models/product.py @@ -1,7 +1,7 @@ # Copyright 2023 Akretion # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import api, fields, models +from odoo import fields, models class ProductTemplate(models.Model): @@ -11,30 +11,3 @@ class ProductTemplate(models.Model): comodel_name="certificat.typology", string="Requested certificats", ) - - @api.model_create_multi - def create(self, vals_list): - templates = super().create(vals_list) - for template, vals in zip(templates, vals_list): - if "required_certificat_ids" in vals: - template.product_variant_ids.write( - {"required_certificat_ids": vals["required_certificat_ids"]} - ) - return templates - - def write(self, vals): - res = super().write(vals) - if "required_certificat_ids" in vals: - self.product_variant_ids.write( - {"required_certificat_ids": vals["required_certificat_ids"]} - ) - return res - - -class ProductProduct(models.Model): - _inherit = "product.product" - - required_certificat_ids = fields.Many2many( - comodel_name="certificat.typology", - string="Requested certificats", - ) diff --git a/sale_certificat_typology/models/sale_order.py b/sale_certificat_typology/models/sale_order.py index 8a2d1dca..c4c1dc3e 100644 --- a/sale_certificat_typology/models/sale_order.py +++ b/sale_certificat_typology/models/sale_order.py @@ -13,20 +13,28 @@ class SaleOrder(models.Model): certificat_item_ids = fields.One2many( comodel_name="sale.order.certificat.item", inverse_name="order_id", + compute="_compute_certificat_item_ids", string="Certificat items", ) sale_warn_msg = fields.Text(compute="_compute_sale_warn_msg") - def action_confirm(self): - for sale in self: - if sale.certificat_item_ids.filtered(lambda ci: not ci.certificat_is_ok): - raise ValidationError( - _( - "You cannot validate your order because some products " - "require certificates !" + @api.depends("order_line.product_id") + def _compute_certificat_item_ids(self): + for record in self: + required_certificats = record.order_line.product_id.required_certificat_ids + items = record.certificat_item_ids.filtered( + lambda s: s.certificat_typology_id in required_certificats + ) + for certificat in required_certificats: + if certificat not in items.certificat_typology_id: + items |= self.env["sale.order.certificat.item"].create( + { + "order_id": record.id, + "certificat_typology_id": certificat.id, + "company_id": record.company_id.id, + } ) - ) - return super().action_confirm() + record.certificat_item_ids = [(6, 0, items.ids)] @api.depends("certificat_item_ids") def _compute_sale_warn_msg(self): @@ -40,85 +48,34 @@ def _compute_sale_warn_msg(self): ) sale.sale_warn_msg = sale_warn_msg + def action_confirm(self): + for sale in self: + if sale.certificat_item_ids.filtered(lambda ci: not ci.certificat_is_ok): + raise ValidationError( + _( + "You cannot validate your order because some products " + "require certificates !" + ) + ) + return super().action_confirm() + class SaleOrderLine(models.Model): _inherit = "sale.order.line" - certificat_item_ids = fields.Many2many( - comodel_name="sale.order.certificat.item", string="Linked certificat items" + required_certificat_ids = fields.Many2many( + comodel_name="certificat.typology", + related="product_id.required_certificat_ids", + string="Requested certificats", + readonly=True, ) - @api.model_create_multi - def create(self, vals_list): - lines = super().create(vals_list) - for line, vals in zip(lines, vals_list): - if "order_id" in vals and "product_id" in vals: - self._add_certificat_items(line, vals.get("product_id")) - return lines - - def write(self, values): - for line in self: - if "product_id" in values: - # remove certificat item for old product - self._remove_certificat_items(line) - # add certificat item for new product - self._add_certificat_items(line, values.get("product_id")) - return super().write(values) - - def unlink(self): - for line in self: - self._remove_certificat_items(line) - return super().unlink() - - def _add_certificat_items(self, line, product_id): - product = self.env["product.product"].browse(product_id) - for certificat in product.required_certificat_ids: - certificat_item = self.env["sale.order.certificat.item"].search( - [ - ("order_id", "=", line.order_id.id), - ("certificat_typology_id", "=", certificat.id), - ], - limit=1, - ) - if certificat_item: - certificat_item.write({"order_line_ids": [(4, line.id, 0)]}) - else: - self.env["sale.order.certificat.item"].create( - { - "order_id": line.order_id.id, - "order_line_ids": [(6, 0, line.ids)], - "certificat_typology_id": certificat.id, - "company_id": line.company_id.id, - } - ) - - def _remove_certificat_items(self, line): - certificat_items = self.env["sale.order.certificat.item"].search( - [("order_id", "=", line.order_id.id), ("order_line_ids", "in", line.id)] - ) - for item in certificat_items: - if len(item.order_line_ids) == 1: - item.unlink() - else: - item.write({"order_line_ids": [(3, line.id, 0)]}) - class SaleOrderCertificatItem(models.Model): _name = "sale.order.certificat.item" _description = "Certificat Items in Sale Order" - order_id = fields.Many2one( - comodel_name="sale.order", string="Linked order", required=True - ) - order_line_ids = fields.Many2many( - comodel_name="sale.order.line", string="Linked order lines", required=True - ) - product_ids = fields.Many2many( - comodel_name="product.product", - string="Concerned products", - compute="_compute_product_ids", - readonly=False, - ) + order_id = fields.Many2one(comodel_name="sale.order", string="Linked order") certificat_typology_id = fields.Many2one( comodel_name="certificat.typology", string="Certificat typology", required=True ) @@ -143,8 +100,3 @@ def _delete_documents_stored(self): date.today() - item.order_id.date_order.date() ).days >= item.certificat_typology_id.storage_duration: item.write({"certificat": False}) - - @api.depends("order_line_ids") - def _compute_product_ids(self): - for rec in self: - rec.product_ids = [(6, 0, rec.order_line_ids.mapped("product_id").ids)] diff --git a/sale_certificat_typology/views/sale_order.xml b/sale_certificat_typology/views/sale_order.xml index c7723ef5..ccc0c27d 100644 --- a/sale_certificat_typology/views/sale_order.xml +++ b/sale_certificat_typology/views/sale_order.xml @@ -21,11 +21,6 @@ delete="false" create="false" > - + + +