[IMP]pms: unique board_service_room_type by property

This commit is contained in:
Darío Lodeiros
2022-12-07 11:29:36 +01:00
parent 19b1280494
commit 8be6287863
16 changed files with 66 additions and 114 deletions

View File

@@ -808,6 +808,7 @@
> >
<field name="pms_board_service_id" ref="pms_board_service_breakfast" /> <field name="pms_board_service_id" ref="pms_board_service_breakfast" />
<field name="pms_room_type_id" ref="pms_room_type_economic" /> <field name="pms_room_type_id" ref="pms_room_type_economic" />
<field name="pms_property_id" ref="pms.main_pms_property" />
</record> </record>
<record <record
id="pms_board_service_room_eco_half_board" id="pms_board_service_room_eco_half_board"
@@ -815,6 +816,7 @@
> >
<field name="pms_board_service_id" ref="pms_board_service_half_board" /> <field name="pms_board_service_id" ref="pms_board_service_half_board" />
<field name="pms_room_type_id" ref="pms_room_type_economic" /> <field name="pms_room_type_id" ref="pms_room_type_economic" />
<field name="pms_property_id" ref="pms.main_pms_property" />
</record> </record>
<record <record
id="pms_board_service_room_eco_full_board" id="pms_board_service_room_eco_full_board"
@@ -822,6 +824,7 @@
> >
<field name="pms_board_service_id" ref="pms_board_service_full_board" /> <field name="pms_board_service_id" ref="pms_board_service_full_board" />
<field name="pms_room_type_id" ref="pms_room_type_economic" /> <field name="pms_room_type_id" ref="pms_room_type_economic" />
<field name="pms_property_id" ref="pms.main_pms_property" />
</record> </record>
<!-- Room Single --> <!-- Room Single -->
<record <record
@@ -830,6 +833,7 @@
> >
<field name="pms_board_service_id" ref="pms_board_service_breakfast" /> <field name="pms_board_service_id" ref="pms_board_service_breakfast" />
<field name="pms_room_type_id" ref="pms_room_type_single" /> <field name="pms_room_type_id" ref="pms_room_type_single" />
<field name="pms_property_id" ref="pms.main_pms_property" />
</record> </record>
<record <record
id="pms_board_service_room_single_half_board" id="pms_board_service_room_single_half_board"
@@ -837,6 +841,7 @@
> >
<field name="pms_board_service_id" ref="pms_board_service_half_board" /> <field name="pms_board_service_id" ref="pms_board_service_half_board" />
<field name="pms_room_type_id" ref="pms_room_type_single" /> <field name="pms_room_type_id" ref="pms_room_type_single" />
<field name="pms_property_id" ref="pms.main_pms_property" />
</record> </record>
<record <record
id="pms_board_service_room_single_full_board" id="pms_board_service_room_single_full_board"
@@ -844,6 +849,7 @@
> >
<field name="pms_board_service_id" ref="pms_board_service_full_board" /> <field name="pms_board_service_id" ref="pms_board_service_full_board" />
<field name="pms_room_type_id" ref="pms_room_type_single" /> <field name="pms_room_type_id" ref="pms_room_type_single" />
<field name="pms_property_id" ref="pms.main_pms_property" />
</record> </record>
<!-- Room Double --> <!-- Room Double -->
<record <record
@@ -852,6 +858,7 @@
> >
<field name="pms_board_service_id" ref="pms_board_service_breakfast" /> <field name="pms_board_service_id" ref="pms_board_service_breakfast" />
<field name="pms_room_type_id" ref="pms_room_type_double" /> <field name="pms_room_type_id" ref="pms_room_type_double" />
<field name="pms_property_id" ref="pms.main_pms_property" />
</record> </record>
<record <record
id="pms_board_service_room_double_half_board" id="pms_board_service_room_double_half_board"
@@ -859,6 +866,7 @@
> >
<field name="pms_board_service_id" ref="pms_board_service_half_board" /> <field name="pms_board_service_id" ref="pms_board_service_half_board" />
<field name="pms_room_type_id" ref="pms_room_type_double" /> <field name="pms_room_type_id" ref="pms_room_type_double" />
<field name="pms_property_id" ref="pms.main_pms_property" />
</record> </record>
<record <record
id="pms_board_service_room_full_board" id="pms_board_service_room_full_board"
@@ -866,6 +874,7 @@
> >
<field name="pms_board_service_id" ref="pms_board_service_full_board" /> <field name="pms_board_service_id" ref="pms_board_service_full_board" />
<field name="pms_room_type_id" ref="pms_room_type_double" /> <field name="pms_room_type_id" ref="pms_room_type_double" />
<field name="pms_property_id" ref="pms.main_pms_property" />
</record> </record>
<!-- Room Triple --> <!-- Room Triple -->
<record <record
@@ -874,6 +883,7 @@
> >
<field name="pms_board_service_id" ref="pms_board_service_breakfast" /> <field name="pms_board_service_id" ref="pms_board_service_breakfast" />
<field name="pms_room_type_id" ref="pms_room_type_triple" /> <field name="pms_room_type_id" ref="pms_room_type_triple" />
<field name="pms_property_id" ref="pms.main_pms_property" />
</record> </record>
<record <record
id="pms_board_service_room_triple_full_board" id="pms_board_service_room_triple_full_board"
@@ -881,6 +891,7 @@
> >
<field name="pms_board_service_id" ref="pms_board_service_full_board" /> <field name="pms_board_service_id" ref="pms_board_service_full_board" />
<field name="pms_room_type_id" ref="pms_room_type_triple" /> <field name="pms_room_type_id" ref="pms_room_type_triple" />
<field name="pms_property_id" ref="pms.main_pms_property" />
</record> </record>
<!-- Room Quadruple --> <!-- Room Quadruple -->
<record <record
@@ -889,6 +900,7 @@
> >
<field name="pms_board_service_id" ref="pms_board_service_breakfast" /> <field name="pms_board_service_id" ref="pms_board_service_breakfast" />
<field name="pms_room_type_id" ref="pms_room_type_quadruple" /> <field name="pms_room_type_id" ref="pms_room_type_quadruple" />
<field name="pms_property_id" ref="pms.main_pms_property" />
</record> </record>
<!-- Room Grand suite --> <!-- Room Grand suite -->
<record <record
@@ -897,6 +909,7 @@
> >
<field name="pms_board_service_id" ref="pms_board_service_breakfast" /> <field name="pms_board_service_id" ref="pms_board_service_breakfast" />
<field name="pms_room_type_id" ref="demo_pms_room_type_grand_suite" /> <field name="pms_room_type_id" ref="demo_pms_room_type_grand_suite" />
<field name="pms_property_id" ref="san_carlos_property" />
</record> </record>
<record <record
id="pms_board_service_room_grand_suite_half_board" id="pms_board_service_room_grand_suite_half_board"
@@ -904,6 +917,7 @@
> >
<field name="pms_board_service_id" ref="pms_board_service_half_board" /> <field name="pms_board_service_id" ref="pms_board_service_half_board" />
<field name="pms_room_type_id" ref="demo_pms_room_type_grand_suite" /> <field name="pms_room_type_id" ref="demo_pms_room_type_grand_suite" />
<field name="pms_property_id" ref="san_carlos_property" />
</record> </record>
<record <record
id="pms_board_service_room_grand_suite_full_board" id="pms_board_service_room_grand_suite_full_board"
@@ -911,6 +925,7 @@
> >
<field name="pms_board_service_id" ref="pms_board_service_full_board" /> <field name="pms_board_service_id" ref="pms_board_service_full_board" />
<field name="pms_room_type_id" ref="demo_pms_room_type_grand_suite" /> <field name="pms_room_type_id" ref="demo_pms_room_type_grand_suite" />
<field name="pms_property_id" ref="san_carlos_property" />
</record> </record>
<!-- Room Junior suite --> <!-- Room Junior suite -->
<record <record
@@ -919,6 +934,7 @@
> >
<field name="pms_board_service_id" ref="pms_board_service_breakfast" /> <field name="pms_board_service_id" ref="pms_board_service_breakfast" />
<field name="pms_room_type_id" ref="demo_pms_room_type_junior_suite" /> <field name="pms_room_type_id" ref="demo_pms_room_type_junior_suite" />
<field name="pms_property_id" ref="san_carlos_property" />
</record> </record>
<record <record
id="pms_board_service_room_junior_suite_half_board" id="pms_board_service_room_junior_suite_half_board"
@@ -926,6 +942,7 @@
> >
<field name="pms_board_service_id" ref="pms_board_service_half_board" /> <field name="pms_board_service_id" ref="pms_board_service_half_board" />
<field name="pms_room_type_id" ref="demo_pms_room_type_junior_suite" /> <field name="pms_room_type_id" ref="demo_pms_room_type_junior_suite" />
<field name="pms_property_id" ref="san_carlos_property" />
</record> </record>
<record <record
id="pms_board_service_room_junior_suite_full_board" id="pms_board_service_room_junior_suite_full_board"
@@ -933,6 +950,7 @@
> >
<field name="pms_board_service_id" ref="pms_board_service_full_board" /> <field name="pms_board_service_id" ref="pms_board_service_full_board" />
<field name="pms_room_type_id" ref="demo_pms_room_type_junior_suite" /> <field name="pms_room_type_id" ref="demo_pms_room_type_junior_suite" />
<field name="pms_property_id" ref="san_carlos_property" />
</record> </record>
<!-- room.closure.reason --> <!-- room.closure.reason -->
<record id="pms_room_closure_reason_maintenance" model="room.closure.reason"> <record id="pms_room_closure_reason_maintenance" model="room.closure.reason">

