Repository
OCA/vertical-abbey · module folder · Try on Runboat
Module version
1.0.0
Category
Lodging
Folder size
0.59 MB
License
AGPL-3
Application
Yes
Auto-installable
No
Website
https://github.com/OCA/vertical-abbey
Last tracking update
2026-08-07 08:43:07
Authors
Akretion, Odoo Community Association (OCA), Barroux Abbey
Maintainers
Akretion, Odoo Community Association (OCA), Barroux Abbey
Committers
Alexis de Lattre, OCA-git-bot, oca-ci
Odoo dependencies
OCA/web:
odoo/odoo:
- web
- bus
Python dependencies
xlsxwriter
System dependencies
None
Required by
donation_stay, stay_api, stay_report_py3o
Description
This module manages stays ; it handles lunches, dinners and bed nights.
It allows the booking of rooms and dormitories with capacity check.

It has been initially developped by the [Barroux
Abbey](https://www.barroux.org/) to manage the stays of the guests at
the abbey and has been adopted by several other French abbeys.

Code Analysis

Views touched (54)
XML IDNameModelTypeStatus
report_stayjournalmeal report_stayjournalmeal ir.ui.view qweb New
res_config_settings_view_form res.config.settings form Inherits base.res_config_settings_view_form
stay.report_stayjournalmeal_document stay.report_stayjournalmeal_document ir.ui.view qweb New
stay_building_form stay.building form New
stay_building_search stay.building search New
stay_building_tree stay.building list New
stay_calendar stay.calendar stay.stay calendar New
stay_date_label_calendar stay.date.label.calendar stay.date.label calendar New
stay_date_label_form stay.date.label.form stay.date.label form New
stay_date_label_search stay.date.label.search stay.date.label search New
stay_date_label_tree stay.date.label.list stay.date.label list New
stay_fire_print_form stay_fire_print.form stay.fire.print form New
stay_form stay.form stay.stay form New
stay_graph stay.graph stay.stay graph New
stay_group_form stay.group.form stay.group form New
stay_group_search stay.group.search stay.group search New
stay_group_tree stay.group.list stay.group list New
stay_journal_print_form stay_journal_print.form stay.journal.print form New
stay_line_form stay.line.form stay.line form New
stay_line_graph stay.line.graph stay.line graph New
stay_line_mass_update_form stay.line.mass.update form New
stay_line_pivot stay.line.pivot stay.line pivot New
stay_line_reset stay.line.reset form New
stay_line_search stay.line.search stay.line search New
stay_line_tree stay.line.list stay.line list New
stay_multi_duplicate_form stay.multi.duplicate form New
stay_pivot stay.graph stay.stay pivot New
stay_refectory_form stay.refectory.form stay.refectory form New
stay_refectory_search stay.refectory.search stay.refectory search New
stay_refectory_tree stay.refectory.list stay.refectory list New
stay_room_assign_calendar stay.room.assign calendar New
stay_room_assign_detailed_form stay.room.assign form New
stay_room_assign_form stay.room.assign form New
stay_room_assign_pivot stay.room.assign pivot New
stay_room_assign_search stay.room.assign.search stay.room.assign search New
stay_room_assign_timeline stay.room.assign.timeline stay.room.assign New
stay_room_assign_tree stay.room.assign list New
stay_room_form stay.room.form stay.room form New
stay_room_mass_assign_form stay.room.mass.assign form New
stay_room_search stay.room.search stay.room search New
stay_room_to_clean_tree stay.room.list stay.room list New
stay_room_tree stay.room.list stay.room list New
stay_search stay.search stay.stay search New
stay_stay_xlsx_form stay.stay.xlsx.form stay.stay.xlsx form New
stay_tag_form stay.tag form New
stay_tag_search stay.tag search New
stay_tag_tree stay.tag list New
stay_toclean_print_form stay_toclean_print.form stay.toclean.print form New
stay_tree stay.list stay.stay list New
stay_tree_reverse_order stay.list.reverse.order stay.stay list New
stay_tree_with_kpis stay.list stay.stay list New
view_partner_form stay.button.res.partner.form res.partner form Inherits base.view_partner_form
view_users_form donation.res.users.form res.users form Inherits base.view_users_form
view_users_form_simple_modif donation.preferences.res.users.form res.users form Inherits base.view_users_form_simple_modif
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (21)

New fields (2)
  • default_refectory_id Many2one → stay.refectory
    check_company=True ondelete='restrict' string='Default Refectory' args: 'stay.refectory'
  • stay_notify_user_ids Many2many → res.users
    column1='res_company_id' column2='res_users_id' relation='stay_notify_company_user_rel' string='Users Notified by E-mail for Stays without Group' args: 'res.users'
Public methods (0)

No public methods.

New fields (6)
  • group_stay_breakfast Boolean
    implied_group='stay.group_stay_breakfast' string='Manage Breakfast'
  • group_stay_group Boolean
    implied_group='stay.group_stay_group' string='Manage Stay Groups'
  • group_stay_picnic Boolean
    implied_group='stay.group_stay_picnic' string='Manage Picnic'
  • stay_default_refectory_id Many2one
    readonly=False related='company_id.default_refectory_id'
  • stay_notify_user_ids Many2many
    readonly=False related='company_id.stay_notify_user_ids'
  • stay_room_transition Selection
    config_parameter='stay.room_transition' string='Room Transition' args: [('one_empty_period', 'One Empty Period'), ('immediate', 'Immediate'), ('night', 'Night')]
Public methods (0)

No public methods.

New fields (2)
  • stay_count Integer
    compute='_compute_stay_count' compute_sudo=True string='# of Stays'
  • stay_ids One2many → stay.stay
    string='Stays' args: 'stay.stay', 'partner_id'
Public methods (0)

No public methods.

New fields (1)
  • context_stay_group_id Many2one → stay.group
    args: 'stay.group', 'Stay Group'
Public methods (0)

No public methods.

New fields (4)
  • active Boolean
    default=True
  • name Char
    required=True
  • room_ids One2many → stay.room
    string='Rooms' args: 'stay.room', 'building_id'
  • sequence Integer
Public methods (0)

No public methods.

New fields (2)
  • date Date
    index=True required=True
  • name Char
    string='Label'
Public methods (0)

No public methods.

New fields (2)
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company'
  • date Date
    default=<expr> required=True
Public methods (1)
  • run(self)

New fields (7)
  • company_id Many2one → res.company
    default=<expr> index=True ondelete='cascade' required=True string='Company' args: 'res.company'
  • default_no_meals Boolean
    string='No Meals by Default'
  • default_refectory_id Many2one → stay.refectory
    check_company=True ondelete='restrict' string='Default Refectory' args: 'stay.refectory'
  • name Char
    required=True string='Group Name'
  • notify_user_ids Many2many → res.users
    string='Users Notified by E-mail' args: 'res.users'
  • room_ids One2many → stay.room
    string='Rooms' args: 'stay.room', 'group_id'
  • sequence Integer
Public methods (0)

No public methods.

New fields (4)
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company'
  • date Date
    default=_default_date required=True
  • date_label Char
    compute='_compute_date_label'
  • report_type Selection
    default='general' required=True args: [('general', 'General'), ('meal', 'Meals'), ('arrival', 'Arrivals')]
Public methods (9)
  • get_report_by_refectory(self)
    Method for the report (replace report parser)
  • print_journal(self)
  • print_journal_arrival(self)
  • print_journal_general(self)
  • print_journal_meal(self)
  • report_arrival_data(self)
  • report_date_formatted(self)
  • report_edit_datetime(self)
  • report_general_data(self)

New fields (14)
  • bed_night_qty Integer
    string='Bed Nights'
  • breakfast_qty Integer
    string='Breakfast'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company'
  • date Date
    default=fields.Date.context_today index=True required=True
  • dinner_qty Integer
    string='Dinners'
  • group_id Many2one → stay.group
    compute='_compute_group_id' index=True readonly=False store=True args: 'stay.group'
  • lunch_qty Integer
    string='Lunches'
  • my_stay_group Boolean
    compute='_compute_my_stay_group' search='_search_my_stay_group'
  • partner_id Many2one → res.partner
    help='If guest is anonymous, leave this field empty.' string='Guest' args: 'res.partner'
  • partner_name Text
    compute='_compute_partner_name' precompute=True readonly=False required=True store=True string='Guest Names'
  • picnic_lunch_qty Integer
    string='Picnic'
  • refectory_id Many2one → stay.refectory
    check_company=True default=<expr> args: 'stay.refectory'
  • rooms_display_name Char
    related='stay_id.rooms_display_name' store=True
  • stay_id Many2one → stay.stay
    check_company=True ondelete='cascade' args: 'stay.stay'
Public methods (0)

No public methods.

New fields (9)
  • convert_lunch_to_picnic Boolean
    string='Convert Lunches to Picnics'
  • end_date Date
    required=True
  • no_bed_night Boolean
    string='No Bed Nights'
  • no_breakfast Boolean
    string='No Breakfasts'
  • no_dinner Boolean
    string='No Dinners'
  • no_lunch Boolean
    string='No Lunches'
  • refectory_id Many2one → stay.refectory
    string='New Refectory' args: 'stay.refectory'
  • start_date Date
    required=True
  • stay_id Many2one → stay.stay
    readonly=True required=True args: 'stay.stay'
Public methods (2)
  • apply(self)
  • default_get(self, fields_list)
    @api.model

New fields (1)
  • stay_id Many2one → stay.stay
    readonly=True required=True args: 'stay.stay'
Public methods (2)
  • default_get(self, fields_list)
    @api.model
  • reset_lines(self)

New fields (7)
  • create_state Selection
    default='draft' required=True args: [('draft', 'Draft'), ('confirm', 'Confirmed')]
  • end_date Date
    required=True
  • frequency Selection
    default='weekly' required=True args: [('weekly', 'Weekly')]
  • keep_assignments Boolean
    default=True string='Keep assignments?'
  • keep_notes Boolean
    string='Keep Notes?'
  • start_date Date
    default=fields.Date.context_today required=True
  • stay_id Many2one → stay.stay
    readonly=True required=True args: 'stay.stay'
Public methods (2)
  • default_get(self, fields_list)
    @api.model
  • run(self)

New fields (6)
  • active Boolean
    default=True
  • capacity Integer
  • code Char
    size=10
  • company_id Many2one → res.company
    default=<expr> index=True ondelete='cascade' required=True args: 'res.company'
  • name Char
    required=True
  • sequence Integer
    default=10
Public methods (0)

No public methods.

New fields (18)
  • active Boolean
    default=True
  • allow_simultaneous Boolean
    compute='_compute_allow_simultaneous' help='This option applies for rooms where bed quantity > 1. You should enable this option if you allow to have several stays at the same time in the room.' precompute=True readonly=False store=True
  • bed_qty Integer
    default=1 string='Number of beds'
  • building_id Many2one → stay.building
    index=True ondelete='restrict' args: 'stay.building'
  • code Char
    copy=False size=10
  • company_id Many2one → res.company
    default=<expr> index=True ondelete='cascade' required=True args: 'res.company'
  • fire_report_exclude Boolean
    string='Exclude from Fire Report'
  • fire_report_sequence Integer
    string='Order for Fire Report'
  • group_id Many2one → stay.group
    check_company=True domain="[('company_id', '=', company_id)]" index=True args: 'stay.group'
  • my_stay_group Boolean
    compute='_compute_my_stay_group' search='_search_my_stay_group'
  • name Char
    copy=False required=True
  • next_stay_arrival_date Date
    compute='_compute_next_stay'
  • next_stay_arrival_time Selection
    compute='_compute_next_stay' args: [('morning', 'Morning'), ('afternoon', 'Afternoon'), ('evening', 'Evening'), ('unknown', 'Unknown')]
  • next_stay_id Many2one → stay.stay
    compute='_compute_next_stay' args: 'stay.stay'
  • next_stay_partner_name Char
    compute='_compute_next_stay'
  • notes Text
  • sequence Integer
    default=10
  • to_clean Char
    help='When the field has a value, it means the room must be cleaned (when a stay is terminated, this field is auto-set with the stay description). When the room is cleaned, the field is emptied.'
Public methods (2)
  • action_archive(self)
  • mark_as_cleaned(self)

New fields (24)
  • active Boolean
    related='room_id.active' store=True
  • arrival_date Date
    readonly=False related='stay_id.arrival_date' store=True
  • arrival_datetime Datetime
    related='stay_id.arrival_datetime' store=True
  • arrival_note Char
    readonly=False related='stay_id.arrival_note' store=True
  • arrival_time Selection
    readonly=False related='stay_id.arrival_time' store=True
  • company_id Many2one
    index=True related='stay_id.company_id' store=True
  • conflict_room_ids Many2many → stay.room
    compute='_compute_conflict_room_ids' string='Conflict Rooms' args: 'stay.room'
  • construction Boolean
    related='stay_id.construction' store=True
  • departure_date Date
    readonly=False related='stay_id.departure_date' store=True
  • departure_datetime Datetime
    related='stay_id.departure_datetime' store=True
  • departure_note Char
    readonly=False related='stay_id.departure_note' store=True
  • departure_time Selection
    readonly=False related='stay_id.departure_time' store=True
  • group_id Many2one
    index=True related='room_id.group_id' store=True
  • guest_qty Integer
    required=True string='Guest Quantity'
  • my_stay_group Boolean
    compute='_compute_my_stay_group' search='_search_my_stay_group'
  • notes Text
    readonly=False related='stay_id.notes' store=True
  • partner_id Many2one
    related='stay_id.partner_id' store=True
  • partner_name Text
    related='stay_id.partner_name' store=True
  • partner_name_room Char
    string='Guest (optional)'
  • room_id Many2one → stay.room
    check_company=True domain="[('id', 'not in', conflict_room_ids), ('company_id', '=', company_id), ('group_id', 'in', (False, stay_group_id))]" index=True ondelete='restrict' required=True args: 'stay.room'
  • state Selection
    related='stay_id.state' store=True
  • stay_group_id Many2one
    related='stay_id.group_id' store=True string='Stay Group'
  • stay_id Many2one → stay.stay
    index=True ondelete='cascade' args: 'stay.stay'
  • tag_ids Many2many
    readonly=False related='stay_id.tag_ids'
Public methods (2)
  • room_id_change(self)
    @api.onchange('room_id')
  • show_stay(self)

New fields (6)
  • assign_type Selection
    default='single' required=True string='Assignation' args: [('single', 'One Guest per Room'), ('full', 'Maximum Capacity')]
  • company_id Many2one
    related='stay_id.company_id'
  • conflict_room_ids Many2many → stay.room
    compute='_compute_conflict_room_ids' string='Conflict Rooms' args: 'stay.room'
  • group_id Many2one
    related='stay_id.group_id'
  • room_ids Many2many → stay.room
    domain="[('id', 'not in', conflict_room_ids), ('company_id', '=', company_id), ('group_id', 'in', (False, group_id))]" required=True string='Rooms' args: 'stay.room'
  • stay_id Many2one → stay.stay
    readonly=True args: 'stay.stay'
Public methods (2)
  • default_get(self, fields_list)
    @api.model
  • run(self)

New fields (30)
  • arrival_date Date
    index=True required=True tracking=True
  • arrival_datetime Datetime
    compute='_compute_arrival_datetime' inverse='_inverse_arrival_datetime' store=True string='Arrival Date and Time'
  • arrival_note Char
  • arrival_time Selection
    required=True tracking=True args: [('morning', 'Morning'), ('afternoon', 'Afternoon'), ('evening', 'Evening'), ('unknown', 'Unknown')]
  • assign_status Selection
    compute='_compute_room_assignment' store=True args: [('none', 'Waiting Assignation'), ('no_night', 'No Nights'), ('partial', 'Partial'), ('assigned', 'Assigned'), ('over-assigned', 'Over Assigned'), ('error', 'Error')]
  • clash_time_next_stay_id Many2one → stay.stay
    compute='_compute_preceding_next_stay_id' help='Next stay which arrives before the departure in the same room(s)' string='Next Stay which arrives before' args: 'stay.stay'
  • clash_time_preceding_stay_id Many2one → stay.stay
    compute='_compute_preceding_next_stay_id' help='Preceding stay which leaves later that the arrival in the same room(s)' string='Preceding Stay which leaves later' args: 'stay.stay'
  • company_id Many2one → res.company
    default=<expr> index=True readonly=True required=True args: 'res.company'
  • construction Boolean
  • departure_date Date
    index=True required=True tracking=True
  • departure_datetime Datetime
    compute='_compute_departure_datetime' inverse='_inverse_departure_datetime' store=True string='Departure Date and Time'
  • departure_note Char
  • departure_time Selection
    required=True tracking=True args: [('morning', 'Morning'), ('afternoon', 'Afternoon'), ('evening', 'Evening'), ('unknown', 'Unknown')]
  • group_id Many2one → stay.group
    check_company=True copy=False default=<expr> domain="[('company_id', '=', company_id)]" index=True ondelete='restrict' tracking=True args: 'stay.group'
  • guest_qty Integer
    default=1 string='Guest Quantity' tracking=True
  • guest_qty_to_assign Integer
    compute='_compute_room_assignment' store=True
  • line_ids One2many → stay.line
    string='Stay Lines' args: 'stay.line', 'stay_id'
  • my_stay_group Boolean
    compute='_compute_my_stay_group' search='_search_my_stay_group'
  • name Char
    copy=False default=<expr> string='Stay Number'
  • no_meals Boolean
    compute='_compute_refectory_id' help='The stay lines generated from this stay will not have breakfast/lunch/dinner by default.' precompute=True readonly=False store=True tracking=True
  • notes Text
  • partner_id Many2one → res.partner
    help='If guest is anonymous, leave this field empty.' ondelete='restrict' string='Guest' args: 'res.partner'
  • partner_name Text
    compute='_compute_partner_name' precompute=True readonly=False required=True store=True string='Guest Names' tracking=True
  • refectory_id Many2one → stay.refectory
    check_company=True compute='_compute_refectory_id' precompute=True readonly=False store=True args: 'stay.refectory'
  • room_assign_ids One2many → stay.room.assign
    copy=True string='Room Assignments' args: 'stay.room.assign', 'stay_id'
  • rooms_display_name Char
    compute='_compute_room_assignment' store=True string='Rooms'
  • same_time_next_stay_id Many2one → stay.stay
    compute='_compute_preceding_next_stay_id' help='Next stay which arrives on the same time slot in the same room(s)' string='Next Stay which arrives on same time slot' args: 'stay.stay'
  • same_time_preceding_stay_id Many2one → stay.stay
    compute='_compute_preceding_next_stay_id' help='Preceding stay which leaves on the same time slot in the same room(s)' string='Preceding Stay which leaves on same time slot' args: 'stay.stay'
  • state Selection
    copy=False default='draft' readonly=True tracking=True args: [('draft', 'Draft'), ('confirm', 'Confirmed'), ('current', 'Current'), ('done', 'Finished'), ('cancel', 'Cancelled')]
  • tag_ids Many2many → stay.tag
    string='Tags' args: 'stay.tag'
Public methods (11)
  • arrival_date_change(self)
    @api.onchange('arrival_date')
  • cancel(self)
  • cancel2draft(self)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields_list)
    @api.model
  • draft2confirm(self)
  • get_dashboard_data(self)
    @api.model
  • guest_has_left(self)
  • stay_notify_selection_button(self)
  • unlink(self)
  • write(self, vals)

New fields (6)
  • company_id Many2one → res.company
    required=True args: 'res.company'
  • end_date Date
    required=True
  • file_xlsx Binary
    readonly=True
  • filename Char
    readonly=True
  • group_ids Many2many → stay.group
    domain="[('company_id', '=', company_id)]" string='Groups' args: 'stay.group'
  • start_date Date
    required=True
Public methods (3)
  • default_get(self, fields_list)
    @api.model
  • prepare_tab(self)
  • run(self)

New fields (4)
  • active Boolean
    default=True
  • color Integer
    default=<expr>
  • name Char
    required=True
  • sequence Integer
Public methods (0)

No public methods.

New fields (1)
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
Public methods (1)
  • report_toclean_data(self)

Loading…

Loading…

Loading…

Loading…

Loading…