mirror of
https://github.com/OCA/contract.git
synced 2025-02-13 17:57:24 +02:00
[14.0][IMP] contract_sale_generation
Use the generation_type field defined now in contract base module. Improve tests
This commit is contained in:
committed by
ntsirintanis
parent
28085a6e19
commit
ae3aaa8f13
@@ -14,13 +14,13 @@ Contracts Management - Recurring Sales
|
|||||||
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
|
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
|
||||||
:alt: License: AGPL-3
|
:alt: License: AGPL-3
|
||||||
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fcontract-lightgray.png?logo=github
|
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fcontract-lightgray.png?logo=github
|
||||||
:target: https://github.com/OCA/contract/tree/12.0/contract_sale_generation
|
:target: https://github.com/OCA/contract/tree/14.0/contract_sale_generation
|
||||||
:alt: OCA/contract
|
:alt: OCA/contract
|
||||||
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
|
.. |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-contract_sale_generation
|
:target: https://translation.odoo-community.org/projects/contract-14-0/contract-14-0-contract_sale_generation
|
||||||
:alt: Translate me on Weblate
|
:alt: Translate me on Weblate
|
||||||
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
|
.. |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
|
:alt: Try me on Runbot
|
||||||
|
|
||||||
|badge1| |badge2| |badge3| |badge4| |badge5|
|
|badge1| |badge2| |badge3| |badge4| |badge5|
|
||||||
@@ -50,7 +50,7 @@ Bug Tracker
|
|||||||
Bugs are tracked on `GitHub Issues <https://github.com/OCA/contract/issues>`_.
|
Bugs are tracked on `GitHub Issues <https://github.com/OCA/contract/issues>`_.
|
||||||
In case of trouble, please check there if your issue has already been reported.
|
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
|
If you spotted it first, help us smashing it by providing a detailed and welcomed
|
||||||
`feedback <https://github.com/OCA/contract/issues/new?body=module:%20contract_sale_generation%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
|
`feedback <https://github.com/OCA/contract/issues/new?body=module:%20contract_sale_generation%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
|
||||||
|
|
||||||
Do not contact contributors directly about support or help with technical issues.
|
Do not contact contributors directly about support or help with technical issues.
|
||||||
|
|
||||||
@@ -60,6 +60,7 @@ Credits
|
|||||||
Authors
|
Authors
|
||||||
~~~~~~~
|
~~~~~~~
|
||||||
|
|
||||||
|
* ACSONE SA/NV
|
||||||
* PESOL
|
* PESOL
|
||||||
|
|
||||||
Contributors
|
Contributors
|
||||||
@@ -68,6 +69,7 @@ Contributors
|
|||||||
* Angel Moya <angel.moya@pesol.es>
|
* Angel Moya <angel.moya@pesol.es>
|
||||||
* Florent THOMAS <florent.thomas@mind-and-go.com>
|
* Florent THOMAS <florent.thomas@mind-and-go.com>
|
||||||
* Serpent Consulting Services Pvt. Ltd. <support@serpentcs.com>
|
* Serpent Consulting Services Pvt. Ltd. <support@serpentcs.com>
|
||||||
|
* Denis Roussel <denis.roussel@acsone.eu>
|
||||||
|
|
||||||
Maintainers
|
Maintainers
|
||||||
~~~~~~~~~~~
|
~~~~~~~~~~~
|
||||||
@@ -82,6 +84,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose
|
|||||||
mission is to support the collaborative development of Odoo features and
|
mission is to support the collaborative development of Odoo features and
|
||||||
promote its widespread use.
|
promote its widespread use.
|
||||||
|
|
||||||
This module is part of the `OCA/contract <https://github.com/OCA/contract/tree/12.0/contract_sale_generation>`_ project on GitHub.
|
This module is part of the `OCA/contract <https://github.com/OCA/contract/tree/14.0/contract_sale_generation>`_ project on GitHub.
|
||||||
|
|
||||||
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
|
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
|
||||||
|
|||||||
@@ -8,13 +8,12 @@
|
|||||||
"version": "14.0.1.0.0",
|
"version": "14.0.1.0.0",
|
||||||
"category": "Contract Management",
|
"category": "Contract Management",
|
||||||
"license": "AGPL-3",
|
"license": "AGPL-3",
|
||||||
"author": "PESOL, " "Odoo Community Association (OCA)",
|
"author": "ACSONE SA/NV, PESOL, Odoo Community Association (OCA)",
|
||||||
"website": "https://github.com/OCA/contract",
|
"website": "https://github.com/OCA/contract",
|
||||||
"depends": ["contract_sale"],
|
"depends": ["contract_sale"],
|
||||||
"data": [
|
"data": [
|
||||||
"data/contract_cron.xml",
|
"data/contract_cron.xml",
|
||||||
"views/contract.xml",
|
"views/contract.xml",
|
||||||
"views/contract_template.xml",
|
|
||||||
],
|
],
|
||||||
"installable": True,
|
"installable": True,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,5 +2,6 @@
|
|||||||
|
|
||||||
from . import abstract_contract
|
from . import abstract_contract
|
||||||
from . import contract
|
from . import contract
|
||||||
|
from . import sale_order
|
||||||
from . import sale_order_line
|
from . import sale_order_line
|
||||||
from . import contract_line
|
from . import contract_line
|
||||||
|
|||||||
@@ -2,16 +2,16 @@
|
|||||||
# Copyright 2017 Angel Moya <angel.moya@pesol.es>
|
# Copyright 2017 Angel Moya <angel.moya@pesol.es>
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import fields, models
|
from odoo import api, fields, models
|
||||||
|
|
||||||
|
|
||||||
class ContractAbstractContract(models.AbstractModel):
|
class ContractAbstractContract(models.AbstractModel):
|
||||||
_inherit = "contract.abstract.contract"
|
_inherit = "contract.abstract.contract"
|
||||||
|
|
||||||
type = fields.Selection(
|
|
||||||
[("invoice", "Invoice"), ("sale", "Sale")],
|
|
||||||
string="Type",
|
|
||||||
default="invoice",
|
|
||||||
required=True,
|
|
||||||
)
|
|
||||||
sale_autoconfirm = fields.Boolean(string="Sale Autoconfirm")
|
sale_autoconfirm = fields.Boolean(string="Sale Autoconfirm")
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _get_generation_type_selection(self):
|
||||||
|
res = super()._get_generation_type_selection()
|
||||||
|
res.append(("sale", "Sale"))
|
||||||
|
return res
|
||||||
|
|||||||
@@ -114,39 +114,13 @@ class ContractContract(models.Model):
|
|||||||
|
|
||||||
def _recurring_create_sale(self, date_ref=False):
|
def _recurring_create_sale(self, date_ref=False):
|
||||||
sales_values = self._prepare_recurring_sales_values(date_ref)
|
sales_values = self._prepare_recurring_sales_values(date_ref)
|
||||||
so_rec = self.env["sale.order"].create(sales_values)
|
sale_orders = self.env["sale.order"].create(sales_values)
|
||||||
for _rec in self.filtered(lambda c: c.sale_autoconfirm):
|
sale_orders_to_confirm = sale_orders.filtered(
|
||||||
so_rec.action_confirm()
|
lambda sale: sale.contract_auto_confirm
|
||||||
return so_rec
|
)
|
||||||
|
sale_orders_to_confirm.action_confirm()
|
||||||
|
return sale_orders
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def cron_recurring_create_sale(self, date_ref=None):
|
def cron_recurring_create_sale(self, date_ref=None):
|
||||||
if not date_ref:
|
return self._cron_recurring_create(date_ref, create_type="sale")
|
||||||
date_ref = fields.Date.context_today(self)
|
|
||||||
domain = self._get_contracts_to_invoice_domain(date_ref)
|
|
||||||
domain.extend([("type", "=", "sale")])
|
|
||||||
sales = self.env["sale.order"]
|
|
||||||
# Sales by companies, so assignation emails get correct context
|
|
||||||
companies_to_sale = self.read_group(domain, ["company_id"], ["company_id"])
|
|
||||||
for row in companies_to_sale:
|
|
||||||
contracts_to_sale = self.search(row["__domain"]).with_context(
|
|
||||||
allowed_company_ids=[row["company_id"][0]]
|
|
||||||
)
|
|
||||||
sales |= contracts_to_sale._recurring_create_sale(date_ref)
|
|
||||||
return sales
|
|
||||||
|
|
||||||
@api.model
|
|
||||||
def cron_recurring_create_invoice(self, date_ref=None):
|
|
||||||
if not date_ref:
|
|
||||||
date_ref = fields.Date.context_today(self)
|
|
||||||
domain = self._get_contracts_to_invoice_domain(date_ref)
|
|
||||||
domain.extend([("type", "=", "invoice")])
|
|
||||||
invoices = self.env["account.move"]
|
|
||||||
# Invoice by companies, so assignation emails get correct context
|
|
||||||
companies_to_invoice = self.read_group(domain, ["company_id"], ["company_id"])
|
|
||||||
for row in companies_to_invoice:
|
|
||||||
contracts_to_invoice = self.search(row["__domain"]).with_context(
|
|
||||||
allowed_company_ids=[row["company_id"][0]]
|
|
||||||
)
|
|
||||||
invoices |= contracts_to_invoice._recurring_create_invoice(date_ref)
|
|
||||||
return invoices
|
|
||||||
|
|||||||
24
contract_sale_generation/models/sale_order.py
Normal file
24
contract_sale_generation/models/sale_order.py
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Copyright 2021 ACSONE SA/NV (<http://acsone.eu>)
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
||||||
|
|
||||||
|
from odoo import fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class SaleOrder(models.Model):
|
||||||
|
_inherit = "sale.order"
|
||||||
|
|
||||||
|
contract_auto_confirm = fields.Boolean(
|
||||||
|
compute="_compute_contract_auto_confirm",
|
||||||
|
help="This is a technical field in order to know if the order should"
|
||||||
|
"be automatically confirmed if generated by contract.",
|
||||||
|
)
|
||||||
|
|
||||||
|
def _compute_contract_auto_confirm(self):
|
||||||
|
sale_auto_confirm = self.filtered(
|
||||||
|
lambda sale: any(
|
||||||
|
line.contract_line_id.contract_id.sale_autoconfirm
|
||||||
|
for line in sale.order_line
|
||||||
|
)
|
||||||
|
)
|
||||||
|
sale_auto_confirm.contract_auto_confirm = True
|
||||||
|
(self - sale_auto_confirm).contract_auto_confirm = False
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
* Angel Moya <angel.moya@pesol.es>
|
* Angel Moya <angel.moya@pesol.es>
|
||||||
* Florent THOMAS <florent.thomas@mind-and-go.com>
|
* Florent THOMAS <florent.thomas@mind-and-go.com>
|
||||||
* Serpent Consulting Services Pvt. Ltd. <support@serpentcs.com>
|
* Serpent Consulting Services Pvt. Ltd. <support@serpentcs.com>
|
||||||
|
* Denis Roussel <denis.roussel@acsone.eu>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
|
<meta name="generator" content="Docutils: http://docutils.sourceforge.net/" />
|
||||||
<title>Contracts Management - Recurring Sales</title>
|
<title>Contracts Management - Recurring Sales</title>
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
|
|
||||||
@@ -367,7 +367,7 @@ ul.auto-toc {
|
|||||||
!! This file is generated by oca-gen-addon-readme !!
|
!! This file is generated by oca-gen-addon-readme !!
|
||||||
!! changes will be overwritten. !!
|
!! changes will be overwritten. !!
|
||||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||||||
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/contract/tree/12.0/contract_sale_generation"><img alt="OCA/contract" src="https://img.shields.io/badge/github-OCA%2Fcontract-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/contract-12-0/contract-12-0-contract_sale_generation"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/110/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
|
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/contract/tree/14.0/contract_sale_generation"><img alt="OCA/contract" src="https://img.shields.io/badge/github-OCA%2Fcontract-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/contract-14-0/contract-14-0-contract_sale_generation"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/110/14.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
|
||||||
<p>This module extends functionality of contracts to be able to generate sales
|
<p>This module extends functionality of contracts to be able to generate sales
|
||||||
orders instead of invoices.</p>
|
orders instead of invoices.</p>
|
||||||
<p><strong>Table of contents</strong></p>
|
<p><strong>Table of contents</strong></p>
|
||||||
@@ -400,7 +400,7 @@ orders instead of invoices.</p>
|
|||||||
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/contract/issues">GitHub Issues</a>.
|
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/contract/issues">GitHub Issues</a>.
|
||||||
In case of trouble, please check there if your issue has already been reported.
|
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
|
If you spotted it first, help us smashing it by providing a detailed and welcomed
|
||||||
<a class="reference external" href="https://github.com/OCA/contract/issues/new?body=module:%20contract_sale_generation%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
|
<a class="reference external" href="https://github.com/OCA/contract/issues/new?body=module:%20contract_sale_generation%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
|
||||||
<p>Do not contact contributors directly about support or help with technical issues.</p>
|
<p>Do not contact contributors directly about support or help with technical issues.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="credits">
|
<div class="section" id="credits">
|
||||||
@@ -408,6 +408,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
|
|||||||
<div class="section" id="authors">
|
<div class="section" id="authors">
|
||||||
<h2><a class="toc-backref" href="#id4">Authors</a></h2>
|
<h2><a class="toc-backref" href="#id4">Authors</a></h2>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
|
<li>ACSONE SA/NV</li>
|
||||||
<li>PESOL</li>
|
<li>PESOL</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@@ -417,6 +418,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
|
|||||||
<li>Angel Moya <<a class="reference external" href="mailto:angel.moya@pesol.es">angel.moya@pesol.es</a>></li>
|
<li>Angel Moya <<a class="reference external" href="mailto:angel.moya@pesol.es">angel.moya@pesol.es</a>></li>
|
||||||
<li>Florent THOMAS <<a class="reference external" href="mailto:florent.thomas@mind-and-go.com">florent.thomas@mind-and-go.com</a>></li>
|
<li>Florent THOMAS <<a class="reference external" href="mailto:florent.thomas@mind-and-go.com">florent.thomas@mind-and-go.com</a>></li>
|
||||||
<li>Serpent Consulting Services Pvt. Ltd. <<a class="reference external" href="mailto:support@serpentcs.com">support@serpentcs.com</a>></li>
|
<li>Serpent Consulting Services Pvt. Ltd. <<a class="reference external" href="mailto:support@serpentcs.com">support@serpentcs.com</a>></li>
|
||||||
|
<li>Denis Roussel <<a class="reference external" href="mailto:denis.roussel@acsone.eu">denis.roussel@acsone.eu</a>></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="maintainers">
|
<div class="section" id="maintainers">
|
||||||
@@ -426,7 +428,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
|
|||||||
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
|
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
|
||||||
mission is to support the collaborative development of Odoo features and
|
mission is to support the collaborative development of Odoo features and
|
||||||
promote its widespread use.</p>
|
promote its widespread use.</p>
|
||||||
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/contract/tree/12.0/contract_sale_generation">OCA/contract</a> project on GitHub.</p>
|
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/contract/tree/14.0/contract_sale_generation">OCA/contract</a> project on GitHub.</p>
|
||||||
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
|
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -2,78 +2,83 @@
|
|||||||
# Copyright 2017 Pesol (<http://pesol.es>)
|
# Copyright 2017 Pesol (<http://pesol.es>)
|
||||||
# Copyright 2017 Angel Moya <angel.moya@pesol.es>
|
# Copyright 2017 Angel Moya <angel.moya@pesol.es>
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
from freezegun import freeze_time
|
||||||
|
|
||||||
from odoo import fields
|
from odoo import fields
|
||||||
from odoo.exceptions import ValidationError
|
from odoo.exceptions import ValidationError
|
||||||
from odoo.tests.common import TransactionCase
|
from odoo.tests import Form
|
||||||
|
from odoo.tests.common import SavepointCase
|
||||||
|
|
||||||
|
|
||||||
def to_date(date):
|
def to_date(date):
|
||||||
return fields.Date.to_date(date)
|
return fields.Date.to_date(date)
|
||||||
|
|
||||||
|
|
||||||
class TestContractSale(TransactionCase):
|
class TestContractSale(SavepointCase):
|
||||||
# Use case : Prepare some data for current test case
|
# Use case : Prepare some data for current test case
|
||||||
|
|
||||||
def setUp(self):
|
@classmethod
|
||||||
super(TestContractSale, self).setUp()
|
def setUpClass(cls):
|
||||||
self.pricelist = self.env["product.pricelist"].create(
|
super().setUpClass()
|
||||||
|
contract_date = "2020-01-15"
|
||||||
|
cls.pricelist = cls.env["product.pricelist"].create(
|
||||||
{
|
{
|
||||||
"name": "pricelist for contract test",
|
"name": "pricelist for contract test",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
self.partner = self.env["res.partner"].create(
|
cls.partner = cls.env["res.partner"].create(
|
||||||
{
|
{
|
||||||
"name": "partner test contract",
|
"name": "partner test contract",
|
||||||
"property_product_pricelist": self.pricelist.id,
|
"property_product_pricelist": cls.pricelist.id,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
self.product_1 = self.env.ref("product.product_product_1")
|
cls.product_1 = cls.env.ref("product.product_product_1")
|
||||||
self.product_1.taxes_id += self.env["account.tax"].search(
|
cls.product_1.taxes_id += cls.env["account.tax"].search(
|
||||||
[("type_tax_use", "=", "sale")], limit=1
|
[("type_tax_use", "=", "sale")], limit=1
|
||||||
)
|
)
|
||||||
self.product_1.description_sale = "Test description sale"
|
cls.product_1.description_sale = "Test description sale"
|
||||||
self.line_template_vals = {
|
cls.line_template_vals = {
|
||||||
"product_id": self.product_1.id,
|
"product_id": cls.product_1.id,
|
||||||
"name": "Test Contract Template",
|
"name": "Test Contract Template",
|
||||||
"quantity": 1,
|
"quantity": 1,
|
||||||
"uom_id": self.product_1.uom_id.id,
|
"uom_id": cls.product_1.uom_id.id,
|
||||||
"price_unit": 100,
|
"price_unit": 100,
|
||||||
"discount": 50,
|
"discount": 50,
|
||||||
"recurring_rule_type": "yearly",
|
"recurring_rule_type": "yearly",
|
||||||
"recurring_interval": 1,
|
"recurring_interval": 1,
|
||||||
}
|
}
|
||||||
self.template_vals = {
|
cls.template_vals = {
|
||||||
"name": "Test Contract Template",
|
"name": "Test Contract Template",
|
||||||
|
"contract_type": "sale",
|
||||||
"contract_line_ids": [
|
"contract_line_ids": [
|
||||||
(0, 0, self.line_template_vals),
|
(0, 0, cls.line_template_vals),
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
self.template = self.env["contract.template"].create(self.template_vals)
|
cls.template = cls.env["contract.template"].create(cls.template_vals)
|
||||||
# For being sure of the applied price
|
# For being sure of the applied price
|
||||||
self.env["product.pricelist.item"].create(
|
cls.env["product.pricelist.item"].create(
|
||||||
{
|
{
|
||||||
"pricelist_id": self.partner.property_product_pricelist.id,
|
"pricelist_id": cls.partner.property_product_pricelist.id,
|
||||||
"product_id": self.product_1.id,
|
"product_id": cls.product_1.id,
|
||||||
"compute_price": "formula",
|
"compute_price": "formula",
|
||||||
"base": "list_price",
|
"base": "list_price",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
self.contract = self.env["contract.contract"].create(
|
cls.contract = cls.env["contract.contract"].create(
|
||||||
{
|
{
|
||||||
"name": "Test Contract",
|
"name": "Test Contract",
|
||||||
"partner_id": self.partner.id,
|
"partner_id": cls.partner.id,
|
||||||
"pricelist_id": self.partner.property_product_pricelist.id,
|
"pricelist_id": cls.partner.property_product_pricelist.id,
|
||||||
"type": "sale",
|
"generation_type": "sale",
|
||||||
"sale_autoconfirm": False,
|
"sale_autoconfirm": False,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
self.line_vals = {
|
cls.line_vals = {
|
||||||
"contract_id": self.contract.id,
|
# "contract_id": cls.contract.id,
|
||||||
"product_id": self.product_1.id,
|
# "product_id": cls.product_1.id,
|
||||||
"name": "Services from #START# to #END#",
|
"name": "Services from #START# to #END#",
|
||||||
"quantity": 1,
|
"quantity": 1,
|
||||||
"uom_id": self.product_1.uom_id.id,
|
# "uom_id": cls.product_1.uom_id.id,
|
||||||
"price_unit": 100,
|
"price_unit": 100,
|
||||||
"discount": 50,
|
"discount": 50,
|
||||||
"recurring_rule_type": "monthly",
|
"recurring_rule_type": "monthly",
|
||||||
@@ -81,25 +86,36 @@ class TestContractSale(TransactionCase):
|
|||||||
"date_start": "2020-01-01",
|
"date_start": "2020-01-01",
|
||||||
"recurring_next_date": "2020-01-15",
|
"recurring_next_date": "2020-01-15",
|
||||||
}
|
}
|
||||||
self.contract.contract_template_id = self.template
|
with Form(cls.contract) as contract_form, freeze_time(contract_date):
|
||||||
self.contract._onchange_contract_template_id()
|
contract_form.contract_template_id = cls.template
|
||||||
self.contract_line = self.env["contract.line"].create(self.line_vals)
|
with contract_form.contract_line_ids.new() as line_form:
|
||||||
self.contract2 = self.env["contract.contract"].create(
|
line_form.product_id = cls.product_1
|
||||||
|
line_form.name = "Services from #START# to #END#"
|
||||||
|
line_form.quantity = 1
|
||||||
|
line_form.price_unit = 100.0
|
||||||
|
line_form.discount = 50
|
||||||
|
line_form.recurring_rule_type = "monthly"
|
||||||
|
line_form.recurring_interval = 1
|
||||||
|
line_form.date_start = "2020-01-15"
|
||||||
|
line_form.recurring_next_date = "2020-01-15"
|
||||||
|
cls.contract_line = cls.contract.contract_line_ids[1]
|
||||||
|
|
||||||
|
cls.contract2 = cls.env["contract.contract"].create(
|
||||||
{
|
{
|
||||||
"name": "Test Contract 2",
|
"name": "Test Contract 2",
|
||||||
"type": "sale",
|
"generation_type": "sale",
|
||||||
"partner_id": self.partner.id,
|
"partner_id": cls.partner.id,
|
||||||
"pricelist_id": self.partner.property_product_pricelist.id,
|
"pricelist_id": cls.partner.property_product_pricelist.id,
|
||||||
"contract_type": "purchase",
|
"contract_type": "purchase",
|
||||||
"contract_line_ids": [
|
"contract_line_ids": [
|
||||||
(
|
(
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
{
|
{
|
||||||
"product_id": self.product_1.id,
|
"product_id": cls.product_1.id,
|
||||||
"name": "Services from #START# to #END#",
|
"name": "Services from #START# to #END#",
|
||||||
"quantity": 1,
|
"quantity": 1,
|
||||||
"uom_id": self.product_1.uom_id.id,
|
"uom_id": cls.product_1.uom_id.id,
|
||||||
"price_unit": 100,
|
"price_unit": 100,
|
||||||
"discount": 50,
|
"discount": 50,
|
||||||
"recurring_rule_type": "monthly",
|
"recurring_rule_type": "monthly",
|
||||||
@@ -156,6 +172,7 @@ class TestContractSale(TransactionCase):
|
|||||||
self.contract.contract_template_id = self.template
|
self.contract.contract_template_id = self.template
|
||||||
self.contract._onchange_contract_template_id()
|
self.contract._onchange_contract_template_id()
|
||||||
res = {
|
res = {
|
||||||
|
"contract_type": "sale",
|
||||||
"contract_line_ids": [
|
"contract_line_ids": [
|
||||||
(
|
(
|
||||||
0,
|
0,
|
||||||
@@ -171,7 +188,7 @@ class TestContractSale(TransactionCase):
|
|||||||
"recurring_interval": 1,
|
"recurring_interval": 1,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
]
|
],
|
||||||
}
|
}
|
||||||
del self.template_vals["name"]
|
del self.template_vals["name"]
|
||||||
self.assertDictEqual(res, self.template_vals)
|
self.assertDictEqual(res, self.template_vals)
|
||||||
@@ -195,11 +212,11 @@ class TestContractSale(TransactionCase):
|
|||||||
self.contract_line.date_start = "2020-01-01"
|
self.contract_line.date_start = "2020-01-01"
|
||||||
self.contract_line.recurring_invoicing_type = "post-paid"
|
self.contract_line.recurring_invoicing_type = "post-paid"
|
||||||
self.contract_line.date_end = "2020-03-15"
|
self.contract_line.date_end = "2020-03-15"
|
||||||
self.contract_line._onchange_date_start()
|
self.contract_line._onchange_is_auto_renew()
|
||||||
contracts = self.contract2
|
contracts = self.contract2
|
||||||
for _i in range(10):
|
for _i in range(10):
|
||||||
contracts |= self.contract.copy({"type": "sale"})
|
contracts |= self.contract.copy({"generation_type": "sale"})
|
||||||
self.env["contract.contract"].cron_recurring_create_sale()
|
self.env["contract.contract"]._cron_recurring_create(create_type="sale")
|
||||||
order_lines = self.env["sale.order.line"].search(
|
order_lines = self.env["sale.order.line"].search(
|
||||||
[("contract_line_id", "in", contracts.mapped("contract_line_ids").ids)]
|
[("contract_line_id", "in", contracts.mapped("contract_line_ids").ids)]
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -10,9 +10,9 @@
|
|||||||
name="recurring_sale_or_invoicing"
|
name="recurring_sale_or_invoicing"
|
||||||
string="Recurring Sales/Invoicing"
|
string="Recurring Sales/Invoicing"
|
||||||
>
|
>
|
||||||
<field name="type" />
|
<field name="generation_type" />
|
||||||
<field
|
<field
|
||||||
attrs="{'invisible':[('type','!=', 'sale')]}"
|
attrs="{'invisible':[('generation_type','!=', 'sale')]}"
|
||||||
name="sale_autoconfirm"
|
name="sale_autoconfirm"
|
||||||
/>
|
/>
|
||||||
</group>
|
</group>
|
||||||
@@ -23,11 +23,11 @@
|
|||||||
>
|
>
|
||||||
<attribute
|
<attribute
|
||||||
name="attrs"
|
name="attrs"
|
||||||
>{'invisible': ['|', ('create_invoice_visibility', '=', False),('type','!=','invoice')]}</attribute>
|
>{'invisible': ['|', ('create_invoice_visibility', '=', False),('generation_type','!=','invoice')]}</attribute>
|
||||||
</xpath>
|
</xpath>
|
||||||
<xpath expr="//button[@name='recurring_create_invoice']" position="before">
|
<xpath expr="//button[@name='recurring_create_invoice']" position="before">
|
||||||
<button
|
<button
|
||||||
attrs="{'invisible': [('type','!=','sale')]}"
|
attrs="{'invisible': [('generation_type','!=','sale')]}"
|
||||||
class="oe_link"
|
class="oe_link"
|
||||||
groups="base.group_no_one"
|
groups="base.group_no_one"
|
||||||
name="recurring_create_sale"
|
name="recurring_create_sale"
|
||||||
@@ -35,14 +35,15 @@
|
|||||||
type="object"
|
type="object"
|
||||||
/>
|
/>
|
||||||
</xpath>
|
</xpath>
|
||||||
|
<!--
|
||||||
<xpath expr="//button[@name='action_show_invoices']" position="attributes">
|
<xpath expr="//button[@name='action_show_invoices']" position="attributes">
|
||||||
<attribute
|
<attribute
|
||||||
name="attrs"
|
name="attrs"
|
||||||
>{'invisible': [('type','!=','invoice')]}</attribute>
|
>{'invisible': [('type','!=','invoice')]}</attribute>
|
||||||
</xpath>
|
</xpath>-->
|
||||||
<xpath expr="//button[@name='action_show_invoices']" position="after">
|
<xpath expr="//button[@name='action_show_invoices']" position="after">
|
||||||
<button
|
<button
|
||||||
attrs="{'invisible': [('type','!=','sale')]}"
|
attrs="{'invisible': [('generation_type','!=','sale')]}"
|
||||||
class="oe_stat_button"
|
class="oe_stat_button"
|
||||||
icon="fa-list"
|
icon="fa-list"
|
||||||
name="action_show_sales"
|
name="action_show_sales"
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
<odoo>
|
|
||||||
<record id="contract_template_form_view_inherit_sale" model="ir.ui.view">
|
|
||||||
<field name="name">contract.template form view (in contract)</field>
|
|
||||||
<field name="model">contract.template</field>
|
|
||||||
<field name="inherit_id" ref="contract.contract_template_form_view" />
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<xpath expr="//field[@name='pricelist_id']" position="after">
|
|
||||||
<field name="type" />
|
|
||||||
</xpath>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
</odoo>
|
|
||||||
Reference in New Issue
Block a user