Browse Source

[FIX] Consider reconciled_date and fix aging report

pull/392/head
mreficent 7 years ago
parent
commit
2f0baa9cb1
  1. 2
      customer_outstanding_statement/__manifest__.py
  2. 109
      customer_outstanding_statement/report/customer_outstanding_statement.py
  3. 9
      customer_outstanding_statement/views/statement.xml

2
customer_outstanding_statement/__manifest__.py

@ -5,7 +5,7 @@
{ {
'name': 'Customer Outstanding Statement', 'name': 'Customer Outstanding Statement',
'version': '10.0.1.0.0',
'version': '10.0.1.1.0',
'category': 'Accounting & Finance', 'category': 'Accounting & Finance',
'summary': 'OCA Financial Reports', 'summary': 'OCA Financial Reports',
'author': "Eficent, Odoo Community Association (OCA)", 'author': "Eficent, Odoo Community Association (OCA)",

109
customer_outstanding_statement/report/customer_outstanding_statement.py

@ -19,6 +19,31 @@ class CustomerOutstandingStatement(models.AbstractModel):
date = datetime.strptime(str_date, DEFAULT_SERVER_DATE_FORMAT).date() date = datetime.strptime(str_date, DEFAULT_SERVER_DATE_FORMAT).date()
return date.strftime(lang.date_format) return date.strftime(lang.date_format)
def _display_lines_sql_q0(self, date_end):
return """
SELECT l1.id,
CASE WHEN l1.reconciled = TRUE and l1.balance > 0.0
THEN max(pd.max_date)
WHEN l1.reconciled = TRUE and l1.balance < 0.0
THEN max(pc.max_date)
ELSE null
END as reconciled_date
FROM account_move_line l1
LEFT JOIN (SELECT pr.*
FROM account_partial_reconcile pr
INNER JOIN account_move_line l2
ON pr.credit_move_id = l2.id
WHERE l2.date <= '%s'
) as pd ON pd.debit_move_id = l1.id
LEFT JOIN (SELECT pr.*
FROM account_partial_reconcile pr
INNER JOIN account_move_line l2
ON pr.debit_move_id = l2.id
WHERE l2.date <= '%s'
) as pc ON pc.credit_move_id = l1.id
GROUP BY l1.id
""" % (date_end, date_end)
def _display_lines_sql_q1(self, partners, date_end): def _display_lines_sql_q1(self, partners, date_end):
return """ return """
SELECT m.name as move_id, l.partner_id, l.date, l.name, SELECT m.name as move_id, l.partner_id, l.date, l.name,
@ -46,6 +71,7 @@ class CustomerOutstandingStatement(models.AbstractModel):
FROM account_move_line l FROM account_move_line l
JOIN account_account_type at ON (at.id = l.user_type_id) JOIN account_account_type at ON (at.id = l.user_type_id)
JOIN account_move m ON (l.move_id = m.id) JOIN account_move m ON (l.move_id = m.id)
LEFT JOIN Q0 ON Q0.id = l.id
LEFT JOIN (SELECT pr.* LEFT JOIN (SELECT pr.*
FROM account_partial_reconcile pr FROM account_partial_reconcile pr
INNER JOIN account_move_line l2 INNER JOIN account_move_line l2
@ -59,11 +85,13 @@ class CustomerOutstandingStatement(models.AbstractModel):
WHERE l2.date <= '%s' WHERE l2.date <= '%s'
) as pc ON pc.credit_move_id = l.id ) as pc ON pc.credit_move_id = l.id
WHERE l.partner_id IN (%s) AND at.type = 'receivable' WHERE l.partner_id IN (%s) AND at.type = 'receivable'
AND not l.reconciled AND l.date <= '%s'
AND (Q0.reconciled_date is null or
Q0.reconciled_date > '%s')
AND l.date <= '%s'
GROUP BY l.partner_id, m.name, l.date, l.date_maturity, l.name, GROUP BY l.partner_id, m.name, l.date, l.date_maturity, l.name,
l.ref, l.blocked, l.currency_id, l.ref, l.blocked, l.currency_id,
l.balance, l.amount_currency, l.company_id l.balance, l.amount_currency, l.company_id
""" % (date_end, date_end, partners, date_end)
""" % (date_end, date_end, partners, date_end, date_end)
def _display_lines_sql_q2(self): def _display_lines_sql_q2(self):
return """ return """
@ -91,11 +119,14 @@ class CustomerOutstandingStatement(models.AbstractModel):
partners = ', '.join([str(i) for i in partner_ids]) partners = ', '.join([str(i) for i in partner_ids])
date_end = datetime.strptime( date_end = datetime.strptime(
date_end, DEFAULT_SERVER_DATE_FORMAT).date() date_end, DEFAULT_SERVER_DATE_FORMAT).date()
self.env.cr.execute("""WITH Q1 AS (%s), Q2 AS (%s), Q3 AS (%s)
# pylint: disable=E8103
self.env.cr.execute("""
WITH Q0 as (%s), Q1 AS (%s), Q2 AS (%s), Q3 AS (%s)
SELECT partner_id, currency_id, move_id, date, date_maturity, debit, SELECT partner_id, currency_id, move_id, date, date_maturity, debit,
credit, amount, open_amount, name, ref, blocked credit, amount, open_amount, name, ref, blocked
FROM Q3 FROM Q3
ORDER BY date, date_maturity, move_id""" % ( ORDER BY date, date_maturity, move_id""" % (
self._display_lines_sql_q0(date_end),
self._display_lines_sql_q1(partners, date_end), self._display_lines_sql_q1(partners, date_end),
self._display_lines_sql_q2(), self._display_lines_sql_q2(),
self._display_lines_sql_q3(company_id))) self._display_lines_sql_q3(company_id)))
@ -103,6 +134,31 @@ class CustomerOutstandingStatement(models.AbstractModel):
res[row.pop('partner_id')].append(row) res[row.pop('partner_id')].append(row)
return res return res
def _show_buckets_sql_q0(self, date_end):
return """
SELECT l1.id,
CASE WHEN l1.reconciled = TRUE and l1.balance > 0.0
THEN max(pd.max_date)
WHEN l1.reconciled = TRUE and l1.balance < 0.0
THEN max(pc.max_date)
ELSE null
END as reconciled_date
FROM account_move_line l1
LEFT JOIN (SELECT pr.*
FROM account_partial_reconcile pr
INNER JOIN account_move_line l2
ON pr.credit_move_id = l2.id
WHERE l2.date <= '%s'
) as pd ON pd.debit_move_id = l1.id
LEFT JOIN (SELECT pr.*
FROM account_partial_reconcile pr
INNER JOIN account_move_line l2
ON pr.debit_move_id = l2.id
WHERE l2.date <= '%s'
) as pc ON pc.credit_move_id = l1.id
GROUP BY l1.id
""" % (date_end, date_end)
def _show_buckets_sql_q1(self, partners, date_end): def _show_buckets_sql_q1(self, partners, date_end):
return """ return """
SELECT l.partner_id, l.currency_id, l.company_id, l.move_id, SELECT l.partner_id, l.currency_id, l.company_id, l.move_id,
@ -121,6 +177,7 @@ class CustomerOutstandingStatement(models.AbstractModel):
FROM account_move_line l FROM account_move_line l
JOIN account_account_type at ON (at.id = l.user_type_id) JOIN account_account_type at ON (at.id = l.user_type_id)
JOIN account_move m ON (l.move_id = m.id) JOIN account_move m ON (l.move_id = m.id)
LEFT JOIN Q0 ON Q0.id = l.id
LEFT JOIN (SELECT pr.* LEFT JOIN (SELECT pr.*
FROM account_partial_reconcile pr FROM account_partial_reconcile pr
INNER JOIN account_move_line l2 INNER JOIN account_move_line l2
@ -134,13 +191,15 @@ class CustomerOutstandingStatement(models.AbstractModel):
WHERE l2.date <= '%s' WHERE l2.date <= '%s'
) as pc ON pc.credit_move_id = l.id ) as pc ON pc.credit_move_id = l.id
WHERE l.partner_id IN (%s) AND at.type = 'receivable' WHERE l.partner_id IN (%s) AND at.type = 'receivable'
AND not l.reconciled AND not l.blocked
AND (Q0.reconciled_date is null or
Q0.reconciled_date > '%s')
AND l.date <= '%s' AND not l.blocked
GROUP BY l.partner_id, l.currency_id, l.date, l.date_maturity, GROUP BY l.partner_id, l.currency_id, l.date, l.date_maturity,
l.amount_currency, l.balance, l.move_id, l.amount_currency, l.balance, l.move_id,
l.company_id l.company_id
""" % (date_end, date_end, partners)
""" % (date_end, date_end, partners, date_end, date_end)
def _show_buckets_sql_q2(self, today, minus_30, minus_60, minus_90,
def _show_buckets_sql_q2(self, date_end, minus_30, minus_60, minus_90,
minus_120): minus_120):
return """ return """
SELECT partner_id, currency_id, date_maturity, open_due, SELECT partner_id, currency_id, date_maturity, open_due,
@ -194,10 +253,10 @@ class CustomerOutstandingStatement(models.AbstractModel):
FROM Q1 FROM Q1
GROUP BY partner_id, currency_id, date_maturity, open_due, GROUP BY partner_id, currency_id, date_maturity, open_due,
open_due_currency, move_id, company_id open_due_currency, move_id, company_id
""" % (today, today, minus_30, today, minus_30, today, minus_60,
minus_30, minus_60, minus_30, minus_90, minus_60, minus_90,
minus_60, minus_120, minus_90, minus_120, minus_90, minus_120,
minus_120)
""" % (date_end, date_end, minus_30, date_end, minus_30, date_end,
minus_60, minus_30, minus_60, minus_30, minus_90, minus_60,
minus_90, minus_60, minus_120, minus_90, minus_120, minus_90,
minus_120, minus_120)
def _show_buckets_sql_q3(self, company_id): def _show_buckets_sql_q3(self, company_id):
return """ return """
@ -221,12 +280,13 @@ class CustomerOutstandingStatement(models.AbstractModel):
GROUP BY partner_id, currency_id GROUP BY partner_id, currency_id
""" """
_bucket_dates = {
'today': fields.date.today(),
'minus_30': fields.date.today() - timedelta(days=30),
'minus_60': fields.date.today() - timedelta(days=60),
'minus_90': fields.date.today() - timedelta(days=90),
'minus_120': fields.date.today() - timedelta(days=120),
def _get_bucket_dates(self, date_end):
return {
'date_end': date_end,
'minus_30': date_end - timedelta(days=30),
'minus_60': date_end - timedelta(days=60),
'minus_90': date_end - timedelta(days=90),
'minus_120': date_end - timedelta(days=120),
} }
def _get_account_show_buckets(self, company_id, partner_ids, date_end): def _get_account_show_buckets(self, company_id, partner_ids, date_end):
@ -234,8 +294,10 @@ class CustomerOutstandingStatement(models.AbstractModel):
partners = ', '.join([str(i) for i in partner_ids]) partners = ', '.join([str(i) for i in partner_ids])
date_end = datetime.strptime( date_end = datetime.strptime(
date_end, DEFAULT_SERVER_DATE_FORMAT).date() date_end, DEFAULT_SERVER_DATE_FORMAT).date()
self.env.cr.execute("""WITH Q1 AS (%s), Q2 AS (%s),
Q3 AS (%s), Q4 AS (%s)
full_dates = self._get_bucket_dates(date_end)
# pylint: disable=E8103
self.env.cr.execute("""
WITH Q0 AS (%s), Q1 AS (%s), Q2 AS (%s), Q3 AS (%s), Q4 AS (%s)
SELECT partner_id, currency_id, current, b_1_30, b_30_60, b_60_90, SELECT partner_id, currency_id, current, b_1_30, b_30_60, b_60_90,
b_90_120, b_over_120, b_90_120, b_over_120,
current+b_1_30+b_30_60+b_60_90+b_90_120+b_over_120 current+b_1_30+b_30_60+b_60_90+b_90_120+b_over_120
@ -243,13 +305,14 @@ class CustomerOutstandingStatement(models.AbstractModel):
FROM Q4 FROM Q4
GROUP BY partner_id, currency_id, current, b_1_30, b_30_60, b_60_90, GROUP BY partner_id, currency_id, current, b_1_30, b_30_60, b_60_90,
b_90_120, b_over_120""" % ( b_90_120, b_over_120""" % (
self._show_buckets_sql_q0(date_end),
self._show_buckets_sql_q1(partners, date_end), self._show_buckets_sql_q1(partners, date_end),
self._show_buckets_sql_q2( self._show_buckets_sql_q2(
self._bucket_dates['today'],
self._bucket_dates['minus_30'],
self._bucket_dates['minus_60'],
self._bucket_dates['minus_90'],
self._bucket_dates['minus_120']),
full_dates['date_end'],
full_dates['minus_30'],
full_dates['minus_60'],
full_dates['minus_90'],
full_dates['minus_120']),
self._show_buckets_sql_q3(company_id), self._show_buckets_sql_q3(company_id),
self._show_buckets_sql_q4())) self._show_buckets_sql_q4()))
for row in self.env.cr.dictfetchall(): for row in self.env.cr.dictfetchall():

