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.
190 lines
8.7 KiB
190 lines
8.7 KiB
# -*- coding: utf-8 -*-
|
|
###############################################################################
|
|
#
|
|
# Cybrosys Technologies Pvt. Ltd.
|
|
#
|
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
|
|
# Author: Jumana Haseen (odoo@cybrosys.com)
|
|
#
|
|
# This program is under the terms of the Odoo Proprietary License v1.0
|
|
# (OPL-1) It is forbidden to publish, distribute, sublicense, or
|
|
# sell copies of the Software or modified copies of the Software.
|
|
#
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
|
|
# OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
|
|
# THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
#
|
|
###############################################################################
|
|
import json
|
|
import io
|
|
from odoo import fields, models
|
|
from odoo.tools import date_utils
|
|
try:
|
|
from odoo.tools.misc import xlsxwriter
|
|
except ImportError:
|
|
import xlsxwriter
|
|
|
|
|
|
class IrActionsXlsxDownload(models.Model):
|
|
_name = 'ir_actions_xlsx_download'
|
|
_description = 'Action XLSX Download'
|
|
_inherit = 'ir.actions.actions'
|
|
_table = 'ir_actions'
|
|
type = fields.Char(default='ir_actions_xlsx_download')
|
|
|
|
|
|
class RouteReport(models.TransientModel):
|
|
"""Transient model for the wizard"""
|
|
_name = 'route.report'
|
|
_description = 'Route Report'
|
|
|
|
route = fields.Many2many('delivery.route', string='Route')
|
|
payment = fields.Boolean(string='Show Due Amount')
|
|
consolidated = fields.Boolean(string='Total Due only')
|
|
|
|
def print_route_details(self):
|
|
"""Action on button to print pdf report"""
|
|
data = {
|
|
'route': self.route.read(['name']),
|
|
'route_lines': self.route.route_lines.read(),
|
|
'payment': self.payment,
|
|
'consolidated': self.consolidated,
|
|
}
|
|
return self.env.ref(
|
|
'customer_route_management.report_route_report').report_action(self,
|
|
data=data)
|
|
|
|
def print_xlsx_report_route(self):
|
|
"""Action on button to print xlsx report"""
|
|
data = {
|
|
'model': self._name,
|
|
'route': self.route.ids,
|
|
'payment': self.payment,
|
|
'consolidated': self.consolidated
|
|
}
|
|
return {
|
|
'type': 'ir.actions.report',
|
|
'data': {'model': 'route.report',
|
|
'options': json.dumps(data,
|
|
default=date_utils.json_default),
|
|
'output_format': 'xlsx',
|
|
'report_name': 'Customer Route Management Report',
|
|
},
|
|
'report_type': 'xlsx'
|
|
}
|
|
|
|
def get_xlsx_report(self, data, response):
|
|
"""Get xlsx report"""
|
|
output = io.BytesIO()
|
|
workbook = xlsxwriter.Workbook(output, {'in_memory': True})
|
|
cell_format = workbook.add_format(
|
|
{'align': 'center', 'bold': True, 'bg_color': '#d3d3d3;',
|
|
'color': '#191081'})
|
|
left = workbook.add_format({'align': 'left'})
|
|
loc_bold = workbook.add_format({'bold': True})
|
|
color = workbook.add_format({'color': '#031311;'})
|
|
if data['payment']:
|
|
bold = workbook.add_format({'bold': True, 'align': 'left'})
|
|
else:
|
|
bold = workbook.add_format({'align': 'left'})
|
|
docs = self.env['delivery.route'].search(
|
|
[('id', 'in', data['route'])])
|
|
for o in docs:
|
|
sheet = workbook.add_worksheet(o.name)
|
|
i = 3
|
|
sheet.merge_range('F1:J1', o.name.upper(), cell_format)
|
|
for l in o.route_lines:
|
|
if (l.route):
|
|
sheet.merge_range(
|
|
'A' + str(i - 1) + ':' + 'B' + str(i - 1),
|
|
l.route.upper() + ':', loc_bold)
|
|
if data['payment'] and not data['consolidated']:
|
|
sheet.merge_range(
|
|
'D' + str(i - 1) + ':' + 'E' + str(i - 1),
|
|
'Invoice Number', bold)
|
|
sheet.merge_range(
|
|
'F' + str(i - 1) + ':' + 'G' + str(i - 1), 'Date',
|
|
bold)
|
|
sheet.merge_range(
|
|
'H' + str(i - 1) + ':' + 'I' + str(i - 1),
|
|
'Amount Due', bold)
|
|
for v in l.cust_tree:
|
|
address = str(v.street) + " " + str(v.street2) + \
|
|
" " + str(v.city) + " " + str(
|
|
v.state_id.name) + " " + str(v.zip) + \
|
|
" " + str(v.country_id.name) + " " + str(
|
|
v.email)
|
|
if data['payment'] and not data['consolidated']:
|
|
sheet.merge_range(
|
|
'B' + str(i) + ':' + 'C' + str(i),
|
|
str(v.name) + " " + str(v.phone) + " " +
|
|
address.replace('False', ''), color)
|
|
else:
|
|
sheet.merge_range(
|
|
'B' + str(i) + ':' + 'C' + str(i),
|
|
str(v.name).replace('False', ''), color)
|
|
sheet.merge_range(
|
|
'D' + str(i) + ':' + 'E' + str(i),
|
|
str(v.phone).replace('False', ''), color)
|
|
sheet.merge_range(
|
|
'F' + str(i) + ':' + 'G' + str(i),
|
|
address.replace('False', ''), color)
|
|
i += 1
|
|
if data['payment']:
|
|
total = 0.0
|
|
for dues in v.get_all_dues():
|
|
total += dues['amount_residual_signed']
|
|
if not data['consolidated']:
|
|
sheet.merge_range(
|
|
'D' + str(i) + ':' + 'E' + str(i),
|
|
dues['name'], left)
|
|
sheet.merge_range(
|
|
'F' + str(i) + ':' + 'G' + str(i),
|
|
str(dues['invoice_date_due'].strftime(
|
|
"%B-%d-%Y")), left)
|
|
if self.env.user.company_id.currency_id.position == 'after':
|
|
sheet.merge_range(
|
|
'H' + str(i) + ':' + 'I' + str(i),
|
|
str("{:.2f}".format(dues[
|
|
'amount_residual_signed']))
|
|
+ str(
|
|
self.env.user.company_id.currency_id.symbol),
|
|
left)
|
|
else:
|
|
sheet.merge_range(
|
|
'H' + str(i) + ':' + 'I' + str(i),
|
|
str(self.env.user.company_id.currency_id.symbol) +
|
|
str("{:.2f}".format(dues[
|
|
'amount_residual_signed']))
|
|
, bold)
|
|
i += 1
|
|
if total != 0.0:
|
|
sheet.merge_range(
|
|
'D' + str(i) + ':' + 'E' + str(i), 'Total',
|
|
bold)
|
|
sheet.merge_range(
|
|
'F' + str(i) + ':' + 'G' + str(i), '',
|
|
left)
|
|
if self.env.user.company_id.currency_id.position == 'after':
|
|
sheet.merge_range(
|
|
'H' + str(i) + ':' + 'I' + str(i),
|
|
str("{:.2f}".format(total)) +
|
|
str(self.env.user.company_id.currency_id.symbol),
|
|
bold)
|
|
else:
|
|
sheet.merge_range(
|
|
'H' + str(i) + ':' + 'I' + str(i),
|
|
str(self.env.user.company_id.currency_id.symbol) +
|
|
str("{:.2f}".format(total))
|
|
, bold)
|
|
i += 1
|
|
i += 1
|
|
|
|
workbook.close()
|
|
output.seek(0)
|
|
response.stream.write(output.read())
|
|
output.close()
|
|
|