View File

@@ -21,18 +21,14 @@ class PmsBoardServiceRoomType(models.Model):
ondelete="cascade", ondelete="cascade",
check_pms_properties=True, check_pms_properties=True,
) )
pms_property_ids = fields.Many2many( pms_property_id = fields.Many2one(
string="Properties", string="Property",
help="Properties with access to the element;" help="Property with access to the element;"
" if not set, all properties can access", " if not set, all property can access",
required=False, required=False,
ondelete="restrict", ondelete="restrict",
comodel_name="pms.property", comodel_name="pms.property",
relation="pms_board_service_room_type_pms_property_rel",
column1="pms_board_service_room_type_id",
column2="pms_property_id",
check_pms_properties=True, check_pms_properties=True,
compute="_compute_pms_property_ids",
store=True, store=True,
) )
pms_room_type_id = fields.Many2one( pms_room_type_id = fields.Many2one(
@@ -64,43 +60,6 @@ class PmsBoardServiceRoomType(models.Model):
help="Indicates if this board service is applied by default in the room type", help="Indicates if this board service is applied by default in the room type",
) )
@api.depends(
"pms_room_type_id",
"pms_room_type_id.pms_property_ids",
"pms_board_service_id",
"pms_board_service_id.pms_property_ids",
)
def _compute_pms_property_ids(self):
for record in self:
if (
record.pms_room_type_id.pms_property_ids
and record.pms_board_service_id.pms_property_ids
):
record.pms_property_ids = self.env["pms.property"].search(
[
(
"id",
"in",
list(
set(record.pms_room_type_id.pms_property_ids.ids)
& set(record.pms_board_service_id.pms_property_ids.ids)
),
)
]
)
elif (
record.pms_room_type_id.pms_property_ids
and not record.pms_board_service_id.pms_property_ids
):
record.pms_property_ids = record.pms_room_type_id.pms_property_ids
elif (
not record.pms_room_type_id.pms_property_ids
and record.pms_board_service_id.pms_property_ids
):
record.pms_property_ids = record.pms_board_service_id.pms_property_ids
else:
record.pms_property_ids = False
@api.depends("board_service_line_ids.amount") @api.depends("board_service_line_ids.amount")
def _compute_board_amount(self): def _compute_board_amount(self):
for record in self: for record in self:
@@ -119,7 +78,7 @@ class PmsBoardServiceRoomType(models.Model):
return res return res
@api.constrains("by_default") @api.constrains("by_default")
def constrains_duplicated_board_defaul(self): def constrains_duplicated_board_default(self):
for record in self: for record in self:
default_boards = ( default_boards = (
record.pms_room_type_id.board_service_room_type_ids.filtered( record.pms_room_type_id.board_service_room_type_ids.filtered(
@@ -127,7 +86,12 @@ class PmsBoardServiceRoomType(models.Model):
) )
) )
# TODO Check properties (with different propertys is allowed) # TODO Check properties (with different propertys is allowed)
if any(default_boards.filtered(lambda l: l.id != record.id)): if any(
default_boards.filtered(
lambda l: l.id != record.id
and l.pms_property_id == record.pms_property_id
)
):
raise UserError(_("""Only can set one default board service""")) raise UserError(_("""Only can set one default board service"""))
def open_board_lines_form(self): def open_board_lines_form(self):
@@ -156,14 +120,14 @@ class PmsBoardServiceRoomType(models.Model):
@api.model @api.model
def create(self, vals): def create(self, vals):
# properties = False # properties = False
if "pms_board_service_id" in vals: if "pms_board_service_id" in vals and "board_service_line_ids" not in vals:
vals.update( vals.update(
self.prepare_board_service_reservation_ids(vals["pms_board_service_id"]) self.prepare_board_service_reservation_ids(vals["pms_board_service_id"])
) )
return super(PmsBoardServiceRoomType, self).create(vals) return super(PmsBoardServiceRoomType, self).create(vals)
def write(self, vals): def write(self, vals):
if "pms_board_service_id" in vals: if "pms_board_service_id" in vals and "board_service_line_ids" not in vals:
vals.update( vals.update(
self.prepare_board_service_reservation_ids(vals["pms_board_service_id"]) self.prepare_board_service_reservation_ids(vals["pms_board_service_id"])
) )

