mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
[ADD] UX functionalities
This commit is contained in:
@@ -36,6 +36,9 @@
|
||||
"data/menus.xml",
|
||||
"wizards/wizard_payment_folio.xml",
|
||||
"wizards/folio_make_invoice_advance_views.xml",
|
||||
"wizards/wizard_folio.xml",
|
||||
"wizards/wizard_invoice_filter_days.xml",
|
||||
"wizards/wizard_folio_changes.xml",
|
||||
"views/pms_amenity_views.xml",
|
||||
"views/pms_amenity_type_views.xml",
|
||||
"views/pms_board_service_views.xml",
|
||||
@@ -43,9 +46,11 @@
|
||||
"views/pms_cancelation_rule_views.xml",
|
||||
"views/pms_checkin_partner_views.xml",
|
||||
"views/pms_floor_views.xml",
|
||||
"views/pms_folio_views.xml",
|
||||
"views/pms_property_views.xml",
|
||||
"views/pms_reservation_views.xml",
|
||||
"views/pms_service_views.xml",
|
||||
"views/pms_service_line_views.xml",
|
||||
"views/pms_folio_views.xml",
|
||||
"views/pms_room_type_views.xml",
|
||||
"views/pms_room_views.xml",
|
||||
"views/pms_room_closure_reason_views.xml",
|
||||
@@ -56,8 +61,6 @@
|
||||
"views/pms_room_type_class_views.xml",
|
||||
"views/pms_room_type_availability_plan_views.xml",
|
||||
"views/pms_room_type_availability_rule_views.xml",
|
||||
"views/pms_service_views.xml",
|
||||
"views/pms_service_line_views.xml",
|
||||
"views/pms_shared_room_views.xml",
|
||||
"views/res_partner_views.xml",
|
||||
"views/product_pricelist_views.xml",
|
||||
@@ -70,9 +73,6 @@
|
||||
"wizards/wizard_reservation.xml",
|
||||
"wizards/wizard_massive_changes.xml",
|
||||
"wizards/wizard_advanced_filters.xml",
|
||||
"wizards/wizard_folio.xml",
|
||||
"wizards/wizard_invoice_filter_days.xml",
|
||||
"wizards/wizard_folio_changes.xml",
|
||||
],
|
||||
"demo": [
|
||||
"demo/pms_master_data.xml",
|
||||
|
||||
@@ -12,6 +12,7 @@ from odoo.exceptions import ValidationError
|
||||
class PmsCheckinPartner(models.Model):
|
||||
_name = "pms.checkin.partner"
|
||||
_description = "Partner Checkins"
|
||||
_rec_name = "identifier"
|
||||
|
||||
# Fields declaration
|
||||
identifier = fields.Char(
|
||||
@@ -125,11 +126,9 @@ class PmsCheckinPartner(models.Model):
|
||||
"reservation_id.preferred_room_id",
|
||||
)
|
||||
def _compute_name(self):
|
||||
self.name = False
|
||||
for record in self.filtered("reservation_id.rooms"):
|
||||
record.name = record.reservation_id.rooms
|
||||
if record.partner_id:
|
||||
record.name = record.name + " (" + record.partner_id.name + ")"
|
||||
for record in self:
|
||||
if not record.name:
|
||||
record.name = record.partner_id.name
|
||||
|
||||
@api.depends("partner_id", "partner_id.email")
|
||||
def _compute_email(self):
|
||||
@@ -147,8 +146,8 @@ class PmsCheckinPartner(models.Model):
|
||||
def _checkin_mandatory_fields(self, depends=False):
|
||||
# api.depends need "reservation_id.state" in the lambda function
|
||||
if depends:
|
||||
return ["reservation_id.state", "partner_id"]
|
||||
return ["partner_id"]
|
||||
return ["reservation_id.state", "name"]
|
||||
return ["name"]
|
||||
|
||||
@api.model
|
||||
def _checkin_partner_fields(self):
|
||||
|
||||
@@ -68,6 +68,11 @@ class PmsFolio(models.Model):
|
||||
compute="_compute_number_of_rooms",
|
||||
store="True",
|
||||
)
|
||||
number_of_services = fields.Integer(
|
||||
"Number of Rooms",
|
||||
compute="_compute_number_of_services",
|
||||
store="True",
|
||||
)
|
||||
service_ids = fields.One2many(
|
||||
"pms.service",
|
||||
"folio_id",
|
||||
@@ -377,6 +382,11 @@ class PmsFolio(models.Model):
|
||||
folio.reservation_ids.filtered(lambda a: a.state != "cancelled")
|
||||
)
|
||||
|
||||
@api.depends("service_ids", "service_ids.product_qty")
|
||||
def _compute_number_of_services(self):
|
||||
for folio in self:
|
||||
folio.number_of_services = sum(folio.service_ids.mapped("product_qty"))
|
||||
|
||||
@api.depends(
|
||||
"reservation_ids",
|
||||
"service_ids",
|
||||
|
||||
@@ -64,7 +64,6 @@ class ResPartner(models.Model):
|
||||
if not args:
|
||||
args = []
|
||||
domain = [
|
||||
"|",
|
||||
"|",
|
||||
("phone", operator, name),
|
||||
("mobile", operator, name),
|
||||
|
||||
@@ -45,8 +45,9 @@
|
||||
type="action"
|
||||
class="oe_stat_button"
|
||||
name="%(open_pms_reservation_form_tree_all)d"
|
||||
icon="fa-cubes"
|
||||
context="{'search_default_folio_id': active_id, 'default_folio_id': active_id}"
|
||||
icon="fa-bed"
|
||||
context="{'search_default_folio_id': id, 'default_folio_id': id}"
|
||||
attrs="{'invisible': [('number_of_rooms', '=', 0)]}"
|
||||
>
|
||||
<field
|
||||
name="number_of_rooms"
|
||||
@@ -54,6 +55,20 @@
|
||||
string="Rooms"
|
||||
/>
|
||||
</button>
|
||||
<button
|
||||
type="action"
|
||||
class="oe_stat_button"
|
||||
name="%(action_pms_services_form)d"
|
||||
icon="fa-coffee"
|
||||
context="{'search_default_folio_id': id, 'default_folio_id': id}"
|
||||
attrs="{'invisible': [('number_of_services', '=', 0)]}"
|
||||
>
|
||||
<field
|
||||
name="number_of_services"
|
||||
widget="statinfo"
|
||||
string="Services"
|
||||
/>
|
||||
</button>
|
||||
<button
|
||||
type="object"
|
||||
class="oe_stat_button"
|
||||
@@ -74,23 +89,6 @@
|
||||
<span class="o_stat_text">Pending Payment</span>
|
||||
</div>
|
||||
</button>
|
||||
<button
|
||||
type="object"
|
||||
class="oe_stat_button"
|
||||
id="arrive_smart_button"
|
||||
icon="fa-street-view"
|
||||
name="action_to_arrive"
|
||||
>
|
||||
<div class="o_form_field o_stat_info">
|
||||
<span class="o_stat_value">
|
||||
<field
|
||||
name="count_rooms_pending_arrival"
|
||||
nolabel="1"
|
||||
/>
|
||||
</span>
|
||||
<span class="o_stat_text">To arrive Rooms</span>
|
||||
</div>
|
||||
</button>
|
||||
<button
|
||||
type="object"
|
||||
class="oe_stat_button"
|
||||
@@ -119,9 +117,18 @@
|
||||
name="folio_multi_changes"
|
||||
type="object"
|
||||
class="oe_stat_button"
|
||||
icon="fa-calculator"
|
||||
icon="fa-magic"
|
||||
>
|
||||
<span class="o_stat_text">Change Prices</span>
|
||||
<span class="o_stat_text">Change in Group</span>
|
||||
</button>
|
||||
<button
|
||||
type="action"
|
||||
class="oe_stat_button"
|
||||
name="%(action_wizard_folio)d"
|
||||
icon="fa-users"
|
||||
context="{'default_folio_id': id, 'default_partner_id': partner_id, 'default_pricelist_id': pricelist_id}"
|
||||
>
|
||||
<span class="o_stat_text">New Booking Group</span>
|
||||
</button>
|
||||
</div>
|
||||
<widget
|
||||
@@ -352,7 +359,8 @@
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
<page string="Reservation Rooms">
|
||||
<!-- REVIEW: its necesary? -->
|
||||
<page string="Reservation Rooms" invisible="1">
|
||||
<field
|
||||
name="reservation_ids"
|
||||
colspan="4"
|
||||
@@ -361,7 +369,8 @@
|
||||
context="{'reservation_ids':reservation_ids,'folio_id': id,'tree_view_ref':'pms.pms_reservation_view_bottom_tree', 'form_view_ref':'pms.pms_reservation_view_form'}"
|
||||
/>
|
||||
</page>
|
||||
<page string="Services">
|
||||
<!-- REVIEW: its necesary? -->
|
||||
<page string="Services" invisible="1">
|
||||
<separator string="Service Lines" colspan="4" />
|
||||
<field
|
||||
name="service_ids"
|
||||
@@ -373,6 +382,7 @@
|
||||
<page name="persons" string="Rooming">
|
||||
<field
|
||||
name="checkin_partner_ids"
|
||||
options="{'no_create': True, 'no_delete': True}"
|
||||
context="{
|
||||
'default_folio_id': id,
|
||||
'folio_id': id,
|
||||
@@ -434,6 +444,7 @@
|
||||
<field name="arch" type="xml">
|
||||
<tree
|
||||
string="Folio"
|
||||
create="false"
|
||||
class="o_sale_order"
|
||||
decoration-info="state == 'draft'"
|
||||
decoration-muted="state == 'cancel'"
|
||||
|
||||
@@ -96,7 +96,12 @@
|
||||
>
|
||||
<div class="o_field_widget o_stat_info">
|
||||
<span class="o_stat_text">
|
||||
<field name="folio_id" readonly="1" nolabel="1" />
|
||||
<field
|
||||
name="folio_id"
|
||||
readonly="1"
|
||||
nolabel="1"
|
||||
force_save="1"
|
||||
/>
|
||||
</span>
|
||||
</div>
|
||||
</button>
|
||||
@@ -613,7 +618,7 @@
|
||||
<field name="pricelist_id" invisible="1" />
|
||||
<field name="rooms" />
|
||||
<field name="checkin" />
|
||||
<field name="checkout" widget="date" />
|
||||
<field name="checkout" />
|
||||
<field name="nights" />
|
||||
<button
|
||||
type="object"
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
<button
|
||||
type="object"
|
||||
class="oe_stat_button"
|
||||
icon="fa fa-1x fa-bed"
|
||||
icon="fa-1x fa-bed"
|
||||
name="open_service_ids"
|
||||
attrs="{'invisible':[('is_board_service','=', False)]}"
|
||||
/>
|
||||
@@ -83,7 +83,7 @@
|
||||
<button
|
||||
type="object"
|
||||
class="oe_stat_button"
|
||||
icon="fa fa-2x fa-bars"
|
||||
icon="fa-2x fa-bars"
|
||||
name="open_service_ids"
|
||||
attrs="{'invisible': [('per_day','=',False)]}"
|
||||
/>
|
||||
@@ -108,6 +108,7 @@
|
||||
<field name="arch" type="xml">
|
||||
<search string="Reservation Service">
|
||||
<field name="name" />
|
||||
<field name="folio_id" />
|
||||
<field name="product_id" />
|
||||
<field name="product_qty" />
|
||||
<newline />
|
||||
|
||||
@@ -28,11 +28,14 @@ class FolioWizard(models.TransientModel):
|
||||
pms_property_id = fields.Many2one(
|
||||
comodel_name="pms.property",
|
||||
string="Property",
|
||||
default=lambda self: self.env.user.get_active_property_ids()[0],
|
||||
default=lambda self: self._default_pms_property_id(),
|
||||
)
|
||||
partner_id = fields.Many2one(
|
||||
"res.partner",
|
||||
)
|
||||
folio_id = fields.Many2one(
|
||||
"pms.folio",
|
||||
)
|
||||
availability_results = fields.One2many(
|
||||
comodel_name="pms.folio.availability.wizard",
|
||||
inverse_name="folio_wizard_id",
|
||||
@@ -49,6 +52,13 @@ class FolioWizard(models.TransientModel):
|
||||
)
|
||||
can_create_folio = fields.Boolean(compute="_compute_can_create_folio")
|
||||
|
||||
def _default_pms_property_id(self):
|
||||
if self._context.get("default_folio_id"):
|
||||
folio = self.env["pms.folio"].browse(self._context.get("default_folio_id"))
|
||||
return folio.pms_property_id.id
|
||||
else:
|
||||
return self.env.user.get_active_property_ids()[0]
|
||||
|
||||
@api.depends("availability_results.value_num_rooms_selected")
|
||||
def _compute_can_create_folio(self):
|
||||
for record in self:
|
||||
@@ -128,13 +138,16 @@ class FolioWizard(models.TransientModel):
|
||||
# actions
|
||||
def create_folio(self):
|
||||
for record in self:
|
||||
folio = self.env["pms.folio"].create(
|
||||
{
|
||||
"pricelist_id": record.pricelist_id.id,
|
||||
"partner_id": record.partner_id.id,
|
||||
"pms_property_id": record.pms_property_id.id,
|
||||
}
|
||||
)
|
||||
if not record.folio_id:
|
||||
folio = self.env["pms.folio"].create(
|
||||
{
|
||||
"pricelist_id": record.pricelist_id.id,
|
||||
"partner_id": record.partner_id.id,
|
||||
"pms_property_id": record.pms_property_id.id,
|
||||
}
|
||||
)
|
||||
else:
|
||||
folio = record.folio_id
|
||||
for line in record.availability_results:
|
||||
for _reservations_to_create in range(0, line.value_num_rooms_selected):
|
||||
res = self.env["pms.reservation"].create(
|
||||
@@ -143,8 +156,8 @@ class FolioWizard(models.TransientModel):
|
||||
"checkin": line.checkin,
|
||||
"checkout": line.checkout,
|
||||
"room_type_id": line.room_type_id.id,
|
||||
"partner_id": folio.partner_id.id,
|
||||
"pricelist_id": folio.pricelist_id.id,
|
||||
"partner_id": record.partner_id.id,
|
||||
"pricelist_id": record.pricelist_id.id,
|
||||
"pms_property_id": folio.pms_property_id.id,
|
||||
}
|
||||
)
|
||||
|
||||
@@ -18,12 +18,17 @@
|
||||
widget="daterange"
|
||||
options="{'related_start_date': 'start_date'}"
|
||||
/>
|
||||
<field name="folio_id" invisible="1" />
|
||||
</group>
|
||||
</div>
|
||||
<div class="col-5">
|
||||
<group>
|
||||
<field name="partner_id" string="Partner" required="1" />
|
||||
<field name="pms_property_id" required="1" />
|
||||
<field
|
||||
name="pms_property_id"
|
||||
required="1"
|
||||
attrs="{'invisible':[('folio_id','!=',0)]}"
|
||||
/>
|
||||
<field
|
||||
default_focus="1"
|
||||
name="pricelist_id"
|
||||
@@ -105,7 +110,14 @@
|
||||
string="Create Folio"
|
||||
type="object"
|
||||
class="btn-primary"
|
||||
attrs="{'invisible' : [('can_create_folio', '=', False)]}"
|
||||
attrs="{'invisible' : ['|',('can_create_folio', '=', False),('folio_id', '!=', False)]}"
|
||||
/>
|
||||
<button
|
||||
name="create_folio"
|
||||
string="Add to Folio"
|
||||
type="object"
|
||||
class="btn-primary"
|
||||
attrs="{'invisible' : ['|',('can_create_folio', '=', False),('folio_id', '=', False)]}"
|
||||
/>
|
||||
<span attrs="{'invisible' : [('can_create_folio', '=', False)]}">
|
||||
or
|
||||
|
||||
Reference in New Issue
Block a user