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.
436 lines
15 KiB
436 lines
15 KiB
# Copyright 2009-2018 Noviat
|
|
# Copyright 2020 initOS GmbH <https://initos.com>
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
|
|
import logging
|
|
|
|
from odoo import models
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class MoveLineXlsx(models.AbstractModel):
|
|
_name = 'report.account_move_line_report_xls.account_move_line_xlsx'
|
|
_inherit = 'report.report_xlsx.abstract'
|
|
|
|
def _get_ws_params(self, workbook, data, amls):
|
|
|
|
# XLSX Template
|
|
col_specs = {
|
|
'move': {
|
|
'header': {
|
|
'value': self._('Entry'),
|
|
},
|
|
'lines': {
|
|
'value': self._render("line.move_id.name"),
|
|
},
|
|
'width': 20,
|
|
},
|
|
'name': {
|
|
'header': {
|
|
'value': self._('Name'),
|
|
},
|
|
'lines': {
|
|
'value': self._render("line.name"),
|
|
},
|
|
'width': 42,
|
|
},
|
|
'ref': {
|
|
'header': {
|
|
'value': self._('Reference'),
|
|
},
|
|
'lines': {
|
|
'value': self._render("line.ref"),
|
|
},
|
|
'width': 42,
|
|
},
|
|
'date': {
|
|
'header': {
|
|
'value': self._('Effective Date'),
|
|
},
|
|
'lines': {
|
|
'value': self._render(
|
|
"datetime.strptime(line.date, '%Y-%m-%d')"),
|
|
'format': self.format_tcell_date_left,
|
|
},
|
|
'width': 13,
|
|
},
|
|
'partner': {
|
|
'header': {
|
|
'value': self._('Partner'),
|
|
},
|
|
'lines': {
|
|
'value': self._render(
|
|
"line.partner_id and line.partner_id.name"),
|
|
},
|
|
'width': 36,
|
|
},
|
|
'partner_ref': {
|
|
'header': {
|
|
'value': self._('Partner Reference'),
|
|
},
|
|
'lines': {
|
|
'value': self._render(
|
|
"line.partner_id and line.partner_id.ref"),
|
|
},
|
|
'width': 36,
|
|
},
|
|
'account': {
|
|
'header': {
|
|
'value': self._('Account'),
|
|
},
|
|
'lines': {
|
|
'value': self._render(
|
|
"line.account_id.code"),
|
|
},
|
|
'width': 12,
|
|
},
|
|
'date_maturity': {
|
|
'header': {
|
|
'value': self._('Maturity Date'),
|
|
},
|
|
'lines': {
|
|
'value': self._render(
|
|
"datetime.strptime(line.date_maturity,'%Y-%m-%d')"),
|
|
'format': self.format_tcell_date_left,
|
|
},
|
|
'width': 13,
|
|
},
|
|
'debit': {
|
|
'header': {
|
|
'value': self._('Debit'),
|
|
'format': self.format_theader_yellow_right,
|
|
},
|
|
'lines': {
|
|
'value': self._render("line.debit"),
|
|
'format': self.format_tcell_amount_right,
|
|
},
|
|
'totals': {
|
|
'type': 'formula',
|
|
'value': self._render("debit_formula"),
|
|
'format': self.format_theader_yellow_amount_right,
|
|
},
|
|
'width': 18,
|
|
},
|
|
'credit': {
|
|
'header': {
|
|
'value': self._('Credit'),
|
|
'format': self.format_theader_yellow_right,
|
|
},
|
|
'lines': {
|
|
'value': self._render("line.credit"),
|
|
'format': self.format_tcell_amount_right,
|
|
},
|
|
'totals': {
|
|
'type': 'formula',
|
|
'value': self._render("credit_formula"),
|
|
'format': self.format_theader_yellow_amount_right,
|
|
},
|
|
'width': 18,
|
|
},
|
|
'balance': {
|
|
'header': {
|
|
'value': self._('Balance'),
|
|
'format': self.format_theader_yellow_right,
|
|
},
|
|
'lines': {
|
|
'value': self._render("line.balance"),
|
|
'format': self.format_tcell_amount_right,
|
|
},
|
|
'totals': {
|
|
'type': 'formula',
|
|
'value': self._render("bal_formula"),
|
|
'format': self.format_theader_yellow_amount_right,
|
|
},
|
|
'width': 18,
|
|
},
|
|
'full_reconcile': {
|
|
'header': {
|
|
'value': self._('Rec.'),
|
|
'format': self.format_theader_yellow_center,
|
|
},
|
|
'lines': {
|
|
'value': self._render(
|
|
"line.full_reconcile_id "
|
|
"and line.full_reconcile_id.name"),
|
|
'format': self.format_tcell_center,
|
|
},
|
|
'width': 12,
|
|
},
|
|
'reconcile_amount': {
|
|
'header': {
|
|
'value': self._('Reconcile Amount'),
|
|
},
|
|
'lines': {
|
|
'value': self._render(
|
|
"line.full_reconcile_id and line.balance or "
|
|
"(sum(line.matched_credit_ids.mapped('amount')) - "
|
|
"sum(line.matched_debit_ids.mapped('amount')))"),
|
|
'format': self.format_tcell_amount_right,
|
|
},
|
|
'width': 12,
|
|
},
|
|
'matched_debit_ids': {
|
|
'header': {
|
|
'value': self._('Matched Debits'),
|
|
},
|
|
'lines': {
|
|
'value': self._render(
|
|
"line.matched_debit_ids "
|
|
"and str([x.debit_move_id.id "
|
|
"for x in line.matched_debit_ids])"),
|
|
},
|
|
'width': 20,
|
|
},
|
|
'matched_credit_ids': {
|
|
'header': {
|
|
'value': self._('Matched Credits'),
|
|
},
|
|
'lines': {
|
|
'value': self._render(
|
|
"line.matched_credit_ids "
|
|
"and str([x.credit_move_id.id "
|
|
"for x in line.matched_credit_ids])"),
|
|
},
|
|
'width': 20,
|
|
},
|
|
'amount_currency': {
|
|
'header': {
|
|
'value': self._('Am. Currency'),
|
|
'format': self.format_theader_yellow_right,
|
|
},
|
|
'lines': {
|
|
'value': self._render("line.amount_currency"),
|
|
'format': self.format_tcell_amount_right,
|
|
},
|
|
'width': 18,
|
|
},
|
|
'currency_name': {
|
|
'header': {
|
|
'value': self._('Curr.'),
|
|
'format': self.format_theader_yellow_center,
|
|
},
|
|
'lines': {
|
|
'value': self._render(
|
|
"line.currency_id and line.currency_id.name"),
|
|
'format': self.format_tcell_center,
|
|
},
|
|
'width': 6,
|
|
},
|
|
'journal': {
|
|
'header': {
|
|
'value': self._('Journal'),
|
|
},
|
|
'lines': {
|
|
'value': self._render("line.journal_id.code"),
|
|
},
|
|
'width': 12,
|
|
},
|
|
'company_currency': {
|
|
'header': {
|
|
'value': self._('Comp. Curr.'),
|
|
'format': self.format_theader_yellow_center,
|
|
},
|
|
'lines': {
|
|
'value': self._render(
|
|
"line.company_id.currency_id.name"),
|
|
'format': self.format_tcell_center,
|
|
},
|
|
'width': 10,
|
|
},
|
|
'analytic_account': {
|
|
'header': {
|
|
'value': self._('Analytic Account Reference'),
|
|
},
|
|
'lines': {
|
|
'value': self._render(
|
|
"line.analytic_account_id "
|
|
"and line.analytic_account_id.code"),
|
|
},
|
|
'width': 36,
|
|
},
|
|
'analytic_account_name': {
|
|
'header': {
|
|
'value': self._('Analytic Account'),
|
|
},
|
|
'lines': {
|
|
'value': self._render(
|
|
"line.analytic_account_id "
|
|
"and line.analytic_account_id.name"),
|
|
},
|
|
'width': 36,
|
|
},
|
|
'product': {
|
|
'header': {
|
|
'value': self._('Product'),
|
|
},
|
|
'lines': {
|
|
'value': self._render(
|
|
"line.product_id and line.product_id.name"),
|
|
},
|
|
'width': 36,
|
|
},
|
|
'product_ref': {
|
|
'header': {
|
|
'value': self._('Product Reference'),
|
|
},
|
|
'lines': {
|
|
'value': self._render(
|
|
"line.product_id and line.product_id.default_code "
|
|
"or ''"),
|
|
},
|
|
'width': 36,
|
|
},
|
|
'product_uom': {
|
|
'header': {
|
|
'value': self._('Unit of Measure'),
|
|
},
|
|
'lines': {
|
|
'value': self._render(
|
|
"line.product_uom_id and line.product_uom_id.name"),
|
|
},
|
|
'width': 20,
|
|
},
|
|
'quantity': {
|
|
'header': {
|
|
'value': self._('Qty'),
|
|
'format': self.format_theader_yellow_right,
|
|
},
|
|
'lines': {
|
|
'value': self._render("line.quantity"),
|
|
'format': self.format_tcell_amount_right,
|
|
},
|
|
'width': 8,
|
|
},
|
|
'statement': {
|
|
'header': {
|
|
'value': self._('Statement'),
|
|
},
|
|
'lines': {
|
|
'value': self._render(
|
|
"line.statement_id and line.statement_id.name"),
|
|
},
|
|
'width': 20,
|
|
},
|
|
'invoice': {
|
|
'header': {
|
|
'value': self._('Invoice'),
|
|
},
|
|
'lines': {
|
|
'value': self._render(
|
|
"line.invoice_id and line.invoice_id.number"),
|
|
},
|
|
'width': 20,
|
|
},
|
|
'amount_residual': {
|
|
'header': {
|
|
'value': self._('Residual Amount'),
|
|
'format': self.format_theader_yellow_right,
|
|
},
|
|
'lines': {
|
|
'value': self._render("line.amount_residual"),
|
|
'format': self.format_tcell_amount_right,
|
|
},
|
|
'width': 18,
|
|
},
|
|
'amount_residual_currency': {
|
|
'header': {
|
|
'value': self._('Res. Am. in Curr.'),
|
|
'format': self.format_theader_yellow_right,
|
|
},
|
|
'lines': {
|
|
'value': self._render("line.amount_residual_currency"),
|
|
'format': self.format_tcell_amount_right,
|
|
},
|
|
'width': 18,
|
|
},
|
|
'narration': {
|
|
'header': {
|
|
'value': self._('Notes'),
|
|
},
|
|
'lines': {
|
|
'value': self._render("line.move_id.narration or ''"),
|
|
},
|
|
'width': 42,
|
|
},
|
|
'blocked': {
|
|
'header': {
|
|
'value': self._('Lit.'),
|
|
'format': self.format_theader_yellow_center,
|
|
},
|
|
'lines': {
|
|
'value': self._render("line.blocked and 'x' or ''"),
|
|
'format': self.format_tcell_center,
|
|
},
|
|
'width': 4,
|
|
},
|
|
'id': {
|
|
'header': {
|
|
'value': self._('Id'),
|
|
'format': self.format_theader_yellow_right,
|
|
},
|
|
'lines': {
|
|
'value': self._render("line.id"),
|
|
'format': self.format_tcell_integer_right,
|
|
},
|
|
'width': 12,
|
|
},
|
|
}
|
|
col_specs.update(self.env['account.move.line']._report_xlsx_template())
|
|
wanted_list = self.env['account.move.line']._report_xlsx_fields()
|
|
title = self._("Journal Items")
|
|
|
|
return [{
|
|
'ws_name': title,
|
|
'generate_ws_method': '_amls_export',
|
|
'title': title,
|
|
'wanted_list': wanted_list,
|
|
'col_specs': col_specs,
|
|
}]
|
|
|
|
def _amls_export(self, workbook, ws, ws_params, data, amls):
|
|
|
|
ws.set_landscape()
|
|
ws.fit_to_pages(1, 0)
|
|
ws.set_header(self.xls_headers['standard'])
|
|
ws.set_footer(self.xls_footers['standard'])
|
|
|
|
self._set_column_width(ws, ws_params)
|
|
|
|
row_pos = 0
|
|
row_pos = self._write_ws_title(ws, row_pos, ws_params)
|
|
|
|
row_pos = self._write_line(
|
|
ws, row_pos, ws_params, col_specs_section='header',
|
|
default_format=self.format_theader_yellow_left)
|
|
|
|
ws.freeze_panes(row_pos, 0)
|
|
|
|
wanted_list = ws_params['wanted_list']
|
|
debit_pos = 'debit' in wanted_list and wanted_list.index('debit')
|
|
credit_pos = 'credit' in wanted_list and wanted_list.index('credit')
|
|
|
|
for line in amls:
|
|
row_pos = self._write_line(
|
|
ws, row_pos, ws_params, col_specs_section='lines',
|
|
render_space={'line': line},
|
|
default_format=self.format_tcell_left)
|
|
|
|
aml_cnt = len(amls)
|
|
debit_start = self._rowcol_to_cell(row_pos - aml_cnt, debit_pos)
|
|
debit_stop = self._rowcol_to_cell(row_pos - 1, debit_pos)
|
|
debit_formula = 'SUM(%s:%s)' % (debit_start, debit_stop)
|
|
credit_start = self._rowcol_to_cell(row_pos - aml_cnt, credit_pos)
|
|
credit_stop = self._rowcol_to_cell(row_pos - 1, credit_pos)
|
|
credit_formula = 'SUM(%s:%s)' % (credit_start, credit_stop)
|
|
debit_cell = self._rowcol_to_cell(row_pos, debit_pos)
|
|
credit_cell = self._rowcol_to_cell(row_pos, credit_pos)
|
|
bal_formula = debit_cell + '-' + credit_cell
|
|
row_pos = self._write_line(
|
|
ws, row_pos, ws_params, col_specs_section='totals',
|
|
render_space={
|
|
'debit_formula': debit_formula,
|
|
'credit_formula': credit_formula,
|
|
'bal_formula': bal_formula,
|
|
},
|
|
default_format=self.format_theader_yellow_left)
|