Join the social network of Tech Nerds, increase skill rank, get work, manage projects...
 
  • Reflect the change on accounts in Odoo/OpenERP

    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    • 969
    Comment on it

    In accounts method we can reflect the change on accounts on run time and we can access the account method in Odoo server. For example you can see below code.

    from openerp import fields, models, api, _
    from datetime import timedelta
    
    
    class ResCompany(models.Model):
        _inherit = "res.company"
    
        #TODO check all the options/fields are in the views (settings + company form view)
        fiscalyear_last_day = fields.Integer(default=31, required=True)
        fiscalyear_last_month = fields.Selection([(1, 'January'), (2, 'February'), (3, 'March'), (4, 'April'), (5, 'May'), (6, 'June'), (7, 'July'), (8, 'August'), (9, 'September'), (10, 'October'), (11, 'November'), (12, 'December')], default=12, required=True)
        period_lock_date = fields.Date(string="Lock Date for Non-Advisers", help="Only users with the 'Adviser' role can edit accounts prior to and inclusive of this date. Use it for period locking inside an open fiscal year, for example.")
        fiscalyear_lock_date = fields.Date(string="Lock Date", help="No users, including Advisers, can edit accounts prior to and inclusive of this date. Use it for fiscal year locking for example.")
        transfer_account_id = fields.Many2one('account.account',
            domain=lambda self: [('reconcile', '=', True), ('user_type_id.id', '=', self.env.ref('account.data_account_type_current_assets').id), ('deprecated', '=', False)], string="Inter-Banks Transfer Account", help="Intermediary account used when moving money from a liquidity account to another")
        expects_chart_of_accounts = fields.Boolean(string='Expects a Chart of Accounts', default=True)
        chart_template_id = fields.Many2one('account.chart.template', help='The chart template for the company (if any)')
        bank_account_code_prefix = fields.Char(string='Prefix of the bank accounts', oldname="bank_account_code_char")
        cash_account_code_prefix = fields.Char(string='Prefix of the cash accounts')
        accounts_code_digits = fields.Integer(string='Number of digits in an account code')
        tax_calculation_rounding_method = fields.Selection([
            ('round_per_line', 'Round per Line'),
            ('round_globally', 'Round Globally'),
            ], default='round_per_line', string='Tax Calculation Rounding Method',
            help="If you select 'Round per Line' : for each tax, the tax amount will first be computed and rounded for each PO/SO/invoice line and then these rounded amounts will be summed, leading to the total amount for that tax. If you select 'Round Globally': for each tax, the tax amount will be computed for each PO/SO/invoice line, then these amounts will be summed and eventually this total tax amount will be rounded. If you sell with tax included, you should choose 'Round per line' because you certainly want the sum of your tax-included line subtotals to be equal to the total amount with taxes.")
        paypal_account = fields.Char(string='Paypal Account', size=128, help="Paypal username (usually email) for receiving online payments.")
        currency_exchange_journal_id = fields.Many2one('account.journal', string="Exchange Gain or Loss Journal", domain=[('type', '=', 'general')])
        income_currency_exchange_account_id = fields.Many2one('account.account', related='currency_exchange_journal_id.default_credit_account_id',
            string="Gain Exchange Rate Account", domain="[('internal_type', '=', 'other'), ('deprecated', '=', False), ('company_id', '=', id)]")
        expense_currency_exchange_account_id = fields.Many2one('account.account', related='currency_exchange_journal_id.default_debit_account_id',
            string="Loss Exchange Rate Account", domain="[('internal_type', '=', 'other'), ('deprecated', '=', False), ('company_id', '=', id)]")
        anglo_saxon_accounting = fields.Boolean(string="Use anglo-saxon accounting")
        property_stock_account_input_categ_id = fields.Many2one('account.account', string="Input Account for Stock Valuation", oldname="property_stock_account_input_categ")
        property_stock_account_output_categ_id = fields.Many2one('account.account', string="Output Account for Stock Valuation", oldname="property_stock_account_output_categ")
        property_stock_valuation_account_id = fields.Many2one('account.account', string="Account Template for Stock Valuation")
        bank_journal_ids = fields.One2many('account.journal', 'company_id', domain=[('type', '=', 'bank')], string='Bank Journals')
        overdue_msg = fields.Text(string='Overdue Payments Message', translate=True,
            default='''Dear Sir/Madam,
    
    Our records indicate that some payments on your account are still due. Please find details below.
    If the amount has already been paid, please disregard this notice. Otherwise, please forward us the total amount stated below.
    If you have any queries regarding your account, Please contact us.
    
    Thank you in advance for your cooperation.
    Best Regards,''')
    
        @api.multi
        def compute_fiscalyear_dates(self, date):
            """ Computes the start and end dates of the fiscalyear where the given 'date' belongs to
                @param date: a datetime object
                @returns: a dictionary with date_from and date_to
            """
            self = self[0]
            last_month = self.fiscalyear_last_month
            last_day = self.fiscalyear_last_day
            if (date.month < last_month or (date.month == last_month and date.date <= last_day)):
                date = date.replace(month=last_month, day=last_day)
            else:
                date = date.replace(month=last_month, day=last_day, year=date.year + 1)
            date_to = date
            date_from = date + timedelta(days=1)
            date_from = date_from.replace(year=date_from.year - 1)
            return {'date_from': date_from, 'date_to': date_to}
    
        def get_new_account_code(self, current_code, old_prefix, new_prefix, digits):
            new_prefix_length = len(new_prefix)
            number = current_code[len(old_prefix):]
            return new_prefix + '0' * (digits - new_prefix_length - len(number)) + number
    
        def reflect_code_prefix_change(self, old_code, new_code, digits):
            accounts = self.env['account.account'].search([('code', 'like', old_code), ('internal_type', '=', 'liquidity'),
                ('company_id', '=', self.id)], order='code asc')
            for account in accounts:
                if account.code.startswith(old_code):
                    account.write({'code': self.get_new_account_code(account.code, old_code, new_code, digits)})
    
        @api.multi
        def write(self, values):
            # Reflect the change on accounts
            for company in self:
                digits = values.get('accounts_code_digits') or company.accounts_code_digits
                if values.get('bank_account_code_prefix') or values.get('accounts_code_digits'):
                    new_bank_code = values.get('bank_account_code_prefix') or company.bank_account_code_prefix
                    company.reflect_code_prefix_change(company.bank_account_code_prefix, new_bank_code, digits)
                if values.get('cash_account_code_prefix') or values.get('accounts_code_digits'):
                    new_cash_code = values.get('cash_account_code_prefix') or company.cash_account_code_prefix
                    company.reflect_code_prefix_change(company.cash_account_code_prefix, new_cash_code, digits)
            return super(ResCompany, self).write(values)

     

 0 Comment(s)

Sign In
                           OR                           
                           OR                           
Register

Sign up using

                           OR                           
Forgot Password
Fill out the form below and instructions to reset your password will be emailed to you:
Reset Password
Fill out the form below and reset your password: