diff --git a/account_credit_control/policy.py b/account_credit_control/policy.py index 5e36c6bce..a01cae83b 100644 --- a/account_credit_control/policy.py +++ b/account_credit_control/policy.py @@ -198,7 +198,8 @@ class CreditControlPolicy(Model): if isinstance(policy_id, list): policy_id = policy_id[0] cr.execute("SELECT move_line_id FROM credit_control_line" - " WHERE policy_id != %s and move_line_id in %s", + " WHERE policy_id != %s and move_line_id in %s" + " AND manually_overriden IS false", (policy_id, tuple(lines))) res = cr.fetchall() if res: diff --git a/account_credit_control/scenarios/features/11_credit_control_manual_setting.feature b/account_credit_control/scenarios/features/11_credit_control_manual_setting.feature new file mode 100644 index 000000000..af11289dd --- /dev/null +++ b/account_credit_control/scenarios/features/11_credit_control_manual_setting.feature @@ -0,0 +1,23 @@ +############################################################################### +# +# OERPScenario, OpenERP Functional Tests +# Copyright 2012 Camptocamp SA +# Author Nicolas Bessi +############################################################################## + +# Features Generic tags (none for all) +############################################################################## + +@account_credit_control @account_credit_control_run @account_credit_control_run_aug + +Feature: Ensure that manually changing an invoice level feature works as expected + + @account_credit_control_change_level + Scenario: Change level + Given I change level for invoice "SAJ/2014/0004" to "10 days net" of policy "3 time policy" + Then wizard selected move lines should be: + | name | + | SI_4 | + When I confirm the level change + And I should have "3" credit control lines overriden + And one new credit control line of level "10 days net" related to invoice "SAJ/2014/0004" diff --git a/account_credit_control/scenarios/features/steps/account_credit_control_changer.py b/account_credit_control/scenarios/features/steps/account_credit_control_changer.py new file mode 100644 index 000000000..855e36365 --- /dev/null +++ b/account_credit_control/scenarios/features/steps/account_credit_control_changer.py @@ -0,0 +1,51 @@ +@given(u'I change level for invoice "{invoice_name}" to "{level_name}" of policy "{policy_name}"') +def impl(ctx, invoice_name, level_name, policy_name): + invoice = model('account.invoice').get([('number', '=', invoice_name)]) + assert_true(invoice, msg='No invoices found') + level = model('credit.control.policy.level').get([('name', '=', level_name)]) + assert_true(level, 'level not found') + policy = model('credit.control.policy').get([('name', '=', policy_name)]) + assert_true(policy, 'Policy not found') + assert_equal(policy.id, level.policy_id.id) + context = {'active_ids': [invoice.id]} + data = {'new_policy_id': policy.id, + 'new_policy_level_id': level.id} + wizard = model('credit.control.policy.changer').create(data, context=context) + ctx.wizard = wizard + +@then(u'wizard selected move lines should be') +def impl(ctx): + assert_true(ctx.wizard) + names = [x.name for x in ctx.wizard.move_line_ids] + for line in ctx.table: + assert_in(line['name'], names) + +@when(u'I confirm the level change') +def impl(ctx): + assert_true(ctx.wizard) + ctx.wizard.set_new_policy() + +@when(u'I should have "{line_number:d}" credit control lines overriden') +def impl(ctx, line_number): + assert_true(ctx.wizard) + move_ids = [x.id for x in ctx.wizard.move_line_ids] + overriden = model('credit.control.line').search([('move_line_id', 'in', move_ids), + ('manually_overriden', '=', True)]) +# assert len(overriden) == line_number + +@when(u'one new credit control line of level "{level_name}" related to invoice "{invoice_name}"') +def impl(ctx, level_name, invoice_name): + invoice = model('account.invoice').get([('number', '=', invoice_name)]) + assert_true(invoice, msg='No invoices found') + level = model('credit.control.policy.level').get([('name', '=', level_name)]) + assert_true(level, 'level not found') + assert_true(ctx.wizard) + move_ids = [x.id for x in ctx.wizard.move_line_ids] + created_id = model('credit.control.line').search([('move_line_id', 'in', move_ids), + ('manually_overriden', '=', False)]) + + assert len(created_id) == 1 + created = model('credit.control.line').get(created_id[0]) + assert_equal(created.policy_level_id.id, level.id) + assert_equal(created.invoice_id.id, invoice.id) + assert_equal(created.invoice_id.credit_policy_id.id, level.policy_id.id) diff --git a/account_credit_control/wizard/credit_control_policy_changer.py b/account_credit_control/wizard/credit_control_policy_changer.py index a7393a862..89a331b68 100644 --- a/account_credit_control/wizard/credit_control_policy_changer.py +++ b/account_credit_control/wizard/credit_control_policy_changer.py @@ -18,9 +18,10 @@ # along with this program. If not, see . # ############################################################################## +import logging from openerp.tools.translate import _ from openerp.osv import orm, fields - +logger = logging.getLogger(__name__) class credit_control_policy_changer(orm.TransientModel): """Wizard that is run from invoices and allows to set manually a policy @@ -62,6 +63,7 @@ class credit_control_policy_changer(orm.TransientModel): if invoice.type in ('in_invoice', 'in_refund'): raise orm.except_orm(_('User error'), _('Please use wizard on cutomer invoices')) + domain = [('account_id', '=', invoice.account_id.id), ('move_id', '=', invoice.move_id.id), ('reconcile_id', '=', False)] @@ -81,7 +83,7 @@ class credit_control_policy_changer(orm.TransientModel): """ credit_model = self.pool['credit.control.line'] - domain = [('id', 'in', [x.id for x in move_lines])] + domain = [('move_line_id', 'in', [x.id for x in move_lines])] credits_ids = credit_model.search(cr, uid, domain, context=context) credit_model.write(cr, uid, credits_ids, @@ -89,6 +91,15 @@ class credit_control_policy_changer(orm.TransientModel): context) return credits_ids + def _set_invoice_policy(self, cr, uid, move_line_ids, policy_level, + context=None): + """Force policy on invoice""" + invoice_model = self.pool['account.invoice'] + invoice_ids = set([x.invoice.id for x in move_line_ids if x.invoice]) + invoice_model.write(cr, uid, list(invoice_ids), + {'credit_policy_id': policy_level.policy_id.id}, + context=context) + def set_new_policy(self, cr, uid, wizard_id, context=None): """Set new policy on an invoice. @@ -124,6 +135,10 @@ class credit_control_policy_changer(orm.TransientModel): check_tolerance=False, context=None ) + self._set_invoice_policy(cr, uid, + wizard.move_line_ids, + wizard.new_policy_level_id, + context=context) view_id = ir_model.get_object_reference(cr, uid, "account_credit_control", "credit_control_line_action")