View File

@@ -1,6 +1,6 @@
# Copyright 2017 Dario Lodeiros # Copyright 2017 Dario Lodeiros
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models from odoo import fields, models
class PmsBoardServiceRoomTypeLine(models.Model): class PmsBoardServiceRoomTypeLine(models.Model):
@@ -16,15 +16,13 @@ class PmsBoardServiceRoomTypeLine(models.Model):
comodel_name="pms.board.service.room.type", comodel_name="pms.board.service.room.type",
ondelete="cascade", ondelete="cascade",
) )
pms_property_ids = fields.Many2many( pms_property_id = fields.Many2one(
string="Properties", string="Property",
help="Properties with access to the element;" help="Property with access to the element;"
" if not set, all properties can access", " if not set, all properties can access",
comodel_name="pms.property", comodel_name="pms.property",
relation="pms_board_service_room_type_line_pms_property_rel",
column1="pms_board_service_room_type_id",
column2="pms_property_id",
check_pms_properties=True, check_pms_properties=True,
related="pms_board_service_room_type_id.pms_property_id",
) )
product_id = fields.Many2one( product_id = fields.Many2one(
string="Product", string="Product",
@@ -34,41 +32,12 @@ class PmsBoardServiceRoomTypeLine(models.Model):
check_pms_properties=True, check_pms_properties=True,
domain="[('is_pms_available', '=', True)]", domain="[('is_pms_available', '=', True)]",
) )
# TODO def default_amount "amount of service"
amount = fields.Float( amount = fields.Float(
string="Amount", string="Amount",
help="Price for this Board Service Room Type Line/Product", help="Price for this Board Service Room Type Line/Product",
default=0.0, default=lambda self: self._default_amount(),
digits=("Product Price"), digits=("Product Price"),
) )
@api.model def _default_amount(self):
def create(self, vals): return self.product_id.list_price
properties = False
if "pms_board_service_room_type_id" in vals:
board_service = self.env["pms.board.service.room.type"].browse(
vals["pms_board_service_room_type_id"]
)
properties = board_service.pms_property_ids
if properties:
vals.update(
{
"pms_property_ids": properties,
}
)
return super(PmsBoardServiceRoomTypeLine, self).create(vals)
def write(self, vals):
properties = False
if "pms_board_service_room_type_id" in vals:
board_service = self.env["pms.board.service.room.type"].browse(
vals["pms_board_service_room_type_id"]
)
properties = board_service.pms_property_ids
if properties:
vals.update(
{
"pms_property_ids": properties,
}
)
return super(PmsBoardServiceRoomTypeLine, self).write(vals)

