You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

124 lines
7.1 KiB

# -*- coding: utf-8 -*-
import json
import io
from datetime import datetime
from odoo.tools import date_utils
from odoo import models, fields, api, _
try:
from odoo.tools.misc import xlsxwriter
except ImportError:
import xlsxwriter
class CreditDueExceedReportWizard(models.TransientModel):
_name = 'customer.due.report'
@api.model
def xlsx_credit_due_report(self,data):
data = {}
data['form'] = self.read([])
return {
'type': 'ir_actions_xlsx_download',
'data': {'model': 'customer.due.report',
'options': json.dumps(data['form'],
default=date_utils.json_default),
'output_format': 'xlsx',
'report_name': 'customer_due_report',
}
}
def get_xlsx_report(self, options, response):
output = io.BytesIO()
workbook = xlsxwriter.Workbook(output, {'in_memory': True})
sheet = workbook.add_worksheet('Product Ageing Report')
format1 = workbook.add_format({'font_size': 15, 'align': 'center', 'bg_color': '#8a98a8', 'bold': True})
format2 = workbook.add_format(
{'align': 'center', 'font_size': 10, 'bg_color': '#8a98a8', 'bottom': 1, 'bold': True})
format3 = workbook.add_format({'align': 'left', 'font_size': 10, 'bg_color': '#a7b2be', 'bottom': 1})
format4 = workbook.add_format(
{'font_size': 10, 'bg_color': '#a7b2be', 'align': 'left', 'bottom': 1})
format5 = workbook.add_format(
{'font_size': 10, 'bg_color': '#a7b2be', 'align': 'right', 'bottom': 1, 'bold': True})
format6 = workbook.add_format({'align': 'left', 'font_size': 10, 'bg_color': '#c4ccd4', 'bottom': 1})
format7 = workbook.add_format({'align': 'right', 'font_size': 10, 'bg_color': '#c4ccd4', 'bottom': 1})
format8= workbook.add_format({'align': 'right', 'font_size': 10, 'bg_color': '#c4ccd4', 'bottom': 1, 'bold': True})
date_time_default_col1_style = workbook.add_format(
{'align': 'left', 'font_size': 10, 'bg_color': '#a7b2be', 'num_format': 'dd/mm/yy', 'bottom': 1})
date_time_default_col1_style_2 = workbook.add_format(
{'align': 'left', 'font_size': 10, 'bg_color': '#c4ccd4', 'num_format': 'dd/mm/yy', 'bottom': 1})
format10 = workbook.add_format({'align': 'right', 'font_size': 10})
sheet.set_row(0, 30)
report_date = datetime.now().strftime("%Y-%m-%d")
sheet.merge_range('A1:H1', 'CUSTOMER DUE REPORT', format1)
sheet.write('A3', 'Report Date', format2)
sheet.write('A4', report_date, format10)
sheet.write('A6', 'PARTNER', format2)
sheet.write('B6', 'EMAIL', format2)
sheet.write('C6', 'PHONE', format2)
sheet.write('D6', 'REFERENCE', format2)
sheet.write('E6', 'DUE DATE', format2)
sheet.write('F6', 'DUE DAYS', format2)
sheet.write('G6', 'DUE AMOUNT', format2)
sheet.write('H6', 'TOTAL DUE', format2)
row_num = 6
col_num = 0
cr = self._cr
for record in self.env['res.partner'].search([('customer', '=', True)]):
total_overdue = 0
today = fields.Date.today()
cr.execute("""SELECT account_move_line.date_maturity as date_maturity,account_move_line.company_id as company_id,
SUM(account_move_line.amount_residual) as amount_residual,
account_move_line.date as date,am.ref as invoice,am.name as entry
FROM account_move_line
LEFT JOIN account_account a ON (account_move_line.account_id=a.id)
LEFT JOIN account_account_type act ON (a.user_type_id=act.id)
LEFT JOIN account_move am ON (am.id=account_move_line.move_id)
WHERE (account_move_line.date_maturity < %s) AND
act.type = 'receivable'
AND account_move_line.partner_id = %s
AND account_move_line.reconciled IS FALSE AND a.deprecated IS FALSE
GROUP BY account_move_line.date_maturity,account_move_line.company_id,account_move_line.amount_residual,
account_move_line.date,am.ref,am.name
""", (today, record.id))
unreconciled_aml_ids = cr.dictfetchall()
if unreconciled_aml_ids:
row_old = row_num
if len(unreconciled_aml_ids) > 1:
sheet.write(row_num, col_num, record.name, format3)
sheet.write(row_num, col_num + 1, '', format3)
sheet.write(row_num, col_num + 2, '', format3)
sheet.write(row_num, col_num + 3, '', format3)
sheet.write(row_num, col_num + 4, '', format3)
sheet.write(row_num, col_num + 5, '', format3)
sheet.write(row_num, col_num + 6, '', format3)
row_num += 1
for aml in unreconciled_aml_ids:
if aml['company_id'] == self.env.user.company_id.id:
amount = aml['amount_residual']
total_overdue += amount
no_days = (today - aml['date_maturity']).days
sheet.write(row_num, col_num + 3, aml['invoice'] if aml['invoice'] else aml['entry'], format6)
sheet.write(row_num, col_num + 4, aml['date_maturity'], date_time_default_col1_style_2)
sheet.write(row_num, col_num + 5, no_days, format7)
sheet.write(row_num, col_num + 6, aml['amount_residual'], format8)
row_num += 1
sheet.write(row_old, col_num + 7, total_overdue, format5)
else:
for aml in unreconciled_aml_ids:
if aml['company_id'] == self.env.user.company_id.id:
amount = aml['amount_residual']
total_overdue += amount
no_days = (today - aml['date_maturity']).days
sheet.write(row_num, col_num, record.name, format3)
sheet.write(row_num, col_num + 1, record.email if record.email else '', format3)
sheet.write(row_num, col_num + 2, record.phone if record.phone else '', format3)
sheet.write(row_num, col_num + 3, aml['invoice'] if aml['invoice'] else aml['entry'], format3)
sheet.write(row_num, col_num + 4, aml['date_maturity'], date_time_default_col1_style)
sheet.write(row_num, col_num + 5, no_days, format4)
sheet.write(row_num, col_num + 6, aml['amount_residual'], format4)
sheet.write(row_num, col_num + 7, total_overdue, format5)
row_num += 1
workbook.close()
output.seek(0)
response.stream.write(output.read())
output.close()