From 0f0b4f4266ab7536d7ae0eba44f658b551b00fbb Mon Sep 17 00:00:00 2001 From: Yannick Tivisse Date: Tue, 19 Jul 2016 16:13:58 +0200 Subject: [PATCH] [MIG] account_budget: Migration to new API The following test have been removed because they were calling methods that doesn't exist anymore or looking for xmlids that doesn't exist anymore too. Since the new accounting the test imports were commented, because the features were removed I guess. - account_budget_report.yml - account_budget_spread.yml The 'test/demo' account_budget_demo.yml was something like a common.py file so the test account_budget_report.yml was rewritten in python with a common file and the test test_theoreticalamount.py has been adapted accordingly (no more strange use to _update) For the rest of the migration, nothing particuliar to notice --- addons/account_budget/__openerp__.py | 11 +- .../data/account_budget_demo.xml | 6 +- .../data/account_budget_demo.yml | 174 ------------ .../data/account_budget_workflow.xml | 9 +- addons/account_budget/models/__init__.py | 2 +- .../models/account_analytic_account.py | 8 +- .../account_budget/models/account_budget.py | 253 +++++++----------- .../security/account_budget_security.xml | 4 +- addons/account_budget/test/account_budget.yml | 91 ------- .../test/account_budget_report.yml | 24 -- .../test/account_budget_spread.yml | 19 -- addons/account_budget/tests/__init__.py | 5 + addons/account_budget/tests/common.py | 172 ++++++++++++ .../tests/test_account_budget.py | 82 ++++++ .../tests/test_theoreticalamount.py | 57 ++-- .../views/account_analytic_account_views.xml | 8 +- .../views/account_budget_views.xml | 8 +- 17 files changed, 410 insertions(+), 523 deletions(-) delete mode 100644 addons/account_budget/data/account_budget_demo.yml delete mode 100644 addons/account_budget/test/account_budget.yml delete mode 100644 addons/account_budget/test/account_budget_report.yml delete mode 100644 addons/account_budget/test/account_budget_spread.yml create mode 100644 addons/account_budget/tests/common.py create mode 100644 addons/account_budget/tests/test_account_budget.py diff --git a/addons/account_budget/__openerp__.py b/addons/account_budget/__openerp__.py index 289edb993a6..9b9efd35a0e 100644 --- a/addons/account_budget/__openerp__.py +++ b/addons/account_budget/__openerp__.py @@ -3,7 +3,6 @@ { 'name': 'Budgets Management', - 'version': '1.0', 'category': 'Accounting', 'description': """ This module allows accountants to manage analytic and crossovered budgets. @@ -37,13 +36,5 @@ Three reports are available: 'views/account_analytic_account_views.xml', 'views/account_budget_views.xml', ], - 'demo': ['data/account_budget_demo.xml', 'data/account_budget_demo.yml'], - 'test': [ - '../account/test/account_minimal_test.xml', - 'test/account_budget.yml', - 'test/account_budget_report.yml', - 'test/account_budget_spread.yml', - ], - 'installable': True, - 'auto_install': False, + 'demo': ['data/account_budget_demo.xml'], } diff --git a/addons/account_budget/data/account_budget_demo.xml b/addons/account_budget/data/account_budget_demo.xml index ff421bea628..2c8654419ee 100644 --- a/addons/account_budget/data/account_budget_demo.xml +++ b/addons/account_budget/data/account_budget_demo.xml @@ -1,5 +1,5 @@ - - + + @@ -19,4 +19,4 @@ - + diff --git a/addons/account_budget/data/account_budget_demo.yml b/addons/account_budget/data/account_budget_demo.yml deleted file mode 100644 index 2d4d8135e82..00000000000 --- a/addons/account_budget/data/account_budget_demo.yml +++ /dev/null @@ -1,174 +0,0 @@ -- - !python {model: ir.model.data} : | - import time - xml_id = self.pool.get('ir.model.data').xmlid_to_res_id(cr, uid, 'account.data_account_type_revenue') - account_ids = self.pool.get('account.account').search(cr, uid, [('user_type_id', '=', xml_id), ('tag_ids.name', 'in', ['Operating Activities'])]) - if account_ids: - vals = { - 'name': 'Sales', - 'account_ids': [(6, None, account_ids)], - } - self._update(cr, uid, 'account.budget.post', 'account_budget', vals, 'account_budget_post_sales0') - vals = { - 'analytic_account_id': ref('analytic.analytic_partners_camp_to_camp'), - 'general_budget_id': ref('account_budget_post_sales0'), - 'date_from': str(time.localtime(time.time())[0]+1)+'-01-01', - 'date_to': str(time.localtime(time.time())[0]+1)+'-01-31', - 'planned_amount': 500.0, - 'crossovered_budget_id': ref('crossovered_budget_budgetpessimistic0'), - } - self._update(cr, uid, 'crossovered.budget.lines', 'account_budget', vals, 'crossovered_budget_lines_2') - vals = { - 'analytic_account_id': ref('analytic.analytic_partners_camp_to_camp'), - 'general_budget_id': ref('account_budget_post_sales0'), - 'date_from': str(time.localtime(time.time())[0]+1)+'-02-07', - 'date_to': str(time.localtime(time.time())[0]+1)+'-02-28', - 'planned_amount': 900.0, - 'crossovered_budget_id': ref('crossovered_budget_budgetoptimistic0'), - } - self._update(cr, uid, 'crossovered.budget.lines', 'account_budget', vals, 'crossovered_budget_lines_3') - vals = { - 'analytic_account_id': ref('analytic.analytic_partners_camp_to_camp'), - 'general_budget_id': ref('account_budget_post_sales0'), - 'date_from': str(time.localtime(time.time())[0]+1)+'-03-01', - 'date_to': str(time.localtime(time.time())[0]+1)+'-03-15', - 'planned_amount': 300.0, - 'crossovered_budget_id': ref('crossovered_budget_budgetoptimistic0'), - } - self._update(cr, uid, 'crossovered.budget.lines', 'account_budget', vals, 'crossovered_budget_lines_4') - vals = { - 'analytic_account_id': ref('analytic.analytic_our_super_product'), - 'general_budget_id': ref('account_budget_post_sales0'), - 'date_from': str(time.localtime(time.time())[0]+1)+'-03-16', - 'paid_date': str(time.localtime(time.time())[0]+1)+'-12-03', - 'date_to': str(time.localtime(time.time())[0]+1)+'-03-31', - 'planned_amount': 375.0, - 'crossovered_budget_id': ref('crossovered_budget_budgetpessimistic0'), - } - self._update(cr, uid, 'crossovered.budget.lines', 'account_budget', vals, 'crossovered_budget_lines_5') - vals = { - 'analytic_account_id': ref('analytic.analytic_our_super_product'), - 'general_budget_id': ref('account_budget_post_sales0'), - 'date_from': str(time.localtime(time.time())[0]+1)+'-05-01', - 'paid_date': str(time.localtime(time.time())[0]+1)+'-12-03', - 'date_to': str(time.localtime(time.time())[0]+1)+'-05-31', - 'planned_amount': 375.0, - 'crossovered_budget_id': ref('crossovered_budget_budgetoptimistic0'), - } - self._update(cr, uid, 'crossovered.budget.lines', 'account_budget', vals, 'crossovered_budget_lines_7') - vals = { - 'analytic_account_id': ref('analytic.analytic_seagate_p2'), - 'general_budget_id': ref('account_budget_post_sales0'), - 'date_from': str(time.localtime(time.time())[0]+1)+'-07-16', - 'date_to': str(time.localtime(time.time())[0]+1)+'-07-31', - 'planned_amount': 20000.0, - 'crossovered_budget_id': ref('crossovered_budget_budgetpessimistic0'), - } - self._update(cr, uid, 'crossovered.budget.lines', 'account_budget', vals, 'crossovered_budget_lines_11') - vals = { - 'analytic_account_id': ref('analytic.analytic_seagate_p2'), - 'general_budget_id': ref('account_budget_post_sales0'), - 'date_from': str(time.localtime(time.time())[0]+1)+'-02-01', - 'date_to': str(time.localtime(time.time())[0]+1)+'-02-28', - 'planned_amount': 20000.0, - 'crossovered_budget_id': ref('crossovered_budget_budgetoptimistic0'), - } - self._update(cr, uid, 'crossovered.budget.lines', 'account_budget', vals, 'crossovered_budget_lines_12') - vals = { - 'analytic_account_id': ref('analytic.analytic_seagate_p2'), - 'general_budget_id': ref('account_budget_post_sales0'), - 'date_from': str(time.localtime(time.time())[0]+1)+'-09-16', - 'date_to': str(time.localtime(time.time())[0]+1)+'-09-30', - 'planned_amount': 10000.0, - 'crossovered_budget_id': ref('crossovered_budget_budgetpessimistic0'), - } - self._update(cr, uid, 'crossovered.budget.lines', 'account_budget', vals, 'crossovered_budget_lines_15') - vals = { - 'analytic_account_id': ref('analytic.analytic_seagate_p2'), - 'general_budget_id': ref('account_budget_post_sales0'), - 'date_from': str(time.localtime(time.time())[0]+1)+'-10-01', - 'date_to': str(time.localtime(time.time())[0]+1)+'-12-31', - 'planned_amount': 10000.0, - 'crossovered_budget_id': ref('crossovered_budget_budgetoptimistic0'), - } - self._update(cr, uid, 'crossovered.budget.lines', 'account_budget', vals, 'crossovered_budget_lines_16') - - account_ids = self.pool.get('account.account').search(cr, uid, [('user_type_id.name', '=', 'Expenses'), ('tag_ids.name', 'in', ['Operating Activities'])]) - if account_ids: - vals = { - 'name': 'Purchases', - 'account_ids': [(6, None, account_ids)], - } - self._update(cr, uid, 'account.budget.post', 'account_budget', vals, 'account_budget_post_purchase0') - vals = { - 'analytic_account_id': ref('analytic.analytic_partners_camp_to_camp'), - 'general_budget_id': ref('account_budget_post_purchase0'), - 'date_from': str(time.localtime(time.time())[0]+1)+'-01-01', - 'date_to': str(time.localtime(time.time())[0]+1)+'-01-31', - 'planned_amount': -500.0, - 'crossovered_budget_id': ref('crossovered_budget_budgetpessimistic0'), - } - self._update(cr, uid, 'crossovered.budget.lines', 'account_budget', vals, 'crossovered_budget_lines_0') - vals = { - 'analytic_account_id': ref('analytic.analytic_partners_camp_to_camp'), - 'general_budget_id': ref('account_budget_post_purchase0'), - 'date_from': str(time.localtime(time.time())[0]+1)+'-02-01', - 'date_to': str(time.localtime(time.time())[0]+1)+'-02-28', - 'planned_amount': -250.0, - 'crossovered_budget_id': ref('crossovered_budget_budgetoptimistic0'), - } - self._update(cr, uid, 'crossovered.budget.lines', 'account_budget', vals, 'crossovered_budget_lines_1') - vals = { - 'analytic_account_id': ref('analytic.analytic_our_super_product'), - 'general_budget_id': ref('account_budget_post_purchase0'), - 'date_from': str(time.localtime(time.time())[0]+1)+'-04-01', - 'date_to': str(time.localtime(time.time())[0]+1)+'-04-30', - 'planned_amount': -150.0, - 'crossovered_budget_id': ref('crossovered_budget_budgetpessimistic0'), - } - self._update(cr, uid, 'crossovered.budget.lines', 'account_budget', vals, 'crossovered_budget_lines_6') - vals = { - 'analytic_account_id': ref('analytic.analytic_seagate_p2'), - 'general_budget_id': ref('account_budget_post_purchase0'), - 'date_from': str(time.localtime(time.time())[0]+1)+'-06-01', - 'date_to': str(time.localtime(time.time())[0]+1)+'-06-15', - 'planned_amount': -7500.0, - 'crossovered_budget_id': ref('crossovered_budget_budgetpessimistic0'), - } - self._update(cr, uid, 'crossovered.budget.lines', 'account_budget', vals, 'crossovered_budget_lines_8') - vals = { - 'analytic_account_id': ref('analytic.analytic_seagate_p2'), - 'general_budget_id': ref('account_budget_post_purchase0'), - 'date_from': str(time.localtime(time.time())[0]+1)+'-06-16', - 'date_to': str(time.localtime(time.time())[0]+1)+'-06-30', - 'planned_amount': -5000.0, - 'crossovered_budget_id': ref('crossovered_budget_budgetpessimistic0'), - } - self._update(cr, uid, 'crossovered.budget.lines', 'account_budget', vals, 'crossovered_budget_lines_9') - vals = { - 'analytic_account_id': ref('analytic.analytic_seagate_p2'), - 'general_budget_id': ref('account_budget_post_purchase0'), - 'date_from': str(time.localtime(time.time())[0]+1)+'-07-01', - 'date_to': str(time.localtime(time.time())[0]+1)+'-07-15', - 'planned_amount': -2000.0, - 'crossovered_budget_id': ref('crossovered_budget_budgetoptimistic0'), - } - self._update(cr, uid, 'crossovered.budget.lines', 'account_budget', vals, 'crossovered_budget_lines_10') - vals = { - 'analytic_account_id': ref('analytic.analytic_seagate_p2'), - 'general_budget_id': ref('account_budget_post_purchase0'), - 'date_from': str(time.localtime(time.time())[0]+1)+'-08-16', - 'date_to': str(time.localtime(time.time())[0]+1)+'-08-31', - 'planned_amount': -3000.0, - 'crossovered_budget_id': ref('crossovered_budget_budgetpessimistic0'), - } - self._update(cr, uid, 'crossovered.budget.lines', 'account_budget', vals, 'crossovered_budget_lines_13') - vals = { - 'analytic_account_id': ref('analytic.analytic_seagate_p2'), - 'general_budget_id': ref('account_budget_post_purchase0'), - 'date_from': str(time.localtime(time.time())[0]+1)+'-09-01', - 'date_to': str(time.localtime(time.time())[0]+1)+'-09-15', - 'planned_amount': -1000.0, - 'crossovered_budget_id': ref('crossovered_budget_budgetoptimistic0'), - } - self._update(cr, uid, 'crossovered.budget.lines', 'account_budget', vals, 'crossovered_budget_lines_14') diff --git a/addons/account_budget/data/account_budget_workflow.xml b/addons/account_budget/data/account_budget_workflow.xml index f285ff1e4c6..a0e890299ba 100644 --- a/addons/account_budget/data/account_budget_workflow.xml +++ b/addons/account_budget/data/account_budget_workflow.xml @@ -1,7 +1,5 @@ - - - - + + @@ -86,5 +84,4 @@ draft - - + diff --git a/addons/account_budget/models/__init__.py b/addons/account_budget/models/__init__.py index f2e78ebb530..84be2515324 100644 --- a/addons/account_budget/models/__init__.py +++ b/addons/account_budget/models/__init__.py @@ -2,4 +2,4 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. import account_budget -import account_analytic_account \ No newline at end of file +import account_analytic_account diff --git a/addons/account_budget/models/account_analytic_account.py b/addons/account_budget/models/account_analytic_account.py index ece8dde3b90..4f80f8ce7a8 100644 --- a/addons/account_budget/models/account_analytic_account.py +++ b/addons/account_budget/models/account_analytic_account.py @@ -1,11 +1,9 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from openerp.osv import fields, osv +from odoo import fields, models -class account_analytic_account(osv.osv): +class AccountAnalyticAccount(models.Model): _inherit = "account.analytic.account" - _columns = { - 'crossovered_budget_line': fields.one2many('crossovered.budget.lines', 'analytic_account_id', 'Budget Lines'), - } + crossovered_budget_line = fields.One2many('crossovered.budget.lines', 'analytic_account_id', 'Budget Lines') diff --git a/addons/account_budget/models/account_budget.py b/addons/account_budget/models/account_budget.py index 04c9a7bffaf..d3c94e8e445 100644 --- a/addons/account_budget/models/account_budget.py +++ b/addons/account_budget/models/account_budget.py @@ -1,205 +1,156 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from datetime import date, datetime - -from openerp.osv import fields, osv -from openerp.tools import ustr, DEFAULT_SERVER_DATE_FORMAT -from openerp.tools.translate import _ -from openerp.exceptions import UserError - -import openerp.addons.decimal_precision as dp - - -# --------------------------------------------------------- -# Utils -# --------------------------------------------------------- -def strToDate(dt): - return date(int(dt[0:4]), int(dt[5:7]), int(dt[8:10])) - -def strToDatetime(strdate): - return datetime.strptime(strdate, DEFAULT_SERVER_DATE_FORMAT) +from odoo import api, fields, models, _ +from odoo.tools import ustr +from odoo.exceptions import UserError # --------------------------------------------------------- # Budgets # --------------------------------------------------------- -class account_budget_post(osv.osv): +class AccountBudgetPost(models.Model): _name = "account.budget.post" - _description = "Budgetary Position" - _columns = { - 'name': fields.char('Name', required=True), - 'account_ids': fields.many2many('account.account', 'account_budget_rel', 'budget_id', 'account_id', 'Accounts', domain=[('deprecated', '=', False)]), - 'crossovered_budget_line': fields.one2many('crossovered.budget.lines', 'general_budget_id', 'Budget Lines'), - 'company_id': fields.many2one('res.company', 'Company', required=True), - } - _defaults = { - 'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'account.budget.post', context=c) - } _order = "name" + _description = "Budgetary Position" + + name = fields.Char('Name', required=True) + account_ids = fields.Many2many('account.account', 'account_budget_rel', 'budget_id', 'account_id', 'Accounts', + domain=[('deprecated', '=', False)]) + crossovered_budget_line = fields.One2many('crossovered.budget.lines', 'general_budget_id', 'Budget Lines') + company_id = fields.Many2one('res.company', 'Company', required=True, + default=lambda self: self.env['res.company']._company_default_get('account.budget.post')) - -class crossovered_budget(osv.osv): +class CrossoveredBudget(models.Model): _name = "crossovered.budget" _description = "Budget" _inherit = ['mail.thread'] - _columns = { - 'name': fields.char('Budget Name', required=True, states={'done':[('readonly',True)]}), - 'creating_user_id': fields.many2one('res.users', 'Responsible'), - 'date_from': fields.date('Start Date', required=True, states={'done':[('readonly',True)]}), - 'date_to': fields.date('End Date', required=True, states={'done':[('readonly',True)]}), - 'state' : fields.selection([('draft','Draft'),('cancel', 'Cancelled'),('confirm','Confirmed'),('validate','Validated'),('done','Done')], 'Status', select=True, required=True, readonly=True, copy=False, track_visibility='always'), - 'crossovered_budget_line': fields.one2many('crossovered.budget.lines', 'crossovered_budget_id', 'Budget Lines', states={'done':[('readonly',True)]}, copy=True), - 'company_id': fields.many2one('res.company', 'Company', required=True), - } + name = fields.Char('Budget Name', required=True, states={'done': [('readonly', True)]}) + creating_user_id = fields.Many2one('res.users', 'Responsible', default=lambda self: self.env.user) + date_from = fields.Date('Start Date', required=True, states={'done': [('readonly', True)]}) + date_to = fields.Date('End Date', required=True, states={'done': [('readonly', True)]}) + state = fields.Selection([ + ('draft', 'Draft'), + ('cancel', 'Cancelled'), + ('confirm', 'Confirmed'), + ('validate', 'Validated'), + ('done', 'Done') + ], 'Status', default='draft', index=True, required=True, readonly=True, copy=False, track_visibility='always') + crossovered_budget_line = fields.One2many('crossovered.budget.lines', 'crossovered_budget_id', 'Budget Lines', + states={'done': [('readonly', True)]}, copy=True) + company_id = fields.Many2one('res.company', 'Company', required=True, + default=lambda self: self.env['res.company']._company_default_get('account.budget.post')) - _defaults = { - 'state': 'draft', - 'creating_user_id': lambda self, cr, uid, context: uid, - 'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'account.budget.post', context=c) - } + @api.multi + def budget_confirm(self): + self.write({'state': 'confirm'}) - def budget_confirm(self, cr, uid, ids, *args): - self.write(cr, uid, ids, { - 'state': 'confirm' - }) - return True + @api.multi + def budget_draft(self): + self.write({'state': 'draft'}) - def budget_draft(self, cr, uid, ids, *args): - self.write(cr, uid, ids, { - 'state': 'draft' - }) - return True + @api.multi + def budget_validate(self): + self.write({'state': 'validate'}) - def budget_validate(self, cr, uid, ids, *args): - self.write(cr, uid, ids, { - 'state': 'validate', - }) - return True + @api.multi + def budget_cancel(self): + self.write({'state': 'cancel'}) - def budget_cancel(self, cr, uid, ids, *args): - self.write(cr, uid, ids, { - 'state': 'cancel' - }) - return True - - def budget_done(self, cr, uid, ids, *args): - self.write(cr, uid, ids, { - 'state': 'done' - }) - return True + @api.multi + def budget_done(self): + self.write({'state': 'done'}) -class crossovered_budget_lines(osv.osv): +class CrossoveredBudgetLines(models.Model): + _name = "crossovered.budget.lines" + _description = "Budget Line" - def _prac_amt(self, cr, uid, ids, context=None): - res = {} - result = 0.0 - if context is None: - context = {} - for line in self.browse(cr, uid, ids, context=context): - acc_ids = [x.id for x in line.general_budget_id.account_ids] + crossovered_budget_id = fields.Many2one('crossovered.budget', 'Budget', ondelete='cascade', select=True, required=True) + analytic_account_id = fields.Many2one('account.analytic.account', 'Analytic Account') + general_budget_id = fields.Many2one('account.budget.post', 'Budgetary Position', required=True) + date_from = fields.Date('Start Date', required=True) + date_to = fields.Date('End Date', required=True) + paid_date = fields.Date('Paid Date') + planned_amount = fields.Float('Planned Amount', required=True, digits=0) + practical_amount = fields.Float(compute='_compute_practical_amount', string='Practical Amount', digits=0) + theoritical_amount = fields.Float(compute='_compute_theoritical_amount', string='Theoretical Amount', digits=0) + percentage = fields.Float(compute='_compute_percentage', string='Achievement') + company_id = fields.Many2one(related='crossovered_budget_id.company_id', comodel_name='res.company', + string='Company', store=True, readonly=True) + + @api.multi + def _compute_practical_amount(self): + for line in self: + result = 0.0 + acc_ids = line.general_budget_id.account_ids.ids if not acc_ids: raise UserError(_("The Budget '%s' has no accounts!") % ustr(line.general_budget_id.name)) - date_to = context.get('wizard_date_to') or line.date_to - date_from = context.get('wizard_date_from') or line.date_from + date_to = self.env.context.get('wizard_date_to') or line.date_to + date_from = self.env.context.get('wizard_date_from') or line.date_from if line.analytic_account_id.id: - cr.execute("SELECT SUM(amount) FROM account_analytic_line WHERE account_id=%s AND (date " - "between to_date(%s,'yyyy-mm-dd') AND to_date(%s,'yyyy-mm-dd')) AND " - "general_account_id=ANY(%s)", (line.analytic_account_id.id, date_from, date_to,acc_ids,)) - result = cr.fetchone()[0] - if result is None: - result = 0.00 - res[line.id] = result - return res + self.env.cr.execute(""" + SELECT SUM(amount) + FROM account_analytic_line + WHERE account_id=%s + AND (date between to_date(%s,'yyyy-mm-dd') AND to_date(%s,'yyyy-mm-dd')) + AND general_account_id=ANY(%s)""", + (line.analytic_account_id.id, date_from, date_to, acc_ids,)) + result = self.env.cr.fetchone()[0] or 0.0 + line.practical_amount = result - def _prac(self, cr, uid, ids, name, args, context=None): - res={} - for line in self.browse(cr, uid, ids, context=context): - res[line.id] = self._prac_amt(cr, uid, [line.id], context=context)[line.id] - return res - - def _theo_amt(self, cr, uid, ids, context=None): - if context is None: - context = {} - - res = {} - for line in self.browse(cr, uid, ids, context=context): - today = datetime.now() + @api.multi + def _compute_theoritical_amount(self): + today = fields.Datetime.now() + for line in self: # Used for the report - if context.get('wizard_date_from') and context.get('wizard_date_to'): - date_from = strToDatetime(context.get('wizard_date_from')) - date_to = strToDatetime(context.get('wizard_date_to')) - if date_from < strToDatetime(line.date_from): - date_from = strToDatetime(line.date_from) - elif date_from > strToDatetime(line.date_to): + + if self.env.context.get('wizard_date_from') and self.env.context.get('wizard_date_to'): + date_from = fields.Datetime.from_string(self.env.context.get('wizard_date_from')) + date_to = fields.Datetime.from_string(self.env.context.get('wizard_date_to')) + if date_from < fields.Datetime.from_string(line.date_from): + date_from = fields.Datetime.from_string(line.date_from) + elif date_from > fields.Datetime.from_string(line.date_to): date_from = False - if date_to > strToDatetime(line.date_to): - date_to = strToDatetime(line.date_to) - elif date_to < strToDatetime(line.date_from): + if date_to > fields.Datetime.from_string(line.date_to): + date_to = fields.Datetime.from_string(line.date_to) + elif date_to < fields.Datetime.from_string(line.date_from): date_to = False theo_amt = 0.00 if date_from and date_to: - line_timedelta = strToDatetime(line.date_to) - strToDatetime(line.date_from) + line_timedelta = fields.Datetime.from_string(line.date_to) - fields.Datetime.from_string(line.date_from) elapsed_timedelta = date_to - date_from if elapsed_timedelta.days > 0: theo_amt = (elapsed_timedelta.total_seconds() / line_timedelta.total_seconds()) * line.planned_amount else: if line.paid_date: - if strToDate(line.date_to) <= strToDate(line.paid_date): + if fields.Datetime.from_string(line.date_to) <= fields.Datetime.from_string(line.paid_date): theo_amt = 0.00 else: theo_amt = line.planned_amount else: - - line_timedelta = strToDatetime(line.date_to) - strToDatetime(line.date_from) - elapsed_timedelta = today - (strToDatetime(line.date_from)) + print type(today) + line_timedelta = fields.Datetime.from_string(line.date_to) - fields.Datetime.from_string(line.date_from) + elapsed_timedelta = fields.Datetime.from_string(today) - (fields.Datetime.from_string(line.date_from)) if elapsed_timedelta.days < 0: # If the budget line has not started yet, theoretical amount should be zero theo_amt = 0.00 - elif line_timedelta.days > 0 and today < strToDatetime(line.date_to): + elif line_timedelta.days > 0 and fields.Datetime.from_string(today) < fields.Datetime.from_string(line.date_to): # If today is between the budget line date_from and date_to - # from pudb import set_trace; set_trace() theo_amt = (elapsed_timedelta.total_seconds() / line_timedelta.total_seconds()) * line.planned_amount else: theo_amt = line.planned_amount - res[line.id] = theo_amt - return res + line.theoritical_amount = theo_amt - def _theo(self, cr, uid, ids, name, args, context=None): - res = {} - for line in self.browse(cr, uid, ids, context=context): - res[line.id] = self._theo_amt(cr, uid, [line.id], context=context)[line.id] - return res - - def _perc(self, cr, uid, ids, name, args, context=None): - res = {} - for line in self.browse(cr, uid, ids, context=context): - if line.theoritical_amount <> 0.00: - res[line.id] = float((line.practical_amount or 0.0) / line.theoritical_amount) * 100 + @api.multi + def _compute_percentage(self): + for line in self: + if line.theoritical_amount != 0.00: + line.percentage = float((line.practical_amount or 0.0) / line.theoritical_amount) * 100 else: - res[line.id] = 0.00 - return res - - _name = "crossovered.budget.lines" - _description = "Budget Line" - _columns = { - 'crossovered_budget_id': fields.many2one('crossovered.budget', 'Budget', ondelete='cascade', select=True, required=True), - 'analytic_account_id': fields.many2one('account.analytic.account', 'Analytic Account'), - 'general_budget_id': fields.many2one('account.budget.post', 'Budgetary Position',required=True), - 'date_from': fields.date('Start Date', required=True), - 'date_to': fields.date('End Date', required=True), - 'paid_date': fields.date('Paid Date'), - 'planned_amount':fields.float('Planned Amount', required=True, digits=0), - 'practical_amount':fields.function(_prac, string='Practical Amount', type='float', digits=0), - 'theoritical_amount':fields.function(_theo, string='Theoretical Amount', type='float', digits=0), - 'percentage':fields.function(_perc, string='Achievement', type='float'), - 'company_id': fields.related('crossovered_budget_id', 'company_id', type='many2one', relation='res.company', string='Company', store=True, readonly=True) - } - - + line.percentage = 0.00 diff --git a/addons/account_budget/security/account_budget_security.xml b/addons/account_budget/security/account_budget_security.xml index 05a67c00077..edd9638188a 100644 --- a/addons/account_budget/security/account_budget_security.xml +++ b/addons/account_budget/security/account_budget_security.xml @@ -1,5 +1,5 @@ - + @@ -28,4 +28,4 @@ - + diff --git a/addons/account_budget/test/account_budget.yml b/addons/account_budget/test/account_budget.yml deleted file mode 100644 index bfc5fd207a2..00000000000 --- a/addons/account_budget/test/account_budget.yml +++ /dev/null @@ -1,91 +0,0 @@ -- - In order to check account budget module in OpenERP I created a budget with few budget positions -- - Checking if the budgetary positions have accounts or not -- - !python {model: ir.model.data} : | - if not self.pool.get('account.budget.post').browse(cr, uid, ref('account_budget_post_sales0')).account_ids: - vals = { - 'name': 'Product Sales - (test)', - 'code': 'X2020', - 'user_type_id': ref('account.data_account_type_revenue'), - 'tag_ids': [(6,0,[ref('account.account_tag_operating')])], - } - self._update(cr, uid, 'account.account', 'account_budget', vals, 'a_sale') - self.pool.get('account.budget.post').write(cr, uid, [ref('account_budget_post_sales0')], {'account_ids': [(6,0,[ref('a_sale')])]}) - if not self.pool.get('account.budget.post').browse(cr, uid, ref('account_budget_post_purchase0')).account_ids: - vals = { - 'name': 'Expense - (test)', - 'code': 'X2120', - 'user_type_id': ref('account.data_account_type_expenses'), - 'tag_ids': [(6,0,[ref('account.account_tag_operating')])], - } - self._update(cr, uid, 'account.account', 'account_budget', vals, 'a_expense') - self.pool.get('account.budget.post').write(cr, uid, [ref('account_budget_post_purchase0')], {'account_ids': [(6,0,[ref('a_expense')])]}) -- - Creating a crossovered.budget record -- - !record {model: crossovered.budget, id: crossovered_budget_budget0}: - date_from: !eval "'%s-01-01' %(datetime.now().year+1)" - date_to: !eval "'%s-12-31' %(datetime.now().year+1)" - name: !eval "'Budget %s' %(datetime.now().year+1)" - state: draft -- - I created two different budget lines -- - Modifying a crossovered.budget record -- - !record {model: crossovered.budget, id: crossovered_budget_budget0}: - crossovered_budget_line: - - analytic_account_id: analytic.analytic_partners_camp_to_camp - date_from: !eval "'%s-01-01' %(datetime.now().year+1)" - date_to: !eval "'%s-12-31' %(datetime.now().year+1)" - general_budget_id: account_budget.account_budget_post_purchase0 - planned_amount: 10000.0 - - analytic_account_id: analytic.analytic_our_super_product - date_from: !eval "'%s-09-01' %(datetime.now().year+1)" - date_to: !eval "'%s-09-30' %(datetime.now().year+1)" - general_budget_id: account_budget.account_budget_post_sales0 - planned_amount: 400000.0 - -- - I check that Initially Budget is in "draft" state -- - !assert {model: crossovered.budget, id: crossovered_budget_budget0}: - - state == 'draft' - -- - I pressed the confirm button to confirm the Budget -- - Performing a workflow action confirm on module crossovered.budget -- - !workflow {model: crossovered.budget, action: confirm, ref: crossovered_budget_budget0} -- - I check that budget is in "Confirmed" state -- - !assert {model: crossovered.budget, id: crossovered_budget_budget0}: - - state == 'confirm' - -- - I pressed the validate button to validate the Budget -- - Performing a workflow action validate on module crossovered.budget -- - !workflow {model: crossovered.budget, action: validate, ref: crossovered_budget_budget0} -- - I check that budget is in "Validated" state -- - !assert {model: crossovered.budget, id: crossovered_budget_budget0}: - - state == 'validate' - -- - I pressed the done button to set the Budget to "Done" state -- - Performing a workflow action done on module crossovered.budget -- - !workflow {model: crossovered.budget, action: done, ref: crossovered_budget_budget0} -- - I check that budget is in "done" state -- - !assert {model: crossovered.budget, id: crossovered_budget_budget0}: - - state == 'done' diff --git a/addons/account_budget/test/account_budget_report.yml b/addons/account_budget/test/account_budget_report.yml deleted file mode 100644 index a7abfbe2103..00000000000 --- a/addons/account_budget/test/account_budget_report.yml +++ /dev/null @@ -1,24 +0,0 @@ -- - Print the Analytic Budget Report through wizard -- - !python {model: account.analytic.account}: | - ctx = {'model': 'account.analytic.account','active_ids': [ref('analytic.analytic_internal')]} - from openerp.tools import test_reports - test_reports.try_report_action(cr, uid, 'action_account_budget_analytic',wiz_data={}, context=ctx, our_module='account_budget') - -- - Print the Budget Report through wizard -- - !python {model: account.budget.post}: | - ctx = {'model': 'account.budget.post','active_ids': [ref('account_budget.account_budget_post_sales0')]} - from openerp.tools import test_reports - test_reports.try_report_action(cr, uid, 'action_account_budget_report',wiz_data={}, context=ctx, our_module='account_budget') - -# FIXME: functionality is ok, but test fails, probably because of demo data -# - -# Print the CrossOvered Budget Report mode through wizard -# - -# !python {model: crossovered.budget}: | -# ctx = {'model': 'account.budget.post','active_ids': [ref('account_budget.crossovered_budget_budgetoptimistic0')]} -# from openerp.tools import test_reports -# test_reports.try_report_action(cr, uid, 'action_account_budget_crossvered_report',wiz_data={}, context=ctx, our_module='account_budget') diff --git a/addons/account_budget/test/account_budget_spread.yml b/addons/account_budget/test/account_budget_spread.yml deleted file mode 100644 index c996c647025..00000000000 --- a/addons/account_budget/test/account_budget_spread.yml +++ /dev/null @@ -1,19 +0,0 @@ -- - In order to test Spread Wizard of account_budget module I spread record with amount=1000 -- - Creating a account.budget.spread record -- - !record {model: account.budget.spread, id: account_budget_spread_0}: - amount: 1000.0 - fiscalyear: account.data_fiscalyear - - -- - Performing an osv_memory action check_spread on model account.budget.spread -- - !python {model: account.budget.spread}: | - self.check_spread(cr, uid, [ref("account_budget_spread_0")], {"lang": 'en_US', - "active_model": "account.budget.post", "active_ids": [ref("account_budget.account_budget_post_sales0")], - "tz": False, "active_id": ref("account_budget.account_budget_post_sales0"), - }) - diff --git a/addons/account_budget/tests/__init__.py b/addons/account_budget/tests/__init__.py index 106987b3a3c..f7e3c174b5b 100644 --- a/addons/account_budget/tests/__init__.py +++ b/addons/account_budget/tests/__init__.py @@ -1 +1,6 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import common import test_theoreticalamount +import test_account_budget diff --git a/addons/account_budget/tests/common.py b/addons/account_budget/tests/common.py new file mode 100644 index 00000000000..55774dd2f49 --- /dev/null +++ b/addons/account_budget/tests/common.py @@ -0,0 +1,172 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from openerp.addons.account.tests.account_test_classes import AccountingTestCase + +import time + +class TestAccountBudgetCommon(AccountingTestCase): + + def setUp(self): + super(TestAccountBudgetCommon, self).setUp() + account_ids = self.env['account.account'].search([ + ('user_type_id', '=', self.ref('account.data_account_type_revenue')), + ('tag_ids.name', 'in', ['Operating Activities']) + ]).ids + + if account_ids: + self.account_budget_post_sales0 = self.env['account.budget.post'].create({ + 'name': 'Sales', + 'account_ids': [(6, None, account_ids)], + }) + + self.env['crossovered.budget.lines'].create({ + 'analytic_account_id': self.ref('analytic.analytic_partners_camp_to_camp'), + 'general_budget_id': self.account_budget_post_sales0.id, + 'date_from': str(time.localtime(time.time())[0] + 1) + '-01-01', + 'date_to': str(time.localtime(time.time())[0] + 1) + '-01-31', + 'planned_amount': 500.0, + 'crossovered_budget_id': self.ref('account_budget.crossovered_budget_budgetpessimistic0'), + }) + self.env['crossovered.budget.lines'].create({ + 'analytic_account_id': self.ref('analytic.analytic_partners_camp_to_camp'), + 'general_budget_id': self.account_budget_post_sales0.id, + 'date_from': str(time.localtime(time.time())[0] + 1) + '-02-07', + 'date_to': str(time.localtime(time.time())[0] + 1) + '-02-28', + 'planned_amount': 900.0, + 'crossovered_budget_id': self.ref('account_budget.crossovered_budget_budgetoptimistic0'), + }) + self.env['crossovered.budget.lines'].create({ + 'analytic_account_id': self.ref('analytic.analytic_partners_camp_to_camp'), + 'general_budget_id': self.account_budget_post_sales0.id, + 'date_from': str(time.localtime(time.time())[0] + 1) + '-03-01', + 'date_to': str(time.localtime(time.time())[0] + 1) + '-03-15', + 'planned_amount': 300.0, + 'crossovered_budget_id': self.ref('account_budget.crossovered_budget_budgetoptimistic0'), + }) + self.env['crossovered.budget.lines'].create({ + 'analytic_account_id': self.ref('analytic.analytic_our_super_product'), + 'general_budget_id': self.account_budget_post_sales0.id, + 'date_from': str(time.localtime(time.time())[0] + 1) + '-03-16', + 'paid_date': str(time.localtime(time.time())[0] + 1) + '-12-03', + 'date_to': str(time.localtime(time.time())[0] + 1) + '-03-31', + 'planned_amount': 375.0, + 'crossovered_budget_id': self.ref('account_budget.crossovered_budget_budgetpessimistic0'), + }) + self.env['crossovered.budget.lines'].create({ + 'analytic_account_id': self.ref('analytic.analytic_our_super_product'), + 'general_budget_id': self.account_budget_post_sales0.id, + 'date_from': str(time.localtime(time.time())[0] + 1) + '-05-01', + 'paid_date': str(time.localtime(time.time())[0] + 1) + '-12-03', + 'date_to': str(time.localtime(time.time())[0] + 1) + '-05-31', + 'planned_amount': 375.0, + 'crossovered_budget_id': self.ref('account_budget.crossovered_budget_budgetoptimistic0'), + }) + self.env['crossovered.budget.lines'].create({ + 'analytic_account_id': self.ref('analytic.analytic_seagate_p2'), + 'general_budget_id': self.account_budget_post_sales0.id, + 'date_from': str(time.localtime(time.time())[0] + 1) + '-07-16', + 'date_to': str(time.localtime(time.time())[0] + 1) + '-07-31', + 'planned_amount': 20000.0, + 'crossovered_budget_id': self.ref('account_budget.crossovered_budget_budgetpessimistic0'), + }) + self.env['crossovered.budget.lines'].create({ + 'analytic_account_id': self.ref('analytic.analytic_seagate_p2'), + 'general_budget_id': self.account_budget_post_sales0.id, + 'date_from': str(time.localtime(time.time())[0] + 1) + '-02-01', + 'date_to': str(time.localtime(time.time())[0] + 1) + '-02-28', + 'planned_amount': 20000.0, + 'crossovered_budget_id': self.ref('account_budget.crossovered_budget_budgetoptimistic0'), + }) + self.env['crossovered.budget.lines'].create({ + 'analytic_account_id': self.ref('analytic.analytic_seagate_p2'), + 'general_budget_id': self.account_budget_post_sales0.id, + 'date_from': str(time.localtime(time.time())[0] + 1) + '-09-16', + 'date_to': str(time.localtime(time.time())[0] + 1) + '-09-30', + 'planned_amount': 10000.0, + 'crossovered_budget_id': self.ref('account_budget.crossovered_budget_budgetpessimistic0'), + }) + self.env['crossovered.budget.lines'].create({ + 'analytic_account_id': self.ref('analytic.analytic_seagate_p2'), + 'general_budget_id': self.account_budget_post_sales0.id, + 'date_from': str(time.localtime(time.time())[0] + 1) + '-10-01', + 'date_to': str(time.localtime(time.time())[0] + 1) + '-12-31', + 'planned_amount': 10000.0, + 'crossovered_budget_id': self.ref('account_budget.crossovered_budget_budgetoptimistic0'), + }) + + account_ids = self.env['account.account'].search([ + ('user_type_id.name', '=', 'Expenses'), + ('tag_ids.name', 'in', ['Operating Activities']) + ]).ids + + if account_ids: + self.account_budget_post_purchase0 = self.env['account.budget.post'].create({ + 'name': 'Purchases', + 'account_ids': [(6, None, account_ids)], + }) + + self.env['crossovered.budget.lines'].create({ + 'analytic_account_id': self.ref('analytic.analytic_partners_camp_to_camp'), + 'general_budget_id': self.account_budget_post_purchase0.id, + 'date_from': str(time.localtime(time.time())[0] + 1) + '-01-01', + 'date_to': str(time.localtime(time.time())[0] + 1) + '-01-31', + 'planned_amount': -500.0, + 'crossovered_budget_id': self.ref('account_budget.crossovered_budget_budgetpessimistic0'), + }) + self.env['crossovered.budget.lines'].create({ + 'analytic_account_id': self.ref('analytic.analytic_partners_camp_to_camp'), + 'general_budget_id': self.account_budget_post_purchase0.id, + 'date_from': str(time.localtime(time.time())[0] + 1) + '-02-01', + 'date_to': str(time.localtime(time.time())[0] + 1) + '-02-28', + 'planned_amount': -250.0, + 'crossovered_budget_id': self.ref('account_budget.crossovered_budget_budgetoptimistic0'), + }) + self.env['crossovered.budget.lines'].create({ + 'analytic_account_id': self.ref('analytic.analytic_our_super_product'), + 'general_budget_id': self.account_budget_post_purchase0.id, + 'date_from': str(time.localtime(time.time())[0] + 1) + '-04-01', + 'date_to': str(time.localtime(time.time())[0] + 1) + '-04-30', + 'planned_amount': -150.0, + 'crossovered_budget_id': self.ref('account_budget.crossovered_budget_budgetpessimistic0'), + }) + self.env['crossovered.budget.lines'].create({ + 'analytic_account_id': self.ref('analytic.analytic_seagate_p2'), + 'general_budget_id': self.account_budget_post_purchase0.id, + 'date_from': str(time.localtime(time.time())[0] + 1) + '-06-01', + 'date_to': str(time.localtime(time.time())[0] + 1) + '-06-15', + 'planned_amount': -7500.0, + 'crossovered_budget_id': self.ref('account_budget.crossovered_budget_budgetpessimistic0'), + }) + self.env['crossovered.budget.lines'].create({ + 'analytic_account_id': self.ref('analytic.analytic_seagate_p2'), + 'general_budget_id': self.account_budget_post_purchase0.id, + 'date_from': str(time.localtime(time.time())[0] + 1) + '-06-16', + 'date_to': str(time.localtime(time.time())[0] + 1) + '-06-30', + 'planned_amount': -5000.0, + 'crossovered_budget_id': self.ref('account_budget.crossovered_budget_budgetpessimistic0'), + }) + self.env['crossovered.budget.lines'].create({ + 'analytic_account_id': self.ref('analytic.analytic_seagate_p2'), + 'general_budget_id': self.account_budget_post_purchase0.id, + 'date_from': str(time.localtime(time.time())[0] + 1) + '-07-01', + 'date_to': str(time.localtime(time.time())[0] + 1) + '-07-15', + 'planned_amount': -2000.0, + 'crossovered_budget_id': self.ref('account_budget.crossovered_budget_budgetoptimistic0'), + }) + self.env['crossovered.budget.lines'].create({ + 'analytic_account_id': self.ref('analytic.analytic_seagate_p2'), + 'general_budget_id': self.account_budget_post_purchase0.id, + 'date_from': str(time.localtime(time.time())[0] + 1) + '-08-16', + 'date_to': str(time.localtime(time.time())[0] + 1) + '-08-31', + 'planned_amount': -3000.0, + 'crossovered_budget_id': self.ref('account_budget.crossovered_budget_budgetpessimistic0'), + }) + self.env['crossovered.budget.lines'].create({ + 'analytic_account_id': self.ref('analytic.analytic_seagate_p2'), + 'general_budget_id': self.account_budget_post_purchase0.id, + 'date_from': str(time.localtime(time.time())[0] + 1) + '-09-01', + 'date_to': str(time.localtime(time.time())[0] + 1) + '-09-15', + 'planned_amount': -1000.0, + 'crossovered_budget_id': self.ref('account_budget.crossovered_budget_budgetoptimistic0'), + }) diff --git a/addons/account_budget/tests/test_account_budget.py b/addons/account_budget/tests/test_account_budget.py new file mode 100644 index 00000000000..9daa5558dd7 --- /dev/null +++ b/addons/account_budget/tests/test_account_budget.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from .common import TestAccountBudgetCommon +from odoo.fields import Date + +import datetime + +# --------------------------------------------------------- +# Tests +# --------------------------------------------------------- +class TestAccountBudget(TestAccountBudgetCommon): + + def test_account_budget(self): + # In order to check account budget module in Odoo I created a budget with few budget positions + # Checking if the budgetary positions have accounts or not + if not self.account_budget_post_sales0.account_ids: + a_sale = self.env['account.account'].create({ + 'name': 'Product Sales - (test)', + 'code': 'X2020', + 'user_type_id': self.ref('account.data_account_type_revenue'), + 'tag_ids': [(6, 0, [self.ref('account.account_tag_operating')])], + }) + self.account_budget_post_sales0.write({'account_ids': [(6, 0, [a_sale.id])]}) + if not self.account_budget_post_purchase0.account_ids: + a_expense = self.env['account.account'].create({ + 'name': 'Expense - (test)', + 'code': 'X2120', + 'user_type_id': self.ref('account.data_account_type_expenses'), + 'tag_ids': [(6, 0, [self.ref('account.account_tag_operating')])], + }) + self.account_budget_post_purchase0.write({'account_ids': [(6, 0, [a_expense.id])]}) + + # Creating a crossovered.budget record + budget = self.env['crossovered.budget'].create({ + 'date_from': Date.from_string('%s-01-01' % (datetime.datetime.now().year + 1)), + 'date_to': Date.from_string('%s-12-31' % (datetime.datetime.now().year + 1)), + 'name': 'Budget %s' % (datetime.datetime.now().year + 1), + 'state': 'draft' + }) + + # I created two different budget lines + # Modifying a crossovered.budget record + self.env['crossovered.budget.lines'].create({ + 'crossovered_budget_id': budget.id, + 'analytic_account_id': self.ref('analytic.analytic_partners_camp_to_camp'), + 'date_from': Date.from_string('%s-01-01' % (datetime.datetime.now().year + 1)), + 'date_to': Date.from_string('%s-12-31' % (datetime.datetime.now().year + 1)), + 'general_budget_id': self.account_budget_post_purchase0.id, + 'planned_amount': 10000.0, + }) + self.env['crossovered.budget.lines'].create({ + 'crossovered_budget_id': budget.id, + 'analytic_account_id': self.ref('analytic.analytic_our_super_product'), + 'date_from': Date.from_string('%s-09-01' % (datetime.datetime.now().year + 1)), + 'date_to': Date.from_string('%s-09-30' % (datetime.datetime.now().year + 1)), + 'general_budget_id': self.account_budget_post_sales0.id, + 'planned_amount': 400000.0, + }) + # I check that Initially Budget is in "draft" state + self.assertEqual(budget.state, 'draft') + + # I pressed the confirm button to confirm the Budget + # Performing a workflow action confirm on module crossovered.budget + budget.signal_workflow('confirm') + + # I check that budget is in "Confirmed" state + self.assertEqual(budget.state, 'confirm') + + # I pressed the validate button to validate the Budget + # Performing a workflow action validate on module crossovered.budget + budget.signal_workflow('validate') + + # I check that budget is in "Validated" state + self.assertEqual(budget.state, 'validate') + + # I pressed the done button to set the Budget to "Done" state + # Performing a workflow action done on module crossovered.budget + budget.signal_workflow('done') + + # I check that budget is in "done" state + self.assertEqual(budget.state, 'done') diff --git a/addons/account_budget/tests/test_theoreticalamount.py b/addons/account_budget/tests/test_theoreticalamount.py index 1c82a076fe7..6af2c956d69 100644 --- a/addons/account_budget/tests/test_theoreticalamount.py +++ b/addons/account_budget/tests/test_theoreticalamount.py @@ -1,100 +1,103 @@ # -*- coding: utf-8 -*- -from datetime import datetime +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from .common import TestAccountBudgetCommon from mock import patch -from openerp.tests.common import TransactionCase -from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT - +from odoo.fields import Datetime # --------------------------------------------------------- # Tests # --------------------------------------------------------- -class TestTheoreticalAmount(TransactionCase): +class TestTheoreticalAmount(TestAccountBudgetCommon): def setUp(self): super(TestTheoreticalAmount, self).setUp() - cr, uid, = self.cr, self.uid - crossovered_budget_id = self.registry('crossovered.budget').create(cr, uid, { + crossovered_budget = self.env['crossovered.budget'].create({ 'name': 'test budget name', 'date_from': '2014-01-01', 'date_to': '2014-12-31', }) - crossovered_budget_line_obj = self.registry('crossovered.budget.lines') + crossovered_budget_line_obj = self.env['crossovered.budget.lines'] user_type_id = self.ref('account.data_account_type_revenue') tag_id = self.ref('account.account_tag_operating') - account_rev_id = self.registry('account.account').create(cr, uid, {'code': 'X2020', 'name': 'Budget - Test Revenue Account', 'user_type_id': user_type_id, 'tag_ids': [(4, tag_id, 0)]}) - buget_post = self.registry('account.budget.post').create(cr, uid, { - 'name': 'Sales', - 'account_ids': [(4, account_rev_id, 0)], + account_rev = self.env['account.account'].create({ + 'code': 'X2020', + 'name': 'Budget - Test Revenue Account', + 'user_type_id': user_type_id, + 'tag_ids': [(4, tag_id, 0)] }) - crossovered_budget_line_id = crossovered_budget_line_obj.create(cr, uid, { - 'crossovered_budget_id': crossovered_budget_id, - 'general_budget_id': buget_post, + buget_post = self.env['account.budget.post'].create({ + 'name': 'Sales', + 'account_ids': [(4, account_rev.id, 0)], + }) + self.line = crossovered_budget_line_obj.create({ + 'crossovered_budget_id': crossovered_budget.id, + 'general_budget_id': buget_post.id, 'date_from': '2014-01-01', 'date_to': '2014-12-31', 'planned_amount': -364, }) - self.line = crossovered_budget_line_obj.browse(cr, uid, crossovered_budget_line_id) - self.patcher = patch('openerp.addons.account_budget.account_budget.datetime', wraps=datetime) + self.patcher = patch('odoo.addons.account_budget.models.account_budget.fields.Datetime', wraps=Datetime) self.mock_datetime = self.patcher.start() def test_01(self): """Start""" - date = datetime.strptime('2014-01-01 00:00:00', DEFAULT_SERVER_DATETIME_FORMAT) + date = Datetime.to_string(Datetime.from_string('2014-01-01 00:00:00')) self.mock_datetime.now.return_value = date self.assertAlmostEqual(self.line.theoritical_amount, 0) def test_02(self): """After 24 hours""" - date = datetime.strptime('2014-01-02 00:00:00', DEFAULT_SERVER_DATETIME_FORMAT) + date = Datetime.to_string(Datetime.from_string('2014-01-02 00:00:00')) self.mock_datetime.now.return_value = date self.assertAlmostEqual(self.line.theoritical_amount, -1) def test_03(self): """After 36 hours""" - date = datetime.strptime('2014-01-02 12:00:00', DEFAULT_SERVER_DATETIME_FORMAT) + date = Datetime.to_string(Datetime.from_string('2014-01-02 12:00:00')) self.mock_datetime.now.return_value = date self.assertAlmostEqual(self.line.theoritical_amount, -1.5) def test_04(self): """After 48 hours""" - date = datetime.strptime('2014-01-03 00:00:00', DEFAULT_SERVER_DATETIME_FORMAT) + date = Datetime.to_string(Datetime.from_string('2014-01-03 00:00:00')) self.mock_datetime.now.return_value = date self.assertAlmostEqual(self.line.theoritical_amount, -2) def test_05(self): """After 10 days""" - date = datetime.strptime('2014-01-11 00:00:00', DEFAULT_SERVER_DATETIME_FORMAT) + date = Datetime.to_string(Datetime.from_string('2014-01-11 00:00:00')) self.mock_datetime.now.return_value = date self.assertAlmostEqual(self.line.theoritical_amount, -10) def test_06(self): """After 50 days""" - date = datetime.strptime('2014-02-20 00:00:00', DEFAULT_SERVER_DATETIME_FORMAT) + date = Datetime.to_string(Datetime.from_string('2014-02-20 00:00:00')) self.mock_datetime.now.return_value = date self.assertAlmostEqual(self.line.theoritical_amount, -50) def test_07(self): """After 182 days, exactly half of the budget line""" - date = datetime.strptime('2014-07-02 00:00:00', DEFAULT_SERVER_DATETIME_FORMAT) + date = Datetime.to_string(Datetime.from_string('2014-07-02 00:00:00')) self.mock_datetime.now.return_value = date self.assertAlmostEqual(self.line.theoritical_amount, -182) def test_08(self): """After 308 days at noon""" - date = datetime.strptime('2014-11-05 12:00:00', DEFAULT_SERVER_DATETIME_FORMAT) # remember, remember + date = Datetime.to_string(Datetime.from_string('2014-11-05 12:00:00')) # remember, remember self.mock_datetime.now.return_value = date self.assertAlmostEqual(self.line.theoritical_amount, -308.5) def test_09(self): """One day before""" - date = datetime.strptime('2014-12-30 00:00:00', DEFAULT_SERVER_DATETIME_FORMAT) + date = Datetime.to_string(Datetime.from_string('2014-12-30 00:00:00')) self.mock_datetime.now.return_value = date self.assertAlmostEqual(self.line.theoritical_amount, -363) def test_10(self): """At last""" - date = datetime.strptime('2014-12-31 00:00:00', DEFAULT_SERVER_DATETIME_FORMAT) + date = Datetime.to_string(Datetime.from_string('2014-12-31 00:00:00')) self.mock_datetime.now.return_value = date self.assertAlmostEqual(self.line.theoritical_amount, -364) diff --git a/addons/account_budget/views/account_analytic_account_views.xml b/addons/account_budget/views/account_analytic_account_views.xml index 251009dce0b..0b19a8eaa6c 100644 --- a/addons/account_budget/views/account_analytic_account_views.xml +++ b/addons/account_budget/views/account_analytic_account_views.xml @@ -1,6 +1,5 @@ - - - + + account.analytic.account.form.inherit.budget account.analytic.account @@ -36,5 +35,4 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/addons/account_budget/views/account_budget_views.xml b/addons/account_budget/views/account_budget_views.xml index eecb862323b..122e838f143 100644 --- a/addons/account_budget/views/account_budget_views.xml +++ b/addons/account_budget/views/account_budget_views.xml @@ -1,6 +1,5 @@ - - - + + @@ -267,5 +266,4 @@ src_model="account.analytic.account" id="act_account_analytic_account_cb_lines"/> - - +