mirror of
https://github.com/OCA/contract.git
synced 2025-02-13 17:57:24 +02:00
[IMP] contract_price_revision: black, isort, prettier
This commit is contained in:
@@ -3,22 +3,16 @@
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
|
||||
|
||||
{
|
||||
'name': 'Contract Price Revision',
|
||||
'summary': 'Easy revision of contract prices',
|
||||
'version': '12.0.1.0.1',
|
||||
'category': 'Contract',
|
||||
'author': 'Tecnativa, '
|
||||
'Odoo Community Association (OCA)',
|
||||
'license': 'AGPL-3',
|
||||
'website': 'https://github.com/OCA/contract',
|
||||
'depends': [
|
||||
'contract',
|
||||
],
|
||||
'data': [
|
||||
'views/contract_line.xml',
|
||||
'wizards/contract_price_revision_views.xml',
|
||||
],
|
||||
'installable': True,
|
||||
'development_status': 'Production/Stable',
|
||||
'maintainers': ['carlosdauden'],
|
||||
"name": "Contract Price Revision",
|
||||
"summary": "Easy revision of contract prices",
|
||||
"version": "12.0.1.0.1",
|
||||
"category": "Contract",
|
||||
"author": "Tecnativa, " "Odoo Community Association (OCA)",
|
||||
"license": "AGPL-3",
|
||||
"website": "https://github.com/OCA/contract",
|
||||
"depends": ["contract",],
|
||||
"data": ["views/contract_line.xml", "wizards/contract_price_revision_views.xml",],
|
||||
"installable": True,
|
||||
"development_status": "Production/Stable",
|
||||
"maintainers": ["carlosdauden"],
|
||||
}
|
||||
|
||||
@@ -13,8 +13,7 @@ def migrate(env, version):
|
||||
"""
|
||||
Update values from old previous_revision_id to predecessor_contract_line_id
|
||||
"""
|
||||
if not openupgrade.column_exists(
|
||||
env.cr, 'contract_line', 'previous_revision_id'):
|
||||
if not openupgrade.column_exists(env.cr, "contract_line", "previous_revision_id"):
|
||||
return
|
||||
|
||||
_logger.info("previous_revision_id to predecessor_contract_line_id")
|
||||
|
||||
@@ -3,29 +3,31 @@
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
|
||||
|
||||
from odoo import api, fields, models
|
||||
|
||||
import odoo.addons.decimal_precision as dp
|
||||
|
||||
|
||||
class ContractLine(models.Model):
|
||||
_inherit = 'contract.line'
|
||||
_inherit = "contract.line"
|
||||
|
||||
previous_price = fields.Float(
|
||||
string='Previous price',
|
||||
related='predecessor_contract_line_id.price_unit',
|
||||
string="Previous price",
|
||||
related="predecessor_contract_line_id.price_unit",
|
||||
readonly=True,
|
||||
)
|
||||
variation_percent = fields.Float(
|
||||
compute='_compute_variation_percent',
|
||||
compute="_compute_variation_percent",
|
||||
store=True,
|
||||
digits=dp.get_precision('Product Price'),
|
||||
string='Variation %',
|
||||
digits=dp.get_precision("Product Price"),
|
||||
string="Variation %",
|
||||
)
|
||||
|
||||
@api.depends('price_unit', 'predecessor_contract_line_id.price_unit')
|
||||
@api.depends("price_unit", "predecessor_contract_line_id.price_unit")
|
||||
def _compute_variation_percent(self):
|
||||
for line in self:
|
||||
if line.price_unit and line.previous_price:
|
||||
line.variation_percent = (
|
||||
(line.price_unit / line.previous_price - 1) * 100)
|
||||
line.price_unit / line.previous_price - 1
|
||||
) * 100
|
||||
else:
|
||||
line.variation_percent = 0.0
|
||||
|
||||
@@ -6,32 +6,36 @@ from odoo.addons.contract.tests.test_contract import TestContractBase
|
||||
|
||||
|
||||
class TestContractPriceRevision(TestContractBase):
|
||||
|
||||
def execute_wizard(self):
|
||||
wizard = self.env['contract.price.revision.wizard'].create({
|
||||
'date_start': '2018-02-15',
|
||||
'variation_percent': 100.0,
|
||||
})
|
||||
wizard.with_context(
|
||||
{'active_ids': [self.contract.id]}).action_apply()
|
||||
wizard = self.env["contract.price.revision.wizard"].create(
|
||||
{"date_start": "2018-02-15", "variation_percent": 100.0,}
|
||||
)
|
||||
wizard.with_context({"active_ids": [self.contract.id]}).action_apply()
|
||||
|
||||
def test_contract_price_revision_wizard(self):
|
||||
# This is for checking if this line is not versioned
|
||||
self.acct_line.copy({'automatic_price': True})
|
||||
self.acct_line.copy({"automatic_price": True})
|
||||
self.assertEqual(len(self.contract.contract_line_ids.ids), 2)
|
||||
self.execute_wizard()
|
||||
self.assertEqual(len(self.contract.contract_line_ids.ids), 3)
|
||||
lines = self.contract.contract_line_ids.filtered(
|
||||
lambda x: x.price_unit == 200.0)
|
||||
lambda x: x.price_unit == 200.0
|
||||
)
|
||||
self.assertEqual(len(lines), 1)
|
||||
|
||||
def test_contract_price_revision_invoicing(self):
|
||||
self.acct_line.copy({'automatic_price': True})
|
||||
self.acct_line.copy({"automatic_price": True})
|
||||
self.execute_wizard()
|
||||
invoice = self.contract.recurring_create_invoice()
|
||||
invoices = self.env['account.invoice'].search([
|
||||
('invoice_line_ids.contract_line_id', 'in',
|
||||
self.contract.contract_line_ids.ids)])
|
||||
invoices = self.env["account.invoice"].search(
|
||||
[
|
||||
(
|
||||
"invoice_line_ids.contract_line_id",
|
||||
"in",
|
||||
self.contract.contract_line_ids.ids,
|
||||
)
|
||||
]
|
||||
)
|
||||
self.assertEqual(len(invoices), 1)
|
||||
lines = invoice.invoice_line_ids
|
||||
self.assertEqual(len(lines), 2)
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<odoo>
|
||||
|
||||
<record id="contract_line_tree_view" model="ir.ui.view">
|
||||
<field name="model">contract.line</field>
|
||||
<field name="inherit_id" ref="contract.contract_line_tree_view" />
|
||||
@@ -10,17 +9,17 @@
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="contract_line_form_view" model="ir.ui.view">
|
||||
<field name="model">contract.line</field>
|
||||
<field name="inherit_id" ref="contract.contract_line_form_view" />
|
||||
<field name="arch" type="xml">
|
||||
<field name="discount" position="after">
|
||||
<field name="variation_percent"
|
||||
<field
|
||||
name="variation_percent"
|
||||
groups="base.group_no_one"
|
||||
attrs="{'invisible': [('predecessor_contract_line_id', '=', False)]}"/>
|
||||
attrs="{'invisible': [('predecessor_contract_line_id', '=', False)]}"
|
||||
/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
|
||||
@@ -5,60 +5,57 @@
|
||||
from dateutil.relativedelta import relativedelta
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
import odoo.addons.decimal_precision as dp
|
||||
|
||||
|
||||
class ContractPriceRevisionWizard(models.TransientModel):
|
||||
""" Update contract price based on percentage variation """
|
||||
_name = 'contract.price.revision.wizard'
|
||||
|
||||
_name = "contract.price.revision.wizard"
|
||||
_description = "Wizard to update price based on percentage variation"
|
||||
|
||||
date_start = fields.Date(
|
||||
required=True,
|
||||
)
|
||||
date_start = fields.Date(required=True,)
|
||||
date_end = fields.Date()
|
||||
variation_percent = fields.Float(
|
||||
digits=dp.get_precision('Product Price'),
|
||||
required=True,
|
||||
string='Variation %',
|
||||
digits=dp.get_precision("Product Price"), required=True, string="Variation %",
|
||||
)
|
||||
|
||||
def action_apply(self):
|
||||
ContractLine = self.env['contract.line']
|
||||
active_ids = self.env.context.get('active_ids')
|
||||
contracts = self.env['contract.contract'].browse(active_ids)
|
||||
ContractLine = self.env["contract.line"]
|
||||
active_ids = self.env.context.get("active_ids")
|
||||
contracts = self.env["contract.contract"].browse(active_ids)
|
||||
for line in self._get_contract_lines_to_revise(contracts):
|
||||
line.update({
|
||||
'date_end': self.date_start - relativedelta(days=1),
|
||||
})
|
||||
new_vals = line.copy_data({
|
||||
'date_start': self.date_start,
|
||||
'date_end': self.date_end,
|
||||
'predecessor_contract_line_id': line.id,
|
||||
'price_unit': line.price_unit * (
|
||||
1.0 + self.variation_percent / 100.0),
|
||||
})[0]
|
||||
line.update(
|
||||
{"date_end": self.date_start - relativedelta(days=1),}
|
||||
)
|
||||
new_vals = line.copy_data(
|
||||
{
|
||||
"date_start": self.date_start,
|
||||
"date_end": self.date_end,
|
||||
"predecessor_contract_line_id": line.id,
|
||||
"price_unit": line.price_unit
|
||||
* (1.0 + self.variation_percent / 100.0),
|
||||
}
|
||||
)[0]
|
||||
tmp_line = ContractLine.new(new_vals)
|
||||
tmp_line._onchange_date_start()
|
||||
new_line = ContractLine.create(
|
||||
tmp_line._convert_to_write(tmp_line._cache))
|
||||
line.update({
|
||||
'successor_contract_line_id': new_line.id,
|
||||
})
|
||||
action = self.env['ir.actions.act_window'].for_xml_id(
|
||||
'contract', 'action_customer_contract')
|
||||
action['domain'] = [('id', 'in', active_ids)]
|
||||
new_line = ContractLine.create(tmp_line._convert_to_write(tmp_line._cache))
|
||||
line.update(
|
||||
{"successor_contract_line_id": new_line.id,}
|
||||
)
|
||||
action = self.env["ir.actions.act_window"].for_xml_id(
|
||||
"contract", "action_customer_contract"
|
||||
)
|
||||
action["domain"] = [("id", "in", active_ids)]
|
||||
return action
|
||||
|
||||
def _get_contract_lines_to_revise(self, contracts):
|
||||
self.ensure_one()
|
||||
to_revise = (
|
||||
contracts.mapped("contract_line_ids")
|
||||
.filtered(
|
||||
to_revise = contracts.mapped("contract_line_ids").filtered(
|
||||
lambda x: not x.automatic_price
|
||||
and not x.successor_contract_line_id
|
||||
and x.recurring_next_date
|
||||
and (not x.date_end or x.date_end >= self.date_start)
|
||||
)
|
||||
)
|
||||
return to_revise
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<odoo>
|
||||
|
||||
<record id="contract_line_duplicate_wizard_view" model="ir.ui.view">
|
||||
<field name="name">Create Revision Line</field>
|
||||
<field name="model">contract.price.revision.wizard</field>
|
||||
@@ -21,20 +20,25 @@
|
||||
</group>
|
||||
</group>
|
||||
<footer>
|
||||
<button string="Apply" name="action_apply"
|
||||
type="object" class="oe_highlight"/>
|
||||
<button
|
||||
string="Apply"
|
||||
name="action_apply"
|
||||
type="object"
|
||||
class="oe_highlight"
|
||||
/>
|
||||
<button string="Cancel" class="oe_link" special="cancel" />
|
||||
</footer>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<act_window id="contract_line_duplicate_wizard_action"
|
||||
<act_window
|
||||
id="contract_line_duplicate_wizard_action"
|
||||
name="Create revision of contract lines"
|
||||
src_model="contract.contract"
|
||||
res_model="contract.price.revision.wizard"
|
||||
view_type="form" view_mode="form"
|
||||
key2="client_action_multi" target="new"
|
||||
view_type="form"
|
||||
view_mode="form"
|
||||
key2="client_action_multi"
|
||||
target="new"
|
||||
/>
|
||||
|
||||
</odoo>
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
../../../../contract_price_revision
|
||||
6
setup/contract_price_revision/setup.py
Normal file
6
setup/contract_price_revision/setup.py
Normal file
@@ -0,0 +1,6 @@
|
||||
import setuptools
|
||||
|
||||
setuptools.setup(
|
||||
setup_requires=['setuptools-odoo'],
|
||||
odoo_addon=True,
|
||||
)
|
||||
Reference in New Issue
Block a user