From 9b972c80dfffcc2e0e088f5d6042c0d34d5e6029 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Thu, 21 May 2020 16:55:05 +0200 Subject: [PATCH] Re-introduce module agreement_account Update agreement and agreement_sale to restore the behavior of v10 --- agreement/models/agreement.py | 27 +- agreement/models/agreement_type.py | 8 +- agreement/views/agreement.xml | 24 +- agreement/views/agreement_type.xml | 11 + agreement_account/__init__.py | 1 + agreement_account/__manifest__.py | 28 ++ agreement_account/models/__init__.py | 2 + agreement_account/models/account_invoice.py | 15 + agreement_account/models/agreement.py | 36 ++ agreement_account/readme/CONTRIBUTORS.rst | 1 + agreement_account/readme/DESCRIPTION.rst | 1 + .../security/ir.model.access.csv | 3 + agreement_account/static/description/icon.png | Bin 0 -> 10512 bytes .../static/description/index.html | 430 ++++++++++++++++++ agreement_account/views/account_invoice.xml | 54 +++ agreement_account/views/agreement.xml | 61 +++ agreement_sale/__manifest__.py | 3 +- agreement_sale/models/__init__.py | 1 + agreement_sale/models/agreement.py | 27 ++ agreement_sale/models/sale.py | 8 +- agreement_sale/readme/DESCRIPTION.rst | 2 +- agreement_sale/security/ir.model.access.csv | 1 - agreement_sale/views/agreement.xml | 31 +- agreement_sale/views/sale_order.xml | 18 +- oca_dependencies.txt | 1 + 25 files changed, 772 insertions(+), 22 deletions(-) create mode 100644 agreement_account/__init__.py create mode 100644 agreement_account/__manifest__.py create mode 100644 agreement_account/models/__init__.py create mode 100644 agreement_account/models/account_invoice.py create mode 100644 agreement_account/models/agreement.py create mode 100644 agreement_account/readme/CONTRIBUTORS.rst create mode 100644 agreement_account/readme/DESCRIPTION.rst create mode 100644 agreement_account/security/ir.model.access.csv create mode 100644 agreement_account/static/description/icon.png create mode 100644 agreement_account/static/description/index.html create mode 100644 agreement_account/views/account_invoice.xml create mode 100644 agreement_account/views/agreement.xml create mode 100644 agreement_sale/models/agreement.py diff --git a/agreement/models/agreement.py b/agreement/models/agreement.py index 6df4e1588..0eae3eece 100644 --- a/agreement/models/agreement.py +++ b/agreement/models/agreement.py @@ -10,11 +10,11 @@ class Agreement(models.Model): _description = 'Agreement' _inherit = ["mail.thread", "mail.activity.mixin"] - code = fields.Char(required=True) - name = fields.Char(required=True) + code = fields.Char(required=True, track_visibility='onchange') + name = fields.Char(required=True, track_visibility='onchange') partner_id = fields.Many2one( 'res.partner', string='Partner', ondelete='restrict', - domain=[('parent_id', '=', False)]) + domain=[('parent_id', '=', False)], track_visibility='onchange') company_id = fields.Many2one( 'res.company', string='Company', default=lambda self: self.env['res.company']._company_default_get()) @@ -30,10 +30,25 @@ class Agreement(models.Model): string="Agreement Type", help="Select the type of agreement", ) + domain = fields.Selection( + '_domain_selection', string='Domain', default='sale', + track_visibility='onchange') active = fields.Boolean(default=True) - signature_date = fields.Date() - start_date = fields.Date() - end_date = fields.Date() + signature_date = fields.Date(track_visibility='onchange') + start_date = fields.Date(track_visibility='onchange') + end_date = fields.Date(track_visibility='onchange') + + @api.model + def _domain_selection(self): + return [ + ('sale', _('Sale')), + ('purchase', _('Purchase')), + ] + + @api.onchange('agreement_type_id') + def agreement_type_change(self): + if self.agreement_type_id and self.agreement_type_id.domain: + self.domain = self.agreement_type_id.domain def name_get(self): res = [] diff --git a/agreement/models/agreement_type.py b/agreement/models/agreement_type.py index a35a64826..8074b5262 100644 --- a/agreement/models/agreement_type.py +++ b/agreement/models/agreement_type.py @@ -1,7 +1,7 @@ # Copyright (C) 2018 - TODAY, Pavlov Media # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import fields, models +from odoo import api, fields, models class AgreementType(models.Model): @@ -10,3 +10,9 @@ class AgreementType(models.Model): name = fields.Char(string="Name", required=True) active = fields.Boolean(default=True) + domain = fields.Selection( + '_domain_selection', string='Domain', default='sale') + + @api.model + def _domain_selection(self): + return self.env['agreement']._domain_selection() diff --git a/agreement/views/agreement.xml b/agreement/views/agreement.xml index 1c110ee5a..bb6b8925b 100644 --- a/agreement/views/agreement.xml +++ b/agreement/views/agreement.xml @@ -20,20 +20,26 @@ options='{"terminology": "archive"}'/> +
+
- - + - - + + + + - @@ -61,6 +67,7 @@ + @@ -74,12 +81,17 @@ + + + + diff --git a/agreement/views/agreement_type.xml b/agreement/views/agreement_type.xml index 1ca06a478..b801260ee 100644 --- a/agreement/views/agreement_type.xml +++ b/agreement/views/agreement_type.xml @@ -7,6 +7,7 @@ + @@ -29,6 +30,9 @@ @@ -40,7 +44,14 @@ + + + + + + + diff --git a/agreement_account/__init__.py b/agreement_account/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/agreement_account/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/agreement_account/__manifest__.py b/agreement_account/__manifest__.py new file mode 100644 index 000000000..d70831428 --- /dev/null +++ b/agreement_account/__manifest__.py @@ -0,0 +1,28 @@ +# Copyright 2017-2020 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + 'name': 'Agreement Account', + 'summary': "Agreement on invoices", + 'version': '12.0.1.0.0', + 'category': 'Contract', + 'author': 'Akretion, Odoo Community Association (OCA)', + 'website': 'https://github.com/OCA/contract', + 'license': 'AGPL-3', + 'depends': [ + 'agreement', + 'account', + ], + 'data': [ + 'security/ir.model.access.csv', + 'views/agreement.xml', + 'views/account_invoice.xml', + ], + 'development_status': 'Beta', + 'maintainers': [ + 'alexis-via', + 'bealdav', + ], + 'installable': True, +} diff --git a/agreement_account/models/__init__.py b/agreement_account/models/__init__.py new file mode 100644 index 000000000..720f31c8b --- /dev/null +++ b/agreement_account/models/__init__.py @@ -0,0 +1,2 @@ +from . import agreement +from . import account_invoice diff --git a/agreement_account/models/account_invoice.py b/agreement_account/models/account_invoice.py new file mode 100644 index 000000000..a6bdc4122 --- /dev/null +++ b/agreement_account/models/account_invoice.py @@ -0,0 +1,15 @@ +# Copyright 2017-2020 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from odoo import fields, models + + +class AccountInvoice(models.Model): + _inherit = 'account.invoice' + + agreement_id = fields.Many2one( + comodel_name='agreement', string='Agreement', ondelete='restrict', + track_visibility='onchange', readonly=True, copy=False, + states={'draft': [('readonly', False)]}) diff --git a/agreement_account/models/agreement.py b/agreement_account/models/agreement.py new file mode 100644 index 000000000..ddbc4ef42 --- /dev/null +++ b/agreement_account/models/agreement.py @@ -0,0 +1,36 @@ +# Copyright 2017-2020 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from odoo import fields, models + + +class Agreement(models.Model): + _inherit = 'agreement' + + invoice_ids = fields.One2many( + 'account.invoice', 'agreement_id', string='Invoices', readonly=True) + out_invoice_count = fields.Integer( + compute='_compute_invoice_count', string='# of Customer Invoices') + in_invoice_count = fields.Integer( + compute='_compute_invoice_count', string='# of Vendor Bills') + + def _compute_invoice_count(self): + base_domain = [ + ('agreement_id', 'in', self.ids), + ('state', 'not in', ('draft', 'cancel'))] + aio = self.env['account.invoice'] + out_rg_res = aio.read_group( + base_domain + [('type', 'in', ('out_invoice', 'out_refund'))], + ['agreement_id'], ['agreement_id']) + out_data = dict( + [(x['agreement_id'][0], x['agreement_id_count']) for x in out_rg_res]) + in_rg_res = aio.read_group( + base_domain + [('type', 'in', ('in_invoice', 'in_refund'))], + ['agreement_id'], ['agreement_id']) + in_data = dict( + [(x['agreement_id'][0], x['agreement_id_count']) for x in in_rg_res]) + for agreement in self: + agreement.out_invoice_count = out_data.get(agreement.id, 0) + agreement.in_invoice_count = in_data.get(agreement.id, 0) diff --git a/agreement_account/readme/CONTRIBUTORS.rst b/agreement_account/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..ff65d68ce --- /dev/null +++ b/agreement_account/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Alexis de Lattre diff --git a/agreement_account/readme/DESCRIPTION.rst b/agreement_account/readme/DESCRIPTION.rst new file mode 100644 index 000000000..18e63adc3 --- /dev/null +++ b/agreement_account/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module adds *Agreement* field on invoices. diff --git a/agreement_account/security/ir.model.access.csv b/agreement_account/security/ir.model.access.csv new file mode 100644 index 000000000..c1b7f487c --- /dev/null +++ b/agreement_account/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_agreement_full,Full access on agreement to Financial mgr,agreement.model_agreement,account.group_account_manager,1,1,1,1 +access_agreement_type_full,Full access on agreement type to Financial mgr,agreement.model_agreement_type,account.group_account_manager,1,1,1,1 diff --git a/agreement_account/static/description/icon.png b/agreement_account/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a99cce6beeef7462f9eaf1873754490ef6632b3e GIT binary patch literal 10512 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 + + + + + +Agreement Sale + + + +
+

