diff --git a/base_account_budget/__manifest__.py b/base_account_budget/__manifest__.py index a831518d7..725cfc8f1 100644 --- a/base_account_budget/__manifest__.py +++ b/base_account_budget/__manifest__.py @@ -21,7 +21,7 @@ ############################################################################# { 'name': 'Odoo 17 Budget Management', - 'version': '17.0.1.0.0', + 'version': '17.0.1.0.1', 'category': 'Accounting', 'summary': """ Budget Management for Odoo 17 Community Edition. """, 'description': """ This module allows accountants to manage analytic and diff --git a/base_account_budget/doc/RELEASE_NOTES.md b/base_account_budget/doc/RELEASE_NOTES.md index fe9a8da0a..82c8294a2 100644 --- a/base_account_budget/doc/RELEASE_NOTES.md +++ b/base_account_budget/doc/RELEASE_NOTES.md @@ -5,3 +5,7 @@ #### ADD - Initial commit for Budget Management +#### 02.01.2024 +#### Version 17.0.1.0.1 +#### FIX +- Bug Fixed, states and tracking_visibility parameter removed from the fields of budget.budget model. \ No newline at end of file diff --git a/base_account_budget/models/account_budget.py b/base_account_budget/models/account_budget.py index b65c16ad0..4e872f00c 100644 --- a/base_account_budget/models/account_budget.py +++ b/base_account_budget/models/account_budget.py @@ -30,11 +30,14 @@ class AccountBudgetPost(models.Model): _description = "Budgetary Position" name = fields.Char('Name', required=True) - account_ids = fields.Many2many('account.account', 'account_budget_rel', 'budget_id', 'account_id', 'Accounts', + account_ids = fields.Many2many('account.account', 'account_budget_rel', + 'budget_id', 'account_id', 'Accounts', domain=[('deprecated', '=', False)]) - budget_line = fields.One2many('budget.lines', 'general_budget_id', 'Budget Lines') + budget_line = fields.One2many('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( + default=lambda self: self.env[ + 'res.company']._company_default_get( 'account.budget.post')) def _check_account_ids(self, vals): @@ -43,7 +46,8 @@ class AccountBudgetPost(models.Model): else: account_ids = self.account_ids if not account_ids: - raise ValidationError(_('The budget must have at least one account.')) + raise ValidationError( + _('The budget must have at least one account.')) @api.model def create(self, vals): @@ -60,21 +64,24 @@ class Budget(models.Model): _description = "Budget" _inherit = ['mail.thread'] - 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)]}) + name = fields.Char('Budget Name', required=True) + creating_user_id = fields.Many2one('res.users', 'Responsible', + default=lambda self: self.env.user) + date_from = fields.Date('Start Date', required=True) + date_to = fields.Date('End Date', required=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') + ], 'Status', default='draft', index=True, required=True, readonly=True, + copy=False, tracking=True) budget_line = fields.One2many('budget.lines', 'budget_id', 'Budget Lines', - states={'done': [('readonly', True)]}, copy=True) + copy=True) company_id = fields.Many2one('res.company', 'Company', required=True, - default=lambda self: self.env['res.company']._company_default_get( + default=lambda self: self.env[ + 'res.company']._company_default_get( 'account.budget.post')) def action_budget_confirm(self): @@ -98,17 +105,24 @@ class BudgetLines(models.Model): _rec_name = "budget_id" _description = "Budget Line" - budget_id = fields.Many2one('budget.budget', 'Budget', ondelete='cascade', index=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) + budget_id = fields.Many2one('budget.budget', 'Budget', ondelete='cascade', + index=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) - theoretical_amount = fields.Float(compute='_compute_theoretical_amount', string='Theoretical Amount', digits=0) - percentage = fields.Float(compute='_compute_percentage', string='Achievement') - company_id = fields.Many2one(related='budget_id.company_id', comodel_name='res.company', + practical_amount = fields.Float(compute='_compute_practical_amount', + string='Practical Amount', digits=0) + theoretical_amount = fields.Float(compute='_compute_theoretical_amount', + string='Theoretical Amount', digits=0) + percentage = fields.Float(compute='_compute_percentage', + string='Achievement') + company_id = fields.Many2one(related='budget_id.company_id', + comodel_name='res.company', string='Company', store=True, readonly=True) def _compute_practical_amount(self): @@ -116,7 +130,8 @@ class BudgetLines(models.Model): result = 0.0 acc_ids = line.general_budget_id.account_ids.ids 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 + date_from = self.env.context.get( + 'wizard_date_from') or line.date_from if line.analytic_account_id.id: self.env.cr.execute(""" SELECT SUM(amount) @@ -124,7 +139,8 @@ class BudgetLines(models.Model): WHERE account_id=%s AND date between %s AND %s AND general_account_id=ANY(%s)""", - (line.analytic_account_id.id, date_from, date_to, acc_ids,)) + (line.analytic_account_id.id, date_from, + date_to, acc_ids,)) result = self.env.cr.fetchone()[0] or 0.0 line.practical_amount = result @@ -133,9 +149,13 @@ class BudgetLines(models.Model): for line in self: # Used for the report - 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 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): @@ -148,7 +168,8 @@ class BudgetLines(models.Model): theo_amt = 0.00 if date_from and date_to: - line_timedelta = fields.Datetime.from_string(line.date_to) - fields.Datetime.from_string( + 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: @@ -156,12 +177,15 @@ class BudgetLines(models.Model): elapsed_timedelta.total_seconds() / line_timedelta.total_seconds()) * line.planned_amount else: if line.paid_date: - if fields.Datetime.from_string(line.date_to) <= fields.Datetime.from_string(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 = fields.Datetime.from_string(line.date_to) - fields.Datetime.from_string( + 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)) @@ -169,8 +193,9 @@ class BudgetLines(models.Model): 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 fields.Datetime.from_string(today) < fields.Datetime.from_string( - 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 theo_amt = ( elapsed_timedelta.total_seconds() / line_timedelta.total_seconds()) * line.planned_amount @@ -182,6 +207,7 @@ class BudgetLines(models.Model): def _compute_percentage(self): for line in self: if line.theoretical_amount != 0.00: - line.percentage = float((line.practical_amount or 0.0) / line.theoretical_amount) * 100 + line.percentage = float(( + line.practical_amount or 0.0) / line.theoretical_amount) * 100 else: line.percentage = 0.00