Browse Source

coding guidelines improvement

pull/7/merge
Luc De Meyer 11 years ago
parent
commit
0064b81dce
  1. 14
      account_journal_report_xls/__openerp__.py
  2. 29
      account_journal_report_xls/account_journal.py
  3. 1
      account_journal_report_xls/report/__init__.py
  4. 161
      account_journal_report_xls/report/nov_account_journal.py
  5. 138
      account_journal_report_xls/report/nov_account_journal_xls.py
  6. 39
      account_journal_report_xls/wizard/print_journal_wizard.py

14
account_journal_report_xls/__openerp__.py

@ -25,9 +25,9 @@
'version': '0.1', 'version': '0.1',
'license': 'AGPL-3', 'license': 'AGPL-3',
'author': 'Noviat', 'author': 'Noviat',
'category' : 'Accounting & Finance',
'category': 'Accounting & Finance',
'description': """ 'description': """
Journal Reports Journal Reports
=============== ===============
@ -36,20 +36,20 @@ This module adds journal reports by period and by fiscal year with
- option to group entries with same general account & VAT case - option to group entries with same general account & VAT case
- vat info per entry - vat info per entry
- vat summary - vat summary
These reports are available in PDF and XLS format. These reports are available in PDF and XLS format.
If you are installing this module manually, you need also the module 'report_xls', that is located in:
https://launchpad.net/openerp-reporting-engines"
This module depends upon the 'report_xls' module,
cf. https://launchpad.net/openerp-reporting-engines
""", """,
'depends': [ 'depends': [
'account_voucher', 'account_voucher',
'report_xls'
'report_xls',
], ],
'demo_xml': [], 'demo_xml': [],
'init_xml': [], 'init_xml': [],
'update_xml' : [
'update_xml': [
'wizard/print_journal_wizard.xml', 'wizard/print_journal_wizard.xml',
], ],
} }

29
account_journal_report_xls/account_journal.py

@ -24,20 +24,21 @@ from openerp.osv import orm
from openerp.addons.report_xls.utils import rowcol_to_cell, _render from openerp.addons.report_xls.utils import rowcol_to_cell, _render
from openerp.tools.translate import _ from openerp.tools.translate import _
class account_journal(orm.Model): class account_journal(orm.Model):
_inherit = 'account.journal' _inherit = 'account.journal'
# allow inherited modules to extend the query # allow inherited modules to extend the query
def _report_xls_query_extra(self, cr, uid, context=None): def _report_xls_query_extra(self, cr, uid, context=None):
select_extra = "" select_extra = ""
join_extra = "" join_extra = ""
where_extra = "" where_extra = ""
return [select_extra, join_extra, where_extra]
return (select_extra, join_extra, where_extra)
# allow inherited modules to add document references # allow inherited modules to add document references
def _report_xls_document_extra(self, cr, uid, context): def _report_xls_document_extra(self, cr, uid, context):
return "''" return "''"
# override list in inherited module to add/drop columns or change order # override list in inherited module to add/drop columns or change order
def _report_xls_fields(self, cr, uid, context=None): def _report_xls_fields(self, cr, uid, context=None):
res = [ res = [
@ -47,37 +48,37 @@ class account_journal(orm.Model):
] ]
if context.get('print_by') == 'fiscalyear': if context.get('print_by') == 'fiscalyear':
res += [ res += [
'period', # account.period,code or name
'period', # account.period,code or name
] ]
res += [ res += [
'partner_name', # res.partner,name 'partner_name', # res.partner,name
'aml_name', # account.move.line,name
'tax_code', # account.tax.code,code
'aml_name', # account.move.line,name
'tax_code', # account.tax.code,code
'tax_amount', # account.move.line,tax_amount 'tax_amount', # account.move.line,tax_amount
'debit', # account.move.line,debit 'debit', # account.move.line,debit
'credit', # account.move.line,credit 'credit', # account.move.line,credit
'balance', # debit-credit 'balance', # debit-credit
'docname', # origin document if any
#'date_maturity', # account.move.line,date_maturity
'docname', # origin document if any
#'date_maturity', # account.move.line,date_maturity
#'reconcile', # account.move.line,reconcile_id.name #'reconcile', # account.move.line,reconcile_id.name
#'reconcile_partial', # account.move.line,reconcile_partial_id.name #'reconcile_partial', # account.move.line,reconcile_partial_id.name
#'partner_ref', # res.partner,ref #'partner_ref', # res.partner,ref
#'move_ref', # account.move,ref
#'move_ref', # account.move,ref
#'move_id', # account.move,id #'move_id', # account.move,id
] ]
return res return res
# Change/Add Template entries # Change/Add Template entries
def _report_xls_template(self, cr, uid, context=None):
"""
Template updates, e.g.
def _report_xls_template(self, cr, uid, context=None):
"""
Template updates, e.g.
my_change = { my_change = {
'move_name':{ 'move_name':{
'header': [1, 20, 'text', _('My Move Title')],
'header': [1, 20, 'text', _render("_('My Move Title')")],
'lines': [1, 0, 'text', _render("l['move_name'] != '/' and l['move_name'] or ('*'+str(l['move_id']))")], 'lines': [1, 0, 'text', _render("l['move_name'] != '/' and l['move_name'] or ('*'+str(l['move_id']))")],
'totals': [1, 0, 'text', None]}, 'totals': [1, 0, 'text', None]},
} }
return my_change return my_change
"""
"""
return {} return {}

1
account_journal_report_xls/report/__init__.py

@ -24,4 +24,3 @@ import nov_account_journal
import nov_account_journal_xls import nov_account_journal_xls
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

161
account_journal_report_xls/report/nov_account_journal.py

