[IMP] contract_price_revision: black, isort, prettier

This commit is contained in:
Denis Roussel
2021-02-14 19:11:42 +01:00
parent fbf62c1036
commit 4569dcf841
9 changed files with 108 additions and 102 deletions

View File

@@ -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'],
} }

View File

@@ -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")

View File

@@ -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

View File

@@ -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)

View File

@@ -1,6 +1,5 @@
<?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" />
@@ -10,17 +9,17 @@
</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
name="variation_percent"
groups="base.group_no_one" groups="base.group_no_one"
attrs="{'invisible': [('predecessor_contract_line_id', '=', False)]}"/> attrs="{'invisible': [('predecessor_contract_line_id', '=', False)]}"
/>
</field> </field>
</field> </field>
</record> </record>
</odoo> </odoo>

View File

@@ -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")
.filtered(
lambda x: not x.automatic_price lambda x: not x.automatic_price
and not x.successor_contract_line_id and not x.successor_contract_line_id
and x.recurring_next_date and x.recurring_next_date
and (not x.date_end or x.date_end >= self.date_start) and (not x.date_end or x.date_end >= self.date_start)
) )
)
return to_revise return to_revise

View File

@@ -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>
@@ -21,20 +20,25 @@
</group> </group>
</group> </group>
<footer> <footer>
<button string="Apply" name="action_apply" <button
type="object" class="oe_highlight"/> string="Apply"
name="action_apply"
type="object"
class="oe_highlight"
/>
<button string="Cancel" class="oe_link" special="cancel" /> <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>

View File

@@ -0,0 +1 @@
../../../../contract_price_revision

View File

@@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)