Browse Source

Add OCA Aged Partner Balance report PDF

pull/211/head
jcoux 8 years ago
parent
commit
b01e392d0f
  1. 1
      account_financial_report_qweb/__openerp__.py
  2. 4
      account_financial_report_qweb/menuitems.xml
  3. 1
      account_financial_report_qweb/report/__init__.py
  4. 550
      account_financial_report_qweb/report/aged_partner_balance.py
  5. 292
      account_financial_report_qweb/report/templates/aged_partner_balance.xml
  6. 13
      account_financial_report_qweb/reports.xml
  7. 93
      account_financial_report_qweb/wizard/aged_partner_balance_wizard.py
  8. 40
      account_financial_report_qweb/wizard/aged_partner_balance_wizard_view.xml

1
account_financial_report_qweb/__openerp__.py

@ -29,6 +29,7 @@
'wizard/balance_sheet_wizard_view.xml', 'wizard/balance_sheet_wizard_view.xml',
'menuitems.xml', 'menuitems.xml',
'reports.xml', 'reports.xml',
'report/templates/aged_partner_balance.xml',
'report/templates/general_ledger.xml', 'report/templates/general_ledger.xml',
'report/templates/layouts.xml', 'report/templates/layouts.xml',
'report/templates/open_invoice_report.xml', 'report/templates/open_invoice_report.xml',

4
account_financial_report_qweb/menuitems.xml

@ -17,8 +17,8 @@
<menuitem <menuitem
parent="menu_oca_reports" parent="menu_oca_reports"
id='account.menu_aged_partner_balance'
action='action_account_aged_trial_balance_wizard'
action='action_aged_partner_balance_wizard'
id='menu_aged_partner_balance_wizard'
/> />
<menuitem icon="STOCK_PRINT" name="Partner Balance" <menuitem icon="STOCK_PRINT" name="Partner Balance"

1
account_financial_report_qweb/report/__init__.py

@ -2,6 +2,7 @@
# © 2015 Yannick Vaucher (Camptocamp) # © 2015 Yannick Vaucher (Camptocamp)
# © 2016 Damien Crier (Camptocamp) # © 2016 Damien Crier (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 general_ledger from . import general_ledger
from . import open_invoice from . import open_invoice
from . import general_ledger_xlsx from . import general_ledger_xlsx

550
account_financial_report_qweb/report/aged_partner_balance.py

