You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
472 lines
21 KiB
472 lines
21 KiB
# -*- coding: utf-8 -*-
|
|
from datetime import datetime
|
|
from odoo.addons.report_xlsx.report.report_xlsx import ReportXlsx
|
|
from odoo.tools import DEFAULT_SERVER_DATE_FORMAT
|
|
from odoo import _
|
|
|
|
|
|
class AccountStandardExcel(ReportXlsx):
|
|
|
|
def generate_xlsx_report(self, workbook, data, wizard):
|
|
|
|
num_format = _('_ * #,##0.00_) ;_ * - #,##0.00_) ;_ * "-"??_) ;_ @_ ')
|
|
bold = workbook.add_format({'bold': True})
|
|
middle = workbook.add_format({'bold': True, 'top': 1})
|
|
left = workbook.add_format({'left': 1, 'top': 1, 'bold': True})
|
|
right = workbook.add_format({'right': 1, 'top': 1})
|
|
top = workbook.add_format({'top': 1})
|
|
currency_format = workbook.add_format({'num_format': _(num_format)})
|
|
c_middle = workbook.add_format({'bold': True, 'top': 1, 'num_format': _(num_format)})
|
|
report_format = workbook.add_format({'font_size': 24})
|
|
rounding = self.env.user.company_id.currency_id.decimal_places or 2
|
|
lang_code = self.env.user.lang or 'en_US'
|
|
date_format = self.env['res.lang']._lang_get(lang_code).date_format
|
|
|
|
report = wizard.report_id
|
|
|
|
def _get_data_float(data):
|
|
if data == None or data == False:
|
|
return 0.0
|
|
else:
|
|
return wizard.company_currency_id.round(data) + 0.0
|
|
|
|
def get_date_format(date):
|
|
if date:
|
|
date = datetime.strptime(date, DEFAULT_SERVER_DATE_FORMAT)
|
|
date = date.strftime(date_format)
|
|
return date
|
|
|
|
def _header_sheet(sheet):
|
|
sheet.write(0, 4, report.name, report_format)
|
|
sheet.write(2, 0, _('Company:'), bold)
|
|
sheet.write(3, 0, wizard.company_id.name,)
|
|
sheet.write(4, 0, _('Print on %s') % report.print_time)
|
|
|
|
sheet.write(2, 2, _('Start Date : %s ') % wizard.date_from if wizard.date_from else '')
|
|
sheet.write(3, 2, _('End Date : %s ') % wizard.date_to if wizard.date_to else '')
|
|
|
|
sheet.write(2, 4, _('Target Moves:'), bold)
|
|
sheet.write(3, 4, _('All Entries') if wizard.target_move == 'all' else _('All Posted Entries'))
|
|
|
|
sheet.write(2, 6, _('Only UnReconciled Entries') if wizard.reconciled is False else _('With Reconciled Entries'), bold)
|
|
|
|
if wizard.type_ledger == 'aged':
|
|
|
|
if wizard.summary:
|
|
sheet = workbook.add_worksheet(report.name)
|
|
_header_sheet(sheet)
|
|
|
|
head = [
|
|
{'name': 'Code',
|
|
'larg': 10,
|
|
'col': {}},
|
|
{'name': 'Name',
|
|
'larg': 30,
|
|
'col': {}},
|
|
{'name': _('Not Due'),
|
|
'larg': 15,
|
|
'col': {'total_function': 'sum', 'format': currency_format}},
|
|
{'name': _('0-30'),
|
|
'larg': 15,
|
|
'col': {'total_function': 'sum', 'format': currency_format}},
|
|
{'name': _('30-60'),
|
|
'larg': 15,
|
|
'col': {'total_function': 'sum', 'format': currency_format}},
|
|
{'name': _('60-90'),
|
|
'larg': 15,
|
|
'col': {'total_function': 'sum', 'format': currency_format}},
|
|
{'name': _('90-120'),
|
|
'larg': 15,
|
|
'col': {'total_function': 'sum', 'format': currency_format}},
|
|
{'name': _('Older'),
|
|
'larg': 15,
|
|
'col': {'total_function': 'sum', 'format': currency_format}},
|
|
{'name': _('Total'),
|
|
'larg': 15,
|
|
'col': {'total_function': 'sum', 'format': currency_format}},
|
|
]
|
|
|
|
all_lines = wizard._sql_get_line_for_report(type_l=('4_total',))
|
|
# print(all_lines)
|
|
if all_lines:
|
|
|
|
row = 6
|
|
row += 1
|
|
start_row = row
|
|
for i, line in enumerate(all_lines):
|
|
i += row
|
|
sheet.write(i, 0, line.get('code', ''))
|
|
sheet.write(i, 1, line.get('name', ''))
|
|
sheet.write(i, 2, _get_data_float(line.get('current')), currency_format)
|
|
sheet.write(i, 3, _get_data_float(line.get('age_30_days')), currency_format)
|
|
sheet.write(i, 4, _get_data_float(line.get('age_60_days')), currency_format)
|
|
sheet.write(i, 5, _get_data_float(line.get('age_90_days')), currency_format)
|
|
sheet.write(i, 6, _get_data_float(line.get('age_120_days')), currency_format)
|
|
sheet.write(i, 7, _get_data_float(line.get('older')), currency_format)
|
|
sheet.write(i, 8, _get_data_float(line.get('balance')), currency_format)
|
|
row = i
|
|
|
|
for j, h in enumerate(head):
|
|
sheet.set_column(j, j, h['larg'])
|
|
|
|
table = []
|
|
for h in head:
|
|
col = {}
|
|
col['header'] = h['name']
|
|
col.update(h['col'])
|
|
table.append(col)
|
|
|
|
sheet.add_table(start_row - 1, 0, row + 1, len(head) - 1,
|
|
{'total_row': 1,
|
|
'columns': table,
|
|
'style': 'Table Style Light 9',
|
|
})
|
|
|
|
else: # aged not summary
|
|
head = [
|
|
{'name': _('Date'),
|
|
'larg': 10,
|
|
'col': {}},
|
|
{'name': _('JRNL'),
|
|
'larg': 10,
|
|
'col': {}},
|
|
{'name': _('Account'),
|
|
'larg': 10,
|
|
'col': {}},
|
|
{'name': _('Account Name'),
|
|
'larg': 15,
|
|
'col': {}},
|
|
{'name': _('Journal entries'),
|
|
'larg': 20,
|
|
'col': {}},
|
|
{'name': _('Ref'),
|
|
'larg': 40,
|
|
'col': {}},
|
|
{'name': _('Partner'),
|
|
'larg': 20,
|
|
'col': {}},
|
|
{'name': _('Due Date'),
|
|
'larg': 10,
|
|
'col': {}},
|
|
{'name': _('Not Due'),
|
|
'larg': 15,
|
|
'col': {'total_function': 'sum', 'format': currency_format}},
|
|
{'name': _('0-30'),
|
|
'larg': 15,
|
|
'col': {'total_function': 'sum', 'format': currency_format}},
|
|
{'name': _('30-60'),
|
|
'larg': 15,
|
|
'col': {'total_function': 'sum', 'format': currency_format}},
|
|
{'name': _('60-90'),
|
|
'larg': 15,
|
|
'col': {'total_function': 'sum', 'format': currency_format}},
|
|
{'name': _('90-120'),
|
|
'larg': 15,
|
|
'col': {'total_function': 'sum', 'format': currency_format}},
|
|
{'name': _('Older'),
|
|
'larg': 15,
|
|
'col': {'total_function': 'sum', 'format': currency_format}},
|
|
{'name': _('Total'),
|
|
'larg': 15,
|
|
'col': {'total_function': 'sum', 'format': currency_format}},
|
|
{'name': _('Match.'),
|
|
'larg': 10,
|
|
'col': {}},
|
|
]
|
|
table = []
|
|
for h in head:
|
|
col = {'header': h['name']}
|
|
col.update(h['col'])
|
|
table.append(col)
|
|
|
|
def _set_line(line):
|
|
sheet.write(i, 0, get_date_format(line.get('date', '')))
|
|
sheet.write(i, 1, line.get('j_code', ''))
|
|
sheet.write(i, 2, line.get('a_code', ''))
|
|
sheet.write(i, 3, line.get('a_name', ''))
|
|
sheet.write(i, 4, line.get('move_name', ''))
|
|
sheet.write(i, 5, line.get('displayed_name', ''))
|
|
sheet.write(i, 6, line.get('partner_name', ''))
|
|
sheet.write(i, 7, get_date_format(line.get('date_maturity', '')))
|
|
sheet.write(i, 8, _get_data_float(line.get('current')), currency_format)
|
|
sheet.write(i, 9, _get_data_float(line.get('age_30_days')), currency_format)
|
|
sheet.write(i, 10, _get_data_float(line.get('age_60_days')), currency_format)
|
|
sheet.write(i, 11, _get_data_float(line.get('age_90_days')), currency_format)
|
|
sheet.write(i, 12, _get_data_float(line.get('age_120_days')), currency_format)
|
|
sheet.write(i, 13, _get_data_float(line.get('older')), currency_format)
|
|
sheet.write(i, 14, _get_data_float(line.get('balance')), currency_format)
|
|
sheet.write(i, 15, line.get('matching_number', ''))
|
|
|
|
def _set_table(start_row, row):
|
|
sheet.add_table(start_row - 1, 0, row + 1, len(head) - 1,
|
|
{'total_row': 1,
|
|
'columns': table,
|
|
'style': 'Table Style Light 9',
|
|
})
|
|
#sheet.write(row + 1, 10, "=I%s-J%s" % (row + 2, row + 2), currency_format)
|
|
|
|
# With total workbook
|
|
sheet = workbook.add_worksheet(report.name + _(' Totals'))
|
|
_header_sheet(sheet)
|
|
|
|
row = 6
|
|
all_lines = wizard._sql_get_line_for_report(type_l=('1_init_line', '2_line'))
|
|
for obj in report.report_object_ids:
|
|
|
|
lines_obj = []
|
|
obj_id = obj.id
|
|
for line in all_lines:
|
|
if line.get('report_object_id') == obj_id:
|
|
lines_obj.append(line)
|
|
if lines_obj:
|
|
row += 1
|
|
sheet.write(row, 0, obj.partner_id.name, left) # obj.partner_id.name
|
|
sheet.write(row, 1, '', top)
|
|
sheet.write(row, 2, '', top)
|
|
sheet.write(row, 3, '', top)
|
|
sheet.write(row, 4, '', top)
|
|
sheet.write(row, 5, '', top)
|
|
sheet.write(row, 6, '', c_middle)
|
|
sheet.write(row, 7, '', c_middle)
|
|
sheet.write(row, 8, '', c_middle)
|
|
sheet.write(row, 9, '', c_middle)
|
|
sheet.write(row, 10, '', c_middle)
|
|
sheet.write(row, 11, '', c_middle)
|
|
sheet.write(row, 12, '', c_middle)
|
|
sheet.write(row, 13, '', c_middle)
|
|
sheet.write(row, 14, '', c_middle)
|
|
sheet.write(row, 15, '', right)
|
|
|
|
row += 2
|
|
start_row = row
|
|
for i, line in enumerate(lines_obj):
|
|
i += row
|
|
_set_line(line)
|
|
|
|
row = i
|
|
|
|
for j, h in enumerate(head):
|
|
sheet.set_column(j, j, h['larg'])
|
|
|
|
_set_table(start_row, row)
|
|
row += 2
|
|
|
|
# Pivot
|
|
sheet = workbook.add_worksheet(report.name)
|
|
_header_sheet(sheet)
|
|
|
|
# for group_by in data['group_by_data']['ids']:
|
|
# for line in data['lines_group_by'][group_by]['new_lines']:
|
|
# if line['type_line'] != 'total':
|
|
# all_lines.append(line)
|
|
# Head
|
|
if all_lines:
|
|
row = 6
|
|
row += 1
|
|
start_row = row
|
|
for i, line in enumerate(all_lines):
|
|
i += row
|
|
_set_line(line)
|
|
row = i
|
|
|
|
for j, h in enumerate(head):
|
|
sheet.set_column(j, j, h['larg'])
|
|
|
|
_set_table(start_row, row)
|
|
|
|
else: # standard report
|
|
|
|
if wizard.summary:
|
|
sheet = workbook.add_worksheet(report.name)
|
|
_header_sheet(sheet)
|
|
|
|
all_lines = wizard._sql_get_line_for_report(type_l=('4_total',))
|
|
# for group_by in data['group_by_data']['ids']:
|
|
# all_lines.append(data['lines_group_by'][group_by])
|
|
if all_lines:
|
|
# Head
|
|
head = [
|
|
{'name': 'Code',
|
|
'larg': 10,
|
|
'col': {}},
|
|
{'name': 'Name',
|
|
'larg': 30,
|
|
'col': {}},
|
|
{'name': 'Debit',
|
|
'larg': 15,
|
|
'col': {'total_function': 'sum', 'format': currency_format}},
|
|
{'name': 'Credit',
|
|
'larg': 15,
|
|
'col': {'total_function': 'sum', 'format': currency_format}},
|
|
{'name': 'Balance',
|
|
'larg': 15,
|
|
'col': {'total_function': 'sum', 'format': currency_format}},
|
|
]
|
|
|
|
row = 6
|
|
row += 1
|
|
start_row = row
|
|
for i, line in enumerate(all_lines):
|
|
i += row
|
|
sheet.write(i, 0, line.get('code', ''))
|
|
sheet.write(i, 1, line.get('name', ''))
|
|
sheet.write(i, 2, line.get('debit', ''), currency_format)
|
|
sheet.write(i, 3, line.get('credit', ''), currency_format)
|
|
sheet.write(i, 4, line.get('balance', ''), currency_format)
|
|
row = i
|
|
|
|
for j, h in enumerate(head):
|
|
sheet.set_column(j, j, h['larg'])
|
|
|
|
table = []
|
|
for h in head:
|
|
col = {}
|
|
col['header'] = h['name']
|
|
col.update(h['col'])
|
|
table.append(col)
|
|
|
|
sheet.add_table(start_row - 1, 0, row + 1, len(head) - 1,
|
|
{'total_row': 1,
|
|
'columns': table,
|
|
'style': 'Table Style Light 9',
|
|
})
|
|
|
|
else: # not summary
|
|
|
|
head = [
|
|
{'name': _('Date'),
|
|
'larg': 10,
|
|
'col': {}},
|
|
{'name': _('JRNL'),
|
|
'larg': 10,
|
|
'col': {}},
|
|
{'name': _('Account'),
|
|
'larg': 10,
|
|
'col': {}},
|
|
{'name': _('Account Name'),
|
|
'larg': 15,
|
|
'col': {}},
|
|
{'name': _('Journal entries'),
|
|
'larg': 20,
|
|
'col': {}},
|
|
{'name': _('Ref'),
|
|
'larg': 40,
|
|
'col': {}},
|
|
{'name': _('Partner'),
|
|
'larg': 20,
|
|
'col': {}},
|
|
{'name': _('Due Date'),
|
|
'larg': 10,
|
|
'col': {}},
|
|
{'name': _('Debit'),
|
|
'larg': 15,
|
|
'col': {'total_function': 'sum', 'format': currency_format}},
|
|
{'name': _('Credit'),
|
|
'larg': 15,
|
|
'col': {'total_function': 'sum', 'format': currency_format}},
|
|
{'name': _('Balance'),
|
|
'larg': 15,
|
|
'col': {'format': currency_format}},
|
|
{'name': _('Match.'),
|
|
'larg': 10,
|
|
'col': {}},
|
|
]
|
|
table = []
|
|
for h in head:
|
|
col = {'header': h['name']}
|
|
col.update(h['col'])
|
|
table.append(col)
|
|
|
|
def _set_line(line):
|
|
sheet.write(i, 0, get_date_format(line.get('date', '')) if line.get('type_view') != 'init' else 'INIT')
|
|
sheet.write(i, 1, line.get('j_code', ''))
|
|
sheet.write(i, 2, line.get('a_code', ''))
|
|
sheet.write(i, 3, line.get('a_name', ''))
|
|
sheet.write(i, 4, line.get('move_name', ''))
|
|
sheet.write(i, 5, line.get('displayed_name', ''))
|
|
sheet.write(i, 6, line.get('partner_name', ''))
|
|
sheet.write(i, 7, get_date_format(line.get('date_maturity', '')))
|
|
sheet.write(i, 8, _get_data_float(line.get('debit', '')), currency_format)
|
|
sheet.write(i, 9, _get_data_float(line.get('credit', '')), currency_format)
|
|
sheet.write(i, 10, _get_data_float(line.get('cumul_balance', '')), currency_format)
|
|
sheet.write(i, 11, line.get('matching_number', ''))
|
|
|
|
def _set_table(start_row, row):
|
|
sheet.add_table(start_row - 1, 0, row + 1, len(head) - 1,
|
|
{'total_row': 1,
|
|
'columns': table,
|
|
'style': 'Table Style Light 9',
|
|
})
|
|
#sheet.write(row + 1, 10, "=I%s-J%s" % (row + 2, row + 2), currency_format)
|
|
|
|
# With total workbook
|
|
sheet = workbook.add_worksheet(report.name + _(' Totals'))
|
|
_header_sheet(sheet)
|
|
|
|
row = 6
|
|
|
|
all_lines = wizard._sql_get_line_for_report(type_l=('0_init', '1_init_line', '2_line'))
|
|
for obj in report.report_object_ids:
|
|
lines_obj = []
|
|
obj_id = obj.id
|
|
for line in all_lines:
|
|
if line.get('report_object_id') == obj_id:
|
|
lines_obj.append(line)
|
|
if lines_obj:
|
|
row += 1
|
|
name_view = ''
|
|
if wizard.type == 'account':
|
|
name_view = obj.account_id.display_name
|
|
if wizard.type == 'partner':
|
|
name_view = obj.partner_id.display_name
|
|
if wizard.type == 'journal':
|
|
name_view = obj.journal_id.display_name
|
|
|
|
sheet.write(row, 0, name_view, left)
|
|
sheet.write(row, 1, '', top)
|
|
sheet.write(row, 2, '', top)
|
|
sheet.write(row, 3, '', top)
|
|
sheet.write(row, 4, '', top)
|
|
sheet.write(row, 5, '', top)
|
|
sheet.write(row, 6, '', top)
|
|
sheet.write(row, 7, '', top)
|
|
sheet.write(row, 8, '', top)
|
|
sheet.write(row, 9, '', top)
|
|
sheet.write(row, 10, '', top)
|
|
sheet.write(row, 11, '', right)
|
|
|
|
row += 2
|
|
start_row = row
|
|
for i, line in enumerate(lines_obj):
|
|
i += row
|
|
_set_line(line)
|
|
|
|
row = i
|
|
|
|
for j, h in enumerate(head):
|
|
sheet.set_column(j, j, h['larg'])
|
|
|
|
_set_table(start_row, row)
|
|
row += 2
|
|
|
|
# Pivot workbook
|
|
sheet = workbook.add_worksheet(report.name)
|
|
_header_sheet(sheet)
|
|
|
|
# Head
|
|
if all_lines:
|
|
row = 6
|
|
row += 1
|
|
start_row = row
|
|
for i, line in enumerate(all_lines):
|
|
i += row
|
|
_set_line(line)
|
|
row = i
|
|
|
|
for j, h in enumerate(head):
|
|
sheet.set_column(j, j, h['larg'])
|
|
|
|
_set_table(start_row, row)
|
|
|
|
|
|
AccountStandardExcel('report.account_standard_report.report_account_standard_excel', 'account.report.standard.ledger')
|