Browse Source

Review of OCA General Ledger Report PDF

pull/211/head
jcoux 8 years ago
parent
commit
071af36c07
  1. 1
      account_financial_report_qweb/report/__init__.py
  2. 139
      account_financial_report_qweb/report/general_ledger.py
  3. 80
      account_financial_report_qweb/report/templates/general_ledger.xml
  4. 22
      account_financial_report_qweb/wizard/general_ledger_wizard.py

1
account_financial_report_qweb/report/__init__.py

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# © 2015 Yannick Vaucher (Camptocamp) # © 2015 Yannick Vaucher (Camptocamp)
# © 2016 Damien Crier (Camptocamp) # © 2016 Damien Crier (Camptocamp)
# © 2016 Julien Coux (Camptocamp)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).- # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).-
from . import aged_partner_balance from . import aged_partner_balance

139
account_financial_report_qweb/report/general_ledger.py

@ -8,10 +8,22 @@ from openerp import models, fields, api
class GeneralLedgerReport(models.TransientModel): class GeneralLedgerReport(models.TransientModel):
""" Here, we just define class fields. """ Here, we just define class fields.
For methods, go more bottom at this file. For methods, go more bottom at this file.
The class hierarchy is :
* GeneralLedgerReport
** GeneralLedgerReportAccount
*** GeneralLedgerReportMoveLine
For non receivable/payable accounts
For receivable/payable centralized accounts
*** GeneralLedgerReportPartner
For receivable/payable and not centralized accounts
**** GeneralLedgerReportMoveLine
For receivable/payable and not centralized accounts
""" """
_name = 'report_general_ledger_qweb' _name = 'report_general_ledger_qweb'
# Filters fields, used for data computation
date_from = fields.Date() date_from = fields.Date()
date_to = fields.Date() date_to = fields.Date()
fy_start_date = fields.Date() fy_start_date = fields.Date()
@ -20,14 +32,17 @@ class GeneralLedgerReport(models.TransientModel):
company_id = fields.Many2one(comodel_name='res.company') company_id = fields.Many2one(comodel_name='res.company')
filter_account_ids = fields.Many2many(comodel_name='account.account') filter_account_ids = fields.Many2many(comodel_name='account.account')
filter_partner_ids = fields.Many2many(comodel_name='res.partner') filter_partner_ids = fields.Many2many(comodel_name='res.partner')
has_second_currency = fields.Boolean()
centralize = fields.Boolean() centralize = fields.Boolean()
# Flag fields, used for report display
has_second_currency = fields.Boolean()
show_cost_center = fields.Boolean( show_cost_center = fields.Boolean(
default=lambda self: self.env.user.has_group( default=lambda self: self.env.user.has_group(
'analytic.group_analytic_accounting' 'analytic.group_analytic_accounting'
) )
) )
# Data fields, used to browse report data
account_ids = fields.One2many( account_ids = fields.One2many(
comodel_name='report_general_ledger_qweb_account', comodel_name='report_general_ledger_qweb_account',
inverse_name='report_id' inverse_name='report_id'
@ -44,10 +59,14 @@ class GeneralLedgerReportAccount(models.TransientModel):
ondelete='cascade', ondelete='cascade',
index=True index=True
) )
# Data fields, used to keep link with real object
account_id = fields.Many2one( account_id = fields.Many2one(
'account.account', 'account.account',
index=True index=True
) )
# Data fields, used for report display
code = fields.Char() code = fields.Char()
name = fields.Char() name = fields.Char()
initial_debit = fields.Float(digits=(16, 2)) initial_debit = fields.Float(digits=(16, 2))
@ -56,8 +75,11 @@ class GeneralLedgerReportAccount(models.TransientModel):
final_debit = fields.Float(digits=(16, 2)) final_debit = fields.Float(digits=(16, 2))
final_credit = fields.Float(digits=(16, 2)) final_credit = fields.Float(digits=(16, 2))
final_balance = fields.Float(digits=(16, 2)) final_balance = fields.Float(digits=(16, 2))
# Flag fields, used for report display and for data computation
is_partner_account = fields.Boolean() is_partner_account = fields.Boolean()
# Data fields, used to browse report data
move_line_ids = fields.One2many( move_line_ids = fields.One2many(
comodel_name='report_general_ledger_qweb_move_line', comodel_name='report_general_ledger_qweb_move_line',
inverse_name='report_account_id' inverse_name='report_account_id'
@ -77,10 +99,14 @@ class GeneralLedgerReportPartner(models.TransientModel):
ondelete='cascade', ondelete='cascade',
index=True index=True
) )
# Data fields, used to keep link with real object
partner_id = fields.Many2one( partner_id = fields.Many2one(
'res.partner', 'res.partner',
index=True index=True
) )
# Data fields, used for report display
name = fields.Char() name = fields.Char()
initial_debit = fields.Float(digits=(16, 2)) initial_debit = fields.Float(digits=(16, 2))
initial_credit = fields.Float(digits=(16, 2)) initial_credit = fields.Float(digits=(16, 2))
@ -89,6 +115,7 @@ class GeneralLedgerReportPartner(models.TransientModel):
final_credit = fields.Float(digits=(16, 2)) final_credit = fields.Float(digits=(16, 2))
final_balance = fields.Float(digits=(16, 2)) final_balance = fields.Float(digits=(16, 2))
# Data fields, used to browse report data
move_line_ids = fields.One2many( move_line_ids = fields.One2many(
comodel_name='report_general_ledger_qweb_move_line', comodel_name='report_general_ledger_qweb_move_line',
inverse_name='report_partner_id' inverse_name='report_partner_id'
@ -96,14 +123,15 @@ class GeneralLedgerReportPartner(models.TransientModel):
@api.model @api.model
def _generate_order_by(self, order_spec, query): def _generate_order_by(self, order_spec, query):
"""Custom order to display "No partner allocated" at last position."""
return """ return """
ORDER BY ORDER BY
CASE
WHEN "report_general_ledger_qweb_partner"."partner_id" IS NOT NULL
THEN 0
ELSE 1
CASE
WHEN "report_general_ledger_qweb_partner"."partner_id" IS NOT NULL
THEN 0
ELSE 1
END, END,
"report_general_ledger_qweb_partner"."name"
"report_general_ledger_qweb_partner"."name"
""" """
@ -121,7 +149,11 @@ class GeneralLedgerReportMoveLine(models.TransientModel):
ondelete='cascade', ondelete='cascade',
index=True index=True
) )
# Data fields, used to keep link with real object
move_line_id = fields.Many2one('account.move.line') move_line_id = fields.Many2one('account.move.line')
# Data fields, used for report display
date = fields.Date() date = fields.Date()
entry = fields.Char() entry = fields.Char()
journal = fields.Char() journal = fields.Char()
@ -138,57 +170,46 @@ class GeneralLedgerReportMoveLine(models.TransientModel):
class GeneralLedgerReportCompute(models.TransientModel): class GeneralLedgerReportCompute(models.TransientModel):
""" Here, we just define methods.
For class fields, go more top at this file.
"""
_inherit = 'report_general_ledger_qweb' _inherit = 'report_general_ledger_qweb'
@api.model
def print_report(self):
self.ensure_one()
self.compute_data_for_report()
return {
'type': 'ir.actions.report.xml',
'report_name':
'account_financial_report_qweb.report_general_ledger_qweb',
'datas': {'ids': [self.id]},
}
@api.model
def print_report_xlsx(self):
@api.multi
def print_report(self, xlsx_report=False):
self.ensure_one() self.ensure_one()
self.compute_data_for_report() self.compute_data_for_report()
if xlsx_report:
report_name = 'ledger.report.wizard.xlsx'
else:
report_name = 'account_financial_report_qweb.' \
'report_general_ledger_qweb'
return { return {
'type': 'ir.actions.report.xml', 'type': 'ir.actions.report.xml',
'name': 'export xlsx general ledger',
'model': self._name,
'report_name': 'ledger.report.wizard.xlsx',
'report_type': 'xlsx',
'context': self.env.context,
'report_name': report_name,
'datas': {'ids': [self.id]}, 'datas': {'ids': [self.id]},
} }
@api.multi @api.multi
def _print_report_xlsx(self, data):
return
@api.model
def compute_data_for_report(self): def compute_data_for_report(self):
self.ensure_one() self.ensure_one()
self.inject_account_values()
self.inject_partner_values()
self.inject_line_not_centralized_values()
self.inject_line_not_centralized_values(is_account_line=False,
is_partner_line=True)
self.inject_line_not_centralized_values(is_account_line=False,
is_partner_line=True,
only_empty_partner_line=True)
# Compute report data
self._inject_account_values()
self._inject_partner_values()
self._inject_line_not_centralized_values()
self._inject_line_not_centralized_values(is_account_line=False,
is_partner_line=True)
self._inject_line_not_centralized_values(is_account_line=False,
is_partner_line=True,
only_empty_partner_line=True)
if self.centralize: if self.centralize:
self.inject_line_centralized_values()
self.compute_has_second_currency()
self._inject_line_centralized_values()
# Compute display flag
self._compute_has_second_currency()
def inject_account_values(self):
def _inject_account_values(self):
"""Inject report values for report_general_ledger_qweb_account."""
subquery_sum_amounts = """ subquery_sum_amounts = """
SELECT SELECT
a.id AS account_id, a.id AS account_id,
@ -332,7 +353,11 @@ AND
) )
self.env.cr.execute(query_inject_account, query_inject_account_params) self.env.cr.execute(query_inject_account, query_inject_account_params)
def inject_partner_values(self):
def _inject_partner_values(self):
""" Inject report values for report_general_ledger_qweb_partner.
Only for "partner" accounts (payable and receivable).
"""
subquery_sum_amounts = """ subquery_sum_amounts = """
SELECT SELECT
ap.account_id AS account_id, ap.account_id AS account_id,
@ -494,10 +519,21 @@ AND
print query_inject_partner_params print query_inject_partner_params
self.env.cr.execute(query_inject_partner, query_inject_partner_params) self.env.cr.execute(query_inject_partner, query_inject_partner_params)
def inject_line_not_centralized_values(self,
is_account_line=True,
is_partner_line=False,
only_empty_partner_line=False):
def _inject_line_not_centralized_values(self,
is_account_line=True,
is_partner_line=False,
only_empty_partner_line=False):
""" Inject report values for report_general_ledger_qweb_move_line.
If centralized option have been chosen,
only non centralized accounts are computed.
In function of `is_account_line` and `is_partner_line` values,
the move_line link is made either with account or either with partner.
The "only_empty_partner_line" value is used
to compute data without partner.
"""
query_inject_move_line = """ query_inject_move_line = """
INSERT INTO INSERT INTO
report_general_ledger_qweb_move_line report_general_ledger_qweb_move_line
@ -692,7 +728,11 @@ ORDER BY
self.date_to,) self.date_to,)
) )
def inject_line_centralized_values(self):
def _inject_line_centralized_values(self):
""" Inject report values for report_general_ledger_qweb_move_line.
Only centralized accounts are computed.
"""
query_inject_move_line_centralized = """ query_inject_move_line_centralized = """
WITH WITH
move_lines AS move_lines AS
@ -780,7 +820,8 @@ ORDER BY
self.id,) self.id,)
) )
def compute_has_second_currency(self):
def _compute_has_second_currency(self):
""" Compute "has_second_currency" flag which will used for display."""
query_update_has_second_currency = """ query_update_has_second_currency = """
UPDATE UPDATE
report_general_ledger_qweb report_general_ledger_qweb