@ -0,0 +1,550 @@
# -*- coding: utf-8 -*-
# © 2016 Julien Coux (Camptocamp)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from openerp import models, fields, api
class AgedPartnerBalanceReport(models.TransientModel):
""" Here, we just define class fields.
For methods, go more bottom at this file.
"""
_name = 'report_aged_partner_balance_qweb'
date_at = fields.Date()
only_posted_moves = fields.Boolean()
company_id = fields.Many2one(comodel_name='res.company')
filter_account_ids = fields.Many2many(comodel_name='account.account')
filter_partner_ids = fields.Many2many(comodel_name='res.partner')
show_move_line_details = fields.Boolean()
open_invoice_id = fields.Many2one(comodel_name='report_open_invoice_qweb')
account_ids = fields.One2many(
comodel_name='report_aged_partner_balance_qweb_account',
inverse_name='report_id'
)
class AgedPartnerBalanceAccount(models.TransientModel):
_name = 'report_aged_partner_balance_qweb_account'
_order = 'code ASC'
report_id = fields.Many2one(
comodel_name='report_aged_partner_balance_qweb',
ondelete='cascade',
index=True
)
account_id = fields.Many2one(
'account.account',
index=True
)
code = fields.Char()
name = fields.Char()
cumul_amount_residual = fields.Float(digits=(16, 2))
cumul_current = fields.Float(digits=(16, 2))
cumul_age_30_days = fields.Float(digits=(16, 2))
cumul_age_60_days = fields.Float(digits=(16, 2))
cumul_age_90_days = fields.Float(digits=(16, 2))
cumul_age_120_days = fields.Float(digits=(16, 2))
cumul_older = fields.Float(digits=(16, 2))
percent_current = fields.Float(digits=(16, 2))
percent_age_30_days = fields.Float(digits=(16, 2))
percent_age_60_days = fields.Float(digits=(16, 2))
percent_age_90_days = fields.Float(digits=(16, 2))
percent_age_120_days = fields.Float(digits=(16, 2))
percent_older = fields.Float(digits=(16, 2))
partner_ids = fields.One2many(
comodel_name='report_aged_partner_balance_qweb_partner',
inverse_name='report_account_id'
)
class AgedPartnerBalancePartner(models.TransientModel):
_name = 'report_aged_partner_balance_qweb_partner'
report_account_id = fields.Many2one(
comodel_name='report_aged_partner_balance_qweb_account',
ondelete='cascade',
index=True
)
partner_id = fields.Many2one(
'res.partner',
index=True
)
name = fields.Char()
move_line_ids = fields.One2many(
comodel_name='report_aged_partner_balance_qweb_move_line',
inverse_name='report_partner_id'
)
line_ids = fields.One2many(
comodel_name='report_aged_partner_balance_qweb_line',
inverse_name='report_partner_id'
)
@api.model
def _generate_order_by(self, order_spec, query):
return """
ORDER BY
CASE
WHEN "report_aged_partner_balance_qweb_partner"."partner_id" IS NOT NULL
THEN 0
ELSE 1
END,
"report_aged_partner_balance_qweb_partner"."name"
"""
class AgedPartnerBalanceLine(models.TransientModel):
_name = 'report_aged_partner_balance_qweb_line'
report_partner_id = fields.Many2one(
comodel_name='report_aged_partner_balance_qweb_partner',
ondelete='cascade',
index=True
)
partner = fields.Char()
amount_residual = fields.Float(digits=(16, 2))
current = fields.Float(digits=(16, 2))
age_30_days = fields.Float(digits=(16, 2))
age_60_days = fields.Float(digits=(16, 2))
age_90_days = fields.Float(digits=(16, 2))
age_120_days = fields.Float(digits=(16, 2))
older = fields.Float(digits=(16, 2))
class AgedPartnerBalanceMoveLine(models.TransientModel):
_name = 'report_aged_partner_balance_qweb_move_line'
report_partner_id = fields.Many2one(
comodel_name='report_aged_partner_balance_qweb_partner',
ondelete='cascade',
index=True
)
move_line_id = fields.Many2one('account.move.line')
date = fields.Date()
date_due = fields.Date()
entry = fields.Char()
journal = fields.Char()
account = fields.Char()
partner = fields.Char()
label = fields.Char()
amount_residual = fields.Float(digits=(16, 2))
current = fields.Float(digits=(16, 2))
age_30_days = fields.Float(digits=(16, 2))
age_60_days = fields.Float(digits=(16, 2))
age_90_days = fields.Float(digits=(16, 2))
age_120_days = fields.Float(digits=(16, 2))
older = fields.Float(digits=(16, 2))
class AgedPartnerBalanceReportCompute(models.TransientModel):
_inherit = 'report_aged_partner_balance_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_aged_partner_balance_qweb',
'datas': {'ids': [self.id]},
}
@api.model
def compute_data_for_report(self):
self.ensure_one()
model = self.env['report_open_invoice_qweb']
self.open_invoice_id = model.create({
'date_at': self.date_at,
'only_posted_moves': self.only_posted_moves,
'company_id': self.company_id.id,
'filter_account_ids': [(6, 0, self.filter_account_ids.ids)],
'filter_partner_ids': [(6, 0, self.filter_partner_ids.ids)],
})
self.open_invoice_id.compute_data_for_report()
self.inject_account_values()
self.inject_partner_values()
self.inject_line_values()
self.inject_line_values(only_empty_partner_line=True)
if self.show_move_line_details:
self.inject_move_line_values()
self.inject_move_line_values(only_empty_partner_line=True)
self.compute_accounts_cumul()
def inject_account_values(self):
query_inject_account = """
INSERT INTO
report_aged_partner_balance_qweb_account
(
report_id,
create_uid,
create_date,
account_id,
code,
name
)
SELECT
%s AS report_id,
%s AS create_uid,
NOW() AS create_date,
rao.account_id,
rao.code,
rao.name
FROM
report_open_invoice_qweb_account rao
WHERE
rao.report_id = %s
"""
query_inject_account_params = (
self.id,
self.env.uid,
self.open_invoice_id.id,
)
self.env.cr.execute(query_inject_account, query_inject_account_params)
def inject_partner_values(self):
query_inject_partner = """
INSERT INTO
report_aged_partner_balance_qweb_partner
(
report_account_id,
create_uid,
create_date,
partner_id,
name
)
SELECT
ra.id AS report_account_id,
%s AS create_uid,
NOW() AS create_date,
rpo.partner_id,
rpo.name
FROM
report_open_invoice_qweb_partner rpo
INNER JOIN
report_open_invoice_qweb_account rao ON rpo.report_account_id = rao.id
INNER JOIN
report_aged_partner_balance_qweb_account ra ON rao.code = ra.code
WHERE
rao.report_id = %s
AND ra.report_id = %s
"""
query_inject_partner_params = (
self.env.uid,
self.open_invoice_id.id,
self.id,
)
self.env.cr.execute(query_inject_partner, query_inject_partner_params)
def inject_line_values(self, only_empty_partner_line=False):
query_inject_line = """
WITH
date_range AS
(
SELECT
%s AS date_current,
DATE %s - INTEGER '30' AS date_less_30_days,
DATE %s - INTEGER '60' AS date_less_60_days,
DATE %s - INTEGER '90' AS date_less_90_days,
DATE %s - INTEGER '120' AS date_less_120_days,
DATE %s - INTEGER '150' AS date_older
)
INSERT INTO
report_aged_partner_balance_qweb_line
(
report_partner_id,
partner,
amount_residual,
current,
age_30_days,
age_60_days,
age_90_days,
age_120_days,
older
)
SELECT
rp.id AS report_partner_id,
rp.name,
SUM(rlo.amount_residual) AS amount_residual,
SUM(
CASE
WHEN rlo.date_due > date_range.date_less_30_days
THEN rlo.amount_residual
END
) AS current,
SUM(
CASE
WHEN
rlo.date_due > date_range.date_less_60_days
AND rlo.date_due <= date_range.date_less_30_days
THEN rlo.amount_residual
END
) AS age_30_days,
SUM(
CASE
WHEN
rlo.date_due > date_range.date_less_90_days
AND rlo.date_due <= date_range.date_less_60_days
THEN rlo.amount_residual
END
) AS age_60_days,
SUM(
CASE
WHEN
rlo.date_due > date_range.date_less_120_days
AND rlo.date_due <= date_range.date_less_90_days
THEN rlo.amount_residual
END
) AS age_90_days,
SUM(
CASE
WHEN
rlo.date_due > date_range.date_older
AND rlo.date_due <= date_range.date_less_120_days
THEN rlo.amount_residual
END
) AS age_120_days,
SUM(
CASE
WHEN rlo.date_due <= date_range.date_older
THEN rlo.amount_residual
END
) AS older
FROM
date_range,
report_open_invoice_qweb_move_line rlo
INNER JOIN
report_open_invoice_qweb_partner rpo ON rlo.report_partner_id = rpo.id
INNER JOIN
report_open_invoice_qweb_account rao ON rpo.report_account_id = rao.id
INNER JOIN
report_aged_partner_balance_qweb_account ra ON rao.code = ra.code
INNER JOIN
report_aged_partner_balance_qweb_partner rp
ON
ra.id = rp.report_account_id
"""
if not only_empty_partner_line:
query_inject_line += """
AND rpo.partner_id = rp.partner_id
"""
elif only_empty_partner_line:
query_inject_line += """
AND rpo.partner_id IS NULL
AND rp.partner_id IS NULL
"""
query_inject_line += """
WHERE
rao.report_id = %s
AND ra.report_id = %s
GROUP BY
rp.id
"""
query_inject_line_params = (self.date_at,) * 6
query_inject_line_params += (
self.open_invoice_id.id,
self.id,
)
self.env.cr.execute(query_inject_line, query_inject_line_params)
def inject_move_line_values(self, only_empty_partner_line=False):
query_inject_move_line = """
WITH
date_range AS
(
SELECT
%s AS date_current,
DATE %s - INTEGER '30' AS date_less_30_days,
DATE %s - INTEGER '60' AS date_less_60_days,
DATE %s - INTEGER '90' AS date_less_90_days,
DATE %s - INTEGER '120' AS date_less_120_days,
DATE %s - INTEGER '150' AS date_older
)
INSERT INTO
report_aged_partner_balance_qweb_move_line
(
report_partner_id,
date,
date_due,
entry,
journal,
account,
partner,
label,
amount_residual,
current,
age_30_days,
age_60_days,
age_90_days,
age_120_days,
older
)
SELECT
rp.id AS report_partner_id,
rlo.date,
rlo.date_due,
rlo.entry,
rlo.journal,
rlo.account,
rlo.partner,
rlo.label,
rlo.amount_residual AS amount_residual,
CASE
WHEN rlo.date_due > date_range.date_less_30_days
THEN rlo.amount_residual
END AS current,
CASE
WHEN
rlo.date_due > date_range.date_less_60_days
AND rlo.date_due <= date_range.date_less_30_days
THEN rlo.amount_residual
END AS age_30_days,
CASE
WHEN
rlo.date_due > date_range.date_less_90_days
AND rlo.date_due <= date_range.date_less_60_days
THEN rlo.amount_residual
END AS age_60_days,
CASE
WHEN
rlo.date_due > date_range.date_less_120_days
AND rlo.date_due <= date_range.date_less_90_days
THEN rlo.amount_residual
END AS age_90_days,
CASE
WHEN
rlo.date_due > date_range.date_older
AND rlo.date_due <= date_range.date_less_120_days
THEN rlo.amount_residual
END AS age_120_days,
CASE
WHEN rlo.date_due <= date_range.date_older
THEN rlo.amount_residual
END AS older
FROM
date_range,
report_open_invoice_qweb_move_line rlo
INNER JOIN
report_open_invoice_qweb_partner rpo ON rlo.report_partner_id = rpo.id
INNER JOIN
report_open_invoice_qweb_account rao ON rpo.report_account_id = rao.id
INNER JOIN
report_aged_partner_balance_qweb_account ra ON rao.code = ra.code
INNER JOIN
report_aged_partner_balance_qweb_partner rp
ON
ra.id = rp.report_account_id
"""
if not only_empty_partner_line:
query_inject_move_line += """
AND rpo.partner_id = rp.partner_id
"""
elif only_empty_partner_line:
query_inject_move_line += """
AND rpo.partner_id IS NULL
AND rp.partner_id IS NULL
"""
query_inject_move_line += """
WHERE
rao.report_id = %s
AND ra.report_id = %s
"""
query_inject_move_line_params = (self.date_at,) * 6
query_inject_move_line_params += (
self.open_invoice_id.id,
self.id,
)
self.env.cr.execute(query_inject_move_line,
query_inject_move_line_params)
def compute_accounts_cumul(self):
query_compute_accounts_cumul = """
WITH
cumuls AS
(
SELECT
ra.id AS report_account_id,
SUM(rl.amount_residual) AS cumul_amount_residual,
SUM(rl.current) AS cumul_current,
SUM(rl.age_30_days) AS cumul_age_30_days,
SUM(rl.age_60_days) AS cumul_age_60_days,
SUM(rl.age_90_days) AS cumul_age_90_days,
SUM(rl.age_120_days) AS cumul_age_120_days,
SUM(rl.older) AS cumul_older
FROM
report_aged_partner_balance_qweb_line rl
INNER JOIN
report_aged_partner_balance_qweb_partner rp
ON rl.report_partner_id = rp.id
INNER JOIN
report_aged_partner_balance_qweb_account ra
ON rp.report_account_id = ra.id
WHERE
ra.report_id = %s
GROUP BY
ra.id
)
UPDATE
report_aged_partner_balance_qweb_account
SET
cumul_amount_residual = c.cumul_amount_residual,
cumul_current = c.cumul_current,
cumul_age_30_days = c.cumul_age_30_days,
cumul_age_60_days = c.cumul_age_60_days,
cumul_age_90_days = c.cumul_age_90_days,
cumul_age_120_days = c.cumul_age_120_days,
cumul_older = c.cumul_older,
percent_current =
CASE
WHEN c.cumul_amount_residual != 0
THEN 100 * c.cumul_current / c.cumul_amount_residual
END,
percent_age_30_days =
CASE
WHEN c.cumul_amount_residual != 0
THEN 100 * c.cumul_age_30_days / c.cumul_amount_residual
END,
percent_age_60_days =
CASE
WHEN c.cumul_amount_residual != 0
THEN 100 * c.cumul_age_60_days / c.cumul_amount_residual
END,
percent_age_90_days =
CASE
WHEN c.cumul_amount_residual != 0
THEN 100 * c.cumul_age_90_days / c.cumul_amount_residual
END,
percent_age_120_days =
CASE
WHEN c.cumul_amount_residual != 0
THEN 100 * c.cumul_age_120_days / c.cumul_amount_residual
END,
percent_older =
CASE
WHEN c.cumul_amount_residual != 0
THEN 100 * c.cumul_older / c.cumul_amount_residual
END
FROM
cumuls c
WHERE
id = c.report_account_id
"""
params_compute_accounts_cumul = (self.id,)
self.env.cr.execute(query_compute_accounts_cumul,
params_compute_accounts_cumul)

