mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
[IMP]pms: improvement duplicate folio wizard
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import datetime
|
||||
|
||||
from odoo import _, api, fields, models
|
||||
from odoo.exceptions import UserError
|
||||
|
||||
|
||||
class BookingDuplicate(models.TransientModel):
|
||||
@@ -19,7 +20,11 @@ class BookingDuplicate(models.TransientModel):
|
||||
help="Date from first copy Checkin (reference min checkin folio reservation)",
|
||||
required=True,
|
||||
)
|
||||
|
||||
used_room_ids = fields.Many2many(
|
||||
string="Used Rooms",
|
||||
comodel_name="pms.room",
|
||||
compute="_compute_used_room_ids",
|
||||
)
|
||||
pricelist_id = fields.Many2one(
|
||||
string="Pricelist",
|
||||
help="Pricelist applied in folio",
|
||||
@@ -107,14 +112,14 @@ class BookingDuplicate(models.TransientModel):
|
||||
help="Folios already created",
|
||||
comodel_name="pms.folio",
|
||||
)
|
||||
rooms = fields.One2many(
|
||||
line_ids = fields.One2many(
|
||||
string="Rooms",
|
||||
help="Rooms to create",
|
||||
readonly=False,
|
||||
store=True,
|
||||
comodel_name="pms.reservation.duplicate",
|
||||
inverse_name="booking_duplicate_id",
|
||||
compute="_compute_rooms",
|
||||
compute="_compute_line_ids",
|
||||
check_pms_properties=True,
|
||||
)
|
||||
recompute_prices = fields.Boolean(
|
||||
@@ -125,6 +130,11 @@ class BookingDuplicate(models.TransientModel):
|
||||
default=False,
|
||||
)
|
||||
|
||||
@api.depends("line_ids", "line_ids.preferred_room_id")
|
||||
def _compute_used_room_ids(self):
|
||||
for record in self:
|
||||
record.used_room_ids = record.line_ids.mapped("preferred_room_id.id")
|
||||
|
||||
@api.depends("reference_folio_id")
|
||||
def _compute_pricelist_id(self):
|
||||
for record in self.filtered("reference_folio_id"):
|
||||
@@ -176,23 +186,23 @@ class BookingDuplicate(models.TransientModel):
|
||||
elif not record.partner_name:
|
||||
record.partner_name = False
|
||||
|
||||
@api.depends("rooms.price_total")
|
||||
@api.depends("line_ids.price_total")
|
||||
def _compute_total_price_folio(self):
|
||||
for record in self:
|
||||
record.total_price_folio = 0
|
||||
for line in record.rooms:
|
||||
for line in record.line_ids:
|
||||
record.total_price_folio += line.price_total
|
||||
record.total_price_folio = record.total_price_folio
|
||||
|
||||
@api.depends(
|
||||
"reference_folio_id",
|
||||
)
|
||||
def _compute_rooms(self):
|
||||
def _compute_line_ids(self):
|
||||
self.ensure_one()
|
||||
reference_folio = self.reference_folio_id
|
||||
|
||||
if not reference_folio:
|
||||
self.rooms = False
|
||||
self.line_ids = False
|
||||
return
|
||||
|
||||
cmds = [(5, 0)]
|
||||
@@ -209,8 +219,9 @@ class BookingDuplicate(models.TransientModel):
|
||||
"booking_duplicate_id": self.id,
|
||||
"checkin": False,
|
||||
"checkout": False,
|
||||
"preferred_room_id": reservation.preferred_room_id,
|
||||
"room_type_id": reservation.room_type_id,
|
||||
"preferred_room_id": reservation.preferred_room_id.id,
|
||||
"room_type_id": reservation.room_type_id.id,
|
||||
"pricelist_id": reservation.pricelist_id.id,
|
||||
# "arrival_hour": reservation.arrival_hour,
|
||||
# "departure_hour": reservation.departure_hour,
|
||||
# "partner_internal_comment": reservation.partner_internal_comment,
|
||||
@@ -219,7 +230,7 @@ class BookingDuplicate(models.TransientModel):
|
||||
},
|
||||
)
|
||||
)
|
||||
self.rooms = cmds
|
||||
self.line_ids = cmds
|
||||
|
||||
def create_and_new(self):
|
||||
self.create_folio()
|
||||
@@ -275,6 +286,13 @@ class BookingDuplicate(models.TransientModel):
|
||||
return action
|
||||
|
||||
def create_folio(self):
|
||||
if any(room.occupied_room for room in self.line_ids):
|
||||
raise UserError(
|
||||
_(
|
||||
"""You can not create a new folio because there are rooms already occupied.
|
||||
Please, check the rooms marked in red and try again."""
|
||||
)
|
||||
)
|
||||
folio = self.env["pms.folio"].create(
|
||||
{
|
||||
"reservation_type": self.reservation_type,
|
||||
@@ -288,7 +306,10 @@ class BookingDuplicate(models.TransientModel):
|
||||
"internal_comment": self.internal_comment,
|
||||
}
|
||||
)
|
||||
for res in self.rooms:
|
||||
for res in self.line_ids:
|
||||
displacement_days = (
|
||||
res.checkin - res.reference_reservation_id.checkin
|
||||
).days
|
||||
res_vals = {
|
||||
"folio_id": folio.id,
|
||||
"checkin": res.checkin,
|
||||
@@ -296,10 +317,11 @@ class BookingDuplicate(models.TransientModel):
|
||||
"room_type_id": res.room_type_id.id,
|
||||
"partner_id": self.partner_id.id if self.partner_id else False,
|
||||
"partner_name": self.partner_name,
|
||||
"pricelist_id": self.pricelist_id.id,
|
||||
"pricelist_id": res.pricelist_id.id,
|
||||
"pms_property_id": folio.pms_property_id.id,
|
||||
"board_service_room_id": res.board_service_room_id.id,
|
||||
"adults": res.adults,
|
||||
"preferred_room_id": res.preferred_room_id.id,
|
||||
}
|
||||
ser_vals = [(5, 0)]
|
||||
for service in res.reference_reservation_id.service_ids.filtered(
|
||||
@@ -317,12 +339,7 @@ class BookingDuplicate(models.TransientModel):
|
||||
"price_unit": ser_line.price_unit,
|
||||
"discount": ser_line.discount,
|
||||
"date": ser_line.date
|
||||
+ datetime.timedelta(
|
||||
days=(
|
||||
res.reference_reservation_id.checkin
|
||||
- self.start_date
|
||||
).days
|
||||
)
|
||||
+ datetime.timedelta(days=displacement_days)
|
||||
if service.per_day
|
||||
else fields.Date.today(),
|
||||
},
|
||||
@@ -351,14 +368,9 @@ class BookingDuplicate(models.TransientModel):
|
||||
{
|
||||
"price": line.price,
|
||||
"discount": line.discount,
|
||||
"room_id": line.room_id.id,
|
||||
"room_id": res.preferred_room_id.id,
|
||||
"date": line.date
|
||||
+ datetime.timedelta(
|
||||
days=(
|
||||
res.reference_reservation_id.checkin
|
||||
- self.start_date
|
||||
).days
|
||||
),
|
||||
+ datetime.timedelta(days=displacement_days),
|
||||
},
|
||||
)
|
||||
)
|
||||
@@ -372,8 +384,8 @@ class BookingDuplicate(models.TransientModel):
|
||||
)
|
||||
)
|
||||
if origin_services_board:
|
||||
service.service_line_ids.price = (
|
||||
origin_services_board.service_line_ids[0].price
|
||||
service.service_line_ids.price_unit = (
|
||||
origin_services_board.service_line_ids[0].price_unit
|
||||
)
|
||||
self.created_folio_ids = [(4, folio.id)]
|
||||
|
||||
@@ -413,6 +425,16 @@ class PmsReservationDuplicate(models.TransientModel):
|
||||
help="Room reserved",
|
||||
comodel_name="pms.room",
|
||||
check_pms_properties=True,
|
||||
domain="["
|
||||
"('id', 'in', allowed_room_ids),"
|
||||
"('id', 'not in', used_room_ids),"
|
||||
"('pms_property_id', '=', pms_property_id),"
|
||||
"]",
|
||||
)
|
||||
used_room_ids = fields.Many2many(
|
||||
string="Used Rooms",
|
||||
comodel_name="pms.room",
|
||||
compute="_compute_used_room_ids",
|
||||
)
|
||||
allowed_room_ids = fields.Many2many(
|
||||
string="Allowed Rooms",
|
||||
@@ -420,10 +442,16 @@ class PmsReservationDuplicate(models.TransientModel):
|
||||
comodel_name="pms.room",
|
||||
compute="_compute_allowed_room_ids",
|
||||
)
|
||||
available = fields.Boolean(
|
||||
string="Available room",
|
||||
store="true",
|
||||
compute="_compute_available",
|
||||
occupied_room = fields.Boolean(
|
||||
string="Occupied Room",
|
||||
help="Check if the room is occupied",
|
||||
compute="_compute_occupied_room",
|
||||
)
|
||||
pricelist_id = fields.Many2one(
|
||||
string="Pricelist",
|
||||
help="Pricelist used for this reservation",
|
||||
comodel_name="product.pricelist",
|
||||
check_pms_properties=True,
|
||||
)
|
||||
price_total = fields.Float(
|
||||
string="Total price",
|
||||
@@ -469,7 +497,7 @@ class PmsReservationDuplicate(models.TransientModel):
|
||||
else:
|
||||
dif_days = (
|
||||
record.reference_reservation_id.checkin - checkin_ref
|
||||
).nights
|
||||
).days
|
||||
record.checkin = start_date + datetime.timedelta(days=dif_days)
|
||||
|
||||
@api.depends("checkin")
|
||||
@@ -479,20 +507,6 @@ class PmsReservationDuplicate(models.TransientModel):
|
||||
res_days = record.reference_reservation_id.nights
|
||||
record.checkout = record.checkin + datetime.timedelta(days=res_days)
|
||||
|
||||
@api.depends("preferred_room_id", "checkin", "checkout")
|
||||
def _compute_available(self):
|
||||
self.available = True
|
||||
for record in self:
|
||||
lines = self.env["pms.reservation.line"].search(
|
||||
[
|
||||
("date", ">=", record.checkin),
|
||||
("date", "<", record.checkout),
|
||||
("occupies_availability", "=", True),
|
||||
]
|
||||
)
|
||||
if lines:
|
||||
record.available = False
|
||||
|
||||
@api.depends(
|
||||
"checkin",
|
||||
"checkout",
|
||||
@@ -513,13 +527,27 @@ class PmsReservationDuplicate(models.TransientModel):
|
||||
else False,
|
||||
real_avail=True,
|
||||
)
|
||||
allowed_room_ids = (
|
||||
pms_property.free_room_ids.ids
|
||||
- reservation.booking_duplicate_id.room_ids.mapped(
|
||||
"preferred_room_id.id"
|
||||
)
|
||||
allowed_room_ids = pms_property.free_room_ids.ids
|
||||
reservation.allowed_room_ids = self.env["pms.room"].browse(allowed_room_ids)
|
||||
|
||||
@api.depends("allowed_room_ids", "preferred_room_id")
|
||||
def _compute_occupied_room(self):
|
||||
self.occupied_room = False
|
||||
for record in self.filtered("preferred_room_id"):
|
||||
if (
|
||||
record.preferred_room_id.id not in record.allowed_room_ids.ids
|
||||
or record.preferred_room_id.id in record.used_room_ids.ids
|
||||
):
|
||||
record.occupied_room = True
|
||||
|
||||
@api.depends("preferred_room_id", "booking_duplicate_id.used_room_ids")
|
||||
def _compute_used_room_ids(self):
|
||||
self.used_room_ids = False
|
||||
for record in self:
|
||||
record.used_room_ids = list(
|
||||
set(record.booking_duplicate_id.used_room_ids.ids)
|
||||
- {record.preferred_room_id.id}
|
||||
)
|
||||
reservation.allowed_room_ids = self.env["room.id"].browse(allowed_room_ids)
|
||||
|
||||
@api.depends("room_type_id", "board_service_room_id", "checkin", "checkout")
|
||||
def _compute_price_total(self):
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
<div class="col-6 ">
|
||||
<group>
|
||||
<field name="pms_property_id" invisible="0" />
|
||||
<field name="used_room_ids" invisible="1" />
|
||||
<field name="reservation_type" />
|
||||
<field
|
||||
name="agency_id"
|
||||
@@ -74,34 +75,46 @@
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<group>
|
||||
<field name="rooms" nolabel="1">
|
||||
<field name="line_ids" nolabel="1">
|
||||
<tree
|
||||
editable="bottom"
|
||||
create="false"
|
||||
delete="false"
|
||||
decoration-muted="checkin == 0"
|
||||
decoration-danger="available == 0"
|
||||
decoration-muted="checkin == False"
|
||||
decoration-danger="checkin != False and occupied_room == True"
|
||||
decoration-success="checkin != False and occupied_room == False"
|
||||
>
|
||||
<field
|
||||
name="reference_reservation_id"
|
||||
invisible="1"
|
||||
/>
|
||||
<field name="booking_duplicate_id" invisible="1" />
|
||||
<field name="available" invisible="1" />
|
||||
<field name="pms_property_id" invisible="1" />
|
||||
<field name="adults" />
|
||||
<field name="allowed_room_ids" invisible="1" />
|
||||
<field
|
||||
name="room_type_id"
|
||||
readonly="1"
|
||||
options="{'no_open': True}"
|
||||
force_save="1"
|
||||
/>
|
||||
<field name="preferred_room_id" />
|
||||
<field
|
||||
name="pricelist_id"
|
||||
optional="hidden"
|
||||
options="{'no_create': True, 'no_edit': True, 'no_open': True}"
|
||||
/>
|
||||
<field
|
||||
name="preferred_room_id"
|
||||
options="{'no_create': True, 'no_edit': True, 'no_open': True}"
|
||||
/>
|
||||
<field name="occupied_room" invisible="1" />
|
||||
<field name="used_room_ids" invisible="1" />
|
||||
<field name="checkin" force_save="1" />
|
||||
<field name="checkout" force_save="1" />
|
||||
<field
|
||||
name="board_service_room_id"
|
||||
attrs="{'column_invisible': [('parent.reservation_type','!=','normal')]}"
|
||||
options="{'no_create': True, 'no_edit': True, 'no_open': True}"
|
||||
/>
|
||||
<field
|
||||
name="service_ids"
|
||||
|
||||
Reference in New Issue
Block a user