@ -28,10 +28,11 @@ _logger = logging.getLogger(__name__)
_ir_translation_name = 'nov.account.journal.print' _ir_translation_name = 'nov.account.journal.print'
class nov_journal_print(report_sxw.rml_parse): class nov_journal_print(report_sxw.rml_parse):
def set_context(self, objects, data, ids, report_type=None): def set_context(self, objects, data, ids, report_type=None):
#_logger.warn('set_context, objects = %s, data = %s, ids = %s', objects, data, ids)
#_logger.warn('set_context, objects = %s, data = %s, ids = %s', objects, data, ids)
super(nov_journal_print, self).set_context(objects, data, ids) super(nov_journal_print, self).set_context(objects, data, ids)
j_obj = self.pool.get('account.journal') j_obj = self.pool.get('account.journal')
p_obj = self.pool.get('account.period') p_obj = self.pool.get('account.period')
@ -40,7 +41,7 @@ class nov_journal_print(report_sxw.rml_parse):
if data['target_move'] == 'posted': if data['target_move'] == 'posted':
self.move_states = ['posted'] self.move_states = ['posted']
else: else:
self.move_states = ['draft','posted']
self.move_states = ['draft', 'posted']
self.display_currency = self.localcontext['display_currency'] = data['display_currency'] self.display_currency = self.localcontext['display_currency'] = data['display_currency']
self.group_entries = data['group_entries'] self.group_entries = data['group_entries']
self.print_by = data['print_by'] self.print_by = data['print_by']
@ -51,7 +52,7 @@ class nov_journal_print(report_sxw.rml_parse):
for jp in journal_period_ids: for jp in journal_period_ids:
journal = j_obj.browse(self.cr, self.uid, jp[0], self.context) journal = j_obj.browse(self.cr, self.uid, jp[0], self.context)
periods = p_obj.browse(self.cr, self.uid, jp[1], self.context) periods = p_obj.browse(self.cr, self.uid, jp[1], self.context)
objects.extend([(journal, period) for period in periods])
objects.extend([(journal, period) for period in periods])
self.localcontext['objects'] = self.objects = objects self.localcontext['objects'] = self.objects = objects
else: else:
journal_fy_ids = data['journal_fy_ids'] journal_fy_ids = data['journal_fy_ids']
@ -59,9 +60,9 @@ class nov_journal_print(report_sxw.rml_parse):
for jf in journal_fy_ids: for jf in journal_fy_ids:
journal = j_obj.browse(self.cr, self.uid, jf[0], self.context) journal = j_obj.browse(self.cr, self.uid, jf[0], self.context)
fiscalyear = fy_obj.browse(self.cr, self.uid, jf[1], self.context) fiscalyear = fy_obj.browse(self.cr, self.uid, jf[1], self.context)
objects.append((journal, fiscalyear))
objects.append((journal, fiscalyear))
self.localcontext['objects'] = self.objects = objects self.localcontext['objects'] = self.objects = objects
def __init__(self, cr, uid, name, context): def __init__(self, cr, uid, name, context):
if context is None: if context is None:
context = {} context = {}
@ -74,7 +75,7 @@ class nov_journal_print(report_sxw.rml_parse):
'sum1': self._sum1, 'sum1': self._sum1,
'sum2': self._sum2, 'sum2': self._sum2,
'tax_codes': self._tax_codes, 'tax_codes': self._tax_codes,
'sum_vat': self._sum_vat,
'sum_vat': self._sum_vat,
'_': self._, '_': self._,
}) })
self.context = context self.context = context
@ -82,13 +83,13 @@ class nov_journal_print(report_sxw.rml_parse):
def _(self, src): def _(self, src):
lang = self.context.get('lang', 'en_US') lang = self.context.get('lang', 'en_US')
return translate(self.cr, _ir_translation_name, 'report', lang, src) or src return translate(self.cr, _ir_translation_name, 'report', lang, src) or src
def _title(self, object): def _title(self, object):
return ((self.print_by == 'period' and self._('Period') or self._('Fiscal Year')) + ' ' + object[1].name, object[0].name) return ((self.print_by == 'period' and self._('Period') or self._('Fiscal Year')) + ' ' + object[1].name, object[0].name)
def _amount_title(self): def _amount_title(self):
return self.display_currency and (self._('Amount'), self._('Currency')) or (self._('Debit'), self._('Credit')) return self.display_currency and (self._('Amount'), self._('Currency')) or (self._('Debit'), self._('Credit'))
def _lines(self, object): def _lines(self, object):
j_obj = self.pool.get('account.journal') j_obj = self.pool.get('account.journal')
_ = self._ _ = self._
@ -99,91 +100,89 @@ class nov_journal_print(report_sxw.rml_parse):
period_id = period.id period_id = period.id
period_ids = [period_id] period_ids = [period_id]
# update status period # update status period
ids_journal_period = self.pool.get('account.journal.period').search(self.cr, self.uid,
[('journal_id', '=', journal_id), ('period_id', '=', period_id)])
ids_journal_period = self.pool.get('account.journal.period').search(self.cr, self.uid,
[('journal_id', '=', journal_id), ('period_id', '=', period_id)])
if ids_journal_period: if ids_journal_period:
self.cr.execute( self.cr.execute(
'update account_journal_period set state=%s where journal_id=%s and period_id=%s and state=%s',
('printed', journal_id, period_id, 'draft')
)
'update account_journal_period set state=%s where journal_id=%s and period_id=%s and state=%s',
('printed', journal_id, period_id, 'draft'))
else: else:
self.pool.get('account.journal.period').create(self.cr, self.uid, { self.pool.get('account.journal.period').create(self.cr, self.uid, {
'name': (journal.code or journal.name)+':'+(period.name or ''),
'name': (journal.code or journal.name) + ':' + (period.name or ''),
'journal_id': journal.id, 'journal_id': journal.id,
'period_id': period.id, 'period_id': period.id,
'state': 'printed', 'state': 'printed',
}) })
_logger.error("The Entry for Period '%s', Journal '%s' was missing in 'account.journal.period' and has been fixed now !", _logger.error("The Entry for Period '%s', Journal '%s' was missing in 'account.journal.period' and has been fixed now !",
period.name, journal.name) period.name, journal.name)
else:
else:
fiscalyear = object[1] fiscalyear = object[1]
period_ids = [x.id for x in fiscalyear.period_ids] period_ids = [x.id for x in fiscalyear.period_ids]
select_extra, join_extra, where_extra = j_obj._report_xls_query_extra(self.cr, self.uid, self.context) select_extra, join_extra, where_extra = j_obj._report_xls_query_extra(self.cr, self.uid, self.context)
self.cr.execute("SELECT l.move_id AS move_id, l.id AS aml_id, " \
"am.name AS move_name, coalesce(am.ref,'') AS move_ref, am.date AS move_date, " \
"aa.id AS account_id, aa.code AS acc_code, " \
"coalesce(rp.name,'') AS partner_name, coalesce(rp.ref,'') AS partner_ref, rp.id AS partner_id, " \
"coalesce(l.name,'') AS aml_name, " \
"l.date_maturity AS date_maturity, " \
"coalesce(ap.code, ap.name) AS period, " \
"coalesce(atc.code,'') AS tax_code, atc.id AS tax_code_id, coalesce(l.tax_amount,0.0) AS tax_amount, " \
"coalesce(l.debit,0.0) AS debit, coalesce(l.credit,0.0) AS credit, " \
"coalesce(amr.name,'') AS reconcile, coalesce(amrp.name,'') AS reconcile_partial, " \
"coalesce(l.amount_currency,0.0) AS amount_currency, " \
"rc.id AS currency_id, rc.name AS currency_name, rc.symbol AS currency_symbol, " \
"coalesce(ai.internal_number,'-') AS inv_number, coalesce(abs.name,'-') AS st_number, coalesce(av.number,'-') AS voucher_number " \
+ select_extra + \
"FROM account_move_line l " \
"INNER JOIN account_move am ON l.move_id = am.id " \
"INNER JOIN account_account aa ON l.account_id = aa.id " \
"INNER JOIN account_period ap ON l.period_id = ap.id " \
"LEFT OUTER JOIN account_invoice ai ON ai.move_id = am.id " \
"LEFT OUTER JOIN account_voucher av ON av.move_id = am.id " \
"LEFT OUTER JOIN account_bank_statement abs ON l.statement_id = abs.id " \
"LEFT OUTER JOIN res_partner rp ON l.partner_id = rp.id " \
"LEFT OUTER JOIN account_tax_code atc ON l.tax_code_id = atc.id " \
"LEFT OUTER JOIN account_move_reconcile amr ON l.reconcile_id = amr.id " \
"LEFT OUTER JOIN account_move_reconcile amrp ON l.reconcile_partial_id = amrp.id " \
"LEFT OUTER JOIN res_currency rc ON l.currency_id = rc.id " \
+ join_extra + \
"WHERE l.period_id IN %s AND l.journal_id = %s " \
"AND am.state IN %s " \
+ where_extra + \
self.cr.execute("SELECT l.move_id AS move_id, l.id AS aml_id, "
"am.name AS move_name, coalesce(am.ref,'') AS move_ref, am.date AS move_date, "
"aa.id AS account_id, aa.code AS acc_code, "
"coalesce(rp.name,'') AS partner_name, coalesce(rp.ref,'') AS partner_ref, rp.id AS partner_id, "
"coalesce(l.name,'') AS aml_name, "
"l.date_maturity AS date_maturity, "
"coalesce(ap.code, ap.name) AS period, "
"coalesce(atc.code,'') AS tax_code, atc.id AS tax_code_id, coalesce(l.tax_amount,0.0) AS tax_amount, "
"coalesce(l.debit,0.0) AS debit, coalesce(l.credit,0.0) AS credit, "
"coalesce(amr.name,'') AS reconcile, coalesce(amrp.name,'') AS reconcile_partial, "
"coalesce(l.amount_currency,0.0) AS amount_currency, "
"rc.id AS currency_id, rc.name AS currency_name, rc.symbol AS currency_symbol, "
"coalesce(ai.internal_number,'-') AS inv_number, coalesce(abs.name,'-') AS st_number, coalesce(av.number,'-') AS voucher_number "
+ select_extra +
"FROM account_move_line l "
"INNER JOIN account_move am ON l.move_id = am.id "
"INNER JOIN account_account aa ON l.account_id = aa.id "
"INNER JOIN account_period ap ON l.period_id = ap.id "
"LEFT OUTER JOIN account_invoice ai ON ai.move_id = am.id "
"LEFT OUTER JOIN account_voucher av ON av.move_id = am.id "
"LEFT OUTER JOIN account_bank_statement abs ON l.statement_id = abs.id "
"LEFT OUTER JOIN res_partner rp ON l.partner_id = rp.id "
"LEFT OUTER JOIN account_tax_code atc ON l.tax_code_id = atc.id "
"LEFT OUTER JOIN account_move_reconcile amr ON l.reconcile_id = amr.id "
"LEFT OUTER JOIN account_move_reconcile amrp ON l.reconcile_partial_id = amrp.id "
"LEFT OUTER JOIN res_currency rc ON l.currency_id = rc.id "
+ join_extra +
"WHERE l.period_id IN %s AND l.journal_id = %s "
"AND am.state IN %s "
+ where_extra +
"ORDER BY " + self.sort_selection + ", move_date, move_id, acc_code", "ORDER BY " + self.sort_selection + ", move_date, move_id, acc_code",
(tuple(period_ids), journal_id, tuple(self.move_states))
)
(tuple(period_ids), journal_id, tuple(self.move_states)))
lines = self.cr.dictfetchall() lines = self.cr.dictfetchall()
# add reference of corresponding origin document # add reference of corresponding origin document
if journal.type in ['sale', 'sale_refund', 'purchase', 'purchase_refund']:
map(lambda x: x.update({'docname' : (_('Invoice') + ': ' + x['inv_number']) or (_('Voucher') + ': ' + x['voucher_number']) or '-'}), lines)
elif journal.type in ['bank', 'cash']:
map(lambda x: x.update({'docname' : (_('Statement') + ': ' + x['st_number']) or (_('Voucher') + ': ' + x['voucher_number']) or '-'}), lines)
else:
if journal.type in ('sale', 'sale_refund', 'purchase', 'purchase_refund'):
[x.update({'docname': (_('Invoice') + ': ' + x['inv_number']) or (_('Voucher') + ': ' + x['voucher_number']) or '-'}) for x in lines]
elif journal.type in ('bank', 'cash'):
[x.update({'docname': (_('Statement') + ': ' + x['st_number']) or (_('Voucher') + ': ' + x['voucher_number']) or '-'}) for x in lines]
else:
code_string = j_obj._report_xls_document_extra(self.cr, self.uid, self.context) code_string = j_obj._report_xls_document_extra(self.cr, self.uid, self.context)
#_logger.warn('code_string= %s', code_string) #_logger.warn('code_string= %s', code_string)
map(lambda x: x.update({'docname' : eval(code_string) or '-'}), lines)
[x.update({'docname': eval(code_string) or '-'}) for x in lines]
# format debit, credit, amount_currency for pdf report # format debit, credit, amount_currency for pdf report
if self.display_currency and self.report_type == 'pdf': if self.display_currency and self.report_type == 'pdf':
curr_obj = self.pool.get('res.currency') curr_obj = self.pool.get('res.currency')
map(lambda x: x.update({
'amount1': self.formatLang(x['debit']-x['credit']),
'amount2': self.formatLang(x['amount_currency'], monetary=True, currency_obj=curr_obj.browse(self.cr, self.uid, x['currency_id']))
}), lines)
[x.update({
'amount1': self.formatLang(x['debit'] - x['credit']),
'amount2': self.formatLang(x['amount_currency'], monetary=True, currency_obj=curr_obj.browse(self.cr, self.uid, x['currency_id'])),
}) for x in lines]
else: else:
map(lambda x: x.update({'amount1': self.formatLang(x['debit']), 'amount2': self.formatLang(x['credit'])}), lines)
[x.update({'amount1': self.formatLang(x['debit']), 'amount2': self.formatLang(x['credit'])}) for x in lines]
# group lines # group lines
if self.group_entries: if self.group_entries:
lines = self._group_lines(lines) lines = self._group_lines(lines)
# insert a flag in every move_line to indicate the end of a move # insert a flag in every move_line to indicate the end of a move
# this flag will be used to draw a full line between moves
for cnt in range(len(lines)-1):
if lines[cnt]['move_id'] <> lines[cnt+1]['move_id']:
# this flag will be used to draw a full line between moves
for cnt in range(len(lines) - 1):
if lines[cnt]['move_id'] != lines[cnt + 1]['move_id']:
lines[cnt]['draw_line'] = 1 lines[cnt]['draw_line'] = 1
else: else:
lines[cnt]['draw_line'] = 0 lines[cnt]['draw_line'] = 0
@ -192,7 +191,7 @@ class nov_journal_print(report_sxw.rml_parse):
return lines return lines
def _group_lines(self, lines_in): def _group_lines(self, lines_in):
_ = self._ _ = self._
def group_move(lines_in): def group_move(lines_in):
@ -209,24 +208,24 @@ class nov_journal_print(report_sxw.rml_parse):
lines_grouped[key]['tax_amount'] += line['tax_amount'] lines_grouped[key]['tax_amount'] += line['tax_amount']
lines_grouped[key]['aml_name'] = _('Grouped Entries') lines_grouped[key]['aml_name'] = _('Grouped Entries')
lines_out = lines_grouped.values() lines_out = lines_grouped.values()
lines_out.sort(key=lambda x:x['acc_code'])
lines_out.sort(key=lambda x: x['acc_code'])
return lines_out return lines_out
lines_out = [] lines_out = []
grouped_lines = [lines_in[0]] grouped_lines = [lines_in[0]]
move_id = lines_in[0]['move_id'] move_id = lines_in[0]['move_id']
line_cnt = len(lines_in) line_cnt = len(lines_in)
for i in range(1,line_cnt):
for i, line in enumerate(lines_in):
line = lines_in[i] line = lines_in[i]
if line['move_id'] == move_id:
if line['move_id'] == move_id:
grouped_lines.append(line) grouped_lines.append(line)
if i == line_cnt-1:
if i == line_cnt - 1:
lines_out += group_move(grouped_lines) lines_out += group_move(grouped_lines)
else: else:
lines_out += group_move(grouped_lines) lines_out += group_move(grouped_lines)
grouped_lines = [line] grouped_lines = [line]
move_id = line['move_id'] move_id = line['move_id']
return lines_out return lines_out
def _tax_codes(self, object): def _tax_codes(self, object):
@ -234,17 +233,17 @@ class nov_journal_print(report_sxw.rml_parse):
if self.print_by == 'period': if self.print_by == 'period':
period_id = object[1].id period_id = object[1].id
period_ids = [period_id] period_ids = [period_id]
else:
else:
fiscalyear = object[1] fiscalyear = object[1]
period_ids = [x.id for x in fiscalyear.period_ids] period_ids = [x.id for x in fiscalyear.period_ids]
self.cr.execute( self.cr.execute(
"SELECT distinct tax_code_id FROM account_move_line l " \
"INNER JOIN account_move am ON l.move_id = am.id " \
"SELECT distinct tax_code_id FROM account_move_line l "
"INNER JOIN account_move am ON l.move_id = am.id "
"WHERE l.period_id in %s AND l.journal_id=%s AND l.tax_code_id IS NOT NULL AND am.state IN %s", "WHERE l.period_id in %s AND l.journal_id=%s AND l.tax_code_id IS NOT NULL AND am.state IN %s",
(tuple(period_ids), journal_id, tuple(self.move_states))) (tuple(period_ids), journal_id, tuple(self.move_states)))
ids = map(lambda x: x[0], self.cr.fetchall()) ids = map(lambda x: x[0], self.cr.fetchall())
if ids: if ids:
self.cr.execute('SELECT id FROM account_tax_code WHERE id IN %s ORDER BY code', (tuple(ids),))
self.cr.execute('SELECT id FROM account_tax_code WHERE id IN %s ORDER BY code', (tuple(ids),))
tax_code_ids = map(lambda x: x[0], self.cr.fetchall()) tax_code_ids = map(lambda x: x[0], self.cr.fetchall())
else: else:
tax_code_ids = [] tax_code_ids = []
@ -263,7 +262,7 @@ class nov_journal_print(report_sxw.rml_parse):
"INNER JOIN account_move am ON l.move_id = am.id " \ "INNER JOIN account_move am ON l.move_id = am.id " \
"WHERE l.period_id IN %s AND l.journal_id=%s AND am.state IN %s" "WHERE l.period_id IN %s AND l.journal_id=%s AND am.state IN %s"
if field == 'tax_amount': if field == 'tax_amount':
select += " AND tax_code_id=%s" %tax_code_id
select += " AND tax_code_id=%s" % tax_code_id
self.cr.execute(select, (tuple(period_ids), journal_id, tuple(self.move_states))) self.cr.execute(select, (tuple(period_ids), journal_id, tuple(self.move_states)))
return self.cr.fetchone()[0] or 0.0 return self.cr.fetchone()[0] or 0.0
@ -272,21 +271,21 @@ class nov_journal_print(report_sxw.rml_parse):
def _sum2(self, object): def _sum2(self, object):
if self.display_currency: if self.display_currency:
return ''
return ''
else: else:
return self._totals('credit', object) return self._totals('credit', object)
def _sum_vat(self, object, tax_code): def _sum_vat(self, object, tax_code):
return self._totals('tax_amount', object, tax_code.id) return self._totals('tax_amount', object, tax_code.id)
def formatLang(self, value, digits=None, date=False, date_time=False, grouping=True, monetary=False, dp=False, currency_obj=False): def formatLang(self, value, digits=None, date=False, date_time=False, grouping=True, monetary=False, dp=False, currency_obj=False):
if isinstance(value, (float, int)) and not value: if isinstance(value, (float, int)) and not value:
return '' return ''
else: else:
return super(nov_journal_print, self).formatLang(value, digits, date, date_time, grouping, monetary, dp, currency_obj) return super(nov_journal_print, self).formatLang(value, digits, date, date_time, grouping, monetary, dp, currency_obj)
report_sxw.report_sxw('report.nov.account.journal.print', 'account.journal',
'addons/account_journal_report_xls/report/nov_account_journal.rml',
report_sxw.report_sxw('report.nov.account.journal.print', 'account.journal',
'addons/account_journal_report_xls/report/nov_account_journal.rml',
parser=nov_journal_print, header=False) parser=nov_journal_print, header=False)
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

