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.
151 lines
5.5 KiB
151 lines
5.5 KiB
# -*- coding: utf-8 -*-
|
|
###############################################################################
|
|
#
|
|
# Cybrosys Technologies Pvt. Ltd.
|
|
#
|
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
|
|
# Author: ADARSH K (odoo@cybrosys.com)
|
|
#
|
|
# You can modify it under the terms of the GNU LESSER
|
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
|
|
#
|
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
|
|
# (LGPL v3) along with this program.
|
|
# If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
###############################################################################
|
|
import io
|
|
import json
|
|
from odoo import fields, models, _
|
|
from odoo.exceptions import ValidationError
|
|
from odoo.tools import json_default
|
|
|
|
try:
|
|
from odoo.tools.misc import xlsxwriter
|
|
except ImportError:
|
|
import xlsxwriter
|
|
|
|
|
|
class RoomBookingWizard(models.TransientModel):
|
|
"""Pdf Report for room Booking"""
|
|
|
|
_name = "room.booking.detail"
|
|
_description = "Room Booking Details"
|
|
|
|
checkin = fields.Date(help="Choose the Checkin Date", string="Checkin")
|
|
checkout = fields.Date(help="Choose the Checkout Date", string="Checkout")
|
|
room_id = fields.Many2one("hotel.room", string="Room",
|
|
help="Choose The Room")
|
|
|
|
def action_room_booking_pdf(self):
|
|
"""Button action_room_booking_pdf function"""
|
|
data = {
|
|
"booking": self.generate_data(),
|
|
}
|
|
return self.env.ref(
|
|
"hotel_management_odoo.action_report_room_booking"
|
|
).report_action(self, data=data)
|
|
|
|
def action_room_booking_excel(self):
|
|
"""Button action for creating Room Booking Excel report"""
|
|
data = {
|
|
"booking": self.generate_data(),
|
|
}
|
|
return {
|
|
"type": "ir.actions.report",
|
|
"data": {
|
|
"model": "room.booking.detail",
|
|
"options": json.dumps(data, default=json_default),
|
|
"output_format": "xlsx",
|
|
"report_name": "Excel Report",
|
|
},
|
|
"report_type": "xlsx",
|
|
}
|
|
|
|
def generate_data(self):
|
|
"""Generate data to be printed in the report"""
|
|
domain = []
|
|
room_list = []
|
|
if self.checkin and self.checkout:
|
|
if self.checkin > self.checkout:
|
|
raise ValidationError(
|
|
_("Check-in date should be less than Check-out date")
|
|
)
|
|
if self.checkin:
|
|
domain.append(
|
|
("checkin_date", ">=", self.checkin),
|
|
)
|
|
if self.checkout:
|
|
domain.append(
|
|
("checkout_date", "<=", self.checkout),
|
|
)
|
|
room_booking = self.env["room.booking"].search_read(
|
|
domain=domain,
|
|
fields=["partner_id", "name", "checkin_date", "checkout_date"],
|
|
)
|
|
for rec in room_booking:
|
|
rooms = (
|
|
self.env["room.booking"]
|
|
.browse(rec["id"])
|
|
.room_line_ids.room_id.mapped("name")
|
|
)
|
|
rec["partner_id"] = rec["partner_id"][1]
|
|
for room in rooms:
|
|
if self.room_id:
|
|
if self.room_id.name == room:
|
|
rec_copy = rec.copy()
|
|
rec_copy["room"] = room # Ensure this key is added
|
|
room_list.append(rec_copy)
|
|
else:
|
|
rec_copy = rec.copy()
|
|
rec_copy["room"] = room # Ensure this key is added
|
|
room_list.append(rec_copy)
|
|
|
|
return room_list
|
|
|
|
def get_xlsx_report(self, data, response):
|
|
"""Organizing xlsx report"""
|
|
output = io.BytesIO()
|
|
workbook = xlsxwriter.Workbook(output, {"in_memory": True})
|
|
sheet = workbook.add_worksheet()
|
|
cell_format = workbook.add_format(
|
|
{"font_size": "14px", "bold": True, "align": "center",
|
|
"border": True}
|
|
)
|
|
head = workbook.add_format(
|
|
{"align": "center", "bold": True, "font_size": "23px",
|
|
"border": True}
|
|
)
|
|
body = workbook.add_format(
|
|
{"align": "left", "text_wrap": True, "border": True})
|
|
sheet.merge_range("A1:F1", "Room Booking", head)
|
|
sheet.set_column("A2:F2", 18)
|
|
sheet.set_row(0, 30)
|
|
sheet.set_row(1, 20)
|
|
sheet.write("A2", "Sl No.", cell_format)
|
|
sheet.write("B2", "Guest Name", cell_format)
|
|
sheet.write("C2", "Room No.", cell_format)
|
|
sheet.write("D2", "Check In", cell_format)
|
|
sheet.write("E2", "Check Out", cell_format)
|
|
sheet.write("F2", "Reference No.", cell_format)
|
|
row = 2
|
|
column = 0
|
|
value = 1
|
|
for i in data["booking"]:
|
|
sheet.write(row, column, value, body)
|
|
sheet.write(row, column + 1, i["partner_id"], body)
|
|
sheet.write(row, column + 2, i["room"], body)
|
|
sheet.write(row, column + 3, i["checkin_date"], body)
|
|
sheet.write(row, column + 4, i["checkout_date"], body)
|
|
sheet.write(row, column + 5, i["name"], body)
|
|
row = row + 1
|
|
value = value + 1
|
|
workbook.close()
|
|
output.seek(0)
|
|
response.stream.write(output.read())
|
|
output.close()
|
|
|