[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,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>

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

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

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