jcoux
8 years ago
8 changed files with 934 additions and 64 deletions
-
1account_financial_report_qweb/__openerp__.py
-
4account_financial_report_qweb/menuitems.xml
-
1account_financial_report_qweb/report/__init__.py
-
550account_financial_report_qweb/report/aged_partner_balance.py
-
292account_financial_report_qweb/report/templates/aged_partner_balance.xml
-
13account_financial_report_qweb/reports.xml
-
93account_financial_report_qweb/wizard/aged_partner_balance_wizard.py
-
44account_financial_report_qweb/wizard/aged_partner_balance_wizard_view.xml
@ -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) |
@ -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> |
@ -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() |
Write
Preview
Loading…
Cancel
Save
Reference in new issue