View File

@@ -827,6 +827,7 @@ class PmsReservation(models.Model):
[ [
("pms_room_type_id", "=", reservation.room_type_id.id), ("pms_room_type_id", "=", reservation.room_type_id.id),
("by_default", "=", True), ("by_default", "=", True),
("pms_property_id", "=", reservation.pms_property_id.id),
] ]
) )
if ( if (

View File

@@ -144,25 +144,6 @@ class ProductPricelist(models.Model):
) )
return items return items
@api.constrains("pricelist_type", "item_ids", "pms_property_ids")
def _check_pricelist_type(self):
for record in self:
if record.item_ids:
for item in record.item_ids:
if record.pricelist_type == "daily" and (
item.compute_price != "fixed"
or len(item.pms_property_ids) != 1
or not item.date_end_consumption
or not item.date_start_consumption
or item.date_end_consumption != item.date_start_consumption
):
raise ValidationError(
_(
"Daily Plan must have fixed price, "
"only one property and its items must be daily"
)
)
@api.constrains("is_pms_available", "availability_plan_id") @api.constrains("is_pms_available", "availability_plan_id")
def _check_is_pms_available(self): def _check_is_pms_available(self):
for record in self: for record in self:

View File

@@ -23,6 +23,10 @@ class ProductProduct(models.Model):
super(ProductProduct, self)._compute_product_price() super(ProductProduct, self)._compute_product_price()
def _compute_board_price(self): def _compute_board_price(self):
pms_property_id = (
self.env.context.get("property")
or self.env.user.get_active_property_ids()[0]
)
for record in self: for record in self:
if self._context.get("board_service"): if self._context.get("board_service"):
record.board_price = ( record.board_price = (
@@ -35,6 +39,7 @@ class ProductProduct(models.Model):
self._context.get("board_service"), self._context.get("board_service"),
), ),
("product_id", "=", record.id), ("product_id", "=", record.id),
("pms_property_id", "=", pms_property_id),
] ]
) )
.amount .amount

