# Author: Damien Crier # Author: Julien Coux # Copyright 2016 Camptocamp SA # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from odoo import _, models class JournalLedgerXslx(models.AbstractModel): _name = 'report.a_f_r.report_journal_ledger_xlsx' _inherit = 'report.account_financial_report.abstract_report_xlsx' def _get_report_name(self, report, data=False): company_id = data.get('company_id', False) report_name = _('Journal Ledger') if company_id: company = self.env['res.company'].browse(company_id) suffix = ' - %s - %s' % ( company.name, company.currency_id.name) report_name = report_name + suffix return report_name def _get_report_columns(self, report): columns = [ { 'header': _('Entry'), 'field': 'entry', 'width': 18 }, { 'header': _('Date'), 'field': 'date', 'width': 11 }, { 'header': _('Account'), 'field': 'account_code', 'width': 9 }, ] if report.with_account_name: columns.append({ 'header': _('Account Name'), 'field': 'account_name', 'width': 15 }) columns += [ { 'header': _('Partner'), 'field': 'partner', 'width': 25 }, { 'header': _('Ref - Label'), 'field': 'label', 'width': 40 }, { 'header': _('Taxes'), 'field': 'taxes_description', 'width': 11 }, { 'header': _('Debit'), 'field': 'debit', 'type': 'amount', 'width': 14, }, { 'header': _('Credit'), 'field': 'credit', 'type': 'amount', 'width': 14 } ] if report.foreign_currency: columns += [ { 'header': _('Currency'), 'field': 'currency_name', 'width': 14, 'type': 'currency_name', }, { 'header': _('Amount Currency'), 'field': 'amount_currency', 'type': 'amount', 'width': 18 }, ] columns_as_dict = {} for i, column in enumerate(columns): columns_as_dict[i] = column return columns_as_dict def _get_journal_tax_columns(self, report): return { 0: { 'header': _('Name'), 'field': 'tax_name', 'width': 35 }, 1: { 'header': _('Description'), 'field': 'tax_code', 'width': 18 }, 2: { 'header': _('Base Debit'), 'field': 'base_debit', 'type': 'amount', 'width': 14 }, 3: { 'header': _('Base Credit'), 'field': 'base_credit', 'type': 'amount', 'width': 14 }, 4: { 'header': _('Base Balance'), 'field': 'base_balance', 'type': 'amount', 'width': 14 }, 5: { 'header': _('Tax Debit'), 'field': 'tax_debit', 'type': 'amount', 'width': 14 }, 6: { 'header': _('Tax Credit'), 'field': 'tax_credit', 'type': 'amount', 'width': 14 }, 7: { 'header': _('Tax Balance'), 'field': 'tax_balance', 'type': 'amount', 'width': 14 }, } def _get_col_count_filter_name(self): return 2 def _get_col_count_filter_value(self): return 3 def _get_report_filters(self, report): target_label_by_value = { value: label for value, label in self.env['journal.ledger.report.wizard']._get_move_targets() } sort_option_label_by_value = { value: label for value, label in self.env['journal.ledger.report.wizard']._get_sort_options() } return [ [ _('Company'), report.company_id.name ], [ _('Date range filter'), _('From: %s To: %s') % (report.date_from, report.date_to) ], [ _('Target moves filter'), _("%s") % target_label_by_value[report.move_target], ], [ _('Entries sorted by'), _("%s") % sort_option_label_by_value[report.sort_option], ], [ _('Journals'), ', '.join([ "%s - %s" % (report_journal.code, report_journal.name) for report_journal in report.journal_ids ]) ] ] def _generate_report_content(self, workbook, report, data): res_data = self.env[ 'report.account_financial_report.journal_ledger' ]._get_report_values(report, data) group_option = report.group_option if group_option == 'journal': for ledger in res_data['Journal_Ledgers']: self._generate_journal_content(workbook, report, res_data, ledger) elif group_option == 'none': self._generate_no_group_content(workbook, report, res_data) def _generate_no_group_content(self, workbook, report, res_data): self._generate_moves_content( workbook, "Report", report, res_data, res_data['Moves']) self._generate_no_group_taxes_summary(workbook, report, res_data) def _generate_journal_content(self, workbook, report, res_data, ledger): journal = self.env['account.journal'].browse(ledger['id']) currency_name = journal.currency_id and journal.currency_id.name or \ journal.company_id.currency_id.name sheet_name = "%s (%s) - %s" % ( journal.code, currency_name, journal.name, ) self._generate_moves_content( workbook, sheet_name, report, res_data, ledger['report_moves']) self._generate_journal_taxes_summary(workbook, ledger) def _generate_no_group_taxes_summary(self, workbook, report, res_data): self._generate_taxes_summary( workbook, "Tax Report", res_data['tax_line_data']) def _generate_journal_taxes_summary(self, workbook, ledger): journal = self.env['account.journal'].browse(ledger['id']) currency_name = journal.currency_id and journal.currency_id.name or \ journal.company_id.currency_id.name sheet_name = "Tax - %s (%s) - %s" % ( journal.code, currency_name, journal.name, ) self._generate_taxes_summary( workbook, sheet_name, ledger['tax_lines']) def _generate_moves_content(self, workbook, sheet_name, report, res_data, moves): self.workbook = workbook self.sheet = workbook.add_worksheet(sheet_name) self._set_column_width() self.row_pos = 1 self.write_array_title(sheet_name) self.row_pos += 2 self.write_array_header() account_ids_data = res_data['account_ids_data'] partner_ids_data = res_data['partner_ids_data'] currency_ids_data = res_data['currency_ids_data'] move_ids_data = res_data['move_ids_data'] for move in moves: for line in move['report_move_lines']: currency_data = currency_ids_data.get( line['currency_id'], False) currency_name = currency_data and currency_data['name'] or '' account_data = account_ids_data.get(line['account_id'], False) account_name = account_data and account_data['name'] or '' account_code = account_data and account_data['code'] or '' move_data = move_ids_data.get(line['move_id'], False) move_entry = move_data and move_data['entry'] or '' line['partner'] = self._get_partner_name(line['partner_id'], partner_ids_data) line['account_code'] = account_code line['account_name'] = account_name line['currency_name'] = currency_name line['entry'] = move_entry line['taxes_description'] = \ report._get_ml_tax_description( line, res_data['tax_line_data'].get( line['tax_line_id']), res_data['move_line_ids_taxes_data'].get( line['move_line_id'], False)) self.write_line_from_dict(line) self.row_pos += 1 def _generate_taxes_summary(self, workbook, sheet_name, tax_lines_dict): self.workbook = workbook self.sheet = workbook.add_worksheet(sheet_name) self.row_pos = 1 self.write_array_title(sheet_name) self.row_pos += 2 def _get_partner_name(self, partner_id, partner_data): if partner_id in partner_data.keys(): return partner_data[partner_id]['name'] else: return ''