292
account_financial_report_qweb/report/templates/aged_partner_balance.xml

@ -0,0 +1,292 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="account_financial_report_qweb.report_aged_partner_balance_qweb">
<t t-call="report.html_container">
<t t-foreach="docs" t-as="o">
<t t-set="show_move_line_details" t-value="o.show_move_line_details"/>
<t t-call="account_financial_report_qweb.internal_layout">
<t t-set="title" t-value='"Aged Partner Balance"'/>
<t t-set="company_name" t-value="o.company_id.name"/>
<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 at filter</div>
<div class="act_as_cell">Target moves filter</div>
</div>
<div class="act_as_row">
<div class="act_as_cell">
<span t-field="o.date_at"/>
</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>
</div>
<t t-foreach="o.account_ids" t-as="account">
<div class="page_break">
<div class="act_as_table list_table" style="margin-top: 10px;"/>
<div class="act_as_caption account_title" style="width: 1141px !important;">
<span t-field="account.code"/> - <span t-field="account.name"/>
</div>
<t t-if="not show_move_line_details">
<div class="act_as_table data_table" style="width: 1140px !important;">
<t t-call="account_financial_report_qweb.report_aged_partner_balance_qweb_lines_header"/>
<t t-foreach="account.partner_ids" t-as="partner">
<t t-call="account_financial_report_qweb.report_aged_partner_balance_qweb_lines"/>
</t>
</div>
<t t-call="account_financial_report_qweb.report_aged_partner_balance_qweb_account_ending_cumul"/>
</t>
<t t-if="show_move_line_details">
<t t-foreach="account.partner_ids" t-as="partner">
<div class="page_break">
<div class="act_as_caption account_title">
<span t-field="partner.name"/>
</div>
<t t-call="account_financial_report_qweb.report_aged_partner_balance_qweb_move_lines"/>
<t t-call="account_financial_report_qweb.report_aged_partner_balance_qweb_partner_ending_cumul">
<t t-set="partner_cumul_line" t-value="partner.line_ids"/>
</t>
</div>
</t>
<t t-call="account_financial_report_qweb.report_aged_partner_balance_qweb_account_ending_cumul"/>
</t>
</div>
</t>
</div>
</t>
</t>
</t>
</template>
<template id="account_financial_report_qweb.report_aged_partner_balance_qweb_lines_header">
<div class="act_as_thead">
<div class="act_as_row labels">
<!--## partner-->
<div class="act_as_cell" style="width: 370px;">Partner</div>
<!--## amount_residual-->
<div class="act_as_cell" style="width: 110px;">Residual</div>
<!--## current-->
<div class="act_as_cell" style="width: 110px;">Current</div>
<!--## age_30_days-->
<div class="act_as_cell" style="width: 110px;">Age ≤ 30 d.</div>
<!--## age_60_days-->
<div class="act_as_cell" style="width: 110px;">Age ≤ 60 d.</div>
<!--## age_90_days-->
<div class="act_as_cell" style="width: 110px;">Age ≤ 90 d.</div>
<!--## age_120_days-->
<div class="act_as_cell" style="width: 110px;">Age ≤ 120 d.</div>
<!--## older-->
<div class="act_as_cell" style="width: 110px;">Older</div>
</div>
</div>
</template>
<template id="account_financial_report_qweb.report_aged_partner_balance_qweb_lines">
<t t-foreach="partner.line_ids" t-as="line">
<!-- # lines -->
<div class="act_as_row lines">
<!--## partner-->
<div class="act_as_cell left"><span t-field="line.partner"/></div>
<!--## amount_residual-->
<div class="act_as_cell amount"><span t-field="line.amount_residual"/></div>
<!--## current-->
<div class="act_as_cell amount"><span t-field="line.current"/></div>
<!--## age_30_days-->
<div class="act_as_cell amount"><span t-field="line.age_30_days"/></div>
<!--## age_60_days-->
<div class="act_as_cell amount"><span t-field="line.age_60_days"/></div>
<!--## age_90_days-->
<div class="act_as_cell amount"><span t-field="line.age_90_days"/></div>
<!--## age_120_days-->
<div class="act_as_cell amount"><span t-field="line.age_120_days"/></div>
<!--## older-->
<div class="act_as_cell amount"><span t-field="line.older"/></div>
</div>
</t>
</template>
<template id="account_financial_report_qweb.report_aged_partner_balance_qweb_move_lines">
<div class="act_as_table data_table" style="width: 1140px !important;">
<div class="act_as_thead">
<div class="act_as_row labels">
<!--## date-->
<div class="act_as_cell first_column" style="width: 60px;">Date</div>
<!--## move-->
<div class="act_as_cell" style="width: 100px;">Entry</div>
<!--## journal-->
<div class="act_as_cell" style="width: 40px;">Journal</div>
<!--## account code-->
<div class="act_as_cell" style="width: 50px;">Account</div>
<!--## partner-->
<div class="act_as_cell" style="width: 120px;">Partner</div>
<!--## ref - label-->
<div class="act_as_cell" style="width: 220px;">Ref - Label</div>
<!--## date_due-->
<div class="act_as_cell" style="width: 60px;">Due date</div>
<!--## amount_residual-->
<div class="act_as_cell" style="width: 70px;">Residual</div>
<!--## current-->
<div class="act_as_cell" style="width: 70px;">Current</div>
<!--## age_30_days-->
<div class="act_as_cell" style="width: 70px;">Age ≤ 30 d.</div>
<!--## age_60_days-->
<div class="act_as_cell" style="width: 70px;">Age ≤ 60 d.</div>
<!--## age_90_days-->
<div class="act_as_cell" style="width: 70px;">Age ≤ 90 d.</div>
<!--## age_120_days-->
<div class="act_as_cell" style="width: 70px;">Age ≤ 120 d.</div>
<!--## older-->
<div class="act_as_cell" style="width: 70px;">Older</div>
</div>
</div>
<t t-foreach="partner.move_line_ids" t-as="line">
<!-- # lines or centralized lines -->
<div class="act_as_row lines">
<!--## date-->
<div class="act_as_cell left"><span t-field="line.date"/></div>
<!--## move-->
<div class="act_as_cell left"><span t-field="line.entry"/></div>
<!--## journal-->
<div class="act_as_cell left"><span t-field="line.journal"/></div>
<!--## account code-->
<div class="act_as_cell left"><span t-field="line.account"/></div>
<!--## partner-->
<div class="act_as_cell left"><span t-field="line.partner"/></div>
<!--## ref - label-->
<div class="act_as_cell left"><span t-field="line.label"/></div>
<!--## date_due-->
<div class="act_as_cell left"><span t-field="line.date_due"/></div>
<!--## amount_residual-->
<div class="act_as_cell amount"><span t-field="line.amount_residual"/></div>
<!--## current-->
<div class="act_as_cell amount"><span t-field="line.current"/></div>
<!--## age_30_days-->
<div class="act_as_cell amount"><span t-field="line.age_30_days"/></div>
<!--## age_60_days-->
<div class="act_as_cell amount"><span t-field="line.age_60_days"/></div>
<!--## age_90_days-->
<div class="act_as_cell amount"><span t-field="line.age_90_days"/></div>
<!--## age_120_days-->
<div class="act_as_cell amount"><span t-field="line.age_120_days"/></div>
<!--## older-->
<div class="act_as_cell amount"><span t-field="line.older"/></div>
</div>
</t>
</div>
</template>
<template id="account_financial_report_qweb.report_aged_partner_balance_qweb_partner_ending_cumul">
<div class="act_as_table list_table" style="width: 1141px !important;">
<div class="act_as_row labels" style="font-weight: bold;">
<!--## date-->
<div class="act_as_cell right" style="width: 590px;">Partner cumul aged balance</div>
<!--## date_due-->
<div class="act_as_cell" style="width: 60px;"/>
<!--## amount_residual-->
<div class="act_as_cell amount" style="width: 70px;"><span t-field="partner_cumul_line.amount_residual"/></div>
<!--## current-->
<div class="act_as_cell amount" style="width: 70px;"><span t-field="partner_cumul_line.current"/></div>
<!--## age_30_days-->
<div class="act_as_cell amount" style="width: 70px;"><span t-field="partner_cumul_line.age_30_days"/></div>
<!--## age_60_days-->
<div class="act_as_cell amount" style="width: 70px;"><span t-field="partner_cumul_line.age_60_days"/></div>
<!--## age_90_days-->
<div class="act_as_cell amount" style="width: 70px;"><span t-field="partner_cumul_line.age_90_days"/></div>
<!--## age_120_days-->
<div class="act_as_cell amount" style="width: 70px;"><span t-field="partner_cumul_line.age_120_days"/></div>
<!--## older-->
<div class="act_as_cell amount" style="width: 70px;"><span t-field="partner_cumul_line.older"/></div>
</div>
</div>
</template>
<template id="account_financial_report_qweb.report_aged_partner_balance_qweb_account_ending_cumul">
<div class="act_as_table list_table" style="width: 1141px !important;">
<div class="act_as_row labels" style="font-weight: bold;">
<t t-if="not show_move_line_details">
<!--## total-->
<div class="act_as_cell right" style="width: 370px;">Total</div>
<!--## amount_residual-->
<div class="act_as_cell amount" style="width: 110px;"><span t-field="account.cumul_amount_residual"/></div>
<!--## current-->
<div class="act_as_cell amount" style="width: 110px;"><span t-field="account.cumul_current"/></div>
<!--## age_30_days-->
<div class="act_as_cell amount" style="width: 110px;"><span t-field="account.cumul_age_30_days"/></div>
<!--## age_60_days-->
<div class="act_as_cell amount" style="width: 110px;"><span t-field="account.cumul_age_60_days"/></div>
<!--## age_90_days-->
<div class="act_as_cell amount" style="width: 110px;"><span t-field="account.cumul_age_90_days"/></div>
<!--## age_120_days-->
<div class="act_as_cell amount" style="width: 110px;"><span t-field="account.cumul_age_120_days"/></div>
<!--## older-->
<div class="act_as_cell amount" style="width: 110px;"><span t-field="account.cumul_older"/></div>
</t>
<t t-if="show_move_line_details">
<!--## total-->
<div class="act_as_cell right" style="width: 590px;">Total</div>
<!--## date_due-->
<div class="act_as_cell" style="width: 60px;"/>
<!--## amount_residual-->
<div class="act_as_cell amount" style="width: 70px;"><span t-field="account.cumul_amount_residual"/></div>
<!--## current-->
<div class="act_as_cell amount" style="width: 70px;"><span t-field="account.cumul_current"/></div>
<!--## age_30_days-->
<div class="act_as_cell amount" style="width: 70px;"><span t-field="account.cumul_age_30_days"/></div>
<!--## age_60_days-->
<div class="act_as_cell amount" style="width: 70px;"><span t-field="account.cumul_age_60_days"/></div>
<!--## age_90_days-->
<div class="act_as_cell amount" style="width: 70px;"><span t-field="account.cumul_age_90_days"/></div>
<!--## age_120_days-->
<div class="act_as_cell amount" style="width: 70px;"><span t-field="account.cumul_age_120_days"/></div>
<!--## older-->
<div class="act_as_cell amount" style="width: 70px;"><span t-field="account.cumul_older"/></div>
</t>
</div>
<div class="act_as_row" style="font-weight: bold; font-style: italic;">
<t t-if="not show_move_line_details">
<!--## total-->
<div class="act_as_cell right" style="width: 370px;">Percents</div>
<!--## amount_residual-->
<div class="act_as_cell amount" style="width: 110px;"></div>
<!--## current-->
<div class="act_as_cell amount" style="width: 110px;"><span t-field="account.percent_current"/>%</div>
<!--## age_30_days-->
<div class="act_as_cell amount" style="width: 110px;"><span t-field="account.percent_age_30_days"/>%</div>
<!--## age_60_days-->
<div class="act_as_cell amount" style="width: 110px;"><span t-field="account.percent_age_60_days"/>%</div>
<!--## age_90_days-->
<div class="act_as_cell amount" style="width: 110px;"><span t-field="account.percent_age_90_days"/>%</div>
<!--## age_120_days-->
<div class="act_as_cell amount" style="width: 110px;"><span t-field="account.percent_age_120_days"/>%</div>
<!--## older-->
<div class="act_as_cell amount" style="width: 110px;"><span t-field="account.percent_older"/>%</div>
</t>
<t t-if="show_move_line_details">
<!--## total-->
<div class="act_as_cell right" style="width: 590px;">Percents</div>
<!--## date_due-->
<div class="act_as_cell" style="width: 60px;"/>
<!--## amount_residual-->
<div class="act_as_cell amount" style="width: 70px;"></div>
<!--## current-->
<div class="act_as_cell amount" style="width: 70px;"><span t-field="account.percent_current"/>%</div>
<!--## age_30_days-->
<div class="act_as_cell amount" style="width: 70px;"><span t-field="account.percent_age_30_days"/>%</div>
<!--## age_60_days-->
<div class="act_as_cell amount" style="width: 70px;"><span t-field="account.percent_age_60_days"/>%</div>
<!--## age_90_days-->
<div class="act_as_cell amount" style="width: 70px;"><span t-field="account.percent_age_90_days"/>%</div>
<!--## age_120_days-->
<div class="act_as_cell amount" style="width: 70px;"><span t-field="account.percent_age_120_days"/>%</div>
<!--## older-->
<div class="act_as_cell amount" style="width: 70px;"><span t-field="account.percent_older"/>%</div>
</t>
</div>
</div>
</template>
</odoo>

