From 414683a460704e562dd3157f4b526260bbaf21da Mon Sep 17 00:00:00 2001 From: Thierry Ducrest Date: Fri, 5 Jun 2020 13:05:03 +0200 Subject: [PATCH 01/24] [13.0][ADD] base_ebill_payment_contract The goal of this module is to be a common ground for ebilling addons. Alone this module has no purpose. It needs to be installed with a module that implements a specific ebilling system. This depending module has to implement his own 'transmit.method'. --- base_ebill_payment_contract/__init__.py | 1 + base_ebill_payment_contract/__manifest__.py | 15 ++++ .../demo/ebill_payment_contract.xml | 11 +++ .../models/__init__.py | 2 + .../models/ebill_payment_contract.py | 50 ++++++++++++++ .../models/res_partner.py | 27 ++++++++ .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 4 ++ base_ebill_payment_contract/readme/USAGE.rst | 4 ++ .../security/ir.model.access.csv | 3 + .../static/description/icon.png | Bin 0 -> 9455 bytes base_ebill_payment_contract/tests/__init__.py | 1 + .../tests/test_base_ebill_payment_contract.py | 58 ++++++++++++++++ .../views/ebill_payment_contract.xml | 64 ++++++++++++++++++ 14 files changed, 241 insertions(+) create mode 100644 base_ebill_payment_contract/__init__.py create mode 100644 base_ebill_payment_contract/__manifest__.py create mode 100644 base_ebill_payment_contract/demo/ebill_payment_contract.xml create mode 100644 base_ebill_payment_contract/models/__init__.py create mode 100644 base_ebill_payment_contract/models/ebill_payment_contract.py create mode 100644 base_ebill_payment_contract/models/res_partner.py create mode 100644 base_ebill_payment_contract/readme/CONTRIBUTORS.rst create mode 100644 base_ebill_payment_contract/readme/DESCRIPTION.rst create mode 100644 base_ebill_payment_contract/readme/USAGE.rst create mode 100644 base_ebill_payment_contract/security/ir.model.access.csv create mode 100644 base_ebill_payment_contract/static/description/icon.png create mode 100644 base_ebill_payment_contract/tests/__init__.py create mode 100644 base_ebill_payment_contract/tests/test_base_ebill_payment_contract.py create mode 100644 base_ebill_payment_contract/views/ebill_payment_contract.xml diff --git a/base_ebill_payment_contract/__init__.py b/base_ebill_payment_contract/__init__.py new file mode 100644 index 0000000000..0650744f6b --- /dev/null +++ b/base_ebill_payment_contract/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/base_ebill_payment_contract/__manifest__.py b/base_ebill_payment_contract/__manifest__.py new file mode 100644 index 0000000000..50de7de775 --- /dev/null +++ b/base_ebill_payment_contract/__manifest__.py @@ -0,0 +1,15 @@ +# Copyright 2020 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Base eBill Payment Contract", + "summary": """ + Base for managing e-billing contracts""", + "version": "13.0.1.0.0", + "license": "AGPL-3", + "author": "Camptocamp SA,Odoo Community Association (OCA)", + "website": "https://github.com/OCA/edi", + "depends": ["account_invoice_transmit_method"], + "data": ["security/ir.model.access.csv", "views/ebill_payment_contract.xml"], + "demo": ["demo/ebill_payment_contract.xml"], +} diff --git a/base_ebill_payment_contract/demo/ebill_payment_contract.xml b/base_ebill_payment_contract/demo/ebill_payment_contract.xml new file mode 100644 index 0000000000..cd60a23f9f --- /dev/null +++ b/base_ebill_payment_contract/demo/ebill_payment_contract.xml @@ -0,0 +1,11 @@ + + + + draft + + + + open + + + diff --git a/base_ebill_payment_contract/models/__init__.py b/base_ebill_payment_contract/models/__init__.py new file mode 100644 index 0000000000..bd9c1f908c --- /dev/null +++ b/base_ebill_payment_contract/models/__init__.py @@ -0,0 +1,2 @@ +from . import res_partner +from . import ebill_payment_contract diff --git a/base_ebill_payment_contract/models/ebill_payment_contract.py b/base_ebill_payment_contract/models/ebill_payment_contract.py new file mode 100644 index 0000000000..bbfcbd77d4 --- /dev/null +++ b/base_ebill_payment_contract/models/ebill_payment_contract.py @@ -0,0 +1,50 @@ +# Copyright 2020 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class EbillPaymentContract(models.Model): + + _name = "ebill.payment.contract" + _description = "eBill Payment Contract" + + transmit_method_id = fields.Many2one( + comodel_name="transmit.method", string="Service Name", ondelete="restrict", + ) + partner_id = fields.Many2one( + comodel_name="res.partner", required=True, string="Customer" + ) + name = fields.Char(related="partner_id.name") + date_start = fields.Date( + string="Start date", required=True, default=fields.Date.today, + ) + date_end = fields.Date(string="End date") + state = fields.Selection( + selection=[("draft", "Draft"), ("open", "Open"), ("cancel", "Cancel")], + required=True, + default="draft", + ) + is_valid = fields.Boolean(compute="_compute_is_valid") + + @api.onchange("state") + def _onchange_state(self): + """Change the end date if contract is canceled.""" + if self.state == "cancel" and self.date_end > fields.Date.today(): + self.date_end = fields.Date.today() + + @api.depends("state", "date_start", "date_end") + def _compute_is_valid(self): + """ Check that the contract is valid + + It is valid if the contract is opened and his start date is in the pass + And his end date is in the future or not set. + """ + today = fields.Date.today() + for contract in self: + contract.is_valid = ( + contract.state == "open" + and contract.date_start + and contract.date_start <= today + and (not contract.date_end or contract.date_end >= today) + ) diff --git a/base_ebill_payment_contract/models/res_partner.py b/base_ebill_payment_contract/models/res_partner.py new file mode 100644 index 0000000000..53d9a25512 --- /dev/null +++ b/base_ebill_payment_contract/models/res_partner.py @@ -0,0 +1,27 @@ +# Copyright 2019 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import logging + +from odoo import models + +_logger = logging.getLogger(__name__) + + +class ResPartner(models.Model): + + _inherit = "res.partner" + + def get_active_contract(self, transmit_method): + """Return the active contract for a specific transmit method.""" + self.ensure_one() + contracts = self.env["ebill.payment.contract"].search( + [("is_valid", "=", True), ("partner_id", "=", self.id)], limit=1, + ) + if not contracts: + _logger.error( + "Paynet contract for {} on {} not found".format( + self.name, transmit_method.name + ) + ) + return contracts[0] if contracts else contracts diff --git a/base_ebill_payment_contract/readme/CONTRIBUTORS.rst b/base_ebill_payment_contract/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..0dd376faec --- /dev/null +++ b/base_ebill_payment_contract/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Thierry Ducrest diff --git a/base_ebill_payment_contract/readme/DESCRIPTION.rst b/base_ebill_payment_contract/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..9e01b8a4ce --- /dev/null +++ b/base_ebill_payment_contract/readme/DESCRIPTION.rst @@ -0,0 +1,4 @@ +The goal of this module is to be a common ground for ebilling addons. +It adds an ebill.payment.contract attached to a partner. +Alone this module has no purpose. It needs to be installed with a module that implements a specific ebilling system. +This depending module has to implement his own 'transmit.method'. diff --git a/base_ebill_payment_contract/readme/USAGE.rst b/base_ebill_payment_contract/readme/USAGE.rst new file mode 100644 index 0000000000..d798e79283 --- /dev/null +++ b/base_ebill_payment_contract/readme/USAGE.rst @@ -0,0 +1,4 @@ +To use this module, you need to: + +#. Install a specific e-billing module + (None are ready, yet) diff --git a/base_ebill_payment_contract/security/ir.model.access.csv b/base_ebill_payment_contract/security/ir.model.access.csv new file mode 100644 index 0000000000..899ad63e87 --- /dev/null +++ b/base_ebill_payment_contract/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_ebill_payment_contract_read,Read access on ebill.payment.contract to everybody,model_ebill_payment_contract,,1,0,0,0 +access_ebill_payment_contract_full,Full access on ebill.payment.contract to Financial Manager,model_ebill_payment_contract,account.group_account_manager,1,1,1,1 diff --git a/base_ebill_payment_contract/static/description/icon.png b/base_ebill_payment_contract/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/base_ebill_payment_contract/tests/__init__.py b/base_ebill_payment_contract/tests/__init__.py new file mode 100644 index 0000000000..2133449459 --- /dev/null +++ b/base_ebill_payment_contract/tests/__init__.py @@ -0,0 +1 @@ +from . import test_base_ebill_payment_contract diff --git a/base_ebill_payment_contract/tests/test_base_ebill_payment_contract.py b/base_ebill_payment_contract/tests/test_base_ebill_payment_contract.py new file mode 100644 index 0000000000..e2a9044281 --- /dev/null +++ b/base_ebill_payment_contract/tests/test_base_ebill_payment_contract.py @@ -0,0 +1,58 @@ +# Copyright 2020 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +from datetime import date, timedelta + +from odoo.tests.common import Form, SingleTransactionCase + + +class TestCrmOpportunityCurrency(SingleTransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.contract1 = cls.env.ref( + "base_ebill_payment_contract.ebill_payment_contract_demo_1" + ) + + def test_contract_validity(self): + self.contract1.state = "open" + # Contract starting today + self.contract1.date_start = date.today() + self.contract1.date_end = date.today() + timedelta(days=10) + self.assertTrue(self.contract1.is_valid) + # Contract finishing tomorrow + self.contract1.date_start = date.today() - timedelta(days=100) + self.contract1.date_end = date.today() + self.assertTrue(self.contract1.is_valid) + # Contract with no end date + self.contract1.date_start = date.today() - timedelta(days=100) + self.contract1.date_end = None + self.assertTrue(self.contract1.is_valid) + + def test_contract_is_not_valid(self): + self.contract1.state = "draft" + self.assertFalse(self.contract1.is_valid) + self.contract1.state = "cancel" + self.assertFalse(self.contract1.is_valid) + self.contract1.state = "open" + # Contract in the past + self.contract1.date_start = date.today() - timedelta(days=5) + self.contract1.date_end = date.today() - timedelta(days=1) + self.assertFalse(self.contract1.is_valid) + # Contract in the future + self.contract1.date_start = date.today() + timedelta(days=1) + self.contract1.date_end = date.today() + timedelta(days=5) + self.assertFalse(self.contract1.is_valid) + # Contract in the future with no end date + self.contract1.date_start = date.today() + timedelta(days=1) + self.contract1.date_end = None + self.assertFalse(self.contract1.is_valid) + + def test_contract_canceled(self): + """Check end date when contract is canceled.""" + self.contract1.date_start = date.today() - timedelta(days=6) + self.contract1.date_end = date.today() + timedelta(days=6) + self.contract1.state = "open" + with Form(self.contract1) as uiform: + uiform.state = "cancel" + self.assertEqual(date.today(), self.contract1.date_end) diff --git a/base_ebill_payment_contract/views/ebill_payment_contract.xml b/base_ebill_payment_contract/views/ebill_payment_contract.xml new file mode 100644 index 0000000000..d3f4378448 --- /dev/null +++ b/base_ebill_payment_contract/views/ebill_payment_contract.xml @@ -0,0 +1,64 @@ + + + + + ebill.payment.contract.form + ebill.payment.contract + +
+ + + + + + + + + +
+
+
+ + ebill.payment.contract.search + ebill.payment.contract + + + + + + + + + + ebill.payment.contract.tree + ebill.payment.contract + + + + + + + + + + + + + eBill Payment Contract + ebill.payment.contract + tree,form + [] + {} + + + eBill Payment Contract + + + + +
From de95570d91f248e24d262a66fb7de577546b7270 Mon Sep 17 00:00:00 2001 From: Thierry Ducrest Date: Tue, 8 Sep 2020 09:09:59 +0200 Subject: [PATCH 02/24] [13.0][IMP] base_ebill_payment_contract search is_valid Add the search implementation for the is_valid non stored computed fields. So it works as expected. --- base_ebill_payment_contract/README.rst | 84 ++++ .../i18n/base_ebill_payment_contract.pot | 116 +++++ .../models/ebill_payment_contract.py | 20 +- .../static/description/index.html | 431 ++++++++++++++++++ 4 files changed, 649 insertions(+), 2 deletions(-) create mode 100644 base_ebill_payment_contract/README.rst create mode 100644 base_ebill_payment_contract/i18n/base_ebill_payment_contract.pot create mode 100644 base_ebill_payment_contract/static/description/index.html diff --git a/base_ebill_payment_contract/README.rst b/base_ebill_payment_contract/README.rst new file mode 100644 index 0000000000..769aa46a0c --- /dev/null +++ b/base_ebill_payment_contract/README.rst @@ -0,0 +1,84 @@ +=========================== +Base eBill Payment Contract +=========================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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%2Fedi-lightgray.png?logo=github + :target: https://github.com/OCA/edi/tree/13.0/base_ebill_payment_contract + :alt: OCA/edi +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/edi-13-0/edi-13-0-base_ebill_payment_contract + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/226/13.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +The goal of this module is to be a common ground for ebilling addons. +It adds an ebill.payment.contract attached to a partner. +Alone this module has no purpose. It needs to be installed with a module that implements a specific ebilling system. +This depending module has to implement his own 'transmit.method'. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To use this module, you need to: + +#. Install a specific e-billing module + (None are ready, yet) + +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 +~~~~~~~ + +* Camptocamp SA + +Contributors +~~~~~~~~~~~~ + +* Thierry Ducrest + +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. + +This module is part of the `OCA/edi `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/base_ebill_payment_contract/i18n/base_ebill_payment_contract.pot b/base_ebill_payment_contract/i18n/base_ebill_payment_contract.pot new file mode 100644 index 0000000000..f6a297d037 --- /dev/null +++ b/base_ebill_payment_contract/i18n/base_ebill_payment_contract.pot @@ -0,0 +1,116 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_ebill_payment_contract +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.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: base_ebill_payment_contract +#: model:ir.model.fields.selection,name:base_ebill_payment_contract.selection__ebill_payment_contract__state__cancel +msgid "Cancel" +msgstr "" + +#. module: base_ebill_payment_contract +#: model:ir.model,name:base_ebill_payment_contract.model_res_partner +msgid "Contact" +msgstr "" + +#. module: base_ebill_payment_contract +#: model:ir.model.fields,field_description:base_ebill_payment_contract.field_ebill_payment_contract__create_uid +msgid "Created by" +msgstr "" + +#. module: base_ebill_payment_contract +#: model:ir.model.fields,field_description:base_ebill_payment_contract.field_ebill_payment_contract__create_date +msgid "Created on" +msgstr "" + +#. module: base_ebill_payment_contract +#: model:ir.model.fields,field_description:base_ebill_payment_contract.field_ebill_payment_contract__partner_id +msgid "Customer" +msgstr "" + +#. module: base_ebill_payment_contract +#: model:ir.model.fields,field_description:base_ebill_payment_contract.field_ebill_payment_contract__display_name +msgid "Display Name" +msgstr "" + +#. module: base_ebill_payment_contract +#: model:ir.model.fields.selection,name:base_ebill_payment_contract.selection__ebill_payment_contract__state__draft +msgid "Draft" +msgstr "" + +#. module: base_ebill_payment_contract +#: model:ir.model.fields,field_description:base_ebill_payment_contract.field_ebill_payment_contract__date_end +msgid "End date" +msgstr "" + +#. module: base_ebill_payment_contract +#: model:ir.model.fields,field_description:base_ebill_payment_contract.field_ebill_payment_contract__id +msgid "ID" +msgstr "" + +#. module: base_ebill_payment_contract +#: model:ir.model.fields,field_description:base_ebill_payment_contract.field_ebill_payment_contract__is_valid +msgid "Is Valid" +msgstr "" + +#. module: base_ebill_payment_contract +#: model:ir.model.fields,field_description:base_ebill_payment_contract.field_ebill_payment_contract____last_update +msgid "Last Modified on" +msgstr "" + +#. module: base_ebill_payment_contract +#: model:ir.model.fields,field_description:base_ebill_payment_contract.field_ebill_payment_contract__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: base_ebill_payment_contract +#: model:ir.model.fields,field_description:base_ebill_payment_contract.field_ebill_payment_contract__write_date +msgid "Last Updated on" +msgstr "" + +#. module: base_ebill_payment_contract +#: model:ir.model.fields,field_description:base_ebill_payment_contract.field_ebill_payment_contract__name +msgid "Name" +msgstr "" + +#. module: base_ebill_payment_contract +#: model:ir.model.fields.selection,name:base_ebill_payment_contract.selection__ebill_payment_contract__state__open +msgid "Open" +msgstr "" + +#. module: base_ebill_payment_contract +#: model:ir.model.fields,field_description:base_ebill_payment_contract.field_ebill_payment_contract__transmit_method_id +msgid "Service Name" +msgstr "" + +#. module: base_ebill_payment_contract +#: model:ir.model.fields,field_description:base_ebill_payment_contract.field_ebill_payment_contract__date_start +msgid "Start date" +msgstr "" + +#. module: base_ebill_payment_contract +#: model:ir.model.fields,field_description:base_ebill_payment_contract.field_ebill_payment_contract__state +msgid "State" +msgstr "" + +#. module: base_ebill_payment_contract +#: model_terms:ir.ui.view,arch_db:base_ebill_payment_contract.ebill_payment_contract_search_view +msgid "Valid" +msgstr "" + +#. module: base_ebill_payment_contract +#: model:ir.actions.act_window,name:base_ebill_payment_contract.ebill_payment_contract_act_window +#: model:ir.model,name:base_ebill_payment_contract.model_ebill_payment_contract +#: model:ir.ui.menu,name:base_ebill_payment_contract.ebill_payment_contract_menu +msgid "eBill Payment Contract" +msgstr "" diff --git a/base_ebill_payment_contract/models/ebill_payment_contract.py b/base_ebill_payment_contract/models/ebill_payment_contract.py index bbfcbd77d4..78c6e353e5 100644 --- a/base_ebill_payment_contract/models/ebill_payment_contract.py +++ b/base_ebill_payment_contract/models/ebill_payment_contract.py @@ -25,7 +25,7 @@ class EbillPaymentContract(models.Model): required=True, default="draft", ) - is_valid = fields.Boolean(compute="_compute_is_valid") + is_valid = fields.Boolean(compute="_compute_is_valid", search="_search_is_valid") @api.onchange("state") def _onchange_state(self): @@ -37,7 +37,7 @@ def _onchange_state(self): def _compute_is_valid(self): """ Check that the contract is valid - It is valid if the contract is opened and his start date is in the pass + It is valid if the contract is opened and its start date is in the past And his end date is in the future or not set. """ today = fields.Date.today() @@ -48,3 +48,19 @@ def _compute_is_valid(self): and contract.date_start <= today and (not contract.date_end or contract.date_end >= today) ) + + def _search_is_valid(self, operator, value): + now = fields.Date.today() + domain = [ + ("state", "=", "open"), + ("date_start", "<=", now), + "|", + ("date_end", "=", False), + ("date_end", ">=", now), + ] + valid_contract = self.search(domain) + if (operator == "=" and value) or (operator == "!=" and not value): + new_operator = "in" + else: + new_operator = "not in" + return [("id", new_operator, valid_contract.ids)] diff --git a/base_ebill_payment_contract/static/description/index.html b/base_ebill_payment_contract/static/description/index.html new file mode 100644 index 0000000000..d423c88b67 --- /dev/null +++ b/base_ebill_payment_contract/static/description/index.html @@ -0,0 +1,431 @@ + + + + + + +Base eBill Payment Contract + + + +
+

