from datetime import datetime from dateutil.relativedelta import relativedelta from odoo.exceptions import UserError import json from datetime import timedelta, date import datetime import io from odoo import api, fields, models, _ from odoo.tools.float_utils import float_round from odoo.tools import date_utils try: from odoo.tools.misc import xlsxwriter except ImportError: import xlsxwriter class AccountReportGeneralLedger(models.TransientModel): _inherit = "account.report.general.ledger.xlsx" journal_ids = fields.Many2many('account.journal', string=_('Journals'), required=True,default=lambda self: self.env['account.journal'].search([('id', '=', 10)])) def _build_contexts(self, data): result = {} result['journal_ids'] = 'journal_ids' in data['form'] and data['form']['journal_ids'] or False result['state'] = 'target_move' in data['form'] and data['form']['target_move'] or '' date_from = data['form']['date_from'] or False if date_from: date_from = fields.Date.from_string(date_from) date_from -= relativedelta(days=1) result['date_from'] = fields.Date.to_string(date_from) else: result['date_from'] = False result['date_to'] = data['form']['date_to'] or False result['strict_range'] = True if result['date_from'] else False return result def check_report_ledger(self): self.ensure_one() data = {} data['ids'] = self.env.context.get('active_ids', []) data['model'] = self.env.context.get('active_model', 'ir.ui.menu') data['form'] = self.read(['date_from', 'date_to', 'journal_ids', 'target_move'])[0] used_context = self._build_contexts(data) data['form']['used_context'] = dict(used_context, lang=self.env.context.get('lang') or 'en_US') return { 'type': 'ir.actions.report', 'data': {'model': 'account.report.general.ledger.xlsx', 'options': json.dumps(data, default=date_utils.json_default), 'output_format': 'xlsx', 'report_name': 'general ledger report', }, 'report_type': 'xlsx' } def get_xlsx_report(self, options, response): output = io.BytesIO() workbook = xlsxwriter.Workbook(output, {'in_memory': True}) data = {} vals = self.search([('id', '=', options['form']['id'])]) data['form'] = vals.read([])[0] data['model'] = 'ir.ui.menu' data['ids'] = [] data['form']['used_context'] = { 'date_to': options['form'].get('date_to', False), 'date_from': options['form'].get('date_from', False), 'strict_range': True, 'state': options['form']['target_move'], 'journal_ids': options['form']['journal_ids'], } env_obj = vals.env['report.account.report_generalledger'] sortby = data['form'].get('sortby', 'sort_date') display_account = data['form']['display_account'] codes = [] if data['form'].get('journal_ids', False): codes = [journal.code for journal in self.env['account.journal'].search([('id', 'in', data['form']['journal_ids'])])] # accounts = vals.active_account if vals.active_account else self.env['account.account'].search([]) accounts = self.env['account.account'].browse(options['ids']) or self.env['account.account'].search([]) init_balance = vals['initial_balance'] date_from = options['form'].get('date_from', False) date_to = options['form'].get('date_to', False) report_obj = env_obj.with_context(data['form'].get('used_context', {}))._get_account_move_entry_custom( accounts, init_balance, sortby, display_account) sheet = workbook.add_worksheet() format1 = workbook.add_format({'font_size': 16, 'align': 'center', 'bg_color': '#D3D3D3', 'bold': True}) format1.set_font_color('#000080') format2 = workbook.add_format({'font_size': 12, 'bold': True, 'bg_color': '#D3D3D3'}) format3 = workbook.add_format({'font_size': 10, 'bold': True}) format4 = workbook.add_format({'font_size': 10}) format6 = workbook.add_format({'font_size': 10, 'bold': True}) format7 = workbook.add_format({'font_size': 10, 'align': 'center'}) format5 = workbook.add_format({'font_size': 10, 'align': 'right'}) format1.set_align('center') format2.set_align('center') format3.set_align('right') format4.set_align('left') codes = [] if data['form'].get('journal_ids', False): codes = [journal.code for journal in self.env['account.journal'].search([('id', 'in', data['form']['journal_ids'])])] logged_users = self.env['res.company']._company_default_get('account.account') report_date = datetime.datetime.now().strftime("%Y-%m-%d") sheet.merge_range('M8:N8', _("Report Date"), format3) sheet.merge_range('M9:N9', report_date, format4) sheet.merge_range(1, 0, 1, 14, logged_users.name, format4) sheet.merge_range(3, 0, 4, 14, _("General Ledger Report"), format1) sheet.merge_range('A6:B6', _("Journals :"), format6) row = 6 col = 0 i = 0 for values in codes: sheet.write(row, col + i, values, format7) i += 1 if data['form']['display_account'] == 'all': display_account = _('All accounts') elif data['form']['display_account'] == 'movement': display_account = _('With movements') else: display_account = _('With balance not equal to zero') if data['form']['target_move'] == 'all': target_moves = _('All entries') else: target_moves = _('All posted entries') if data['form']['sortby'] == 'sort_date': sortby = 'Date' else: sortby = 'Journal and partners' if data['form']['date_from']: date_start = datetime.datetime.strptime(str(data['form']['used_context']['date_from']), '%Y-%m-%d') date_start = date_start.strftime('%Y-%m-%d') else: date_start = "" if data['form']['date_to']: date_end = datetime.datetime.strptime(str(data['form']['used_context']['date_to']), '%Y-%m-%d') date_end = date_end.strftime('%Y-%m-%d') else: date_end = "" if sortby == 'Date': sheet.write('G8', _("Start Date"), format3) sheet.write('G9', date_start, format4) sheet.write('J8', _("End Date"), format3) sheet.write('J9', date_end, format4) sheet.merge_range('C8:D8', _("Sorted By"), format3) sheet.merge_range('C9:D9', sortby, format4) sheet.merge_range('A8:B8', _("Display Account"), format6) sheet.merge_range('A9:B9', display_account, format7) sheet.merge_range('E8:F8', _("Target Moves"), format6) sheet.merge_range('E9:F9', target_moves, format7) sheet.write('A11', "Date ", format2) sheet.write('B11', "JRNL", format2) sheet.merge_range('C11:D11', _("Partner"), format2) sheet.merge_range('E11:F11', _("Ref"), format2) sheet.merge_range('G11:H11', _("Move"), format2) sheet.merge_range('I11:L11', _("Entry Label"), format2) sheet.write('M11', _("Debit"), format2) sheet.write('N11', _("Credit"), format2) sheet.write('O11', _("Balance"), format2) sheet.write('P11', _("Debit Month"), format2) sheet.write('Q11', _("Credit Month"), format2) sheet.write('R11', _("Balance Month"), format2) accounts = self.env['account.account'].search([]) row_number = 11 col_number = 0 for account in accounts: for values in report_obj: if account['name'] == values['name'] and account['company_id'].id == values['company_id']: sheet.write(row_number, col_number, account['code'], format3) sheet.merge_range(row_number, col_number + 1, row_number, col_number + 11, account['name'], format6) sheet.write(row_number, col_number + 12, logged_users.currency_id.symbol + ' ' + "{:,.2f}".format(values['debit']), format3) sheet.write(row_number, col_number + 13, logged_users.currency_id.symbol + ' ' + "{:,.2f}".format(values['credit']), format3) sheet.write(row_number, col_number + 14, logged_users.currency_id.symbol + ' ' + "{:,.2f}".format(values['balance']), format3) row_number += 1 for lines in values['move_lines']: if lines['ldate']: formatted_date = datetime.datetime.strptime(str(lines['ldate']), '%Y-%m-%d') formatted_date = formatted_date.strftime('%Y-%m-%d') else: formatted_date = "" sheet.write(row_number, col_number, formatted_date, format4) sheet.write(row_number, col_number + 1, lines['lcode'], format4) sheet.merge_range(row_number, col_number + 2, row_number, col_number + 3, lines['partner_name'], format4) sheet.merge_range(row_number, col_number + 4, row_number, col_number + 5, lines['lref'], format4) sheet.merge_range(row_number, col_number + 6, row_number, col_number + 7, lines['move_name'], format4) sheet.merge_range(row_number, col_number + 8, row_number, col_number + 11, lines['lname'], format4) sheet.write(row_number, col_number + 12, "{:,}".format(lines['debit']), format5) sheet.write(row_number, col_number + 13, "{:,.2f}".format(lines['credit']), format5) sheet.write(row_number, col_number + 14, "{:,.2f}".format(lines['balance']), format5) if lines['lname'] == 'Initial Balance': debit_value = lines.get('debit', 0.0) value_debit = values.get('debit', 0.0) total_debit = value_debit - debit_value debit_month = "{:,.2f}".format(total_debit) credit_value = lines.get('credit', 0.0) value_credit = values.get('credit', 0.0) total_credit = value_credit - credit_value credit_month = "{:,.2f}".format(total_credit) total_balance = total_debit - total_credit balance_month = "{:,.2f}".format(total_balance) sheet.write(row_number, col_number + 15, debit_month, format5) sheet.write(row_number, col_number + 16, credit_month, format5) sheet.write(row_number, col_number + 17, balance_month, format5) row_number += 1 workbook.close() output.seek(0) response.stream.write(output.read()) output.close()