Repository
OCA/pms · module folder · Try on Runboat
Module version
1.0.0
Category
Generic Modules/Property Management System
Folder size
7.13 MB
License
AGPL-3
Application
Yes
Auto-installable
No
Website
https://github.com/OCA/pms
Last tracking update
2026-08-07 09:06:26
Authors
Odoo Community Association (OCA), Open Source Integrators, Commit [Sun]
Maintainers
Odoo Community Association (OCA), Open Source Integrators, Commit [Sun]
Committers
Maxime Chambreuil, Weblate, OCA-git-bot, oca-ci, OCA Migration Bot
Odoo dependencies
Python dependencies
None
System dependencies
None
Required by
pms_account, pms_crm, pms_project, pms_stock, pms_website
Description
This module is the base module for the Property Management System (PMS)
suite.

It provides the foundation for managing real estate properties,
including:

- **Properties**: Track residential and commercial properties with
  address, timezone, area, floor information, tags, and images.
- **Rooms**: Define rooms within each property with type, capacity, and
  area.
- **Amenities**: Catalog amenities grouped by type (toiletries,
  connectivity, kitchen facilities, laundry, parking, pets, etc.).
- **Services**: Link service products (cleaning, internet, parking,
  etc.) to properties for operational tracking.
- **Stages**: Configure lifecycle stages (New, Available, Cancelled) for
  property pipelines with Kanban support.
- **Teams**: Organize properties into teams for management and
  reporting.
- **Tags**: Classify properties with color-coded tags.
- **Settings**: Enable or disable features (rooms, amenities, services,
  teams) per company and configure the unit of measure for areas.

This module also provides access rights (User / Manager), security rules
scoped per company, and integration points for optional PMS extensions
(accounting, contracts, reservations, website, CRM, and more).

Code Analysis

Views touched (29)
XML IDNameModelTypeStatus
pms_amenity_view_tree pms.amenity.tree pms.amenity list New
view_partner_form_inherit_pms_base res.partner.form.inherit.pms.base res.partner form Inherits base.view_partner_form
view_partner_tree_inherit_pms_base res.partner.tree.inherit.pms.base res.partner tree Inherits base.view_partner_tree
view_pms_amenity_form pms.amenity.form pms.amenity form New
view_pms_amenity_search pms.amenity.search pms.amenity search New
view_pms_amenity_type_tree pms.amenity.type.tree pms.amenity.type list New
view_pms_property_form pms.property.form pms.property form New
view_pms_property_kanban pms.property.kanban pms.property kanban New
view_pms_property_search pms.property.search pms.property search New
view_pms_property_tree pms.property.tree pms.property list New
view_pms_room_amenity_type_form pms.amenity.type.form pms.amenity.type form New
view_pms_room_form pms.room.form pms.room form New
view_pms_room_search pms.room.search pms.room search New
view_pms_room_tree pms.room.tree pms.room list New
view_pms_room_type_form pms.room.type.form pms.room.type form New
view_pms_room_type_tree pms.room.type.tree pms.room.type list New
view_pms_service_form pms.service.form pms.service form New
view_pms_service_search pms.service.search pms.service search New
view_pms_service_tree pms.service.tree pms.service list New
view_pms_tag_form Tag pms.tag form New
view_pms_tag_tree Tags pms.tag list New
view_pms_team_kanban pms.team.kanban pms.team kanban New
view_res_config_settings_form res.config.settings.view.form.pms res.config.settings form Inherits base.res_config_settings_view_form
view_res_partner_filter_inherit_pms_base res.partner.search.inherit.pms.base res.partner search Inherits base.view_res_partner_filter
view_stage_form pms.stage.view.form pms.stage form New
view_stage_search pms.stage.view. pms.stage search New
view_stage_tree pms.stage.view.tree pms.stage list New
view_team_form pms.team.view.form pms.team form New
view_team_tree pms.team.view.tree pms.team list New
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (12)

New fields (5)
  • active Boolean
    default=True help='Determines if amenity is active'
  • default_code Char
    help='Internal unique identifier of the amenity' string='Internal Reference'
  • name Char
    help='Name of the amenity' required=True translate=True
  • property_ids Many2many → pms.property
    column1='amenity_id' column2='property_id' comodel_name='pms.property' help='Properties with access to the amenity' ondelete='restrict' relation='pms_property_amenity_rel' string='Properties'
  • type_id Many2one → pms.amenity.type
    comodel_name='pms.amenity.type' help='Organize amenities by type (multimedia, comfort, etc ...)' string='Type'