Base eBill Payment Contract

+ + +

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

+

The goal of this module is to be a common ground for ebilling addons. +It adds an ebill.payment.contract attached to a partner. +Alone this module has no purpose. It needs to be installed with a module that implements a specific ebilling system. +This depending module has to implement his own ‘transmit.method’.

+

Table of contents

+ +
+

Usage

+

To use this module, you need to:

+
    +
  1. Install a specific e-billing module +(None are ready, yet)
  2. +
+
+
+

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

+
    +
  • Camptocamp SA
  • +
+
+
+

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.

+

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

+

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

+
+
+
+ + From 2d86ed714a5375d71c09c882bc28a30a79220420 Mon Sep 17 00:00:00 2001 From: Tran Thanh Phuc Date: Sun, 7 Feb 2021 14:30:15 +0700 Subject: [PATCH 03/24] [IMP] base_ebill_payment_contract: black, isort, prettier --- .../models/ebill_payment_contract.py | 10 +++++++--- base_ebill_payment_contract/models/res_partner.py | 3 ++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/base_ebill_payment_contract/models/ebill_payment_contract.py b/base_ebill_payment_contract/models/ebill_payment_contract.py index 78c6e353e5..c18ab94625 100644 --- a/base_ebill_payment_contract/models/ebill_payment_contract.py +++ b/base_ebill_payment_contract/models/ebill_payment_contract.py @@ -10,14 +10,18 @@ class EbillPaymentContract(models.Model): _description = "eBill Payment Contract" transmit_method_id = fields.Many2one( - comodel_name="transmit.method", string="Service Name", ondelete="restrict", + comodel_name="transmit.method", + string="Service Name", + ondelete="restrict", ) partner_id = fields.Many2one( comodel_name="res.partner", required=True, string="Customer" ) name = fields.Char(related="partner_id.name") date_start = fields.Date( - string="Start date", required=True, default=fields.Date.today, + string="Start date", + required=True, + default=fields.Date.today, ) date_end = fields.Date(string="End date") state = fields.Selection( @@ -35,7 +39,7 @@ def _onchange_state(self): @api.depends("state", "date_start", "date_end") def _compute_is_valid(self): - """ Check that the contract is valid + """Check that the contract is valid It is valid if the contract is opened and its start date is in the past And his end date is in the future or not set. diff --git a/base_ebill_payment_contract/models/res_partner.py b/base_ebill_payment_contract/models/res_partner.py index 53d9a25512..1cbe9da30d 100644 --- a/base_ebill_payment_contract/models/res_partner.py +++ b/base_ebill_payment_contract/models/res_partner.py @@ -16,7 +16,8 @@ def get_active_contract(self, transmit_method): """Return the active contract for a specific transmit method.""" self.ensure_one() contracts = self.env["ebill.payment.contract"].search( - [("is_valid", "=", True), ("partner_id", "=", self.id)], limit=1, + [("is_valid", "=", True), ("partner_id", "=", self.id)], + limit=1, ) if not contracts: _logger.error( From 1e093b3e7c0826808b903ce1f6d7e9d9ed6643fd Mon Sep 17 00:00:00 2001 From: Tran Thanh Phuc Date: Sun, 7 Feb 2021 15:09:54 +0700 Subject: [PATCH 04/24] [MIG] base_ebill_payment_contract: Migration to 14.0 --- base_ebill_payment_contract/README.rst | 18 +++++++++++----- base_ebill_payment_contract/__manifest__.py | 2 +- .../readme/CONTRIBUTORS.rst | 1 + .../readme/CREDITS.rst | 3 +++ .../static/description/index.html | 21 +++++++++++++------ 5 files changed, 33 insertions(+), 12 deletions(-) create mode 100644 base_ebill_payment_contract/readme/CREDITS.rst diff --git a/base_ebill_payment_contract/README.rst b/base_ebill_payment_contract/README.rst index 769aa46a0c..d40c4f9c4e 100644 --- a/base_ebill_payment_contract/README.rst +++ b/base_ebill_payment_contract/README.rst @@ -14,13 +14,13 @@ Base eBill Payment Contract :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fedi-lightgray.png?logo=github - :target: https://github.com/OCA/edi/tree/13.0/base_ebill_payment_contract + :target: https://github.com/OCA/edi/tree/14.0/base_ebill_payment_contract :alt: OCA/edi .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/edi-13-0/edi-13-0-base_ebill_payment_contract + :target: https://translation.odoo-community.org/projects/edi-14-0/edi-14-0-base_ebill_payment_contract :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/226/13.0 + :target: https://runbot.odoo-community.org/runbot/226/14.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -49,7 +49,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. @@ -65,6 +65,14 @@ Contributors ~~~~~~~~~~~~ * Thierry Ducrest +* Phuc Tran Thanh + +Other credits +~~~~~~~~~~~~~ + +The development of this module has been financially supported by: + +* Camptocamp Maintainers ~~~~~~~~~~~ @@ -79,6 +87,6 @@ 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. -This module is part of the `OCA/edi `_ project on GitHub. +This module is part of the `OCA/edi `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/base_ebill_payment_contract/__manifest__.py b/base_ebill_payment_contract/__manifest__.py index 50de7de775..63d7f45efd 100644 --- a/base_ebill_payment_contract/__manifest__.py +++ b/base_ebill_payment_contract/__manifest__.py @@ -5,7 +5,7 @@ "name": "Base eBill Payment Contract", "summary": """ Base for managing e-billing contracts""", - "version": "13.0.1.0.0", + "version": "14.0.1.0.0", "license": "AGPL-3", "author": "Camptocamp SA,Odoo Community Association (OCA)", "website": "https://github.com/OCA/edi", diff --git a/base_ebill_payment_contract/readme/CONTRIBUTORS.rst b/base_ebill_payment_contract/readme/CONTRIBUTORS.rst index 0dd376faec..088bd4bdba 100644 --- a/base_ebill_payment_contract/readme/CONTRIBUTORS.rst +++ b/base_ebill_payment_contract/readme/CONTRIBUTORS.rst @@ -1 +1,2 @@ * Thierry Ducrest +* Phuc Tran Thanh diff --git a/base_ebill_payment_contract/readme/CREDITS.rst b/base_ebill_payment_contract/readme/CREDITS.rst new file mode 100644 index 0000000000..f5cc070c78 --- /dev/null +++ b/base_ebill_payment_contract/readme/CREDITS.rst @@ -0,0 +1,3 @@ +The development of this module has been financially supported by: + +* Camptocamp diff --git a/base_ebill_payment_contract/static/description/index.html b/base_ebill_payment_contract/static/description/index.html index d423c88b67..252c47e09b 100644 --- a/base_ebill_payment_contract/static/description/index.html +++ b/base_ebill_payment_contract/static/description/index.html @@ -3,7 +3,7 @@ - + Base eBill Payment Contract