80
account_financial_report_qweb/report/templates/general_ledger.xml

@ -4,59 +4,51 @@
<template id="account_financial_report_qweb.report_general_ledger_qweb"> <template id="account_financial_report_qweb.report_general_ledger_qweb">
<t t-call="report.html_container"> <t t-call="report.html_container">
<t t-foreach="docs" t-as="o"> <t t-foreach="docs" t-as="o">
<!-- Saved flag fields into variables, used to define columns display -->
<t t-set="show_cost_center" t-value="o.show_cost_center"/> <t t-set="show_cost_center" t-value="o.show_cost_center"/>
<t t-set="has_second_currency" t-value="o.has_second_currency"/> <t t-set="has_second_currency" t-value="o.has_second_currency"/>
<t t-call="account_financial_report_qweb.internal_layout"> <t t-call="account_financial_report_qweb.internal_layout">
<!-- Defines global variables used by internal layout -->
<t t-set="title" t-value='"General Ledger"'/> <t t-set="title" t-value='"General Ledger"'/>
<t t-set="company_name" t-value="o.company_id.name"/> <t t-set="company_name" t-value="o.company_id.name"/>
<div class="page"> <div class="page">
<div class="act_as_table data_table" style="width: 1140px !important;">
<div class="act_as_row labels">
<div class="act_as_cell">Date range filter</div>
<div class="act_as_cell">Target moves filter</div>
<div class="act_as_cell">Account balance at 0 filter</div>
<div class="act_as_cell">Centralize filter</div>
</div>
<div class="act_as_row">
<div class="act_as_cell">
From: <span t-field="o.date_from"/> To: <span t-field="o.date_to"/>
</div>
<div class="act_as_cell">
<t t-if="o.only_posted_moves">All posted entries</t>
<t t-if="not o.only_posted_moves">All entries</t>
</div>
<div class="act_as_cell">
<t t-if="o.hide_account_balance_at_0">Hide</t>
<t t-if="not o.hide_account_balance_at_0">Show</t>
</div>
<div class="act_as_cell">
<t t-if="o.centralize">Yes</t>
<t t-if="not o.centralize">No</t>
</div>
</div>
</div>
<!-- Display filters -->
<t t-call="account_financial_report_qweb.report_general_ledger_qweb_filters"/>
<t t-foreach="o.account_ids" t-as="account"> <t t-foreach="o.account_ids" t-as="account">
<div class="page_break"> <div class="page_break">
<!-- Display account header -->
<div class="act_as_table list_table" style="margin-top: 10px;"/> <div class="act_as_table list_table" style="margin-top: 10px;"/>
<div class="act_as_caption account_title" style="width: 1141px !important;"> <div class="act_as_caption account_title" style="width: 1141px !important;">
<span t-field="account.code"/> - <span t-field="account.name"/> <span t-field="account.code"/> - <span t-field="account.name"/>
</div> </div>
<!-- Display account move lines -->
<t t-if="account.move_line_ids"> <t t-if="account.move_line_ids">
<t t-call="account_financial_report_qweb.report_general_ledger_qweb_lines"> <t t-call="account_financial_report_qweb.report_general_ledger_qweb_lines">
<t t-set="account_or_partner_object" t-value="account"/> <t t-set="account_or_partner_object" t-value="account"/>
</t> </t>
</t> </t>
<t t-if="not account.move_line_ids"> <t t-if="not account.move_line_ids">
<!-- Display account partners -->
<t t-if="account.is_partner_account"> <t t-if="account.is_partner_account">
<t t-foreach="account.partner_ids" t-as="partner"> <t t-foreach="account.partner_ids" t-as="partner">
<div class="page_break"> <div class="page_break">
<!-- Display partner header -->
<div class="act_as_caption account_title"> <div class="act_as_caption account_title">
<span t-field="partner.name"/> <span t-field="partner.name"/>
</div> </div>
<!-- Display partner move lines -->
<t t-call="account_financial_report_qweb.report_general_ledger_qweb_lines"> <t t-call="account_financial_report_qweb.report_general_ledger_qweb_lines">
<t t-set="account_or_partner_object" t-value="partner"/> <t t-set="account_or_partner_object" t-value="partner"/>
</t> </t>
<!-- Display partner footer -->
<t t-call="account_financial_report_qweb.report_general_ledger_qweb_ending_cumul"> <t t-call="account_financial_report_qweb.report_general_ledger_qweb_ending_cumul">
<t t-set="account_or_partner_object" t-value="partner"/> <t t-set="account_or_partner_object" t-value="partner"/>
<t t-set="type" t-value='"partner_type"'/> <t t-set="type" t-value='"partner_type"'/>
@ -65,6 +57,8 @@
</t> </t>
</t> </t>
</t> </t>
<!-- Display account footer -->
<t t-call="account_financial_report_qweb.report_general_ledger_qweb_ending_cumul"> <t t-call="account_financial_report_qweb.report_general_ledger_qweb_ending_cumul">
<t t-set="account_or_partner_object" t-value="account"/> <t t-set="account_or_partner_object" t-value="account"/>
<t t-set="type" t-value='"account_type"'/> <t t-set="type" t-value='"account_type"'/>
@ -77,8 +71,38 @@
</t> </t>
</template> </template>
<template id="account_financial_report_qweb.report_general_ledger_qweb_filters">
<div class="act_as_table data_table" style="width: 1140px !important;">
<div class="act_as_row labels">
<div class="act_as_cell">Date range filter</div>
<div class="act_as_cell">Target moves filter</div>
<div class="act_as_cell">Account balance at 0 filter</div>
<div class="act_as_cell">Centralize filter</div>
</div>
<div class="act_as_row">
<div class="act_as_cell">
From: <span t-field="o.date_from"/> To: <span t-field="o.date_to"/>
</div>
<div class="act_as_cell">
<t t-if="o.only_posted_moves">All posted entries</t>
<t t-if="not o.only_posted_moves">All entries</t>
</div>
<div class="act_as_cell">
<t t-if="o.hide_account_balance_at_0">Hide</t>
<t t-if="not o.hide_account_balance_at_0">Show</t>
</div>
<div class="act_as_cell">
<t t-if="o.centralize">Yes</t>
<t t-if="not o.centralize">No</t>
</div>
</div>
</div>
</template>
<template id="account_financial_report_qweb.report_general_ledger_qweb_lines"> <template id="account_financial_report_qweb.report_general_ledger_qweb_lines">
<div class="act_as_table data_table" style="width: 1140px !important;"> <div class="act_as_table data_table" style="width: 1140px !important;">
<!-- Display table headers for lines -->
<div class="act_as_thead"> <div class="act_as_thead">
<div class="act_as_row labels"> <div class="act_as_row labels">
<!--## date--> <!--## date-->
@ -113,7 +137,8 @@
</t> </t>
</div> </div>
</div> </div>
<!-- # initial_balance line -->
<!-- Display first line with initial balance -->
<div class="act_as_row lines"> <div class="act_as_row lines">
<!--## date--> <!--## date-->
<div class="act_as_cell"></div> <div class="act_as_cell"></div>
@ -146,6 +171,8 @@
<div class="act_as_cell"></div> <div class="act_as_cell"></div>
</t> </t>
</div> </div>
<!-- Display each lines -->
<t t-foreach="account_or_partner_object.move_line_ids" t-as="line"> <t t-foreach="account_or_partner_object.move_line_ids" t-as="line">
<!-- # lines or centralized lines --> <!-- # lines or centralized lines -->
<div class="act_as_row lines"> <div class="act_as_row lines">
@ -191,6 +218,7 @@
</template> </template>
<template id="account_financial_report_qweb.report_general_ledger_qweb_ending_cumul"> <template id="account_financial_report_qweb.report_general_ledger_qweb_ending_cumul">
<!-- Display ending balance line for account or partner -->
<div class="act_as_table list_table" style="width: 1141px !important;"> <div class="act_as_table list_table" style="width: 1141px !important;">
<div class="act_as_row labels" style="font-weight: bold;"> <div class="act_as_row labels" style="font-weight: bold;">
<!--## date--> <!--## date-->

