115 lines
4.6 KiB
Python
115 lines
4.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
import time
|
|
from collections import defaultdict
|
|
from odoo.exceptions import ValidationError
|
|
from odoo import api, fields, models, _
|
|
from odoo.tools import format_date
|
|
|
|
|
|
class ReportFollowup(models.AbstractModel):
|
|
_name = 'report.om_account_followup.report_followup'
|
|
_description = 'Report Followup'
|
|
|
|
@api.model
|
|
def _get_report_values(self, docids, data=None):
|
|
model = self.env['followup.sending.results']
|
|
ids = self.env.context.get('active_ids') or False
|
|
docs = model.browse(ids)
|
|
return {
|
|
'docs': docs,
|
|
'doc_ids': docids,
|
|
'doc_model': model,
|
|
'time': time,
|
|
'ids_to_objects': self._ids_to_objects,
|
|
'getLines': self._lines_get,
|
|
'get_text': self._get_text,
|
|
'data': data and data['form'] or {}}
|
|
|
|
def _ids_to_objects(self, ids):
|
|
all_lines = []
|
|
for line in self.env['followup.stat.by.partner'].browse(ids):
|
|
if line not in all_lines:
|
|
all_lines.append(line)
|
|
return all_lines
|
|
|
|
def _lines_get(self, stat_by_partner_line):
|
|
return self._lines_get_with_partner(stat_by_partner_line.partner_id,
|
|
stat_by_partner_line.company_id.id)
|
|
|
|
def _lines_get_with_partner(self, partner, company_id):
|
|
moveline_obj = self.env['account.move.line']
|
|
moveline_ids = moveline_obj.search(
|
|
[('partner_id', '=', partner.id),
|
|
('account_id.account_type', '=', 'asset_receivable'),
|
|
('full_reconcile_id', '=', False),
|
|
('company_id', '=', company_id),
|
|
'|', ('date_maturity', '=', False),
|
|
('date_maturity', '<=', fields.Date.today())])
|
|
lines_per_currency = defaultdict(list)
|
|
total = 0
|
|
for line in moveline_ids:
|
|
currency = line.currency_id or line.company_id.currency_id
|
|
balance = line.debit - line.credit
|
|
if currency != line.company_id.currency_id:
|
|
balance = line.amount_currency
|
|
line_data = {
|
|
'name': line.move_id.name,
|
|
'ref': line.ref,
|
|
'date': format_date(self.env, line.date),
|
|
'date_maturity': format_date(self.env, line.date_maturity),
|
|
'balance': balance,
|
|
'blocked': line.blocked,
|
|
'currency_id': currency,
|
|
}
|
|
total = total + line_data['balance']
|
|
lines_per_currency[currency].append(line_data)
|
|
|
|
return [{'total': total, 'line': lines, 'currency': currency} for
|
|
currency, lines in
|
|
lines_per_currency.items()]
|
|
|
|
def _get_text(self, stat_line, followup_id, context=None):
|
|
fp_obj = self.env['followup.followup']
|
|
fp_line = fp_obj.browse(followup_id).followup_line
|
|
if not fp_line:
|
|
raise ValidationError(
|
|
_("The followup plan defined for the current company does not "
|
|
"have any followup action."))
|
|
default_text = ''
|
|
li_delay = []
|
|
for line in fp_line:
|
|
if not default_text and line.description:
|
|
default_text = line.description
|
|
li_delay.append(line.delay)
|
|
li_delay.sort(reverse=True)
|
|
partner_line_ids = self.env['account.move.line'].search(
|
|
[('partner_id', '=', stat_line.partner_id.id),
|
|
('full_reconcile_id', '=', False),
|
|
('company_id', '=', stat_line.company_id.id),
|
|
('blocked', '=', False),
|
|
('debit', '!=', False),
|
|
('account_id.account_type', '=', 'asset_receivable'),
|
|
('followup_line_id', '!=', False)])
|
|
|
|
partner_max_delay = 0
|
|
partner_max_text = ''
|
|
for i in partner_line_ids:
|
|
if i.followup_line_id.delay > partner_max_delay and \
|
|
i.followup_line_id.description:
|
|
partner_max_delay = i.followup_line_id.delay
|
|
partner_max_text = i.followup_line_id.description
|
|
text = partner_max_delay and partner_max_text or default_text
|
|
if text:
|
|
lang_obj = self.env['res.lang']
|
|
lang_ids = lang_obj.search(
|
|
[('code', '=', stat_line.partner_id.lang)], limit=1)
|
|
date_format = lang_ids and lang_ids.date_format or '%Y-%m-%d'
|
|
text = text % {
|
|
'partner_name': stat_line.partner_id.name,
|
|
'date': time.strftime(date_format),
|
|
'company_name': stat_line.company_id.name,
|
|
'user_signature': self.env.user.signature or '',
|
|
}
|
|
return text
|