diff --git a/addons/account/__openerp__.py b/addons/account/__openerp__.py index 08122f5af30..e01dbc70f07 100644 --- a/addons/account/__openerp__.py +++ b/addons/account/__openerp__.py @@ -104,6 +104,8 @@ module named account_voucher. 'account_invoice_view.xml', 'partner_view.xml', 'data/account_data.xml', + 'data/data_financial_report.xml', + 'data/data_account_type.xml', 'account_invoice_workflow.xml', 'project/project_view.xml', 'project/project_report.xml', @@ -121,8 +123,6 @@ module named account_voucher. 'ir_sequence_view.xml', 'company_view.xml', 'board_account_view.xml', - "wizard/account_report_profit_loss_view.xml", - "wizard/account_report_balance_sheet_view.xml", "edi/invoice_action_data.xml", "account_bank_view.xml", "account_pre_install.yml" diff --git a/addons/account/account.py b/addons/account/account.py index a15a04dcffe..83838f5f545 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -130,8 +130,45 @@ account_payment_term_line() class account_account_type(osv.osv): _name = "account.account.type" _description = "Account Type" + + def _get_current_report_type(self, cr, uid, ids, name, arg, context=None): + obj_data = self.pool.get('ir.model.data') + obj_financial_report = self.pool.get('account.financial.report') + res = {} + financial_report_ref = { + 'asset': obj_financial_report.browse(cr, uid, obj_data.get_object_reference(cr, uid, 'account','account_financial_report_assets0')[1], context=context), + 'liability': obj_financial_report.browse(cr, uid, obj_data.get_object_reference(cr, uid, 'account','account_financial_report_liability0')[1], context=context), + 'income': obj_financial_report.browse(cr, uid, obj_data.get_object_reference(cr, uid, 'account','account_financial_report_income0')[1], context=context), + 'expense': obj_financial_report.browse(cr, uid, obj_data.get_object_reference(cr, uid, 'account','account_financial_report_expense0')[1], context=context), + } + for record in self.browse(cr, uid, ids, context=context): + res[record.id] = 'none' + for key, financial_report in financial_report_ref.items(): + list_ids = [x.id for x in financial_report.account_type_ids] + if record.id in list_ids: + res[record.id] = key + return res + + def _save_report_type(self, cr, uid, account_type_id, field_name, field_value, arg, context=None): + obj_data = self.pool.get('ir.model.data') + obj_financial_report = self.pool.get('account.financial.report') + #unlink if it exists somewhere in the financial reports related to BS or PL + financial_report_ref = { + 'asset': obj_financial_report.browse(cr, uid, obj_data.get_object_reference(cr, uid, 'account','account_financial_report_assets0')[1], context=context), + 'liability': obj_financial_report.browse(cr, uid, obj_data.get_object_reference(cr, uid, 'account','account_financial_report_liability0')[1], context=context), + 'income': obj_financial_report.browse(cr, uid, obj_data.get_object_reference(cr, uid, 'account','account_financial_report_income0')[1], context=context), + 'expense': obj_financial_report.browse(cr, uid, obj_data.get_object_reference(cr, uid, 'account','account_financial_report_expense0')[1], context=context), + } + for key, financial_report in financial_report_ref.items(): + list_ids = [x.id for x in financial_report.account_type_ids] + if account_type_id in list_ids: + obj_financial_report.write(cr, uid, [financial_report.id], {'account_type_ids': [(3, account_type_id)]}) + #write it in the good place + if field_value != 'none': + return obj_financial_report.write(cr, uid, [financial_report_ref[field_value].id], {'account_type_ids': [(4, account_type_id)]}) + _columns = { - 'name': fields.char('Account Type', size=64, required=True), + 'name': fields.char('Account Type', size=64, required=True, translate=True), 'code': fields.char('Code', size=32, required=True), 'close_method': fields.selection([('none', 'None'), ('balance', 'Balance'), ('detail', 'Detail'), ('unreconciled', 'Unreconciled')], 'Deferral Method', required=True, help="""Set here the method that will be used to generate the end of year journal entries for all the accounts of this type. @@ -139,19 +176,16 @@ class account_account_type(osv.osv): 'Balance' will generally be used for cash accounts. 'Detail' will copy each existing journal item of the previous year, even the reconciled ones. 'Unreconciled' will copy only the journal items that were unreconciled on the first day of the new fiscal year."""), - 'sign': fields.selection([(-1, 'Reverse balance sign'), (1, 'Preserve balance sign')], 'Sign on Reports', required=True, help='For accounts that are typically more debited than credited and that you would like to print as negative amounts in your reports, you should reverse the sign of the balance; e.g.: Expense account. The same applies for accounts that are typically more credited than debited and that you would like to print as positive amounts in your reports; e.g.: Income account.'), - 'report_type':fields.selection([ - ('none','/'), - ('income','Profit & Loss (Income Accounts)'), - ('expense','Profit & Loss (Expense Accounts)'), - ('asset','Balance Sheet (Asset Accounts)'), - ('liability','Balance Sheet (Liability Accounts)') - ],'P&L / BS Category', select=True, readonly=False, help="This field is used to generate legal reports: profit and loss, balance sheet.", required=True), + 'report_type': fields.function(_get_current_report_type, fnct_inv=_save_report_type, type='selection', string='P&L / BS Category', + selection= [('none','/'), + ('income', _('Profit & Loss (Income account)')), + ('expense', _('Profit & Loss (Expense account)')), + ('asset', _('Balance Sheet (Asset account)')), + ('liability', _('Balance Sheet (Liability account)'))], help="This field is used to generate legal reports: profit and loss, balance sheet.", required=True), 'note': fields.text('Description'), } _defaults = { 'close_method': 'none', - 'sign': 1, 'report_type': 'none', } _order = "code" @@ -422,6 +456,7 @@ class account_account(osv.osv): 'user_type': fields.many2one('account.account.type', 'Account Type', required=True, help="Account Type is used for information purpose, to generate " "country-specific legal reports, and set the rules to close a fiscal year and generate opening entries."), + 'financial_report_ids': fields.many2many('account.financial.report', 'account_account_financial_report', 'account_id', 'report_line_id', 'Financial Reports'), 'parent_id': fields.many2one('account.account', 'Parent', ondelete='cascade', domain=[('type','=','view')]), 'child_parent_ids': fields.one2many('account.account','parent_id','Children'), 'child_consol_ids': fields.many2many('account.account', 'account_account_consol_rel', 'child_id', 'parent_id', 'Consolidated Children'), @@ -771,7 +806,9 @@ class account_journal(osv.osv): def create(self, cr, uid, vals, context=None): if not 'sequence_id' in vals or not vals['sequence_id']: - vals.update({'sequence_id': self.create_sequence(cr, uid, vals, context)}) + # if we have the right to create a journal, we should be able to + # create it's sequence. + vals.update({'sequence_id': self.create_sequence(cr, 1, vals, context)}) return super(account_journal, self).create(cr, uid, vals, context) def name_get(self, cr, user, ids, context=None): @@ -2422,6 +2459,7 @@ class account_account_template(osv.osv): 'user_type': fields.many2one('account.account.type', 'Account Type', required=True, help="These types are defined according to your country. The type contains more information "\ "about the account and its specificities."), + 'financial_report_ids': fields.many2many('account.financial.report', 'account_template_financial_report', 'account_template_id', 'report_line_id', 'Financial Reports'), 'reconcile': fields.boolean('Allow Reconciliation', help="Check this option if you want the user to reconcile entries in this account."), 'shortcut': fields.char('Shortcut', size=12), 'note': fields.text('Note'), @@ -2429,6 +2467,7 @@ class account_account_template(osv.osv): 'child_parent_ids':fields.one2many('account.account.template', 'parent_id', 'Children'), 'tax_ids': fields.many2many('account.tax.template', 'account_account_template_tax_rel', 'account_id', 'tax_id', 'Default Taxes'), 'nocreate': fields.boolean('Optional create', help="If checked, the new chart of accounts will not contain this by default."), + 'chart_template_id': fields.many2one('account.chart.template', 'Chart Template', help="This optional field allow you to link an account template to a specific chart template that may differ from the one its root parent belongs to. This allow you to define chart templates that extend another and complete it with few new accounts (You don't need to define the whole structure that is common to both several times)."), } _defaults = { @@ -2465,6 +2504,60 @@ class account_account_template(osv.osv): res.append((record['id'],name )) return res + def generate_account(self, cr, uid, chart_template_id, tax_template_ref, acc_template_ref, code_digits, company_id, context=None): + """ + This method for generating accounts from templates. + + :param chart_template_id: id of the chart template chosen in the wizard + :param tax_template_ref: Taxes templates reference for write taxes_id in account_account. + :paramacc_template_ref: dictionary with the mappping between the account templates and the real accounts. + :param code_digits: number of digits got from wizard.multi.charts.accounts, this is use for account code. + :param company_id: company_id selected from wizard.multi.charts.accounts. + :returns: return acc_template_ref for reference purpose. + :rtype: dict + """ + if context is None: + context = {} + obj_acc = self.pool.get('account.account') + company_name = self.pool.get('res.company').browse(cr, uid, company_id, context=context).name + template = self.pool.get('account.chart.template').browse(cr, uid, chart_template_id, context=context) + #deactivate the parent_store functionnality on account_account for rapidity purpose + ctx = context.copy() + ctx.update({'defer_parent_store_computation': True}) + children_acc_template = self.search(cr, uid, ['|', ('chart_template_id','=', [chart_template_id]),'&',('parent_id','child_of', [template.account_root_id.id]),('chart_template_id','=', False), ('nocreate','!=',True)], order='id') + for account_template in self.browse(cr, uid, children_acc_template, context=context): + # skip the root of COA if it's not the main one + if (template.account_root_id.id == account_template.id) and template.parent_id: + continue + tax_ids = [] + for tax in account_template.tax_ids: + tax_ids.append(tax_template_ref[tax.id]) + + code_main = account_template.code and len(account_template.code) or 0 + code_acc = account_template.code or '' + if code_main > 0 and code_main <= code_digits and account_template.type != 'view': + code_acc = str(code_acc) + (str('0'*(code_digits-code_main))) + vals={ + 'name': (template.account_root_id.id == account_template.id) and company_name or account_template.name, + 'currency_id': account_template.currency_id and account_template.currency_id.id or False, + 'code': code_acc, + 'type': account_template.type, + 'user_type': account_template.user_type and account_template.user_type.id or False, + 'reconcile': account_template.reconcile, + 'shortcut': account_template.shortcut, + 'note': account_template.note, + 'financial_report_ids': account_template.financial_report_ids and [(6,0,[x.id for x in account_template.financial_report_ids])] or False, + 'parent_id': account_template.parent_id and ((account_template.parent_id.id in acc_template_ref) and acc_template_ref[account_template.parent_id.id]) or False, + 'tax_ids': [(6,0,tax_ids)], + 'company_id': company_id, + } + new_account = obj_acc.create(cr, uid, vals, context=ctx) + acc_template_ref[account_template.id] = new_account + + #reactivate the parent_store functionnality on account_account + obj_acc._parent_store_compute(cr) + return acc_template_ref + account_account_template() class account_add_tmpl_wizard(osv.osv_memory): @@ -2542,6 +2635,41 @@ class account_tax_code_template(osv.osv): 'notprintable': False, } + def generate_tax_code(self, cr, uid, tax_code_root_id, company_id, context=None): + ''' + This function generates the tax codes from the templates of tax code that are children of the given one passed + in argument. Then it returns a dictionary with the mappping between the templates and the real objects. + + :param tax_code_root_id: id of the root of all the tax code templates to process + :param company_id: id of the company the wizard is running for + :returns: dictionary with the mappping between the templates and the real objects. + :rtype: dict + ''' + obj_tax_code_template = self.pool.get('account.tax.code.template') + obj_tax_code = self.pool.get('account.tax.code') + tax_code_template_ref = {} + company = self.pool.get('res.company').browse(cr, uid, company_id, context=context) + + #find all the children of the tax_code_root_id + children_tax_code_template = obj_tax_code_template.search(cr, uid, [('parent_id','child_of',[tax_code_root_id])], order='id') + for tax_code_template in obj_tax_code_template.browse(cr, uid, children_tax_code_template, context=context): + vals = { + 'name': (tax_code_root_id == tax_code_template.id) and company.name or tax_code_template.name, + 'code': tax_code_template.code, + 'info': tax_code_template.info, + 'parent_id': tax_code_template.parent_id and ((tax_code_template.parent_id.id in tax_code_template_ref) and tax_code_template_ref[tax_code_template.parent_id.id]) or False, + 'company_id': company_id, + 'sign': tax_code_template.sign, + } + #check if this tax code already exists + rec_list = obj_tax_code.search(cr, uid, [('name', '=', vals['name']),('code', '=', vals['code']),('company_id', '=', vals['company_id'])], context=context) + if not rec_list: + #if not yet, create it + new_tax_code = obj_tax_code.create(cr, uid, vals) + #recording the new tax code to do the mapping + tax_code_template_ref[tax_code_template.id] = new_tax_code + return tax_code_template_ref + def name_get(self, cr, uid, ids, context=None): if not ids: return [] @@ -2565,19 +2693,29 @@ class account_chart_template(osv.osv): _columns={ 'name': fields.char('Name', size=64, required=True), - 'account_root_id': fields.many2one('account.account.template','Root Account',required=True,domain=[('parent_id','=',False)]), - 'tax_code_root_id': fields.many2one('account.tax.code.template','Root Tax Code',required=True,domain=[('parent_id','=',False)]), + 'parent_id': fields.many2one('account.chart.template', 'Parent Chart Template'), + 'code_digits': fields.integer('# of Digits', required=True, help="No. of Digits to use for account code"), + 'visible': fields.boolean('Can be Visible?', help="Set this to False if you don't want this template to be used actively in the wizard that generate Chart of Accounts from templates, this is useful when you want to generate accounts of this template only when loading its child template."), + 'complete_tax_set': fields.boolean('Complete Set of Taxes', help='This boolean helps you to choose if you want to propose to the user to encode the sale and purchase rates or choose from list of taxes. This last choice assumes that the set of tax defined on this template is complete'), + 'account_root_id': fields.many2one('account.account.template', 'Root Account', domain=[('parent_id','=',False)]), + 'tax_code_root_id': fields.many2one('account.tax.code.template', 'Root Tax Code', domain=[('parent_id','=',False)]), 'tax_template_ids': fields.one2many('account.tax.template', 'chart_template_id', 'Tax Template List', help='List of all the taxes that have to be installed by the wizard'), - 'bank_account_view_id': fields.many2one('account.account.template','Bank Account',required=True), - 'property_account_receivable': fields.many2one('account.account.template','Receivable Account'), - 'property_account_payable': fields.many2one('account.account.template','Payable Account'), - 'property_account_expense_categ': fields.many2one('account.account.template','Expense Category Account'), - 'property_account_income_categ': fields.many2one('account.account.template','Income Category Account'), - 'property_account_expense': fields.many2one('account.account.template','Expense Account on Product Template'), - 'property_account_income': fields.many2one('account.account.template','Income Account on Product Template'), + 'bank_account_view_id': fields.many2one('account.account.template', 'Bank Account'), + 'property_account_receivable': fields.many2one('account.account.template', 'Receivable Account'), + 'property_account_payable': fields.many2one('account.account.template', 'Payable Account'), + 'property_account_expense_categ': fields.many2one('account.account.template', 'Expense Category Account'), + 'property_account_income_categ': fields.many2one('account.account.template', 'Income Category Account'), + 'property_account_expense': fields.many2one('account.account.template', 'Expense Account on Product Template'), + 'property_account_income': fields.many2one('account.account.template', 'Income Account on Product Template'), 'property_reserve_and_surplus_account': fields.many2one('account.account.template', 'Reserve and Profit/Loss Account', domain=[('type', '=', 'payable')], help='This Account is used for transferring Profit/Loss(If It is Profit: Amount will be added, Loss: Amount will be deducted.), Which is calculated from Profilt & Loss Report'), - 'property_account_income_opening': fields.many2one('account.account.template','Opening Entries Income Account'), - 'property_account_expense_opening': fields.many2one('account.account.template','Opening Entries Expense Account'), + 'property_account_income_opening': fields.many2one('account.account.template', 'Opening Entries Income Account'), + 'property_account_expense_opening': fields.many2one('account.account.template', 'Opening Entries Expense Account'), + } + + _defaults = { + 'visible': True, + 'code_digits': 6, + 'complete_tax_set': True, } account_chart_template() @@ -2655,6 +2793,61 @@ class account_tax_template(osv.osv): } _order = 'sequence' + def _generate_tax(self, cr, uid, tax_templates, tax_code_template_ref, company_id, context=None): + """ + This method generate taxes from templates. + + :param tax_templates: list of browse record of the tax templates to process + :param tax_code_template_ref: Taxcode templates reference. + :param company_id: id of the company the wizard is running for + :returns: + { + 'tax_template_to_tax': mapping between tax template and the newly generated taxes corresponding, + 'account_dict': dictionary containing a to-do list with all the accounts to assign on new taxes + } + """ + if context is None: + context = {} + res = {} + todo_dict = {} + tax_template_to_tax = {} + for tax in tax_templates: + vals_tax = { + 'name':tax.name, + 'sequence': tax.sequence, + 'amount': tax.amount, + 'type': tax.type, + 'applicable_type': tax.applicable_type, + 'domain': tax.domain, + 'parent_id': tax.parent_id and ((tax.parent_id.id in tax_template_to_tax) and tax_template_to_tax[tax.parent_id.id]) or False, + 'child_depend': tax.child_depend, + 'python_compute': tax.python_compute, + 'python_compute_inv': tax.python_compute_inv, + 'python_applicable': tax.python_applicable, + 'base_code_id': tax.base_code_id and ((tax.base_code_id.id in tax_code_template_ref) and tax_code_template_ref[tax.base_code_id.id]) or False, + 'tax_code_id': tax.tax_code_id and ((tax.tax_code_id.id in tax_code_template_ref) and tax_code_template_ref[tax.tax_code_id.id]) or False, + 'base_sign': tax.base_sign, + 'tax_sign': tax.tax_sign, + 'ref_base_code_id': tax.ref_base_code_id and ((tax.ref_base_code_id.id in tax_code_template_ref) and tax_code_template_ref[tax.ref_base_code_id.id]) or False, + 'ref_tax_code_id': tax.ref_tax_code_id and ((tax.ref_tax_code_id.id in tax_code_template_ref) and tax_code_template_ref[tax.ref_tax_code_id.id]) or False, + 'ref_base_sign': tax.ref_base_sign, + 'ref_tax_sign': tax.ref_tax_sign, + 'include_base_amount': tax.include_base_amount, + 'description': tax.description, + 'company_id': company_id, + 'type_tax_use': tax.type_tax_use, + 'price_include': tax.price_include + } + new_tax = self.pool.get('account.tax').create(cr, uid, vals_tax) + tax_template_to_tax[tax.id] = new_tax + #as the accounts have not been created yet, we have to wait before filling these fields + todo_dict[new_tax] = { + 'account_collected_id': tax.account_collected_id and tax.account_collected_id.id or False, + 'account_paid_id': tax.account_paid_id and tax.account_paid_id.id or False, + } + res.update({'tax_template_to_tax': tax_template_to_tax, 'account_dict': todo_dict}) + return res + account_tax_template() # Fiscal Position Templates @@ -2671,6 +2864,38 @@ class account_fiscal_position_template(osv.osv): 'note': fields.text('Notes', translate=True), } + def generate_fiscal_position(self, cr, uid, chart_temp_id, tax_template_ref, acc_template_ref, company_id, context=None): + """ + This method generate Fiscal Position, Fiscal Position Accounts and Fiscal Position Taxes from templates. + + :param chart_temp_id: Chart Template Id. + :param taxes_ids: Taxes templates reference for generating account.fiscal.position.tax. + :param acc_template_ref: Account templates reference for generating account.fiscal.position.account. + :param company_id: company_id selected from wizard.multi.charts.accounts. + :returns: True + """ + if context is None: + context = {} + obj_tax_fp = self.pool.get('account.fiscal.position.tax') + obj_ac_fp = self.pool.get('account.fiscal.position.account') + obj_fiscal_position = self.pool.get('account.fiscal.position') + fp_ids = self.search(cr, uid, [('chart_template_id', '=', chart_temp_id)]) + for position in self.browse(cr, uid, fp_ids, context=context): + new_fp = obj_fiscal_position.create(cr, uid, {'company_id': company_id, 'name': position.name}) + for tax in position.tax_ids: + obj_tax_fp.create(cr, uid, { + 'tax_src_id': tax_template_ref[tax.tax_src_id.id], + 'tax_dest_id': tax.tax_dest_id and tax_template_ref[tax.tax_dest_id.id] or False, + 'position_id': new_fp + }) + for acc in position.account_ids: + obj_ac_fp.create(cr, uid, { + 'account_src_id': acc_template_ref[acc.account_src_id.id], + 'account_dest_id': acc_template_ref[acc.account_dest_id.id], + 'position_id': new_fp + }) + return True + account_fiscal_position_template() class account_fiscal_position_tax_template(osv.osv): @@ -2724,6 +2949,7 @@ class account_financial_report(osv.osv): return res def _get_balance(self, cr, uid, ids, name, args, context=None): + account_obj = self.pool.get('account.account') res = {} res_all = {} for report in self.browse(cr, uid, ids, context=context): @@ -2734,6 +2960,12 @@ class account_financial_report(osv.osv): # it's the sum of balance of the linked accounts for a in report.account_ids: balance += a.balance + elif report.type == 'account_type': + # it's the sum of balance of the leaf accounts with such an account type + report_types = [x.id for x in report.account_type_ids] + account_ids = account_obj.search(cr, uid, [('user_type','in', report_types), ('type','!=','view')], context=context) + for a in account_obj.browse(cr, uid, account_ids, context=context): + balance += a.balance elif report.type == 'account_report' and report.account_report_id: # it's the amount of the linked report res2 = self._get_balance(cr, uid, [report.account_report_id.id], 'balance', False, context=context) @@ -2756,7 +2988,6 @@ class account_financial_report(osv.osv): 'parent_id': fields.many2one('account.financial.report', 'Parent'), 'children_ids': fields.one2many('account.financial.report', 'parent_id', 'Account Report'), 'sequence': fields.integer('Sequence'), - 'note': fields.text('Notes'), 'balance': fields.function(_get_balance, 'Balance'), 'level': fields.function(_get_level, string='Level', store=True, type='integer'), 'type': fields.selection([ @@ -2766,13 +2997,20 @@ class account_financial_report(osv.osv): ('account_report','Report Value'), ],'Type'), 'account_ids': fields.many2many('account.account', 'account_account_financial_report', 'report_line_id', 'account_id', 'Accounts'), - 'display_detail': fields.boolean('Display details', help='Display every account with its balance instead of the sum.'), + 'display_detail': fields.selection([ + ('no_detail','No detail'), + ('detail_flat','Display children flat'), + ('detail_with_hierarchy','Display children with hierarchy') + ], 'Display details'), 'account_report_id': fields.many2one('account.financial.report', 'Report Value'), 'account_type_ids': fields.many2many('account.account.type', 'account_account_financial_report_type', 'report_id', 'account_type_id', 'Account Types'), + 'sign': fields.selection([(-1, 'Reverse balance sign'), (1, 'Preserve balance sign')], 'Sign on Reports', required=True, help='For accounts that are typically more debited than credited and that you would like to print as negative amounts in your reports, you should reverse the sign of the balance; e.g.: Expense account. The same applies for accounts that are typically more credited than debited and that you would like to print as positive amounts in your reports; e.g.: Income account.'), } _defaults = { 'type': 'sum', + 'display_detail': 'detail_flat', + 'sign': 1, } account_financial_report() @@ -2805,66 +3043,64 @@ class wizard_multi_charts_accounts(osv.osv_memory): 'seq_journal':fields.boolean('Separated Journal Sequences', help="Check this box if you want to use a different sequence for each created journal. Otherwise, all will use the same sequence."), "sale_tax": fields.many2one("account.tax.template", "Default Sale Tax"), "purchase_tax": fields.many2one("account.tax.template", "Default Purchase Tax"), + 'sale_tax_rate': fields.float('Sales Tax(%)'), + 'purchase_tax_rate': fields.float('Purchase Tax(%)'), + 'complete_tax_set': fields.boolean('Complete Set of Taxes', help='This boolean helps you to choose if you want to propose to the user to encode the sales and purchase rates or use the usual m2o fields. This last choice assumes that the set of tax defined for the chosen template is complete'), } def onchange_chart_template_id(self, cr, uid, ids, chart_template_id=False, context=None): res = {} - res['value'] = {} - res['value']["sale_tax"] = False - res['value']["purchase_tax"] = False + tax_templ_obj = self.pool.get('account.tax.template') + res['value'] = {'complete_tax_set': False, 'sale_tax': False, 'purchase_tax': False} if chart_template_id: - # default tax is given by the lowest sequence. For same sequence we will take the latest created as it will be the case for tax created while installing the generic chart of accounts - sale_tax_ids = self.pool.get('account.tax.template').search(cr, uid, [("chart_template_id" - , "=", chart_template_id), ('type_tax_use', 'in', ('sale','all'))], order="sequence, id desc") - purchase_tax_ids = self.pool.get('account.tax.template').search(cr, uid, [("chart_template_id" - , "=", chart_template_id), ('type_tax_use', 'in', ('purchase','all'))], order="sequence, id desc") + data = self.pool.get('account.chart.template').browse(cr, uid, chart_template_id, context=context) + res['value'].update({'complete_tax_set': data.complete_tax_set}) + if data.complete_tax_set: + # default tax is given by the lowest sequence. For same sequence we will take the latest created as it will be the case for tax created while isntalling the generic chart of account + sale_tax_ids = tax_templ_obj.search(cr, uid, [("chart_template_id" + , "=", chart_template_id), ('type_tax_use', 'in', ('sale','all'))], order="sequence, id desc") + purchase_tax_ids = tax_templ_obj.search(cr, uid, [("chart_template_id" + , "=", chart_template_id), ('type_tax_use', 'in', ('purchase','all'))], order="sequence, id desc") + res['value'].update({'sale_tax': sale_tax_ids and sale_tax_ids[0] or False, 'purchase_tax': purchase_tax_ids and purchase_tax_ids[0] or False}) - res['value']["sale_tax"] = sale_tax_ids and sale_tax_ids[0] or False - res['value']["purchase_tax"] = purchase_tax_ids and purchase_tax_ids[0] or False + if data.code_digits: + res['value'].update({'code_digits': data.code_digits}) return res - def _get_purchase_tax(self, cr, uid, context=None): - ids = self.pool.get('account.chart.template').search(cr, uid, [], context=context) + + def default_get(self, cr, uid, fields, context=None): + res = super(wizard_multi_charts_accounts, self).default_get(cr, uid, fields, context=context) + tax_templ_obj = self.pool.get('account.tax.template') + + if 'bank_accounts_id' in fields: + res.update({'bank_accounts_id': [{'acc_name': _('Current'), 'account_type': 'bank'}, + {'acc_name': _('Deposit'), 'account_type': 'bank'}, + {'acc_name': _('Cash'), 'account_type': 'cash'}]}) + if 'company_id' in fields: + res.update({'company_id': self.pool.get('res.users').browse(cr, uid, [uid], context=context)[0].company_id.id}) + if 'seq_journal' in fields: + res.update({'seq_journal': True}) + + ids = self.pool.get('account.chart.template').search(cr, uid, [('visible', '=', True)], context=context) if ids: - chart_template_id = ids[0] - purchase_tax_ids = self.pool.get('account.tax.template').search(cr, uid, [("chart_template_id" - , "=", chart_template_id), ('type_tax_use', 'in', ('purchase','all'))], order="sequence") - return purchase_tax_ids and purchase_tax_ids[0] or False - return False - - def _get_sale_tax(self, cr, uid, context=None): - ids = self.pool.get('account.chart.template').search(cr, uid, [], context=context) - if ids: - chart_template_id = ids[0] - sale_tax_ids = self.pool.get('account.tax.template').search(cr, uid, [("chart_template_id" - , "=", chart_template_id), ('type_tax_use', 'in', ('sale','all'))], order="sequence") - return sale_tax_ids and sale_tax_ids[0] or False - return False - - def _get_chart(self, cr, uid, context=None): - ids = self.pool.get('account.chart.template').search(cr, uid, [], context=context) - if ids: - return ids[0] - return False - - def _get_default_accounts(self, cr, uid, context=None): - return [ - {'acc_name': _('Cash'),'account_type':'cash'} - ] - - _defaults = { - 'company_id': lambda self, cr, uid, c: self.pool.get('res.users').browse(cr, uid, [uid], c)[0].company_id.id, - 'chart_template_id': _get_chart, - 'bank_accounts_id': _get_default_accounts, - 'sale_tax': _get_sale_tax, - 'purchase_tax': _get_purchase_tax, - 'code_digits': 6, - 'seq_journal': True - } + if 'chart_template_id' in fields: + res.update({'chart_template_id': ids[0]}) + if 'sale_tax' in fields: + sale_tax_ids = tax_templ_obj.search(cr, uid, [("chart_template_id" + , "=", ids[0]), ('type_tax_use', 'in', ('sale','all'))], order="sequence") + res.update({'sale_tax': sale_tax_ids and sale_tax_ids[0] or False}) + if 'purchase_tax' in fields: + purchase_tax_ids = tax_templ_obj.search(cr, uid, [("chart_template_id" + , "=", ids[0]), ('type_tax_use', 'in', ('purchase','all'))], order="sequence") + res.update({'purchase_tax': purchase_tax_ids and purchase_tax_ids[0] or False}) + return res def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): res = super(wizard_multi_charts_accounts, self).fields_view_get(cr, uid, view_id=view_id, view_type=view_type, context=context, toolbar=toolbar,submenu=False) cmp_select = [] - company_ids = self.pool.get('res.company').search(cr, uid, [], context=context) + acc_template_obj = self.pool.get('account.chart.template') + company_obj = self.pool.get('res.company') + + company_ids = company_obj.search(cr, uid, [], context=context) #display in the widget selection of companies, only the companies that haven't been configured yet (but don't care about the demo chart of accounts) cr.execute("SELECT company_id FROM account_account WHERE active = 't' AND account_account.parent_id IS NULL AND name != %s", ("Chart For Automated Tests",)) configured_cmp = [r[0] for r in cr.fetchall()] @@ -2874,305 +3110,118 @@ class wizard_multi_charts_accounts(osv.osv_memory): res['fields'][field]['domain'] = [('id','in',unconfigured_cmp)] res['fields'][field]['selection'] = [('', '')] if unconfigured_cmp: - cmp_select = [(line.id, line.name) for line in self.pool.get('res.company').browse(cr, uid, unconfigured_cmp)] + cmp_select = [(line.id, line.name) for line in company_obj.browse(cr, uid, unconfigured_cmp)] res['fields'][field]['selection'] = cmp_select return res - def execute(self, cr, uid, ids, context=None): - obj_multi = self.browse(cr, uid, ids[0]) - obj_acc = self.pool.get('account.account') - obj_acc_tax = self.pool.get('account.tax') + def check_created_journals(self, cr, uid, vals_journal, company_id, context=None): + """ + This method used for checking journals already created or not. If not then create new journal. + """ obj_journal = self.pool.get('account.journal') - obj_acc_template = self.pool.get('account.account.template') - obj_fiscal_position_template = self.pool.get('account.fiscal.position.template') - obj_fiscal_position = self.pool.get('account.fiscal.position') + rec_list = obj_journal.search(cr, uid, [('name','=', vals_journal['name']),('company_id', '=', company_id)], context=context) + if not rec_list: + obj_journal.create(cr, uid, vals_journal, context=context) + return True + + def generate_journals(self, cr, uid, chart_template_id, acc_template_ref, company_id, context=None): + """ + This method is used for creating journals. + + :param chart_temp_id: Chart Template Id. + :param acc_template_ref: Account templates reference. + :param company_id: company_id selected from wizard.multi.charts.accounts. + :returns: True + """ + journal_data = self._prepare_all_journals(cr, uid, chart_template_id, acc_template_ref, company_id, context=context) + for vals_journal in journal_data: + self.check_created_journals(cr, uid, vals_journal, company_id, context=context) + return True + + def _prepare_all_journals(self, cr, uid, chart_template_id, acc_template_ref, company_id, context=None): + def _get_analytic_journal(journal_type): + # Get the analytic journal + analytic_journal_ids = [] + if journal_type in ('sale', 'sale_refund'): + analytical_journal_ids = analytic_journal_obj.search(cr, uid, [('type','=','sale')], context=context) + elif journal_type in ('purchase', 'purchase_refund'): + analytical_journal_ids = analytic_journal_obj.search(cr, uid, [('type','=','purchase')], context=context) + elif journal_type == 'general': + analytical_journal_ids = analytic_journal_obj.search(cr, uid, [('type', '=', 'situation')], context=context) + return analytic_journal_ids and analytic_journal_ids[0] or False + + def _get_default_account(journal_type, type='debit'): + # Get the default accounts + default_account = False + if journal_type in ('sale', 'sale_refund'): + default_account = acc_template_ref.get(template.property_account_income_categ.id) + elif journal_type in ('purchase', 'purchase_refund'): + default_account = acc_template_ref.get(template.property_account_expense_categ.id) + elif journal_type == 'situation': + if type == 'debit': + default_account = acc_template_ref.get(template.property_account_expense_opening.id) + else: + default_account = acc_template_ref.get(template.property_account_income_opening.id) + return default_account + + def _get_view_id(journal_type): + # Get the journal views + if journal_type in ('general', 'situation'): + data = obj_data.get_object_reference(cr, uid, 'account', 'account_journal_view') + elif journal_type in ('sale_refund', 'purchase_refund'): + data = obj_data.get_object_reference(cr, uid, 'account', 'account_sp_refund_journal_view') + else: + data = obj_data.get_object_reference(cr, uid, 'account', 'account_sp_journal_view') + return data and data[1] or False + + journal_names = { + 'sale': _('Sales Journal'), + 'purchase': _('Purchase Journal'), + 'sale_refund': _('Sales Refund Journal'), + 'purchase_refund': _('Purchase Refund Journal'), + 'general': _('Miscellaneous Journal'), + 'situation': _('Opening Entries Journal'), + } + journal_codes = { + 'sale': _('SAJ'), + 'purchase': _('EXJ'), + 'sale_refund': _('SCNJ'), + 'purchase_refund': _('ECNJ'), + 'general': _('MISC'), + 'situation': _('OPEJ'), + } + obj_data = self.pool.get('ir.model.data') analytic_journal_obj = self.pool.get('account.analytic.journal') - obj_tax_code = self.pool.get('account.tax.code') - obj_tax_code_template = self.pool.get('account.tax.code.template') - ir_values_obj = self.pool.get('ir.values') - # Creating Account - obj_acc_root = obj_multi.chart_template_id.account_root_id - tax_code_root_id = obj_multi.chart_template_id.tax_code_root_id.id - company_id = obj_multi.company_id.id + template = self.pool.get('account.chart.template').browse(cr, uid, chart_template_id, context=context) - #new code - acc_template_ref = {} - tax_template_ref = {} - tax_code_template_ref = {} - todo_dict = {} - - #create all the tax code - children_tax_code_template = obj_tax_code_template.search(cr, uid, [('parent_id','child_of',[tax_code_root_id])], order='id') - children_tax_code_template.sort() - for tax_code_template in obj_tax_code_template.browse(cr, uid, children_tax_code_template, context=context): + journal_data = [] + for journal_type in ['sale', 'purchase', 'sale_refund', 'purchase_refund', 'general', 'situation']: vals = { - 'name': (tax_code_root_id == tax_code_template.id) and obj_multi.company_id.name or tax_code_template.name, - 'code': tax_code_template.code, - 'info': tax_code_template.info, - 'parent_id': tax_code_template.parent_id and ((tax_code_template.parent_id.id in tax_code_template_ref) and tax_code_template_ref[tax_code_template.parent_id.id]) or False, + 'type': journal_type, + 'name': journal_names[journal_type], + 'code': journal_codes[journal_type], 'company_id': company_id, - 'sign': tax_code_template.sign, + 'centralisation': journal_type == 'situation', + 'view_id': _get_view_id(journal_type), + 'analytic_journal_id': _get_analytic_journal(journal_type), + 'default_credit_account_id': _get_default_account(journal_type, 'credit'), + 'default_debit_account_id': _get_default_account(journal_type, 'debit'), } - new_tax_code = obj_tax_code.create(cr, uid, vals) - #recording the new tax code to do the mapping - tax_code_template_ref[tax_code_template.id] = new_tax_code + journal_data.append(vals) + return journal_data - #create all the tax - tax_template_to_tax = {} - for tax in obj_multi.chart_template_id.tax_template_ids: - #create it - vals_tax = { - 'name':tax.name, - 'sequence': tax.sequence, - 'amount':tax.amount, - 'type':tax.type, - 'applicable_type': tax.applicable_type, - 'domain':tax.domain, - 'parent_id': tax.parent_id and ((tax.parent_id.id in tax_template_ref) and tax_template_ref[tax.parent_id.id]) or False, - 'child_depend': tax.child_depend, - 'python_compute': tax.python_compute, - 'python_compute_inv': tax.python_compute_inv, - 'python_applicable': tax.python_applicable, - 'base_code_id': tax.base_code_id and ((tax.base_code_id.id in tax_code_template_ref) and tax_code_template_ref[tax.base_code_id.id]) or False, - 'tax_code_id': tax.tax_code_id and ((tax.tax_code_id.id in tax_code_template_ref) and tax_code_template_ref[tax.tax_code_id.id]) or False, - 'base_sign': tax.base_sign, - 'tax_sign': tax.tax_sign, - 'ref_base_code_id': tax.ref_base_code_id and ((tax.ref_base_code_id.id in tax_code_template_ref) and tax_code_template_ref[tax.ref_base_code_id.id]) or False, - 'ref_tax_code_id': tax.ref_tax_code_id and ((tax.ref_tax_code_id.id in tax_code_template_ref) and tax_code_template_ref[tax.ref_tax_code_id.id]) or False, - 'ref_base_sign': tax.ref_base_sign, - 'ref_tax_sign': tax.ref_tax_sign, - 'include_base_amount': tax.include_base_amount, - 'description':tax.description, - 'company_id': company_id, - 'type_tax_use': tax.type_tax_use, - 'price_include': tax.price_include - } - new_tax = obj_acc_tax.create(cr, uid, vals_tax) - tax_template_to_tax[tax.id] = new_tax - #as the accounts have not been created yet, we have to wait before filling these fields - todo_dict[new_tax] = { - 'account_collected_id': tax.account_collected_id and tax.account_collected_id.id or False, - 'account_paid_id': tax.account_paid_id and tax.account_paid_id.id or False, - } - tax_template_ref[tax.id] = new_tax - #deactivate the parent_store functionnality on account_account for rapidity purpose - ctx = context and context.copy() or {} - ctx['defer_parent_store_computation'] = True + def generate_properties(self, cr, uid, chart_template_id, acc_template_ref, company_id, context=None): + """ + This method used for creating properties. - children_acc_template = obj_acc_template.search(cr, uid, [('parent_id','child_of',[obj_acc_root.id]),('nocreate','!=',True)]) - children_acc_template.sort() - for account_template in obj_acc_template.browse(cr, uid, children_acc_template, context=context): - tax_ids = [] - for tax in account_template.tax_ids: - tax_ids.append(tax_template_ref[tax.id]) - #create the account_account - - dig = obj_multi.code_digits - code_main = account_template.code and len(account_template.code) or 0 - code_acc = account_template.code or '' - if code_main>0 and code_main<=dig and account_template.type != 'view': - code_acc=str(code_acc) + (str('0'*(dig-code_main))) - vals={ - 'name': (obj_acc_root.id == account_template.id) and obj_multi.company_id.name or account_template.name, - 'currency_id': account_template.currency_id and account_template.currency_id.id or False, - 'code': code_acc, - 'type': account_template.type, - 'user_type': account_template.user_type and account_template.user_type.id or False, - 'reconcile': account_template.reconcile, - 'shortcut': account_template.shortcut, - 'note': account_template.note, - 'parent_id': account_template.parent_id and ((account_template.parent_id.id in acc_template_ref) and acc_template_ref[account_template.parent_id.id]) or False, - 'tax_ids': [(6,0,tax_ids)], - 'company_id': company_id, - } - new_account = obj_acc.create(cr, uid, vals, context=ctx) - acc_template_ref[account_template.id] = new_account - - - #reactivate the parent_store functionnality on account_account - obj_acc._parent_store_compute(cr) - - for key,value in todo_dict.items(): - if value['account_collected_id'] or value['account_paid_id']: - obj_acc_tax.write(cr, uid, [key], { - 'account_collected_id': acc_template_ref.get(value['account_collected_id'], False), - 'account_paid_id': acc_template_ref.get(value['account_paid_id'], False), - }) - - # Creating Journals - data_id = obj_data.search(cr, uid, [('model','=','account.journal.view'), ('name','=','account_sp_journal_view')]) - data = obj_data.browse(cr, uid, data_id[0], context=context) - view_id = data.res_id - - #Sales Journal - analytical_sale_ids = analytic_journal_obj.search(cr,uid,[('type','=','sale')]) - analytical_journal_sale = analytical_sale_ids and analytical_sale_ids[0] or False - - vals_journal = { - 'name': _('Sales Journal'), - 'type': 'sale', - 'code': _('SAJ'), - 'view_id': view_id, - 'company_id': company_id, - 'analytic_journal_id': analytical_journal_sale, - } - - if obj_multi.chart_template_id.property_account_receivable: - vals_journal['default_credit_account_id'] = acc_template_ref[obj_multi.chart_template_id.property_account_income_categ.id] - vals_journal['default_debit_account_id'] = acc_template_ref[obj_multi.chart_template_id.property_account_income_categ.id] - - obj_journal.create(cr,uid,vals_journal) - - # Purchase Journal - analytical_purchase_ids = analytic_journal_obj.search(cr,uid,[('type','=','purchase')]) - analytical_journal_purchase = analytical_purchase_ids and analytical_purchase_ids[0] or False - - vals_journal = { - 'name': _('Purchase Journal'), - 'type': 'purchase', - 'code': _('EXJ'), - 'view_id': view_id, - 'company_id': company_id, - 'analytic_journal_id': analytical_journal_purchase, - } - - if obj_multi.chart_template_id.property_account_payable: - vals_journal['default_credit_account_id'] = acc_template_ref[obj_multi.chart_template_id.property_account_expense_categ.id] - vals_journal['default_debit_account_id'] = acc_template_ref[obj_multi.chart_template_id.property_account_expense_categ.id] - obj_journal.create(cr,uid,vals_journal) - - # Creating Journals Sales Refund and Purchase Refund - data_id = obj_data.search(cr, uid, [('model', '=', 'account.journal.view'), ('name', '=', 'account_sp_refund_journal_view')], context=context) - data = obj_data.browse(cr, uid, data_id[0], context=context) - view_id = data.res_id - - #Sales Refund Journal - vals_journal = { - 'name': _('Sales Refund Journal'), - 'type': 'sale_refund', - 'code': _('SCNJ'), - 'view_id': view_id, - 'analytic_journal_id': analytical_journal_sale, - 'company_id': company_id - } - - if obj_multi.chart_template_id.property_account_receivable: - vals_journal['default_credit_account_id'] = acc_template_ref[obj_multi.chart_template_id.property_account_income_categ.id] - vals_journal['default_debit_account_id'] = acc_template_ref[obj_multi.chart_template_id.property_account_income_categ.id] - - obj_journal.create(cr, uid, vals_journal, context=context) - - # Purchase Refund Journal - vals_journal = { - 'name': _('Purchase Refund Journal'), - 'type': 'purchase_refund', - 'code': _('ECNJ'), - 'view_id': view_id, - 'analytic_journal_id': analytical_journal_purchase, - 'company_id': company_id - } - - if obj_multi.chart_template_id.property_account_payable: - vals_journal['default_credit_account_id'] = acc_template_ref[obj_multi.chart_template_id.property_account_expense_categ.id] - vals_journal['default_debit_account_id'] = acc_template_ref[obj_multi.chart_template_id.property_account_expense_categ.id] - - obj_journal.create(cr, uid, vals_journal, context=context) - - # Miscellaneous Journal - data_id = obj_data.search(cr, uid, [('model','=','account.journal.view'), ('name','=','account_journal_view')]) - data = obj_data.browse(cr, uid, data_id[0], context=context) - view_id = data.res_id - - analytical_miscellaneous_ids = analytic_journal_obj.search(cr, uid, [('type', '=', 'situation')], context=context) - analytical_journal_miscellaneous = analytical_miscellaneous_ids and analytical_miscellaneous_ids[0] or False - - vals_journal = { - 'name': _('Miscellaneous Journal'), - 'type': 'general', - 'code': _('MISC'), - 'view_id': view_id, - 'analytic_journal_id': analytical_journal_miscellaneous, - 'company_id': company_id - } - - obj_journal.create(cr, uid, vals_journal, context=context) - - # Opening Entries Journal - if obj_multi.chart_template_id.property_account_income_opening and obj_multi.chart_template_id.property_account_expense_opening: - vals_journal = { - 'name': _('Opening Entries Journal'), - 'type': 'situation', - 'code': _('OPEJ'), - 'view_id': view_id, - 'company_id': company_id, - 'centralisation': True, - 'default_credit_account_id': acc_template_ref[obj_multi.chart_template_id.property_account_income_opening.id], - 'default_debit_account_id': acc_template_ref[obj_multi.chart_template_id.property_account_expense_opening.id] - } - obj_journal.create(cr, uid, vals_journal, context=context) - - # Bank Journals - data_id = obj_data.search(cr, uid, [('model','=','account.journal.view'), ('name','=','account_journal_bank_view')]) - data = obj_data.browse(cr, uid, data_id[0], context=context) - view_id_cash = data.res_id - - data_id = obj_data.search(cr, uid, [('model','=','account.journal.view'), ('name','=','account_journal_bank_view_multi')]) - data = obj_data.browse(cr, uid, data_id[0], context=context) - view_id_cur = data.res_id - ref_acc_bank = obj_multi.chart_template_id.bank_account_view_id - - current_num = 1 - valid = True - for line in obj_multi.bank_accounts_id: - #create the account_account for this bank journal - tmp = line.acc_name - dig = obj_multi.code_digits - if not ref_acc_bank.code: - raise osv.except_osv(_('Configuration Error !'), _('The bank account defined on the selected chart of accounts hasn\'t a code.')) - while True: - new_code = str(ref_acc_bank.code.ljust(dig-len(str(current_num)), '0')) + str(current_num) - ids = obj_acc.search(cr, uid, [('code', '=', new_code), ('company_id', '=', company_id)]) - if not ids: - break - else: - current_num += 1 - vals = { - 'name': tmp, - 'currency_id': line.currency_id and line.currency_id.id or False, - 'code': new_code, - 'type': 'liquidity', - 'user_type': account_template.user_type and account_template.user_type.id or False, - 'reconcile': True, - 'parent_id': acc_template_ref[ref_acc_bank.id] or False, - 'company_id': company_id, - } - acc_cash_id = obj_acc.create(cr,uid,vals) - - #create the bank journal - vals_journal = { - 'name': vals['name'], - 'code': _('BNK') + str(current_num), - 'type': line.account_type == 'cash' and 'cash' or 'bank', - 'company_id': company_id, - 'analytic_journal_id': False, - 'currency': False, - } - if line.currency_id: - vals_journal['view_id'] = view_id_cur - vals_journal['currency'] = line.currency_id.id - else: - vals_journal['view_id'] = view_id_cash - vals_journal['default_credit_account_id'] = acc_cash_id - vals_journal['default_debit_account_id'] = acc_cash_id - obj_journal.create(cr, uid, vals_journal) - current_num += 1 - valid = True - - #create the properties + :param chart_template_id: id of the current chart template for which we need to create properties + :param acc_template_ref: Mapping between ids of account templates and real accounts created from them + :param company_id: company_id selected from wizard.multi.charts.accounts. + :returns: True + """ property_obj = self.pool.get('ir.property') - fields_obj = self.pool.get('ir.model.fields') - + field_obj = self.pool.get('ir.model.fields') todo_list = [ ('property_account_receivable','res.partner','account.account'), ('property_account_payable','res.partner','account.account'), @@ -3182,61 +3231,314 @@ class wizard_multi_charts_accounts(osv.osv_memory): ('property_account_income','product.template','account.account'), ('property_reserve_and_surplus_account','res.company','account.account') ] + template = self.pool.get('account.chart.template').browse(cr, uid, chart_template_id, context=context) for record in todo_list: - r = [] - r = property_obj.search(cr, uid, [('name','=', record[0] ),('company_id','=',company_id)]) - account = getattr(obj_multi.chart_template_id, record[0]) - field = fields_obj.search(cr, uid, [('name','=',record[0]),('model','=',record[1]),('relation','=',record[2])]) - vals = { - 'name': record[0], - 'company_id': company_id, - 'fields_id': field[0], - 'value': account and 'account.account,' + str(acc_template_ref[account.id]) or False, + account = getattr(template, record[0]) + value = account and 'account.account,' + str(acc_template_ref[account.id]) or False + if value: + field = field_obj.search(cr, uid, [('name', '=', record[0]),('model', '=', record[1]),('relation', '=', record[2])], context=context) + vals = { + 'name': record[0], + 'company_id': company_id, + 'fields_id': field[0], + 'value': value, + } + property_ids = property_obj.search(cr, uid, [('name','=', record[0]),('company_id', '=', company_id)], context=context) + if property_ids: + #the property exist: modify it + property_obj.write(cr, uid, property_ids, vals, context=context) + else: + #create the property + property_obj.create(cr, uid, vals, context=context) + return True + + def _install_template(self, cr, uid, template_id, company_id, code_digits=None, obj_wizard=None, acc_ref={}, taxes_ref={}, tax_code_ref={}, context=None): + ''' + This function recursively loads the template objects and create the real objects from them. + + :param template_id: id of the chart template to load + :param company_id: id of the company the wizard is running for + :param code_digits: integer that depicts the number of digits the accounts code should have in the COA + :param obj_wizard: the current wizard for generating the COA from the templates + :param acc_ref: Mapping between ids of account templates and real accounts created from them + :param taxes_ref: Mapping between ids of tax templates and real taxes created from them + :param tax_code_ref: Mapping between ids of tax code templates and real tax codes created from them + :returns: return a tuple with a dictionary containing + * the mapping between the account template ids and the ids of the real accounts that have been generated + from them, as first item, + * a similar dictionary for mapping the tax templates and taxes, as second item, + * a last identical containing the mapping of tax code templates and tax codes + :rtype: tuple(dict, dict, dict) + ''' + template = self.pool.get('account.chart.template').browse(cr, uid, template_id, context=context) + if template.parent_id: + tmp1, tmp2, tmp3 = self._install_template(cr, uid, template.parent_id.id, company_id, code_digits=code_digits, acc_ref=acc_ref, taxes_ref=taxes_ref, tax_code_ref=tax_code_ref, context=context) + acc_ref.update(tmp1) + taxes_ref.update(tmp2) + tax_code_ref.update(tmp3) + tmp1, tmp2, tmp3 = self._load_template(cr, uid, template_id, company_id, code_digits=code_digits, obj_wizard=obj_wizard, account_ref=acc_ref, taxes_ref=taxes_ref, tax_code_ref=tax_code_ref, context=context) + acc_ref.update(tmp1) + taxes_ref.update(tmp2) + tax_code_ref.update(tmp3) + return acc_ref, taxes_ref, tax_code_ref + + def _load_template(self, cr, uid, template_id, company_id, code_digits=None, obj_wizard=None, account_ref={}, taxes_ref={}, tax_code_ref={}, context=None): + ''' + This function generates all the objects from the templates + + :param template_id: id of the chart template to load + :param company_id: id of the company the wizard is running for + :param code_digits: integer that depicts the number of digits the accounts code should have in the COA + :param obj_wizard: the current wizard for generating the COA from the templates + :param acc_ref: Mapping between ids of account templates and real accounts created from them + :param taxes_ref: Mapping between ids of tax templates and real taxes created from them + :param tax_code_ref: Mapping between ids of tax code templates and real tax codes created from them + :returns: return a tuple with a dictionary containing + * the mapping between the account template ids and the ids of the real accounts that have been generated + from them, as first item, + * a similar dictionary for mapping the tax templates and taxes, as second item, + * a last identical containing the mapping of tax code templates and tax codes + :rtype: tuple(dict, dict, dict) + ''' + template = self.pool.get('account.chart.template').browse(cr, uid, template_id, context=context) + obj_tax_code_template = self.pool.get('account.tax.code.template') + obj_acc_tax = self.pool.get('account.tax') + obj_tax_temp = self.pool.get('account.tax.template') + obj_acc_template = self.pool.get('account.account.template') + obj_fiscal_position_template = self.pool.get('account.fiscal.position.template') + + # create all the tax code. + tax_code_ref.update(obj_tax_code_template.generate_tax_code(cr, uid, template.tax_code_root_id.id, company_id, context=context)) + + # Generate taxes from templates. + tax_templates = [x for x in template.tax_template_ids] + generated_tax_res = obj_tax_temp._generate_tax(cr, uid, tax_templates, tax_code_ref, company_id, context=context) + taxes_ref.update(generated_tax_res['tax_template_to_tax']) + + # Generating Accounts from templates. + account_template_ref = obj_acc_template.generate_account(cr, uid, template_id, taxes_ref, account_ref, code_digits, company_id, context=context) + account_ref.update(account_template_ref) + + # writing account values on tax after creation of accounts + for key,value in generated_tax_res['account_dict'].items(): + if value['account_collected_id'] or value['account_paid_id']: + obj_acc_tax.write(cr, uid, [key], { + 'account_collected_id': account_ref.get(value['account_collected_id'], False), + 'account_paid_id': account_ref.get(value['account_paid_id'], False), + }) + + # Create Journals + self.generate_journals(cr, uid, template_id, account_ref, company_id, context=context) + + # generate properties function + self.generate_properties(cr, uid, template_id, account_ref, company_id, context=context) + + # Generate Fiscal Position , Fiscal Position Accounts and Fiscal Position Taxes from templates + obj_fiscal_position_template.generate_fiscal_position(cr, uid, template_id, taxes_ref, account_ref, company_id, context=context) + + return account_ref, taxes_ref, tax_code_ref + + def _create_tax_templates_from_rates(self, cr, uid, obj_wizard, company_id, context=None): + ''' + This function checks if the chosen chart template is configured as containing a full set of taxes, and if + it's not the case, it creates the templates for account.tax.code and for account.account.tax objects accordingly + to the provided sale/purchase rates. Then it saves the new tax templates as default taxes to use for this chart + template. + + :param obj_wizard: browse record of wizard to generate COA from templates + :param company_id: id of the company for wich the wizard is running + :return: True + ''' + obj_tax_code_template = self.pool.get('account.tax.code.template') + obj_tax_temp = self.pool.get('account.tax.template') + chart_template = obj_wizard.chart_template_id + vals = {} + # create tax templates and tax code templates from purchase_tax_rate and sale_tax_rate fields + if not chart_template.complete_tax_set: + tax_data = { + 'sale': obj_wizard.sale_tax_rate, + 'purchase': obj_wizard.purchase_tax_rate, } - if r: - #the property exist: modify it - property_obj.write(cr, uid, r, vals) - else: - #create the property - property_obj.create(cr, uid, vals) + for tax_type, value in tax_data.items(): + # don't consider cases where entered value in rates are lower than 0 + if value >= 0.0: + #create the tax code templates for base and tax + base_code_vals = { + 'name': (tax_type == 'sale' and _('Taxable Sales at %s') or _('Taxable Purchases at %s')) % value, + 'code': (tax_type == 'sale' and _('BASE-S-%s') or _('BASE-P-%s')) %value, + 'parent_id': chart_template.tax_code_root_id.id, + 'company_id': company_id, + } + new_base_code_id = obj_tax_code_template.create(cr, uid, base_code_vals, context=context) + tax_code_vals = { + 'name': (tax_type == 'sale' and _('Tax Received at %s') or _('Tax Paid at %s')) % value, + 'code': (tax_type == 'sale' and _('TAX-S-%s') or _('TAX-P-%s')) %value, + 'parent_id': chart_template.tax_code_root_id.id, + 'company_id': company_id, + } + new_tax_code_id = obj_tax_code_template.create(cr, uid, tax_code_vals, context=context) + #create the tax + tax_template_id = obj_tax_temp.create(cr, uid, { + 'name': _('Tax %s%%') % value, + 'amount': value/100, + 'base_code_id': new_base_code_id, + 'tax_code_id': new_tax_code_id, + 'ref_base_code_id': new_base_code_id, + 'ref_tax_code_id': new_tax_code_id, + 'type_tax_use': tax_type, + 'type': 'percent', + 'sequence': 0, + 'chart_template_id': chart_template.id or False, + }, context=context) + #record this new tax_template as default for this chart template + field_name = tax_type == 'sale' and 'sale_tax' or 'purchase_tax' + vals[field_name] = tax_template_id + self.write(cr, uid, obj_wizard.id, vals, context=context) + return True - fp_ids = obj_fiscal_position_template.search(cr, uid, [('chart_template_id', '=', obj_multi.chart_template_id.id)]) + def execute(self, cr, uid, ids, context=None): + ''' + This function is called at the confirmation of the wizard to generate the COA from the templates. It will read + all the provided information to create the accounts, the banks, the journals, the taxes, the tax codes, the + accounting properties... accordingly for the chosen company. + ''' + ir_values_obj = self.pool.get('ir.values') + obj_wizard = self.browse(cr, uid, ids[0]) + company_id = obj_wizard.company_id.id + # If the floats for sale/purchase rates have been filled, create templates from them + self._create_tax_templates_from_rates(cr, uid, obj_wizard, company_id, context=context) - if fp_ids: - obj_tax_fp = self.pool.get('account.fiscal.position.tax') - obj_ac_fp = self.pool.get('account.fiscal.position.account') + # Install all the templates objects and generate the real objects + acc_template_ref, taxes_ref, tax_code_ref = self._install_template(cr, uid, obj_wizard.chart_template_id.id, company_id, code_digits=obj_wizard.code_digits, obj_wizard=obj_wizard, context=context) - for position in obj_fiscal_position_template.browse(cr, uid, fp_ids, context=context): + # write values of default taxes for product + if obj_wizard.sale_tax and taxes_ref: + ir_values_obj.set(cr, uid, key='default', key2=False, name="taxes_id", company=company_id, + models =[('product.product',False)], value=[taxes_ref[obj_wizard.sale_tax.id]]) + if obj_wizard.purchase_tax and taxes_ref: + ir_values_obj.set(cr, uid, key='default', key2=False, name="supplier_taxes_id", company=company_id, + models =[('product.product',False)], value=[taxes_ref[obj_wizard.purchase_tax.id]]) - vals_fp = { - 'company_id': company_id, - 'name': position.name, + # Create Bank journals + self._create_bank_journals_from_o2m(cr, uid, obj_wizard, company_id, acc_template_ref, context=context) + return {'type' : 'ir.actions.act_window_close'} + + def _prepare_bank_journal(self, cr, uid, line, current_num, default_account_id, company_id, context=None): + ''' + This function prepares the value to use for the creation of a bank journal created through the wizard of + generating COA from templates. + + :param line: dictionary containing the values encoded by the user related to his bank account + :param current_num: integer corresponding to a counter of the already created bank journals through this wizard. + :param default_account_id: id of the default debit.credit account created before for this journal. + :param company_id: id of the company for which the wizard is running + :return: mapping of field names and values + :rtype: dict + ''' + obj_data = self.pool.get('ir.model.data') + # Get the id of journal views + tmp = obj_data.get_object_reference(cr, uid, 'account', 'account_journal_bank_view_multi') + view_id_cur = tmp and tmp[1] or False + tmp = obj_data.get_object_reference(cr, uid, 'account', 'account_journal_bank_view') + view_id_cash = tmp and tmp[1] or False + vals = { + 'name': line['acc_name'], + 'code': _('BNK') + str(current_num), + 'type': line['account_type'] == 'cash' and 'cash' or 'bank', + 'company_id': company_id, + 'analytic_journal_id': False, + 'currency': False, + 'default_credit_account_id': default_account_id, + 'default_debit_account_id': default_account_id, + } + if line['currency_id']: + vals['view_id'] = view_id_cur + vals['currency'] = line['currency_id'] + else: + vals['view_id'] = view_id_cash + return vals + + def _prepare_bank_account(self, cr, uid, line, new_code, acc_template_ref, ref_acc_bank, company_id, context=None): + ''' + This function prepares the value to use for the creation of the default debit and credit accounts of a + bank journal created through the wizard of generating COA from templates. + + :param line: dictionary containing the values encoded by the user related to his bank account + :param new_code: integer corresponding to the next available number to use as account code + :param acc_template_ref: the dictionary containing the mapping between the ids of account templates and the ids + of the accounts that have been generated from them. + :param ref_acc_bank: browse record of the account template set as root of all bank accounts for the chosen + template + :param company_id: id of the company for which the wizard is running + :return: mapping of field names and values + :rtype: dict + ''' + obj_data = self.pool.get('ir.model.data') + + # Get the id of the user types fr-or cash and bank + tmp = obj_data.get_object_reference(cr, uid, 'account', 'data_account_type_cash') + cash_type = tmp and tmp[1] or False + tmp = obj_data.get_object_reference(cr, uid, 'account', 'data_account_type_bank') + bank_type = tmp and tmp[1] or False + return { + 'name': line['acc_name'], + 'currency_id': line['currency_id'], + 'code': new_code, + 'type': 'liquidity', + 'user_type': line['account_type'] == 'cash' and cash_type or bank_type, + 'parent_id': acc_template_ref[ref_acc_bank.id] or False, + 'company_id': company_id, + } + + def _create_bank_journals_from_o2m(self, cr, uid, obj_wizard, company_id, acc_template_ref, context=None): + ''' + This function creates bank journals and its accounts for each line encoded in the field bank_accounts_id of the + wizard. + + :param obj_wizard: the current wizard that generates the COA from the templates. + :param company_id: the id of the company for which the wizard is running. + :param acc_template_ref: the dictionary containing the mapping between the ids of account templates and the ids + of the accounts that have been generated from them. + :return: True + ''' + obj_acc = self.pool.get('account.account') + obj_journal = self.pool.get('account.journal') + code_digits = obj_wizard.code_digits + + # Build a list with all the data to process + journal_data = [] + if obj_wizard.bank_accounts_id: + for acc in obj_wizard.bank_accounts_id: + vals = { + 'acc_name': acc.acc_name, + 'account_type': acc.account_type, + 'currency_id': acc.currency_id.id, } - new_fp = obj_fiscal_position.create(cr, uid, vals_fp) + journal_data.append(vals) + ref_acc_bank = obj_wizard.chart_template_id.bank_account_view_id + if journal_data and not ref_acc_bank.code: + raise osv.except_osv(_('Configuration Error !'), _('The bank account defined on the selected chart of accounts hasn\'t a code.')) - for tax in position.tax_ids: - vals_tax = { - 'tax_src_id': tax_template_ref[tax.tax_src_id.id], - 'tax_dest_id': tax.tax_dest_id and tax_template_ref[tax.tax_dest_id.id] or False, - 'position_id': new_fp, - } - obj_tax_fp.create(cr, uid, vals_tax) + current_num = 1 + for line in journal_data: + # Seek the next available number for the account code + while True: + new_code = str(ref_acc_bank.code.ljust(code_digits-len(str(current_num)), '0')) + str(current_num) + ids = obj_acc.search(cr, uid, [('code', '=', new_code), ('company_id', '=', company_id)]) + if not ids: + break + else: + current_num += 1 + # Create the default debit/credit accounts for this bank journal + vals = self._prepare_bank_account(cr, uid, line, new_code, acc_template_ref, ref_acc_bank, company_id, context=context) + default_account_id = obj_acc.create(cr, uid, vals, context=context) - for acc in position.account_ids: - vals_acc = { - 'account_src_id': acc_template_ref[acc.account_src_id.id], - 'account_dest_id': acc_template_ref[acc.account_dest_id.id], - 'position_id': new_fp, - } - obj_ac_fp.create(cr, uid, vals_acc) - - if obj_multi.sale_tax: - ir_values_obj.set(cr, uid, key='default', key2=False, name="taxes_id", company=obj_multi.company_id.id, - models =[('product.product',False)], value=[tax_template_to_tax[obj_multi.sale_tax.id]]) - if obj_multi.purchase_tax: - ir_values_obj.set(cr, uid, key='default', key2=False, name="supplier_taxes_id", company=obj_multi.company_id.id, - models =[('product.product',False)], value=[tax_template_to_tax[obj_multi.purchase_tax.id]]) + #create the bank journal + vals_journal = self._prepare_bank_journal(cr, uid, line, current_num, default_account_id, company_id, context=context) + obj_journal.create(cr, uid, vals_journal) + current_num += 1 + return True wizard_multi_charts_accounts() diff --git a/addons/account/account_bank_statement.py b/addons/account/account_bank_statement.py index 85d9805eb32..53195c345f9 100644 --- a/addons/account/account_bank_statement.py +++ b/addons/account/account_bank_statement.py @@ -34,8 +34,6 @@ class account_bank_statement(osv.osv): for line in vals['line_ids']: seq += 1 line[2]['sequence'] = seq - new_line_ids += tuple(line) - vals['line_ids'] = new_line_ids return super(account_bank_statement, self).create(cr, uid, vals, context=context) def write(self, cr, uid, ids, vals, context=None): @@ -129,7 +127,7 @@ class account_bank_statement(osv.osv): _name = "account.bank.statement" _description = "Bank Statement" _columns = { - 'name': fields.char('Name', size=64, required=True, states={'draft': [('readonly', False)]}, readonly=True, help='if you give the Name other then /, its created Accounting Entries Move will be with same name as statement name. This allows the statement entries to have the same references than the statement itself'), # readonly for account_cash_statement + 'name': fields.char('Name', size=64, required=True, states={'draft': [('readonly', False)]}, readonly=True, help='If you enter a statement name other than /, its created accounting entries move name will be the statement name appended with /1, /2, /3, etc. This allows statement entries to have a reference to the bank statement they appeared on.'), # readonly for account_cash_statement 'date': fields.date('Date', required=True, states={'confirm': [('readonly', True)]}), 'journal_id': fields.many2one('account.journal', 'Journal', required=True, readonly=True, states={'draft':[('readonly',False)]}), diff --git a/addons/account/account_installer.xml b/addons/account/account_installer.xml index e249f8fa872..430d65e0bf9 100644 --- a/addons/account/account_installer.xml +++ b/addons/account/account_installer.xml @@ -25,7 +25,7 @@ - + @@ -34,10 +34,6 @@ - - - - diff --git a/addons/account/account_invoice.py b/addons/account/account_invoice.py index 39cc471c2f6..6fcc211bd84 100644 --- a/addons/account/account_invoice.py +++ b/addons/account/account_invoice.py @@ -261,7 +261,7 @@ class account_invoice(osv.osv): 'partner_bank_id': fields.many2one('res.partner.bank', 'Bank Account', help='Bank Account Number, Company bank account if Invoice is customer or supplier refund, otherwise Partner bank account number.', readonly=True, states={'draft':[('readonly',False)]}), 'move_lines':fields.function(_get_lines, type='many2many', relation='account.move.line', string='Entry Lines'), - 'residual': fields.function(_amount_residual, digits_compute=dp.get_precision('Account'), string='Residual', + 'residual': fields.function(_amount_residual, digits_compute=dp.get_precision('Account'), string='To Pay', store={ 'account.invoice': (lambda self, cr, uid, ids, c={}: ids, ['invoice_line','move_id'], 50), 'account.invoice.tax': (_get_invoice_tax, None, 50), @@ -610,15 +610,15 @@ class account_invoice(osv.osv): res[r[0]].append( r[1] ) return res - def copy(self, cr, uid, id, default={}, context=None): - if context is None: - context = {} + def copy(self, cr, uid, id, default=None, context=None): + default = default or {} default.update({ 'state':'draft', 'number':False, 'move_id':False, 'move_name':False, 'internal_number': False, + 'period_id': False, }) if 'date_invoice' not in default: default.update({ @@ -1642,12 +1642,7 @@ class res_partner(osv.osv): } def copy(self, cr, uid, id, default=None, context=None): - if default is None: - default = {} - - if context is None: - context = {} - + default = default or {} default.update({'invoice_ids' : []}) return super(res_partner, self).copy(cr, uid, id, default, context) diff --git a/addons/account/account_invoice_view.xml b/addons/account/account_invoice_view.xml index 4cc1a63db61..55d27e2e842 100644 --- a/addons/account/account_invoice_view.xml +++ b/addons/account/account_invoice_view.xml @@ -120,7 +120,7 @@ - + @@ -269,15 +269,13 @@ - - + + + + - - - @@ -362,13 +360,13 @@ - + - + - - diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py index 55e154eed6d..e54024a6dcb 100644 --- a/addons/account/account_move_line.py +++ b/addons/account/account_move_line.py @@ -581,14 +581,14 @@ class account_move_line(osv.osv): lines = self.browse(cr, uid, ids, context=context) for l in lines: if l.account_id.type == 'view': - return False + raise osv.except_osv(_('Error :'), _('You can not create move line on view account %s %s') % (l.account_id.code, l.account_id.name)) return True def _check_no_closed(self, cr, uid, ids, context=None): lines = self.browse(cr, uid, ids, context=context) for l in lines: if l.account_id.type == 'closed': - return False + raise osv.except_osv(_('Error :'), _('You can not create move line on closed account %s %s') % (l.account_id.code, l.account_id.name)) return True def _check_company_id(self, cr, uid, ids, context=None): @@ -1249,6 +1249,8 @@ class account_move_line(osv.osv): if len(period_candidate_ids) != 1: raise osv.except_osv(_('Encoding error'), _('No period found or period given is ambigous.')) context['period_id'] = period_candidate_ids[0][0] + if not context.get('journal_id', False) and context.get('search_default_journal_id', False): + context['journal_id'] = context.get('search_default_journal_id') self._update_journal_check(cr, uid, context['journal_id'], context['period_id'], context) move_id = vals.get('move_id', False) journal = journal_obj.browse(cr, uid, context['journal_id'], context=context) diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml index 0d664d45d32..9ae59f62456 100644 --- a/addons/account/account_view.xml +++ b/addons/account/account_view.xml @@ -303,6 +303,9 @@ + + + @@ -326,6 +329,7 @@ @@ -786,7 +790,6 @@ - @@ -1753,18 +1756,18 @@
- - - - - - - - - - - - + + + + + + + + + + + + @@ -2114,6 +2117,7 @@ + @@ -2184,9 +2188,13 @@ - - - + + + + + + + @@ -2270,7 +2278,9 @@ - + + + @@ -2437,10 +2447,13 @@ - - - - + + + + + + + @@ -2476,6 +2489,9 @@ act_window_ids = pool.get('ir.actions.act_window').search(cr, uid,[('name', 'in', ('Accounting Chart Configuration', 'Generate Chart of Accounts from a Chart Template'))], context=context) +ref = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'account', 'action_account_configuration_installer') +if ref: + act_window_ids += [ref[1]] todo_ids = pool.get('ir.actions.todo').search(cr, uid, [('action_id', 'in', act_window_ids)], context=context) pool.get('ir.actions.todo').write(cr, uid, todo_ids, {'state':'open'}, context=context) action = pool.get('res.config').next(cr, uid, [], context) @@ -2767,10 +2783,14 @@ action = pool.get('res.config').next(cr, uid, [], context) + - - - + + + + + @@ -2779,9 +2799,6 @@ action = pool.get('res.config').next(cr, uid, [], context) - - - diff --git a/addons/account/board_account_view.xml b/addons/account/board_account_view.xml index 5108a62cf3e..ffd2811cba7 100644 --- a/addons/account/board_account_view.xml +++ b/addons/account/board_account_view.xml @@ -41,12 +41,11 @@
- + -
diff --git a/addons/account/configurable_account_chart.xml b/addons/account/configurable_account_chart.xml index 0ac7a51405d..7e1de5b5f7e 100644 --- a/addons/account/configurable_account_chart.xml +++ b/addons/account/configurable_account_chart.xml @@ -1,26 +1,6 @@ - + - - Receivable - receivable - income - unreconciled - - - - Payable - payable - expense - unreconciled - - - - View - view - none - - Income View view @@ -41,78 +21,32 @@ liability liability - - - Income - income - income - none - - - - Expense - expense - expense - none - - Tax tax - expense unreconciled + expense - - - Cash - cash - asset - balance - - - - Liability - liability - liability - balance - - - - Asset - asset - asset - balance - - Equity equity + balance liability - balance - - - Bank - bank - asset - balance - - + Check check - asset balance + asset - - 0 Configurable Account Chart view - + @@ -122,7 +56,7 @@ Balance Sheet view - + @@ -162,7 +96,7 @@ Purchased Stocks other - + @@ -171,7 +105,7 @@ receivable - + @@ -179,7 +113,7 @@ Tax Paid other - + @@ -195,7 +129,7 @@ Opening Income Account other - + @@ -212,7 +146,7 @@ payable - + @@ -220,7 +154,7 @@ Tax Received other - + @@ -229,7 +163,7 @@ other - + @@ -237,7 +171,7 @@ Opening Expense Account other - + @@ -247,7 +181,7 @@ Profit and Loss view - + @@ -263,7 +197,7 @@ Product Sales other - + @@ -279,7 +213,7 @@ Cost of Goods Sold other - + @@ -295,7 +229,7 @@ Expenses other - + @@ -303,7 +237,7 @@ Salary Expenses other - + diff --git a/addons/account/data/data_account_type.xml b/addons/account/data/data_account_type.xml new file mode 100644 index 00000000000..590357ef080 --- /dev/null +++ b/addons/account/data/data_account_type.xml @@ -0,0 +1,55 @@ + + + + + View + view + none + + + Receivable + receivable + unreconciled + + + Payable + payable + unreconciled + + + Bank + bank + balance + + + Cash + cash + balance + + + Asset + asset + balance + asset + + + Liability + liability + balance + liability + + + Income + income + none + income + + + Expense + expense + none + expense + + + + diff --git a/addons/account/data/data_financial_report.xml b/addons/account/data/data_financial_report.xml new file mode 100644 index 00000000000..18624f94749 --- /dev/null +++ b/addons/account/data/data_financial_report.xml @@ -0,0 +1,43 @@ + + + + + + Balance Sheet + sum + + + Assets + + detail_with_hierarchy + account_type + + + Liability + + detail_with_hierarchy + account_type + + + + Profit and Loss + sum + + + Income + + detail_with_hierarchy + account_type + + + Expense + + detail_with_hierarchy + account_type + + + + + diff --git a/addons/account/demo/account_minimal.xml b/addons/account/demo/account_minimal.xml index 50b597c8e49..baa94450f02 100644 --- a/addons/account/demo/account_minimal.xml +++ b/addons/account/demo/account_minimal.xml @@ -5,58 +5,11 @@ Account Type --> - - View - view - none - - - Asset - asset - asset - balance - - - Receivable - receivable - asset - unreconciled - - - Liability - liability - liability - balance - - - Payable - payable - liability - unreconciled - - - Income - income - income - none - - - Expense - expense - expense - none - Equity equity + balance liability - balance - - - Cash - cash - asset - balance @@ -78,14 +31,14 @@ Balance Sheet - (test) view - + Assets - (test) X10 view - + @@ -95,7 +48,7 @@ Fixed Assets - (test) view - + @@ -103,7 +56,7 @@ Fixed Asset Account - (test) other - + @@ -111,7 +64,7 @@ Net Current Assets - (test) view - + @@ -119,7 +72,7 @@ Current Assets - (test) view - + @@ -127,7 +80,7 @@ Purchased Stocks - (test) other - + @@ -136,7 +89,7 @@ receivable - + @@ -144,7 +97,7 @@ Output VAT - (test) other - + @@ -152,7 +105,7 @@ Bank Current Account - (test) liquidity - + @@ -160,7 +113,7 @@ Cash - (test) liquidity - + @@ -168,14 +121,14 @@ Opening Income - (test) other - + Liabilities - (test) X11 view - + @@ -185,7 +138,7 @@ Current Liabilities - (test) view - + @@ -194,7 +147,7 @@ payable - + @@ -202,7 +155,7 @@ Input VAT - (test) other - + @@ -210,7 +163,7 @@ Reserve and Profit/Loss - (test) other - + @@ -218,7 +171,7 @@ Opening Expense - (test) other - + @@ -228,14 +181,14 @@ Profit and Loss - (test) view - + Income - (test) X20 view - + @@ -244,7 +197,7 @@ Foreign Exchange Gain - (test) X201 other - + @@ -254,7 +207,7 @@ Revenue - (test) view - + @@ -262,14 +215,14 @@ Product Sales - (test) other - + Expense - (test) X21 view - + @@ -280,7 +233,7 @@ Cost of Sales - (test) view - + @@ -288,7 +241,7 @@ Cost of Goods Sold - (test) other - + @@ -296,7 +249,7 @@ Overheads - (test) view - + @@ -304,14 +257,14 @@ Expenses - (test) other - + Foreign Exchange Loss - (test) X2111 other - + @@ -321,7 +274,7 @@ Salary Expenses - (test) other - + diff --git a/addons/account/installer.py b/addons/account/installer.py index a0157e51c8e..d1b19ef4319 100644 --- a/addons/account/installer.py +++ b/addons/account/installer.py @@ -23,8 +23,8 @@ import logging import time import datetime from dateutil.relativedelta import relativedelta -from os.path import join as opj from operator import itemgetter +from os.path import join as opj from tools.translate import _ from osv import fields, osv @@ -58,8 +58,6 @@ class account_installer(osv.osv_memory): 'date_start': fields.date('Start Date', required=True), 'date_stop': fields.date('End Date', required=True), 'period': fields.selection([('month', 'Monthly'), ('3months','3 Monthly')], 'Periods', required=True), - 'sale_tax': fields.float('Sale Tax(%)'), - 'purchase_tax': fields.float('Purchase Tax(%)'), 'company_id': fields.many2one('res.company', 'Company', required=True), 'has_default_company' : fields.boolean('Has Default Company', readonly=True), } @@ -76,8 +74,6 @@ class account_installer(osv.osv_memory): 'date_start': lambda *a: time.strftime('%Y-01-01'), 'date_stop': lambda *a: time.strftime('%Y-12-31'), 'period': 'month', - 'sale_tax': 0.0, - 'purchase_tax': 0.0, 'company_id': _default_company, 'has_default_company': _default_has_default_company, 'charts': 'configurable' @@ -100,9 +96,6 @@ class account_installer(osv.osv_memory): res['fields'][field]['selection'] = cmp_select return res - def on_change_tax(self, cr, uid, id, tax): - return {'value': {'purchase_tax': tax}} - def on_change_start_date(self, cr, uid, id, start_date=False): if start_date: start_date = datetime.datetime.strptime(start_date, "%Y-%m-%d") @@ -118,92 +111,12 @@ class account_installer(osv.osv_memory): if context is None: context = {} fy_obj = self.pool.get('account.fiscalyear') - mod_obj = self.pool.get('ir.model.data') - obj_acc_temp = self.pool.get('account.account.template') - obj_tax_code_temp = self.pool.get('account.tax.code.template') - obj_tax_temp = self.pool.get('account.tax.template') - obj_acc_chart_temp = self.pool.get('account.chart.template') - record = self.browse(cr, uid, ids, context=context)[0] for res in self.read(cr, uid, ids, context=context): - if record.charts == 'configurable': + if 'charts' in res and res['charts'] == 'configurable': + #load generic chart of account fp = tools.file_open(opj('account', 'configurable_account_chart.xml')) tools.convert_xml_import(cr, 'account', fp, {}, 'init', True, None) fp.close() - s_tax = (res.get('sale_tax', 0.0))/100 - p_tax = (res.get('purchase_tax', 0.0))/100 - pur_temp_tax = mod_obj.get_object_reference(cr, uid, 'account', 'tax_code_base_purchases') - pur_temp_tax_id = pur_temp_tax and pur_temp_tax[1] or False - - pur_temp_tax_paid = mod_obj.get_object_reference(cr, uid, 'account', 'tax_code_output') - pur_temp_tax_paid_id = pur_temp_tax_paid and pur_temp_tax_paid[1] or False - - sale_temp_tax = mod_obj.get_object_reference(cr, uid, 'account', 'tax_code_base_sales') - sale_temp_tax_id = sale_temp_tax and sale_temp_tax[1] or False - - sale_temp_tax_paid = mod_obj.get_object_reference(cr, uid, 'account', 'tax_code_input') - sale_temp_tax_paid_id = sale_temp_tax_paid and sale_temp_tax_paid[1] or False - - chart_temp_ids = obj_acc_chart_temp.search(cr, uid, [('name','=','Configurable Account Chart Template')], context=context) - chart_temp_id = chart_temp_ids and chart_temp_ids[0] or False - if s_tax * 100 > 0.0: - tax_account_ids = obj_acc_temp.search(cr, uid, [('name', '=', 'Tax Received')], context=context) - sales_tax_account_id = tax_account_ids and tax_account_ids[0] or False - vals_tax_code_temp = { - 'name': _('TAX %s%%') % (s_tax*100), - 'code': _('TAX %s%%') % (s_tax*100), - 'parent_id': sale_temp_tax_id - } - new_tax_code_temp = obj_tax_code_temp.create(cr, uid, vals_tax_code_temp, context=context) - vals_paid_tax_code_temp = { - 'name': _('TAX Received %s%%') % (s_tax*100), - 'code': _('TAX Received %s%%') % (s_tax*100), - 'parent_id': sale_temp_tax_paid_id - } - new_paid_tax_code_temp = obj_tax_code_temp.create(cr, uid, vals_paid_tax_code_temp, context=context) - sales_tax_temp = obj_tax_temp.create(cr, uid, { - 'name': _('Sale TAX %s%%') % (s_tax*100), - 'amount': s_tax, - 'base_code_id': new_tax_code_temp, - 'tax_code_id': new_paid_tax_code_temp, - 'ref_base_code_id': new_tax_code_temp, - 'ref_tax_code_id': new_paid_tax_code_temp, - 'type_tax_use': 'sale', - 'type': 'percent', - 'sequence': 0, - 'account_collected_id': sales_tax_account_id, - 'account_paid_id': sales_tax_account_id, - 'chart_template_id': chart_temp_id, - }, context=context) - if p_tax * 100 > 0.0: - tax_account_ids = obj_acc_temp.search(cr, uid, [('name', '=', 'Tax Paid')], context=context) - purchase_tax_account_id = tax_account_ids and tax_account_ids[0] or False - vals_tax_code_temp = { - 'name': _('TAX %s%%') % (p_tax*100), - 'code': _('TAX %s%%') % (p_tax*100), - 'parent_id': pur_temp_tax_id - } - new_tax_code_temp = obj_tax_code_temp.create(cr, uid, vals_tax_code_temp, context=context) - vals_paid_tax_code_temp = { - 'name': _('TAX Paid %s%%') % (p_tax*100), - 'code': _('TAX Paid %s%%') % (p_tax*100), - 'parent_id': pur_temp_tax_paid_id - } - new_paid_tax_code_temp = obj_tax_code_temp.create(cr, uid, vals_paid_tax_code_temp, context=context) - purchase_tax_temp = obj_tax_temp.create(cr, uid, { - 'name': _('Purchase TAX %s%%') % (p_tax*100), - 'amount': p_tax, - 'base_code_id': new_tax_code_temp, - 'tax_code_id': new_paid_tax_code_temp, - 'ref_base_code_id': new_tax_code_temp, - 'ref_tax_code_id': new_paid_tax_code_temp, - 'type_tax_use': 'purchase', - 'type': 'percent', - 'sequence': 0, - 'account_collected_id': purchase_tax_account_id, - 'account_paid_id': purchase_tax_account_id, - 'chart_template_id': chart_temp_id, - }, context=context) - if 'date_start' in res and 'date_stop' in res: f_ids = fy_obj.search(cr, uid, [('date_start', '<=', res['date_start']), ('date_stop', '>=', res['date_stop']), ('company_id', '=', res['company_id'][0])], context=context) if not f_ids: diff --git a/addons/account/project/project_view.xml b/addons/account/project/project_view.xml index d6df834f4e8..da6ec7f73a1 100644 --- a/addons/account/project/project_view.xml +++ b/addons/account/project/project_view.xml @@ -10,7 +10,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -82,8 +82,8 @@
- - + + diff --git a/addons/account/report/__init__.py b/addons/account/report/__init__.py index 90254c53bda..70ceb4b8f83 100644 --- a/addons/account/report/__init__.py +++ b/addons/account/report/__init__.py @@ -33,13 +33,10 @@ import account_print_overdue import account_aged_partner_balance #import tax_report import account_tax_report -import account_balance_landscape import account_invoice_report import account_report import account_entries_report import account_analytic_entries_report -import account_balance_sheet -import account_profit_loss import account_treasury_report import account_financial_report diff --git a/addons/account/report/account_balance_landscape.py b/addons/account/report/account_balance_landscape.py deleted file mode 100644 index 4e62a9777c9..00000000000 --- a/addons/account/report/account_balance_landscape.py +++ /dev/null @@ -1,393 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (). -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## - -import time -import locale -from report import report_sxw - -parents = { - 'tr':1, - 'li':1, - 'story': 0, - 'section': 0 -} - -class account_balance_landscape(report_sxw.rml_parse): - def __init__(self, cr, uid, name, context): - super(account_balance_landscape, self).__init__(cr, uid, name, context=context) - self.flag=1 - self.dr_total= 0.00 - self.cr_total= 0.00 - self.parent_bal=0 - self.status=0 - self.done_total=0 - self.baldiv={} - self.empty_parent=0 - self.result_total = {} - self.total_for_perc=[] - self.localcontext.update({ - 'time': time, - 'lines': self.lines, - 'get_lines':self.get_lines, - 'linesForTotal': self.linesForTotal, - 'linesForYear': self.linesForYear, - 'get_years':self.get_years, - 'cal_total':self.cal_total, - 'total_dr':self.total_dr, - 'total_cr':self.total_cr - }) - self.context = context - - def linesForYear(self,form): - temp=0 - years={} - - global pattern - global show - global perc - global bal_zero - global ref_bal - - pattern=form['compare_pattern'] - - if form['show_columns']!=1: - show=0 - else: - show=form['show_columns'] - - if form['format_perc']!=1: - perc=0 - else: - perc=form['format_perc'] - - if form['account_choice']=='bal_zero': - bal_zero=0 - else: - bal_zero=1 - - ctx = self.context.copy() - - if perc==1: - if form['select_account']!=False: - ref_ac=self.pool.get('account.account').browse(self.cr, self.uid, form['select_account'], ctx.copy()) - if ref_ac.balance<>0.00: - ref_bal=ref_ac.balance - else: - ref_bal=1.00 - else: - ref_bal='nothing' - else: - ref_bal='nothing' - - - self.done_total=1 - self.total_for_perc=self.linesForTotal(form, ids={}, doneAccount={}, level=1) - self.done_total=0 - - for t1 in range(0,len(form['fiscalyear'])): - locale.setlocale(locale.LC_ALL, '') - self.result_total["sum_credit" + str(t1)]=locale.format("%.2f", self.result_total["sum_credit" + str(t1)], grouping=True) - self.result_total["sum_debit" + str(t1)]=locale.format("%.2f", self.result_total["sum_debit" + str(t1)], grouping=True) - - for temp in range(0,len(form['fiscalyear'])): - fy=self.pool.get('account.fiscalyear').name_get(self.cr, self.uid, form['fiscalyear'][temp]) - years["year"+str(temp)]=fy[0][1][12:16] - - return [years] - - - def linesForTotal(self, form, ids={}, doneAccount={}, level=1): - if not self.done_total==1: - return [self.result_total] - accounts=[] - if not ids: - ids = self.ids - if not ids: - return [] - - ctx = self.context.copy() - - for id in form['fiscalyear']: - tmp=[] - - ctx['fiscalyear'] = id - ctx['periods'] = form['periods'] - ctx['period_manner'] = form['period_manner'] - ctx['state'] = form['context'].get('state','all') - tmp = self.pool.get('account.account').browse(self.cr, self.uid, ids, ctx.copy()) - - if tmp: - accounts.append(tmp) - - merged_accounts=zip(*accounts) - # used to check for the frst record so all sum_credit and sum_debit r set to 0.00 - if level==1: - doneAccount={} - for entry in merged_accounts: - - if entry[0].id in doneAccount: - continue - doneAccount[entry[0].id] = 1 - - for k in range(0,len(entry)): - temp_credit=0.00 - temp_debit=0.00 - if entry[0].type <> 'view': - temp_credit+=entry[k].credit - temp_debit+=entry[k].debit - - if self.flag==1: - self.result_total["sum_credit" + str(k)]=0.00 - self.result_total["sum_debit" + str(k)]=0.00 - - if form['account_choice']=='bal_zero': - if temp_credit<>temp_debit: - self.result_total["sum_credit" + str(k)]+=temp_credit - self.result_total["sum_debit" + str(k)]+=temp_debit - else: - self.result_total["sum_credit" + str(k)]+=temp_credit - self.result_total["sum_debit" + str(k)]+=temp_debit - - self.flag=2 - - if entry[0].child_id: - ids2 = [(x.code,x.id) for x in entry[0].child_id] - ids2.sort() - - result_total_parent = self.linesForTotal(form, [x[1] for x in ids2], doneAccount, level+1) - - return [self.result_total] - - def lines(self, form, ids={}, done={}, level=1): - accounts=[] - if not ids: - ids = self.ids - if not ids: - return [] - result = [] - ctx = self.context.copy() - tmp1=[] - for id in form['fiscalyear']: - - ctx['fiscalyear'] = id - ctx['periods'] = form['periods'] - ctx['period_manner']=form['period_manner'] - ctx['state'] = form['context'].get('state','all') - tmp1 = self.pool.get('account.account').browse(self.cr, self.uid, ids, ctx.copy()) - - if tmp1: - accounts.append(tmp1) - - if level==1: #if parent is called,done is not empty when called again. - done={} - - def cmp_code(x, y): - return cmp(x.code, y.code) - for n in range(0,len(accounts)): - accounts[n].sort(cmp_code) - merged_accounts=zip(*accounts) - - for entry in merged_accounts: - j=0 - checked=1 - - if form['account_choice']!='all': # if checked,include empty a/c;not otherwise - checked=0 - - if entry[0].id in done: - continue - done[entry[0].id] = 1 - - if entry[0].child_id: # this is for parent account,dont check 0 for it - checked=4 - self.status=1 # for displaying it Bold - else: - self.status=0 - if checked==0: - i=0 - for i in range(0,len(entry)): - if bal_zero==0: - if entry[i].balance<>0.0: - checked=4 - break - else: - checked=3 - i=i+1 - else: - if entry[i].credit <> 0.0 or entry[i].debit <> 0.0: - checked=4 - break - else: - checked=3 - i=i+1 - - if checked==3: - # this is the point where we skip those accounts which are encountered as empty ones - continue - self.empty_parent=0 - else: - self.empty_parent=1 - res = { - 'code': entry[0].code, - 'name': entry[0].name, - 'level': level, - 'status': self.status, - } - - for j in range(0,len(entry)): - - locale.setlocale(locale.LC_ALL, '') - res["debit"+str(j)]=locale.format("%.2f", entry[j].debit, grouping=True) - res["credit"+str(j)]=locale.format("%.2f", entry[j].credit, grouping=True) - res["balance"+str(j)]=locale.format("%.2f", entry[j].balance, grouping=True) - - - if j==0: - res["bal_cash"+str(j)]="0.00" - res["bal_perc"+str(j)]="0.00%" - else: - temp_cash=entry[j].balance - entry[j-1].balance - res["bal_cash"+str(j)]=locale.format("%.2f", temp_cash, grouping=True) - if entry[j-1].balance<>0.00: - temp_perc=(entry[j].balance - entry[j-1].balance )*100/entry[j-1].balance - else: - temp_perc=(entry[j].balance) *100 - - res["bal_perc"+str(j)]=locale.format("%.2f", temp_perc) + "%" - - - if ref_bal=='nothing': - if level==1: - self.parent_bal=1 - else: - self.parent_bal=0 - - if self.parent_bal==1: - res["balance_perc"+str(j)]="/" - else: - if entry[j].balance==0.00: - if self.baldiv["baldiv"+str(level-1)+str(j)]<>0.00: - res["balance_perc"+str(j)]="0.00%" - else: - res["balance_perc"+str(j)]="/" - else: - if self.baldiv["baldiv"+str(level-1)+str(j)]<>0.00: - temp=self.baldiv["baldiv"+str(level-1)+str(j)] - temp1=(entry[j].balance * 100 )/ float(temp) - temp1=round(temp1,2) - res["balance_perc" + str(j)]=str(temp1)+"%" - else: - res["balance_perc"+str(j)]="/" - else: - res["balance_perc"+str(j)]=str( (entry[j].balance * 100 )/ float(ref_bal)) + "%" - - result.append(res) - - if entry[0].child_id: - - for q in range(0,len(form['fiscalyear'])): - self.baldiv["baldiv"+str(level)+str(q)]=entry[q].balance - - ids2 = [(x.code,x.id) for x in entry[0].child_id] - ids2.sort() - dir=[] - dir += self.lines(form, [x[1] for x in ids2], done, level+1) - if dir==[]: - for w in range(0,len(form['fiscalyear'])): - if entry[w].credit <> 0.0 or entry[w].debit <> 0.0 or entry[w].balance<>0.00: - dont_pop=1 - break - else: - dont_pop=0 - if dont_pop==1: - result +=dir - else: - result.pop(-1) # here we pop up the parent having its children as emprty accounts - else: - result +=dir - - return result - - def get_years(self, form): - result =[] - res={} - for temp in range(0, len(form['fiscalyear'])): - res={} - fy=self.pool.get('account.fiscalyear').name_get(self.cr, self.uid, form['fiscalyear'][temp]) - res['year']=fy[0][1] - res['last_str']=temp - - result.append(res) - self.linesForYear(form) - return result - - def get_lines(self, year_dict, form): - final_result = [] - res = {} - line_l = self.lines(form) - self.cal_total(year_dict) - if line_l: - for l in line_l: - res = {} - res['code'] = l['code'] - res['name'] = l['name'] - res['level'] = l['level'] - for k,v in l.items(): - if k.startswith('debit'+str(year_dict['last_str'])): - res['debit'] = v - if k.startswith('credit'+str(year_dict['last_str'])): - res['credit'] = v - if k.startswith('balance'+str(year_dict['last_str'])) and not k.startswith('balance_perc'+str(year_dict['last_str'])): - res['balance'] =v - if k.startswith('balance_perc'+str(year_dict['last_str'])) and not k.startswith('balance'+str(year_dict['last_str'])): - res['balance_perc'] = v - if form['compare_pattern'] == 'bal_perc': - if k.startswith('bal_perc'+str(year_dict['last_str'])): - res['pattern'] = v - elif form['compare_pattern'] == 'bal_cash': - if k.startswith('bal_cash'+str(year_dict['last_str'])): - res['pattern'] = v - else: - res['pattern'] = '' - final_result.append(res) - return final_result - - def cal_total(self, year_dict): - total_l = self.result_total - if total_l: - for k,v in total_l.items(): - if k.startswith('sum_debit'+str(year_dict['last_str'])): - self.dr_total = v - elif k.startswith('sum_credit'+str(year_dict['last_str'])): - self.cr_total = v - else: - continue - return True - - def total_dr(self): - return self.dr_total - - def total_cr(self): - return self.cr_total - -report_sxw.report_sxw('report.account.account.balance.landscape', 'account.account', 'addons/account/report/account_balance_landscape.rml', parser=account_balance_landscape, header="internal landscape") -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: - diff --git a/addons/account/report/account_balance_landscape.rml b/addons/account/report/account_balance_landscape.rml deleted file mode 100644 index d8e4881bbbe..00000000000 --- a/addons/account/report/account_balance_landscape.rml +++ /dev/null @@ -1,317 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - [[ repeatIn(get_years(data['form']), 'y') ]] - - - - Account Balance - [[ company.currency_id.name ]] - - - - - - - Year : [[ y['year'] ]] - - - - [[ data['form']['show_columns'] and 'Code' or removeParentNode('blockTable') ]] - - - Account Name - - - [[ data['form']['compare_pattern']!='none' and 'C.S.Y.T.(C./P)' or removeParentNode('font') ]] - - - Debit - - - Credit - - - Balance - - - - - - - - - - [[ data['form']['show_columns'] and removeParentNode('blockTable') or 'Code' ]] - - - Account Name - - - [[ data['form']['compare_pattern']!='none' and 'C.S.Y.T.(C./P)' or removeParentNode('font') ]] - - - Balance - - - - - - -
- [[ repeatIn(get_lines(y,data['form']), 'a') ]] - - - - [[ (data['form']['format_perc'] or not data['form']['show_columns']) and removeParentNode('blockTable') ]] [[ a['code'] ]] - - - [['.....'*(a['level']-1) ]][[ a['name'] ]] - - - [[ a['pattern'] ]] - - - [[ a['debit'] ]] - - - [[ a['credit'] ]] - - - [[ a['balance'] ]] - - - - - - - - [[ (not data['form']['format_perc'] or not data['form']['show_columns']) and removeParentNode('blockTable') ]] [[ a['code'] ]] - - - [['.....'*(a['level']-1) ]] [[ a['name'] ]] - - - [[ a['pattern'] ]] - - - [[ a['debit'] ]] - - - [[ a['credit'] ]] - - - [[ a['balance'] ]] - - - [[ a['balance_perc'] ]] - - - - - - - - - - [[ (data['form']['format_perc'] or data['form']['show_columns']) and removeParentNode('blockTable') ]] [[ a['code'] ]] - - - [['.....'*(a['level']-1) ]] [[ a['name'] ]] - - - [[ a['pattern'] ]] - - - [[ a['balance'] ]] - - - - - - - - - - [[ (not data['form']['format_perc'] or data['form']['show_columns']) and removeParentNode('blockTable') ]] [[ a['code'] ]] - - - [['.....'*(a['level']-1) ]] [[ a['name'] ]] - - - [[ a['pattern'] ]] - - - [[ a['balance'] ]] - - - [[ a['balance_perc'] ]] - - - - -
- - - - - - - [[ not data['form']['show_columns'] and removeParentNode('blockTable') ]] - - - Total : - - - [[ total_dr() ]] - - - [[ total_cr() ]] - - - - - - - - - - - - [[ data['form']['compare_pattern']!='none' and "C.S.Y.T.(C./P) : Compare Selected Years In Terms of Cash/Perc" or removeParentNode('font') ]] -
-
\ No newline at end of file diff --git a/addons/account/report/account_balance_landscape_old_backup.rml b/addons/account/report/account_balance_landscape_old_backup.rml deleted file mode 100644 index 6790082f8dd..00000000000 --- a/addons/account/report/account_balance_landscape_old_backup.rml +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Account Balance - - - - - - - - - - [[ company.name ]] - - - - - - - - Currency: [[ company.currency_id.name ]] - - - - - - - Printing date: [[ time.strftime('%Y-%m-%d') ]] at [[ time.strftime('%H:%M:%S') ]] - - - -
- [[repeatIn(linesForYear(data['form']),'year_header',td=len(data['form']['fiscalyear'][0][2]),width=[126],value=['year'],type=['string']) ]] - - - - Account Information - - - -
-
- [[ repeatIn([],'title',td=len(data['form']['fiscalyear'][0][2]),width=[42,42,42],value=['Debit','Credit','Balance'],type=['lable','lable','lable']) ]] - - - - Code - - - Account Name - - - -
-
- [[ repeatIn([],'title',td=len(data['form']['fiscalyear'][0][2]),width=[84,42],value=['Cash','%'],type=['lable','lable']) ]] - - - - - - - -
- - - -
- [[ repeatIn(lines(data['form']),'a',td=len(data['form']['fiscalyear'][0][2]),width=[42,42,42],value=['debit','credit','balance'],type=['string','string','string']) ]] - - - - - - - [[ a['status']==1 and ( setTag('para','para',{'fontName':'Helvetica-bold'})) ]][[ a['code'] ]] - - - [['.....'*(a['level']-1) ]][[ a['status']==1 and ( setTag('font','font',{'name':'Helvetica-bold'})) ]][[ a['name'] ]] - - - -
- - - -
- [[ repeatIn(linesForTotal(data['form']),'total',td=len(data['form']['fiscalyear'][0][2]),width=[42,42,42],value=['sum_debit','sum_credit',''],type=['string','string','lable'] ) ]] - - - - Total:[[ data['form']['show_columns']==0 and removeParentNode('section')]] - - - -
- - - - -
-
diff --git a/addons/account/report/account_balance_old_backup.rml b/addons/account/report/account_balance_old_backup.rml deleted file mode 100644 index cf67cb6bc3d..00000000000 --- a/addons/account/report/account_balance_old_backup.rml +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Account balance - - - - - - - - [[ company.name ]] - - - - - - Currency: [[ company.currency_id.name ]] - - - - - - - Printing date: [[ time.strftime('%Y-%m-%d') ]] at [[ time.strftime('%H:%M:%S') ]] - - - -
- [[repeatIn(linesForYear(data['form']),'year_header',td=len(data['form']['fiscalyear'][0][2]),width=[126],value=['year'],type=['string']) ]] - - - - Account Information - - - -
-
- [[ repeatIn([],'title',td=len(data['form']['fiscalyear'][0][2]),width=[42,42,42],value=['Debit','Credit','Balance'],type=['lable','lable','lable']) ]] - - - - Code - - - Account Name - - - -
-
- [[ repeatIn([],'title',td=len(data['form']['fiscalyear'][0][2]),width=[84,42],value=['Cash','%'],type=['lable','lable']) ]] - - - - - - - -
- - - -
- [[ repeatIn(lines(data['form']),'a',td=len(data['form']['fiscalyear'][0][2]),width=[42,42,42],value=['debit','credit','balance'],type=['string','string','string']) ]] - - - - - - - - - - [[ a['status']==1 and ( setTag('para','para',{'fontName':'Helvetica-bold'})) ]][[ a['code'] ]] - - - [['.....'*(a['level']-1) ]][[ a['status']==1 and ( setTag('font','font',{'name':'Helvetica-bold'})) ]][[ a['name'] ]] - - - -
- - - -
- [[ repeatIn(linesForTotal(data['form']),'total',td=len(data['form']['fiscalyear'][0][2]),width=[42,42,42],value=['sum_debit','sum_credit',''],type=['string','string','lable'] ) ]] - - - - Total:[[ data['form']['show_columns']==0 and removeParentNode('section')]] - - - -
- - - -
-
diff --git a/addons/account/report/account_balance_sheet.py b/addons/account/report/account_balance_sheet.py deleted file mode 100644 index ce9e3c51f06..00000000000 --- a/addons/account/report/account_balance_sheet.py +++ /dev/null @@ -1,224 +0,0 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2009 Tiny SPRL (). -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## - -import time - -import pooler -from report import report_sxw -from account.report import account_profit_loss -from common_report_header import common_report_header -from tools.translate import _ - -class report_balancesheet_horizontal(report_sxw.rml_parse, common_report_header): - def __init__(self, cr, uid, name, context=None): - super(report_balancesheet_horizontal, self).__init__(cr, uid, name, context=context) - self.obj_pl = account_profit_loss.report_pl_account_horizontal(cr, uid, name, context=context) - self.result_sum_dr = 0.0 - self.result_sum_cr = 0.0 - self.result = {} - self.res_bl = {} - self.result_temp = [] - self.localcontext.update({ - 'time': time, - 'get_lines': self.get_lines, - 'get_lines_another': self.get_lines_another, - 'get_company': self._get_company, - 'get_currency': self._get_currency, - 'sum_dr': self.sum_dr, - 'sum_cr': self.sum_cr, - 'get_data':self.get_data, - 'get_pl_balance':self.get_pl_balance, - 'get_fiscalyear': self._get_fiscalyear, - 'get_account': self._get_account, - 'get_start_period': self.get_start_period, - 'get_end_period': self.get_end_period, - 'get_sortby': self._get_sortby, - 'get_filter': self._get_filter, - 'get_journal': self._get_journal, - 'get_start_date':self._get_start_date, - 'get_end_date':self._get_end_date, - 'get_company':self._get_company, - 'get_target_move': self._get_target_move, - }) - self.context = context - - def set_context(self, objects, data, ids, report_type=None): - new_ids = ids - if (data['model'] == 'ir.ui.menu'): - new_ids = 'chart_account_id' in data['form'] and [data['form']['chart_account_id']] or [] - objects = self.pool.get('account.account').browse(self.cr, self.uid, new_ids) - return super(report_balancesheet_horizontal, self).set_context(objects, data, new_ids, report_type=report_type) - - def sum_dr(self): - if self.res_bl['type'] == _('Net Profit'): - self.result_sum_dr += self.res_bl['balance']*-1 - return self.result_sum_dr - - def sum_cr(self): - if self.res_bl['type'] == _('Net Loss'): - self.result_sum_cr += self.res_bl['balance'] - return self.result_sum_cr - - def get_pl_balance(self): - return self.res_bl - - def get_data(self,data): - cr, uid = self.cr, self.uid - db_pool = pooler.get_pool(self.cr.dbname) - - #Getting Profit or Loss Balance from profit and Loss report - self.obj_pl.get_data(data) - self.res_bl = self.obj_pl.final_result() - - account_pool = db_pool.get('account.account') - currency_pool = db_pool.get('res.currency') - - types = [ - 'liability', - 'asset' - ] - - ctx = self.context.copy() - ctx['fiscalyear'] = data['form'].get('fiscalyear_id', False) - - if data['form']['filter'] == 'filter_period': - ctx['period_from'] = data['form'].get('period_from', False) - ctx['period_to'] = data['form'].get('period_to', False) - elif data['form']['filter'] == 'filter_date': - ctx['date_from'] = data['form'].get('date_from', False) - ctx['date_to'] = data['form'].get('date_to', False) - ctx['state'] = data['form'].get('target_move', 'all') - cal_list = {} - pl_dict = {} - account_dict = {} - account_id = data['form'].get('chart_account_id', False) - account_ids = account_pool._get_children_and_consol(cr, uid, account_id, context=ctx) - accounts = account_pool.browse(cr, uid, account_ids, context=ctx) - - if not self.res_bl: - self.res_bl['type'] = _('Net Profit') - self.res_bl['balance'] = 0.0 - - if self.res_bl['type'] == _('Net Profit'): - self.res_bl['type'] = _('Net Profit') - else: - self.res_bl['type'] = _('Net Loss') - pl_dict = { - 'code': self.res_bl['type'], - 'name': self.res_bl['type'], - 'level': False, - 'balance':self.res_bl['balance'], - } - for typ in types: - accounts_temp = [] - for account in accounts: - if (account.user_type.report_type) and (account.user_type.report_type == typ): - account_dict = { - 'id': account.id, - 'code': account.code, - 'name': account.name, - 'level': account.level, - 'balance': account.balance != 0 and account.balance * account.user_type.sign or account.balance, - 'type': account.type, - } - currency = account.currency_id and account.currency_id or account.company_id.currency_id - if typ == 'liability' and account.type <> 'view' and (account.debit <> account.credit): - self.result_sum_dr += account.balance - if typ == 'asset' and account.type <> 'view' and (account.debit <> account.credit): - self.result_sum_cr += account.balance - if data['form']['display_account'] == 'movement': - if not currency_pool.is_zero(self.cr, self.uid, currency, account.credit) or not currency_pool.is_zero(self.cr, self.uid, currency, account.debit) or not currency_pool.is_zero(self.cr, self.uid, currency, account.balance): - accounts_temp.append(account_dict) - elif data['form']['display_account'] == 'not_zero': - if not currency_pool.is_zero(self.cr, self.uid, currency, account.balance): - accounts_temp.append(account_dict) - else: - accounts_temp.append(account_dict) - if account.id == data['form']['reserve_account_id']: - pl_dict['level'] = account['level'] + 1 - accounts_temp.append(pl_dict) - - self.result[typ] = accounts_temp - cal_list[typ]=self.result[typ] - - if cal_list: - temp = {} - for i in range(0,max(len(cal_list['liability']),len(cal_list['asset']))): - if i < len(cal_list['liability']) and i < len(cal_list['asset']): - temp={ - 'type': cal_list['liability'][i]['type'], - 'code': cal_list['liability'][i]['code'], - 'name': cal_list['liability'][i]['name'], - 'level': cal_list['liability'][i]['level'], - 'balance':cal_list['liability'][i]['balance'], - 'type1': cal_list['asset'][i]['type'], - 'code1': cal_list['asset'][i]['code'], - 'name1': cal_list['asset'][i]['name'], - 'level1': cal_list['asset'][i]['level'], - 'balance1':cal_list['asset'][i]['balance'], - } - self.result_temp.append(temp) - else: - if i < len(cal_list['asset']): - temp={ - 'type': '', - 'code': '', - 'name': '', - 'level': False, - 'balance':False, - 'type1': cal_list['asset'][i]['type'], - 'code1': cal_list['asset'][i]['code'], - 'name1': cal_list['asset'][i]['name'], - 'level1': cal_list['asset'][i]['level'], - 'balance1':cal_list['asset'][i]['balance'], - } - self.result_temp.append(temp) - if i < len(cal_list['liability']): - temp={ - 'type': cal_list['liability'][i]['type'], - 'code': cal_list['liability'][i]['code'], - 'name': cal_list['liability'][i]['name'], - 'level': cal_list['liability'][i]['level'], - 'balance':cal_list['liability'][i]['balance'], - 'type1': '', - 'code1': '', - 'name1': '', - 'level1': False, - 'balance1':False, - } - self.result_temp.append(temp) - return None - - def get_lines(self): - return self.result_temp - - def get_lines_another(self, group): - return self.result.get(group, []) - -report_sxw.report_sxw('report.account.balancesheet.horizontal', 'account.account', - 'addons/account/report/account_balance_sheet_horizontal.rml',parser=report_balancesheet_horizontal, - header='internal landscape') - -report_sxw.report_sxw('report.account.balancesheet', 'account.account', - 'addons/account/report/account_balance_sheet.rml',parser=report_balancesheet_horizontal, - header='internal') - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/report/account_balance_sheet.rml b/addons/account/report/account_balance_sheet.rml deleted file mode 100644 index 620ec05b16a..00000000000 --- a/addons/account/report/account_balance_sheet.rml +++ /dev/null @@ -1,303 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Balance Sheet - - - - [[ get_data(data) or removeParentNode('para') ]] - - - - - - Chart of Accounts - Fiscal Year - Filter By [[ data['form']['filter']!='filter_no' and get_filter(data) ]] - Display Account - Target Moves - - - [[ get_account(data) or removeParentNode('para') ]] - [[ get_fiscalyear(data) or '' ]] - [[ data['form']['filter']=='filter_no' and get_filter(data) or removeParentNode('para') ]] - [[ data['form']['filter']=='filter_date' or removeParentNode('blockTable') ]] - - Start Date - End Date - - - [[ formatLang(get_start_date(data),date=True) ]] - [[ formatLang(get_end_date(data),date=True) ]] - - - [[ data['form']['filter']=='filter_period' or removeParentNode('blockTable') ]] - - Start Period - End Period - - - [[ get_start_period(data) or removeParentNode('para') ]] - [[ get_end_period(data) or removeParentNode('para') ]] - - - - [[ (data['form']['display_account']=='all' and 'All') or (data['form']['display_account']=='movement' and 'With movements') or 'With balance is not equal to 0']] - [[ get_target_move(data) ]] - - - - - - - - - - - - Assets - - - - - - - - - - Code - - - Account - - - Balance - - - - [[ repeatIn(get_lines_another('asset'),'a' ) ]] - [[ setTag('tr','tr',{'style': 'Table'+str(min(3,a['level']))}) ]] - [[ (a['type'] =='view' and a['level'] >= 3) and setTag('para','para',{'style': 'terp_level_3_code_bold'}) or setTag('para','para',{'style': 'terp_level_'+str(min(3,a['level']))+'_code'}) ]][[ a['code'] ]] - [[ (a['type'] =='view' and a['level'] >= 3) and setTag('para','para',{'style': 'terp_level_'+str(min(3,a['level']))+'_name_bold'}) or setTag('para','para',{'style': 'terp_level_'+str(min(4,a['level']))+'_name'}) ]][[ a['name'] ]] - [[ (a['level'] <>2) or removeParentNode('td') ]][[ (a['type'] =='view' and a['level'] >= 3) and setTag('para','para',{'style': 'terp_level_3_balance_bold'}) or setTag('para','para',{'style': 'terp_level_'+str(min(3,a['level']))+'_balance'}) ]][[ formatLang(a['balance'], currency_obj = company.currency_id) ]] - [[ a['level'] == 2 or removeParentNode('td') ]][[ formatLang(a['balance'], currency_obj = company.currency_id) ]] - - - - - - Balance: - - - [[ formatLang(sum_cr(), currency_obj = company.currency_id) ]] - - - - - - - - - - - Liabilities - - - - - - - Code - - - Account - - - Balance - - - - [[ repeatIn(get_lines_another('liability'),'a' ) ]] - [[ setTag('tr','tr',{'style': 'Table'+str(min(3,a['level']))}) ]] - [[ (a['type'] =='view' and a['level'] >= 3) and setTag('para','para',{'style': 'terp_level_3_code_bold'}) or setTag('para','para',{'style': 'terp_level_'+str(min(3,a['level']))+'_code'}) ]][[ a['code'] ]] - [[ (a['type'] =='view' and a['level'] >= 3) and setTag('para','para',{'style': 'terp_level_'+str(min(3,a['level']))+'_name_bold'}) or setTag('para','para',{'style': 'terp_level_'+str(min(4,a['level']))+'_name'}) ]][[ a['name'] ]] - [[ (a['level'] <>2) or removeParentNode('td') ]][[ (a['type'] =='view' and a['level'] >= 3) and setTag('para','para',{'style': 'terp_level_3_balance_bold'}) or setTag('para','para',{'style': 'terp_level_'+str(min(3,a['level']))+'_balance'}) ]][[ formatLang(a['balance'], currency_obj = company.currency_id) ]] - [[ a['level'] == 2 or removeParentNode('td') ]][[ formatLang(a['balance'], currency_obj = company.currency_id) ]] - - - - - - Balance: - - - [[ formatLang(sum_dr(), currency_obj = company.currency_id) ]] - - - - - - - - diff --git a/addons/account/report/account_balance_sheet_horizontal.rml b/addons/account/report/account_balance_sheet_horizontal.rml deleted file mode 100644 index b2d54e33466..00000000000 --- a/addons/account/report/account_balance_sheet_horizontal.rml +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Balance Sheet - - - - [[ get_data(data) or removeParentNode('para') ]] - - - - Chart of Accounts - Fiscal Year - Filter By [[ data['form']['filter']!='filter_no' and get_filter(data) ]] - Display Account - Target Moves - - - [[ get_account(data) or removeParentNode('para') ]] - [[ get_fiscalyear(data) or '' ]] - [[ data['form']['filter']=='filter_no' and get_filter(data) or removeParentNode('para') ]] - [[ data['form']['filter']=='filter_date' or removeParentNode('blockTable') ]] - - Start Date - End Date - - - [[ formatLang(get_start_date(data),date=True) ]] - [[ formatLang(get_end_date(data),date=True) ]] - - - [[ data['form']['filter']=='filter_period' or removeParentNode('blockTable') ]] - - Start Period - End Period - - - [[ get_start_period(data) or removeParentNode('para') ]] - [[ get_end_period(data) or removeParentNode('para') ]] - - - - [[ (data['form']['display_account']=='all' and 'All') or (data['form']['display_account']=='movement' and 'With movements') or 'With balance is not equal to 0']] - [[ get_target_move(data) ]] - - - - - - - - - - - - Code - - - Assets - - - Balance - - - Code - - - Liabilities - - - Balance - - - - - - [[ repeatIn(get_lines(),'a' ) ]] [[ a['code1'] ]][[ a['level1']<4 and ( setTag('para','para',{'style':'terp_default_Bold_9'})) or removeParentNode('font') ]] - - - - - [[ '. '*(a['level1']-1) ]][[ a['level1']<4 and ( setTag('para','para',{'style':'terp_default_Bold_9'})) or removeParentNode('font') ]][[ a['name1'] ]] - - - - - [[ a['level1']<4 and ( setTag('para','para',{'style':'terp_default_Right_9_Bold'})) or removeParentNode('font') ]][[ formatLang(a['balance1'], currency_obj=company.currency_id) ]] - - - - - [[ a['code'] ]][[ ( a['level']<4 or a['name']=='Net Profit') and ( setTag('para','para',{'style':'terp_default_Bold_9'})) or removeParentNode('font') ]] - - - - - [[ '. '*(a['level']-1) ]] - [[ ( a['level']<4 or a['name']=='Net Profit') and ( setTag('para','para',{'style':'terp_default_Bold_9'})) or removeParentNode('font') ]][[ a['name'] ]] - - - - - [[ ( a['level']<4 or a['name']=='Net Profit') and ( setTag('para','para',{'style':'terp_default_Right_9_Bold'})) or removeParentNode('font') ]] - [[(a['code'] and a['name']) and formatLang(a['balance'], currency_obj=company.currency_id) or removeParentNode('font')]] - - - - - - - - Balance: - - - [[ formatLang(sum_cr(), currency_obj=company.currency_id) ]] - - - Balance: - - - [[ formatLang(sum_dr(), currency_obj=company.currency_id) ]] - - - - - - diff --git a/addons/account/report/account_financial_report.py b/addons/account/report/account_financial_report.py index e9da0a1cd7b..c3b1f5e2e1a 100644 --- a/addons/account/report/account_financial_report.py +++ b/addons/account/report/account_financial_report.py @@ -64,29 +64,30 @@ class report_account_common(report_sxw.rml_parse, common_report_header): vals['balance_cmp'] = self.pool.get('account.financial.report').browse(self.cr, self.uid, report.id, context=data['form']['comparison_context']).balance lines.append(vals) account_ids = [] - if report.type == 'accounts' and report.display_detail and report.account_ids: + if report.type == 'accounts' and report.account_ids: account_ids = account_obj._get_children_and_consol(self.cr, self.uid, [x.id for x in report.account_ids]) elif report.type == 'account_type' and report.account_type_ids: account_ids = account_obj.search(self.cr, self.uid, [('user_type','in', [x.id for x in report.account_type_ids])]) if account_ids: for account in account_obj.browse(self.cr, self.uid, account_ids, context=data['form']['used_context']): - if account.type != 'view': - flag = False - vals = { - 'name': account.code + ' ' + account.name, - 'balance': account.balance != 0 and account.balance * account.user_type.sign or account.balance, - 'type': 'account', - 'level': 6, - 'account_type': account.type, - } - if not currency_obj.is_zero(self.cr, self.uid, account.company_id.currency_id, vals['balance']): + if report.display_detail == 'detail_flat' and account.type == 'view': + continue + flag = False + vals = { + 'name': account.code + ' ' + account.name, + 'balance': account.balance != 0 and account.balance * report.sign or account.balance, + 'type': 'account', + 'level': report.display_detail == 'detail_with_hierarchy' and min(account.level,6) or 6, + 'account_type': account.type, + } + if not currency_obj.is_zero(self.cr, self.uid, account.company_id.currency_id, vals['balance']): + flag = True + if data['form']['enable_filter']: + vals['balance_cmp'] = account_obj.browse(self.cr, self.uid, account.id, context=data['form']['comparison_context']).balance + if not currency_obj.is_zero(self.cr, self.uid, account.company_id.currency_id, vals['balance_cmp']): flag = True - if data['form']['enable_filter']: - vals['balance_cmp'] = account_obj.browse(self.cr, self.uid, account.id, context=data['form']['comparison_context']).balance - if not currency_obj.is_zero(self.cr, self.uid, account.company_id.currency_id, vals['balance_cmp']): - flag = True - if flag: - lines.append(vals) + if flag: + lines.append(vals) return lines report_sxw.report_sxw('report.account.financial.report', 'account.financial.report', diff --git a/addons/account/report/account_financial_report.rml b/addons/account/report/account_financial_report.rml index 6a94f02c719..e3b5f3663f9 100644 --- a/addons/account/report/account_financial_report.rml +++ b/addons/account/report/account_financial_report.rml @@ -130,15 +130,13 @@ - - - + + + + + - - - - - + @@ -229,13 +227,13 @@ Balance - + [[ repeatIn(get_lines(data), 'a') ]] [[ (a.get('level') <> 0) or removeParentNode('tr') ]] [[ setTag('tr','tr',{'style': 'Table'+str(min(3,'level' in a and a.get('level') or 1))}) ]] - [[ setTag('para','para',{'style': 'terp_level_'+str(min(6,a['level']))+'_name'}) ]] [[ a.get('name') ]] - [[ a.get('level') == 4 or removeParentNode('td') ]][[ setTag('para','para',{'style': 'terp_level_'+str(min(6,a['level']))+'_balance'}) ]][[ formatLang(a.get('balance'))]] [[company.currency_id.symbol]] - [[ a.get('level') <> 4 or removeParentNode('td') ]][[ setTag('para','para',{'style': 'terp_level_'+str(min(6,a['level']))+'_balance'}) ]][[ formatLang(a.get('balance'))]] [[company.currency_id.symbol]] + [[ (a.get('account_type') =='view' and a.get('level') >= 3) and setTag('para','para',{'style': 'terp_level_'+str(min(3,a.get('level')))+'_name_bold'}) or setTag('para','para',{'style': 'terp_level_'+str(min(4,a.get('level')))+'_name'}) ]][[ a.get('name') ]] + [[ (a.get('level') <>2) or removeParentNode('td') ]][[ (a.get('account_type') =='view' and a.get('level') >= 3) and setTag('para','para',{'style': 'terp_level_3_balance_bold'}) or setTag('para','para',{'style': 'terp_level_'+str(min(3,a.get('level')))+'_balance'}) ]][[ formatLang(a.get('balance'), currency_obj = company.currency_id) ]] + [[ a.get('level') == 2 or removeParentNode('td') ]][[ formatLang(a.get('balance'), currency_obj = company.currency_id) ]] @@ -258,11 +256,11 @@ [[ repeatIn(get_lines(data), 'a') ]] [[ (a.get('level') <> 0) or removeParentNode('tr') ]] [[ setTag('tr','tr',{'style': 'Table'+str(min(3,'level' in a and a.get('level') or 1))}) ]] - [[ setTag('para','para',{'style': 'terp_level_'+str(min(6,a['level']))+'_name'}) ]] [[ a.get('name') ]] - [[ a.get('level') == 4 or removeParentNode('td') ]][[ setTag('para','para',{'style': 'terp_level_'+str(min(6,a['level']))+'_balance'}) ]][[ formatLang(a.get('balance'))]] [[company.currency_id.symbol]] - [[ a.get('level') <> 4 or removeParentNode('td') ]][[ setTag('para','para',{'style': 'terp_level_'+str(min(6,a['level']))+'_balance'}) ]][[ formatLang(a.get('balance'))]] [[company.currency_id.symbol]] - [[ a.get('level') == 4 or removeParentNode('td') ]][[ setTag('para','para',{'style': 'terp_level_'+str(min(6,a['level']))+'_balance'}) ]][[ formatLang(a.get('balance_cmp'))]] [[company.currency_id.symbol]] - [[ a.get('level') <> 4 or removeParentNode('td') ]][[ setTag('para','para',{'style': 'terp_level_'+str(min(6,a['level']))+'_balance'}) ]][[ formatLang(a.get('balance_cmp'))]] [[company.currency_id.symbol]] + [[ (a.get('account_type') =='view' and a.get('level') >= 3) and setTag('para','para',{'style': 'terp_level_'+str(min(3,a.get('level')))+'_name_bold'}) or setTag('para','para',{'style': 'terp_level_'+str(min(4,a.get('level')))+'_name'}) ]][[ a.get('name') ]] + [[ (a.get('level') <>2) or removeParentNode('td') ]][[ (a.get('account_type') =='view' and a.get('level') >= 3) and setTag('para','para',{'style': 'terp_level_3_balance_bold'}) or setTag('para','para',{'style': 'terp_level_'+str(min(3,a.get('level')))+'_balance'}) ]][[ formatLang(a.get('balance'), currency_obj = company.currency_id) ]] + [[ a.get('level') == 2 or removeParentNode('td') ]][[ formatLang(a.get('balance'), currency_obj = company.currency_id) ]] + [[ (a.get('level') <>2) or removeParentNode('td') ]][[ (a.get('account_type') =='view' and a.get('level') >= 3) and setTag('para','para',{'style': 'terp_level_3_balance_bold'}) or setTag('para','para',{'style': 'terp_level_'+str(min(3,a.get('level')))+'_balance'}) ]][[ formatLang(a.get('balance_cmp'), currency_obj = company.currency_id) ]] + [[ a.get('level') == 2 or removeParentNode('td') ]][[ formatLang(a.get('balance_cmp'), currency_obj = company.currency_id) ]] diff --git a/addons/account/report/account_invoice_report_view.xml b/addons/account/report/account_invoice_report_view.xml index 598f6c40278..cd43f416fce 100644 --- a/addons/account/report/account_invoice_report_view.xml +++ b/addons/account/report/account_invoice_report_view.xml @@ -70,7 +70,7 @@ - + - + @@ -138,7 +138,7 @@ account.invoice.report form tree,graph - {'search_default_year':1,'search_default_month':1,'search_default_current':1, 'search_default_category_product':1, 'search_default_customer':1, 'search_default_date': time.strftime('%Y-01-01'), 'group_by':[], 'group_by_no_leaf':1,} + {'search_default_period':1,'search_default_current':1, 'search_default_year': 1, 'search_default_category_product':1, 'search_default_customer':1, 'search_default_date': time.strftime('%Y-01-01'), 'group_by':[], 'group_by_no_leaf':1,} From this report, you can have an overview of the amount invoiced to your customer as well as payment delays. The tool search can also be used to personalise your Invoices reports and so, match this analysis to your needs. diff --git a/addons/account/report/account_profit_horizontal.rml b/addons/account/report/account_profit_horizontal.rml deleted file mode 100644 index 0918dcb2699..00000000000 --- a/addons/account/report/account_profit_horizontal.rml +++ /dev/null @@ -1,282 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Profit And Loss - - - - - - - [[ get_data(data) or removeParentNode('para')]] - - - Chart of Accounts - Fiscal Year - Filter By [[ data['form']['filter']!='filter_no' and get_filter(data) ]] - Display Account - Target Moves - - - [[ get_account(data) or removeParentNode('para') ]] - [[ get_fiscalyear(data) or '' ]] - [[ data['form']['filter']=='filter_no' and get_filter(data) or removeParentNode('para') ]] - [[ data['form']['filter']=='filter_date' or removeParentNode('blockTable') ]] - - Start Date - End Date - - - [[ formatLang(get_start_date(data),date=True) ]] - [[ formatLang(get_end_date(data),date=True) ]] - - - [[ data['form']['filter']=='filter_period' or removeParentNode('blockTable') ]] - - Start Period - End Period - - - [[ get_start_period(data) or removeParentNode('para') ]] - [[ get_end_period(data) or removeParentNode('para') ]] - - - - [[ (data['form']['display_account']=='all' and 'All') or (data['form']['display_account']=='movement' and 'With movements') or 'With balance is not equal to 0']] - [[ get_target_move(data) ]] - - - - - - - - - Code - - - Expenses - - - Balance - - - Code - - - Income - - - Balance - - - - - - - [[ repeatIn(get_lines(),'a' ) ]] [[ a['code'] ]][[ a['level']<4 and ( setTag('para','para',{'style':'terp_default_Bold_9'})) or removeParentNode('font') ]] - - - - - [[ '. '*(a['level']-1) ]][[ a['level']<4 and ( setTag('para','para',{'style':'terp_default_Bold_9'})) or removeParentNode('font') ]][[ a['name'] ]] - - - - [[ a['level']<4 and ( setTag('para','para',{'style':'terp_default_Right_9_Bold'})) or removeParentNode('font') ]][[ formatLang(abs(a['balance']), currency_obj=company.currency_id) ]] - - - - [[ a['code1'] ]][[ a['level1']<4 and ( setTag('para','para',{'style':'terp_default_Bold_9'})) or removeParentNode('font') ]] - - - - - [[ '. '*(a['level1']-1) ]][[ a['level1']<4 and ( setTag('para','para',{'style':'terp_default_Bold_9'})) or removeParentNode('font') ]][[ a['name1'] ]] - - - - [[ a['level']<4 and ( setTag('para','para',{'style':'terp_default_Right_9_Bold'})) or removeParentNode('font') ]][[(a['code1'] and a['name1']) and formatLang(abs(a['balance1']), currency_obj=company.currency_id) or removeParentNode('font') ]] - - - - - - - - - - [[ final_result()['type'] == 'Net Profit' and final_result()['type'] or '' ]] - - - [[ final_result()['balance'] and final_result()['type'] == 'Net Profit' and formatLang(abs(final_result()['balance']), currency_obj=company.currency_id) ]] - - - - - - [[ final_result()['type'] == 'Net Loss' and final_result()['type'] or '' ]] - - - [[ final_result()['balance'] and final_result()['type'] == 'Net Loss' and formatLang(abs(final_result()['balance']), currency_obj=company.currency_id) ]] - - - - - - - - Total: - - - [[ formatLang(abs(sum_dr()), currency_obj=company.currency_id) ]] - - - Total: - - - [[ formatLang(abs(sum_cr()), currency_obj=company.currency_id) ]] - - - - - - diff --git a/addons/account/report/account_profit_loss.py b/addons/account/report/account_profit_loss.py deleted file mode 100644 index 27182cdbd21..00000000000 --- a/addons/account/report/account_profit_loss.py +++ /dev/null @@ -1,198 +0,0 @@ -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2009 Tiny SPRL (). -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## - -import time -import pooler -from report import report_sxw -from common_report_header import common_report_header -from tools.translate import _ - -class report_pl_account_horizontal(report_sxw.rml_parse, common_report_header): - - def __init__(self, cr, uid, name, context=None): - super(report_pl_account_horizontal, self).__init__(cr, uid, name, context=context) - self.result_sum_dr = 0.0 - self.result_sum_cr = 0.0 - self.res_pl = {} - self.result = {} - self.result_temp = [] - self.localcontext.update( { - 'time': time, - 'get_lines': self.get_lines, - 'get_lines_another': self.get_lines_another, - 'get_currency': self._get_currency, - 'get_data': self.get_data, - 'sum_dr': self.sum_dr, - 'sum_cr': self.sum_cr, - 'final_result': self.final_result, - 'get_fiscalyear': self._get_fiscalyear, - 'get_account': self._get_account, - 'get_start_period': self.get_start_period, - 'get_end_period': self.get_end_period, - 'get_sortby': self._get_sortby, - 'get_filter': self._get_filter, - 'get_journal': self._get_journal, - 'get_start_date':self._get_start_date, - 'get_end_date':self._get_end_date, - 'get_company':self._get_company, - 'get_target_move': self._get_target_move, - }) - self.context = context - - def set_context(self, objects, data, ids, report_type=None): - new_ids = ids - if (data['model'] == 'ir.ui.menu'): - new_ids = 'chart_account_id' in data['form'] and [data['form']['chart_account_id']] or [] - objects = self.pool.get('account.account').browse(self.cr, self.uid, new_ids) - return super(report_pl_account_horizontal, self).set_context(objects, data, new_ids, report_type=report_type) - - - def final_result(self): - return self.res_pl - - def sum_dr(self): - if self.res_pl['type'] == _('Net Profit'): - self.result_sum_dr += self.res_pl['balance'] - return self.result_sum_dr - - def sum_cr(self): - if self.res_pl['type'] == _('Net Loss'): - self.result_sum_cr += self.res_pl['balance'] - return self.result_sum_cr - - def get_data(self, data): - cr, uid = self.cr, self.uid - db_pool = pooler.get_pool(self.cr.dbname) - - account_pool = db_pool.get('account.account') - currency_pool = db_pool.get('res.currency') - - types = [ - 'expense', - 'income' - ] - - ctx = self.context.copy() - ctx['fiscalyear'] = data['form'].get('fiscalyear_id', False) - - if data['form']['filter'] == 'filter_period': - ctx['period_from'] = data['form'].get('period_from', False) - ctx['period_to'] = data['form'].get('period_to', False) - elif data['form']['filter'] == 'filter_date': - ctx['date_from'] = data['form'].get('date_from', False) - ctx['date_to'] = data['form'].get('date_to', False) - - cal_list = {} - account_id = data['form'].get('chart_account_id', False) - company_currency = account_pool.browse(self.cr, self.uid, account_id).company_id.currency_id - account_ids = account_pool._get_children_and_consol(cr, uid, account_id, context=ctx) - accounts = account_pool.browse(cr, uid, account_ids, context=ctx) - - for typ in types: - accounts_temp = [] - for account in accounts: - if (account.user_type.report_type) and (account.user_type.report_type == typ): - currency = account.currency_id and account.currency_id or account.company_id.currency_id - if typ == 'expense' and account.type <> 'view' and (account.debit <> account.credit): - self.result_sum_dr += account.debit - account.credit - if typ == 'income' and account.type <> 'view' and (account.debit <> account.credit): - self.result_sum_cr += account.credit - account.debit - if data['form']['display_account'] == 'movement': - if not currency_pool.is_zero(self.cr, self.uid, currency, account.credit) or not currency_pool.is_zero(self.cr, self.uid, currency, account.debit) or not currency_pool.is_zero(self.cr, self.uid, currency, account.balance): - accounts_temp.append(account) - elif data['form']['display_account'] == 'not_zero': - if not currency_pool.is_zero(self.cr, self.uid, currency, account.balance): - accounts_temp.append(account) - else: - accounts_temp.append(account) - if currency_pool.is_zero(self.cr, self.uid, company_currency, (self.result_sum_dr-self.result_sum_cr)): - self.res_pl['type'] = None - self.res_pl['balance'] = 0.0 - elif self.result_sum_dr > self.result_sum_cr: - self.res_pl['type'] = _('Net Loss') - self.res_pl['balance'] = (self.result_sum_dr - self.result_sum_cr) - else: - self.res_pl['type'] = _('Net Profit') - self.res_pl['balance'] = (self.result_sum_cr - self.result_sum_dr) - self.result[typ] = accounts_temp - cal_list[typ] = self.result[typ] - if cal_list: - temp = {} - for i in range(0,max(len(cal_list['expense']),len(cal_list['income']))): - if i < len(cal_list['expense']) and i < len(cal_list['income']): - temp={ - 'code': cal_list['expense'][i].code, - 'name': cal_list['expense'][i].name, - 'level': cal_list['expense'][i].level, - 'balance': cal_list['expense'][i].balance != 0 and \ - cal_list['expense'][i].balance * cal_list['expense'][i].user_type.sign or \ - cal_list['expense'][i].balance, - 'code1': cal_list['income'][i].code, - 'name1': cal_list['income'][i].name, - 'level1': cal_list['income'][i].level, - 'balance1': cal_list['income'][i].balance != 0 and \ - cal_list['income'][i].balance * cal_list['income'][i].user_type.sign or \ - cal_list['income'][i].balance, - } - self.result_temp.append(temp) - else: - if i < len(cal_list['income']): - temp={ - 'code': '', - 'name': '', - 'level': False, - 'balance':False, - 'code1': cal_list['income'][i].code, - 'name1': cal_list['income'][i].name, - 'level1': cal_list['income'][i].level, - 'balance1': cal_list['income'][i].balance != 0 and \ - cal_list['income'][i].balance * cal_list['income'][i].user_type.sign \ - or cal_list['income'][i].balance, - } - self.result_temp.append(temp) - if i < len(cal_list['expense']): - temp={ - 'code': cal_list['expense'][i].code, - 'name': cal_list['expense'][i].name, - 'level': cal_list['expense'][i].level, - 'balance': cal_list['expense'][i].balance != 0 and \ - cal_list['expense'][i].balance * cal_list['expense'][i].user_type.sign \ - or cal_list['expense'][i].balance, - 'code1': '', - 'name1': '', - 'level1': False, - 'balance1':False, - } - self.result_temp.append(temp) - return None - - def get_lines(self): - return self.result_temp - - def get_lines_another(self, group): - return self.result.get(group, []) - -report_sxw.report_sxw('report.pl.account.horizontal', 'account.account', - 'addons/account/report/account_profit_horizontal.rml',parser=report_pl_account_horizontal, header='internal landscape') - -report_sxw.report_sxw('report.pl.account', 'account.account', - 'addons/account/report/account_profit_loss.rml',parser=report_pl_account_horizontal, header='internal') - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/report/account_profit_loss.rml b/addons/account/report/account_profit_loss.rml deleted file mode 100644 index 28fe167aef5..00000000000 --- a/addons/account/report/account_profit_loss.rml +++ /dev/null @@ -1,314 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Profit And Loss - - - - - [[ get_data(data) or removeParentNode('para')]] - - - - - - Chart of Accounts - Fiscal Year - Filter By [[ data['form']['filter']!='filter_no' and get_filter(data) ]] - Display Account - Target Moves - - - [[ get_account(data) or removeParentNode('para') ]] - [[ get_fiscalyear(data) or '' ]] - [[ data['form']['filter']=='filter_no' and get_filter(data) or removeParentNode('para') ]] - [[ data['form']['filter']=='filter_date' or removeParentNode('blockTable') ]] - - Start Date - End Date - - - [[ formatLang(get_start_date(data),date=True) ]] - [[ formatLang(get_end_date(data),date=True) ]] - - - [[ data['form']['filter']=='filter_period' or removeParentNode('blockTable') ]] - - Start Period - End Period - - - [[ get_start_period(data) or removeParentNode('para') ]] - [[ get_end_period(data) or removeParentNode('para') ]] - - - - [[ (data['form']['display_account']=='all' and 'All') or (data['form']['display_account']=='movement' and 'With movements') or 'With balance is not equal to 0']] - [[ get_target_move(data) ]] - - - - - - Expenses - - - - Code - - - Account - - - Balance - - - - [[ repeatIn(get_lines_another('expense'),'a' ) ]] - [[ setTag('tr','tr',{'style': 'Table'+str(min(3,a.level))}) ]] - [[ (a.type =='view' and a.level >= 3) and setTag('para','para',{'style': 'terp_level_3_code_bold'}) or setTag('para','para',{'style': 'terp_level_'+str(min(3,a.level))+'_code'}) ]][[ a.code ]] - [[ (a.type =='view' and a.level >= 3) and setTag('para','para',{'style': 'terp_level_'+str(min(3,a.level))+'_name_bold'}) or setTag('para','para',{'style': 'terp_level_'+str(min(4,a.level))+'_name'}) ]][[ a.name ]] - [[ (a.level <>2) or removeParentNode('td') ]][[ (a.type =='view' and a.level >= 3) and setTag('para','para',{'style': 'terp_level_3_balance_bold'}) or setTag('para','para',{'style': 'terp_level_'+str(min(3,a.level))+'_balance'}) ]][[ formatLang(a.balance * a.user_type.sign, currency_obj=company.currency_id) ]] - [[ a.level == 2 or removeParentNode('td') ]][[ formatLang(a.balance * a.user_type.sign, currency_obj=company.currency_id) ]] - - - - - - - - - [[ final_result()['type'] == 'Net Profit' and final_result()['type'] or removeParentNode('blockTable') ]] - - - [[ final_result()['balance'] and final_result()['type'] == 'Net Profit' and formatLang(final_result()['balance'], currency_obj=company.currency_id) ]] - - - - - - - Total: - - - [[ formatLang(sum_dr(), currency_obj=company.currency_id) ]] - - - - - - - - Incomes - - - - Code - - - Account - - - Balance - - - - [[ repeatIn(get_lines_another('income'),'a' ) ]] - [[ setTag('tr','tr',{'style': 'Table'+str(min(3,a.level))}) ]] - [[ (a.type =='view' and a.level >= 3) and setTag('para','para',{'style': 'terp_level_3_code_bold'}) or setTag('para','para',{'style': 'terp_level_'+str(min(3,a.level))+'_code'}) ]][[ a.code ]] - [[ (a.type =='view' and a.level >= 3) and setTag('para','para',{'style': 'terp_level_'+str(min(3,a.level))+'_name_bold'}) or setTag('para','para',{'style': 'terp_level_'+str(min(4,a.level))+'_name'}) ]][[ a.name ]] - [[ (a.level <>2) or removeParentNode('td') ]][[ (a.type =='view' and a.level >= 3) and setTag('para','para',{'style': 'terp_level_3_balance_bold'}) or setTag('para','para',{'style': 'terp_level_'+str(min(3,a.level))+'_balance'}) ]][[ formatLang(a.balance * a.user_type.sign, currency_obj=company.currency_id) ]] - [[ a.level == 2 or removeParentNode('td') ]][[ formatLang(a.balance * a.user_type.sign, currency_obj=company.currency_id) ]] - - - - - - - - - [[ final_result()['type'] == 'Net Loss' and final_result()['type'] or removeParentNode('blockTable') ]] - - - [[ final_result()['balance'] and final_result()['type'] == 'Net Loss' and formatLang(final_result()['balance'], currency_obj=company.currency_id) ]] - - - - - - - Total: - - - [[ formatLang(sum_cr(), currency_obj=company.currency_id) ]] - - - - - - - - - - - diff --git a/addons/account/security/account_security.xml b/addons/account/security/account_security.xml index c928ff3c8fe..64498127dc5 100644 --- a/addons/account/security/account_security.xml +++ b/addons/account/security/account_security.xml @@ -2,14 +2,17 @@ - Accounting / Invoicing & Payments + Invoicing & Payments + - Accounting / Accountant + Accountant + - Accounting / Manager + Manager + diff --git a/addons/account/security/ir.model.access.csv b/addons/account/security/ir.model.access.csv index 79e4dbb0c03..d1cb87bd434 100644 --- a/addons/account/security/ir.model.access.csv +++ b/addons/account/security/ir.model.access.csv @@ -1,134 +1,105 @@ -"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -"access_product_product_account_user","product.product.account.user","product.model_product_product","group_account_user",1,0,0,0 -"access_account_payment_term","account.payment.term","model_account_payment_term","account.group_account_user",1,0,0,0 -"access_account_payment_term_line","account.payment.term.line","model_account_payment_term_line","account.group_account_user",1,0,0,0 -"access_account_account_type","account.account.type","model_account_account_type","account.group_account_user",1,0,0,0 -"access_account_tax","account.tax","model_account_tax","account.group_account_user",1,0,0,0 -"access_account_tax_internal_user","account.tax internal user","model_account_tax","base.group_user",1,0,0,0 -"access_account_account","account.account","model_account_account","account.group_account_user",1,0,0,0 -"access_account_account_user","account.account user","model_account_account","base.group_user",1,0,0,0 -"access_account_account_partner_manager","account.account partner manager","model_account_account","base.group_partner_manager",1,0,0,0 -"access_account_journal_view","account.journal.view","model_account_journal_view","account.group_account_user",1,0,0,0 -"access_account_journal_column","account.journal.column","model_account_journal_column","account.group_account_user",1,0,0,0 -"access_account_journal","account.journal","model_account_journal","account.group_account_user",1,0,0,0 -"access_account_period","account.period","model_account_period","account.group_account_user",1,0,0,0 -"access_account_journal_period_manager","account.journal.period manager","model_account_journal_period","account.group_account_manager",1,0,0,0 -"access_account_journal_period","account.journal.period","model_account_journal_period","account.group_account_user",1,1,1,1 -"access_account_move","account.move","model_account_move","account.group_account_user",1,1,1,1 -"access_account_move_line","account.move.line","model_account_move_line","account.group_account_user",1,1,1,1 -"access_account_move_reconcile","account.move.reconcile","model_account_move_reconcile","account.group_account_user",1,1,1,1 -"access_account_tax_code","account.tax.code","model_account_tax_code","account.group_account_invoice",1,0,0,0 -"access_account_tax","account.tax","model_account_tax","account.group_account_invoice",1,0,0,0 -"access_account_model","account.model","model_account_model","account.group_account_user",1,1,1,1 -"access_account_model_line","account.model.line","model_account_model_line","account.group_account_user",1,1,1,1 -"access_account_model_manager","account.model","model_account_model","account.group_account_manager",1,1,1,1 -"access_account_model_line_manager","account.model.line","model_account_model_line","account.group_account_manager",1,1,1,1 -"access_account_subscription","account.subscription","model_account_subscription","account.group_account_user",1,1,1,1 -"access_account_subscription_line","account.subscription.line","model_account_subscription_line","account.group_account_user",1,1,1,1 -"access_account_subscription_manager","account.subscription manager","model_account_subscription","account.group_account_manager",1,0,0,0 -"access_account_subscription_line_manager","account.subscription.line manager","model_account_subscription_line","account.group_account_manager",1,0,0,0 -"access_account_account_template","account.account.template","model_account_account_template","account.group_account_manager",1,1,1,1 -"access_account_tax_code_template","account.tax.code.template","model_account_tax_code_template","account.group_account_manager",1,1,1,1 -"access_account_chart_template","account.chart.template","model_account_chart_template","account.group_account_manager",1,1,1,1 -"access_account_tax_template","account.tax.template","model_account_tax_template","account.group_account_manager",1,1,1,1 -"access_account_bank_statement","account.bank.statement","model_account_bank_statement","account.group_account_user",1,1,1,1 -"access_account_bank_statement_line","account.bank.statement.line","model_account_bank_statement_line","account.group_account_user",1,1,1,1 -"access_account_analytic_line","account.analytic.line","model_account_analytic_line","account.group_account_user",1,1,1,1 -"access_account_analytic_line_manager","account.analytic.line manager","model_account_analytic_line","account.group_account_manager",1,0,0,0 -"access_account_analytic_account","account.analytic.account","analytic.model_account_analytic_account","base.group_user",1,0,0,0 -"access_account_analytic_journal","account.analytic.journal","model_account_analytic_journal","account.group_account_user",1,0,0,0 -"access_account_analytic_journal_user","account.analytic.journal","model_account_analytic_journal","base.group_user",1,1,1,0 -"access_account_invoice_uinvoice","account.invoice","model_account_invoice","account.group_account_invoice",1,1,1,1 -"access_account_invoice_line_uinvoice","account.invoice.line","model_account_invoice_line","account.group_account_invoice",1,1,1,1 -"access_account_invoice_tax_uinvoice","account.invoice.tax","model_account_invoice_tax","account.group_account_invoice",1,1,1,1 -"access_account_move_uinvoice","account.move","model_account_move","account.group_account_invoice",1,1,1,1 -"access_account_move_line_uinvoice","account.move.line invoice","model_account_move_line","account.group_account_invoice",1,1,1,1 -"access_account_move_reconcile_uinvoice","account.move.reconcile","model_account_move_reconcile","account.group_account_invoice",1,1,1,1 -"access_account_journal_period_uinvoice","account.journal.period","model_account_journal_period","account.group_account_invoice",1,1,1,1 -"access_account_payment_term_manager","account.payment.term","model_account_payment_term","account.group_account_manager",1,1,1,1 -"access_account_payment_term_line_manager","account.payment.term.line","model_account_payment_term_line","account.group_account_manager",1,1,1,1 -"access_account_account_type_manager","account.account.type","model_account_account_type","account.group_account_manager",1,1,1,1 -"access_account_tax_manager","account.tax","model_account_tax","account.group_account_manager",1,1,1,1 -"access_account_account_manager","account.account","model_account_account","account.group_account_manager",1,1,1,1 -"access_account_journal_view_manager","account.journal.view","model_account_journal_view","account.group_account_manager",1,1,1,1 -"access_account_journal_column_manager","account.journal.column","model_account_journal_column","account.group_account_manager",1,1,1,1 -"access_account_journal_manager","account.journal","model_account_journal","account.group_account_manager",1,1,1,1 -"access_account_journal_invoice","account.journal invoice","model_account_journal","account.group_account_invoice",1,0,0,0 -"access_account_period_manager","account.period","model_account_period","account.group_account_manager",1,1,1,1 -"access_account_period_invoice","account.period invoice","model_account_period","account.group_account_invoice",1,0,0,0 -"access_account_tax_code_manager","account.tax.code","model_account_tax_code","account.group_account_manager",1,1,1,1 -"access_account_invoice_group_invoice","account.invoice group invoice","model_account_invoice","account.group_account_invoice",1,1,1,1 -"access_account_analytic_account_manager","account.analytic.account","analytic.model_account_analytic_account","account.group_account_manager",1,1,1,1 -"access_account_analytic_journal_manager","account.analytic.journal","model_account_analytic_journal","account.group_account_manager",1,1,1,1 -"access_account_fiscalyear","account.fiscalyear","model_account_fiscalyear","account.group_account_manager",1,1,1,1 -"access_account_fiscalyear_user","account.fiscalyear.user","model_account_fiscalyear","account.group_account_user",1,0,0,0 -"access_account_fiscalyear_invoice","account.fiscalyear.invoice","model_account_fiscalyear","account.group_account_invoice",1,0,0,0 -"access_account_fiscalyear_partner_manager","account.fiscalyear.partnermanager","model_account_fiscalyear","base.group_partner_manager",1,0,0,0 -"access_account_fiscalyear_employee","account.fiscalyear employee","model_account_fiscalyear","base.group_user",1,0,0,0 -"access_res_currency_account_manager","res.currency account manager","base.model_res_currency","group_account_manager",1,1,1,1 -"access_res_currency_rate_account_manager","res.currency.rate account manager","base.model_res_currency_rate","group_account_manager",1,1,1,1 -"access_res_currency_rate_type_account_manager","res.currency.rate.type account manager","base.model_res_currency_rate_type","group_account_manager",1,1,1,1 -"access_account_invoice_user","account.invoice user","model_account_invoice","base.group_user",1,0,0,0 -"access_account_invoice_user","account.invoice.line user","model_account_invoice_line","base.group_user",1,0,0,0 -"access_account_payment_term_partner_manager","account.payment.term partner manager","model_account_payment_term","base.group_user",1,0,0,0 -"access_account_payment_term_line_partner_manager","account.payment.term.line partner manager","model_account_payment_term_line","base.group_user",1,0,0,0 -"access_account_account_sale_manager","account.account sale manager","model_account_account","base.group_sale_manager",1,0,0,0 -"access_account_journal_sale_manager","account.journal sale manager","model_account_journal","base.group_sale_manager",1,0,0,0 -"access_account_fiscal_position_product_manager","account.fiscal.position account.manager","model_account_fiscal_position","account.group_account_manager",1,1,1,1 -"access_account_fiscal_position_tax_product_manager","account.fiscal.position.tax account.manager","model_account_fiscal_position_tax","account.group_account_manager",1,1,1,1 -"access_account_fiscal_position_account_product_manager","account.fiscal.position account.manager","model_account_fiscal_position_account","account.group_account_manager",1,1,1,1 -"access_account_fiscal_position","account.fiscal.position all","model_account_fiscal_position","base.group_user",1,0,0,0 -"access_account_fiscal_position_tax","account.fiscal.position.tax all","model_account_fiscal_position_tax","base.group_user",1,0,0,0 -"access_account_fiscal_position_account","account.fiscal.position all","model_account_fiscal_position_account","base.group_user",1,0,0,0 -"access_account_fiscal_position_template","account.fiscal.position.template","model_account_fiscal_position_template","account.group_account_manager",1,1,1,1 -"access_account_fiscal_position_tax_template","account.fiscal.position.tax.template","model_account_fiscal_position_tax_template","account.group_account_manager",1,1,1,1 -"access_account_fiscal_position_account_template","account.fiscal.position.account.template","model_account_fiscal_position_account_template","account.group_account_manager",1,1,1,1 -"access_account_sequence_fiscal_year","account.sequence.fiscalyear","model_account_sequence_fiscalyear","account.group_account_user",1,1,1,1 -"access_account_sequence_fiscal_year_user","account.sequence.fiscalyear user","model_account_sequence_fiscalyear","base.group_user",1,0,0,0 -"access_report_account_receivable","report.account.receivable","model_report_account_receivable","account.group_account_manager",1,1,1,1 -"access_temp_range","temp.range","model_temp_range","account.group_account_manager",1,0,0,0 -"access_report_aged_receivable","report.aged.receivable","model_report_aged_receivable","account.group_account_manager",1,1,1,1 -"access_report_invoice_created","report.invoice.created","model_report_invoice_created","account.group_account_manager",1,1,1,1 -"access_report_account_type_sales","report.account_type.sales","model_report_account_type_sales","account.group_account_manager",1,1,1,1 -"access_report_account_sales","report.account.sales","model_report_account_sales","account.group_account_manager",1,1,1,1 -"access_account_invoice_report","account.invoice.report","model_account_invoice_report","account.group_account_manager",1,1,1,1 -"access_res_partner_group_account_manager","res_partner group_account_manager","model_res_partner","account.group_account_manager",1,0,0,0 -"access_account_invoice_accountant","account.invoice accountant","model_account_invoice","account.group_account_user",1,0,0,0 -"access_account_tax_code_accountant","account.tax.code accountant","model_account_tax_code","account.group_account_user",1,1,1,1 -"access_account_move_line_manager","account.move.line manager","model_account_move_line","account.group_account_manager",1,0,0,0 -"access_account_move_manager","account.move manager","model_account_move","account.group_account_manager",1,0,0,0 -"access_account_invoice_manager","account.invoice manager","model_account_invoice","account.group_account_manager",1,0,0,0 -"access_account_bank_statement_manager","account.bank.statement manager","model_account_bank_statement","account.group_account_manager",1,1,1,1 -"access_account_entries_report_manager","account.entries.report","model_account_entries_report","account.group_account_manager",1,1,1,1 -"access_account_entries_report_user","account.entries.report","model_account_entries_report","account.group_account_user",1,0,0,0 -"access_account_entries_report_invoice","account.entries.report","model_account_entries_report","account.group_account_invoice",1,0,0,0 -"access_account_entries_report_employee","account.entries.report employee","model_account_entries_report","base.group_user",1,0,0,0 -"access_analytic_entries_report_manager","analytic.entries.report","model_analytic_entries_report","account.group_account_manager",1,0,0,0 -"access_account_cashbox_line","account.cashbox.line","model_account_cashbox_line","account.group_account_manager",1,1,1,1 -"access_account_cashbox_line","account.cashbox.line","model_account_cashbox_line","account.group_account_user",1,1,1,1 -"access_account_journal_view_invoice","account.journal.view invoice","model_account_journal_view","account.group_account_invoice",1,1,1,1 -"access_account_journal_column_invoice","account.journal.column invoice","model_account_journal_column","account.group_account_invoice",1,1,1,1 -"access_account_invoice_tax_manager","account.invoice.tax manager","model_account_invoice_tax","account.group_account_manager",1,0,0,0 -"access_account_invoice_tax_accountant","account.invoice.tax accountant","model_account_invoice_tax","account.group_account_user",1,0,0,0 -"access_account_move_reconcile_manager","account.move.reconcile manager","model_account_move_reconcile","account.group_account_manager",1,0,0,0 -"access_account_analytic_line_invoice","account.analytic.line invoice","model_account_analytic_line","account.group_account_invoice",1,1,1,1 -"access_account_invoice_line_accountant","account.invoice.line accountant","model_account_invoice_line","account.group_account_user",1,0,0,0 -"access_res_partner_address_accountant","res.partner.address accountant","base.model_res_partner_address","account.group_account_user",1,0,0,0 -"access_account_invoice_line_manager","account.invoice.line manager","model_account_invoice_line","account.group_account_manager",1,0,0,0 -"access_account_account_invoice","account.account invoice","model_account_account","account.group_account_invoice",1,1,1,1 -"access_res_partner_address_invoice","res.partner.address invoice","base.model_res_partner_address","account.group_account_invoice",1,1,1,1 -"access_account_analytic_accountant","account.analytic.account accountant","analytic.model_account_analytic_account","account.group_account_user",1,1,1,1 -"access_account_account_type_invoice","account.account.type invoice","model_account_account_type","account.group_account_invoice",1,1,1,1 -"access_report_account_receivable_invoice","report.account.receivable.invoice","model_report_account_receivable","account.group_account_invoice",1,1,1,1 -"access_report_account_receivable_user","report.account.receivable.user","model_report_account_receivable","account.group_account_user",1,1,1,1 -"access_account_sequence_fiscal_year_invoice","account.sequence.fiscalyear invoice","model_account_sequence_fiscalyear","account.group_account_invoice",1,1,1,1 -"access_account_tax_sale_manager","account.tax sale manager","model_account_tax","base.group_sale_salesman",1,0,0,0 -"access_account_journal_sale_manager","account.journal sale manager","model_account_journal","base.group_sale_salesman",1,0,0,0 -"access_account_invoice_tax_sale_manager","account.invoice.tax sale manager","model_account_invoice_tax","base.group_sale_salesman",1,0,0,0 -"access_account_sequence_fiscal_year_sale_user","account.sequence.fiscalyear.sale.user","model_account_sequence_fiscalyear","base.group_sale_salesman",1,1,1,0 -"access_account_sequence_fiscal_year_sale_manager","account.sequence.fiscalyear.sale.manager","model_account_sequence_fiscalyear","base.group_sale_manager",1,1,1,1 -"access_account_treasury_report_manager","account.treasury.report.manager","model_account_treasury_report","account.group_account_manager",1,0,0,0 -"access_account_financial_report","account.financial.report","model_account_financial_report","account.group_account_user",1,1,1,1 -"access_account_financial_report_invoice","account.financial.report invoice","model_account_financial_report","account.group_account_invoice",1,0,0,0 -"access_account_financial_report_manager","account.financial.report","model_account_financial_report","account.group_account_manager",1,1,1,1 - +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_product_product_account_user,product.product.account.user,product.model_product_product,group_account_user,1,0,0,0 +access_account_payment_term,account.payment.term,model_account_payment_term,account.group_account_user,1,0,0,0 +access_account_payment_term_line,account.payment.term.line,model_account_payment_term_line,account.group_account_user,1,0,0,0 +access_account_account_type,account.account.type,model_account_account_type,account.group_account_user,1,0,0,0 +access_account_tax_internal_user,account.tax internal user,model_account_tax,base.group_user,1,0,0,0 +access_account_account,account.account,model_account_account,account.group_account_user,1,0,0,0 +access_account_account_user,account.account user,model_account_account,base.group_user,1,0,0,0 +access_account_account_partner_manager,account.account partner manager,model_account_account,base.group_partner_manager,1,0,0,0 +access_account_journal_view,account.journal.view,model_account_journal_view,account.group_account_user,1,0,0,0 +access_account_journal_column,account.journal.column,model_account_journal_column,account.group_account_user,1,0,0,0 +access_account_journal_period_manager,account.journal.period manager,model_account_journal_period,account.group_account_manager,1,0,0,0 +access_account_tax_code,account.tax.code,model_account_tax_code,account.group_account_invoice,1,0,0,0 +access_account_tax,account.tax,model_account_tax,account.group_account_invoice,1,0,0,0 +access_account_model,account.model,model_account_model,account.group_account_user,1,1,1,1 +access_account_model_line,account.model.line,model_account_model_line,account.group_account_user,1,1,1,1 +access_account_subscription,account.subscription,model_account_subscription,account.group_account_user,1,1,1,1 +access_account_subscription_line,account.subscription.line,model_account_subscription_line,account.group_account_user,1,1,1,1 +access_account_subscription_manager,account.subscription manager,model_account_subscription,account.group_account_manager,1,0,0,0 +access_account_subscription_line_manager,account.subscription.line manager,model_account_subscription_line,account.group_account_manager,1,0,0,0 +access_account_account_template,account.account.template,model_account_account_template,account.group_account_manager,1,1,1,1 +access_account_tax_code_template,account.tax.code.template,model_account_tax_code_template,account.group_account_manager,1,1,1,1 +access_account_chart_template,account.chart.template,model_account_chart_template,account.group_account_manager,1,1,1,1 +access_account_tax_template,account.tax.template,model_account_tax_template,account.group_account_manager,1,1,1,1 +access_account_bank_statement,account.bank.statement,model_account_bank_statement,account.group_account_user,1,1,1,1 +access_account_bank_statement_line,account.bank.statement.line,model_account_bank_statement_line,account.group_account_user,1,1,1,1 +access_account_analytic_line_manager,account.analytic.line manager,model_account_analytic_line,account.group_account_manager,1,0,0,0 +access_account_analytic_account,account.analytic.account,analytic.model_account_analytic_account,base.group_user,1,0,0,0 +access_account_analytic_journal,account.analytic.journal,model_account_analytic_journal,account.group_account_user,1,0,0,0 +access_account_analytic_journal_user,account.analytic.journal,model_account_analytic_journal,base.group_user,1,1,1,0 +access_account_invoice_uinvoice,account.invoice,model_account_invoice,account.group_account_invoice,1,1,1,1 +access_account_invoice_line_uinvoice,account.invoice.line,model_account_invoice_line,account.group_account_invoice,1,1,1,1 +access_account_invoice_tax_uinvoice,account.invoice.tax,model_account_invoice_tax,account.group_account_invoice,1,1,1,1 +access_account_move_uinvoice,account.move,model_account_move,account.group_account_invoice,1,1,1,1 +access_account_move_line_uinvoice,account.move.line invoice,model_account_move_line,account.group_account_invoice,1,1,1,1 +access_account_move_reconcile_uinvoice,account.move.reconcile,model_account_move_reconcile,account.group_account_invoice,1,1,1,1 +access_account_journal_period_uinvoice,account.journal.period,model_account_journal_period,account.group_account_invoice,1,1,1,1 +access_account_payment_term_manager,account.payment.term,model_account_payment_term,account.group_account_manager,1,1,1,1 +access_account_payment_term_line_manager,account.payment.term.line,model_account_payment_term_line,account.group_account_manager,1,1,1,1 +access_account_tax_manager,account.tax,model_account_tax,account.group_account_manager,1,1,1,1 +access_account_journal_manager,account.journal,model_account_journal,account.group_account_manager,1,1,1,1 +access_account_journal_invoice,account.journal invoice,model_account_journal,account.group_account_invoice,1,0,0,0 +access_account_period_manager,account.period,model_account_period,account.group_account_manager,1,1,1,1 +access_account_period_invoice,account.period invoice,model_account_period,account.group_account_invoice,1,0,0,0 +access_account_invoice_group_invoice,account.invoice group invoice,model_account_invoice,account.group_account_invoice,1,1,1,1 +access_account_analytic_journal_manager,account.analytic.journal,model_account_analytic_journal,account.group_account_manager,1,1,1,1 +access_account_fiscalyear,account.fiscalyear,model_account_fiscalyear,account.group_account_manager,1,1,1,1 +access_account_fiscalyear_invoice,account.fiscalyear.invoice,model_account_fiscalyear,account.group_account_invoice,1,0,0,0 +access_account_fiscalyear_partner_manager,account.fiscalyear.partnermanager,model_account_fiscalyear,base.group_partner_manager,1,0,0,0 +access_account_fiscalyear_employee,account.fiscalyear employee,model_account_fiscalyear,base.group_user,1,0,0,0 +access_res_currency_account_manager,res.currency account manager,base.model_res_currency,group_account_manager,1,1,1,1 +access_res_currency_rate_account_manager,res.currency.rate account manager,base.model_res_currency_rate,group_account_manager,1,1,1,1 +access_res_currency_rate_type_account_manager,res.currency.rate.type account manager,base.model_res_currency_rate_type,group_account_manager,1,1,1,1 +access_account_invoice_user,account.invoice user,model_account_invoice,base.group_user,1,0,0,0 +access_account_invoice_user,account.invoice.line user,model_account_invoice_line,base.group_user,1,0,0,0 +access_account_payment_term_partner_manager,account.payment.term partner manager,model_account_payment_term,base.group_user,1,0,0,0 +access_account_payment_term_line_partner_manager,account.payment.term.line partner manager,model_account_payment_term_line,base.group_user,1,0,0,0 +access_account_account_sale_manager,account.account sale manager,model_account_account,base.group_sale_manager,1,0,0,0 +access_account_fiscal_position_product_manager,account.fiscal.position account.manager,model_account_fiscal_position,account.group_account_manager,1,1,1,1 +access_account_fiscal_position_tax_product_manager,account.fiscal.position.tax account.manager,model_account_fiscal_position_tax,account.group_account_manager,1,1,1,1 +access_account_fiscal_position_account_product_manager,account.fiscal.position account.manager,model_account_fiscal_position_account,account.group_account_manager,1,1,1,1 +access_account_fiscal_position,account.fiscal.position all,model_account_fiscal_position,base.group_user,1,0,0,0 +access_account_fiscal_position_tax,account.fiscal.position.tax all,model_account_fiscal_position_tax,base.group_user,1,0,0,0 +access_account_fiscal_position_account,account.fiscal.position all,model_account_fiscal_position_account,base.group_user,1,0,0,0 +access_account_fiscal_position_template,account.fiscal.position.template,model_account_fiscal_position_template,account.group_account_manager,1,1,1,1 +access_account_fiscal_position_tax_template,account.fiscal.position.tax.template,model_account_fiscal_position_tax_template,account.group_account_manager,1,1,1,1 +access_account_fiscal_position_account_template,account.fiscal.position.account.template,model_account_fiscal_position_account_template,account.group_account_manager,1,1,1,1 +access_account_sequence_fiscal_year_user,account.sequence.fiscalyear user,model_account_sequence_fiscalyear,base.group_user,1,0,0,0 +access_temp_range,temp.range,model_temp_range,account.group_account_manager,1,0,0,0 +access_report_aged_receivable,report.aged.receivable,model_report_aged_receivable,account.group_account_manager,1,1,1,1 +access_report_invoice_created,report.invoice.created,model_report_invoice_created,account.group_account_manager,1,1,1,1 +access_report_account_type_sales,report.account_type.sales,model_report_account_type_sales,account.group_account_manager,1,1,1,1 +access_report_account_sales,report.account.sales,model_report_account_sales,account.group_account_manager,1,1,1,1 +access_account_invoice_report,account.invoice.report,model_account_invoice_report,account.group_account_manager,1,1,1,1 +access_res_partner_group_account_manager,res_partner group_account_manager,model_res_partner,account.group_account_manager,1,0,0,0 +access_account_invoice_accountant,account.invoice accountant,model_account_invoice,account.group_account_user,1,0,0,0 +access_account_tax_code_accountant,account.tax.code accountant,model_account_tax_code,account.group_account_user,1,1,1,1 +access_account_move_line_manager,account.move.line manager,model_account_move_line,account.group_account_manager,1,0,0,0 +access_account_move_manager,account.move manager,model_account_move,account.group_account_manager,1,0,0,0 +access_account_entries_report_manager,account.entries.report,model_account_entries_report,account.group_account_manager,1,1,1,1 +access_account_entries_report_invoice,account.entries.report,model_account_entries_report,account.group_account_invoice,1,0,0,0 +access_account_entries_report_employee,account.entries.report employee,model_account_entries_report,base.group_user,1,0,0,0 +access_analytic_entries_report_manager,analytic.entries.report,model_analytic_entries_report,account.group_account_manager,1,0,0,0 +access_account_cashbox_line,account.cashbox.line,model_account_cashbox_line,account.group_account_user,1,1,1,1 +access_account_journal_view_invoice,account.journal.view invoice,model_account_journal_view,account.group_account_invoice,1,1,1,1 +access_account_journal_column_invoice,account.journal.column invoice,model_account_journal_column,account.group_account_invoice,1,1,1,1 +access_account_invoice_tax_accountant,account.invoice.tax accountant,model_account_invoice_tax,account.group_account_user,1,0,0,0 +access_account_move_reconcile_manager,account.move.reconcile manager,model_account_move_reconcile,account.group_account_manager,1,0,0,0 +access_account_analytic_line_invoice,account.analytic.line invoice,model_account_analytic_line,account.group_account_invoice,1,1,1,1 +access_account_invoice_line_accountant,account.invoice.line accountant,model_account_invoice_line,account.group_account_user,1,0,0,0 +access_res_partner_address_accountant,res.partner.address accountant,base.model_res_partner_address,account.group_account_user,1,0,0,0 +access_account_account_invoice,account.account invoice,model_account_account,account.group_account_invoice,1,1,1,1 +access_res_partner_address_invoice,res.partner.address invoice,base.model_res_partner_address,account.group_account_invoice,1,1,1,1 +access_account_analytic_accountant,account.analytic.account accountant,analytic.model_account_analytic_account,account.group_account_user,1,1,1,1 +access_account_account_type_invoice,account.account.type invoice,model_account_account_type,account.group_account_invoice,1,1,1,1 +access_report_account_receivable_invoice,report.account.receivable.invoice,model_report_account_receivable,account.group_account_invoice,1,1,1,1 +access_account_sequence_fiscal_year_invoice,account.sequence.fiscalyear invoice,model_account_sequence_fiscalyear,account.group_account_invoice,1,1,1,1 +access_account_tax_sale_manager,account.tax sale manager,model_account_tax,base.group_sale_salesman,1,0,0,0 +access_account_journal_sale_manager,account.journal sale manager,model_account_journal,base.group_sale_salesman,1,0,0,0 +access_account_invoice_tax_sale_manager,account.invoice.tax sale manager,model_account_invoice_tax,base.group_sale_salesman,1,0,0,0 +access_account_sequence_fiscal_year_sale_user,account.sequence.fiscalyear.sale.user,model_account_sequence_fiscalyear,base.group_sale_salesman,1,1,1,0 +access_account_sequence_fiscal_year_sale_manager,account.sequence.fiscalyear.sale.manager,model_account_sequence_fiscalyear,base.group_sale_manager,1,1,1,1 +access_account_treasury_report_manager,account.treasury.report.manager,model_account_treasury_report,account.group_account_manager,1,0,0,0 +access_account_financial_report,account.financial.report,model_account_financial_report,account.group_account_user,1,1,1,1 +access_account_financial_report_invoice,account.financial.report invoice,model_account_financial_report,account.group_account_invoice,1,0,0,0 diff --git a/addons/account/test/account_report.yml b/addons/account/test/account_report.yml index 40ba7ea7127..c2797f274e7 100644 --- a/addons/account/test/account_report.yml +++ b/addons/account/test/account_report.yml @@ -37,24 +37,15 @@ data_dict = {'chart_account_id':ref('account.chart0')} from tools import test_reports test_reports.try_report_action(cr, uid, 'action_account_aged_balance_view',wiz_data=data_dict, context=ctx, our_module='account') -- - Print the Account Balance Sheet in Horizontal mode -- - !python {model: account.account}: | - ctx={} - ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')]}) - data_dict = {'chart_account_id':ref('account.chart0'),'display_type': True} - from tools import test_reports - test_reports.try_report_action(cr, uid, 'action_account_bs_report',wiz_data=data_dict, context=ctx, our_module='account') - Print the Account Balance Sheet in Normal mode - !python {model: account.account}: | ctx={} ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')]}) - data_dict = {'chart_account_id':ref('account.chart0'),'display_type': False} + data_dict = {'chart_account_id':ref('account.chart0'),'display_type': False, 'account_report_id': ref('account_financial_report_balancesheet0')} from tools import test_reports - test_reports.try_report_action(cr, uid, 'action_account_bs_report',wiz_data=data_dict, context=ctx, our_module='account') + test_reports.try_report_action(cr, uid, 'action_account_report',wiz_data=data_dict, context=ctx, our_module='account') - Print the Account Balance Report in Normal mode through the wizard - From Account Chart - @@ -147,18 +138,9 @@ !python {model: account.account}: | ctx={} ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')]}) - data_dict = {'chart_account_id':ref('account.chart0'),'display_type': False,'target_move': 'all'} + data_dict = {'chart_account_id':ref('account.chart0'),'display_type': False,'target_move': 'all', 'account_report_id': ref('account_financial_report_balancesheet0')} from tools import test_reports - test_reports.try_report_action(cr, uid, 'action_account_pl_report',wiz_data=data_dict, context=ctx, our_module='account') -- - Print the Profit-Loss Report in Horizontal Mode -- - !python {model: account.account}: | - ctx={} - ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')]}) - data_dict = {'chart_account_id':ref('account.chart0'),'display_type': True,'target_move': 'all'} - from tools import test_reports - test_reports.try_report_action(cr, uid, 'action_account_pl_report',wiz_data=data_dict, context=ctx, our_module='account') + test_reports.try_report_action(cr, uid, 'action_account_report',wiz_data=data_dict, context=ctx, our_module='account') - Print the Analytic Balance Report through the wizard - diff --git a/addons/account/wizard/__init__.py b/addons/account/wizard/__init__.py index 88ae17f3c7b..a78cf12050b 100644 --- a/addons/account/wizard/__init__.py +++ b/addons/account/wizard/__init__.py @@ -64,9 +64,6 @@ import account_report_account_balance import account_change_currency -import account_report_balance_sheet -import account_report_profit_loss - # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/wizard/account_change_currency.py b/addons/account/wizard/account_change_currency.py index eb4319a56b6..fc460eceb11 100644 --- a/addons/account/wizard/account_change_currency.py +++ b/addons/account/wizard/account_change_currency.py @@ -56,18 +56,18 @@ class account_change_currency(osv.osv_memory): if invoice.company_id.currency_id.id == invoice.currency_id.id: new_price = line.price_unit * rate if new_price <= 0: - raise osv.except_osv(_('Error'), _('New currency is not confirured properly !')) + raise osv.except_osv(_('Error'), _('New currency is not configured properly !')) if invoice.company_id.currency_id.id != invoice.currency_id.id and invoice.company_id.currency_id.id == new_currency: old_rate = invoice.currency_id.rate if old_rate <= 0: - raise osv.except_osv(_('Error'), _('Currnt currency is not confirured properly !')) + raise osv.except_osv(_('Error'), _('Current currency is not configured properly !')) new_price = line.price_unit / old_rate if invoice.company_id.currency_id.id != invoice.currency_id.id and invoice.company_id.currency_id.id != new_currency: old_rate = invoice.currency_id.rate if old_rate <= 0: - raise osv.except_osv(_('Error'), _('Current currency is not confirured properly !')) + raise osv.except_osv(_('Error'), _('Current currency is not configured properly !')) new_price = (line.price_unit / old_rate ) * rate obj_inv_line.write(cr, uid, [line.id], {'price_unit': new_price}) obj_inv.write(cr, uid, [invoice.id], {'currency_id': new_currency}, context=context) diff --git a/addons/account/wizard/account_financial_report.py b/addons/account/wizard/account_financial_report.py index de9cae3a00c..92c623a9524 100644 --- a/addons/account/wizard/account_financial_report.py +++ b/addons/account/wizard/account_financial_report.py @@ -38,9 +38,19 @@ class accounting_report(osv.osv_memory): 'date_to_cmp': fields.date("End Date"), } + def _get_account_report(self, cr, uid, context=None): + menu_obj = self.pool.get('ir.ui.menu') + report_obj = self.pool.get('account.financial.report') + report_ids = [] + if context.get('active_id'): + menu = menu_obj.browse(cr, uid, context.get('active_id')).name + report_ids = report_obj.search(cr, uid, [('name','ilike',menu)]) + return report_ids and report_ids[0] or False + _defaults = { 'filter_cmp': 'filter_no', 'target_move': 'posted', + 'account_report_id': _get_account_report, } def _build_comparison_context(self, cr, uid, ids, data, context=None): diff --git a/addons/account/wizard/account_financial_report_view.xml b/addons/account/wizard/account_financial_report_view.xml index 1472da4ba87..4be6fb5e95c 100644 --- a/addons/account/wizard/account_financial_report_view.xml +++ b/addons/account/wizard/account_financial_report_view.xml @@ -40,6 +40,24 @@ new + + + + + + ). -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## - -from osv import osv, fields -from tools.translate import _ - -class account_bs_report(osv.osv_memory): - """ - This wizard will provide the account balance sheet report by periods, between any two dates. - """ - _name = 'account.bs.report' - _inherit = "account.common.account.report" - _description = 'Account Balance Sheet Report' - - def _get_def_reserve_account(self, cr, uid, context=None): - chart_id = self._get_account(cr, uid, context=context) - res = self.onchange_chart_id(cr, uid, [], chart_id, context=context) - if not res: - return False - return res['value']['reserve_account_id'] - - _columns = { - 'display_type': fields.boolean("Landscape Mode"), - 'reserve_account_id': fields.many2one('account.account', 'Reserve & Profit/Loss Account', - help='This account is used for transferring Profit/Loss (If It is Profit: Amount will be added, Loss : Amount will be deducted.), as calculated in Profit & Loss Report', - domain = [('type','=','other')]), - 'journal_ids': fields.many2many('account.journal', 'account_bs_report_journal_rel', 'account_id', 'journal_id', 'Journals', required=True), - } - - _defaults={ - 'display_type': False, - 'journal_ids': [], - 'reserve_account_id': _get_def_reserve_account, - } - - def onchange_chart_id(self, cr, uid, ids, chart_id, context=None): - if not chart_id: - return {} - account = self.pool.get('account.account').browse(cr, uid, chart_id , context=context) - if not account.company_id.property_reserve_and_surplus_account: - return {'value': {'reserve_account_id': False}} - return {'value': {'reserve_account_id': account.company_id.property_reserve_and_surplus_account.id}} - - - def _print_report(self, cr, uid, ids, data, context=None): - if context is None: - context = {} - data['form'].update(self.read(cr, uid, ids, ['display_type','reserve_account_id'])[0]) - if not data['form']['reserve_account_id']: - raise osv.except_osv(_('Warning'),_('Please define the Reserve and Profit/Loss account for current user company !')) - data = self.pre_print_report(cr, uid, ids, data, context=context) - if data['form']['display_type']: - return { - 'type': 'ir.actions.report.xml', - 'report_name': 'account.balancesheet.horizontal', - 'datas': data, - } - else: - return { - 'type': 'ir.actions.report.xml', - 'report_name': 'account.balancesheet', - 'datas': data, - } - -account_bs_report() - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/wizard/account_report_balance_sheet_view.xml b/addons/account/wizard/account_report_balance_sheet_view.xml deleted file mode 100644 index faac52388a1..00000000000 --- a/addons/account/wizard/account_report_balance_sheet_view.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - Account Balance Sheet - account.bs.report - form - - - - - - - - - - - - - - - - - - - - - - - - Balance Sheet - account.bs.report - ir.actions.act_window - form - form - - new - - - - - - diff --git a/addons/account/wizard/account_report_profit_loss.py b/addons/account/wizard/account_report_profit_loss.py deleted file mode 100644 index f4c2897bfe0..00000000000 --- a/addons/account/wizard/account_report_profit_loss.py +++ /dev/null @@ -1,62 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (). -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## - -from osv import osv, fields - -class account_pl_report(osv.osv_memory): - """ - This wizard will provide the account profit and loss report by periods, between any two dates. - """ - _inherit = "account.common.account.report" - _name = "account.pl.report" - _description = "Account Profit And Loss Report" - - _columns = { - 'display_type': fields.boolean("Landscape Mode"), - 'journal_ids': fields.many2many('account.journal', 'account_pl_report_journal_rel', 'account_id', 'journal_id', 'Journals', required=True), - } - - _defaults = { - 'display_type': False, - 'journal_ids': [], - } - - def _print_report(self, cr, uid, ids, data, context=None): - if context is None: - context = {} - data = self.pre_print_report(cr, uid, ids, data, context=context) - data['form'].update(self.read(cr, uid, ids, ['display_type'])[0]) - if data['form']['display_type']: - return { - 'type': 'ir.actions.report.xml', - 'report_name': 'pl.account.horizontal', - 'datas': data, - } - else: - return { - 'type': 'ir.actions.report.xml', - 'report_name': 'pl.account', - 'datas': data, - } - -account_pl_report() - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/wizard/account_report_profit_loss_view.xml b/addons/account/wizard/account_report_profit_loss_view.xml deleted file mode 100644 index 75b6766ff87..00000000000 --- a/addons/account/wizard/account_report_profit_loss_view.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - Profit and Loss - account.pl.report - form - - - - - - - - - - - - - - - - - - - Account Profit And Loss - account.pl.report - ir.actions.act_window - form - form - - new - - - - - - - - diff --git a/addons/account_accountant/static/src/img/icon.png b/addons/account_accountant/static/src/img/icon.png new file mode 100644 index 00000000000..1e25fc1efaf Binary files /dev/null and b/addons/account_accountant/static/src/img/icon.png differ diff --git a/addons/account_analytic_analysis/__openerp__.py b/addons/account_analytic_analysis/__openerp__.py index ee887e1ff6a..01ef6a3cb81 100644 --- a/addons/account_analytic_analysis/__openerp__.py +++ b/addons/account_analytic_analysis/__openerp__.py @@ -46,7 +46,6 @@ user-wise as well as month wise. ], 'demo_xml' : [], 'installable': True, - 'application': True, 'active' : False, 'certificate': '0042927202589', } diff --git a/addons/account_analytic_analysis/account_analytic_analysis_menu.xml b/addons/account_analytic_analysis/account_analytic_analysis_menu.xml index 1f6444c7351..e8647bd1aac 100644 --- a/addons/account_analytic_analysis/account_analytic_analysis_menu.xml +++ b/addons/account_analytic_analysis/account_analytic_analysis_menu.xml @@ -32,13 +32,11 @@ help="Analytic Accounts with a past deadline in one month." /> - - - + + - @@ -64,7 +62,7 @@ account.analytic.account form tree,form,graph - {'search_default_has_partner':1, 'search_default_my_accounts':1, 'search_default_draft':1, 'search_default_pending':1, 'search_default_open':1, 'search_default_renew':1} + {'search_default_has_partner':1, 'search_default_user_id':uid, 'search_default_draft':1, 'search_default_pending':1, 'search_default_open':1, 'search_default_renew':1} [('type','=','normal')] You will find here the contracts to be renewed because the deadline is passed or the working hours are higher than the allocated hours. OpenERP automatically sets these analytic accounts to the pending state, in order to raise a warning during the timesheets recording. Salesmen should review all pending accounts and reopen or close the according to the negotiation with the customer. @@ -76,7 +74,7 @@ account.analytic.account form tree,form,graph - {'search_default_has_partner':1, 'search_default_my_accounts':1, 'search_default_draft':1, 'search_default_pending':1, 'search_default_open':1} + {'search_default_has_partner':1, 'search_default_user_id':uid, 'search_default_draft':1, 'search_default_pending':1, 'search_default_open':1} [('type','=','normal')] diff --git a/addons/account_analytic_analysis/account_analytic_analysis_view.xml b/addons/account_analytic_analysis/account_analytic_analysis_view.xml index 9bf66c18344..73c98e650f8 100644 --- a/addons/account_analytic_analysis/account_analytic_analysis_view.xml +++ b/addons/account_analytic_analysis/account_analytic_analysis_view.xml @@ -16,14 +16,14 @@ - - + +