[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
This commit is contained in:
Yannick Tivisse
2016-07-28 09:14:42 +02:00
parent 5bce1d7c17
commit 0f0b4f4266
17 changed files with 410 additions and 523 deletions
+1 -10
View File
@@ -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'],
}
@@ -1,5 +1,5 @@
<?xml version="1.0" ?>
<openerp>
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Budgets -->
<data noupdate="1">
<record id="crossovered_budget_budgetoptimistic0" model="crossovered.budget">
@@ -19,4 +19,4 @@
<field name="creating_user_id" ref="base.user_root"/>
</record>
</data>
</openerp>
</odoo>
@@ -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')
@@ -1,7 +1,5 @@
<?xml version="1.0" ?>
<openerp>
<data>
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Workflow definition -->
<record model="workflow" id="wkf_crossovered_budget">
@@ -86,5 +84,4 @@
<field name="signal">draft</field>
</record>
</data>
</openerp>
</odoo>
+1 -1
View File
@@ -2,4 +2,4 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import account_budget
import account_analytic_account
import account_analytic_account
@@ -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')
+102 -151
View File
@@ -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
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<odoo>
<data noupdate="1">
<record id="budget_post_comp_rule" model="ir.rule">
@@ -28,4 +28,4 @@
</record>
</data>
</openerp>
</odoo>
@@ -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'
@@ -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')
@@ -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"),
})
+5
View File
@@ -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
+172
View File
@@ -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'),
})
@@ -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')
@@ -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)
@@ -1,6 +1,5 @@
<?xml version="1.0" ?>
<openerp>
<data>
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record model="ir.ui.view" id="view_account_analytic_account_form_inherit_budget">
<field name="name">account.analytic.account.form.inherit.budget</field>
<field name="model">account.analytic.account</field>
@@ -36,5 +35,4 @@
</xpath>
</field>
</record>
</data>
</openerp>
</odoo>
@@ -1,6 +1,5 @@
<?xml version="1.0" ?>
<openerp>
<data>
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!--
Budgets
-->
@@ -267,5 +266,4 @@
src_model="account.analytic.account"
id="act_account_analytic_account_cb_lines"/>
</data>
</openerp>
</odoo>