Public methods (0)

No public methods.

New fields (2)
  • active Boolean
    default=True help='Determines if amenity type is active'
  • name Char
    required=True translate=True
Public methods (0)

No public methods.

New fields (27)
  • amenity_ids Many2many → pms.amenity
    column1='property_id' column2='amenity_id' comodel_name='pms.amenity' help='Amenities available in this property' ondelete='restrict' relation='pms_property_amenity_rel' string='Amenities'
  • area Float
  • balcony Boolean
    compute='_compute_balcony' store=True
  • childs_property_count Integer
    compute='_compute_childs_property' args: 'Children Count'
  • company_id Many2one → res.company
    comodel_name='res.company' string='Company'
  • floors_num Integer
    string='Floor'
  • heating Selection
    selection=[('tankless_gas', 'Gas (Tankless)'), ('boiler_gas', 'Gas Boiler'), ('tankless_electric', 'Electric (Tankless)'), ('boiler_electric', 'Electric Boiler'), ('boiler_building', 'Building Boiler')]
  • laundry_room Boolean
    compute='_compute_laundry_room' store=True
  • owner_id Many2one → res.partner
    comodel_name='res.partner' help='The owner of the property.' required=True string='Owner'
  • parent_id Many2one → pms.property
    comodel_name='pms.property' string='Parent Property'
  • parking_lot Boolean
    compute='_compute_parking_lot' store=True
  • partner_id Many2one → res.partner
    comodel_name='res.partner' help='Current property' ondelete='cascade' required=True string='Property'
  • pets Boolean
    compute='_compute_pets' store=True
  • property_child_ids One2many → pms.property
    string='Children Property' args: 'pms.property', 'parent_id'
  • qty_bedroom Integer
    compute='_compute_qty_bedroom' store=True
  • qty_dining_room Integer
    compute='_compute_qty_dining_room' store=True
  • qty_half_bathroom Integer
    compute='_compute_qty_half_bathroom' store=True
  • qty_kitchen Integer
    compute='_compute_qty_kitchen' store=True
  • qty_living_room Integer
    compute='_compute_qty_living_room' store=True
  • room_count Integer
    compute='_compute_room_count' string='Number of rooms'
  • room_ids One2many → pms.room
    comodel_name='pms.room' help='List of rooms in the property.' inverse_name='property_id' string='Rooms'
  • service_ids One2many → pms.service
    comodel_name='pms.service' help='List of services available in the property.' inverse_name='property_id' string='Services'
  • tag_ids Many2many → pms.tag
    column1='property_id' column2='tag_id' comodel_name='pms.tag' relation='pms_property_tag_rel' string='PMS Tags'
  • team_id Many2one → pms.team
    default=<expr> string='Team' args: 'pms.team'
  • terrace Boolean
    compute='_compute_terrace' store=True
  • tz Selection
    default=<expr> help='This field is used to determine the timezone of the property.' required=True selection=<expr> string='Timezone'
  • unit_floor Integer
Public methods (2)
  • action_view_childs_property_list(self)
  • create(self, vals_list)
    @api.model_create_multi

New fields (7)
  • active Boolean
    default=True help='Determines if room is active'
  • area Float
  • capacity Integer
    help='The maximum number of people that can occupy a room'
  • name Char
    help='Room Name' required=True string='Room Name'
  • property_id Many2one → pms.property
    comodel_name='pms.property' ondelete='restrict' required=True string='Property'
  • sequence Integer
    default=0 help='Field used to change the position of the rooms in tree view.Changing the position changes the sequence'
  • type_id Many2one → pms.room.type
    comodel_name='pms.room.type' help='Unique room type for the rooms' ondelete='restrict' required=True string='Room Type'
Public methods (0)

No public methods.

New fields (3)
  • icon Char
    help='Set Icon name from https://fontawesome.com/' string='Website Icon'
  • name Char
    required=True translate=True
  • sequence Integer
    default=0