9
customer_outstanding_statement/views/statement.xml

@ -9,11 +9,11 @@
<span t-raw="o.contact_address.replace('\n\n', '\n').replace('\n', '&lt;br&gt;')"/> <span t-raw="o.contact_address.replace('\n\n', '\n').replace('\n', '&lt;br&gt;')"/>
<span t-field="o.vat"/> <span t-field="o.vat"/>
</div> </div>
<h4 style="padding-left:20em">
<h4 style="padding-left:15em;padding-top:2em">
Outstanding Statement Outstanding Statement
</h4> </h4>
<p> <p>
Date: <span t-esc="Date[o.id]" /><br/>
Date: <span t-esc="Date[o.id]" /><br/><!--Today-->
<t t-if="o.ref">Partner ref: <span t-field="o.ref"/></t> <t t-if="o.ref">Partner ref: <span t-field="o.ref"/></t>
</p> </p>
@ -22,7 +22,7 @@
<t t-foreach="Lines[o.id]" t-as="currency"> <t t-foreach="Lines[o.id]" t-as="currency">
<br t-if="not currency_first" /> <br t-if="not currency_first" />
<p> <p>
Outstanding Statement in <span t-esc="Currencies[o.id][currency].name"/>:
Outstanding Statement at <span t-esc="Date_end[o.id]" /> in <span t-esc="Currencies[o.id][currency].name"/>:
</p> </p>
<table class="table table-condensed" style="border: 1px solid black; border-collapse: collapse;"> <table class="table table-condensed" style="border: 1px solid black; border-collapse: collapse;">
<thead> <thead>
@ -114,6 +114,9 @@
</td> </td>
</tr> </tr>
</table> </table>
<p>
Aging Report at <span t-esc="Date_end[o.id]" /> in <span t-esc="Currencies[o.id][currency].name"/>:
</p>
<table class="table table-condensed" t-if="Show_Buckets" style="border: 1px solid black; border-collapse: collapse;"> <table class="table table-condensed" t-if="Show_Buckets" style="border: 1px solid black; border-collapse: collapse;">
<thead> <thead>
<tr> <tr>

Loading…
Cancel
Save