View File

@@ -102,7 +102,7 @@
<field name="model_id" ref="model_pms_board_service_room_type" /> <field name="model_id" ref="model_pms_board_service_room_type" />
<field name="global" eval="True" /> <field name="global" eval="True" />
<field name="domain_force"> <field name="domain_force">
['|',('pms_property_ids','=',False),('pms_property_ids', 'in', ['|',('pms_property_id','=',False),('pms_property_id', 'in',
user.get_active_property_ids())] user.get_active_property_ids())]
</field> </field>
</record> </record>

View File

@@ -770,6 +770,7 @@ class TestPmsBookingEngine(TestPms):
{ {
"pms_room_type_id": self.test_room_type_double.id, "pms_room_type_id": self.test_room_type_double.id,
"pms_board_service_id": self.board_service_test.id, "pms_board_service_id": self.board_service_test.id,
"pms_property_id": self.pms_property1.id,
} }
) )
# self.board_service_room_type.flush() # self.board_service_room_type.flush()
@@ -853,6 +854,7 @@ class TestPmsBookingEngine(TestPms):
{ {
"pms_room_type_id": self.test_room_type_double.id, "pms_room_type_id": self.test_room_type_double.id,
"pms_board_service_id": self.board_service_test.id, "pms_board_service_id": self.board_service_test.id,
"pms_property_id": self.pms_property1.id,
} }
) )
discount = 15 discount = 15

View File

@@ -493,6 +493,7 @@ class TestPmsFolioInvoice(TestPms):
{ {
"pms_room_type_id": self.room_type_double.id, "pms_room_type_id": self.room_type_double.id,
"pms_board_service_id": self.board_service1.id, "pms_board_service_id": self.board_service1.id,
"pms_property_id": self.property.id,
} }
) )
self.reservation1 = self.env["pms.reservation"].create( self.reservation1 = self.env["pms.reservation"].create(
@@ -549,6 +550,7 @@ class TestPmsFolioInvoice(TestPms):
{ {
"pms_room_type_id": self.room_type_double.id, "pms_room_type_id": self.room_type_double.id,
"pms_board_service_id": self.board_service1.id, "pms_board_service_id": self.board_service1.id,
"pms_property_id": self.property.id,
} }
) )
self.reservation1 = self.env["pms.reservation"].create( self.reservation1 = self.env["pms.reservation"].create(
@@ -606,6 +608,7 @@ class TestPmsFolioInvoice(TestPms):
{ {
"pms_room_type_id": self.room_type_double.id, "pms_room_type_id": self.room_type_double.id,
"pms_board_service_id": self.board_service1.id, "pms_board_service_id": self.board_service1.id,
"pms_property_id": self.property.id,
} }
) )
self.reservation1 = self.env["pms.reservation"].create( self.reservation1 = self.env["pms.reservation"].create(
@@ -761,6 +764,7 @@ class TestPmsFolioInvoice(TestPms):
{ {
"pms_room_type_id": self.demo_room_type_double.id, "pms_room_type_id": self.demo_room_type_double.id,
"pms_board_service_id": self.board_service1.id, "pms_board_service_id": self.board_service1.id,
"pms_property_id": self.pms_property_demo.id,
} }
) )
# ACT # ACT
@@ -863,6 +867,7 @@ class TestPmsFolioInvoice(TestPms):
{ {
"pms_room_type_id": self.room_type_double.id, "pms_room_type_id": self.room_type_double.id,
"pms_board_service_id": self.board_service1.id, "pms_board_service_id": self.board_service1.id,
"pms_property_id": self.property.id,
} }
) )
# ACT # ACT

