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). |
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
||||
|
|
||||
|
from . import abstract_contract_line |
||||
from . import contract |
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