sbejaoui
6 years ago
6 changed files with 107 additions and 75 deletions
-
3contract_variable_quantity/models/__init__.py
-
18contract_variable_quantity/models/abstract_contract_line.py
-
73contract_variable_quantity/models/contract.py
-
41contract_variable_quantity/models/contract_line.py
-
34contract_variable_quantity/models/contract_line_formula.py
-
13contract_variable_quantity/tests/test_contract_variable_quantity.py
@ -1,3 +1,6 @@ |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from . import abstract_contract_line |
|||
from . import contract |
|||
from . import contract_line |
|||
from . import contract_line_formula |
@ -0,0 +1,18 @@ |
|||
# Copyright 2016 Tecnativa - Pedro M. Baeza |
|||
# Copyright 2018 Tecnativa - Carlos Dauden |
|||
# Copyright 2018 ACSONE SA/NV |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from odoo import fields, models |
|||
|
|||
|
|||
class AccountAbstractAnalyticContractLine(models.AbstractModel): |
|||
_inherit = 'account.abstract.analytic.contract.line' |
|||
|
|||
qty_type = fields.Selection( |
|||
selection=[ |
|||
('fixed', 'Fixed quantity'), |
|||
('variable', 'Variable quantity'), |
|||
], required=True, default='fixed', string="Qty. type") |
|||
qty_formula_id = fields.Many2one( |
|||
comodel_name="contract.line.qty.formula", string="Qty. formula") |
@ -0,0 +1,41 @@ |
|||
# Copyright 2016 Tecnativa - Pedro M. Baeza |
|||
# Copyright 2018 Tecnativa - Carlos Dauden |
|||
# Copyright 2018 ACSONE SA/NV |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from odoo import api, models |
|||
from odoo.tools import float_is_zero |
|||
from odoo.tools.safe_eval import safe_eval |
|||
|
|||
|
|||
class AccountAnalyticInvoiceLine(models.Model): |
|||
_inherit = 'account.analytic.invoice.line' |
|||
|
|||
@api.multi |
|||
def _prepare_invoice_line(self, invoice_id): |
|||
vals = super(AccountAnalyticInvoiceLine, self)._prepare_invoice_line( |
|||
invoice_id) |
|||
if self.qty_type == 'variable': |
|||
eval_context = { |
|||
'env': self.env, |
|||
'context': self.env.context, |
|||
'user': self.env.user, |
|||
'line': self, |
|||
'contract': self.contract_id, |
|||
'invoice': self.env['account.invoice'].browse(invoice_id), |
|||
} |
|||
safe_eval(self.qty_formula_id.code.strip(), eval_context, |
|||
mode="exec", nocopy=True) # nocopy for returning result |
|||
qty = eval_context.get('result', 0) |
|||
if self.contract_id.skip_zero_qty and float_is_zero( |
|||
qty, self.env['decimal.precision'].precision_get( |
|||
'Product Unit of Measure')): |
|||
# Return empty dict to skip line create |
|||
vals = {} |
|||
else: |
|||
vals['quantity'] = qty |
|||
# Re-evaluate price with this new quantity |
|||
vals['price_unit'] = self.with_context( |
|||
contract_line_qty=qty, |
|||
).price_unit |
|||
return vals |
@ -0,0 +1,34 @@ |
|||
# Copyright 2016 Tecnativa - Pedro M. Baeza |
|||
# Copyright 2018 Tecnativa - Carlos Dauden |
|||
# Copyright 2018 ACSONE SA/NV |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from odoo import _, api, fields, models, exceptions |
|||
from odoo.tools.safe_eval import safe_eval |
|||
|
|||
|
|||
class ContractLineFormula(models.Model): |
|||
_name = 'contract.line.qty.formula' |
|||
_description = 'Contract Line Formula' |
|||
|
|||
name = fields.Char(required=True, translate=True) |
|||
code = fields.Text(required=True, default="result = 0") |
|||
|
|||
@api.constrains('code') |
|||
def _check_code(self): |
|||
eval_context = { |
|||
'env': self.env, |
|||
'context': self.env.context, |
|||
'user': self.env.user, |
|||
'line': self.env['account.analytic.invoice.line'], |
|||
'contract': self.env['account.analytic.account'], |
|||
'invoice': self.env['account.invoice'], |
|||
} |
|||
try: |
|||
safe_eval( |
|||
self.code.strip(), eval_context, mode="exec", nocopy=True) |
|||
except Exception as e: |
|||
raise exceptions.ValidationError( |
|||
_('Error evaluating code.\nDetails: %s') % e) |
|||
if 'result' not in eval_context: |
|||
raise exceptions.ValidationError(_('No valid result returned.')) |
Write
Preview
Loading…
Cancel
Save
Reference in new issue