View File

@@ -72,6 +72,7 @@ class TestPmsFolioSaleLine(TestPms):
{ {
"pms_room_type_id": self.room_type_double.id, "pms_room_type_id": self.room_type_double.id,
"pms_board_service_id": self.board_service_test.id, "pms_board_service_id": self.board_service_test.id,
"pms_property_id": self.pms_property1.id,
} }
) )
self.extra_service = self.env["pms.service"].create( self.extra_service = self.env["pms.service"].create(

View File

@@ -389,6 +389,7 @@ class TestPmsMultiproperty(TestPms):
{ {
"pms_room_type_id": room_type_double.id, "pms_room_type_id": room_type_double.id,
"pms_board_service_id": board_service_test.id, "pms_board_service_id": board_service_test.id,
"pms_property_id": self.pms_property1.id,
} }
) )
# ASSERT # ASSERT

View File

@@ -8,7 +8,7 @@
<group> <group>
<field name="amount" /> <field name="amount" />
<field name="board_service_line_ids"> <field name="board_service_line_ids">
<field name="pms_property_ids" invisible="1" /> <field name="pms_property_id" />
<tree editable="bottom"> <tree editable="bottom">
<field <field
name="pms_board_service_room_type_id" name="pms_board_service_room_type_id"
@@ -16,7 +16,7 @@
/> />
<field name="product_id" /> <field name="product_id" />
<field name="amount" /> <field name="amount" />
<field name="pms_property_ids" invisible="1" /> <field name="pms_property_id" invisible="1" />
</tree> </tree>
</field> </field>
</group> </group>

View File

@@ -66,7 +66,7 @@
<field name="pms_room_type_id" invisible="1" /> <field name="pms_room_type_id" invisible="1" />
<field name="pms_board_service_id" /> <field name="pms_board_service_id" />
<field name="amount" /> <field name="amount" />
<field name="pms_property_ids" invisible="1" /> <field name="pms_property_id" />
<button <button
type="object" type="object"
class="oe_stat_button" class="oe_stat_button"

View File

@@ -353,7 +353,12 @@ class AvailabilityWizard(models.TransientModel):
string="Board Service", string="Board Service",
help="Board Service included in the room", help="Board Service included in the room",
comodel_name="pms.board.service.room.type", comodel_name="pms.board.service.room.type",
domain="[('pms_room_type_id','=',room_type_id)]", domain="""
[
('pms_room_type_id','=',room_type_id),
('pms_property_id','=',pms_property_id)
]
""",
check_pms_properties=True, check_pms_properties=True,
) )

View File

@@ -84,6 +84,7 @@
decoration-primary="value_num_rooms_selected &gt; 0" decoration-primary="value_num_rooms_selected &gt; 0"
decoration-bf="value_num_rooms_selected &gt; 0" decoration-bf="value_num_rooms_selected &gt; 0"
> >
<field name="pms_property_id" invisible="1" />
<field <field
name="room_type_id" name="room_type_id"
readonly="1" readonly="1"

View File

@@ -386,8 +386,7 @@ class WizardFolioChanges(models.TransientModel):
lambda x: x.pms_board_service_id.id == new_board_service_id lambda x: x.pms_board_service_id.id == new_board_service_id
and ( and (
reservation.folio_id.pms_property_id.id reservation.folio_id.pms_property_id.id
in x.pms_property_ids.ids == x.pms_property_id.ids
or not x.pms_property_ids
) )
) )
) )