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.
 
 
 
 

450 lines
16 KiB

# -*- coding: utf-8 -*-
# Copyright 2009-2018 Noviat
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import logging
from odoo.addons.report_xlsx_helper.report.abstract_report_xlsx \
import AbstractReportXlsx
from odoo.report import report_sxw
from odoo.tools.translate import translate
_logger = logging.getLogger(__name__)
IR_TRANSLATION_NAME = 'move.line.list.xls'
class MoveLineXlsx(AbstractReportXlsx):
def _(self, src):
lang = self.env.context.get('lang', 'en_US')
val = translate(
self.env.cr, IR_TRANSLATION_NAME, 'report', lang, src) or src
return val
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)
MoveLineXlsx('report.move.line.list.xls',
'account.move.line',
parser=report_sxw.rml_parse)