138
account_journal_report_xls/report/nov_account_journal_xls.py

@ -32,8 +32,9 @@ from openerp.tools.translate import _
import logging import logging
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
class account_journal_xls_parser(nov_journal_print): class account_journal_xls_parser(nov_journal_print):
def __init__(self, cr, uid, name, context): def __init__(self, cr, uid, name, context):
super(account_journal_xls_parser, self).__init__(cr, uid, name, context=context) super(account_journal_xls_parser, self).__init__(cr, uid, name, context=context)
journal_obj = self.pool.get('account.journal') journal_obj = self.pool.get('account.journal')
@ -46,113 +47,114 @@ class account_journal_xls_parser(nov_journal_print):
'template_changes': template_changes, 'template_changes': template_changes,
}) })
class account_journal_xls(report_xls): class account_journal_xls(report_xls):
def __init__(self, name, table, rml=False, parser=False, header=True, store=False): def __init__(self, name, table, rml=False, parser=False, header=True, store=False):
super(account_journal_xls, self).__init__(name, table, rml, parser, header, store) super(account_journal_xls, self).__init__(name, table, rml, parser, header, store)
# Cell Styles # Cell Styles
_xs = self.xls_styles
_xs = self.xls_styles
# header # header
rh_cell_format = _xs['bold'] + _xs['fill'] + _xs['borders_all'] rh_cell_format = _xs['bold'] + _xs['fill'] + _xs['borders_all']
self.rh_cell_style = xlwt.easyxf(rh_cell_format) self.rh_cell_style = xlwt.easyxf(rh_cell_format)
self.rh_cell_style_center = xlwt.easyxf(rh_cell_format + _xs['center']) self.rh_cell_style_center = xlwt.easyxf(rh_cell_format + _xs['center'])
self.rh_cell_style_right = xlwt.easyxf(rh_cell_format + _xs['right']) self.rh_cell_style_right = xlwt.easyxf(rh_cell_format + _xs['right'])
# lines
# lines
aml_cell_format = _xs['borders_all'] aml_cell_format = _xs['borders_all']
self.aml_cell_style = xlwt.easyxf(aml_cell_format) self.aml_cell_style = xlwt.easyxf(aml_cell_format)
self.aml_cell_style_center = xlwt.easyxf(aml_cell_format + _xs['center']) self.aml_cell_style_center = xlwt.easyxf(aml_cell_format + _xs['center'])
self.aml_cell_style_date = xlwt.easyxf(aml_cell_format + _xs['left'], num_format_str = report_xls.date_format)
self.aml_cell_style_decimal = xlwt.easyxf(aml_cell_format + _xs['right'], num_format_str = report_xls.decimal_format)
self.aml_cell_style_date = xlwt.easyxf(aml_cell_format + _xs['left'], num_format_str=report_xls.date_format)
self.aml_cell_style_decimal = xlwt.easyxf(aml_cell_format + _xs['right'], num_format_str=report_xls.decimal_format)
# totals # totals
rt_cell_format = _xs['bold'] + _xs['fill'] + _xs['borders_all'] rt_cell_format = _xs['bold'] + _xs['fill'] + _xs['borders_all']
self.rt_cell_style = xlwt.easyxf(rt_cell_format) self.rt_cell_style = xlwt.easyxf(rt_cell_format)
self.rt_cell_style_right = xlwt.easyxf(rt_cell_format + _xs['right'])
self.rt_cell_style_decimal = xlwt.easyxf(rt_cell_format + _xs['right'], num_format_str = report_xls.decimal_format)
self.rt_cell_style_right = xlwt.easyxf(rt_cell_format + _xs['right'])
self.rt_cell_style_decimal = xlwt.easyxf(rt_cell_format + _xs['right'], num_format_str=report_xls.decimal_format)
# XLS Template Journal Items # XLS Template Journal Items
self.col_specs_lines_template = { self.col_specs_lines_template = {
'move_name':{
'move_name': {
'header': [1, 20, 'text', _render("_('Entry')")], 'header': [1, 20, 'text', _render("_('Entry')")],
'lines': [1, 0, 'text', _render("l['move_name'] != '/' and l['move_name'] or ('*'+str(l['move_id']))")], 'lines': [1, 0, 'text', _render("l['move_name'] != '/' and l['move_name'] or ('*'+str(l['move_id']))")],
'totals': [1, 0, 'text', None]}, 'totals': [1, 0, 'text', None]},
'move_date':{
'move_date': {
'header': [1, 13, 'text', _render("_('Date')")], 'header': [1, 13, 'text', _render("_('Date')")],
'lines': [1, 0, 'date', _render("datetime.strptime(l['move_date'],'%Y-%m-%d')"), None, self.aml_cell_style_date], 'lines': [1, 0, 'date', _render("datetime.strptime(l['move_date'],'%Y-%m-%d')"), None, self.aml_cell_style_date],
'totals': [1, 0, 'text', None]}, 'totals': [1, 0, 'text', None]},
'acc_code':{
'acc_code': {
'header': [1, 12, 'text', _render("_('Account')")], 'header': [1, 12, 'text', _render("_('Account')")],
'lines': [1, 0, 'text', _render("l['acc_code']")], 'lines': [1, 0, 'text', _render("l['acc_code']")],
'totals': [1, 0, 'text', None]}, 'totals': [1, 0, 'text', None]},
'aml_name':{
'aml_name': {
'header': [1, 42, 'text', _render("_('Description')")], 'header': [1, 42, 'text', _render("_('Description')")],
'lines': [1, 0, 'text', _render("l['aml_name']")],
'lines': [1, 0, 'text', _render("l['aml_name']")],
'totals': [1, 0, 'text', None]}, 'totals': [1, 0, 'text', None]},
'period':{
'period': {
'header': [1, 12, 'text', _render("_('Period')")], 'header': [1, 12, 'text', _render("_('Period')")],
'lines': [1, 0, 'text', _render("l['period']")], 'lines': [1, 0, 'text', _render("l['period']")],
'totals': [1, 0, 'text', None]}, 'totals': [1, 0, 'text', None]},
'partner_name':{
'partner_name': {
'header': [1, 36, 'text', _render("_('Partner')")], 'header': [1, 36, 'text', _render("_('Partner')")],
'lines': [1, 0, 'text', _render("l['partner_name']")], 'lines': [1, 0, 'text', _render("l['partner_name']")],
'totals': [1, 0, 'text', None]}, 'totals': [1, 0, 'text', None]},
'partner_ref':{
'partner_ref': {
'header': [1, 36, 'text', _render("_('Partner Reference')")], 'header': [1, 36, 'text', _render("_('Partner Reference')")],
'lines': [1, 0, 'text', _render("l['partner_ref']")], 'lines': [1, 0, 'text', _render("l['partner_ref']")],
'totals': [1, 0, 'text', None]}, 'totals': [1, 0, 'text', None]},
'date_maturity':{
'date_maturity': {
'header': [1, 13, 'text', _render("_('Maturity Date')")], 'header': [1, 13, 'text', _render("_('Maturity Date')")],
'lines': [1, 0, _render("l['date_maturity'] and 'date' or 'text'"), 'lines': [1, 0, _render("l['date_maturity'] and 'date' or 'text'"),
_render("l['date_maturity'] and datetime.strptime(l['date_maturity'],'%Y-%m-%d') or None"), _render("l['date_maturity'] and datetime.strptime(l['date_maturity'],'%Y-%m-%d') or None"),
None, self.aml_cell_style_date], None, self.aml_cell_style_date],
'totals': [1, 0, 'text', None]}, 'totals': [1, 0, 'text', None]},
'debit':{
'debit': {
'header': [1, 18, 'text', _render("_('Debit')"), None, self.rh_cell_style_right], 'header': [1, 18, 'text', _render("_('Debit')"), None, self.rh_cell_style_right],
'lines': [1, 0, 'number', _render("l['debit']"), None, self.aml_cell_style_decimal], 'lines': [1, 0, 'number', _render("l['debit']"), None, self.aml_cell_style_decimal],
'totals': [1, 0, 'number', None, _render("debit_formula"), self.rt_cell_style_decimal]}, 'totals': [1, 0, 'number', None, _render("debit_formula"), self.rt_cell_style_decimal]},
'credit':{
'credit': {
'header': [1, 18, 'text', _render("_('Credit')"), None, self.rh_cell_style_right], 'header': [1, 18, 'text', _render("_('Credit')"), None, self.rh_cell_style_right],
'lines': [1, 0, 'number', _render("l['credit']"), None, self.aml_cell_style_decimal], 'lines': [1, 0, 'number', _render("l['credit']"), None, self.aml_cell_style_decimal],
'totals': [1, 0, 'number', None, _render("credit_formula"), self.rt_cell_style_decimal]}, 'totals': [1, 0, 'number', None, _render("credit_formula"), self.rt_cell_style_decimal]},
'balance':{
'balance': {
'header': [1, 18, 'text', _render("_('Balance')"), None, self.rh_cell_style_right], 'header': [1, 18, 'text', _render("_('Balance')"), None, self.rh_cell_style_right],
'lines': [1, 0, 'number', None, _render("bal_formula"), self.aml_cell_style_decimal], 'lines': [1, 0, 'number', None, _render("bal_formula"), self.aml_cell_style_decimal],
'totals': [1, 0, 'number', None, _render("bal_formula"), self.rt_cell_style_decimal]}, 'totals': [1, 0, 'number', None, _render("bal_formula"), self.rt_cell_style_decimal]},
'reconcile':{
'reconcile': {
'header': [1, 12, 'text', _render("_('Rec.')"), None, self.rh_cell_style_center], 'header': [1, 12, 'text', _render("_('Rec.')"), None, self.rh_cell_style_center],
'lines': [1, 0, 'text', _render("l['reconcile']"), None, self.aml_cell_style_center], 'lines': [1, 0, 'text', _render("l['reconcile']"), None, self.aml_cell_style_center],
'totals': [1, 0, 'text', None]}, 'totals': [1, 0, 'text', None]},
'reconcile_partial':{
'reconcile_partial': {
'header': [1, 12, 'text', _render("_('Part. Rec.')"), None, self.rh_cell_style_center], 'header': [1, 12, 'text', _render("_('Part. Rec.')"), None, self.rh_cell_style_center],
'lines': [1, 0, 'text', _render("l['reconcile_partial']"), None, self.aml_cell_style_center], 'lines': [1, 0, 'text', _render("l['reconcile_partial']"), None, self.aml_cell_style_center],
'totals': [1, 0, 'text', None]}, 'totals': [1, 0, 'text', None]},
'tax_code':{
'tax_code': {
'header': [1, 6, 'text', _render("_('VAT')"), None, self.rh_cell_style_center], 'header': [1, 6, 'text', _render("_('VAT')"), None, self.rh_cell_style_center],
'lines': [1, 0, 'text', _render("l['tax_code']"), None, self.aml_cell_style_center], 'lines': [1, 0, 'text', _render("l['tax_code']"), None, self.aml_cell_style_center],
'totals': [1, 0, 'text', None]}, 'totals': [1, 0, 'text', None]},
'tax_amount':{
'tax_amount': {
'header': [1, 18, 'text', _render("_('VAT Amount')"), None, self.rh_cell_style_right], 'header': [1, 18, 'text', _render("_('VAT Amount')"), None, self.rh_cell_style_right],
'lines': [1, 0, 'number', _render("l['tax_amount']"), None, self.aml_cell_style_decimal], 'lines': [1, 0, 'number', _render("l['tax_amount']"), None, self.aml_cell_style_decimal],
'totals': [1, 0, 'text', None]}, 'totals': [1, 0, 'text', None]},
'amount_currency':{
'amount_currency': {
'header': [1, 18, 'text', _render("_('Am. Currency')"), None, self.rh_cell_style_right], 'header': [1, 18, 'text', _render("_('Am. Currency')"), None, self.rh_cell_style_right],
'lines': [1, 0, _render("l['amount_currency'] and 'number' or 'text'"), 'lines': [1, 0, _render("l['amount_currency'] and 'number' or 'text'"),
_render("l['amount_currency'] or None"), _render("l['amount_currency'] or None"),
None, self.aml_cell_style_decimal], None, self.aml_cell_style_decimal],
'totals': [1, 0, 'text', None]}, 'totals': [1, 0, 'text', None]},
'currency_name':{
'currency_name': {
'header': [1, 6, 'text', _render("_('Curr.')"), None, self.rh_cell_style_center], 'header': [1, 6, 'text', _render("_('Curr.')"), None, self.rh_cell_style_center],
'lines': [1, 0, 'text', _render("l['currency_name']"), None, self.aml_cell_style_center], 'lines': [1, 0, 'text', _render("l['currency_name']"), None, self.aml_cell_style_center],
'totals': [1, 0, 'text', None]}, 'totals': [1, 0, 'text', None]},
'docname':{
'docname': {
'header': [1, 35, 'text', _render("_('Document')")], 'header': [1, 35, 'text', _render("_('Document')")],
'lines': [1, 0, 'text', _render("l['docname']")], 'lines': [1, 0, 'text', _render("l['docname']")],
'totals': [1, 0, 'text', None]}, 'totals': [1, 0, 'text', None]},
'move_ref':{
'move_ref': {
'header': [1, 25, 'text', _render("_('Entry Reference')")], 'header': [1, 25, 'text', _render("_('Entry Reference')")],
'lines': [1, 0, 'text', _render("l['move_ref']")], 'lines': [1, 0, 'text', _render("l['move_ref']")],
'totals': [1, 0, 'text', None]}, 'totals': [1, 0, 'text', None]},
'move_id':{
'move_id': {
'header': [1, 10, 'text', _render("_('Entry Id')")], 'header': [1, 10, 'text', _render("_('Entry Id')")],
'lines': [1, 0, 'text', _render("str(l['move_id'])")], 'lines': [1, 0, 'text', _render("str(l['move_id'])")],
'totals': [1, 0, 'text', None]}, 'totals': [1, 0, 'text', None]},
@ -160,20 +162,20 @@ class account_journal_xls(report_xls):
# XLS Template VAT Summary # XLS Template VAT Summary
self.col_specs_vat_summary_template = { self.col_specs_vat_summary_template = {
'tax_case_name':{
'tax_case_name': {
'header': [1, 45, 'text', _render("_('Description')")], 'header': [1, 45, 'text', _render("_('Description')")],
'tax_totals': [1, 0, 'text', _render("t.name")]}, 'tax_totals': [1, 0, 'text', _render("t.name")]},
'tax_code':{
'tax_code': {
'header': [1, 6, 'text', _render("_('Case')")], 'header': [1, 6, 'text', _render("_('Case')")],
'tax_totals': [1, 0, 'text', _render("t.code")]}, 'tax_totals': [1, 0, 'text', _render("t.code")]},
'tax_amount':{
'tax_amount': {
'header': [1, 18, 'text', _render("_('Amount')"), None, self.rh_cell_style_right], 'header': [1, 18, 'text', _render("_('Amount')"), None, self.rh_cell_style_right],
'tax_totals': [1, 0, 'number', _render("sum_vat(o,t)"), None, self.aml_cell_style_decimal]}, 'tax_totals': [1, 0, 'number', _render("sum_vat(o,t)"), None, self.aml_cell_style_decimal]},
} }
def _journal_title(self, o, ws, _p, row_pos, xlwt, _xs):
cell_style = xlwt.easyxf(_xs['xls_title'])
report_name = (10*' ').join([
def _journal_title(self, o, ws, _p, row_pos, xlwt, _xs):
cell_style = xlwt.easyxf(_xs['xls_title'])
report_name = (10 * ' ').join([
_p.company.name, _p.company.name,
_p.title(o)[0], _p.title(o)[0],
_p.title(o)[1], _p.title(o)[1],
@ -181,23 +183,23 @@ class account_journal_xls(report_xls):
]) ])
c_specs = [ c_specs = [
('report_name', 1, 0, 'text', report_name), ('report_name', 1, 0, 'text', report_name),
]
]
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs])
row_pos = self.xls_write_row(ws, row_pos, row_data, row_style=cell_style) row_pos = self.xls_write_row(ws, row_pos, row_data, row_style=cell_style)
return row_pos + 1 return row_pos + 1
def _journal_lines(self, o, ws, _p, row_pos, xlwt, _xs):
def _journal_lines(self, o, ws, _p, row_pos, xlwt, _xs):
wanted_list = self.wanted_list wanted_list = self.wanted_list
debit_pos = self.debit_pos debit_pos = self.debit_pos
credit_pos = self.credit_pos
credit_pos = self.credit_pos
# Column headers # Column headers
c_specs = map(lambda x: self.render(x, self.col_specs_lines_template, 'header', render_space={'_': _p._}), wanted_list) c_specs = map(lambda x: self.render(x, self.col_specs_lines_template, 'header', render_space={'_': _p._}), wanted_list)
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs])
row_pos = self.xls_write_row(ws, row_pos, row_data, row_style=self.rh_cell_style, set_column_size=True)
ws.set_horz_split_pos(row_pos)
row_pos = self.xls_write_row(ws, row_pos, row_data, row_style=self.rh_cell_style, set_column_size=True)
ws.set_horz_split_pos(row_pos)
# account move lines # account move lines
aml_start_pos = row_pos aml_start_pos = row_pos
aml_cnt = len(_p.lines(o)) aml_cnt = len(_p.lines(o))
@ -213,13 +215,13 @@ class account_journal_xls(report_xls):
if l['draw_line'] and cnt != aml_cnt: if l['draw_line'] and cnt != aml_cnt:
row_pos += 1 row_pos += 1
# Totals
# Totals
debit_start = rowcol_to_cell(aml_start_pos, debit_pos) debit_start = rowcol_to_cell(aml_start_pos, debit_pos)
debit_stop = rowcol_to_cell(row_pos - 1, debit_pos) debit_stop = rowcol_to_cell(row_pos - 1, debit_pos)
debit_formula = 'SUM(%s:%s)' %(debit_start, debit_stop)
debit_formula = 'SUM(%s:%s)' % (debit_start, debit_stop)
credit_start = rowcol_to_cell(aml_start_pos, credit_pos) credit_start = rowcol_to_cell(aml_start_pos, credit_pos)
credit_stop = rowcol_to_cell(row_pos - 1, credit_pos) credit_stop = rowcol_to_cell(row_pos - 1, credit_pos)
credit_formula = 'SUM(%s:%s)' %(credit_start, credit_stop)
credit_formula = 'SUM(%s:%s)' % (credit_start, credit_stop)
debit_cell = rowcol_to_cell(row_pos, debit_pos) debit_cell = rowcol_to_cell(row_pos, debit_pos)
credit_cell = rowcol_to_cell(row_pos, credit_pos) credit_cell = rowcol_to_cell(row_pos, credit_pos)
bal_formula = debit_cell + '-' + credit_cell bal_formula = debit_cell + '-' + credit_cell
@ -228,25 +230,25 @@ class account_journal_xls(report_xls):
row_pos = self.xls_write_row(ws, row_pos, row_data, row_style=self.rt_cell_style_right) row_pos = self.xls_write_row(ws, row_pos, row_data, row_style=self.rt_cell_style_right)
return row_pos + 1 return row_pos + 1
def _journal_vat_summary(self, o, ws, _p, row_pos, xlwt, _xs):
def _journal_vat_summary(self, o, ws, _p, row_pos, xlwt, _xs):
if not _p.tax_codes(o): if not _p.tax_codes(o):
return row_pos return row_pos
title_cell_style = xlwt.easyxf(_xs['bold']) title_cell_style = xlwt.easyxf(_xs['bold'])
c_specs = [('summary_title', 1, 0, 'text', _p._("VAT Declaration"))]
c_specs = [('summary_title', 1, 0, 'text', _p._("VAT Declaration"))]
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs])
row_pos = self.xls_write_row(ws, row_pos, row_data, row_style=title_cell_style) + 1
row_pos = self.xls_write_row(ws, row_pos, row_data, row_style=title_cell_style) + 1
wanted_list = self.wanted_list wanted_list = self.wanted_list
vat_summary_wanted_list = ['tax_case_name', 'tax_code', 'tax_amount'] vat_summary_wanted_list = ['tax_case_name', 'tax_code', 'tax_amount']
# calculate col_span # calculate col_span
cols_number = len(wanted_list) cols_number = len(wanted_list)
vat_summary_cols_number = len(vat_summary_wanted_list) vat_summary_cols_number = len(vat_summary_wanted_list)
if vat_summary_cols_number > cols_number: if vat_summary_cols_number > cols_number:
raise orm.except_orm(_('Programming Error!'),
_("vat_summary_cols_number should be < cols_number !"))
raise orm.except_orm(_('Programming Error!'),
_("vat_summary_cols_number should be < cols_number !"))
index = 0 index = 0
for i in range(vat_summary_cols_number): for i in range(vat_summary_cols_number):
col = vat_summary_wanted_list[i] col = vat_summary_wanted_list[i]
@ -263,20 +265,20 @@ class account_journal_xls(report_xls):
self.col_specs_vat_summary_template[col]['header'][0] = col_span self.col_specs_vat_summary_template[col]['header'][0] = col_span
self.col_specs_vat_summary_template[col]['tax_totals'][0] = col_span self.col_specs_vat_summary_template[col]['tax_totals'][0] = col_span
index += 1 index += 1
c_specs = map(lambda x: self.render(x, self.col_specs_vat_summary_template, 'header'), vat_summary_wanted_list) c_specs = map(lambda x: self.render(x, self.col_specs_vat_summary_template, 'header'), vat_summary_wanted_list)
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs])
row_pos = self.xls_write_row(ws, row_pos, row_data, row_style=self.rh_cell_style) row_pos = self.xls_write_row(ws, row_pos, row_data, row_style=self.rh_cell_style)
for t in _p.tax_codes(o): for t in _p.tax_codes(o):
c_specs = map(lambda x: self.render(x, self.col_specs_vat_summary_template, 'tax_totals'), vat_summary_wanted_list) c_specs = map(lambda x: self.render(x, self.col_specs_vat_summary_template, 'tax_totals'), vat_summary_wanted_list)
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs])
row_pos = self.xls_write_row(ws, row_pos, row_data, row_style=self.aml_cell_style) row_pos = self.xls_write_row(ws, row_pos, row_data, row_style=self.aml_cell_style)
return row_pos return row_pos
def generate_xls_report(self, _p, _xs, data, objects, wb): def generate_xls_report(self, _p, _xs, data, objects, wb):
wanted_list = _p.wanted_list wanted_list = _p.wanted_list
if _p.display_currency: if _p.display_currency:
wanted_list += ['amount_currency', 'currency_name'] wanted_list += ['amount_currency', 'currency_name']
@ -286,29 +288,29 @@ class account_journal_xls(report_xls):
self.debit_pos = 'debit' in wanted_list and wanted_list.index('debit') self.debit_pos = 'debit' in wanted_list and wanted_list.index('debit')
self.credit_pos = 'credit' in wanted_list and wanted_list.index('credit') self.credit_pos = 'credit' in wanted_list and wanted_list.index('credit')
if not (self.credit_pos and self.debit_pos) and 'balance' in wanted_list: if not (self.credit_pos and self.debit_pos) and 'balance' in wanted_list:
raise orm.except_orm(_('Customisation Error!'),
raise orm.except_orm(_('Customisation Error!'),
_("The 'Balance' field is a calculated XLS field requiring the presence of the 'Debit' and 'Credit' fields !")) _("The 'Balance' field is a calculated XLS field requiring the presence of the 'Debit' and 'Credit' fields !"))
for o in objects: for o in objects:
sheet_name = ' - '.join([o[1].code, o[0].code])[:31].replace('/', '-') sheet_name = ' - '.join([o[1].code, o[0].code])[:31].replace('/', '-')
sheet_name = sheet_name[:31].replace('/', '-') sheet_name = sheet_name[:31].replace('/', '-')
ws = wb.add_sheet(sheet_name) ws = wb.add_sheet(sheet_name)
ws.panes_frozen = True ws.panes_frozen = True
ws.remove_splits = True ws.remove_splits = True
ws.portrait = 0 # Landscape
ws.portrait = 0 # Landscape
ws.fit_width_to_pages = 1 ws.fit_width_to_pages = 1
row_pos = 0 row_pos = 0
# set print header/footer # set print header/footer
ws.header_str = self.xls_headers['standard'] ws.header_str = self.xls_headers['standard']
ws.footer_str = self.xls_footers['standard'] ws.footer_str = self.xls_footers['standard']
# Data # Data
row_pos = self._journal_title(o, ws, _p, row_pos, xlwt, _xs)
row_pos = self._journal_lines(o, ws, _p, row_pos, xlwt, _xs)
row_pos = self._journal_vat_summary(o, ws, _p, row_pos, xlwt, _xs)
row_pos = self._journal_title(o, ws, _p, row_pos, xlwt, _xs)
row_pos = self._journal_lines(o, ws, _p, row_pos, xlwt, _xs)
row_pos = self._journal_vat_summary(o, ws, _p, row_pos, xlwt, _xs)
account_journal_xls('report.nov.account.journal.xls', 'account.journal.period', account_journal_xls('report.nov.account.journal.xls', 'account.journal.period',
parser=account_journal_xls_parser) parser=account_journal_xls_parser)

