From 4fb9254ba31b803fa912a5aa83ff06e68105b8a8 Mon Sep 17 00:00:00 2001 From: Murtuza Saleh Date: Thu, 28 Mar 2019 12:14:06 +0530 Subject: [PATCH 01/14] [MIG][12.0] agreement_legal_sale [UPD] README.rst [UPD] Update agreement_legal_sale.pot Added translation using Weblate (French) Translated using Weblate (French) Currently translated at 100.0% (11 of 11 strings) Translation: contract-12.0/contract-12.0-agreement_legal_sale Translate-URL: https://translation.odoo-community.org/projects/contract-12-0/contract-12-0-agreement_legal_sale/fr/ Translated using Weblate (German) Currently translated at 100.0% (11 of 11 strings) Translation: contract-12.0/contract-12.0-agreement_legal_sale Translate-URL: https://translation.odoo-community.org/projects/contract-12-0/contract-12-0-agreement_legal_sale/de/ [UPD] README.rst Added translation using Weblate (Chinese (Simplified)) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (11 of 11 strings) Translation: contract-12.0/contract-12.0-agreement_legal_sale Translate-URL: https://translation.odoo-community.org/projects/contract-12-0/contract-12-0-agreement_legal_sale/zh_CN/ --- agreement_legal_sale/README.rst | 131 +++++ agreement_legal_sale/__init__.py | 3 + agreement_legal_sale/__manifest__.py | 27 + .../i18n/agreement_legal_sale.pot | 74 +++ agreement_legal_sale/i18n/agreement_sale.pot | 64 +++ agreement_legal_sale/i18n/de.po | 85 ++++ agreement_legal_sale/i18n/fr.po | 78 +++ agreement_legal_sale/i18n/zh_CN.po | 76 +++ agreement_legal_sale/models/__init__.py | 7 + agreement_legal_sale/models/agreement.py | 20 + agreement_legal_sale/models/product.py | 13 + agreement_legal_sale/models/sale_order.py | 45 ++ agreement_legal_sale/readme/CONFIGURE.rst | 6 + agreement_legal_sale/readme/CONTRIBUTORS.rst | 3 + agreement_legal_sale/readme/CREDITS.rst | 4 + agreement_legal_sale/readme/DESCRIPTION.rst | 5 + agreement_legal_sale/readme/ROADMAP.rst | 1 + agreement_legal_sale/readme/USAGE.rst | 14 + .../static/description/icon.png | Bin 0 -> 6755 bytes .../static/description/index.html | 471 ++++++++++++++++++ agreement_legal_sale/views/agreement.xml | 29 ++ agreement_legal_sale/views/product.xml | 25 + agreement_legal_sale/views/sale_order.xml | 23 + 23 files changed, 1204 insertions(+) create mode 100644 agreement_legal_sale/README.rst create mode 100644 agreement_legal_sale/__init__.py create mode 100644 agreement_legal_sale/__manifest__.py create mode 100644 agreement_legal_sale/i18n/agreement_legal_sale.pot create mode 100644 agreement_legal_sale/i18n/agreement_sale.pot create mode 100644 agreement_legal_sale/i18n/de.po create mode 100644 agreement_legal_sale/i18n/fr.po create mode 100644 agreement_legal_sale/i18n/zh_CN.po create mode 100644 agreement_legal_sale/models/__init__.py create mode 100644 agreement_legal_sale/models/agreement.py create mode 100644 agreement_legal_sale/models/product.py create mode 100644 agreement_legal_sale/models/sale_order.py create mode 100644 agreement_legal_sale/readme/CONFIGURE.rst create mode 100644 agreement_legal_sale/readme/CONTRIBUTORS.rst create mode 100644 agreement_legal_sale/readme/CREDITS.rst create mode 100644 agreement_legal_sale/readme/DESCRIPTION.rst create mode 100644 agreement_legal_sale/readme/ROADMAP.rst create mode 100644 agreement_legal_sale/readme/USAGE.rst create mode 100644 agreement_legal_sale/static/description/icon.png create mode 100644 agreement_legal_sale/static/description/index.html create mode 100644 agreement_legal_sale/views/agreement.xml create mode 100644 agreement_legal_sale/views/product.xml create mode 100644 agreement_legal_sale/views/sale_order.xml diff --git a/agreement_legal_sale/README.rst b/agreement_legal_sale/README.rst new file mode 100644 index 000000000..3dba3eb24 --- /dev/null +++ b/agreement_legal_sale/README.rst @@ -0,0 +1,131 @@ +==================== +Agreement Legal Sale +==================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fcontract-lightgray.png?logo=github + :target: https://github.com/OCA/contract/tree/12.0/agreement_legal_sale + :alt: OCA/contract +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/contract-12-0/contract-12-0-agreement_legal_sale + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/110/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Odoo Sales App does not support the management of legal content for agreements +and contracts. It's also not integrated with the Agreement App. + +This module is for companies that needs their customer to sign an agreement +with all the legal information based on the selected agreement template. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To configure this module: + +* Go to Agreement > Configuration > Templates +* Create a new template with sections and clauses and their respective content +* Go to Agreement > Configuration > Stages +* Create and reorder stages to match your process + +Usage +===== + +To use this module: + +* Go to Sales +* Create or select a quotation +* Set the agreement template and add some products +* Confirm the quotation. An agreement is created and linked to the sales order: + + * the agreement template is copied into an agreement with a copy of the + sections, clauses, recitals and appendices + * all the sales order lines are added as agreement lines + * the products on the SO with BOM are added as service profile on the agreement + * the customer information is set from the sales order + * the eventual analytic account linked to the sales order is set on the agreement + * the agreement is linked to the sales order and vice versa + +Known issues / Roadmap +====================== + +The roadmap is documented on https://github.com/OCA/contract/issues. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Open Source Integrators + +Contributors +~~~~~~~~~~~~ + +* Steven Campbell +* Maxime Chambreuil +* Serpent Consulting Services Pvt. Ltd. + +Other credits +~~~~~~~~~~~~~ + +The development of this module has been financially supported by: + +* Pavlov Media +* Open Source Integrators + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-osi-scampbell| image:: https://github.com/osi-scampbell.png?size=40px + :target: https://github.com/osi-scampbell + :alt: osi-scampbell +.. |maintainer-max3903| image:: https://github.com/max3903.png?size=40px + :target: https://github.com/max3903 + :alt: max3903 + +Current `maintainers `__: + +|maintainer-osi-scampbell| |maintainer-max3903| + +This module is part of the `OCA/contract `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/agreement_legal_sale/__init__.py b/agreement_legal_sale/__init__.py new file mode 100644 index 000000000..69f7babdf --- /dev/null +++ b/agreement_legal_sale/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import models diff --git a/agreement_legal_sale/__manifest__.py b/agreement_legal_sale/__manifest__.py new file mode 100644 index 000000000..7ed16142d --- /dev/null +++ b/agreement_legal_sale/__manifest__.py @@ -0,0 +1,27 @@ +# Copyright (C) 2019 - TODAY, Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + 'name': 'Agreement Legal Sale', + 'summary': 'Create an agreement when the sale order is confirmed', + 'version': '12.0.1.0.0', + 'license': 'AGPL-3', + 'author': 'Open Source Integrators, Odoo Community Association (OCA)', + 'category': 'Agreement', + 'website': 'https://github.com/OCA/contract', + 'depends': [ + 'agreement_legal', + 'agreement_sale', + ], + 'data': [ + 'views/agreement.xml', + 'views/product.xml', + 'views/sale_order.xml', + ], + 'installable': True, + 'development_status': 'Beta', + 'maintainers': [ + 'osi-scampbell', + 'max3903', + ], +} diff --git a/agreement_legal_sale/i18n/agreement_legal_sale.pot b/agreement_legal_sale/i18n/agreement_legal_sale.pot new file mode 100644 index 000000000..35297dfc6 --- /dev/null +++ b/agreement_legal_sale/i18n/agreement_legal_sale.pot @@ -0,0 +1,74 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * agreement_legal_sale +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: agreement_legal_sale +#: model:ir.model,name:agreement_legal_sale.model_agreement +#: model_terms:ir.ui.view,arch_db:agreement_legal_sale.product_template_form_view +msgid "Agreement" +msgstr "" + +#. module: agreement_legal_sale +#: model:ir.model,name:agreement_legal_sale.model_agreement_line +msgid "Agreement Lines" +msgstr "" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_sale_order__agreement_template_id +msgid "Agreement Template" +msgstr "" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement__analytic_account_id +msgid "Analytic Account" +msgstr "" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_product_product__is_serviceprofile +#: model:ir.model.fields,field_description:agreement_legal_sale.field_product_template__is_serviceprofile +msgid "Create a Service Profile" +msgstr "" + +#. module: agreement_legal_sale +#: model:ir.model.fields,help:agreement_legal_sale.field_product_product__is_serviceprofile +#: model:ir.model.fields,help:agreement_legal_sale.field_product_template__is_serviceprofile +msgid "If True, this product will create a service profile on the\n" +" agreement when the sales order is confirmed." +msgstr "" + +#. module: agreement_legal_sale +#: model:ir.model,name:agreement_legal_sale.model_product_template +msgid "Product Template" +msgstr "" + +#. module: agreement_legal_sale +#: model:ir.model,name:agreement_legal_sale.model_sale_order +msgid "Sale Order" +msgstr "" + +#. module: agreement_legal_sale +#: model_terms:ir.ui.view,arch_db:agreement_legal_sale.agreement_sale_form_view +msgid "Sales" +msgstr "" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement__sale_id +msgid "Sales Order" +msgstr "" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement_line__sale_line_id +msgid "Sales Order Line" +msgstr "" + diff --git a/agreement_legal_sale/i18n/agreement_sale.pot b/agreement_legal_sale/i18n/agreement_sale.pot new file mode 100644 index 000000000..e08465611 --- /dev/null +++ b/agreement_legal_sale/i18n/agreement_sale.pot @@ -0,0 +1,64 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * agreement_sale +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: agreement_sale +#: model:ir.model.fields,field_description:agreement_sale.field_sale_order_agreement_id +#: model:ir.ui.view,arch_db:agreement_sale.product_template_form_view +msgid "Agreement" +msgstr "" + +#. module: agreement_sale +#: model:ir.model.fields,field_description:agreement_sale.field_sale_order_agreement_template_id +msgid "Agreement Template" +msgstr "" + +#. module: agreement_sale +#: model:ir.model.fields,field_description:agreement_sale.field_product_product_is_serviceprofile +#: model:ir.model.fields,field_description:agreement_sale.field_product_template_is_serviceprofile +msgid "Create a Service Profile" +msgstr "" + +#. module: agreement_sale +#: model:ir.model.fields,help:agreement_sale.field_product_product_is_serviceprofile +#: model:ir.model.fields,help:agreement_sale.field_product_template_is_serviceprofile +msgid "If True, this product will create a service profile on the\n" +" agreement when the sales order is confirmed." +msgstr "" + +#. module: agreement_sale +#: model:ir.model,name:agreement_sale.model_product_template +msgid "Product Template" +msgstr "" + +#. module: agreement_sale +#: model:ir.model,name:agreement_sale.model_sale_order +msgid "Quotation" +msgstr "" + +#. module: agreement_sale +#: model:ir.ui.view,arch_db:agreement_sale.agreement_sale_form_view +msgid "Sales" +msgstr "" + +#. module: agreement_sale +#: model:ir.model.fields,field_description:agreement_sale.field_agreement_sale_id +msgid "Sales Order" +msgstr "" + +#. module: agreement_sale +#: model:ir.model,name:agreement_sale.model_agreement +msgid "agreement" +msgstr "" + diff --git a/agreement_legal_sale/i18n/de.po b/agreement_legal_sale/i18n/de.po new file mode 100644 index 000000000..9029209af --- /dev/null +++ b/agreement_legal_sale/i18n/de.po @@ -0,0 +1,85 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * agreement_sale +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-05-10 14:03+0000\n" +"Last-Translator: Maria Sparenberg \n" +"Language-Team: none\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 3.5.1\n" + +#. module: agreement_legal_sale +#: model:ir.model,name:agreement_legal_sale.model_agreement +#: model_terms:ir.ui.view,arch_db:agreement_legal_sale.product_template_form_view +msgid "Agreement" +msgstr "Vereinbarung" + +#. module: agreement_legal_sale +#: model:ir.model,name:agreement_legal_sale.model_agreement_line +msgid "Agreement Lines" +msgstr "Vereinbarungspositionen" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_sale_order__agreement_template_id +msgid "Agreement Template" +msgstr "Vereinbarungsvorlage" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement__analytic_account_id +msgid "Analytic Account" +msgstr "Kostenstelle" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_product_product__is_serviceprofile +#: model:ir.model.fields,field_description:agreement_legal_sale.field_product_template__is_serviceprofile +msgid "Create a Service Profile" +msgstr "Dienstleistungsprofil erstellen" + +#. module: agreement_legal_sale +#: model:ir.model.fields,help:agreement_legal_sale.field_product_product__is_serviceprofile +#: model:ir.model.fields,help:agreement_legal_sale.field_product_template__is_serviceprofile +msgid "" +"If True, this product will create a service profile on the\n" +" agreement when the sales order is confirmed." +msgstr "" +"Wenn der Haken gesetzt ist, wird dieses Produkt ein Dienstleistungsprofil in " +"der Vereinbarung erzeugen, sobald der Verkaufsauftrag bestätigt wird." + +#. module: agreement_legal_sale +#: model:ir.model,name:agreement_legal_sale.model_product_template +msgid "Product Template" +msgstr "Produktvorlage" + +#. module: agreement_legal_sale +#: model:ir.model,name:agreement_legal_sale.model_sale_order +msgid "Sale Order" +msgstr "Verkaufsauftrag" + +#. module: agreement_legal_sale +#: model_terms:ir.ui.view,arch_db:agreement_legal_sale.agreement_sale_form_view +msgid "Sales" +msgstr "Verkauf" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement__sale_id +msgid "Sales Order" +msgstr "Verkaufsauftrag" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement_line__sale_line_id +msgid "Sales Order Line" +msgstr "Auftragszeile" + +#~ msgid "Quotation" +#~ msgstr "Angebot" + +#~ msgid "agreement" +#~ msgstr "Vereinbarung" diff --git a/agreement_legal_sale/i18n/fr.po b/agreement_legal_sale/i18n/fr.po new file mode 100644 index 000000000..315c9269e --- /dev/null +++ b/agreement_legal_sale/i18n/fr.po @@ -0,0 +1,78 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * agreement_legal_sale +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-04-19 17:15+0000\n" +"Last-Translator: Yves Goldberg \n" +"Language-Team: none\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 3.5.1\n" + +#. module: agreement_legal_sale +#: model:ir.model,name:agreement_legal_sale.model_agreement +#: model_terms:ir.ui.view,arch_db:agreement_legal_sale.product_template_form_view +msgid "Agreement" +msgstr "Accord" + +#. module: agreement_legal_sale +#: model:ir.model,name:agreement_legal_sale.model_agreement_line +msgid "Agreement Lines" +msgstr "Lignes de l'accord" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_sale_order__agreement_template_id +msgid "Agreement Template" +msgstr "Modèle d'accord" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement__analytic_account_id +msgid "Analytic Account" +msgstr "Compte Analytique" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_product_product__is_serviceprofile +#: model:ir.model.fields,field_description:agreement_legal_sale.field_product_template__is_serviceprofile +msgid "Create a Service Profile" +msgstr "Créer un profil de service" + +#. module: agreement_legal_sale +#: model:ir.model.fields,help:agreement_legal_sale.field_product_product__is_serviceprofile +#: model:ir.model.fields,help:agreement_legal_sale.field_product_template__is_serviceprofile +msgid "If True, this product will create a service profile on the\n" +" agreement when the sales order is confirmed." +msgstr "" +"Si Vrai, ce produit créera un profil de service dans\n" +"          l'accord a la confirmation de la commande client." + +#. module: agreement_legal_sale +#: model:ir.model,name:agreement_legal_sale.model_product_template +msgid "Product Template" +msgstr "Modèle Produit" + +#. module: agreement_legal_sale +#: model:ir.model,name:agreement_legal_sale.model_sale_order +msgid "Sale Order" +msgstr "Commande" + +#. module: agreement_legal_sale +#: model_terms:ir.ui.view,arch_db:agreement_legal_sale.agreement_sale_form_view +msgid "Sales" +msgstr "Vente" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement__sale_id +msgid "Sales Order" +msgstr "Commandes" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement_line__sale_line_id +msgid "Sales Order Line" +msgstr "Ligne de commande" diff --git a/agreement_legal_sale/i18n/zh_CN.po b/agreement_legal_sale/i18n/zh_CN.po new file mode 100644 index 000000000..759cc621a --- /dev/null +++ b/agreement_legal_sale/i18n/zh_CN.po @@ -0,0 +1,76 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * agreement_legal_sale +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-09-04 18:23+0000\n" +"Last-Translator: 黎伟杰 <674416404@qq.com>\n" +"Language-Team: none\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 3.8\n" + +#. module: agreement_legal_sale +#: model:ir.model,name:agreement_legal_sale.model_agreement +#: model_terms:ir.ui.view,arch_db:agreement_legal_sale.product_template_form_view +msgid "Agreement" +msgstr "协议" + +#. module: agreement_legal_sale +#: model:ir.model,name:agreement_legal_sale.model_agreement_line +msgid "Agreement Lines" +msgstr "协议行" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_sale_order__agreement_template_id +msgid "Agreement Template" +msgstr "协议模板" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement__analytic_account_id +msgid "Analytic Account" +msgstr "分析账户" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_product_product__is_serviceprofile +#: model:ir.model.fields,field_description:agreement_legal_sale.field_product_template__is_serviceprofile +msgid "Create a Service Profile" +msgstr "创建服务配置文件" + +#. module: agreement_legal_sale +#: model:ir.model.fields,help:agreement_legal_sale.field_product_product__is_serviceprofile +#: model:ir.model.fields,help:agreement_legal_sale.field_product_template__is_serviceprofile +msgid "If True, this product will create a service profile on the\n" +" agreement when the sales order is confirmed." +msgstr "如果为真,则当确认销售订单时,此产品将在协议上创建服务配置文件。" + +#. module: agreement_legal_sale +#: model:ir.model,name:agreement_legal_sale.model_product_template +msgid "Product Template" +msgstr "产品模版" + +#. module: agreement_legal_sale +#: model:ir.model,name:agreement_legal_sale.model_sale_order +msgid "Sale Order" +msgstr "销售订单" + +#. module: agreement_legal_sale +#: model_terms:ir.ui.view,arch_db:agreement_legal_sale.agreement_sale_form_view +msgid "Sales" +msgstr "销售" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement__sale_id +msgid "Sales Order" +msgstr "销售订单" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement_line__sale_line_id +msgid "Sales Order Line" +msgstr "销售订单行" diff --git a/agreement_legal_sale/models/__init__.py b/agreement_legal_sale/models/__init__.py new file mode 100644 index 000000000..2f3b40d75 --- /dev/null +++ b/agreement_legal_sale/models/__init__.py @@ -0,0 +1,7 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import ( + sale_order, + agreement, + product, +) diff --git a/agreement_legal_sale/models/agreement.py b/agreement_legal_sale/models/agreement.py new file mode 100644 index 000000000..6e064886d --- /dev/null +++ b/agreement_legal_sale/models/agreement.py @@ -0,0 +1,20 @@ +# Copyright (C) 2019 - TODAY, Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class Agreement(models.Model): + _inherit = 'agreement' + + sale_id = fields.Many2one('sale.order', string='Sales Order') + analytic_account_id = fields.Many2one( + 'account.analytic.account', 'Analytic Account', readonly=True, + copy=False) + + +class AgreementLine(models.Model): + _inherit = "agreement.line" + + sale_line_id = fields.Many2one('sale.order.line', + string='Sales Order Line') diff --git a/agreement_legal_sale/models/product.py b/agreement_legal_sale/models/product.py new file mode 100644 index 000000000..59d7c8f04 --- /dev/null +++ b/agreement_legal_sale/models/product.py @@ -0,0 +1,13 @@ +# Copyright (C) 2019 - TODAY, Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ProductTemplate(models.Model): + _inherit = 'product.template' + + is_serviceprofile = fields.Boolean( + string="Create a Service Profile", + help="""If True, this product will create a service profile on the + agreement when the sales order is confirmed.""") diff --git a/agreement_legal_sale/models/sale_order.py b/agreement_legal_sale/models/sale_order.py new file mode 100644 index 000000000..a6713a614 --- /dev/null +++ b/agreement_legal_sale/models/sale_order.py @@ -0,0 +1,45 @@ +# Copyright (C) 2019 - TODAY, Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class SaleOrder(models.Model): + _inherit = 'sale.order' + + agreement_template_id = fields.Many2one( + 'agreement', + string="Agreement Template", + domain="[('is_template', '=', True)]") + + @api.multi + def _action_confirm(self): + res = super(SaleOrder, self)._action_confirm() + for order in self: + if order.agreement_template_id: + order.agreement_id = order.agreement_template_id.copy(default={ + 'name': order.name, + 'code': order.name, + 'is_template': False, + 'sale_id': order.id, + 'partner_id': order.partner_id.id, + 'analytic_account_id': order.analytic_account_id and + order.analytic_account_id.id or False, + }) + for line in order.order_line: + # Create agreement line + self.env['agreement.line'].create({ + 'product_id': line.product_id.id, + 'name': line.name, + 'agreement_id': order.agreement_id.id, + 'qty': line.product_uom_qty, + 'sale_line_id': line.id, + 'uom_id': line.product_uom.id + }) + # If the product is a service profile, create one + if line.product_id.product_tmpl_id.is_serviceprofile: + self.env['agreement.serviceprofile'].create({ + 'name': line.name, + 'agreement_id': order.agreement_id.id, + }) + return res diff --git a/agreement_legal_sale/readme/CONFIGURE.rst b/agreement_legal_sale/readme/CONFIGURE.rst new file mode 100644 index 000000000..3871fc34e --- /dev/null +++ b/agreement_legal_sale/readme/CONFIGURE.rst @@ -0,0 +1,6 @@ +To configure this module: + +* Go to Agreement > Configuration > Templates +* Create a new template with sections and clauses and their respective content +* Go to Agreement > Configuration > Stages +* Create and reorder stages to match your process diff --git a/agreement_legal_sale/readme/CONTRIBUTORS.rst b/agreement_legal_sale/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..364a17293 --- /dev/null +++ b/agreement_legal_sale/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* Steven Campbell +* Maxime Chambreuil +* Serpent Consulting Services Pvt. Ltd. diff --git a/agreement_legal_sale/readme/CREDITS.rst b/agreement_legal_sale/readme/CREDITS.rst new file mode 100644 index 000000000..0543afe72 --- /dev/null +++ b/agreement_legal_sale/readme/CREDITS.rst @@ -0,0 +1,4 @@ +The development of this module has been financially supported by: + +* Pavlov Media +* Open Source Integrators diff --git a/agreement_legal_sale/readme/DESCRIPTION.rst b/agreement_legal_sale/readme/DESCRIPTION.rst new file mode 100644 index 000000000..642b7de2c --- /dev/null +++ b/agreement_legal_sale/readme/DESCRIPTION.rst @@ -0,0 +1,5 @@ +Odoo Sales App does not support the management of legal content for agreements +and contracts. It's also not integrated with the Agreement App. + +This module is for companies that needs their customer to sign an agreement +with all the legal information based on the selected agreement template. diff --git a/agreement_legal_sale/readme/ROADMAP.rst b/agreement_legal_sale/readme/ROADMAP.rst new file mode 100644 index 000000000..c6d54c4f5 --- /dev/null +++ b/agreement_legal_sale/readme/ROADMAP.rst @@ -0,0 +1 @@ +The roadmap is documented on https://github.com/OCA/contract/issues. diff --git a/agreement_legal_sale/readme/USAGE.rst b/agreement_legal_sale/readme/USAGE.rst new file mode 100644 index 000000000..259af0b9f --- /dev/null +++ b/agreement_legal_sale/readme/USAGE.rst @@ -0,0 +1,14 @@ +To use this module: + +* Go to Sales +* Create or select a quotation +* Set the agreement template and add some products +* Confirm the quotation. An agreement is created and linked to the sales order: + + * the agreement template is copied into an agreement with a copy of the + sections, clauses, recitals and appendices + * all the sales order lines are added as agreement lines + * the products on the SO with BOM are added as service profile on the agreement + * the customer information is set from the sales order + * the eventual analytic account linked to the sales order is set on the agreement + * the agreement is linked to the sales order and vice versa diff --git a/agreement_legal_sale/static/description/icon.png b/agreement_legal_sale/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..23ce93135053c48a74469807879f2805b12382ad GIT binary patch literal 6755 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 + + + + + +Agreement Legal Sale + + + + + + diff --git a/agreement_legal_sale/views/agreement.xml b/agreement_legal_sale/views/agreement.xml new file mode 100644 index 000000000..dffaee978 --- /dev/null +++ b/agreement_legal_sale/views/agreement.xml @@ -0,0 +1,29 @@ + + + + + + + agreement.form.view + agreement + + + + + + + + + + + + + + + + + + + diff --git a/agreement_legal_sale/views/product.xml b/agreement_legal_sale/views/product.xml new file mode 100644 index 000000000..54fa92cba --- /dev/null +++ b/agreement_legal_sale/views/product.xml @@ -0,0 +1,25 @@ + + + + + + + product.template.form.view + product.template + + + + + + + + + + + + + + + + diff --git a/agreement_legal_sale/views/sale_order.xml b/agreement_legal_sale/views/sale_order.xml new file mode 100644 index 000000000..8b607a891 --- /dev/null +++ b/agreement_legal_sale/views/sale_order.xml @@ -0,0 +1,23 @@ + + + + + + + sale.order.agreement.form.view + sale.order + + + + + + + + + + + + From 510c6dfa1ca1879227547c815c461a252a82979c Mon Sep 17 00:00:00 2001 From: Maxime Chambreuil Date: Thu, 5 Sep 2019 12:18:45 -0500 Subject: [PATCH 02/14] [FIX] agreement_legal_sale: Github Issue #370 --- agreement_legal_sale/__manifest__.py | 1 - agreement_legal_sale/models/__init__.py | 1 - agreement_legal_sale/models/product.py | 13 ------------ agreement_legal_sale/models/sale_order.py | 3 ++- agreement_legal_sale/views/product.xml | 25 ----------------------- 5 files changed, 2 insertions(+), 41 deletions(-) delete mode 100644 agreement_legal_sale/models/product.py delete mode 100644 agreement_legal_sale/views/product.xml diff --git a/agreement_legal_sale/__manifest__.py b/agreement_legal_sale/__manifest__.py index 7ed16142d..968cc551c 100644 --- a/agreement_legal_sale/__manifest__.py +++ b/agreement_legal_sale/__manifest__.py @@ -15,7 +15,6 @@ ], 'data': [ 'views/agreement.xml', - 'views/product.xml', 'views/sale_order.xml', ], 'installable': True, diff --git a/agreement_legal_sale/models/__init__.py b/agreement_legal_sale/models/__init__.py index 2f3b40d75..fdabc4772 100644 --- a/agreement_legal_sale/models/__init__.py +++ b/agreement_legal_sale/models/__init__.py @@ -3,5 +3,4 @@ from . import ( sale_order, agreement, - product, ) diff --git a/agreement_legal_sale/models/product.py b/agreement_legal_sale/models/product.py deleted file mode 100644 index 59d7c8f04..000000000 --- a/agreement_legal_sale/models/product.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (C) 2019 - TODAY, Open Source Integrators -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -from odoo import fields, models - - -class ProductTemplate(models.Model): - _inherit = 'product.template' - - is_serviceprofile = fields.Boolean( - string="Create a Service Profile", - help="""If True, this product will create a service profile on the - agreement when the sales order is confirmed.""") diff --git a/agreement_legal_sale/models/sale_order.py b/agreement_legal_sale/models/sale_order.py index a6713a614..95cde3dd7 100644 --- a/agreement_legal_sale/models/sale_order.py +++ b/agreement_legal_sale/models/sale_order.py @@ -36,10 +36,11 @@ class SaleOrder(models.Model): 'sale_line_id': line.id, 'uom_id': line.product_uom.id }) - # If the product is a service profile, create one + # If the product creates service profiles, create one if line.product_id.product_tmpl_id.is_serviceprofile: self.env['agreement.serviceprofile'].create({ 'name': line.name, + 'product_id': line.product_id.product_tmpl_id.id, 'agreement_id': order.agreement_id.id, }) return res diff --git a/agreement_legal_sale/views/product.xml b/agreement_legal_sale/views/product.xml deleted file mode 100644 index 54fa92cba..000000000 --- a/agreement_legal_sale/views/product.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - product.template.form.view - product.template - - - - - - - - - - - - - - - - From 66a71323c5556d0f4944aa511dee7fb40fac02c6 Mon Sep 17 00:00:00 2001 From: Maxime Chambreuil Date: Thu, 5 Sep 2019 12:23:14 -0500 Subject: [PATCH 03/14] [FIX] agreement_legal_sale: Github Issue #371 [UPD] Update agreement_legal_sale.pot [UPD] README.rst Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: contract-12.0/contract-12.0-agreement_legal_sale Translate-URL: https://translation.odoo-community.org/projects/contract-12-0/contract-12-0-agreement_legal_sale/ --- agreement_legal_sale/README.rst | 2 +- .../i18n/agreement_legal_sale.pot | 19 ---------- agreement_legal_sale/i18n/de.po | 35 +++++++----------- agreement_legal_sale/i18n/fr.po | 36 ++++++++----------- agreement_legal_sale/i18n/zh_CN.po | 32 +++++++---------- agreement_legal_sale/readme/USAGE.rst | 2 +- .../static/description/index.html | 2 +- 7 files changed, 42 insertions(+), 86 deletions(-) diff --git a/agreement_legal_sale/README.rst b/agreement_legal_sale/README.rst index 3dba3eb24..fadda0cd3 100644 --- a/agreement_legal_sale/README.rst +++ b/agreement_legal_sale/README.rst @@ -59,7 +59,7 @@ To use this module: * the agreement template is copied into an agreement with a copy of the sections, clauses, recitals and appendices * all the sales order lines are added as agreement lines - * the products on the SO with BOM are added as service profile on the agreement + * the service products (with is_serviceprofile = True) on the SO are added as service profile on the agreement * the customer information is set from the sales order * the eventual analytic account linked to the sales order is set on the agreement * the agreement is linked to the sales order and vice versa diff --git a/agreement_legal_sale/i18n/agreement_legal_sale.pot b/agreement_legal_sale/i18n/agreement_legal_sale.pot index 35297dfc6..17ee4edc7 100644 --- a/agreement_legal_sale/i18n/agreement_legal_sale.pot +++ b/agreement_legal_sale/i18n/agreement_legal_sale.pot @@ -15,7 +15,6 @@ msgstr "" #. module: agreement_legal_sale #: model:ir.model,name:agreement_legal_sale.model_agreement -#: model_terms:ir.ui.view,arch_db:agreement_legal_sale.product_template_form_view msgid "Agreement" msgstr "" @@ -34,24 +33,6 @@ msgstr "" msgid "Analytic Account" msgstr "" -#. module: agreement_legal_sale -#: model:ir.model.fields,field_description:agreement_legal_sale.field_product_product__is_serviceprofile -#: model:ir.model.fields,field_description:agreement_legal_sale.field_product_template__is_serviceprofile -msgid "Create a Service Profile" -msgstr "" - -#. module: agreement_legal_sale -#: model:ir.model.fields,help:agreement_legal_sale.field_product_product__is_serviceprofile -#: model:ir.model.fields,help:agreement_legal_sale.field_product_template__is_serviceprofile -msgid "If True, this product will create a service profile on the\n" -" agreement when the sales order is confirmed." -msgstr "" - -#. module: agreement_legal_sale -#: model:ir.model,name:agreement_legal_sale.model_product_template -msgid "Product Template" -msgstr "" - #. module: agreement_legal_sale #: model:ir.model,name:agreement_legal_sale.model_sale_order msgid "Sale Order" diff --git a/agreement_legal_sale/i18n/de.po b/agreement_legal_sale/i18n/de.po index 9029209af..1e9417c88 100644 --- a/agreement_legal_sale/i18n/de.po +++ b/agreement_legal_sale/i18n/de.po @@ -18,7 +18,6 @@ msgstr "" #. module: agreement_legal_sale #: model:ir.model,name:agreement_legal_sale.model_agreement -#: model_terms:ir.ui.view,arch_db:agreement_legal_sale.product_template_form_view msgid "Agreement" msgstr "Vereinbarung" @@ -37,27 +36,6 @@ msgstr "Vereinbarungsvorlage" msgid "Analytic Account" msgstr "Kostenstelle" -#. module: agreement_legal_sale -#: model:ir.model.fields,field_description:agreement_legal_sale.field_product_product__is_serviceprofile -#: model:ir.model.fields,field_description:agreement_legal_sale.field_product_template__is_serviceprofile -msgid "Create a Service Profile" -msgstr "Dienstleistungsprofil erstellen" - -#. module: agreement_legal_sale -#: model:ir.model.fields,help:agreement_legal_sale.field_product_product__is_serviceprofile -#: model:ir.model.fields,help:agreement_legal_sale.field_product_template__is_serviceprofile -msgid "" -"If True, this product will create a service profile on the\n" -" agreement when the sales order is confirmed." -msgstr "" -"Wenn der Haken gesetzt ist, wird dieses Produkt ein Dienstleistungsprofil in " -"der Vereinbarung erzeugen, sobald der Verkaufsauftrag bestätigt wird." - -#. module: agreement_legal_sale -#: model:ir.model,name:agreement_legal_sale.model_product_template -msgid "Product Template" -msgstr "Produktvorlage" - #. module: agreement_legal_sale #: model:ir.model,name:agreement_legal_sale.model_sale_order msgid "Sale Order" @@ -78,6 +56,19 @@ msgstr "Verkaufsauftrag" msgid "Sales Order Line" msgstr "Auftragszeile" +#~ msgid "Create a Service Profile" +#~ msgstr "Dienstleistungsprofil erstellen" + +#~ msgid "" +#~ "If True, this product will create a service profile on the\n" +#~ " agreement when the sales order is confirmed." +#~ msgstr "" +#~ "Wenn der Haken gesetzt ist, wird dieses Produkt ein Dienstleistungsprofil " +#~ "in der Vereinbarung erzeugen, sobald der Verkaufsauftrag bestätigt wird." + +#~ msgid "Product Template" +#~ msgstr "Produktvorlage" + #~ msgid "Quotation" #~ msgstr "Angebot" diff --git a/agreement_legal_sale/i18n/fr.po b/agreement_legal_sale/i18n/fr.po index 315c9269e..aee504b09 100644 --- a/agreement_legal_sale/i18n/fr.po +++ b/agreement_legal_sale/i18n/fr.po @@ -1,6 +1,6 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * agreement_legal_sale +# * agreement_legal_sale # msgid "" msgstr "" @@ -18,7 +18,6 @@ msgstr "" #. module: agreement_legal_sale #: model:ir.model,name:agreement_legal_sale.model_agreement -#: model_terms:ir.ui.view,arch_db:agreement_legal_sale.product_template_form_view msgid "Agreement" msgstr "Accord" @@ -37,26 +36,6 @@ msgstr "Modèle d'accord" msgid "Analytic Account" msgstr "Compte Analytique" -#. module: agreement_legal_sale -#: model:ir.model.fields,field_description:agreement_legal_sale.field_product_product__is_serviceprofile -#: model:ir.model.fields,field_description:agreement_legal_sale.field_product_template__is_serviceprofile -msgid "Create a Service Profile" -msgstr "Créer un profil de service" - -#. module: agreement_legal_sale -#: model:ir.model.fields,help:agreement_legal_sale.field_product_product__is_serviceprofile -#: model:ir.model.fields,help:agreement_legal_sale.field_product_template__is_serviceprofile -msgid "If True, this product will create a service profile on the\n" -" agreement when the sales order is confirmed." -msgstr "" -"Si Vrai, ce produit créera un profil de service dans\n" -"          l'accord a la confirmation de la commande client." - -#. module: agreement_legal_sale -#: model:ir.model,name:agreement_legal_sale.model_product_template -msgid "Product Template" -msgstr "Modèle Produit" - #. module: agreement_legal_sale #: model:ir.model,name:agreement_legal_sale.model_sale_order msgid "Sale Order" @@ -76,3 +55,16 @@ msgstr "Commandes" #: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement_line__sale_line_id msgid "Sales Order Line" msgstr "Ligne de commande" + +#~ msgid "Create a Service Profile" +#~ msgstr "Créer un profil de service" + +#~ msgid "" +#~ "If True, this product will create a service profile on the\n" +#~ " agreement when the sales order is confirmed." +#~ msgstr "" +#~ "Si Vrai, ce produit créera un profil de service dans\n" +#~ "          l'accord a la confirmation de la commande client." + +#~ msgid "Product Template" +#~ msgstr "Modèle Produit" diff --git a/agreement_legal_sale/i18n/zh_CN.po b/agreement_legal_sale/i18n/zh_CN.po index 759cc621a..f5a0b1dd4 100644 --- a/agreement_legal_sale/i18n/zh_CN.po +++ b/agreement_legal_sale/i18n/zh_CN.po @@ -1,6 +1,6 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * agreement_legal_sale +# * agreement_legal_sale # msgid "" msgstr "" @@ -18,7 +18,6 @@ msgstr "" #. module: agreement_legal_sale #: model:ir.model,name:agreement_legal_sale.model_agreement -#: model_terms:ir.ui.view,arch_db:agreement_legal_sale.product_template_form_view msgid "Agreement" msgstr "协议" @@ -37,24 +36,6 @@ msgstr "协议模板" msgid "Analytic Account" msgstr "分析账户" -#. module: agreement_legal_sale -#: model:ir.model.fields,field_description:agreement_legal_sale.field_product_product__is_serviceprofile -#: model:ir.model.fields,field_description:agreement_legal_sale.field_product_template__is_serviceprofile -msgid "Create a Service Profile" -msgstr "创建服务配置文件" - -#. module: agreement_legal_sale -#: model:ir.model.fields,help:agreement_legal_sale.field_product_product__is_serviceprofile -#: model:ir.model.fields,help:agreement_legal_sale.field_product_template__is_serviceprofile -msgid "If True, this product will create a service profile on the\n" -" agreement when the sales order is confirmed." -msgstr "如果为真,则当确认销售订单时,此产品将在协议上创建服务配置文件。" - -#. module: agreement_legal_sale -#: model:ir.model,name:agreement_legal_sale.model_product_template -msgid "Product Template" -msgstr "产品模版" - #. module: agreement_legal_sale #: model:ir.model,name:agreement_legal_sale.model_sale_order msgid "Sale Order" @@ -74,3 +55,14 @@ msgstr "销售订单" #: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement_line__sale_line_id msgid "Sales Order Line" msgstr "销售订单行" + +#~ msgid "Create a Service Profile" +#~ msgstr "创建服务配置文件" + +#~ msgid "" +#~ "If True, this product will create a service profile on the\n" +#~ " agreement when the sales order is confirmed." +#~ msgstr "如果为真,则当确认销售订单时,此产品将在协议上创建服务配置文件。" + +#~ msgid "Product Template" +#~ msgstr "产品模版" diff --git a/agreement_legal_sale/readme/USAGE.rst b/agreement_legal_sale/readme/USAGE.rst index 259af0b9f..990ad674c 100644 --- a/agreement_legal_sale/readme/USAGE.rst +++ b/agreement_legal_sale/readme/USAGE.rst @@ -8,7 +8,7 @@ To use this module: * the agreement template is copied into an agreement with a copy of the sections, clauses, recitals and appendices * all the sales order lines are added as agreement lines - * the products on the SO with BOM are added as service profile on the agreement + * the service products (with is_serviceprofile = True) on the SO are added as service profile on the agreement * the customer information is set from the sales order * the eventual analytic account linked to the sales order is set on the agreement * the agreement is linked to the sales order and vice versa diff --git a/agreement_legal_sale/static/description/index.html b/agreement_legal_sale/static/description/index.html index 76b36b27b..1aa0ee8a5 100644 --- a/agreement_legal_sale/static/description/index.html +++ b/agreement_legal_sale/static/description/index.html @@ -409,7 +409,7 @@ with all the legal information based on the selected agreement template.

  • the agreement template is copied into an agreement with a copy of the sections, clauses, recitals and appendices
  • all the sales order lines are added as agreement lines
  • -
  • the products on the SO with BOM are added as service profile on the agreement
  • +
  • the service products (with is_serviceprofile = True) on the SO are added as service profile on the agreement
  • the customer information is set from the sales order
  • the eventual analytic account linked to the sales order is set on the agreement
  • the agreement is linked to the sales order and vice versa
  • From 2c370b6208dfff9547eb2298d6e193a472e50cfd Mon Sep 17 00:00:00 2001 From: Alexandre Fayolle Date: Fri, 27 Sep 2019 09:41:19 +0200 Subject: [PATCH 04/14] [IMP] move some notions from agreement_legal to agreement we move the is_template field definition and the agreement.type model from the agreement_legal module to the agreement module. The fields are not displayed by default, unless the feature is enabled through a technical feature group, this is configurable in the agreement_sale module (because agreement in itself has no UI, and agreement_legal enables the feature by default) --- agreement_legal_sale/views/sale_order.xml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/agreement_legal_sale/views/sale_order.xml b/agreement_legal_sale/views/sale_order.xml index 8b607a891..8a077c3db 100644 --- a/agreement_legal_sale/views/sale_order.xml +++ b/agreement_legal_sale/views/sale_order.xml @@ -7,12 +7,11 @@ sale.order.agreement.form.view sale.order - + - - + + + {'invisible': [('agreement_id', '=', False)]} From fcba25441c5ca03c92f9a1ee9677bd31fde2a2da Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Tue, 17 Dec 2019 13:30:51 +0000 Subject: [PATCH 05/14] [FIX] Ensure Analytic Account is copied from SO to Agreement --- agreement_legal_sale/models/agreement.py | 3 ++- agreement_legal_sale/models/sale_order.py | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/agreement_legal_sale/models/agreement.py b/agreement_legal_sale/models/agreement.py index 6e064886d..47ba502eb 100644 --- a/agreement_legal_sale/models/agreement.py +++ b/agreement_legal_sale/models/agreement.py @@ -9,7 +9,8 @@ class Agreement(models.Model): sale_id = fields.Many2one('sale.order', string='Sales Order') analytic_account_id = fields.Many2one( - 'account.analytic.account', 'Analytic Account', readonly=True, + 'account.analytic.account', + 'Analytic Account', copy=False) diff --git a/agreement_legal_sale/models/sale_order.py b/agreement_legal_sale/models/sale_order.py index 95cde3dd7..53967e2f9 100644 --- a/agreement_legal_sale/models/sale_order.py +++ b/agreement_legal_sale/models/sale_order.py @@ -44,3 +44,18 @@ class SaleOrder(models.Model): 'agreement_id': order.agreement_id.id, }) return res + + def action_confirm(self): + # If sale_timesheet is installed, the _action_confirm() + # may be setting an Analytic Account on the SO. + # But since it is not a dependency, that can happen after + # we create the Agreement. + # To work around that, we check if that is the case, + # and make sure the SO Analytic Account is copied to the Agreement. + res = super(SaleOrder, self).action_confirm() + for order in self: + agreement = order.agreement_id + if (order.analytic_account_id and agreement and + not agreement.analytic_account_id): + agreement.analytic_account_id = order.analytic_account_id + return res From 49d4ff21444486e942f72cb717d37d65f8b9bd7d Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 26 Dec 2019 18:05:54 +0000 Subject: [PATCH 06/14] agreement_legal_sale 12.0.1.1.0 Added translation using Weblate (Portuguese (Brazil)) Added translation using Weblate (Spanish) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (8 of 8 strings) Translation: contract-12.0/contract-12.0-agreement_legal_sale Translate-URL: https://translation.odoo-community.org/projects/contract-12-0/contract-12-0-agreement_legal_sale/pt_BR/ --- agreement_legal_sale/__manifest__.py | 2 +- agreement_legal_sale/i18n/es.po | 55 +++++++++++++++++++++++++++ agreement_legal_sale/i18n/pt_BR.po | 57 ++++++++++++++++++++++++++++ 3 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 agreement_legal_sale/i18n/es.po create mode 100644 agreement_legal_sale/i18n/pt_BR.po diff --git a/agreement_legal_sale/__manifest__.py b/agreement_legal_sale/__manifest__.py index 968cc551c..ac1bc5e19 100644 --- a/agreement_legal_sale/__manifest__.py +++ b/agreement_legal_sale/__manifest__.py @@ -4,7 +4,7 @@ { 'name': 'Agreement Legal Sale', 'summary': 'Create an agreement when the sale order is confirmed', - 'version': '12.0.1.0.0', + 'version': '12.0.1.1.0', 'license': 'AGPL-3', 'author': 'Open Source Integrators, Odoo Community Association (OCA)', 'category': 'Agreement', diff --git a/agreement_legal_sale/i18n/es.po b/agreement_legal_sale/i18n/es.po new file mode 100644 index 000000000..eb974df96 --- /dev/null +++ b/agreement_legal_sale/i18n/es.po @@ -0,0 +1,55 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * agreement_legal_sale +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#. module: agreement_legal_sale +#: model:ir.model,name:agreement_legal_sale.model_agreement +msgid "Agreement" +msgstr "" + +#. module: agreement_legal_sale +#: model:ir.model,name:agreement_legal_sale.model_agreement_line +msgid "Agreement Lines" +msgstr "" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_sale_order__agreement_template_id +msgid "Agreement Template" +msgstr "" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement__analytic_account_id +msgid "Analytic Account" +msgstr "" + +#. module: agreement_legal_sale +#: model:ir.model,name:agreement_legal_sale.model_sale_order +msgid "Sale Order" +msgstr "" + +#. module: agreement_legal_sale +#: model_terms:ir.ui.view,arch_db:agreement_legal_sale.agreement_sale_form_view +msgid "Sales" +msgstr "" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement__sale_id +msgid "Sales Order" +msgstr "" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement_line__sale_line_id +msgid "Sales Order Line" +msgstr "" diff --git a/agreement_legal_sale/i18n/pt_BR.po b/agreement_legal_sale/i18n/pt_BR.po new file mode 100644 index 000000000..28a4165f5 --- /dev/null +++ b/agreement_legal_sale/i18n/pt_BR.po @@ -0,0 +1,57 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * agreement_legal_sale +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-02-12 05:03+0000\n" +"Last-Translator: Marcel Savegnago \n" +"Language-Team: none\n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 3.10\n" + +#. module: agreement_legal_sale +#: model:ir.model,name:agreement_legal_sale.model_agreement +msgid "Agreement" +msgstr "Acordo" + +#. module: agreement_legal_sale +#: model:ir.model,name:agreement_legal_sale.model_agreement_line +msgid "Agreement Lines" +msgstr "Linhas do Acordo" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_sale_order__agreement_template_id +msgid "Agreement Template" +msgstr "Modelo de Acordo" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement__analytic_account_id +msgid "Analytic Account" +msgstr "Conta Analítica" + +#. module: agreement_legal_sale +#: model:ir.model,name:agreement_legal_sale.model_sale_order +msgid "Sale Order" +msgstr "Ordem de Venda" + +#. module: agreement_legal_sale +#: model_terms:ir.ui.view,arch_db:agreement_legal_sale.agreement_sale_form_view +msgid "Sales" +msgstr "Vendas" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement__sale_id +msgid "Sales Order" +msgstr "Ordenss de Venda" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement_line__sale_line_id +msgid "Sales Order Line" +msgstr "Linha de Ordens de Venda" From d1c213ffaad774560463b9d39ae202f00f8e26ed Mon Sep 17 00:00:00 2001 From: Marcel Savegnago Date: Sat, 15 Feb 2020 02:20:16 -0300 Subject: [PATCH 07/14] [IMP] New icon for agreement modules (svg file in agreement_legal) Added translation using Weblate (Portuguese) Translated using Weblate (Portuguese) Currently translated at 100.0% (8 of 8 strings) Translation: contract-12.0/contract-12.0-agreement_legal_sale Translate-URL: https://translation.odoo-community.org/projects/contract-12-0/contract-12-0-agreement_legal_sale/pt/ --- agreement_legal_sale/i18n/pt.po | 57 ++++++++++++++++++ .../static/description/icon.png | Bin 6755 -> 10512 bytes 2 files changed, 57 insertions(+) create mode 100644 agreement_legal_sale/i18n/pt.po diff --git a/agreement_legal_sale/i18n/pt.po b/agreement_legal_sale/i18n/pt.po new file mode 100644 index 000000000..117eb5be6 --- /dev/null +++ b/agreement_legal_sale/i18n/pt.po @@ -0,0 +1,57 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * agreement_legal_sale +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-02-17 19:13+0000\n" +"Last-Translator: Pedro Castro Silva \n" +"Language-Team: none\n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 3.10\n" + +#. module: agreement_legal_sale +#: model:ir.model,name:agreement_legal_sale.model_agreement +msgid "Agreement" +msgstr "Acordo" + +#. module: agreement_legal_sale +#: model:ir.model,name:agreement_legal_sale.model_agreement_line +msgid "Agreement Lines" +msgstr "Linhas de Acordo" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_sale_order__agreement_template_id +msgid "Agreement Template" +msgstr "Modelo de Acordo" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement__analytic_account_id +msgid "Analytic Account" +msgstr "Conta Analítica" + +#. module: agreement_legal_sale +#: model:ir.model,name:agreement_legal_sale.model_sale_order +msgid "Sale Order" +msgstr "Encomenda de Venda" + +#. module: agreement_legal_sale +#: model_terms:ir.ui.view,arch_db:agreement_legal_sale.agreement_sale_form_view +msgid "Sales" +msgstr "Vendas" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement__sale_id +msgid "Sales Order" +msgstr "Encomenda de Venda" + +#. module: agreement_legal_sale +#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement_line__sale_line_id +msgid "Sales Order Line" +msgstr "Linha de Encomenda de Venda" diff --git a/agreement_legal_sale/static/description/icon.png b/agreement_legal_sale/static/description/icon.png index 23ce93135053c48a74469807879f2805b12382ad..a99cce6beeef7462f9eaf1873754490ef6632b3e 100644 GIT binary patch literal 10512 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 Date: Thu, 20 Feb 2020 17:26:51 +0000 Subject: [PATCH 08/14] agreement_legal_sale 12.0.1.1.1 [UPD] README.rst [UPD] README.rst --- agreement_legal_sale/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agreement_legal_sale/__manifest__.py b/agreement_legal_sale/__manifest__.py index ac1bc5e19..665dc8736 100644 --- a/agreement_legal_sale/__manifest__.py +++ b/agreement_legal_sale/__manifest__.py @@ -4,7 +4,7 @@ { 'name': 'Agreement Legal Sale', 'summary': 'Create an agreement when the sale order is confirmed', - 'version': '12.0.1.1.0', + 'version': '12.0.1.1.1', 'license': 'AGPL-3', 'author': 'Open Source Integrators, Odoo Community Association (OCA)', 'category': 'Agreement', From 01a816bcfe173c6ed783342f46dc15e1a8d3b36f Mon Sep 17 00:00:00 2001 From: scampbell Date: Fri, 3 Apr 2020 13:00:51 -0700 Subject: [PATCH 09/14] [IMP] Allow Multiple SP's From SO Line [IMP] Simplify [IMP] Product ID [IMP] Indents Indent Update agreement_legal_sale/models/sale_order.py Co-Authored-By: Daniel Reis Update agreement_legal_sale/models/sale_order.py Co-Authored-By: Daniel Reis [IMP] Daniel Changes --- agreement_legal_sale/__manifest__.py | 1 + agreement_legal_sale/models/sale_order.py | 63 ++++++++++++++--------- 2 files changed, 40 insertions(+), 24 deletions(-) diff --git a/agreement_legal_sale/__manifest__.py b/agreement_legal_sale/__manifest__.py index 665dc8736..85ebdd60d 100644 --- a/agreement_legal_sale/__manifest__.py +++ b/agreement_legal_sale/__manifest__.py @@ -12,6 +12,7 @@ 'depends': [ 'agreement_legal', 'agreement_sale', + 'agreement_serviceprofile' ], 'data': [ 'views/agreement.xml', diff --git a/agreement_legal_sale/models/sale_order.py b/agreement_legal_sale/models/sale_order.py index 53967e2f9..635f3aaed 100644 --- a/agreement_legal_sale/models/sale_order.py +++ b/agreement_legal_sale/models/sale_order.py @@ -17,34 +17,49 @@ class SaleOrder(models.Model): res = super(SaleOrder, self)._action_confirm() for order in self: if order.agreement_template_id: - order.agreement_id = order.agreement_template_id.copy(default={ - 'name': order.name, - 'code': order.name, - 'is_template': False, - 'sale_id': order.id, - 'partner_id': order.partner_id.id, - 'analytic_account_id': order.analytic_account_id and - order.analytic_account_id.id or False, - }) + order.agreement_id = order.\ + agreement_template_id.copy(default={ + 'name': order.name, + 'code': order.name, + 'is_template': False, + 'sale_id': order.id, + 'partner_id': order.partner_id.id, + 'analytic_account_id': order.analytic_account_id and + order.analytic_account_id.id or False, + }) for line in order.order_line: # Create agreement line - self.env['agreement.line'].create({ - 'product_id': line.product_id.id, - 'name': line.name, - 'agreement_id': order.agreement_id.id, - 'qty': line.product_uom_qty, - 'sale_line_id': line.id, - 'uom_id': line.product_uom.id - }) - # If the product creates service profiles, create one - if line.product_id.product_tmpl_id.is_serviceprofile: - self.env['agreement.serviceprofile'].create({ - 'name': line.name, - 'product_id': line.product_id.product_tmpl_id.id, - 'agreement_id': order.agreement_id.id, - }) + self.env['agreement.line'].\ + create(self._get_agreement_line_vals(line)) + # Create SP's based on product_id config + if line.product_id.is_serviceprofile: + self.create_sp_qty(line, order) return res + def create_sp_qty(self, line, order): + """ Create line.product_uom_qty SP's """ + if line.product_id.product_tmpl_id.is_serviceprofile: + for i in range(1, int(line.product_uom_qty)+1): + sp = self.env['agreement.serviceprofile'].\ + create(self._get_sp_vals(line, order, i)) + + def _get_agreement_line_vals(self, line): + return { + 'product_id': line.product_id.id, + 'name': line.name, + 'agreement_id': line.order_id.agreement_id.id, + 'qty': line.product_uom_qty, + 'sale_line_id': line.id, + 'uom_id': line.product_uom.id + } + + def _get_sp_vals(self, line, order, i): + return { + 'name': line.name + ' ' + str(i), + 'product_id': line.product_id.product_tmpl_id.id, + 'agreement_id': order.agreement_id.id, + } + def action_confirm(self): # If sale_timesheet is installed, the _action_confirm() # may be setting an Analytic Account on the SO. From 8208fe9406392aade5680e35c19f799232311965 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Thu, 9 Apr 2020 18:05:00 +0100 Subject: [PATCH 10/14] [REF] Fix lint (unused variable) --- agreement_legal_sale/models/sale_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agreement_legal_sale/models/sale_order.py b/agreement_legal_sale/models/sale_order.py index 635f3aaed..76c48eec0 100644 --- a/agreement_legal_sale/models/sale_order.py +++ b/agreement_legal_sale/models/sale_order.py @@ -40,7 +40,7 @@ class SaleOrder(models.Model): """ Create line.product_uom_qty SP's """ if line.product_id.product_tmpl_id.is_serviceprofile: for i in range(1, int(line.product_uom_qty)+1): - sp = self.env['agreement.serviceprofile'].\ + self.env['agreement.serviceprofile'].\ create(self._get_sp_vals(line, order, i)) def _get_agreement_line_vals(self, line): From 1b18d132a30e0bf73e8df3512f28d2af419f3aa4 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 9 Apr 2020 18:50:56 +0000 Subject: [PATCH 11/14] agreement_legal_sale 12.0.2.0.0 Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (8 of 8 strings) Translation: contract-12.0/contract-12.0-agreement_legal_sale Translate-URL: https://translation.odoo-community.org/projects/contract-12-0/contract-12-0-agreement_legal_sale/pt_BR/ Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (8 of 8 strings) Translation: contract-12.0/contract-12.0-agreement_legal_sale Translate-URL: https://translation.odoo-community.org/projects/contract-12-0/contract-12-0-agreement_legal_sale/pt_BR/ Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (8 of 8 strings) Translation: contract-12.0/contract-12.0-agreement_legal_sale Translate-URL: https://translation.odoo-community.org/projects/contract-12-0/contract-12-0-agreement_legal_sale/pt_BR/ Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (8 of 8 strings) Translation: contract-12.0/contract-12.0-agreement_legal_sale Translate-URL: https://translation.odoo-community.org/projects/contract-12-0/contract-12-0-agreement_legal_sale/pt_BR/ --- agreement_legal_sale/__manifest__.py | 2 +- agreement_legal_sale/i18n/pt_BR.po | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/agreement_legal_sale/__manifest__.py b/agreement_legal_sale/__manifest__.py index 85ebdd60d..eb40ee121 100644 --- a/agreement_legal_sale/__manifest__.py +++ b/agreement_legal_sale/__manifest__.py @@ -4,7 +4,7 @@ { 'name': 'Agreement Legal Sale', 'summary': 'Create an agreement when the sale order is confirmed', - 'version': '12.0.1.1.1', + 'version': '12.0.2.0.0', 'license': 'AGPL-3', 'author': 'Open Source Integrators, Odoo Community Association (OCA)', 'category': 'Agreement', diff --git a/agreement_legal_sale/i18n/pt_BR.po b/agreement_legal_sale/i18n/pt_BR.po index 28a4165f5..67ab1e597 100644 --- a/agreement_legal_sale/i18n/pt_BR.po +++ b/agreement_legal_sale/i18n/pt_BR.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2020-02-12 05:03+0000\n" -"Last-Translator: Marcel Savegnago \n" +"PO-Revision-Date: 2020-11-06 08:08+0000\n" +"Last-Translator: Eder Brito \n" "Language-Team: none\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" @@ -24,7 +24,7 @@ msgstr "Acordo" #. module: agreement_legal_sale #: model:ir.model,name:agreement_legal_sale.model_agreement_line msgid "Agreement Lines" -msgstr "Linhas do Acordo" +msgstr "Linhas de Acordo" #. module: agreement_legal_sale #: model:ir.model.fields,field_description:agreement_legal_sale.field_sale_order__agreement_template_id @@ -39,7 +39,7 @@ msgstr "Conta Analítica" #. module: agreement_legal_sale #: model:ir.model,name:agreement_legal_sale.model_sale_order msgid "Sale Order" -msgstr "Ordem de Venda" +msgstr "Pedido de Venda" #. module: agreement_legal_sale #: model_terms:ir.ui.view,arch_db:agreement_legal_sale.agreement_sale_form_view @@ -49,9 +49,9 @@ msgstr "Vendas" #. module: agreement_legal_sale #: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement__sale_id msgid "Sales Order" -msgstr "Ordenss de Venda" +msgstr "Pedido de Vendas" #. module: agreement_legal_sale #: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement_line__sale_line_id msgid "Sales Order Line" -msgstr "Linha de Ordens de Venda" +msgstr "Linha do Pedido de Venda" From 3c56a7777ca0d1d2cbe55990ebc3366793af6559 Mon Sep 17 00:00:00 2001 From: Patrick Wilson <36892066+patrickrwilson@users.noreply.github.com> Date: Mon, 10 May 2021 15:45:18 -0600 Subject: [PATCH 12/14] [14.0][MIG] agreement_legal_sale (Version 12.0 to 14.0) [MIG] Prettier [MIG] Tests Pre-Commit --- agreement_legal_sale/README.rst | 8 +-- agreement_legal_sale/__manifest__.py | 36 +++++----- agreement_legal_sale/models/agreement.py | 12 ++-- agreement_legal_sale/models/sale_order.py | 71 ++++++++++--------- .../static/description/index.html | 6 +- agreement_legal_sale/tests/__init__.py | 1 + agreement_legal_sale/tests/test_sale_order.py | 52 ++++++++++++++ agreement_legal_sale/views/agreement.xml | 20 +++--- agreement_legal_sale/views/sale_order.xml | 15 ++-- 9 files changed, 138 insertions(+), 83 deletions(-) create mode 100644 agreement_legal_sale/tests/__init__.py create mode 100644 agreement_legal_sale/tests/test_sale_order.py diff --git a/agreement_legal_sale/README.rst b/agreement_legal_sale/README.rst index fadda0cd3..702c1e024 100644 --- a/agreement_legal_sale/README.rst +++ b/agreement_legal_sale/README.rst @@ -14,13 +14,13 @@ Agreement Legal Sale :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fcontract-lightgray.png?logo=github - :target: https://github.com/OCA/contract/tree/12.0/agreement_legal_sale + :target: https://github.com/OCA/contract/tree/14.0/agreement_legal_sale :alt: OCA/contract .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png :target: https://translation.odoo-community.org/projects/contract-12-0/contract-12-0-agreement_legal_sale :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/110/12.0 + :target: https://runbot.odoo-community.org/runbot/110/14.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -75,7 +75,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -126,6 +126,6 @@ Current `maintainers `__: |maintainer-osi-scampbell| |maintainer-max3903| -This module is part of the `OCA/contract `_ project on GitHub. +This module is part of the `OCA/contract `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/agreement_legal_sale/__manifest__.py b/agreement_legal_sale/__manifest__.py index eb40ee121..0f00767d0 100644 --- a/agreement_legal_sale/__manifest__.py +++ b/agreement_legal_sale/__manifest__.py @@ -2,26 +2,22 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). { - 'name': 'Agreement Legal Sale', - 'summary': 'Create an agreement when the sale order is confirmed', - 'version': '12.0.2.0.0', - 'license': 'AGPL-3', - 'author': 'Open Source Integrators, Odoo Community Association (OCA)', - 'category': 'Agreement', - 'website': 'https://github.com/OCA/contract', - 'depends': [ - 'agreement_legal', - 'agreement_sale', - 'agreement_serviceprofile' + "name": "Agreement Legal Sale", + "summary": "Create an agreement when the sale order is confirmed", + "version": "14.0.1.0.0", + "license": "AGPL-3", + "author": "Open Source Integrators, Odoo Community Association (OCA)", + "category": "Agreement", + "website": "https://github.com/OCA/contract", + "depends": ["agreement_legal", "agreement_sale", "agreement_serviceprofile"], + "data": [ + "views/agreement.xml", + "views/sale_order.xml", ], - 'data': [ - 'views/agreement.xml', - 'views/sale_order.xml', - ], - 'installable': True, - 'development_status': 'Beta', - 'maintainers': [ - 'osi-scampbell', - 'max3903', + "installable": True, + "development_status": "Beta", + "maintainers": [ + "osi-scampbell", + "max3903", ], } diff --git a/agreement_legal_sale/models/agreement.py b/agreement_legal_sale/models/agreement.py index 47ba502eb..456c03d12 100644 --- a/agreement_legal_sale/models/agreement.py +++ b/agreement_legal_sale/models/agreement.py @@ -5,17 +5,15 @@ from odoo import fields, models class Agreement(models.Model): - _inherit = 'agreement' + _inherit = "agreement" - sale_id = fields.Many2one('sale.order', string='Sales Order') + sale_id = fields.Many2one("sale.order", string="Sales Order") analytic_account_id = fields.Many2one( - 'account.analytic.account', - 'Analytic Account', - copy=False) + "account.analytic.account", "Analytic Account", copy=False + ) class AgreementLine(models.Model): _inherit = "agreement.line" - sale_line_id = fields.Many2one('sale.order.line', - string='Sales Order Line') + sale_line_id = fields.Many2one("sale.order.line", string="Sales Order Line") diff --git a/agreement_legal_sale/models/sale_order.py b/agreement_legal_sale/models/sale_order.py index 76c48eec0..8a3e308bd 100644 --- a/agreement_legal_sale/models/sale_order.py +++ b/agreement_legal_sale/models/sale_order.py @@ -1,63 +1,65 @@ # Copyright (C) 2019 - TODAY, Open Source Integrators # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import api, fields, models +from odoo import fields, models class SaleOrder(models.Model): - _inherit = 'sale.order' + _inherit = "sale.order" agreement_template_id = fields.Many2one( - 'agreement', - string="Agreement Template", - domain="[('is_template', '=', True)]") + "agreement", string="Agreement Template", domain="[('is_template', '=', True)]" + ) - @api.multi def _action_confirm(self): res = super(SaleOrder, self)._action_confirm() for order in self: if order.agreement_template_id: - order.agreement_id = order.\ - agreement_template_id.copy(default={ - 'name': order.name, - 'code': order.name, - 'is_template': False, - 'sale_id': order.id, - 'partner_id': order.partner_id.id, - 'analytic_account_id': order.analytic_account_id and - order.analytic_account_id.id or False, - }) + order.agreement_id = order.agreement_template_id.copy( + default={ + "name": order.name, + "code": order.name, + "is_template": False, + "sale_id": order.id, + "partner_id": order.partner_id.id, + "analytic_account_id": order.analytic_account_id + and order.analytic_account_id.id + or False, + } + ) for line in order.order_line: # Create agreement line - self.env['agreement.line'].\ - create(self._get_agreement_line_vals(line)) + self.env["agreement.line"].create( + self._get_agreement_line_vals(line) + ) # Create SP's based on product_id config if line.product_id.is_serviceprofile: self.create_sp_qty(line, order) return res def create_sp_qty(self, line, order): - """ Create line.product_uom_qty SP's """ + """Create line.product_uom_qty SP's""" if line.product_id.product_tmpl_id.is_serviceprofile: - for i in range(1, int(line.product_uom_qty)+1): - self.env['agreement.serviceprofile'].\ - create(self._get_sp_vals(line, order, i)) + for i in range(1, int(line.product_uom_qty) + 1): + self.env["agreement.serviceprofile"].create( + self._get_sp_vals(line, order, i) + ) def _get_agreement_line_vals(self, line): return { - 'product_id': line.product_id.id, - 'name': line.name, - 'agreement_id': line.order_id.agreement_id.id, - 'qty': line.product_uom_qty, - 'sale_line_id': line.id, - 'uom_id': line.product_uom.id + "product_id": line.product_id.id, + "name": line.name, + "agreement_id": line.order_id.agreement_id.id, + "qty": line.product_uom_qty, + "sale_line_id": line.id, + "uom_id": line.product_uom.id, } def _get_sp_vals(self, line, order, i): return { - 'name': line.name + ' ' + str(i), - 'product_id': line.product_id.product_tmpl_id.id, - 'agreement_id': order.agreement_id.id, + "name": line.name + " " + str(i), + "product_id": line.product_id.product_tmpl_id.id, + "agreement_id": order.agreement_id.id, } def action_confirm(self): @@ -70,7 +72,10 @@ class SaleOrder(models.Model): res = super(SaleOrder, self).action_confirm() for order in self: agreement = order.agreement_id - if (order.analytic_account_id and agreement and - not agreement.analytic_account_id): + if ( + order.analytic_account_id + and agreement + and not agreement.analytic_account_id + ): agreement.analytic_account_id = order.analytic_account_id return res diff --git a/agreement_legal_sale/static/description/index.html b/agreement_legal_sale/static/description/index.html index 1aa0ee8a5..e47063650 100644 --- a/agreement_legal_sale/static/description/index.html +++ b/agreement_legal_sale/static/description/index.html @@ -367,7 +367,7 @@ ul.auto-toc { !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

    Beta License: AGPL-3 OCA/contract Translate me on Weblate Try me on Runbot

    +

    Beta License: AGPL-3 OCA/contract Translate me on Weblate Try me on Runbot

    Odoo Sales App does not support the management of legal content for agreements and contracts. It’s also not integrated with the Agreement App.

    This module is for companies that needs their customer to sign an agreement @@ -426,7 +426,7 @@ sections, clauses, recitals and appendices

    Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -feedback.

    +feedback.

    Do not contact contributors directly about support or help with technical issues.

    @@ -462,7 +462,7 @@ mission is to support the collaborative development of Odoo features and promote its widespread use.

    Current maintainers:

    osi-scampbell max3903

    -

    This module is part of the OCA/contract project on GitHub.

    +

    This module is part of the OCA/contract project on GitHub.

    You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

    diff --git a/agreement_legal_sale/tests/__init__.py b/agreement_legal_sale/tests/__init__.py new file mode 100644 index 000000000..6f699d0d8 --- /dev/null +++ b/agreement_legal_sale/tests/__init__.py @@ -0,0 +1 @@ +from . import test_sale_order diff --git a/agreement_legal_sale/tests/test_sale_order.py b/agreement_legal_sale/tests/test_sale_order.py new file mode 100644 index 000000000..0727c12c4 --- /dev/null +++ b/agreement_legal_sale/tests/test_sale_order.py @@ -0,0 +1,52 @@ +# Copyright 2021 Ecosoft Co., Ltd (http://ecosoft.co.th) +# Copyright 2021 Sergio Teruel - Tecnativa +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) + +from datetime import timedelta + +from odoo import fields +from odoo.tests.common import TransactionCase + + +class TestSaleOrder(TransactionCase): + def setUp(self): + super().setUp() + self.test_customer = self.env["res.partner"].create({"name": "TestCustomer"}) + self.agreement_type = self.env["agreement.type"].create( + { + "name": "Test Agreement Type", + "domain": "sale", + } + ) + self.test_agreement_template = self.env["agreement"].create( + { + "name": "TestAgreementTemplate", + "description": "Test Template", + "special_terms": "Test Template", + "is_template": True, + "partner_id": self.test_customer.id, + "start_date": fields.Date.today(), + "end_date": fields.Date.today() + timedelta(days=365), + } + ) + self.test_product = self.env["product.product"].create({"name": "TestProduct"}) + self.test_sale_order = self.env["sale.order"].create( + { + "partner_id": self.test_customer.id, + "agreement_template_id": self.test_agreement_template.id, + "date_order": fields.Date.today(), + "order_line": [ + (0, 0, {"product_id": self.test_product.id, "product_uom_qty": 1.0}) + ], + } + ) + + # TEST 01: Test _action_confirm method + def test_action_confirm(self): + sale_order = self.test_sale_order + sale_order._action_confirm() + agreement = self.env["agreement"].search([("sale_id", "=", sale_order.id)]) + self.assertEqual( + agreement.sale_id.id, + sale_order.id, + ) diff --git a/agreement_legal_sale/views/agreement.xml b/agreement_legal_sale/views/agreement.xml index dffaee978..8c4be1ef0 100644 --- a/agreement_legal_sale/views/agreement.xml +++ b/agreement_legal_sale/views/agreement.xml @@ -1,29 +1,31 @@ - + - agreement.form.view agreement - + - - + + - + - + diff --git a/agreement_legal_sale/views/sale_order.xml b/agreement_legal_sale/views/sale_order.xml index 8a077c3db..c6bc21c2c 100644 --- a/agreement_legal_sale/views/sale_order.xml +++ b/agreement_legal_sale/views/sale_order.xml @@ -1,20 +1,21 @@ - + - sale.order.agreement.form.view sale.order - + - - {'invisible': [('agreement_id', '=', False)]} + + {'invisible': [('agreement_id', '=', False)]} - + From ffaa36d0b1aad1d53de0bff57511f08232697be7 Mon Sep 17 00:00:00 2001 From: HemanginiPatel Date: Mon, 16 Aug 2021 16:08:14 +0530 Subject: [PATCH 13/14] [IMP]Improved the UT. --- agreement_legal_sale/tests/test_sale_order.py | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/agreement_legal_sale/tests/test_sale_order.py b/agreement_legal_sale/tests/test_sale_order.py index 0727c12c4..87696a9e1 100644 --- a/agreement_legal_sale/tests/test_sale_order.py +++ b/agreement_legal_sale/tests/test_sale_order.py @@ -18,6 +18,9 @@ class TestSaleOrder(TransactionCase): "domain": "sale", } ) + self.test_account_analytic_account = self.env[ + "account.analytic.account" + ].create({"name": "Test Analytic Account"}) self.test_agreement_template = self.env["agreement"].create( { "name": "TestAgreementTemplate", @@ -27,6 +30,20 @@ class TestSaleOrder(TransactionCase): "partner_id": self.test_customer.id, "start_date": fields.Date.today(), "end_date": fields.Date.today() + timedelta(days=365), + "analytic_account_id": self.test_account_analytic_account.id, + } + ) + self.test_agreement_template_no_analytic_account_id = self.env[ + "agreement" + ].create( + { + "name": "TestAgreementTemplate A", + "description": "Test Template", + "special_terms": "Test Template", + "is_template": True, + "partner_id": self.test_customer.id, + "start_date": fields.Date.today(), + "end_date": fields.Date.today() + timedelta(days=365), } ) self.test_product = self.env["product.product"].create({"name": "TestProduct"}) @@ -40,6 +57,33 @@ class TestSaleOrder(TransactionCase): ], } ) + self.test_product_templ_is_serviceprofile = self.env["product.template"].create( + {"name": "TestProductA", "is_serviceprofile": True} + ) + self.test_product_is_serviceprofile = self.env["product.product"].create( + { + "name": "TestProductA", + "is_serviceprofile": True, + "product_tmpl_id": self.test_product_templ_is_serviceprofile.id, + } + ) + self.test_sale_order_is_serviceprofile = self.env["sale.order"].create( + { + "partner_id": self.test_customer.id, + "agreement_template_id": self.test_agreement_template.id, + "date_order": fields.Date.today(), + "order_line": [ + ( + 0, + 0, + { + "product_id": self.test_product_is_serviceprofile.id, + "product_uom_qty": 1.0, + }, + ) + ], + } + ) # TEST 01: Test _action_confirm method def test_action_confirm(self): @@ -50,3 +94,14 @@ class TestSaleOrder(TransactionCase): agreement.sale_id.id, sale_order.id, ) + + # Test 02: is_serviceprofile Product + is_serviceprofile_so = self.test_sale_order_is_serviceprofile + is_serviceprofile_so._action_confirm() + agreement = self.env["agreement"].search( + [("sale_id", "=", is_serviceprofile_so.id)] + ) + self.assertEqual( + agreement.sale_id.id, + is_serviceprofile_so.id, + ) From 058ed4b4a3cad728ecab4164b456f307a78851bd Mon Sep 17 00:00:00 2001 From: HemanginiPatel Date: Tue, 17 Aug 2021 12:26:45 +0530 Subject: [PATCH 14/14] [IMP]Improved the codecov. --- agreement_legal_sale/models/sale_order.py | 3 +-- agreement_legal_sale/tests/test_sale_order.py | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/agreement_legal_sale/models/sale_order.py b/agreement_legal_sale/models/sale_order.py index 8a3e308bd..dd07f6e83 100644 --- a/agreement_legal_sale/models/sale_order.py +++ b/agreement_legal_sale/models/sale_order.py @@ -69,7 +69,6 @@ class SaleOrder(models.Model): # we create the Agreement. # To work around that, we check if that is the case, # and make sure the SO Analytic Account is copied to the Agreement. - res = super(SaleOrder, self).action_confirm() for order in self: agreement = order.agreement_id if ( @@ -78,4 +77,4 @@ class SaleOrder(models.Model): and not agreement.analytic_account_id ): agreement.analytic_account_id = order.analytic_account_id - return res + return super(SaleOrder, self).action_confirm() diff --git a/agreement_legal_sale/tests/test_sale_order.py b/agreement_legal_sale/tests/test_sale_order.py index 87696a9e1..46da72808 100644 --- a/agreement_legal_sale/tests/test_sale_order.py +++ b/agreement_legal_sale/tests/test_sale_order.py @@ -84,6 +84,26 @@ class TestSaleOrder(TransactionCase): ], } ) + self.test_agreement = self.env["agreement"].create( + { + "name": "TestAgreement A", + "description": "Test Agreement A", + "special_terms": "TestAgreement A", + "start_date": fields.Date.today(), + "end_date": fields.Date.today() + timedelta(days=365), + } + ) + self.test_sale_order_account_analytic_account = self.env["sale.order"].create( + { + "partner_id": self.test_customer.id, + "agreement_template_id": self.test_agreement_template_no_analytic_account_id.id, + "date_order": fields.Date.today(), + "agreement_id": self.test_agreement.id, + "order_line": [ + (0, 0, {"product_id": self.test_product.id, "product_uom_qty": 1.0}) + ], + } + ) # TEST 01: Test _action_confirm method def test_action_confirm(self): @@ -105,3 +125,8 @@ class TestSaleOrder(TransactionCase): agreement.sale_id.id, is_serviceprofile_so.id, ) + # Test 03: Test action_confirm method + self.test_sale_order_account_analytic_account.write( + {"analytic_account_id": self.test_account_analytic_account.id} + ) + self.test_sale_order_account_analytic_account.action_confirm()