Public methods (0)

No public methods.

New fields (6)
  • active Boolean
    default=True help='Determines if service is active'
  • icon Char
    help='Set Icon name from https://fontawesome.com/' string='Website Icon'
  • name Many2one → product.product
    comodel_name='product.product' domain="[('type', '=', 'service')]" help='Service' ondelete='restrict' required=True string='Service'
  • property_id Many2one → pms.property
    comodel_name='pms.property' ondelete='restrict' required=True string='Property'
  • sequence Integer
    default=0 help='Field used to change the position of the rooms in tree view.Changing the position changes the sequence'
  • vendor_id Many2one → res.partner
    comodel_name='res.partner' ondelete='restrict' required=True string='Vendor'
Public methods (0)

No public methods.

New fields (11)
  • active Boolean
    default=True
  • company_id Many2one → res.company
    default=<expr> index=True required=False string='Company' args: 'res.company'
  • custom_color Char
    default='#FFFFFF' help='Use Hex Code only Ex:-#FFFFFF' args: 'Color Code'
  • description Text
    translate=True
  • fold Boolean
    help='This stage is folded in the kanban view when there are no record in that stage to display.' args: 'Folded in Kanban'
  • is_closed Boolean
    help='Services in this stage are considered as closed.' args: 'Is a close stage'
  • is_default Boolean
    help='Used as default stage' args: 'Is a default stage'
  • name Char
    required=True translate=True
  • sequence Integer
    default=1
  • stage_type Selection
    required=True args: [('property', 'Property')], 'Type'
  • team_ids Many2many → pms.team
    default=<expr> string='Teams' args: 'pms.team'
Public methods (0)

No public methods.

New fields (5)
  • color Integer
    default=10 args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this tag' index=True required=True string='Company' args: 'res.company'
  • full_name Char
    compute='_compute_full_name'
  • name Char
    required=True translate=True
  • parent_id Many2one → pms.tag
    string='Parent' args: 'pms.tag'
Public methods (0)

No public methods.

New fields (8)
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this team' index=True required=False string='Company' args: 'res.company'
  • description Text
    translate=True
  • name Char
    required=True translate=True
  • property_count Integer
    compute='_compute_property_count' string='Properties Count'
  • property_ids One2many → pms.property
    string='Properties' args: 'pms.property', 'team_id'
  • sequence Integer
    default=1 help='Used to sort teams. Lower is better.'
  • stage_ids Many2many → pms.stage
    default=<expr> string='Stages' args: 'pms.stage'
Public methods (0)

No public methods.

New fields (1)
  • pms_uom Selection
    default='m' string='Unit of Measure' args: [('ft', 'Square Foot'), ('m', 'Square Meter')]
Public methods (0)

No public methods.

New fields (17)
  • group_pms_show_amenity Boolean
    implied_group='pms_base.group_pms_show_amenity' string='Show Amenities'
  • group_pms_show_room Boolean
    implied_group='pms_base.group_pms_show_room' string='Show Rooms'
  • group_pms_show_service Boolean
    implied_group='pms_base.group_pms_show_service' string='Show Services'
  • group_pms_show_team Boolean
    implied_group='pms_base.group_pms_show_team' string='Show Teams'
  • module_connector_guesty Boolean
    string='Connect with Guesty'
  • module_connector_wubook Boolean
    string='Connect with Wubook'
  • module_pms_account Boolean
    string='Manage Accounting'
  • module_pms_account_asset Boolean
    string='Manage Assets'
  • module_pms_contract Boolean
    string='Manage Contracts'
  • module_pms_crm Boolean
    string='Link a property to a lead'
  • module_pms_project Boolean
    string='Link to Projects and Tasks'
  • module_pms_purchase Boolean
    string='Link to Purchases'
  • module_pms_sale Boolean
    string='Manage Reservations'
  • module_pms_stock Boolean
    string='Manage Content'
  • module_pms_website Boolean
    string='Publish properties'
  • module_pms_website_sale Boolean
    string='Allow online booking'
  • pms_uom Selection
    readonly=False related='company_id.pms_uom' string='Unit of Measure'
Public methods (0)

No public methods.

New fields (1)
  • is_property Boolean
    string='Is a Property'
Public methods (0)

No public methods.