39
account_journal_report_xls/wizard/print_journal_wizard.py

@ -27,18 +27,19 @@ import time
import logging import logging
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
class account_print_journal_xls(orm.TransientModel): class account_print_journal_xls(orm.TransientModel):
_inherit = 'account.print.journal'
_inherit = 'account.print.journal'
_name = 'account.print.journal.xls' _name = 'account.print.journal.xls'
_description = 'Print/Export Journal' _description = 'Print/Export Journal'
_columns = { _columns = {
'journal_ids': fields.many2many('account.journal', string='Journals', required=True), 'journal_ids': fields.many2many('account.journal', string='Journals', required=True),
'group_entries': fields.boolean('Group Entries', help="Group entries with same General Account & Tax Code."), 'group_entries': fields.boolean('Group Entries', help="Group entries with same General Account & Tax Code."),
} }
_defaults={
_defaults = {
'group_entries': True, 'group_entries': True,
} }
def fields_get(self, cr, uid, fields=None, context=None): def fields_get(self, cr, uid, fields=None, context=None):
res = super(account_print_journal_xls, self).fields_get(cr, uid, fields, context) res = super(account_print_journal_xls, self).fields_get(cr, uid, fields, context)
if context.get('print_by') == 'fiscalyear': if context.get('print_by') == 'fiscalyear':
@ -53,19 +54,19 @@ class account_print_journal_xls(orm.TransientModel):
res['period_from']['required'] = True res['period_from']['required'] = True
if 'period_to' in res: if 'period_to' in res:
res['period_to']['required'] = True res['period_to']['required'] = True
return res
return res
def fy_period_ids(self, cr, uid, fiscalyear_id): def fy_period_ids(self, cr, uid, fiscalyear_id):
""" returns all periods from a fiscalyear sorted by date """ """ returns all periods from a fiscalyear sorted by date """
fy_period_ids = [] fy_period_ids = []
cr.execute('SELECT id, coalesce(special, False) AS special FROM account_period ' \
cr.execute('SELECT id, coalesce(special, False) AS special FROM account_period '
'WHERE fiscalyear_id=%s ORDER BY date_start, special DESC', 'WHERE fiscalyear_id=%s ORDER BY date_start, special DESC',
(fiscalyear_id,)) (fiscalyear_id,))
res = cr.fetchall() res = cr.fetchall()
if res: if res:
fy_period_ids = map(lambda x: x[0], res)
fy_period_ids = [x[0] for x in res]
return fy_period_ids return fy_period_ids
def onchange_fiscalyear_id(self, cr, uid, ids, fiscalyear_id=False, context=None): def onchange_fiscalyear_id(self, cr, uid, ids, fiscalyear_id=False, context=None):
res = {'value': {}} res = {'value': {}}
if context.get('print_by') == 'fiscalyear': if context.get('print_by') == 'fiscalyear':
@ -79,7 +80,7 @@ class account_print_journal_xls(orm.TransientModel):
def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
""" skip account.common.journal.report,fields_view_get (adds domain filter on journal type) """ """ skip account.common.journal.report,fields_view_get (adds domain filter on journal type) """
return super(account_common_journal_report, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar, submenu) return super(account_common_journal_report, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar, submenu)
def xls_export(self, cr, uid, ids, context=None): def xls_export(self, cr, uid, ids, context=None):
return self.print_report(cr, uid, ids, context=context) return self.print_report(cr, uid, ids, context=context)
@ -88,7 +89,7 @@ class account_print_journal_xls(orm.TransientModel):
context = {} context = {}
move_obj = self.pool.get('account.move') move_obj = self.pool.get('account.move')
print_by = context.get('print_by') print_by = context.get('print_by')
wiz_form = self.browse(cr, uid, ids)[0]
wiz_form = self.browse(cr, uid, ids)[0]
fiscalyear_id = wiz_form.fiscalyear_id.id fiscalyear_id = wiz_form.fiscalyear_id.id
company_id = wiz_form.company_id.id company_id = wiz_form.company_id.id
@ -97,18 +98,18 @@ class account_print_journal_xls(orm.TransientModel):
else: else:
period_from = wiz_form.period_from period_from = wiz_form.period_from
period_to = wiz_form.period_to period_to = wiz_form.period_to
cr.execute("SELECT id, coalesce(special, False) AS special FROM account_period ap " \
"WHERE ap.date_start>=%s AND ap.date_stop<=%s AND company_id=%s " \
cr.execute("SELECT id, coalesce(special, False) AS special FROM account_period ap "
"WHERE ap.date_start>=%s AND ap.date_stop<=%s AND company_id=%s "
"ORDER BY date_start, special DESC", "ORDER BY date_start, special DESC",
(period_from.date_start, period_to.date_stop, company_id)) (period_from.date_start, period_to.date_stop, company_id))
wiz_period_ids = map(lambda x: x[0], cr.fetchall())
wiz_period_ids = [x[0] for x in cr.fetchall()]
wiz_journal_ids = [j.id for j in wiz_form.journal_ids] wiz_journal_ids = [j.id for j in wiz_form.journal_ids]
# sort journals # sort journals
cr.execute('SELECT id FROM account_journal ' \
cr.execute('SELECT id FROM account_journal '
'WHERE id IN %s ORDER BY type DESC', 'WHERE id IN %s ORDER BY type DESC',
(tuple(wiz_journal_ids),)) (tuple(wiz_journal_ids),))
wiz_journal_ids = map(lambda x: x[0], cr.fetchall())
wiz_journal_ids = [x[0] for x in cr.fetchall()]
datas = { datas = {
'model': 'account.journal', 'model': 'account.journal',
@ -122,13 +123,13 @@ class account_print_journal_xls(orm.TransientModel):
if wiz_form.target_move == 'posted': if wiz_form.target_move == 'posted':
move_states = ['posted'] move_states = ['posted']
else: else:
move_states = ['draft','posted']
move_states = ['draft', 'posted']
if print_by == 'fiscalyear': if print_by == 'fiscalyear':
journal_fy_ids = [] journal_fy_ids = []
for journal_id in wiz_journal_ids: for journal_id in wiz_journal_ids:
aml_ids = move_obj.search(cr, uid,
[('journal_id', '=', journal_id), ('period_id', 'in', wiz_period_ids), ('state', 'in', move_states)],
aml_ids = move_obj.search(cr, uid,
[('journal_id', '=', journal_id), ('period_id', 'in', wiz_period_ids), ('state', 'in', move_states)],
limit=1) limit=1)
if aml_ids: if aml_ids:
journal_fy_ids.append((journal_id, fiscalyear_id)) journal_fy_ids.append((journal_id, fiscalyear_id))
@ -144,8 +145,8 @@ class account_print_journal_xls(orm.TransientModel):
for journal_id in wiz_journal_ids: for journal_id in wiz_journal_ids:
period_ids = [] period_ids = []
for period_id in wiz_period_ids: for period_id in wiz_period_ids:
aml_ids = move_obj.search(cr, uid,
[('journal_id', '=', journal_id), ('period_id', '=', period_id), ('state', 'in', move_states)],
aml_ids = move_obj.search(cr, uid,
[('journal_id', '=', journal_id), ('period_id', '=', period_id), ('state', 'in', move_states)],
limit=1) limit=1)
if aml_ids: if aml_ids:
period_ids.append(period_id) period_ids.append(period_id)

Loading…
Cancel
Save