22
account_financial_report_qweb/wizard/general_ledger_wizard.py

@ -81,22 +81,16 @@ class GeneralLedgerReportWizard(models.TransientModel):
@api.multi @api.multi
def button_export_pdf(self): def button_export_pdf(self):
model = self.env['report_general_ledger_qweb']
report = model.create({
'date_from': self.date_from,
'date_to': self.date_to,
'only_posted_moves': self.target_move == 'posted',
'hide_account_balance_at_0': self.hide_account_balance_at_0,
'company_id': self.company_id.id,
'filter_account_ids': [(6, 0, self.account_ids.ids)],
'filter_partner_ids': [(6, 0, self.partner_ids.ids)],
'centralize': self.centralize,
'fy_start_date': self.fy_start_date,
})
return report.print_report()
self.ensure_one()
return self._export()
@api.multi @api.multi
def button_export_xlsx(self): def button_export_xlsx(self):
self.ensure_one()
return self._export(xlsx_report=True)
def _export(self, xlsx_report=False):
"""Default export is PDF."""
model = self.env['report_general_ledger_qweb'] model = self.env['report_general_ledger_qweb']
report = model.create({ report = model.create({
'date_from': self.date_from, 'date_from': self.date_from,
@ -109,4 +103,4 @@ class GeneralLedgerReportWizard(models.TransientModel):
'centralize': self.centralize, 'centralize': self.centralize,
'fy_start_date': self.fy_start_date, 'fy_start_date': self.fy_start_date,
}) })
return report.print_report_xlsx()
return report.print_report(xlsx_report)
Loading…
Cancel
Save