[ADD] UX functionalities

This commit is contained in:
Darío Lodeiros
2021-03-21 21:25:41 +01:00
parent 8e7f68f2b9
commit 516db43180
9 changed files with 103 additions and 53 deletions

View File

@@ -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",

View File

@@ -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):

View File

@@ -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",

View File

@@ -64,7 +64,6 @@ class ResPartner(models.Model):
if not args:
args = []
domain = [
"|",
"|",
("phone", operator, name),
("mobile", operator, name),

View File

@@ -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'"

View File

@@ -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"

View File

@@ -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 />

View File

@@ -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,
}
)

View File

@@ -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