Files
enterprise-addons/account_reports/models/account_followup_report.py
T

131 lines
6.5 KiB
Python

from odoo import fields, models, _
from odoo.tools import SQL
class AccountFollowupCustomHandler(models.AbstractModel):
_name = 'account.followup.report.handler'
_inherit = 'account.partner.ledger.report.handler'
_description = 'Follow-Up Report Custom Handler'
def _custom_options_initializer(self, report, options, previous_options):
super()._custom_options_initializer(report, options, previous_options)
options['buttons'].append({
'name': _('Send'),
'action': 'action_send_follow_up',
'sequence': 100,
'always_show': True,
})
options['custom_display_config']['components']['AccountReportLine'] = 'PartnerLedgerFollowupLine'
options['custom_display_config']['templates']['AccountReportHeader'] = 'account_reports.PartnerLedgerFollowupHeader'
if self.env.ref('account_reports.pdf_export_main_customer_report', raise_if_not_found=False):
options['custom_display_config'].setdefault('pdf_export', {})['pdf_export_main'] = 'account_reports.pdf_export_main_customer_report'
options['hide_initial_balance'] = True
if len(options['partner_ids']) == 1:
options['ignore_totals_below_sections'] = True
options['hide_partner_totals'] = True
if options['report_id'] != previous_options.get('report_id') and options['export_mode'] != 'print':
options['unreconciled'] = True
if options['export_mode'] == 'print':
# When printing the report, we don't want to include `no_followup` lines.
options['forced_domain'] = options.get('forced_domain', []) + [('no_followup', '=', False)]
def _filter_overdue_amls_from_results(self, aml_results):
return list(filter(lambda aml: aml['date_maturity'] and aml['date_maturity'] < fields.Date.today(), aml_results))
def _filter_due_amls_from_results(self, aml_results):
return list(filter(lambda aml: not aml['date_maturity'] or aml['date_maturity'] >= fields.Date.today(), aml_results))
def _get_partner_aml_report_lines(self, report, options, partner_line_id, aml_results, progress, offset=0, level_shift=0):
def create_status_line(status_name):
return {
'id': report._get_generic_line_id(None, None, markup=status_name, parent_line_id=partner_line_id),
'name': status_name,
'level': 3 + level_shift,
'parent_id': partner_line_id,
'columns': [{} for _col in options['columns']],
'unfolded': True,
}
def get_aml_lines_with_status_line(status_name, status_line_id, aml_values, treated_results_count, progress):
lines = []
next_progress = progress
has_more = False
if not status_line_id or offset == 0:
status_line = create_status_line(status_name)
lines.append(status_line)
status_line_id = status_line['id']
for aml_value in aml_values:
if self._is_report_limit_reached(report, options, treated_results_count):
# We loaded one more than the limit on purpose: this way we know we need a "load more" line
has_more = True
break
aml_report_line = self._get_report_line_move_line(options, aml_value, status_line_id, next_progress, level_shift=level_shift + 1)
lines.append(aml_report_line)
next_progress = self._init_load_more_progress(options, aml_report_line)
treated_results_count += 1
return lines, next_progress, treated_results_count, has_more
lines = []
next_progress = progress
has_more = False
treated_results_count = 0
due_line_id, overdue_line_id = self._get_unfolded_partner_status_lines(report, options, partner_line_id)
overdue_aml_values = self._filter_overdue_amls_from_results(aml_results)
due_aml_values = self._filter_due_amls_from_results(aml_results)
if overdue_aml_values:
overdue_lines, next_progress, treated_results_count, has_more = get_aml_lines_with_status_line(_('Overdue'), overdue_line_id, overdue_aml_values, treated_results_count, next_progress)
lines.extend(overdue_lines)
# If we reached the limit just before the due line and have already loaded one extra line, we should skip the due line for now and add a "load more" line
if self._is_report_limit_reached(report, options, treated_results_count) and due_aml_values:
has_more = True
if due_aml_values and not has_more:
due_lines, next_progress, treated_results_count, has_more = get_aml_lines_with_status_line(_('Due'), due_line_id, due_aml_values, treated_results_count, next_progress)
lines.extend(due_lines)
return lines, next_progress, treated_results_count, has_more
def _get_unfolded_partner_status_lines(self, report, options, partner_line_id):
_dummy1, _dummy2, partner_id = report._parse_line_id(partner_line_id)[-1]
due_line_id, overdue_line_id = None, None
for line_id in options['unfolded_lines']:
res_ids_map = report._get_res_ids_from_line_id(line_id, ['account.report', 'res.partner'])
if 'res.partner' in res_ids_map and res_ids_map['account.report'] == report.id and res_ids_map['res.partner'] == partner_id:
markup, _dummy1, _dummy2 = report._parse_line_id(line_id)[-1]
if markup == 'Due':
due_line_id = line_id
if markup == 'Overdue':
overdue_line_id = line_id
return due_line_id, overdue_line_id
def _get_order_by_aml_values(self):
return SQL('account_move_line.date_maturity, %(order_by)s', order_by=super()._get_order_by_aml_values())
def action_send_follow_up(self, options):
template = self.env.ref('account_reports.email_template_customer_follow_up_report', False)
partners = self.env['res.partner'].browse(options.get('partner_ids', []))
return {
'name': _("Send %s Follow Up Report", partners.name) if len(partners) == 1 else _("Send Follow Up Reports"),
'type': 'ir.actions.act_window',
'views': [[False, 'form']],
'res_model': 'account.report.send',
'target': 'new',
'context': {
'default_mail_template_id': template.id,
'default_report_options': options,
},
}