13
account_financial_report_qweb/reports.xml

@ -20,6 +20,15 @@
file="account_financial_report_qweb.report_open_invoice_qweb" file="account_financial_report_qweb.report_open_invoice_qweb"
/> />
<report
id="action_report_aged_partner_balance_qweb"
model="report_aged_partner_balance_qweb"
string="Aged Partner Balance"
report_type="qweb-pdf"
name="account_financial_report_qweb.report_aged_partner_balance_qweb"
file="account_financial_report_qweb.report_aged_partner_balance_qweb"
/>
<record id="general_ledger_xls_export" model="ir.actions.report.xml"> <record id="general_ledger_xls_export" model="ir.actions.report.xml">
<field name="name">General Ledger XLSX report</field> <field name="name">General Ledger XLSX report</field>
<field name="model">ledger.report.wizard</field> <field name="model">ledger.report.wizard</field>
@ -53,5 +62,9 @@
<field name="paperformat_id" ref="report_qweb_paperformat"/> <field name="paperformat_id" ref="report_qweb_paperformat"/>
</record> </record>
<record id="action_report_aged_partner_balance_qweb" model="ir.actions.report.xml">
<field name="paperformat_id" ref="report_qweb_paperformat"/>
</record>
</data> </data>
</openerp> </openerp>

