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