Property Management System

pms_base
REPOSITORY
REPOSITORYOCA/pms
GIT
GIThttps://github.com/OCA/pms.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/pms/tree/19.0/pms_base
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYGeneric Modules/Property Management System
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Open Source Integrators, Commit [Sun]
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Open Source Integrators, Commit [Sun]
COMMITTERS
COMMITTERSMaxime Chambreuil, Weblate, OCA-git-bot, oca-ci, OCA Migration Bot
WEBSITE
WEBSITEhttps://github.com/OCA/pms
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:40:50
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_geolocalize
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - html_editor
    - product
    - uom
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 xpath Inherits base.view_partner_form
view_partner_tree_inherit_pms_base res.partner.tree.inherit.pms.base res.partner field 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 xpath Inherits base.res_config_settings_view_form
view_res_partner_filter_inherit_pms_base res.partner.search.inherit.pms.base res.partner field 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
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.