93
account_financial_report_qweb/wizard/aged_partner_balance_wizard.py

@ -1,66 +1,75 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Author: Damien Crier, Andrea Stirpe, Kevin Graveman, Dennis Sluijk # Author: Damien Crier, Andrea Stirpe, Kevin Graveman, Dennis Sluijk
# Author: Julien Coux
# Copyright 2016 Camptocamp SA, Onestein B.V. # Copyright 2016 Camptocamp SA, Onestein B.V.
# 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 datetime import datetime from datetime import datetime
from openerp.exceptions import Warning as UserError
from openerp import api, fields, models from openerp import api, fields, models
class AccountAgedTrialBalance(models.TransientModel):
class AgedPartnerBalance(models.TransientModel):
"""Aged partner balance report wizard."""
_name = 'account.aged.trial.balance.wizard'
_description = 'Aged partner balanced'
_name = 'aged.partner.balance.wizard'
_description = 'Aged Partner Balance Wizard'
company_id = fields.Many2one( company_id = fields.Many2one(
'res.company',
string='Company',
required=True,
default=lambda s: s.env.user.company_id
comodel_name='res.company',
default=lambda self: self.env.user.company_id
) )
date_at = fields.Date(required=True,
default=fields.Date.to_string(datetime.today()))
target_move = fields.Selection([('posted', 'All Posted Entries'), target_move = fields.Selection([('posted', 'All Posted Entries'),
('all', 'All Entries')], ('all', 'All Entries')],
string='Target Moves', string='Target Moves',
required=True, required=True,
default='posted')
result_selection = fields.Selection(
[('customer', 'Receivable Accounts'),
('supplier', 'Payable Accounts'),
('customer_supplier', 'Receivable and Payable Accounts')
],
string="Partner's",
default='customer')
default='all')
account_ids = fields.Many2many(
comodel_name='account.account',
string='Filter accounts',
)
receivable_accounts_only = fields.Boolean()
payable_accounts_only = fields.Boolean()
partner_ids = fields.Many2many( partner_ids = fields.Many2many(
'res.partner',
comodel_name='res.partner',
string='Filter partners', string='Filter partners',
) )
at_date = fields.Date(
required=True,
default=fields.Date.to_string(datetime.today()))
until_date = fields.Date(
"Clearance date", required=True,
help="""The clearance date is essentially a tool used for debtors
provisionning calculation.
By default, this date is equal to the the end date (
ie: 31/12/2011 if you select fy 2011).
By amending the clearance date, you will be, for instance,
able to answer the question : 'based on my last
year end debtors open invoices, which invoices are still
unpaid today (today is my clearance date)?'""")
show_move_line_details = fields.Boolean()
@api.onchange('at_date')
def onchange_atdate(self):
self.until_date = self.at_date
@api.onchange('date_range_id')
def onchange_date_range_id(self):
"""Handle date range change."""
self.date_at = self.date_range_id.date_end
if self.date_range_id.date_start:
self.fy_start_date = self.env.user.company_id.find_daterange_fy(
fields.Date.from_string(self.date_range_id.date_start)
).date_start
@api.onchange('until_date')
def onchange_untildate(self):
# ---- until_date must be always >= of at_date
if self.until_date:
if self.until_date < self.at_date:
raise UserError(
'Until Date must be equal or greater than At Date')
@api.onchange('receivable_accounts_only', 'payable_accounts_only')
def onchange_type_accounts_only(self):
"""Handle receivable/payable accounts only change."""
if self.receivable_accounts_only or self.payable_accounts_only:
domain = []
if self.receivable_accounts_only and self.payable_accounts_only:
domain += [('internal_type', 'in', ('receivable', 'payable'))]
elif self.receivable_accounts_only:
domain += [('internal_type', '=', 'receivable')]
elif self.payable_accounts_only:
domain += [('internal_type', '=', 'payable')]
self.account_ids = self.env['account.account'].search(domain)
else:
self.account_ids = None
@api.multi @api.multi
def check_report(self):
return True
def button_export_pdf(self):
model = self.env['report_aged_partner_balance_qweb']
report = model.create({
'date_at': self.date_at,
'only_posted_moves': self.target_move == 'posted',
'company_id': self.company_id.id,
'filter_account_ids': [(6, 0, self.account_ids.ids)],
'filter_partner_ids': [(6, 0, self.partner_ids.ids)],
'show_move_line_details': self.show_move_line_details,
})
return report.print_report()