Agreement Sale

+ + +

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

+

This module adds Agreement field to Sales Orders

+

Table of contents

+ +
+

Known issues / Roadmap

+

Features to evaluate before implementation

+
    +
  • add smart button on agreement to access implied sales
  • +
  • add module agreement_account: agreement_sale’ll depends on it
  • +
+
+
+

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

+
    +
  • Akretion
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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.

+

Current maintainers:

+

alexis-via bealdav

+

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_account/views/account_invoice.xml b/agreement_account/views/account_invoice.xml new file mode 100644 index 000000000..891ca4f05 --- /dev/null +++ b/agreement_account/views/account_invoice.xml @@ -0,0 +1,54 @@ + + + + + + + + agreement.customer.invoice.form + account.invoice + + + + + + + + + + + agreement.supplier.invoice.form + account.invoice + + + + + + + + + + agreement.account.invoice.search + account.invoice + + + + + + + + + + + + + diff --git a/agreement_account/views/agreement.xml b/agreement_account/views/agreement.xml new file mode 100644 index 000000000..36104570a --- /dev/null +++ b/agreement_account/views/agreement.xml @@ -0,0 +1,61 @@ + + + + + + + 150 + + + + + + Vendor Bills + account.invoice + tree,form + [('type','in', ('in_invoice', 'in_refund')), ('state', 'not in', ('draft', 'cancel'))] + {'default_type': 'in_invoice', 'type': 'in_invoice', 'journal_type': 'purchase'} + + + + + tree + + + + + + + form + + + + + + invoice.button.agreement.form + agreement + + +
+ + + +
+
+
+ +
diff --git a/agreement_sale/__manifest__.py b/agreement_sale/__manifest__.py index 9ee05c394..0392f15f5 100644 --- a/agreement_sale/__manifest__.py +++ b/agreement_sale/__manifest__.py @@ -12,7 +12,8 @@ 'license': 'AGPL-3', 'depends': [ 'sale_management', - 'agreement', + 'agreement_account', + 'sale_commercial_partner', ], 'data': [ 'security/ir.model.access.csv', diff --git a/agreement_sale/models/__init__.py b/agreement_sale/models/__init__.py index 534c392d2..9576a5f73 100644 --- a/agreement_sale/models/__init__.py +++ b/agreement_sale/models/__init__.py @@ -1,2 +1,3 @@ +from . import agreement from . import sale from . import res_config_settings diff --git a/agreement_sale/models/agreement.py b/agreement_sale/models/agreement.py new file mode 100644 index 000000000..1f6d435f5 --- /dev/null +++ b/agreement_sale/models/agreement.py @@ -0,0 +1,27 @@ +# Copyright 2017-2020 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from odoo import fields, models + + +class Agreement(models.Model): + _inherit = 'agreement' + + sale_ids = fields.One2many( + 'sale.order', 'agreement_id', string='Sale Orders', readonly=True) + sale_count = fields.Integer( + compute='_compute_sale_count', string='# of Sale Orders') + + def _compute_sale_count(self): + rg_res = self.env['sale.order'].read_group( + [ + ('agreement_id', 'in', self.ids), + ('state', 'not in', ('draft', 'sent', 'cancel')), + ], + ['agreement_id'], ['agreement_id']) + mapped_data = dict( + [(x['agreement_id'][0], x['agreement_id_count']) for x in rg_res]) + for agreement in self: + agreement.sale_count = mapped_data.get(agreement.id, 0) diff --git a/agreement_sale/models/sale.py b/agreement_sale/models/sale.py index bf97d9de2..5c2a9a1a5 100644 --- a/agreement_sale/models/sale.py +++ b/agreement_sale/models/sale.py @@ -1,4 +1,5 @@ -# © 2017 Akretion (Alexis de Lattre ) +# Copyright 2017-2020 Akretion France +# @author: Alexis de Lattre # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). @@ -18,3 +19,8 @@ class SaleOrder(models.Model): ondelete="restrict", track_visibility='onchange', readonly=True, copy=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}) + + def _prepare_invoice(self): + vals = super()._prepare_invoice() + vals['agreement_id'] = self.agreement_id.id or False + return vals diff --git a/agreement_sale/readme/DESCRIPTION.rst b/agreement_sale/readme/DESCRIPTION.rst index 3f0417552..c78e1a42b 100644 --- a/agreement_sale/readme/DESCRIPTION.rst +++ b/agreement_sale/readme/DESCRIPTION.rst @@ -1 +1 @@ -This module adds *Agreement* field to Sales Orders +This module adds *Agreement* field to Sales Orders. Upon invoice creation, that field is copied to the invoice. diff --git a/agreement_sale/security/ir.model.access.csv b/agreement_sale/security/ir.model.access.csv index f6e188f41..7494f7f2e 100644 --- a/agreement_sale/security/ir.model.access.csv +++ b/agreement_sale/security/ir.model.access.csv @@ -1,4 +1,3 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink agreement.access_agreement_full,Full access on agreement grp,agreement.model_agreement,sales_team.group_sale_manager,1,1,1,1 agreement_sale.access_agreement_type_full,Full access on agreement type grp,agreement.model_agreement_type,sales_team.group_sale_manager,1,1,1,1 -agreement_sale.access_agreement_type_read,Read access on agreement grp,agreement.model_agreement_type,base.group_user,1,0,0,0 diff --git a/agreement_sale/views/agreement.xml b/agreement_sale/views/agreement.xml index cc30d5ce8..d7a40c22b 100644 --- a/agreement_sale/views/agreement.xml +++ b/agreement_sale/views/agreement.xml @@ -2,9 +2,32 @@ - - + + + 150 + + + + + + + sale.button.agreement.form + agreement + + +
+ +
+
+
diff --git a/agreement_sale/views/sale_order.xml b/agreement_sale/views/sale_order.xml index e7e5b5ea4..fbd2dc4c8 100644 --- a/agreement_sale/views/sale_order.xml +++ b/agreement_sale/views/sale_order.xml @@ -6,7 +6,9 @@ - + + + agreement.sale.order.search + sale.order + + + + + + + + + + + diff --git a/oca_dependencies.txt b/oca_dependencies.txt index ff045117f..915dd1d8b 100644 --- a/oca_dependencies.txt +++ b/oca_dependencies.txt @@ -4,3 +4,4 @@ field-service sale-reporting account-invoicing account-closing +sale-workflow