40
account_financial_report_qweb/wizard/aged_partner_balance_wizard_view.xml

@ -2,31 +2,35 @@
<openerp> <openerp>
<data> <data>
<record id="account_aged_trial_balance_wizard" model="ir.ui.view">
<field name="name">Aged Partner Balance Report</field>
<field name="model">account.aged.trial.balance.wizard</field>
<!-- AGED PARTNER BALANCE -->
<record id="aged_partner_balance_wizard" model="ir.ui.view">
<field name="name">Aged Partner Balance</field>
<field name="model">aged.partner.balance.wizard</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form> <form>
<group name="main_info"> <group name="main_info">
<field name="company_id"/>
<field name="company_id" groups="base.group_multi_company"/>
</group> </group>
<group name="date_info">
<field name="at_date"/>
<field name="until_date"/>
<group name="filters">
<group name="date_ranger">
<field name="date_at"/>
</group> </group>
<group name="other_filters"> <group name="other_filters">
<group name="moves">
<field name="target_move" widget="radio"/> <field name="target_move" widget="radio"/>
</group>
<group name="result_select">
<field name="result_selection" widget="radio"/>
<field name="show_move_line_details"/>
</group> </group>
</group> </group>
<group name="partner_info">
<field name="partner_ids"/>
<label for="partner_ids"/>
<field name="partner_ids" nolabel="1"/>
<group/>
<label for="account_ids"/>
<group col="4">
<field name="receivable_accounts_only"/>
<field name="payable_accounts_only"/>
</group> </group>
<field name="account_ids" nolabel="1"/>
<footer> <footer>
<button name="check_report" string="Print" type="object" default_focus="1" class="oe_highlight"/>
<button name="button_export_pdf" string="Export PDF" type="object" default_focus="1" class="oe_highlight"/>
or or
<button string="Cancel" class="oe_link" special="cancel" /> <button string="Cancel" class="oe_link" special="cancel" />
</footer> </footer>
@ -34,15 +38,15 @@
</field> </field>
</record> </record>
<record id="action_account_aged_trial_balance_wizard"
model="ir.actions.act_window">
<record id="action_aged_partner_balance_wizard" model="ir.actions.act_window">
<field name="name">Aged Partner Balance</field> <field name="name">Aged Partner Balance</field>
<field name="type">ir.actions.act_window</field> <field name="type">ir.actions.act_window</field>
<field name="res_model">account.aged.trial.balance.wizard</field>
<field name="res_model">aged.partner.balance.wizard</field>
<field name="view_type">form</field> <field name="view_type">form</field>
<field name="view_mode">form</field> <field name="view_mode">form</field>
<field name="view_id" ref="account_aged_trial_balance_wizard"/>
<field name="view_id" ref="aged_partner_balance_wizard"/>
<field name="target">new</field> <field name="target">new</field>
</record> </record>
</data> </data>
</openerp> </openerp>
Loading…
Cancel
Save