Time Off

hr_holidays
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/19.0/hr_holidays
VERSION
VERSION 1.6
CATEGORY
CATEGORYHuman Resources/Time Off
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo S.A.
MAINTAINERS
MAINTAINERSOdoo S.A.
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Thibault Delavallée, Xavier Morel, Géry Debongnie, Aaron Bohy, Yannick Tivisse, Pierre Masereel, Adrien Dieudonne, Lucas Perais, Alexandre Kühn, Julien Castiaux, Romeo Fragomeli, Adrien Dieudonné, Sébastien Theys, Julien Mougenot, Prakash Prajapati, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Mathieu Duckerts-Antoine, Pierre Paridans, William Braeckman, odoo, Ahmad Khanalizadeh, Didier (did), Abdelouahab (abla), Dossogne Bertrand, luvi, Renaud Thiry, alsh-odoo, Louis Wicket (wil), tsm-odoo, Mylyna Hy, Adrien Widart (awt), Victor Piryns (pivi), Thomas Becquevort (thbe), Levi Siuzdak (sile), Dylan Kiss (dyki), Mayurrajsinh Rathod, Leloup Loïc (lole), Simon Goffaux (sigo), Xavier Bol (xbo), Dawn Hwang, Noe Antoine, omra-odoo, Nicolas Viseur (vin), sesn-odoo, ravb-odoo, Mélanie, Youssef Bashandy, bary, reka-odoo, jugj-odoo, Abderraouf Ghrissi (abgh), Nathaniel (naja), Bastien Fafchamps (bafa), mega, Tanguy Quéguineur, Alex Kühn, Chrysanthe (chgo), asno-odoo, rmun-odoo, aamo-odoo, Mathieu Coutant, Yassin Abdelkarim, kais-odoo, guce, rame-odoo, Abdelrahman Mahmoud (amah), Sanchit Gupta, ahta, Julien Schwanen, st-yes, Chris Duvivier, elhayyany, ayve-odoo, Michaël Mattiello, nikj-odoo, Pierre Pulinckx, Bastien PIERRE, Corentin Heinix (cohe), bona-odoo, Krzysztof Magusiak (krma), Mahdi Alijani (malj), yavy-odoo, Maeva De Keyser (MDEK), nsirjacobs, Gurpreet Singh, pajo, Giorgio Tocco (gito), jayp-odoo, akha, npm, josm-odoo, Bertrand Dossogne, thha-odoo, romc-odoo, kareem, Mongy (abmn), adip-odoo, ksar-odoo, dhka-odoo, Einar Andersen (eian), josv-odoo, path-odoo, Hashem Elmaleeh, assh-odoo, Kevin Gerard (kege), hossamelgendy1, renol-odoo, kuay-odoo, Merlin Guillaume, saurabh, Camila Vives, Abdelouahab Laaroussi (abla), Dilya Anvarbekova, Federico Falcone, Jurgen Gjini, lebm-odoo, karygauss03, Lucas ESTEBAN (lues), dhbr-odoo, Feeedeee, chpa-odoo, Amr Yasser (amry), shmn-odoo, Mohamed Ayman, Kishan (kiga), Faruk Avcı, Joseph Nechleba (jonec), amga-odoo, 3amo-magdy, Kirra Hyde, Devendra Ladhani, adak-ahmed, soukaina tyes, adak(ahmed), Dylan Provoost, Rons, hamza
WEBSITE
WEBSITEhttps://www.odoo.com/app/time-off
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 14:10:17
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - hr
    - base_setup
    - base
    - web
    - digest
    - mail
    - bus
    - web_tour
    - html_editor
    - portal
    - http_routing
    - auth_signup
    - resource
    - phone_validation
    - resource_mail
    - calendar
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage time off requests and allocations
========================================

This application controls the time off schedule of your company. It allows employees to request time off. Then, managers can review requests for time off and approve or reject them. This way you can control the overall time off planning for the company or department.

You can configure several kinds of time off (sickness, paid days, ...) and allocate time off to an employee or department quickly using time off allocation. An employee can also make a request for more days off by making a new time off allocation. It will increase the total of available days for that time off type (if the request is accepted).

You can keep track of time off in different ways by following reports:

* Time Off Summary
* Time Off by Department
* Time Off Analysis

A synchronization with an internal agenda (Meetings of the CRM module) is also possible in order to automatically create a meeting when a time off request is accepted by setting up a type of meeting in time off Type.

Code Analysis

Views touched (73)
XML IDNameModelTypeStatus
edit_holiday_status_form hr.leave.type.form hr.leave.type form New
hr_accrual_level_view_form hr.leave.accrual.level.form hr.leave.accrual.level form New
hr_accrual_plan_view_form hr.leave.accrual.plan.form hr.leave.accrual.plan form New
hr_accrual_plan_view_search hr.leave.accrual.plan.search hr.leave.accrual.plan search New
hr_accrual_plan_view_tree hr.leave.accrual.plan.list hr.leave.accrual.plan list New
hr_department_view_kanban hr.department.kanban.inherit hr.department data Inherits hr.hr_department_view_kanban
hr_employee_public_form_view_inherit hr.employee.public.leave.form.inherit hr.employee.public xpath Inherits hr.hr_employee_public_view_form
hr_employee_view_search hr.employee.search.view.inherit hr.employee xpath Inherits hr.view_employee_filter
hr_holiday_status_view_kanban hr.leave.type.kanban hr.leave.type kanban New
hr_holidays_cancel_leave_form hr.holidays.cancel.leave form New
hr_kanban_view_employees_kanban hr.employee.kanban.leaves.status hr.employee xpath Inherits hr.hr_kanban_view_employees
hr_kanban_view_public_employees_kanban hr.employee.public.kanban.leaves.status hr.employee.public xpath Inherits hr.hr_employee_public_view_kanban
hr_leave_allocation_generate_multi_wizard_view_form hr.leave.allocation.generate.multi.wizard form New
hr_leave_allocation_view_activity hr.leave.allocation.view.activity hr.leave.allocation activity New
hr_leave_allocation_view_form hr.leave.allocation.view.form hr.leave.allocation form New
hr_leave_allocation_view_form_dashboard hr.leave.view.form.dashboard hr.leave.allocation xpath Inherits hr_holidays.hr_leave_allocation_view_form
hr_leave_allocation_view_form_manager hr.leave.allocation.view.form.manager hr.leave.allocation div Inherits hr_holidays.hr_leave_allocation_view_form
hr_leave_allocation_view_form_manager_dashboard hr.leave.allocation.view.form.manager.dashboard hr.leave.allocation xpath Inherits hr_holidays.hr_leave_allocation_view_form_manager
hr_leave_allocation_view_kanban hr.leave.allocation.view.kanban hr.leave.allocation kanban New
hr_leave_allocation_view_search_manager hr.leave.allocation.view.search.my hr.leave.allocation xpath Inherits view_hr_leave_allocation_filter
hr_leave_allocation_view_search_my hr.leave.allocation.view.search.my hr.leave.allocation xpath Inherits view_hr_leave_allocation_filter
hr_leave_allocation_view_tree hr.leave.allocation.view.list hr.leave.allocation list New
hr_leave_allocation_view_tree_my hr.leave.allocation.view.list.my hr.leave.allocation xpath Inherits hr_leave_allocation_view_tree
hr_leave_employee_type_report hr.leave.employee.type.report.view.pivot hr.leave.employee.type.report pivot New
hr_leave_employee_view_dashboard hr.leave.view.dashboard hr.leave calendar New
hr_leave_generate_multi_wizard_view_form hr.leave.generate.multi.wizard form New
hr_leave_mandatory_day_view_form hr.leave.mandatory.day form New
hr_leave_mandatory_day_view_list hr.leave.mandatory.day list New
hr_leave_mandatory_day_view_search hr.leave.mandatory.day search New
hr_leave_report_calendar_view hr.leave.report.calendar.view hr.leave.report.calendar calendar New
hr_leave_report_calendar_view_form hr.leave.report.calendar.view.form hr.leave.report.calendar form New
hr_leave_report_calendar_view_search hr.leave.report.calendar.view.search hr.leave.report.calendar search New
hr_leave_report_calendar_year_view hr.leave.report.calendar.year.view hr.leave.report.calendar calendar New
hr_leave_report_graph report.hr.holidays.report.leave_all.graph hr.leave.report graph New
hr_leave_report_pivot report.hr.holidays.report.leave_all.pivot hr.leave.report pivot New
hr_leave_report_tree report.hr.holidays.report.leave_all.list hr.leave.report list New
hr_leave_view_activity hr.leave.view.activity hr.leave activity New
hr_leave_view_calendar hr.leave.view.calendar hr.leave calendar New
hr_leave_view_dashboard hr.leave.view.dashboard hr.leave calendar New
hr_leave_view_form hr.leave.view.form hr.leave form New
hr_leave_view_form_dashboard hr.leave.view.form.dashboard hr.leave field Inherits hr_holidays.hr_leave_view_form
hr_leave_view_form_dashboard_manager_new_time_off hr.leave.view.form.dashboard.new.time.off hr.leave xpath Inherits hr_holidays.hr_leave_view_form_dashboard_new_time_off
hr_leave_view_form_dashboard_new_time_off hr.leave.view.form.dashboard.new.time.off hr.leave xpath Inherits hr_holidays.hr_leave_view_form_dashboard
hr_leave_view_form_manager hr.leave.view.form.manager hr.leave xpath Inherits hr_leave_view_form
hr_leave_view_kanban hr.leave.view.kanban hr.leave kanban New
hr_leave_view_kanban_my hr.leave.view.kanban.my hr.leave xpath Inherits hr_holidays.hr_leave_view_kanban
hr_leave_view_search_manager hr.holidays.view.search.manager hr.leave field Inherits view_hr_holidays_filter
hr_leave_view_search_my hr.holidays.view.search.my hr.leave xpath Inherits view_hr_holidays_filter
hr_leave_view_search_report hr.holidays.view.search.report hr.leave filter Inherits view_hr_holidays_filter
hr_leave_view_tree hr.holidays.view.list hr.leave list New
hr_leave_view_tree_my hr.holidays.view.list hr.leave xpath Inherits hr_leave_view_tree
is_based_on_worked_time_no is_based_on_worked_time_no ir.ui.view qweb New
is_based_on_worked_time_yes is_based_on_worked_time_yes ir.ui.view qweb New
report_holidayssummary report_holidayssummary ir.ui.view qweb New
resource_calendar_form_inherit resource.calendar.form.inherit resource.calendar xpath Inherits resource.resource_calendar_form
resource_calendar_leave_form_inherit resource.calendar.leaves.form.inherit resource.calendar.leaves field Inherits resource.resource_calendar_leave_form
resource_calendar_leaves_tree_inherit resource.calendar.leaves.list.inherit resource.calendar.leaves xpath Inherits resource.resource_calendar_leave_tree
resource_calendar_leaves_view_search_inherit resource.calendar.leaves.search.inherit resource.calendar.leaves filter Inherits resource.view_resource_calendar_leaves_search
resource_calendar_view_tree resource.calendar.view.list.inherit.hr.holidays resource.calendar field Inherits resource.view_resource_calendar_tree
view_calendar_event_form_inherit view.calendar.event.form.inherit calendar.event xpath Inherits calendar.view_calendar_event_form
view_employee_form_leave_inherit hr.employee.leave.form.inherit hr.employee xpath Inherits hr.view_employee_form
view_employee_tree_inherit_leave hr.employee.list.leave hr.employee xpath Inherits hr.view_employee_tree
view_evaluation_report_graph hr.holidays.graph hr.leave graph New
view_holiday_graph hr.holidays.report_graph hr.leave graph New
view_holiday_list hr.holidays.report_list hr.leave list New
view_holiday_pivot hr.holidays.report_pivot hr.leave pivot New
view_holiday_status_normal_tree hr.leave.type.normal.list hr.leave.type list New
view_holidays_status_filter hr.leave.type.filter hr.leave.type search New
view_hr_holidays_filter hr.holidays.filter hr.leave search New
view_hr_holidays_filter_report hr.holidays.filter hr.leave.report search New
view_hr_holidays_summary_employee hr.holidays.summary.employee.form hr.holidays.summary.employee form New
view_hr_leave_allocation_filter hr.holidays.filter_allocations hr.leave.allocation search New
view_search_hr_holidays_employee_type_report hr.holidays.filter hr.leave.employee.type.report search New
Models touched (28)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • absence_of_today Integer
    compute='_compute_leave_count' string='Absence by Today'
  • allocation_to_approve_count Integer
    compute='_compute_leave_count' string='Allocation to Approve'
  • leave_to_approve_count Integer
    compute='_compute_leave_count' string='Time Off to Approve'
Public methods (2)
  • action_open_allocation_department(self)
  • action_open_leave_department(self)

New fields (0)

No new fields.

Public methods (1)
  • action_register_departure(self)

New fields (12)
  • allocation_count Float
    compute='_compute_allocation_count' groups='hr.group_hr_user' args: 'Total number of days allocated.'
  • allocation_display Char
    compute='_compute_allocation_remaining_display'
  • allocation_remaining_display Char
    compute='_compute_allocation_remaining_display'
  • allocations_count Integer
    compute='_compute_allocation_count' groups='hr.group_hr_user' args: 'Total number of allocations'
  • current_leave_id Many2one → hr.leave.type
    compute='_compute_current_leave' groups='hr.group_hr_user' string='Current Time Off Type' args: 'hr.leave.type'
  • current_leave_state Selection
    compute='_compute_leave_status' groups='hr.group_hr_user' selection=[('confirm', 'Waiting Approval'), ('refuse', 'Refused'), ('validate1', 'Waiting Second Approval'), ('validate', 'Approved'), ('cancel', 'Cancelled')] string='Current Time Off Status'
  • hr_icon_display Selection
    selection_add=[('presence_holiday_absent', 'On leave'), ('presence_holiday_present', 'Present but on leave')]
  • is_absent Boolean
    compute='_compute_leave_status' search='_search_absent_employee' args: 'Absent Today'
  • leave_date_from Date
    compute='_compute_leave_status' groups='hr.group_hr_user' args: 'From Date'
  • leave_date_to Date
    compute='_compute_leave_status' args: 'To Date'
  • leave_manager_id Many2one → res.users
    compute='_compute_leave_manager' domain="[('share', '=', False), ('company_ids', 'in', company_id)]" help='Select the user responsible for approving "Time Off" of this employee.\nIf empty, the approval is done by an Administrator or Approver (determined in settings/users).' readonly=False store=True string='Time Off Approver' args: 'res.users'
  • show_leaves Boolean
    compute='_compute_show_leaves' args: 'Able to see Remaining Time Off'
Public methods (9)
  • action_time_off_dashboard(self)
  • create(self, vals_list)
    @api.model_create_multi
  • get_allocation_requests_amount(self)
    @api.model
  • get_mandatory_days(self, start_date, end_date)
  • get_mandatory_days_data(self, date_start, date_end)
    @api.model
  • get_public_holidays_data(self, date_start, date_end)
    @api.model
  • get_special_days_data(self, date_start, date_end)
    @api.model
  • get_time_off_dashboard_data(self, target_date=None)
    @api.model
  • write(self, vals)

New fields (6)
  • allocation_display Char
    compute='_compute_allocation_display'
  • allocation_remaining_display Char
    related='employee_id.allocation_remaining_display'
  • is_absent Boolean
    compute='_compute_leave_status' search='_search_absent_employee' args: 'Absent Today'
  • leave_date_to Date
    compute='_compute_leave_status' args: 'To Date'
  • leave_manager_id Many2one → res.users
    compute='_compute_leave_manager' domain="[('share', '=', False), ('company_ids', 'in', company_id)]" help='Select the user responsible for approving "Time Off" of this employee.\nIf empty, the approval is done by an Administrator or Approver (determined in settings/users).' readonly=False store=True string='Time Off Approver' args: 'res.users'
  • show_leaves Boolean
    compute='_compute_show_leaves' args: 'Able to see Remaining Time Off'
Public methods (2)
  • action_open_time_off_calendar(self)
    Open the time off calendar filtered on this employee.
  • action_time_off_dashboard(self)

New fields (2)
  • leave_id Many2one → hr.leave
    required=True string='Time Off Request' args: 'hr.leave'
  • reason Text
Public methods (1)
  • action_cancel_leave(self)

New fields (3)
  • date_from Date
    default=<expr> required=True string='From'
  • emp Many2many → hr.employee
    string='Employee(s)' args: 'hr.employee', 'summary_emp_rel', 'sum_id', 'emp_id'
  • holiday_type Selection
    default='Approved' required=True string='Select Time Off Type' args: [('Approved', 'Approved'), ('Confirmed', 'Confirmed'), ('both', 'Both Approved and Confirmed')]
Public methods (1)
  • print_report(self)

New fields (51)
  • active_employee Boolean
    related='employee_id.active' string='Employee Active'
  • attachment_ids One2many → ir.attachment
    string='Attachments' args: 'ir.attachment', 'res_id'
  • can_approve Boolean
    compute='_compute_can_approve' export_string_translation=False
  • can_back_to_approve Boolean
    compute='_compute_can_back_to_approve' export_string_translation=False
  • can_cancel Boolean
    compute='_compute_can_cancel' export_string_translation=False
  • can_refuse Boolean
    compute='_compute_can_refuse' export_string_translation=False
  • can_validate Boolean
    compute='_compute_can_validate' export_string_translation=False
  • color Integer
    related='holiday_status_id.color' args: 'Color'
  • company_id Many2one → res.company
    compute='_compute_company_id' store=True args: 'res.company'
  • dashboard_warning_message Char
    compute='_compute_dashboard_warning_message'
  • date_from Datetime
    compute='_compute_date_from_to' index=True store=True tracking=True args: 'Start Date'
  • date_to Datetime
    compute='_compute_date_from_to' store=True tracking=True args: 'End Date'
  • department_id Many2one → hr.department
    compute='_compute_department_id' readonly=False store=True string='Department' args: 'hr.department'
  • duration_display Char
    compute='_compute_duration_display' store=True args: 'Requested'
  • employee_company_id Many2one
    related='employee_id.company_id' store=True string='Employee Company'
  • employee_id Many2one → hr.employee
    default=<expr> domain=<expr> index=True ondelete='restrict' required=True string='Employee' tracking=True args: 'hr.employee'
  • first_approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validate the time off' readonly=True string='First Approval' args: 'hr.employee'
  • has_mandatory_day Boolean
    compute='_compute_has_mandatory_day'
  • holiday_status_id Many2one → hr.leave.type
    compute='_compute_from_employee_id' domain="[\n '|',\n ('requires_allocation', '=', False),\n ('has_valid_allocation', '=', True),\n ]" readonly=False required=True store=True string='Time Off Type' tracking=True args: 'hr.leave.type'
  • holiday_status_requires_allocation Boolean
    related='holiday_status_id.requires_allocation'
  • is_hatched Boolean
    compute='_compute_is_hatched' args: 'Hatched'
  • is_striked Boolean
    compute='_compute_is_hatched' args: 'Striked'
  • last_several_days Boolean
    compute='_compute_last_several_days' args: 'All day'
  • leave_type_increases_duration Char
    compute='_compute_leave_type_increases_duration'
  • leave_type_request_unit Selection
    readonly=True related='holiday_status_id.request_unit'
  • leave_type_support_document Boolean
    related='holiday_status_id.support_document'
  • max_leaves Float
    compute='_compute_leaves'
  • meeting_id Many2one → calendar.event
    copy=False string='Meeting' args: 'calendar.event'
  • name Char
    compute='_compute_description' compute_sudo=False copy=False inverse='_inverse_description' search='_search_description' args: 'Description'
  • notes Text
    readonly=False args: 'Reasons'
  • number_of_days Float
    compute='_compute_duration' help='Number of days of the time off request. Used in the calculation.' store=True tracking=True args: 'Duration (Days)'
  • number_of_hours Float
    compute='_compute_duration' help='Number of hours of the time off request. Used in the calculation.' store=True tracking=True args: 'Duration (Hours)'
  • private_name Char
    groups='hr_holidays.group_hr_holidays_responsible' args: 'Time Off Description'
  • request_date_from Date
    args: 'Request Start Date'
  • request_date_from_period Selection
    default='am' string='Date Period Start' args: [('am', 'Morning'), ('pm', 'Afternoon')]
  • request_date_to Date
    args: 'Request End Date'
  • request_date_to_period Selection
    default='pm' string='Date Period End' args: [('am', 'Morning'), ('pm', 'Afternoon')]
  • request_hour_from Float
    compute='_compute_request_hour_from_to' readonly=False store=True string='Hour from'
  • request_hour_to Float
    compute='_compute_request_hour_from_to' readonly=False store=True string='Hour to'
  • request_unit_half Boolean
    compute='_compute_request_unit_half' store=True args: 'Half-Day'
  • request_unit_hours Boolean
    compute='_compute_request_unit_hours' store=True args: 'Specific Time'
  • resource_calendar_id Many2one → resource.calendar
    compute='_compute_resource_calendar_id' copy=False readonly=False store=True args: 'resource.calendar'
  • second_approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validate the time off with second level (If time off type need second validation)' readonly=True string='Second Approval' args: 'hr.employee'
  • state Selection
    copy=False default='confirm' readonly=False store=True string='Status' tracking=True args: [('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved'), ('cancel', 'Cancelled')]
  • supported_attachment_ids Many2many → ir.attachment
    compute='_compute_supported_attachment_ids' inverse='_inverse_supported_attachment_ids' string='Attach File' args: 'ir.attachment'
  • supported_attachment_ids_count Integer
    compute='_compute_supported_attachment_ids'
  • tz Selection
    compute='_compute_tz' args: _tz_get
  • tz_mismatch Boolean
    compute='_compute_tz_mismatch'
  • user_id Many2one → res.users
    compute_sudo=True index=True readonly=True related='employee_id.user_id' related_sudo=True store=True string='User' args: 'res.users'
  • validation_type Selection
    readonly=False related='holiday_status_id.leave_validation_type' string='Validation Type'
  • virtual_remaining_leaves Float
    compute='_compute_leaves' string='Available Time Off'
Public methods (16)
  • action_approve(self, check_state=True)
  • action_back_to_approval(self)
  • action_cancel(self)
  • action_documents(self)
  • action_refuse(self)
  • activity_update(self)
  • add_follower(self, employee_id)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model
  • get_unusual_days(self, date_from, date_to=None)
    @api.model
  • message_subscribe(self, partner_ids=None, subtype_ids=None)
  • onchange(self, values, field_names, fields_spec)
  • open_pending_requests(self)
    @api.model
  • unlink(self)
  • write(self, vals)

New fields (30)
  • accrual_plan_id Many2one → hr.leave.accrual.plan
    default=<expr> index=True ondelete='cascade' required=True args: 'hr.leave.accrual.plan', 'Accrual Plan'
  • accrual_validity Boolean
    compute='_compute_accrual_validity' export_string_translation=False readonly=False store=True
  • accrual_validity_count Integer
    default='1' export_string_translation=False help='You can define a period of time where the days carried over will be available'
  • accrual_validity_type Selection
    default='day' export_string_translation=False help='This field defines the unit of time after which the accrual ends.' required=True args: [('day', 'Days'), ('month', 'Months')]
  • accrued_gain_time Selection
    export_string_translation=False related='accrual_plan_id.accrued_gain_time'
  • action_with_unused_accruals Selection
    compute='_compute_action_with_unused_accruals' default='lost' export_string_translation=False help="When the Carry-Over Time is reached, according to Plan's setting, select what you want to happen with the unused time off: Lost (time will be reset to zero), Carried over (accrued time carried over to the next period.)" required=True store=True args: [('lost', 'Lost'), ('all', 'Carried over')]
  • added_value Float
    default=1 digits=(16, 5) export_string_translation=False required=True
  • added_value_type Selection
    compute='_compute_added_value_type' export_string_translation=False inverse='_inverse_added_value_type' precompute=True readonly=False required=True store=True args: [('day', 'Day(s)'), ('hour', 'Hour(s)')]
  • can_be_carryover Boolean
    export_string_translation=False readonly=True related='accrual_plan_id.can_be_carryover'
  • can_modify_value_type Boolean
    compute='_compute_can_modify_value_type' default=False export_string_translation=False
  • cap_accrued_time Boolean
    export_string_translation=False help='When the field is checked the balance of an allocation using this accrual plan will never exceed the specified amount.'
  • cap_accrued_time_yearly Boolean
    export_string_translation=False help='When the field is checked the total amount accrued each year will be capped at the specified amount' readonly=False store=True
  • carryover_options Selection
    compute='_compute_carryover_options' default='unlimited' export_string_translation=False help='You can limit the accrued time carried over for the next period.' readonly=False required=True store=True args: [('unlimited', 'Unlimited'), ('limited', 'Up to')]
  • first_day Selection
    default='1' export_string_translation=False args: _get_selection_days
  • first_month Selection
    default='1' export_string_translation=False args: [('1', 'January'), ('2', 'February'), ('3', 'March'), ('4', 'April'), ('5', 'May'), ('6', 'June')]
  • first_month_day Selection
    compute='_compute_first_month_day' default='1' export_string_translation=False readonly=False store=True args: _get_selection_days
  • frequency Selection
    default='daily' required=True string='Frequency' args: [('hourly', 'Hourly'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('bimonthly', 'Twice a month'), ('monthly', 'Monthly'), ('biyearly', 'Twice a year'), ('yearly', 'Yearly')]
  • maximum_leave Float
    compute='_compute_maximum_leave' default=0 digits=(16, 2) export_string_translation=False help='Choose a cap for this accrual.' readonly=False store=True
  • maximum_leave_yearly Float
    digits=(16, 2) export_string_translation=False
  • milestone_date Selection
    compute='_compute_milestone_date' default='creation' export_string_translation=False inverse='_inverse_milestone_date' readonly=False required=True store=True args: [('creation', 'At allocation creation'), ('after', 'After')]
  • postpone_max_days Integer
    export_string_translation=False help='Set a maximum of accruals an allocation keeps at the end of the year.'
  • second_day Selection
    default='15' export_string_translation=False args: _get_selection_days
  • second_month Selection
    default='7' export_string_translation=False args: [('7', 'July'), ('8', 'August'), ('9', 'September'), ('10', 'October'), ('11', 'November'), ('12', 'December')]
  • second_month_day Selection
    compute='_compute_second_month_day' default='1' export_string_translation=False readonly=False store=True args: _get_selection_days
  • sequence Integer
    compute='_compute_sequence' help='Sequence is generated automatically by start time delta.' store=True string='sequence'
  • start_count Integer
    export_string_translation=False help='The accrual starts after a defined period from the allocation start date. This field defines the number of days, months or years after which accrual is used.'
  • start_type Selection
    default='day' export_string_translation=False help='This field defines the unit of time after which the accrual starts.' required=True args: [('day', 'Days'), ('month', 'Months'), ('year', 'Years')]
  • week_day Selection
    default='0' required=True string='Allocation on' args: [('0', 'Monday'), ('1', 'Tuesday'), ('2', 'Wednesday'), ('3', 'Thursday'), ('4', 'Friday'), ('5', 'Saturday'), ('6', 'Sunday')]
  • yearly_day Selection
    compute='_compute_yearly_day' default='1' export_string_translation=False readonly=False store=True args: _get_selection_days
  • yearly_month Selection
    default='1' export_string_translation=False args: [('1', 'January'), ('2', 'February'), ('3', 'March'), ('4', 'April'), ('5', 'May'), ('6', 'June'), ('7', 'July'), ('8', 'August'), ('9', 'September'), ('10', 'October'), ('11', 'November'), ('12', 'December')]
Public methods (1)
  • action_save_new(self)

New fields (17)
  • accrued_gain_time Selection
    default='end' export_string_translation=False required=True args: [('start', 'At the start of the accrual period'), ('end', 'At the end of the accrual period')]
  • active Boolean
    default=True
  • added_value_type Selection
    default='day' export_string_translation=False store=True args: [('day', 'Days'), ('hour', 'Hours')]
  • allocation_ids One2many → hr.leave.allocation
    export_string_translation=False args: 'hr.leave.allocation', 'accrual_plan_id'
  • can_be_carryover Boolean
    export_string_translation=False
  • carryover_date Selection
    default='year_start' export_string_translation=False required=True string='Carry-Over Time' args: [('year_start', 'At the start of the year'), ('allocation', 'At the allocation date'), ('other', 'Custom date')]
  • carryover_day Selection
    compute='_compute_carryover_day' default='1' export_string_translation=False readonly=False store=True args: _get_selection_days
  • carryover_month Selection
    default=<expr> export_string_translation=False args: [('1', 'January'), ('2', 'February'), ('3', 'March'), ('4', 'April'), ('5', 'May'), ('6', 'June'), ('7', 'July'), ('8', 'August'), ('9', 'September'), ('10', 'October'), ('11', 'November'), ('12', 'December')]
  • company_id Many2one → res.company
    compute='_compute_company_id' domain=<expr> readonly=False store='True' string='Company' args: 'res.company'
  • employees_count Integer
    compute='_compute_employee_count' args: 'Employees'
  • is_based_on_worked_time Boolean
    compute='_compute_is_based_on_worked_time' export_string_translation=False help='Only excludes requests where the time off type is set as unpaid kind of.' readonly=False store=True
  • level_count Integer
    compute='_compute_level_count' args: 'Levels'
  • level_ids One2many → hr.leave.accrual.level
    copy=True string='Milestones' args: 'hr.leave.accrual.level', 'accrual_plan_id'
  • name Char
    required=True args: 'Name'
  • show_transition_mode Boolean
    compute='_compute_show_transition_mode' export_string_translation=False
  • time_off_type_id Many2one → hr.leave.type
    check_company=True help='Specify if this accrual plan can only be used with this Time Off Type.\n Leave empty if this accrual plan can be used with any Time Off Type.' index='btree_not_null' string='Time Off Type' args: 'hr.leave.type'
  • transition_mode Selection
    default='immediately' export_string_translation=False required=True args: [('immediately', 'Immediately'), ('end_of_accrual', "After this accrual's period")]
Public methods (5)
  • action_create_accrual_plan_level(self)
  • action_open_accrual_plan_employees(self)
  • action_open_accrual_plan_level(self, level_id)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi

New fields (38)
  • accrual_plan_id Many2one → hr.leave.accrual.plan
    compute='_compute_accrual_plan_id' domain="['|', ('time_off_type_id', '=', False), ('time_off_type_id', '=', holiday_status_id)]" index='btree_not_null' inverse='_inverse_accrual_plan_id' readonly=False store=True tracking=True args: 'hr.leave.accrual.plan'
  • active_employee Boolean
    readonly=True related='employee_id.active' args: 'Active Employee'
  • actual_lastcall Date
    export_string_translation=False
  • allocation_type Selection
    default='regular' readonly=True required=True string='Allocation Type' args: [('regular', 'Regular Allocation'), ('accrual', 'Accrual Allocation')]
  • already_accrued Boolean
  • approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validates the allocation' readonly=True string='First Approval' args: 'hr.employee'
  • can_approve Boolean
    compute='_compute_can_approve' args: 'Can Approve'
  • can_refuse Boolean
    compute='_compute_can_refuse' args: 'Can Refuse'
  • can_validate Boolean
    compute='_compute_can_validate' args: 'Can Validate'
  • carried_over_days_expiration_date Date
    args: 'Carried over days expiration date'
  • date_from Date
    copy=False default=fields.Date.context_today index=True required=True tracking=True args: 'Start Date'
  • date_to Date
    copy=False tracking=True args: 'End Date'
  • department_id Many2one → hr.department
    compute='_compute_department_id' readonly=False store=True string='Department' args: 'hr.department'
  • duration_display Char
    compute='_compute_duration_display' help='Field allowing to see the allocation duration in days or hours depending on the type_request_unit' args: 'Allocated (Days/Hours)'
  • employee_company_id Many2one
    readonly=True related='employee_id.company_id' store=True
  • employee_id Many2one → hr.employee
    default=<expr> domain=_domain_employee_id index=True ondelete='restrict' required=True string='Employee' tracking=True args: 'hr.employee'
  • expiring_carryover_days Float
    args: 'The number of carried over days that will expire on carried_over_days_expiration_date'
  • holiday_status_id Many2one → hr.leave.type
    compute='_compute_holiday_status_id' default=_default_holiday_status_id domain=_domain_holiday_status_id readonly=False required=True store=True string='Time Off Type' args: 'hr.leave.type'
  • is_name_custom Boolean
    readonly=True store=False
  • is_officer Boolean
    compute='_compute_is_officer'
  • last_executed_carryover_date Date
    export_string_translation=False
  • lastcall Date
    readonly=True args: 'Date of the last accrual allocation'
  • leaves_taken Float
    compute='_compute_leaves' string='Time off Taken'
  • manager_id Many2one → hr.employee
    compute='_compute_manager_id' store=True string='Manager' args: 'hr.employee'
  • max_leaves Float
    compute='_compute_leaves'
  • name Char
    compute='_compute_description' compute_sudo=False readonly=False store=True string='Description'
  • name_validity Char
    compute='_compute_description_validity' args: 'Description with validity'
  • nextcall Date
    default=False readonly=True args: 'Date of the next accrual allocation'
  • notes Text
    readonly=False args: 'Reasons'
  • number_of_days Float
    compute='_compute_number_of_days' default=1 help='Duration in days. Reference field to use when necessary.' readonly=False store=True tracking=True args: 'Number of Days'
  • number_of_days_display Float
    compute='_compute_number_of_days_display' help='For an Accrual Allocation, this field contains the theorical amount of time given to the employee, due to a previous start date, on the first run of the plan. This can be manually edited.' args: 'Duration (days)'
  • number_of_hours_display Float
    compute='_compute_number_of_hours_display' default_export_compatible=True help='For an Accrual Allocation, this field contains the theorical amount of time given to the employee, due to a previous start date, on the first run of the plan. This can be manually edited.' store=True args: 'Duration (hours)'
  • second_approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validates the allocation with second level (If time off type need second validation)' readonly=True string='Second Approval' args: 'hr.employee'
  • state Selection
    copy=False default='confirm' help="The status is 'To Approve', when an allocation request is created.\nThe status is 'Refused', when an allocation request is refused by manager.\nThe status is 'Approved', when an allocation request is approved by manager." readonly=True string='Status' tracking=True args: [('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
  • type_request_unit Selection
    compute='_compute_type_request_unit' args: [('hour', 'Hours'), ('half_day', 'Half-Day'), ('day', 'Day')]
  • validation_type Selection
    readonly=True related='holiday_status_id.allocation_validation_type' string='Validation Type'
  • virtual_remaining_leaves Float
    compute='_compute_leaves' string='Available Time Off'
  • yearly_accrued_amount Float
    export_string_translation=False
Public methods (9)
  • action_approve(self)
  • action_refuse(self)
  • activity_update(self)
  • add_follower(self, employee_id)
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
    Override to avoid automatic logging of creation
  • message_subscribe(self, partner_ids=None, subtype_ids=None)
  • onchange(self, values, field_names, fields_spec)
  • write(self, vals)

New fields (14)
  • accrual_plan_id Many2one → hr.leave.accrual.plan
    domain="['|', ('time_off_type_id', '=', False), ('time_off_type_id', '=', holiday_status_id)]" args: 'hr.leave.accrual.plan'
  • allocation_mode Selection
    default='employee' help='Allow to create requests in batchs:\n- By Employee: for a specific employee\n- By Company: all employees of the specified company\n- By Department: all employees of the specified department\n- By Employee Tag: all employees of the specific employee group category' readonly=False required=True string='Allocation Mode' args: [('employee', 'By Employee'), ('company', 'By Company'), ('department', 'By Department'), ('category', 'By Employee Tag')]
  • allocation_type Selection
    default='regular' required=True string='Allocation Type' args: [('regular', 'Regular Allocation'), ('accrual', 'Based on Accrual Plan')]
  • category_id Many2one → hr.employee.category
    string='Employee Tag' args: 'hr.employee.category'
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company'
  • date_from Date
    default=fields.Date.context_today required=True args: 'Start Date'
  • date_to Date
    args: 'End Date'
  • department_id Many2one → hr.department
    args: 'hr.department'
  • duration Float
    string='Allocation'
  • employee_ids Many2many → hr.employee
    domain=<expr> string='Employees' args: 'hr.employee'
  • holiday_status_id Many2one → hr.leave.type
    domain=_domain_holiday_status_id required=True string='Time Off Type' args: 'hr.leave.type'
  • name Char
    compute='_compute_name' readonly=False store=True args: 'Description'
  • notes Text
    args: 'Reasons'
  • request_unit Selection
    related='holiday_status_id.request_unit'
Public methods (1)
  • action_generate_allocations(self)

New fields (11)
  • active_employee Boolean
    readonly=True
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • date_from Datetime
    readonly=True args: 'Start Date'
  • date_to Datetime
    readonly=True args: 'End Date'
  • department_id Many2one → hr.department
    readonly=True string='Department' args: 'hr.department'
  • employee_id Many2one → hr.employee
    readonly=True string='Employee' args: 'hr.employee'
  • holiday_status Selection
    args: [('taken', 'Taken'), ('left', 'Left'), ('planned', 'Planned')]
  • leave_type Many2one → hr.leave.type
    readonly=True string='Time Off Type' args: 'hr.leave.type'
  • number_of_days Float
    aggregator='sum' readonly=True args: 'Number of Days'
  • number_of_hours Float
    aggregator='sum' readonly=True args: 'Number of Hours'
  • state Selection
    readonly=True string='Status' args: [('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
Public methods (2)
  • action_time_off_analysis(self)
    @api.model
  • init(self)

New fields (9)
  • allocation_mode Selection
    default='employee' help='Allow to create requests in batchs:\n- By Employee: for a specific employee\n- By Company: all employees of the specified company\n- By Department: all employees of the specified department\n- By Employee Tag: all employees of the specific employee group category' readonly=False required=True string='Allocation Mode' args: [('employee', 'By Employee'), ('company', 'By Company'), ('department', 'By Department'), ('category', 'By Employee Tag')]
  • category_id Many2one → hr.employee.category
    string='Employee Tag' args: 'hr.employee.category'
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company'
  • date_from Date
    required=True args: 'Start Date'
  • date_to Date
    required=True args: 'End Date'
  • department_id Many2one → hr.department
    args: 'hr.department'
  • employee_ids Many2many → hr.employee
    domain=<expr> string='Employees' args: 'hr.employee'
  • holiday_status_id Many2one → hr.leave.type
    domain="[('company_id', 'in', [company_id, False])]" required=True string='Time Off Type' args: 'hr.leave.type'
  • name Char
    args: 'Description'
Public methods (1)
  • action_generate_time_off(self)

New fields (8)
  • color Integer
    default=<expr>
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company'
  • department_ids Many2many → hr.department
    string='Departments' args: 'hr.department'
  • end_date Date
    required=True
  • job_ids Many2many → hr.job
    string='Job Position' args: 'hr.job'
  • name Char
    required=True
  • resource_calendar_id Many2one → resource.calendar
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" args: 'resource.calendar', 'Working Hours'
  • start_date Date
    required=True
Public methods (0)

No public methods.

New fields (12)
  • allocation_id Many2one → hr.leave.allocation
    readonly=True string='Allocation Request' args: 'hr.leave.allocation'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • date_from Datetime
    readonly=True args: 'Start Date'
  • date_to Datetime
    readonly=True args: 'End Date'
  • department_id Many2one → hr.department
    readonly=True string='Department' args: 'hr.department'
  • holiday_status_id Many2one → hr.leave.type
    readonly=True string='Time Off Type' args: 'hr.leave.type'
  • leave_id Many2one → hr.leave
    readonly=True string='Time Off Request' args: 'hr.leave'
  • leave_type Selection
    readonly=True string='Request Type' args: [('allocation', 'Allocation'), ('request', 'Time Off')]
  • name Char
    readonly=True args: 'Description'
  • number_of_days Float
    readonly=True args: 'Number of Days'
  • number_of_hours Float
    readonly=True args: 'Number of Hours'
  • state Selection
    readonly=True string='Status' args: [('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
Public methods (2)
  • action_open_record(self)
  • init(self)

New fields (21)
  • company_id Many2one → res.company
    readonly=True args: 'res.company'
  • department_id Many2one → hr.department
    readonly=True args: 'hr.department'
  • description Char
    groups='hr_holidays.group_hr_holidays_user' readonly=True args: 'Description'
  • duration Float
    readonly=True string='Duration'
  • duration_display Char
    readonly=True related='leave_id.duration_display'
  • employee_id Many2one → hr.employee
    readonly=True args: 'hr.employee'
  • holiday_status_id Many2one → hr.leave.type
    groups='hr_holidays.group_hr_holidays_user' readonly=True string='Time Off Type' args: 'hr.leave.type'
  • is_absent Boolean
    related='employee_id.is_absent'
  • is_hatched Boolean
    readonly=True args: 'Hatched'
  • is_manager Boolean
    compute='_compute_is_manager' args: 'Manager'
  • is_striked Boolean
    readonly=True args: 'Striked'
  • job_id Many2one → hr.job
    readonly=True args: 'hr.job'
  • leave_id Many2one → hr.leave
    comodel_name='hr.leave' groups='hr_holidays.group_hr_holidays_user' readonly=True
  • leave_manager_id Many2one
    related='employee_id.leave_manager_id'
  • member_of_department Boolean
    related='employee_id.member_of_department'
  • name Char
    compute='_compute_name' readonly=True string='Name'
  • start_datetime Datetime
    readonly=True string='From'
  • state Selection
    readonly=True args: [('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
  • stop_datetime Datetime
    readonly=True string='To'
  • tz Selection
    readonly=True string='Timezone' args: _tz_get
  • user_id Many2one → res.users
    readonly=True args: 'res.users'
Public methods (4)
  • action_approve(self)
  • action_refuse(self)
  • get_unusual_days(self, date_from, date_to=None)
    @api.model
  • init(self)

New fields (35)
  • accrual_count Float
    compute='_compute_accrual_count' string='Accruals count'
  • accruals_ids One2many → hr.leave.accrual.plan
    args: 'hr.leave.accrual.plan', 'time_off_type_id'
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the time off type without removing it.' args: 'Active'
  • allocation_count Integer
    compute='_compute_allocation_count' string='Allocations'
  • allocation_notif_subtype_id Many2one → mail.message.subtype
    default=<expr> string='Allocation Notification Subtype' args: 'mail.message.subtype'
  • allocation_validation_type Selection
    default='hr' help="Select the level of approval needed in case of request by employee\n # - No validation needed: The employee's request is automatically approved.\n # - Approved by Time Off Officer: The employee's request need to be manually approved\n # by the Time Off Officer, Employee's Approver or both." string='Approval' args: [('no_validation', 'None needed'), ('hr', 'By Time Off Officer'), ('manager', "By Employee's Approver"), ('both', "By Employee's Approver and Time Off Officer")]
  • allow_request_on_top Boolean
    default=False help='If checked, users can request another leave on top of the ones of this type.' string='Allow Request on Top'
  • allows_negative Boolean
    help='If checked, users request can exceed the allocated days and balance can go in negative.' string='Allow Negative Cap'
  • color Integer
    help='The color selected here will be used in every screen with the time off type.' string='Color'
  • company_id Many2one → res.company
    domain=<expr> string='Company' args: 'res.company'
  • country_code Char
    depends=['country_id'] readonly=True related='country_id.code'
  • country_id Many2one → res.country
    compute='_compute_country_id' default=<expr> domain=<expr> store=True string='Country' args: 'res.country'
  • create_calendar_meeting Boolean
    default=True string='Display Time Off in Calendar'
  • elligible_for_accrual_rate Boolean
    compute='_compute_eligible_for_accrual_rate' help='If checked, this time off type will be taken into account for accruals computation.' readonly=False store=True string='Eligible for Accrual Rate'
  • employee_requests Boolean
    default=False help='Extra Days Requests Allowed: User can request an allocation for himself.\n\n Not Allowed: User cannot request an allocation.' required=True string='Allow Employee Requests'
  • group_days_leave Float
    compute='_compute_group_days_leave' string='Group Time Off'
  • has_valid_allocation Boolean
    compute='_compute_valid' help='This indicates if it is still possible to use this type of leave' search='_search_valid'
  • hide_on_dashboard Boolean
    default=False help='Non-visible allocations can still be selected when taking a leave, but will simply not be displayed on the leave dashboard.' string='Hide On Dashboard'
  • icon_id Many2one → ir.attachment
    domain="[('res_model', '=', 'hr.leave.type'), ('res_field', '=', 'icon_id')]" string='Cover Image' args: 'ir.attachment'
  • include_public_holidays_in_duration Boolean
    default=False help='Public holidays should be counted in the leave duration when applying for leaves' args: 'Ignore Public Holidays'
  • is_used Boolean
    compute='_compute_is_used'
  • leave_notif_subtype_id Many2one → mail.message.subtype
    default=<expr> string='Time Off Notification Subtype' args: 'mail.message.subtype'
  • leave_validation_type Selection
    default='hr' string='Time Off Validation' args: [('no_validation', 'None needed'), ('hr', 'By Time Off Officer'), ('manager', "By Employee's Approver"), ('both', "By Employee's Approver and Time Off Officer")]
  • leaves_taken Float
    compute='_compute_leaves' help='This value is given by the sum of all time off requests with a negative value.' string='Time off Already Taken'
  • max_allowed_negative Integer
    help='Define the maximum level of negative days this kind of time off can reach. Value must be at least 1.' string='Maximum Excess Amount'
  • max_leaves Float
    compute='_compute_leaves' help='This value is given by the sum of all time off requests with a positive value.' search='_search_max_leaves' string='Maximum Allowed'
  • name Char
    required=True translate=True args: 'Time Off Type'
  • request_unit Selection
    default='day' required=True string='Duration Type' args: [('day', 'Day'), ('half_day', 'Half-Day'), ('hour', 'Hours')]
  • requires_allocation Boolean
    default=True required=True string='Requires allocation'
  • responsible_ids Many2many → res.users
    domain=<expr> help='Choose the Time Off Officers who will be notified to approve allocation or Time Off Request. If empty, nobody will be notified' string='Notify HR' args: 'res.users', 'hr_leave_type_res_users_rel', 'hr_leave_type_id', 'res_users_id'
  • sequence Integer
    default=100 help='The type with the smallest sequence is the default value in time off request'
  • support_document Boolean
    string='Supporting Document'
  • time_type Selection
    default='leave' help="The distinction between working time (ex. Attendance) and absence (ex. Training) will be used in the computation of Accrual's plan rate." string='Kind of Time Off' args: [('other', 'Worked Time'), ('leave', 'Absence')]
  • unpaid Boolean
    default=False args: 'Is Unpaid'
  • virtual_remaining_leaves Float
    compute='_compute_leaves' help='Maximum Time Off Allowed - Time Off Already Taken - Time Off Waiting Approval' search='_search_virtual_remaining_leaves' string='Virtual Remaining Time Off'
Public methods (9)
  • action_see_accrual_plans(self)
  • action_see_days_allocated(self)
  • action_see_group_leaves(self)
  • check_allocation_requirement_edit_validity(self)
    @api.constrains('requires_allocation')
  • copy_data(self, default=None)
  • get_allocation_data(self, employees, target_date=None)
  • get_allocation_data_request(self, target_date=None, hidden_allocations=True)
    @api.model
  • has_accrual_allocation(self)
    @api.model
  • requested_display_name(self)

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • leave_date_to Date
    compute='_compute_leave_date_to'
Public methods (0)

No public methods.

New fields (1)
  • leave_date_to Date
    related='employee_id.leave_date_to'
Public methods (2)
  • SELF_READABLE_FIELDS(self)
    @property
  • create(self, vals_list)
    @api.model_create_multi

New fields (1)
  • associated_leaves_count Integer
    compute='_compute_associated_leaves_count' args: 'Time Off Count'
Public methods (0)

No public methods.

New fields (2)
  • elligible_for_accrual_rate Boolean
    default=False help='If checked, this time off type will be taken into account for accruals computation.' string='Eligible for Accrual Rate'
  • holiday_id Many2one → hr.leave
    string='Time Off Request' args: 'hr.leave'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, vals)

New fields (1)
  • leave_date_to Date
    related='user_id.leave_date_to'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/18.0/hr_holidays
VERSION
VERSION 1.6
CATEGORY
CATEGORYHuman Resources/Time Off
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Christophe Simonis, Xavier Morel, Aaron Bohy, Damien Bouvy, Yannick Tivisse, Odoo Online, Pierre Masereel, Christophe Monniez, Jorge Pinna Puissant, Alexandre Kühn, Xavier-Do, Romeo Fragomeli, Sébastien Theys, Florent de Labarre, Julien Mougenot, Samuel Degueldre, Prakash Prajapati, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Mathieu Duckerts-Antoine, William Braeckman, odoo, roen-odoo, Ahmad Khanalizadeh, sofiagvaladze, Didier (did), Abdelouahab (abla), Aurelien van Delft (avd), Dossogne Bertrand, Vincent Larcin, Thomas Lefebvre (thle), alsh-odoo, Gaetan Vanden Bergh (gavb), Louis Wicket (wil), tsm-odoo, Mylyna Hy, Victor Piryns (pivi), Yash Vaishnav, Thomas Becquevort (thbe), amdi-odoo, Pierre-Yves Dufays, Levi Siuzdak (sile), Dylan Kiss (dyki), Nguyen Viet Phuong, Rahul Prajapati, Leloup Loïc (lole), Simon Goffaux (sigo), Hugo Carlier (Huca), Xavier Bol (xbo), Brieuc-brd, Sarah Bellefroid, Dawn Hwang, omra-odoo, Andrzej(pian), kdeb@odoo.com, ravb-odoo, Mattis Megevand, Mélanie, Youssef Bashandy, bary, Maryam Kia, reka-odoo, Flotchet, jugj-odoo, vava-odoo, Julien Carion (juca), mega, Tanguy Quéguineur, Alex Kühn, Ahmad (khah), Chrysanthe (chgo), sami odoo, Louis (wil), asno-odoo, mano-odoo, Mathieu Coutant, Yassin Abdelkarim, kais-odoo, rame-odoo, Kacper Gasior, Rob Coekaerts, Abdelrahman Mahmoud (amah), Sanchit Gupta, sapp-odoo, Sina Chaichi Maleki (cmsi), Pierre Pulinckx (PIPU), ahta, Julien Schwanen, st-yes, Chris Duvivier, elhayyany, ayve-odoo, Pierre Pulinckx (pipu), laro-odoo, Pierre Pulinckx, Bastien PIERRE, Corentin Heinix (cohe), sura-odoo, kusi-odoo, bona-odoo, Krzysztof Magusiak (krma), Mahdi Alijani (malj), yavy-odoo, Hazem Ibrahim, Guillaume V, Maeva De Keyser (MDEK), Ester Andreetto, nsirjacobs, pajo, Giorgio Tocco (gito), jayp-odoo, bsra-odoo, akha, npm, josm-odoo, Bertrand Dossogne, thha-odoo, romc-odoo, kareem, KAEI, Mongy (abmn), adip-odoo, Einar Andersen (eian), josv-odoo, path-odoo, Amr Elkhatieb, arpr-odoo, saurabh, Dilya Anvarbekova, Federico Falcone, Abdelrahman-Hanafy, Jurgen Gjini, lebm-odoo
WEBSITE
WEBSITEhttps://www.odoo.com/app/time-off
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 20:13:49
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - hr
    - base_setup
    - base
    - web
    - digest
    - mail
    - bus
    - web_tour
    - html_editor
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - phone_validation
    - resource_mail
    - calendar
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage time off requests and allocations
=====================================

This application controls the time off schedule of your company. It allows employees to request time off. Then, managers can review requests for time off and approve or reject them. This way you can control the overall time off planning for the company or department.

You can configure several kinds of time off (sickness, paid days, ...) and allocate time off to an employee or department quickly using time off allocation. An employee can also make a request for more days off by making a new time off allocation. It will increase the total of available days for that time off type (if the request is accepted).

You can keep track of time off in different ways by following reports:

* Time Off Summary
* Time Off by Department
* Time Off Analysis

A synchronization with an internal agenda (Meetings of the CRM module) is also possible in order to automatically create a meeting when a time off request is accepted by setting up a type of meeting in time off Type.

Code Analysis

Views touched (70)
XML IDNameModelTypeStatus
edit_holiday_status_form hr.leave.type.form hr.leave.type form New
hr_accrual_level_view_form hr.leave.accrual.level.form hr.leave.accrual.level form New
hr_accrual_plan_view_form hr.leave.accrual.plan.form hr.leave.accrual.plan form New
hr_accrual_plan_view_search hr.leave.accrual.plan.search hr.leave.accrual.plan search New
hr_accrual_plan_view_tree hr.leave.accrual.plan.list hr.leave.accrual.plan list New
hr_department_view_kanban hr.department.kanban.inherit hr.department data Inherits hr.hr_department_view_kanban
hr_employee_public_form_view_inherit hr.employee.public.leave.form.inherit hr.employee.public xpath Inherits hr.hr_employee_public_view_form
hr_employee_view_search hr.employee.search.view.inherit hr.employee xpath Inherits hr.view_employee_filter
hr_holiday_status_view_kanban hr.leave.type.kanban hr.leave.type kanban New
hr_holidays_cancel_leave_form hr.holidays.cancel.leave form New
hr_kanban_view_employees_kanban hr.employee.kanban.leaves.status hr.employee xpath Inherits hr.hr_kanban_view_employees
hr_kanban_view_public_employees_kanban hr.employee.public.kanban.leaves.status hr.employee.public xpath Inherits hr.hr_employee_public_view_kanban
hr_leave_allocation_generate_multi_wizard_view_form hr.leave.allocation.generate.multi.wizard form New
hr_leave_allocation_view_activity hr.leave.allocation.view.activity hr.leave.allocation activity New
hr_leave_allocation_view_form hr.leave.allocation.view.form hr.leave.allocation form New
hr_leave_allocation_view_form_dashboard hr.leave.view.form.dashboard hr.leave.allocation xpath Inherits hr_holidays.hr_leave_allocation_view_form
hr_leave_allocation_view_form_manager hr.leave.allocation.view.form.manager hr.leave.allocation field Inherits hr_holidays.hr_leave_allocation_view_form
hr_leave_allocation_view_form_manager_dashboard hr.leave.allocation.view.form.manager.dashboard hr.leave.allocation xpath Inherits hr_holidays.hr_leave_allocation_view_form_manager
hr_leave_allocation_view_kanban hr.leave.allocation.view.kanban hr.leave.allocation kanban New
hr_leave_allocation_view_search_manager hr.leave.allocation.view.search.my hr.leave.allocation xpath Inherits view_hr_leave_allocation_filter
hr_leave_allocation_view_search_my hr.leave.allocation.view.search.my hr.leave.allocation xpath Inherits view_hr_leave_allocation_filter
hr_leave_allocation_view_tree hr.leave.allocation.view.list hr.leave.allocation list New
hr_leave_allocation_view_tree_my hr.leave.allocation.view.list.my hr.leave.allocation xpath Inherits hr_leave_allocation_view_tree
hr_leave_employee_type_report hr.leave.employee.type.report.view.pivot hr.leave.employee.type.report pivot New
hr_leave_employee_view_dashboard hr.leave.view.dashboard hr.leave calendar New
hr_leave_generate_multi_wizard_view_form hr.leave.generate.multi.wizard form New
hr_leave_mandatory_day_view_form hr.leave.mandatory.day form New
hr_leave_mandatory_day_view_list hr.leave.mandatory.day list New
hr_leave_mandatory_day_view_search hr.leave.mandatory.day search New
hr_leave_report_calendar_view hr.leave.report.calendar.view hr.leave.report.calendar calendar New
hr_leave_report_calendar_view_form hr.leave.report.calendar.view.form hr.leave.report.calendar form New
hr_leave_report_calendar_view_search hr.leave.report.calendar.view.search hr.leave.report.calendar search New
hr_leave_report_graph report.hr.holidays.report.leave_all.graph hr.leave.report graph New
hr_leave_report_pivot report.hr.holidays.report.leave_all.pivot hr.leave.report pivot New
hr_leave_report_tree report.hr.holidays.report.leave_all.list hr.leave.report list New
hr_leave_view_activity hr.leave.view.activity hr.leave activity New
hr_leave_view_calendar hr.leave.view.calendar hr.leave calendar New
hr_leave_view_dashboard hr.leave.view.dashboard hr.leave calendar New
hr_leave_view_form hr.leave.view.form hr.leave form New
hr_leave_view_form_dashboard hr.leave.view.form.dashboard hr.leave xpath Inherits hr_holidays.hr_leave_view_form
hr_leave_view_form_dashboard_new_time_off hr.leave.view.form.dashboard.new.time.off hr.leave xpath Inherits hr_holidays.hr_leave_view_form_dashboard
hr_leave_view_form_manager hr.leave.view.form.manager hr.leave xpath Inherits hr_leave_view_form
hr_leave_view_kanban hr.leave.view.kanban hr.leave kanban New
hr_leave_view_kanban_approve_department hr.leave.view.kanban.approve.department hr.leave xpath Inherits hr_leave_view_kanban
hr_leave_view_kanban_my hr.leave.view.kanban.my hr.leave field Inherits hr_leave_view_kanban
hr_leave_view_search_manager hr.holidays.view.search.manager hr.leave field Inherits view_hr_holidays_filter
hr_leave_view_search_my hr.holidays.view.search.my hr.leave xpath Inherits view_hr_holidays_filter
hr_leave_view_search_report hr.holidays.view.search.report hr.leave filter Inherits view_hr_holidays_filter
hr_leave_view_tree hr.holidays.view.list hr.leave list New
hr_leave_view_tree_my hr.holidays.view.list hr.leave xpath Inherits hr_leave_view_tree
report_holidayssummary report_holidayssummary ir.ui.view qweb New
res_users_view_form hr.user.preferences.view.form.leave.inherit res.users xpath Inherits hr.res_users_view_form_profile
resource_calendar_form_inherit resource.calendar.form.inherit resource.calendar xpath Inherits resource.resource_calendar_form
resource_calendar_leave_form_inherit resource.calendar.leaves.form.inherit resource.calendar.leaves field Inherits resource.resource_calendar_leave_form
resource_calendar_leaves_tree_inherit resource.calendar.leaves.list.inherit resource.calendar.leaves xpath Inherits resource.resource_calendar_leave_tree
resource_calendar_leaves_view_search_inherit resource.calendar.leaves.search.inherit resource.calendar.leaves filter Inherits resource.view_resource_calendar_leaves_search
view_calendar_event_form_inherit view.calendar.event.form.inherit calendar.event xpath Inherits calendar.view_calendar_event_form
view_employee_form_leave_inherit hr.employee.leave.form.inherit hr.employee xpath Inherits hr.view_employee_form
view_employee_tree_inherit_leave hr.employee.list.leave hr.employee xpath Inherits hr.view_employee_tree
view_evaluation_report_graph hr.holidays.graph hr.leave graph New
view_holiday_graph hr.holidays.report_graph hr.leave graph New
view_holiday_list hr.holidays.report_list hr.leave list New
view_holiday_pivot hr.holidays.report_pivot hr.leave pivot New
view_holiday_status_normal_tree hr.leave.type.normal.list hr.leave.type list New
view_holidays_status_filter hr.leave.type.filter hr.leave.type search New
view_hr_holidays_filter hr.holidays.filter hr.leave search New
view_hr_holidays_filter_report hr.holidays.filter hr.leave.report search New
view_hr_holidays_summary_employee hr.holidays.summary.employee.form hr.holidays.summary.employee form New
view_hr_leave_allocation_filter hr.holidays.filter_allocations hr.leave.allocation search New
view_search_hr_holidays_employee_type_report hr.holidays.filter hr.leave.employee.type.report search New
Models touched (25)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • absence_of_today Integer
    compute='_compute_leave_count' string='Absence by Today'
  • allocation_to_approve_count Integer
    compute='_compute_leave_count' string='Allocation to Approve'
  • leave_to_approve_count Integer
    compute='_compute_leave_count' string='Time Off to Approve'
Public methods (2)
  • action_open_allocation_department(self)
  • action_open_leave_department(self)

New fields (0)

No new fields.

Public methods (1)
  • action_register_departure(self)

New fields (1)
  • current_leave_id Many2one → hr.leave.type
    compute='_compute_current_leave' groups='hr.group_hr_user' string='Current Time Off Type' args: 'hr.leave.type'
Public methods (6)
  • action_time_off_dashboard(self)
  • get_allocation_requests_amount(self)
    @api.model
  • get_mandatory_days(self, start_date, end_date)
  • get_mandatory_days_data(self, date_start, date_end)
    @api.model
  • get_public_holidays_data(self, date_start, date_end)
    @api.model
  • get_special_days_data(self, date_start, date_end)
    @api.model

New fields (13)
  • allocation_count Float
    compute='_compute_allocation_count' args: 'Total number of days allocated.'
  • allocation_display Char
    compute='_compute_allocation_remaining_display'
  • allocation_remaining_display Char
    compute='_compute_allocation_remaining_display'
  • allocations_count Integer
    compute='_compute_allocation_count' args: 'Total number of allocations'
  • current_leave_state Selection
    compute='_compute_leave_status' selection=[('confirm', 'Waiting Approval'), ('refuse', 'Refused'), ('validate1', 'Waiting Second Approval'), ('validate', 'Approved'), ('cancel', 'Cancelled')] string='Current Time Off Status'
  • hr_icon_display Selection
    selection_add=[('presence_holiday_absent', 'On leave'), ('presence_holiday_present', 'Present but on leave')]
  • is_absent Boolean
    compute='_compute_leave_status' search='_search_absent_employee' args: 'Absent Today'
  • leave_date_from Date
    compute='_compute_leave_status' args: 'From Date'
  • leave_date_to Date
    compute='_compute_leave_status' args: 'To Date'
  • leave_manager_id Many2one → res.users
    compute='_compute_leave_manager' domain="[('share', '=', False), ('company_ids', 'in', company_id)]" help='Select the user responsible for approving "Time Off" of this employee.\nIf empty, the approval is done by an Administrator or Approver (determined in settings/users).' readonly=False store=True string='Time Off' args: 'res.users'
  • leaves_count Float
    compute='_compute_remaining_leaves' args: 'Number of Time Off'
  • remaining_leaves Float
    compute='_compute_remaining_leaves' help='Total number of paid time off allocated to this employee, change this value to create allocation/time off request. Total based on all the time off types without overriding limit.' string='Available Time Off Days'
  • show_leaves Boolean
    compute='_compute_show_leaves' args: 'Able to see Remaining Time Off'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, values)

New fields (2)
  • leave_id Many2one → hr.leave
    required=True string='Time Off Request' args: 'hr.leave'
  • reason Text
    required=True
Public methods (1)
  • action_cancel_leave(self)

New fields (3)
  • date_from Date
    default=<expr> required=True string='From'
  • emp Many2many → hr.employee
    string='Employee(s)' args: 'hr.employee', 'summary_emp_rel', 'sum_id', 'emp_id'
  • holiday_type Selection
    default='Approved' required=True string='Select Time Off Type' args: [('Approved', 'Approved'), ('Confirmed', 'Confirmed'), ('both', 'Both Approved and Confirmed')]
Public methods (1)
  • print_report(self)

New fields (45)
  • active_employee Boolean
    related='employee_id.active' string='Employee Active'
  • attachment_ids One2many → ir.attachment
    string='Attachments' args: 'ir.attachment', 'res_id'
  • can_approve Boolean
    compute='_compute_can_approve' args: 'Can Approve'
  • can_cancel Boolean
    compute='_compute_can_cancel' args: 'Can Cancel'
  • can_reset Boolean
    compute='_compute_can_reset' args: 'Can reset'
  • color Integer
    related='holiday_status_id.color' args: 'Color'
  • company_id Many2one → res.company
    compute='_compute_company_id' store=True args: 'res.company'
  • date_from Datetime
    compute='_compute_date_from_to' index=True store=True tracking=True args: 'Start Date'
  • date_to Datetime
    compute='_compute_date_from_to' store=True tracking=True args: 'End Date'
  • department_id Many2one → hr.department
    compute='_compute_department_id' readonly=False store=True string='Department' args: 'hr.department'
  • duration_display Char
    compute='_compute_duration_display' help='Field allowing to see the leave request duration in days or hours depending on the leave_type_request_unit' store=True args: 'Requested (Days/Hours)'
  • employee_company_id Many2one
    related='employee_id.company_id' store=True string='Employee Company'
  • employee_id Many2one → hr.employee
    default=<expr> domain=<expr> index=True ondelete='restrict' required=True string='Employee' tracking=True args: 'hr.employee'
  • first_approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validate the time off' readonly=True string='First Approval' args: 'hr.employee'
  • has_mandatory_day Boolean
    compute='_compute_has_mandatory_day'
  • holiday_status_id Many2one → hr.leave.type
    compute='_compute_from_employee_id' domain="[\n ('company_id', 'in', [employee_company_id, False]),\n '|',\n ('requires_allocation', '=', 'no'),\n ('has_valid_allocation', '=', True),\n ]" readonly=False required=True store=True string='Time Off Type' tracking=True args: 'hr.leave.type'
  • is_hatched Boolean
    compute='_compute_is_hatched' args: 'Hatched'
  • is_striked Boolean
    compute='_compute_is_hatched' args: 'Striked'
  • last_several_days Boolean
    compute='_compute_last_several_days' args: 'All day'
  • leave_type_increases_duration Boolean
    compute='_compute_leave_type_increases_duration'
  • leave_type_request_unit Selection
    readonly=True related='holiday_status_id.request_unit'
  • leave_type_support_document Boolean
    related='holiday_status_id.support_document'
  • manager_id Many2one → hr.employee
    compute='_compute_from_employee_id' readonly=False store=True args: 'hr.employee'
  • meeting_id Many2one → calendar.event
    copy=False string='Meeting' args: 'calendar.event'
  • name Char
    compute='_compute_description' compute_sudo=False copy=False inverse='_inverse_description' search='_search_description' args: 'Description'
  • notes Text
    readonly=False args: 'Reasons'
  • number_of_days Float
    compute='_compute_duration' help='Number of days of the time off request. Used in the calculation.' store=True tracking=True args: 'Duration (Days)'
  • number_of_hours Float
    compute='_compute_duration' help='Number of hours of the time off request. Used in the calculation.' store=True tracking=True args: 'Duration (Hours)'
  • private_name Char
    groups='hr_holidays.group_hr_holidays_user' args: 'Time Off Description'
  • request_date_from Date
    args: 'Request Start Date'
  • request_date_from_period Selection
    default='am' string='Date Period Start' args: [('am', 'Morning'), ('pm', 'Afternoon')]
  • request_date_to Date
    args: 'Request End Date'
  • request_hour_from Float
    string='Hour from'
  • request_hour_to Float
    string='Hour to'
  • request_unit_half Boolean
    compute='_compute_request_unit_half' readonly=False store=True args: 'Half Day'
  • request_unit_hours Boolean
    compute='_compute_request_unit_hours' readonly=False store=True args: 'Custom Hours'
  • resource_calendar_id Many2one → resource.calendar
    compute='_compute_resource_calendar_id' copy=False readonly=False store=True args: 'resource.calendar'
  • second_approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validate the time off with second level (If time off type need second validation)' readonly=True string='Second Approval' args: 'hr.employee'
  • state Selection
    copy=False default='confirm' help=<expr> readonly=False store=True string='Status' tracking=True args: [('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved'), ('cancel', 'Cancelled')]
  • supported_attachment_ids Many2many → ir.attachment
    compute='_compute_supported_attachment_ids' inverse='_inverse_supported_attachment_ids' string='Attach File' args: 'ir.attachment'
  • supported_attachment_ids_count Integer
    compute='_compute_supported_attachment_ids'
  • tz Selection
    compute='_compute_tz' args: _tz_get
  • tz_mismatch Boolean
    compute='_compute_tz_mismatch'
  • user_id Many2one → res.users
    compute_sudo=True index=True readonly=True related='employee_id.user_id' related_sudo=True store=True string='User' args: 'res.users'
  • validation_type Selection
    readonly=False related='holiday_status_id.leave_validation_type' string='Validation Type'
Public methods (18)
  • action_approve(self, check_state=True)
  • action_cancel(self)
  • action_documents(self)
  • action_open_records(self, leave_ids)
    @api.model
  • action_refuse(self)
  • action_reset_confirm(self)
  • action_validate(self, check_state=True)
  • activity_update(self)
  • add_follower(self, employee_id)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields_list)
    @api.model
  • get_unusual_days(self, date_from, date_to=None)
    @api.model
  • message_subscribe(self, partner_ids=None, subtype_ids=None)
  • onchange(self, values, field_names, fields_spec)
  • open_pending_requests(self)
    @api.model
  • unlink(self)
  • write(self, values)

New fields (32)
  • accrual_plan_id Many2one → hr.leave.accrual.plan
    ondelete='cascade' required=True args: 'hr.leave.accrual.plan', 'Accrual Plan'
  • accrual_validity Boolean
    string='Accrual Validity'
  • accrual_validity_count Integer
    default='1' help='You can define a period of time where the days carried over will be available' args: 'Accrual Validity Count'
  • accrual_validity_type Selection
    default='day' help='This field defines the unit of time after which the accrual ends.' required=True string='Accrual Validity Type' args: [('day', 'Days'), ('month', 'Months')]
  • accrued_gain_time Selection
    related='accrual_plan_id.accrued_gain_time'
  • action_with_unused_accruals Selection
    default='all' help="When the Carry-Over Time is reached, according to Plan's setting, select what you want to happen with the unused time off: None (time will be reset to zero), All accrued time carried over to the next period; or Carryover with a maximum)." required=True string='Carry over' args: [('lost', 'None. Accrued time reset to 0'), ('all', 'All accrued time carried over'), ('maximum', 'Carry over with a maximum')]
  • added_value Float
    default=1 digits=(16, 5) help='The number of hours/days that will be incremented in the specified Time Off Type for every period' required=True args: 'Rate'
  • added_value_type Selection
    compute='_compute_added_value_type' default='day' readonly=False required=True store=True args: [('day', 'Days'), ('hour', 'Hours')]
  • can_modify_value_type Boolean
    compute='_compute_can_modify_value_type'
  • cap_accrued_time Boolean
    default=True help='When the field is checked the balance of an allocation using this accrual plan will never exceed the specified amount.' args: 'Cap accrued time'
  • cap_accrued_time_yearly Boolean
    help='When the field is checked the total amount accrued each year will be capped at the specified amount' string='Milestone cap'
  • first_day Integer
    default=1
  • first_day_display Selection
    compute='_compute_days_display' inverse='_inverse_first_day_display' args: _get_selection_days
  • first_month Selection
    default='jan' args: [('jan', 'January'), ('feb', 'February'), ('mar', 'March'), ('apr', 'April'), ('may', 'May'), ('jun', 'June')]
  • first_month_day Integer
    default=1
  • first_month_day_display Selection
    compute='_compute_days_display' inverse='_inverse_first_month_day_display' args: _get_selection_days
  • frequency Selection
    default='daily' required=True string='Frequency' args: [('hourly', 'Hourly'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('bimonthly', 'Twice a month'), ('monthly', 'Monthly'), ('biyearly', 'Twice a year'), ('yearly', 'Yearly')]
  • maximum_leave Float
    compute='_compute_maximum_leave' digits=(16, 2) help='Choose a cap for this accrual.' readonly=False store=True args: 'Limit to'
  • maximum_leave_yearly Float
    digits=(16, 2) string='Yearly limit to'
  • postpone_max_days Integer
    help='Set a maximum of accruals an allocation keeps at the end of the year.' args: 'Maximum amount of accruals to transfer'
  • second_day Integer
    default=15
  • second_day_display Selection
    compute='_compute_days_display' inverse='_inverse_second_day_display' args: _get_selection_days
  • second_month Selection
    default='jul' args: [('jul', 'July'), ('aug', 'August'), ('sep', 'September'), ('oct', 'October'), ('nov', 'November'), ('dec', 'December')]
  • second_month_day Integer
    default=1
  • second_month_day_display Selection
    compute='_compute_days_display' inverse='_inverse_second_month_day_display' args: _get_selection_days
  • sequence Integer
    compute='_compute_sequence' help='Sequence is generated automatically by start time delta.' store=True string='sequence'
  • start_count Integer
    default='1' help='The accrual starts after a defined period from the allocation start date. This field defines the number of days, months or years after which accrual is used.' args: 'Start after'
  • start_type Selection
    default='day' help='This field defines the unit of time after which the accrual starts.' required=True string=' ' args: [('day', 'Days'), ('month', 'Months'), ('year', 'Years')]
  • week_day Selection
    default='mon' required=True string='Allocation on' args: [('mon', 'Monday'), ('tue', 'Tuesday'), ('wed', 'Wednesday'), ('thu', 'Thursday'), ('fri', 'Friday'), ('sat', 'Saturday'), ('sun', 'Sunday')]
  • yearly_day Integer
    default=1
  • yearly_day_display Selection
    compute='_compute_days_display' inverse='_inverse_yearly_day_display' args: _get_selection_days
  • yearly_month Selection
    default='jan' args: [('jan', 'January'), ('feb', 'February'), ('mar', 'March'), ('apr', 'April'), ('may', 'May'), ('jun', 'June'), ('jul', 'July'), ('aug', 'August'), ('sep', 'September'), ('oct', 'October'), ('nov', 'November'), ('dec', 'December')]
Public methods (0)

No public methods.

New fields (17)
  • accrued_gain_time Selection
    default='end' required=True args: [('start', 'At the start of the accrual period'), ('end', 'At the end of the accrual period')]
  • active Boolean
    default=True
  • added_value_type Selection
    compute='_compute_added_value_type' store=True args: [('day', 'Days'), ('hour', 'Hours')]
  • allocation_ids One2many → hr.leave.allocation
    args: 'hr.leave.allocation', 'accrual_plan_id'
  • carryover_date Selection
    default='year_start' required=True string='Carry-Over Time' args: [('year_start', 'At the start of the year'), ('allocation', 'At the allocation date'), ('other', 'Other')]
  • carryover_day Integer
    default=1
  • carryover_day_display Selection
    compute='_compute_carryover_day_display' inverse='_inverse_carryover_day_display' args: _get_selection_days
  • carryover_month Selection
    default='jan' args: [('jan', 'January'), ('feb', 'February'), ('mar', 'March'), ('apr', 'April'), ('may', 'May'), ('jun', 'June'), ('jul', 'July'), ('aug', 'August'), ('sep', 'September'), ('oct', 'October'), ('nov', 'November'), ('dec', 'December')]
  • company_id Many2one → res.company
    compute='_compute_company_id' readonly=False store='True' string='Company' args: 'res.company'
  • employees_count Integer
    compute='_compute_employee_count' args: 'Employees'
  • is_based_on_worked_time Boolean
    compute='_compute_is_based_on_worked_time' help='If checked, the accrual period will be calculated according to the work days, not calendar days.' readonly=False store=True args: 'Based on worked time'
  • level_count Integer
    compute='_compute_level_count' args: 'Levels'
  • level_ids One2many → hr.leave.accrual.level
    copy=True string='Milestone' args: 'hr.leave.accrual.level', 'accrual_plan_id'
  • name Char
    required=True args: 'Name'
  • show_transition_mode Boolean
    compute='_compute_show_transition_mode'
  • time_off_type_id Many2one → hr.leave.type
    check_company=True help='Specify if this accrual plan can only be used with this Time Off Type.\n Leave empty if this accrual plan can be used with any Time Off Type.' string='Time Off Type' args: 'hr.leave.type'
  • transition_mode Selection
    default='immediately' help="Specify what occurs if a level transition takes place in the middle of a pay period.\n\n 'Immediately' will switch the employee to the new accrual level on the exact date during the ongoing pay period.\n\n 'After this accrual's period' will keep the employee on the same accrual level until the ongoing pay period is complete.\n After it is complete, the new level will take effect when the next pay period begins." required=True string='Milestone Transition' args: [('immediately', 'Immediately'), ('end_of_accrual', "After this accrual's period")]
Public methods (2)
  • action_open_accrual_plan_employees(self)
  • copy_data(self, default=None)

New fields (35)
  • accrual_plan_id Many2one → hr.leave.accrual.plan
    compute='_compute_accrual_plan_id' domain="['|', ('time_off_type_id', '=', False), ('time_off_type_id', '=', holiday_status_id)]" inverse='_inverse_accrual_plan_id' readonly=False store=True tracking=True args: 'hr.leave.accrual.plan'
  • active_employee Boolean
    readonly=True related='employee_id.active' args: 'Active Employee'
  • actual_lastcall Date
    export_string_translation=False
  • allocation_type Selection
    default='regular' readonly=True required=True string='Allocation Type' args: [('regular', 'Regular Allocation'), ('accrual', 'Accrual Allocation')]
  • already_accrued Boolean
  • approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validates the allocation' readonly=True string='First Approval' args: 'hr.employee'
  • can_approve Boolean
    compute='_compute_can_approve' args: 'Can Approve'
  • carried_over_days_expiration_date Date
    args: 'Carried over days expiration date'
  • date_from Date
    copy=False default=fields.Date.context_today index=True required=True tracking=True args: 'Start Date'
  • date_to Date
    copy=False tracking=True args: 'End Date'
  • department_id Many2one → hr.department
    compute='_compute_department_id' readonly=False store=True string='Department' args: 'hr.department'
  • duration_display Char
    compute='_compute_duration_display' help='Field allowing to see the allocation duration in days or hours depending on the type_request_unit' args: 'Allocated (Days/Hours)'
  • employee_company_id Many2one
    readonly=True related='employee_id.company_id' store=True
  • employee_id Many2one → hr.employee
    default=<expr> domain=_domain_employee_id index=True ondelete='restrict' required=True string='Employee' tracking=True args: 'hr.employee'
  • expiring_carryover_days Float
    args: 'The number of carried over days that will expire on carried_over_days_expiration_date'
  • holiday_status_id Many2one → hr.leave.type
    compute='_compute_holiday_status_id' default=_default_holiday_status_id domain=_domain_holiday_status_id readonly=False required=True store=True string='Time Off Type' args: 'hr.leave.type'
  • is_name_custom Boolean
    readonly=True store=False
  • is_officer Boolean
    compute='_compute_is_officer'
  • last_executed_carryover_date Date
    export_string_translation=False
  • lastcall Date
    readonly=True args: 'Date of the last accrual allocation'
  • leaves_taken Float
    compute='_compute_leaves' string='Time off Taken'
  • manager_id Many2one → hr.employee
    compute='_compute_manager_id' store=True string='Manager' args: 'hr.employee'
  • max_leaves Float
    compute='_compute_leaves'
  • name Char
    compute='_compute_description' compute_sudo=False readonly=False store=True string='Description'
  • name_validity Char
    compute='_compute_description_validity' args: 'Description with validity'
  • nextcall Date
    default=False readonly=True args: 'Date of the next accrual allocation'
  • notes Text
    readonly=False args: 'Reasons'
  • number_of_days Float
    compute='_compute_number_of_days' default=1 help='Duration in days. Reference field to use when necessary.' readonly=False store=True tracking=True args: 'Number of Days'
  • number_of_days_display Float
    compute='_compute_number_of_days_display' help='For an Accrual Allocation, this field contains the theorical amount of time given to the employee, due to a previous start date, on the first run of the plan. This can be manually edited.' args: 'Duration (days)'
  • number_of_hours_display Float
    compute='_compute_number_of_hours_display' default_export_compatible=True help='For an Accrual Allocation, this field contains the theorical amount of time given to the employee, due to a previous start date, on the first run of the plan. This can be manually edited.' store=True args: 'Duration (hours)'
  • second_approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validates the allocation with second level (If time off type need second validation)' readonly=True string='Second Approval' args: 'hr.employee'
  • state Selection
    copy=False default='confirm' help="The status is 'To Approve', when an allocation request is created.\nThe status is 'Refused', when an allocation request is refused by manager.\nThe status is 'Approved', when an allocation request is approved by manager." readonly=True string='Status' tracking=True args: [('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
  • type_request_unit Selection
    compute='_compute_type_request_unit' args: [('hour', 'Hours'), ('half_day', 'Half Day'), ('day', 'Day')]
  • validation_type Selection
    readonly=True related='holiday_status_id.allocation_validation_type' string='Validation Type'
  • yearly_accrued_amount Float
    export_string_translation=False
Public methods (11)
  • action_approve(self)
  • action_refuse(self)
  • action_set_to_confirm(self)
  • action_validate(self)
  • activity_update(self)
  • add_follower(self, employee_id)
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
    Override to avoid automatic logging of creation
  • message_subscribe(self, partner_ids=None, subtype_ids=None)
  • onchange(self, values, field_names, fields_spec)
  • write(self, values)

New fields (14)
  • accrual_plan_id Many2one → hr.leave.accrual.plan
    domain="['|', ('time_off_type_id', '=', False), ('time_off_type_id', '=', holiday_status_id)]" args: 'hr.leave.accrual.plan'
  • allocation_mode Selection
    default='employee' help='Allow to create requests in batchs:\n- By Employee: for a specific employee\n- By Company: all employees of the specified company\n- By Department: all employees of the specified department\n- By Employee Tag: all employees of the specific employee group category' readonly=False required=True string='Allocation Mode' args: [('employee', 'By Employee'), ('company', 'By Company'), ('department', 'By Department'), ('category', 'By Employee Tag')]
  • allocation_type Selection
    default='regular' required=True string='Allocation Type' args: [('regular', 'Regular Allocation'), ('accrual', 'Accrual Allocation')]
  • category_id Many2one → hr.employee.category
    string='Employee Tag' args: 'hr.employee.category'
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company'
  • date_from Date
    default=fields.Date.context_today required=True args: 'Start Date'
  • date_to Date
    args: 'End Date'
  • department_id Many2one → hr.department
    args: 'hr.department'
  • duration Float
    string='Allocation'
  • employee_ids Many2many → hr.employee
    domain="[('company_id', '=', company_id)]" string='Employees' args: 'hr.employee'
  • holiday_status_id Many2one → hr.leave.type
    domain="[('company_id', 'in', [company_id, False])]" required=True string='Time Off Type' args: 'hr.leave.type'
  • name Char
    compute='_compute_name' readonly=False store=True args: 'Description'
  • notes Text
    args: 'Reasons'
  • request_unit Selection
    related='holiday_status_id.request_unit'
Public methods (1)
  • action_generate_allocations(self)

New fields (11)
  • active_employee Boolean
    readonly=True
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • date_from Datetime
    readonly=True args: 'Start Date'
  • date_to Datetime
    readonly=True args: 'End Date'
  • department_id Many2one → hr.department
    readonly=True string='Department' args: 'hr.department'
  • employee_id Many2one → hr.employee
    readonly=True string='Employee' args: 'hr.employee'
  • holiday_status Selection
    args: [('taken', 'Taken'), ('left', 'Left'), ('planned', 'Planned')]
  • leave_type Many2one → hr.leave.type
    readonly=True string='Time Off Type' args: 'hr.leave.type'
  • number_of_days Float
    aggregator='sum' readonly=True args: 'Number of Days'
  • number_of_hours Float
    aggregator='sum' readonly=True args: 'Number of Hours'
  • state Selection
    readonly=True string='Status' args: [('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
Public methods (2)
  • action_time_off_analysis(self)
    @api.model
  • init(self)

New fields (9)
  • allocation_mode Selection
    default='employee' help='Allow to create requests in batchs:\n- By Employee: for a specific employee\n- By Company: all employees of the specified company\n- By Department: all employees of the specified department\n- By Employee Tag: all employees of the specific employee group category' readonly=False required=True string='Allocation Mode' args: [('employee', 'By Employee'), ('company', 'By Company'), ('department', 'By Department'), ('category', 'By Employee Tag')]
  • category_id Many2one → hr.employee.category
    string='Employee Tag' args: 'hr.employee.category'
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company'
  • date_from Date
    required=True args: 'Start Date'
  • date_to Date
    required=True args: 'End Date'
  • department_id Many2one → hr.department
    args: 'hr.department'
  • employee_ids Many2many → hr.employee
    domain="[('company_id', '=', company_id)]" string='Employees' args: 'hr.employee'
  • holiday_status_id Many2one → hr.leave.type
    domain="[('company_id', 'in', [company_id, False])]" required=True string='Time Off Type' args: 'hr.leave.type'
  • name Char
    args: 'Description'
Public methods (1)
  • action_generate_time_off(self)

New fields (7)
  • color Integer
    default=<expr>
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company'
  • department_ids Many2many → hr.department
    string='Departments' args: 'hr.department'
  • end_date Date
    required=True
  • name Char
    required=True
  • resource_calendar_id Many2one → resource.calendar
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" args: 'resource.calendar', 'Working Hours'
  • start_date Date
    required=True
Public methods (0)

No public methods.

New fields (12)
  • allocation_id Many2one → hr.leave.allocation
    readonly=True string='Allocation Request' args: 'hr.leave.allocation'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • date_from Datetime
    readonly=True args: 'Start Date'
  • date_to Datetime
    readonly=True args: 'End Date'
  • department_id Many2one → hr.department
    readonly=True string='Department' args: 'hr.department'
  • holiday_status_id Many2one → hr.leave.type
    readonly=True string='Time Off Type' args: 'hr.leave.type'
  • leave_id Many2one → hr.leave
    readonly=True string='Time Off Request' args: 'hr.leave'
  • leave_type Selection
    readonly=True string='Request Type' args: [('allocation', 'Allocation'), ('request', 'Time Off')]
  • name Char
    readonly=True args: 'Description'
  • number_of_days Float
    readonly=True args: 'Number of Days'
  • number_of_hours Float
    readonly=True args: 'Number of Hours'
  • state Selection
    readonly=True string='Status' args: [('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
Public methods (2)
  • action_open_record(self)
  • init(self)

New fields (18)
  • company_id Many2one → res.company
    readonly=True args: 'res.company'
  • department_id Many2one → hr.department
    readonly=True args: 'hr.department'
  • description Char
    groups='hr_holidays.group_hr_holidays_user' readonly=True args: 'Description'
  • duration Float
    readonly=True string='Duration'
  • employee_id Many2one → hr.employee
    readonly=True args: 'hr.employee'
  • holiday_status_id Many2one → hr.leave.type
    groups='hr_holidays.group_hr_holidays_user' readonly=True string='Time Off Type' args: 'hr.leave.type'
  • is_absent Boolean
    related='employee_id.is_absent'
  • is_hatched Boolean
    readonly=True args: 'Hatched'
  • is_manager Boolean
    compute='_compute_is_manager' args: 'Manager'
  • is_striked Boolean
    readonly=True args: 'Striked'
  • job_id Many2one → hr.job
    readonly=True args: 'hr.job'
  • leave_id Many2one → hr.leave
    comodel_name='hr.leave' groups='hr_holidays.group_hr_holidays_user' readonly=True
  • leave_manager_id Many2one
    related='employee_id.leave_manager_id'
  • name Char
    compute='_compute_name' readonly=True string='Name'
  • start_datetime Datetime
    readonly=True string='From'
  • state Selection
    readonly=True args: [('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
  • stop_datetime Datetime
    readonly=True string='To'
  • tz Selection
    readonly=True string='Timezone' args: _tz_get
Public methods (5)
  • action_approve(self)
  • action_refuse(self)
  • action_validate(self)
  • get_unusual_days(self, date_from, date_to=None)
    @api.model
  • init(self)

New fields (32)
  • accrual_count Float
    compute='_compute_accrual_count' string='Accruals count'
  • accruals_ids One2many → hr.leave.accrual.plan
    args: 'hr.leave.accrual.plan', 'time_off_type_id'
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the time off type without removing it.' args: 'Active'
  • allocation_count Integer
    compute='_compute_allocation_count' string='Allocations'
  • allocation_notif_subtype_id Many2one → mail.message.subtype
    default=<expr> string='Allocation Notification Subtype' args: 'mail.message.subtype'
  • allocation_validation_type Selection
    default='hr' help="Select the level of approval needed in case of request by employee\n # - No validation needed: The employee's request is automatically approved.\n # - Approved by Time Off Officer: The employee's request need to be manually approved\n # by the Time Off Officer, Employee's Approver or both." string='Approval' args: [('no_validation', 'No Validation'), ('hr', 'By Time Off Officer'), ('manager', "By Employee's Approver"), ('both', "By Employee's Approver and Time Off Officer")]
  • allows_negative Boolean
    help='If checked, users request can exceed the allocated days and balance can go in negative.' string='Allow Negative Cap'
  • color Integer
    help='The color selected here will be used in every screen with the time off type.' string='Color'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • country_code Char
    depends=['country_id'] readonly=True related='country_id.code'
  • country_id Many2one → res.country
    readonly=True related='company_id.country_id' string='Country' args: 'res.country'
  • create_calendar_meeting Boolean
    default=True string='Display Time Off in Calendar'
  • employee_requests Selection
    default='no' help='Extra Days Requests Allowed: User can request an allocation for himself.\n\n Not Allowed: User cannot request an allocation.' required=True string='Employee Requests' args: [('yes', 'Extra Days Requests Allowed'), ('no', 'Not Allowed')]
  • group_days_leave Float
    compute='_compute_group_days_leave' string='Group Time Off'
  • has_valid_allocation Boolean
    compute='_compute_valid' help='This indicates if it is still possible to use this type of leave' search='_search_valid'
  • icon_id Many2one → ir.attachment
    domain="[('res_model', '=', 'hr.leave.type'), ('res_field', '=', 'icon_id')]" string='Cover Image' args: 'ir.attachment'
  • include_public_holidays_in_duration Boolean
    default=False help='Public holidays should be counted in the leave duration when applying for leaves' args: 'Public Holiday Included'
  • leave_notif_subtype_id Many2one → mail.message.subtype
    default=<expr> string='Time Off Notification Subtype' args: 'mail.message.subtype'
  • leave_validation_type Selection
    default='hr' string='Time Off Validation' args: [('no_validation', 'No Validation'), ('hr', 'By Time Off Officer'), ('manager', "By Employee's Approver"), ('both', "By Employee's Approver and Time Off Officer")]
  • leaves_taken Float
    compute='_compute_leaves' help='This value is given by the sum of all time off requests with a negative value.' string='Time off Already Taken'
  • max_allowed_negative Integer
    help='Define the maximum level of negative days this kind of time off can reach. Value must be at least 1.' string='Maximum Excess Amount'
  • max_leaves Float
    compute='_compute_leaves' help='This value is given by the sum of all time off requests with a positive value.' search='_search_max_leaves' string='Maximum Allowed'
  • name Char
    required=True translate=True args: 'Time Off Type'
  • request_unit Selection
    default='day' required=True string='Take Time Off in' args: [('day', 'Day'), ('half_day', 'Half Day'), ('hour', 'Hours')]
  • requires_allocation Selection
    default='yes' help='Yes: Time off requests need to have a valid allocation.\n\n No Limit: Time Off requests can be taken without any prior allocation.' required=True string='Requires allocation' args: [('yes', 'Yes'), ('no', 'No Limit')]
  • responsible_ids Many2many → res.users
    auto_join=True domain=<expr> help='Choose the Time Off Officers who will be notified to approve allocation or Time Off Request. If empty, nobody will be notified' string='Notified Time Off Officer' args: 'res.users', 'hr_leave_type_res_users_rel', 'hr_leave_type_id', 'res_users_id'
  • sequence Integer
    default=100 help='The type with the smallest sequence is the default value in time off request'
  • show_on_dashboard Boolean
    default=True help='Non-visible allocations can still be selected when taking a leave, but will simply not be displayed on the leave dashboard.'
  • support_document Boolean
    string='Supporting Document'
  • time_type Selection
    default='leave' help="The distinction between working time (ex. Attendance) and absence (ex. Training) will be used in the computation of Accrual's plan rate." string='Kind of Time Off' args: [('other', 'Worked Time'), ('leave', 'Absence')]
  • unpaid Boolean
    default=False args: 'Is Unpaid'
  • virtual_remaining_leaves Float
    compute='_compute_leaves' help='Maximum Time Off Allowed - Time Off Already Taken - Time Off Waiting Approval' search='_search_virtual_remaining_leaves' string='Virtual Remaining Time Off'
Public methods (9)
  • action_see_accrual_plans(self)
  • action_see_days_allocated(self)
  • action_see_group_leaves(self)
  • check_allocation_requirement_edit_validity(self)
    @api.constrains('requires_allocation')
  • copy_data(self, default=None)
  • get_allocation_data(self, employees, target_date=None)
  • get_allocation_data_request(self, target_date=None, hidden_allocations=True)
    @api.model
  • has_accrual_allocation(self)
    @api.model
  • requested_display_name(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (9)
  • allocation_count Float
    related='employee_id.allocation_count'
  • allocation_display Char
    related='employee_id.allocation_display'
  • allocation_remaining_display Char
    related='employee_id.allocation_remaining_display'
  • current_leave_state Selection
    related='employee_id.current_leave_state'
  • hr_icon_display Selection
    related='employee_id.hr_icon_display'
  • is_absent Boolean
    related='employee_id.is_absent'
  • leave_date_to Date
    related='employee_id.leave_date_to'
  • leave_manager_id Many2one
    related='employee_id.leave_manager_id'
  • show_leaves Boolean
    related='employee_id.show_leaves'
Public methods (2)
  • SELF_READABLE_FIELDS(self)
    @property
  • create(self, vals_list)
    @api.model_create_multi

New fields (1)
  • associated_leaves_count Integer
    compute='_compute_associated_leaves_count' args: 'Time Off Count'
Public methods (0)

No public methods.

New fields (1)
  • holiday_id Many2one → hr.leave
    string='Time Off Request' args: 'hr.leave'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, vals)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/17.0/hr_holidays
VERSION
VERSION 1.6
CATEGORY
CATEGORYHuman Resources/Time Off
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Joren Van Onder, Atul Patel, Géry Debongnie, Aaron Bohy, Jeremy Kersten, Damien Bouvy, Wolfgang Taferner, Yannick Tivisse, qsm-odoo, Odoo Online, Romain Derie, Christophe Monniez, Jorge Pinna Puissant, Lucas Perais, Alexandre Kühn, Xavier-Do, Victor Feyens, Sébastien Theys, Joseph Caburnay, Florent de Labarre, Julien Mougenot, Samuel Degueldre, Prakash Prajapati, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Pierre Paridans, William Braeckman, Kevin Baptiste, Philippe Wauthy, roen-odoo, Ahmad Khanalizadeh, sofiagvaladze, MerlinGuillaume, Florian Vranckx, Yolann Sabaux, Abdelouahab (abla), Aurelien van Delft (avd), Dossogne Bertrand, luvi, niyasraphy, Thomas Lefebvre (thle), alsh-odoo, Gaetan Vanden Bergh (gavb), Louis Wicket (wil), tsm-odoo, nda, Yash Vaishnav, Tommy (tong), Mahamadasif Ansari, Thomas Becquevort (thbe), Tom De Caluwé, Pierre-Yves Dufays, Malay Khamar, duongnguyen, Jurgen (jugj), pash-odoo, Levi Siuzdak (sile), Dylan Kiss (dyki), Bruno Boi, Nguyen Viet Phuong, FrancoisGe, Michael (mcm), Rahul Prajapati, Chong Wang (cwg), Leloup Loïc (lole), Simon Goffaux (sigo), prye-odoo, Xavier Bol (xbo), Brieuc-brd, SilvioC2C, Nguyễn Đại Dương, Leonardo Pavan Rocha, Sarah Bellefroid, Dawn Hwang, Andrzej(pian), rajh-odoo, kdeb@odoo.com, ravb-odoo, Dang Van Loc, Mattis Megevand, dasz, Mélanie, Youssef Bashandy, bary, Flotchet, jugj-odoo, vava-odoo, Julien Carion (juca), mega, Tanguy Quéguineur, Alex Kühn, Ahmed Mohamed, Chrysanthe (chgo), sami odoo, Louis (wil), asno-odoo, Mathieu Coutant, Yassin Abdelkarim, Rohitkumar (roku), Elisabeth Dickinson, Xavier Luyckx (xlu), Hadi (alha), Kacper Gasior, jich-odoo, Rob Coekaerts, Abdelrahman Mahmoud (amah), Sanchit Gupta, sapp-odoo, Sina Chaichi Maleki (cmsi), ahta, Abdessamad Zouiten (abzo), gvar-odoo, st-yes, ayve-odoo, Pierre Pulinckx (pipu), Bastien PIERRE, Corentin Heinix (cohe), pish-odoo, Mahdi Alijani (malj), rupa-odoo, yavy-odoo, Duy (Đỗ Anh), Pulinckx Pierre (PIPU), Guillaume V, Gurpreet Singh, Giorgio Tocco (gito), jayp-odoo, bsra-odoo, akha, npm, josm-odoo, Bertrand Dossogne, MAGREMENT, thha-odoo, romc-odoo, kareem, KAEI
WEBSITE
WEBSITEhttps://www.odoo.com/app/time-off
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:02:04
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - hr
    - base_setup
    - base
    - web
    - phone_validation
    - mail
    - bus
    - web_tour
    - resource
    - calendar
    - onboarding
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage time off requests and allocations
=====================================

This application controls the time off schedule of your company. It allows employees to request time off. Then, managers can review requests for time off and approve or reject them. This way you can control the overall time off planning for the company or department.

You can configure several kinds of time off (sickness, paid days, ...) and allocate time off to an employee or department quickly using time off allocation. An employee can also make a request for more days off by making a new time off allocation. It will increase the total of available days for that time off type (if the request is accepted).

You can keep track of time off in different ways by following reports:

* Time Off Summary
* Time Off by Department
* Time Off Analysis

A synchronization with an internal agenda (Meetings of the CRM module) is also possible in order to automatically create a meeting when a time off request is accepted by setting up a type of meeting in time off Type.

Code Analysis

Views touched (68)
XML IDNameModelTypeStatus
edit_holiday_status_form hr.leave.type.form hr.leave.type form New
hr_accrual_level_view_form hr.leave.accrual.level.form hr.leave.accrual.level form New
hr_accrual_plan_view_form hr.leave.accrual.plan.form hr.leave.accrual.plan form New
hr_accrual_plan_view_search hr.leave.accrual.plan.search hr.leave.accrual.plan search New
hr_accrual_plan_view_tree hr.leave.accrual.plan.tree hr.leave.accrual.plan tree New
hr_department_view_kanban hr.department.kanban.inherit hr.department data Inherits hr.hr_department_view_kanban
hr_departure_wizard_view_form hr.departure.wizard.view.form.extend3 hr.departure.wizard xpath Inherits hr.hr_departure_wizard_view_form
hr_employee_public_form_view_inherit hr.employee.public.leave.form.inherit hr.employee.public xpath Inherits hr.hr_employee_public_view_form
hr_employee_view_search hr.employee.search.view.inherit hr.employee xpath Inherits hr.view_employee_filter
hr_holiday_status_view_kanban hr.leave.type.kanban hr.leave.type kanban New
hr_holidays_cancel_leave_form hr.holidays.cancel.leave form New
hr_kanban_view_employees_kanban hr.employee.kanban.leaves.status hr.employee xpath Inherits hr.hr_kanban_view_employees
hr_kanban_view_public_employees_kanban hr.employee.public.kanban.leaves.status hr.employee.public xpath Inherits hr.hr_employee_public_view_kanban
hr_leave_allocation_view_activity hr.leave.allocation.view.activity hr.leave.allocation activity New
hr_leave_allocation_view_form hr.leave.allocation.view.form hr.leave.allocation form New
hr_leave_allocation_view_form_dashboard hr.leave.view.form.dashboard hr.leave.allocation xpath Inherits hr_holidays.hr_leave_allocation_view_form
hr_leave_allocation_view_form_manager hr.leave.allocation.view.form.manager hr.leave.allocation field Inherits hr_holidays.hr_leave_allocation_view_form
hr_leave_allocation_view_form_manager_dashboard hr.leave.allocation.view.form.manager.dashboard hr.leave.allocation xpath Inherits hr_holidays.hr_leave_allocation_view_form_manager
hr_leave_allocation_view_kanban hr.leave.allocation.view.kanban hr.leave.allocation kanban New
hr_leave_allocation_view_search_manager hr.leave.allocation.view.search.my hr.leave.allocation xpath Inherits view_hr_leave_allocation_filter
hr_leave_allocation_view_search_my hr.leave.allocation.view.search.my hr.leave.allocation xpath Inherits view_hr_leave_allocation_filter
hr_leave_allocation_view_tree hr.leave.allocation.view.tree hr.leave.allocation tree New
hr_leave_allocation_view_tree_my hr.leave.allocation.view.tree.my hr.leave.allocation xpath Inherits hr_leave_allocation_view_tree
hr_leave_employee_type_report hr.leave.employee.type.report.view.pivot hr.leave.employee.type.report pivot New
hr_leave_employee_view_dashboard hr.leave.view.dashboard hr.leave calendar New
hr_leave_mandatory_day_view_form hr.leave.mandatory.day form New
hr_leave_mandatory_day_view_list hr.leave.mandatory.day tree New
hr_leave_mandatory_day_view_search hr.leave.mandatory.day search New
hr_leave_report_calendar_view hr.leave.report.calendar.view hr.leave.report.calendar calendar New
hr_leave_report_calendar_view_form hr.leave.report.calendar.view.form hr.leave.report.calendar form New
hr_leave_report_calendar_view_search hr.leave.report.calendar.view.search hr.leave.report.calendar search New
hr_leave_report_graph report.hr.holidays.report.leave_all.graph hr.leave.report graph New
hr_leave_report_pivot report.hr.holidays.report.leave_all.pivot hr.leave.report pivot New
hr_leave_report_search_view he.leave.report.search.view hr.leave filter Inherits view_hr_holidays_filter
hr_leave_report_tree report.hr.holidays.report.leave_all.tree hr.leave.report tree New
hr_leave_view_activity hr.leave.view.activity hr.leave activity New
hr_leave_view_calendar hr.leave.view.calendar hr.leave calendar New
hr_leave_view_dashboard hr.leave.view.dashboard hr.leave calendar New
hr_leave_view_form hr.leave.view.form hr.leave form New
hr_leave_view_form_dashboard hr.leave.view.form.dashboard hr.leave xpath Inherits hr_holidays.hr_leave_view_form
hr_leave_view_form_dashboard_new_time_off hr.leave.view.form.dashboard.new.time.off hr.leave xpath Inherits hr_holidays.hr_leave_view_form_dashboard
hr_leave_view_form_manager hr.leave.view.form.manager hr.leave xpath Inherits hr_leave_view_form
hr_leave_view_kanban hr.leave.view.kanban hr.leave kanban New
hr_leave_view_kanban_approve_department hr.leave.view.kanban.approve.department hr.leave xpath Inherits hr_leave_view_kanban
hr_leave_view_kanban_my hr.leave.view.kanban.my hr.leave strong Inherits hr_leave_view_kanban
hr_leave_view_search_manager hr.holidays.view.search.manager hr.leave xpath Inherits view_hr_holidays_filter
hr_leave_view_search_my hr.holidays.view.search.my hr.leave xpath Inherits view_hr_holidays_filter
hr_leave_view_tree hr.holidays.view.tree hr.leave tree New
hr_leave_view_tree_my hr.holidays.view.tree hr.leave xpath Inherits hr_leave_view_tree
report_holidayssummary report_holidayssummary ir.ui.view qweb New
res_users_view_form hr.user.preferences.view.form.leave.inherit res.users xpath Inherits hr.res_users_view_form_profile
resource_calendar_form_inherit resource.calendar.form.inherit resource.calendar xpath Inherits resource.resource_calendar_form
resource_calendar_leave_form_inherit resource.calendar.leaves.form.inherit resource.calendar.leaves field Inherits resource.resource_calendar_leave_form
resource_calendar_leaves_tree_inherit resource.calendar.leaves.tree.inherit resource.calendar.leaves xpath Inherits resource.resource_calendar_leave_tree
resource_calendar_leaves_view_search_inherit resource.calendar.leaves.search.inherit resource.calendar.leaves filter Inherits resource.view_resource_calendar_leaves_search
view_employee_form_leave_inherit hr.employee.leave.form.inherit hr.employee xpath Inherits hr.view_employee_form
view_employee_tree_inherit_leave hr.employee.tree.leave hr.employee xpath Inherits hr.view_employee_tree
view_evaluation_report_graph hr.holidays.graph hr.leave graph New
view_holiday_graph hr.holidays.report_graph hr.leave graph New
view_holiday_list hr.holidays.report_list hr.leave tree New
view_holiday_pivot hr.holidays.report_pivot hr.leave pivot New
view_holiday_status_normal_tree hr.leave.type.normal.tree hr.leave.type tree New
view_holidays_status_filter hr.leave.type.filter hr.leave.type search New
view_hr_holidays_filter hr.holidays.filter hr.leave search New
view_hr_holidays_filter_report hr.holidays.filter hr.leave.report search New
view_hr_holidays_summary_employee hr.holidays.summary.employee.form hr.holidays.summary.employee form New
view_hr_leave_allocation_filter hr.holidays.filter_allocations hr.leave.allocation search New
view_search_hr_holidays_employee_type_report hr.holidays.filter hr.leave.employee.type.report search New
Models touched (25)

New fields (3)
  • absence_of_today Integer
    compute='_compute_leave_count' string='Absence by Today'
  • allocation_to_approve_count Integer
    compute='_compute_leave_count' string='Allocation to Approve'
  • leave_to_approve_count Integer
    compute='_compute_leave_count' string='Time Off to Approve'
Public methods (2)
  • action_open_allocation_department(self)
  • action_open_leave_department(self)

New fields (2)
  • archive_allocation Boolean
    default=True help='Remove employee from existing accrual plans.' args: 'Archive Employee Allocations'
  • cancel_leaves Boolean
    default=True help='Cancel all time off after this date.' args: 'Cancel Future Time Off'
Public methods (1)
  • action_register_departure(self)

New fields (1)
  • current_leave_id Many2one → hr.leave.type
    compute='_compute_current_leave' groups='hr.group_hr_user' string='Current Time Off Type' args: 'hr.leave.type'
Public methods (5)
  • action_time_off_dashboard(self)
  • get_mandatory_days(self, start_date, end_date)
  • get_mandatory_days_data(self, date_start, date_end)
    @api.model
  • get_public_holidays_data(self, date_start, date_end)
    @api.model
  • get_special_days_data(self, date_start, date_end)
    @api.model

New fields (13)
  • allocation_count Float
    compute='_compute_allocation_count' args: 'Total number of days allocated.'
  • allocation_display Char
    compute='_compute_allocation_remaining_display'
  • allocation_remaining_display Char
    compute='_compute_allocation_remaining_display'
  • allocations_count Integer
    compute='_compute_allocation_count' args: 'Total number of allocations'
  • current_leave_state Selection
    compute='_compute_leave_status' selection=[('draft', 'New'), ('confirm', 'Waiting Approval'), ('refuse', 'Refused'), ('validate1', 'Waiting Second Approval'), ('validate', 'Approved'), ('cancel', 'Cancelled')] string='Current Time Off Status'
  • hr_icon_display Selection
    selection_add=[('presence_holiday_absent', 'On leave'), ('presence_holiday_present', 'Present but on leave')]
  • is_absent Boolean
    compute='_compute_leave_status' search='_search_absent_employee' args: 'Absent Today'
  • leave_date_from Date
    compute='_compute_leave_status' args: 'From Date'
  • leave_date_to Date
    compute='_compute_leave_status' args: 'To Date'
  • leave_manager_id Many2one → res.users
    compute='_compute_leave_manager' domain="[('share', '=', False), ('company_ids', 'in', company_id)]" help='Select the user responsible for approving "Time Off" of this employee.\nIf empty, the approval is done by an Administrator or Approver (determined in settings/users).' readonly=False store=True string='Time Off' args: 'res.users'
  • leaves_count Float
    compute='_compute_remaining_leaves' args: 'Number of Time Off'
  • remaining_leaves Float
    compute='_compute_remaining_leaves' help='Total number of paid time off allocated to this employee, change this value to create allocation/time off request. Total based on all the time off types without overriding limit.' string='Remaining Paid Time Off'
  • show_leaves Boolean
    compute='_compute_show_leaves' args: 'Able to see Remaining Time Off'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, values)

New fields (2)
  • leave_id Many2one → hr.leave
    required=True string='Time Off Request' args: 'hr.leave'
  • reason Text
    required=True
Public methods (1)
  • action_cancel_leave(self)

New fields (3)
  • date_from Date
    default=<expr> required=True string='From'
  • emp Many2many → hr.employee
    string='Employee(s)' args: 'hr.employee', 'summary_emp_rel', 'sum_id', 'emp_id'
  • holiday_type Selection
    default='Approved' required=True string='Select Time Off Type' args: [('Approved', 'Approved'), ('Confirmed', 'Confirmed'), ('both', 'Both Approved and Confirmed')]
Public methods (1)
  • print_report(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (59)
  • active Boolean
    default=True readonly=True
  • active_employee Boolean
    related='employee_id.active' string='Employee Active'
  • all_employee_ids Many2many → hr.employee
    compute='_compute_all_employees' compute_sudo=True args: 'hr.employee'
  • attachment_ids One2many → ir.attachment
    string='Attachments' args: 'ir.attachment', 'res_id'
  • can_approve Boolean
    compute='_compute_can_approve' args: 'Can Approve'
  • can_cancel Boolean
    compute='_compute_can_cancel' args: 'Can Cancel'
  • can_reset Boolean
    compute='_compute_can_reset' args: 'Can reset'
  • category_id Many2one → hr.employee.category
    compute='_compute_from_holiday_type' help='Category of Employee' readonly=False store=True string='Employee Tag' args: 'hr.employee.category'
  • color Integer
    related='holiday_status_id.color' args: 'Color'
  • company_id Many2one → res.company
    compute='_compute_company_id' store=True args: 'res.company'
  • date_from Datetime
    compute='_compute_date_from_to' index=True store=True tracking=True args: 'Start Date'
  • date_to Datetime
    compute='_compute_date_from_to' store=True tracking=True args: 'End Date'
  • department_id Many2one → hr.department
    compute='_compute_department_id' readonly=False store=True string='Department' args: 'hr.department'
  • duration_display Char
    compute='_compute_duration_display' help='Field allowing to see the leave request duration in days or hours depending on the leave_type_request_unit' store=True args: 'Requested (Days/Hours)'
  • employee_company_id Many2one
    related='employee_id.company_id' store=True string='Employee Company'
  • employee_id Many2one → hr.employee
    compute='_compute_from_employee_ids' compute_sudo=False domain=<expr> index=True ondelete='restrict' readonly=False store=True string='Employee' tracking=True args: 'hr.employee'
  • employee_ids Many2many → hr.employee
    compute='_compute_from_holiday_type' domain=<expr> groups='hr_holidays.group_hr_holidays_responsible' readonly=True store=True string='Employees' args: 'hr.employee'
  • first_approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validate the time off' readonly=True string='First Approval' args: 'hr.employee'
  • has_mandatory_day Boolean
    compute='_compute_has_mandatory_day'
  • holiday_status_id Many2one → hr.leave.type
    compute='_compute_from_employee_id' domain="[\n ('company_id', 'in', [employee_company_id, False]),\n '|',\n ('requires_allocation', '=', 'no'),\n ('has_valid_allocation', '=', True),\n ]" readonly=False required=True store=True string='Time Off Type' tracking=True args: 'hr.leave.type'
  • holiday_type Selection
    default='employee' help='By Employee: Allocation/Request for individual Employee, By Employee Tag: Allocation/Request for group of employees in category' readonly=False required=True string='Allocation Mode' args: [('employee', 'By Employee'), ('company', 'By Company'), ('department', 'By Department'), ('category', 'By Employee Tag')]
  • is_hatched Boolean
    compute='_compute_is_hatched' args: 'Hatched'
  • is_striked Boolean
    compute='_compute_is_hatched' args: 'Striked'
  • is_user_only_responsible Boolean
    compute='_compute_is_user_only_responsible'
  • last_several_days Boolean
    compute='_compute_last_several_days' args: 'All day'
  • leave_type_increases_duration Boolean
    compute='_compute_leave_type_increases_duration'
  • leave_type_request_unit Selection
    readonly=True related='holiday_status_id.request_unit'
  • leave_type_support_document Boolean
    related='holiday_status_id.support_document'
  • linked_request_ids One2many → hr.leave
    string='Linked Requests' args: 'hr.leave', 'parent_id'
  • manager_id Many2one → hr.employee
    compute='_compute_from_employee_id' readonly=False store=True args: 'hr.employee'
  • meeting_id Many2one → calendar.event
    copy=False string='Meeting' args: 'calendar.event'
  • mode_company_id Many2one → res.company
    compute='_compute_from_holiday_type' readonly=False store=True string='Company Mode' args: 'res.company'
  • multi_employee Boolean
    compute='_compute_from_employee_ids' compute_sudo=False help='Holds whether this allocation concerns more than 1 employee' store=True
  • name Char
    compute='_compute_description' compute_sudo=False copy=False inverse='_inverse_description' search='_search_description' args: 'Description'
  • notes Text
    readonly=False args: 'Reasons'
  • number_of_days Float
    compute='_compute_duration' help='Number of days of the time off request. Used in the calculation.' store=True tracking=True args: 'Duration (Days)'
  • number_of_days_display Float
    compute='_compute_number_of_days_display' help='Number of days of the time off request according to your working schedule. Used for interface.' args: 'Duration in days'
  • number_of_hours Float
    compute='_compute_duration' help='Number of hours of the time off request. Used in the calculation.' store=True tracking=True args: 'Duration (Hours)'
  • number_of_hours_display Float
    compute='_compute_number_of_hours_display' help='Number of hours of the time off request according to your working schedule. Used for interface.' readonly=True args: 'Duration in hours'
  • number_of_hours_text Char
    compute='_compute_number_of_hours_text'
  • parent_id Many2one → hr.leave
    copy=False string='Parent' args: 'hr.leave'
  • private_name Char
    groups='hr_holidays.group_hr_holidays_user' args: 'Time Off Description'
  • report_note Text
    copy=False groups='hr_holidays.group_hr_holidays_manager' args: 'HR Comments'
  • request_date_from Date
    args: 'Request Start Date'
  • request_date_from_period Selection
    default='am' string='Date Period Start' args: [('am', 'Morning'), ('pm', 'Afternoon')]
  • request_date_to Date
    args: 'Request End Date'
  • request_hour_from Selection
    string='Hour from' args: [('0', '12:00 AM'), ('0.5', '12:30 AM'), ('1', '1:00 AM'), ('1.5', '1:30 AM'), ('2', '2:00 AM'), ('2.5', '2:30 AM'), ('3', '3:00 AM'), ('3.5', '3:30 AM'), ('4', '4:00 AM'), ('4.5', '4:30 AM'), ('5', '5:00 AM'), ('5.5', '5:30 AM'), ('6', '6:00 AM'), ('6.5', '6:30 AM'), ('7', '7:00 AM'), ('7.5', '7:30 AM'), ('8', '8:00 AM'), ('8.5', '8:30 AM'), ('9', '9:00 AM'), ('9.5', '9:30 AM'), ('10', '10:00 AM'), ('10.5', '10:30 AM'), ('11', '11:00 AM'), ('11.5', '11:30 AM'), ('12', '12:00 PM'), ('12.5', '12:30 PM'), ('13', '1:00 PM'), ('13.5', '1:30 PM'), ('14', '2:00 PM'), ('14.5', '2:30 PM'), ('15', '3:00 PM'), ('15.5', '3:30 PM'), ('16', '4:00 PM'), ('16.5', '4:30 PM'), ('17', '5:00 PM'), ('17.5', '5:30 PM'), ('18', '6:00 PM'), ('18.5', '6:30 PM'), ('19', '7:00 PM'), ('19.5', '7:30 PM'), ('20', '8:00 PM'), ('20.5', '8:30 PM'), ('21', '9:00 PM'), ('21.5', '9:30 PM'), ('22', '10:00 PM'), ('22.5', '10:30 PM'), ('23', '11:00 PM'), ('23.5', '11:30 PM')]
  • request_hour_to Selection
    string='Hour to' args: [('0', '12:00 AM'), ('0.5', '12:30 AM'), ('1', '1:00 AM'), ('1.5', '1:30 AM'), ('2', '2:00 AM'), ('2.5', '2:30 AM'), ('3', '3:00 AM'), ('3.5', '3:30 AM'), ('4', '4:00 AM'), ('4.5', '4:30 AM'), ('5', '5:00 AM'), ('5.5', '5:30 AM'), ('6', '6:00 AM'), ('6.5', '6:30 AM'), ('7', '7:00 AM'), ('7.5', '7:30 AM'), ('8', '8:00 AM'), ('8.5', '8:30 AM'), ('9', '9:00 AM'), ('9.5', '9:30 AM'), ('10', '10:00 AM'), ('10.5', '10:30 AM'), ('11', '11:00 AM'), ('11.5', '11:30 AM'), ('12', '12:00 PM'), ('12.5', '12:30 PM'), ('13', '1:00 PM'), ('13.5', '1:30 PM'), ('14', '2:00 PM'), ('14.5', '2:30 PM'), ('15', '3:00 PM'), ('15.5', '3:30 PM'), ('16', '4:00 PM'), ('16.5', '4:30 PM'), ('17', '5:00 PM'), ('17.5', '5:30 PM'), ('18', '6:00 PM'), ('18.5', '6:30 PM'), ('19', '7:00 PM'), ('19.5', '7:30 PM'), ('20', '8:00 PM'), ('20.5', '8:30 PM'), ('21', '9:00 PM'), ('21.5', '9:30 PM'), ('22', '10:00 PM'), ('22.5', '10:30 PM'), ('23', '11:00 PM'), ('23.5', '11:30 PM')]
  • request_unit_half Boolean
    compute='_compute_request_unit_half' readonly=False store=True args: 'Half Day'
  • request_unit_hours Boolean
    compute='_compute_request_unit_hours' readonly=False store=True args: 'Custom Hours'
  • resource_calendar_id Many2one → resource.calendar
    compute='_compute_resource_calendar_id' copy=False readonly=False store=True args: 'resource.calendar'
  • second_approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validate the time off with second level (If time off type need second validation)' readonly=True string='Second Approval' args: 'hr.employee'
  • state Selection
    compute='_compute_state' copy=False help=<expr> readonly=False store=True string='Status' tracking=True args: [('draft', 'To Submit'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
  • supported_attachment_ids Many2many → ir.attachment
    compute='_compute_supported_attachment_ids' inverse='_inverse_supported_attachment_ids' string='Attach File' args: 'ir.attachment'
  • supported_attachment_ids_count Integer
    compute='_compute_supported_attachment_ids'
  • tz Selection
    compute='_compute_tz' args: _tz_get
  • tz_mismatch Boolean
    compute='_compute_tz_mismatch'
  • user_id Many2one → res.users
    compute_sudo=True index=True readonly=True related='employee_id.user_id' related_sudo=True store=True string='User' args: 'res.users'
  • validation_type Selection
    readonly=False related='holiday_status_id.leave_validation_type' string='Validation Type'
Public methods (18)
  • action_approve(self, check_state=True)
  • action_cancel(self)
  • action_confirm(self)
  • action_documents(self)
  • action_draft(self)
  • action_open_records(self, leave_ids)
    @api.model
  • action_refuse(self)
  • action_validate(self)
  • activity_update(self)
  • add_follower(self, employee_id)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields_list)
    @api.model
  • get_unusual_days(self, date_from, date_to=None)
    @api.model
  • message_subscribe(self, partner_ids=None, subtype_ids=None)
  • onchange(self, values, field_names, fields_spec)
  • unlink(self)
  • write(self, values)

New fields (27)
  • accrual_plan_id Many2one → hr.leave.accrual.plan
    ondelete='cascade' required=True args: 'hr.leave.accrual.plan', 'Accrual Plan'
  • accrued_gain_time Selection
    related='accrual_plan_id.accrued_gain_time'
  • action_with_unused_accruals Selection
    default='all' required=True string='Carry over' args: [('lost', 'None. Accrued time reset to 0'), ('all', 'All accrued time carried over'), ('maximum', 'Carry over with a maximum')]
  • added_value Float
    default=1 digits=(16, 5) help='The number of hours/days that will be incremented in the specified Time Off Type for every period' required=True args: 'Rate'
  • added_value_type Selection
    compute='_compute_added_value_type' default='day' readonly=False required=True store=True args: [('day', 'Days'), ('hour', 'Hours')]
  • can_modify_value_type Boolean
    compute='_compute_can_modify_value_type'
  • cap_accrued_time Boolean
    default=True args: 'Cap accrued time'
  • first_day Integer
    default=1
  • first_day_display Selection
    compute='_compute_days_display' inverse='_inverse_first_day_display' args: _get_selection_days
  • first_month Selection
    default='jan' args: [('jan', 'January'), ('feb', 'February'), ('mar', 'March'), ('apr', 'April'), ('may', 'May'), ('jun', 'June')]
  • first_month_day Integer
    default=1
  • first_month_day_display Selection
    compute='_compute_days_display' inverse='_inverse_first_month_day_display' args: _get_selection_days
  • frequency Selection
    default='daily' required=True string='Frequency' args: [('hourly', 'Hourly'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('bimonthly', 'Twice a month'), ('monthly', 'Monthly'), ('biyearly', 'Twice a year'), ('yearly', 'Yearly')]
  • maximum_leave Float
    compute='_compute_maximum_leave' digits=(16, 2) help='Choose a cap for this accrual.' readonly=False store=True args: 'Limit to'
  • postpone_max_days Integer
    help='Set a maximum of accruals an allocation keeps at the end of the year.' args: 'Maximum amount of accruals to transfer'
  • second_day Integer
    default=15
  • second_day_display Selection
    compute='_compute_days_display' inverse='_inverse_second_day_display' args: _get_selection_days
  • second_month Selection
    default='jul' args: [('jul', 'July'), ('aug', 'August'), ('sep', 'September'), ('oct', 'October'), ('nov', 'November'), ('dec', 'December')]
  • second_month_day Integer
    default=1
  • second_month_day_display Selection
    compute='_compute_days_display' inverse='_inverse_second_month_day_display' args: _get_selection_days
  • sequence Integer
    compute='_compute_sequence' help='Sequence is generated automatically by start time delta.' store=True string='sequence'
  • start_count Integer
    default='1' help='The accrual starts after a defined period from the allocation start date. This field defines the number of days, months or years after which accrual is used.' args: 'Start after'
  • start_type Selection
    default='day' help='This field defines the unit of time after which the accrual starts.' required=True string=' ' args: [('day', 'Days'), ('month', 'Months'), ('year', 'Years')]
  • week_day Selection
    default='mon' required=True string='Allocation on' args: [('mon', 'Monday'), ('tue', 'Tuesday'), ('wed', 'Wednesday'), ('thu', 'Thursday'), ('fri', 'Friday'), ('sat', 'Saturday'), ('sun', 'Sunday')]
  • yearly_day Integer
    default=1
  • yearly_day_display Selection
    compute='_compute_days_display' inverse='_inverse_yearly_day_display' args: _get_selection_days
  • yearly_month Selection
    default='jan' args: [('jan', 'January'), ('feb', 'February'), ('mar', 'March'), ('apr', 'April'), ('may', 'May'), ('jun', 'June'), ('jul', 'July'), ('aug', 'August'), ('sep', 'September'), ('oct', 'October'), ('nov', 'November'), ('dec', 'December')]
Public methods (0)

No public methods.

New fields (17)
  • accrued_gain_time Selection
    default='end' required=True args: [('start', 'At the start of the accrual period'), ('end', 'At the end of the accrual period')]
  • active Boolean
    default=True
  • added_value_type Selection
    compute='_compute_added_value_type' store=True args: [('day', 'Days'), ('hour', 'Hours')]
  • allocation_ids One2many → hr.leave.allocation
    args: 'hr.leave.allocation', 'accrual_plan_id'
  • carryover_date Selection
    default='year_start' required=True string='Carry-Over Time' args: [('year_start', 'At the start of the year'), ('allocation', 'At the allocation date'), ('other', 'Other')]
  • carryover_day Integer
    default=1
  • carryover_day_display Selection
    compute='_compute_carryover_day_display' inverse='_inverse_carryover_day_display' args: _get_selection_days
  • carryover_month Selection
    default='jan' args: [('jan', 'January'), ('feb', 'February'), ('mar', 'March'), ('apr', 'April'), ('may', 'May'), ('jun', 'June'), ('jul', 'July'), ('aug', 'August'), ('sep', 'September'), ('oct', 'October'), ('nov', 'November'), ('dec', 'December')]
  • company_id Many2one → res.company
    compute='_compute_company_id' readonly=False store='True' string='Company' args: 'res.company'
  • employees_count Integer
    compute='_compute_employee_count' args: 'Employees'
  • is_based_on_worked_time Boolean
    compute='_compute_is_based_on_worked_time' help='If checked, the accrual period will be calculated according to the work days, not calendar days.' readonly=False store=True args: 'Based on worked time'
  • level_count Integer
    compute='_compute_level_count' args: 'Levels'
  • level_ids One2many → hr.leave.accrual.level
    copy=True string='Milestone' args: 'hr.leave.accrual.level', 'accrual_plan_id'
  • name Char
    required=True args: 'Name'
  • show_transition_mode Boolean
    compute='_compute_show_transition_mode'
  • time_off_type_id Many2one → hr.leave.type
    check_company=True help='Specify if this accrual plan can only be used with this Time Off Type.\n Leave empty if this accrual plan can be used with any Time Off Type.' string='Time Off Type' args: 'hr.leave.type'
  • transition_mode Selection
    default='immediately' help="Specify what occurs if a level transition takes place in the middle of a pay period.\n\n 'Immediately' will switch the employee to the new accrual level on the exact date during the ongoing pay period.\n\n 'After this accrual's period' will keep the employee on the same accrual level until the ongoing pay period is complete.\n After it is complete, the new level will take effect when the next pay period begins." required=True string='Milestone Transition' args: [('immediately', 'Immediately'), ('end_of_accrual', "After this accrual's period")]
Public methods (2)
  • action_open_accrual_plan_employees(self)
  • copy(self, default=None)
    @api.returns('self', <expr>)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (38)
  • accrual_plan_id Many2one → hr.leave.accrual.plan
    compute='_compute_from_holiday_status_id' domain="['|', ('time_off_type_id', '=', False), ('time_off_type_id', '=', holiday_status_id)]" readonly=False store=True tracking=True args: 'hr.leave.accrual.plan'
  • active Boolean
    default=True
  • active_employee Boolean
    readonly=True related='employee_id.active' args: 'Active Employee'
  • allocation_type Selection
    default='regular' readonly=True required=True string='Allocation Type' args: [('regular', 'Regular Allocation'), ('accrual', 'Accrual Allocation')]
  • already_accrued Boolean
  • approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validates the allocation' readonly=True string='First Approval' args: 'hr.employee'
  • can_approve Boolean
    compute='_compute_can_approve' args: 'Can Approve'
  • category_id Many2one → hr.employee.category
    compute='_compute_from_holiday_type' readonly=False store=True string='Employee Tag' args: 'hr.employee.category'
  • date_from Date
    copy=False default=fields.Date.context_today index=True required=True tracking=True args: 'Start Date'
  • date_to Date
    copy=False tracking=True args: 'End Date'
  • department_id Many2one → hr.department
    compute='_compute_department_id' readonly=False store=True string='Department' args: 'hr.department'
  • duration_display Char
    compute='_compute_duration_display' help='Field allowing to see the allocation duration in days or hours depending on the type_request_unit' args: 'Allocated (Days/Hours)'
  • employee_company_id Many2one
    readonly=True related='employee_id.company_id' store=True
  • employee_id Many2one → hr.employee
    compute='_compute_from_employee_ids' index=True ondelete='restrict' readonly=False store=True string='Employee' tracking=True args: 'hr.employee'
  • employee_ids Many2many → hr.employee
    compute='_compute_from_holiday_type' readonly=False store=True string='Employees' args: 'hr.employee'
  • has_accrual_plan Boolean
    compute='_compute_has_accrual_plan' string='Accrual Plan Available'
  • holiday_status_id Many2one → hr.leave.type
    compute='_compute_holiday_status_id' default=_default_holiday_status_id domain=_domain_holiday_status_id readonly=False required=True store=True string='Time Off Type' args: 'hr.leave.type'
  • holiday_type Selection
    default='employee' help='Allow to create requests in batchs:\n- By Employee: for a specific employee\n- By Company: all employees of the specified company\n- By Department: all employees of the specified department\n- By Employee Tag: all employees of the specific employee group category' readonly=False required=True string='Allocation Mode' args: [('employee', 'By Employee'), ('company', 'By Company'), ('department', 'By Department'), ('category', 'By Employee Tag')]
  • is_officer Boolean
    compute='_compute_is_officer'
  • lastcall Date
    readonly=True args: 'Date of the last accrual allocation'
  • leaves_taken Float
    compute='_compute_leaves' string='Time off Taken'
  • linked_request_ids One2many → hr.leave.allocation
    string='Linked Requests' args: 'hr.leave.allocation', 'parent_id'
  • manager_id Many2one → hr.employee
    compute='_compute_manager_id' store=True string='Manager' args: 'hr.employee'
  • max_leaves Float
    compute='_compute_leaves'
  • mode_company_id Many2one → res.company
    compute='_compute_from_holiday_type' readonly=False store=True string='Company Mode' args: 'res.company'
  • multi_employee Boolean
    compute='_compute_from_employee_ids' help='Holds whether this allocation concerns more than 1 employee' store=True
  • name Char
    compute='_compute_description' compute_sudo=False inverse='_inverse_description' search='_search_description' string='Description'
  • name_validity Char
    compute='_compute_description_validity' args: 'Description with validity'
  • nextcall Date
    default=False readonly=True args: 'Date of the next accrual allocation'
  • notes Text
    readonly=False args: 'Reasons'
  • number_of_days Float
    compute='_compute_from_holiday_status_id' default=1 help='Duration in days. Reference field to use when necessary.' readonly=False store=True tracking=True args: 'Number of Days'
  • number_of_days_display Float
    compute='_compute_number_of_days_display' help='For an Accrual Allocation, this field contains the theorical amount of time given to the employee, due to a previous start date, on the first run of the plan. This can be manually edited.' args: 'Duration (days)'
  • number_of_hours_display Float
    compute='_compute_number_of_hours_display' help='For an Accrual Allocation, this field contains the theorical amount of time given to the employee, due to a previous start date, on the first run of the plan. This can be manually edited.' args: 'Duration (hours)'
  • parent_id Many2one → hr.leave.allocation
    string='Parent' args: 'hr.leave.allocation'
  • private_name Char
    groups='hr_holidays.group_hr_holidays_user' args: 'Allocation Description'
  • state Selection
    copy=False default='confirm' help="The status is set to 'To Submit', when an allocation request is created.\nThe status is 'To Approve', when an allocation request is confirmed by user.\nThe status is 'Refused', when an allocation request is refused by manager.\nThe status is 'Approved', when an allocation request is approved by manager." readonly=True string='Status' tracking=True args: [('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate', 'Approved')]
  • type_request_unit Selection
    compute='_compute_type_request_unit' args: [('hour', 'Hours'), ('half_day', 'Half Day'), ('day', 'Day')]
  • validation_type Selection
    readonly=True related='holiday_status_id.allocation_validation_type' string='Validation Type'
Public methods (8)
  • action_refuse(self)
  • action_validate(self)
  • activity_update(self)
  • add_follower(self, employee_id)
  • create(self, vals_list)
    @api.model_create_multi
    Override to avoid automatic logging of creation
  • message_subscribe(self, partner_ids=None, subtype_ids=None)
  • onchange(self, values, field_names, fields_spec)
  • write(self, values)

New fields (10)
  • active_employee Boolean
    readonly=True
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • date_from Datetime
    readonly=True args: 'Start Date'
  • date_to Datetime
    readonly=True args: 'End Date'
  • department_id Many2one → hr.department
    readonly=True string='Department' args: 'hr.department'
  • employee_id Many2one → hr.employee
    readonly=True string='Employee' args: 'hr.employee'
  • holiday_status Selection
    args: [('taken', 'Taken'), ('left', 'Left'), ('planned', 'Planned')]
  • leave_type Many2one → hr.leave.type
    readonly=True string='Time Off Type' args: 'hr.leave.type'
  • number_of_days Float
    group_operator='sum' readonly=True args: 'Number of Days'
  • state Selection
    readonly=True string='Status' args: [('draft', 'To Submit'), ('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
Public methods (2)
  • action_time_off_analysis(self)
    @api.model
  • init(self)

New fields (7)
  • color Integer
    default=<expr>
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company'
  • department_ids Many2many → hr.department
    string='Departments' args: 'hr.department'
  • end_date Date
    required=True
  • name Char
    required=True
  • resource_calendar_id Many2one → resource.calendar
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" args: 'resource.calendar', 'Working Hours'
  • start_date Date
    required=True
Public methods (0)

No public methods.

New fields (13)
  • category_id Many2one → hr.employee.category
    readonly=True string='Employee Tag' args: 'hr.employee.category'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • date_from Datetime
    readonly=True args: 'Start Date'
  • date_to Datetime
    readonly=True args: 'End Date'
  • department_id Many2one → hr.department
    readonly=True string='Department' args: 'hr.department'
  • employee_id Many2one → hr.employee
    readonly=True string='Employee' args: 'hr.employee'
  • holiday_status_id Many2one → hr.leave.type
    readonly=True string='Time Off Type' args: 'hr.leave.type'
  • holiday_type Selection
    readonly=True string='Allocation Mode' args: [('employee', 'By Employee'), ('category', 'By Employee Tag')]
  • leave_id Many2one → hr.leave
    readonly=True string='Time Off Request' args: 'hr.leave'
  • leave_type Selection
    readonly=True string='Request Type' args: [('allocation', 'Allocation'), ('request', 'Time Off')]
  • name Char
    readonly=True args: 'Description'
  • number_of_days Float
    readonly=True args: 'Number of Days'
  • state Selection
    readonly=True string='Status' args: [('draft', 'To Submit'), ('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
Public methods (2)
  • action_open_record(self)
  • init(self)

New fields (13)
  • company_id Many2one → res.company
    readonly=True args: 'res.company'
  • department_id Many2one → hr.department
    readonly=True args: 'hr.department'
  • duration Float
    readonly=True string='Duration'
  • employee_id Many2one → hr.employee
    readonly=True args: 'hr.employee'
  • is_absent Boolean
    related='employee_id.is_absent'
  • is_hatched Boolean
    readonly=True args: 'Hatched'
  • is_striked Boolean
    readonly=True args: 'Striked'
  • job_id Many2one → hr.job
    readonly=True args: 'hr.job'
  • name Char
    readonly=True string='Name'
  • start_datetime Datetime
    readonly=True string='From'
  • state Selection
    readonly=True args: [('draft', 'To Submit'), ('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
  • stop_datetime Datetime
    readonly=True string='To'
  • tz Selection
    readonly=True string='Timezone' args: _tz_get
Public methods (2)
  • get_unusual_days(self, date_from, date_to=None)
    @api.model
  • init(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (28)
  • accrual_count Float
    compute='_compute_accrual_count' string='Accruals count'
  • accruals_ids One2many → hr.leave.accrual.plan
    args: 'hr.leave.accrual.plan', 'time_off_type_id'
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the time off type without removing it.' args: 'Active'
  • allocation_count Integer
    compute='_compute_allocation_count' string='Allocations'
  • allocation_notif_subtype_id Many2one → mail.message.subtype
    default=<expr> string='Allocation Notification Subtype' args: 'mail.message.subtype'
  • allocation_validation_type Selection
    compute='_compute_allocation_validation_type' default='no' help="Select the level of approval needed in case of request by employee\n - No validation needed: The employee's request is automatically approved.\n - Approved by Time Off Officer: The employee's request need to be manually approved by the Time Off Officer." readonly=False store=True string='Approval' args: [('officer', 'Approved by Time Off Officer'), ('no', 'No validation needed')]
  • allows_negative Boolean
    help='If checked, users request can exceed the allocated days and balance can go in negative.' string='Allow Negative Cap'
  • color Integer
    help='The color selected here will be used in every screen with the time off type.' string='Color'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • create_calendar_meeting Boolean
    default=True string='Display Time Off in Calendar'
  • employee_requests Selection
    default='no' help='Extra Days Requests Allowed: User can request an allocation for himself.\n\n Not Allowed: User cannot request an allocation.' required=True string='Employee Requests' args: [('yes', 'Extra Days Requests Allowed'), ('no', 'Not Allowed')]
  • group_days_leave Float
    compute='_compute_group_days_leave' string='Group Time Off'
  • has_valid_allocation Boolean
    compute='_compute_valid' help='This indicates if it is still possible to use this type of leave' search='_search_valid'
  • icon_id Many2one → ir.attachment
    domain="[('res_model', '=', 'hr.leave.type'), ('res_field', '=', 'icon_id')]" string='Cover Image' args: 'ir.attachment'
  • leave_notif_subtype_id Many2one → mail.message.subtype
    default=<expr> string='Time Off Notification Subtype' args: 'mail.message.subtype'
  • leave_validation_type Selection
    default='hr' string='Time Off Validation' args: [('no_validation', 'No Validation'), ('hr', 'By Time Off Officer'), ('manager', "By Employee's Approver"), ('both', "By Employee's Approver and Time Off Officer")]
  • leaves_taken Float
    compute='_compute_leaves' help='This value is given by the sum of all time off requests with a negative value.' string='Time off Already Taken'
  • max_allowed_negative Integer
    help='Define the maximum level of negative days this kind of time off can reach. Value must be at least 1.' string='Amount in Negative'
  • max_leaves Float
    compute='_compute_leaves' help='This value is given by the sum of all time off requests with a positive value.' search='_search_max_leaves' string='Maximum Allowed'
  • name Char
    required=True translate=True args: 'Time Off Type'
  • request_unit Selection
    default='day' required=True string='Take Time Off in' args: [('day', 'Day'), ('half_day', 'Half Day'), ('hour', 'Hours')]
  • requires_allocation Selection
    default='yes' help='Yes: Time off requests need to have a valid allocation.\n\n No Limit: Time Off requests can be taken without any prior allocation.' required=True string='Requires allocation' args: [('yes', 'Yes'), ('no', 'No Limit')]
  • responsible_ids Many2many → res.users
    auto_join=True domain=<expr> help='Choose the Time Off Officers who will be notified to approve allocation or Time Off Request. If empty, nobody will be notified' string='Notified Time Off Officer' args: 'res.users', 'hr_leave_type_res_users_rel', 'hr_leave_type_id', 'res_users_id'
  • sequence Integer
    default=100 help='The type with the smallest sequence is the default value in time off request'
  • support_document Boolean
    string='Supporting Document'
  • time_type Selection
    default='leave' help="The distinction between working time (ex. Attendance) and absence (ex. Training) will be used in the computation of Accrual's plan rate." string='Kind of Time Off' args: [('other', 'Worked Time'), ('leave', 'Absence')]
  • unpaid Boolean
    default=False args: 'Is Unpaid'
  • virtual_remaining_leaves Float
    compute='_compute_leaves' help='Maximum Time Off Allowed - Time Off Already Taken - Time Off Waiting Approval' search='_search_virtual_remaining_leaves' string='Virtual Remaining Time Off'
Public methods (8)
  • action_see_accrual_plans(self)
  • action_see_days_allocated(self)
  • action_see_group_leaves(self)
  • check_allocation_requirement_edit_validity(self)
    @api.constrains('requires_allocation')
  • get_allocation_data(self, employees, target_date=None)
  • get_allocation_data_request(self, target_date=None)
    @api.model
  • has_accrual_allocation(self)
    @api.model
  • requested_display_name(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • mail_partner_format(self, fields=None)
    Override to add the current leave status.

New fields (9)
  • allocation_count Float
    related='employee_id.allocation_count'
  • allocation_display Char
    related='employee_id.allocation_display'
  • allocation_remaining_display Char
    related='employee_id.allocation_remaining_display'
  • current_leave_state Selection
    related='employee_id.current_leave_state'
  • hr_icon_display Selection
    related='employee_id.hr_icon_display'
  • is_absent Boolean
    related='employee_id.is_absent'
  • leave_date_to Date
    related='employee_id.leave_date_to'
  • leave_manager_id Many2one
    related='employee_id.leave_manager_id'
  • show_leaves Boolean
    related='employee_id.show_leaves'
Public methods (2)
  • SELF_READABLE_FIELDS(self)
    @property
  • create(self, vals_list)
    @api.model_create_multi

New fields (1)
  • associated_leaves_count Integer
    compute='_compute_associated_leaves_count' args: 'Time Off Count'
Public methods (0)

No public methods.

New fields (1)
  • holiday_id Many2one → hr.leave
    string='Time Off Request' args: 'hr.leave'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, vals)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/16.0/hr_holidays
VERSION
VERSION 1.6
CATEGORY
CATEGORYHuman Resources/Time Off
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Goffin Simon, Aaron Bohy, Jeremy Kersten, GitHub, Damien Bouvy, Wolfgang Taferner, Yannick Tivisse, Adrien Dieudonne, Christophe Monniez, Jorge Pinna Puissant, Lucas Perais, Alexandre Kühn, Xavier-Do, Romeo Fragomeli, Victor Feyens, Sébastien Theys, alt-odoo, Julien Mougenot, Samuel Degueldre, Achraf (abz), Ivan Yelizariev, Prakash Prajapati, Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, Pierre Paridans, William Braeckman, Kevin Baptiste, Philippe Wauthy, Xavier BOL (xbo), sofiagvaladze, Víctor Martínez, Florian Damhaut, Merlin (megu), MerlinGuillaume, tranngocson1996, mafo-odoo, Audric Onockx (auon), Agustín Castro Bugallo, Yolann Sabaux, Abdelouahab (abla), Aurelien van Delft (avd), Dossogne Bertrand, niyasraphy, Thomas Lefebvre (thle), Gaetan Vanden Bergh (gavb), Louis Wicket (wil), tsm-odoo, Yash Vaishnav, Tommy (tong), Thomas Becquevort (thbe), Tom De Caluwé, Malay Khamar, duongnguyen, Jurgen (jugj), Levi Siuzdak (sile), Bruno Boi, Krina Oza, Kamlesh Pathekar, Nguyen Viet Phuong, Michael (mcm), Cedric Prieels (cpr), Simon Goffaux (sigo), prye-odoo, Kartik Chavda, Brieuc-brd, Daniel Duque, fkantelberg, Leonardo Pavan Rocha, Dawn Hwang, Andrzej(pian), stefanorigano (SRI), ravb-odoo, Dang Van Loc, Mattis Megevand, tronghung0398, dasz, Mélanie, Youssef Bashandy, bary, Flotchet, Tanguy Quéguineur, Martin Trigaux (mat), xlu-odoo, asno-odoo, rmun-odoo, rame-odoo, Hadi (alha), Kacper Gasior, jich-odoo, Rob Coekaerts, Abdelrahman Mahmoud (amah), Andrea Gidalti, Sanchit Gupta, sapp-odoo, Sina Chaichi Maleki (cmsi), mash
WEBSITE
WEBSITEhttps://www.odoo.com/app/time-off
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:47
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - hr
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - resource
    - calendar
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage time off requests and allocations
=====================================

This application controls the time off schedule of your company. It allows employees to request time off. Then, managers can review requests for time off and approve or reject them. This way you can control the overall time off planning for the company or department.

You can configure several kinds of time off (sickness, paid days, ...) and allocate time off to an employee or department quickly using time off allocation. An employee can also make a request for more days off by making a new time off allocation. It will increase the total of available days for that time off type (if the request is accepted).

You can keep track of time off in different ways by following reports:

* Time Off Summary
* Time Off by Department
* Time Off Analysis

A synchronization with an internal agenda (Meetings of the CRM module) is also possible in order to automatically create a meeting when a time off request is accepted by setting up a type of meeting in time off Type.

Code Analysis

Views touched (64)
XML IDNameModelTypeStatus
edit_holiday_status_form hr.leave.type.form hr.leave.type form New
hr_accrual_level_view_form hr.leave.accrual.level.form hr.leave.accrual.level form New
hr_accrual_plan_view_form hr.leave.accrual.plan.form hr.leave.accrual.plan form New
hr_accrual_plan_view_tree hr.leave.accrual.plan.tree hr.leave.accrual.plan tree New
hr_department_view_kanban hr.department.kanban.inherit hr.department data Inherits hr.hr_department_view_kanban
hr_departure_wizard_view_form hr.departure.wizard.view.form.extend3 hr.departure.wizard xpath Inherits hr.hr_departure_wizard_view_form
hr_employee_public_form_view_inherit hr.employee.public.leave.form.inherit hr.employee.public xpath Inherits hr.hr_employee_public_view_form
hr_employee_view_search hr.employee.search.view.inherit hr.employee xpath Inherits hr.view_employee_filter
hr_holiday_status_view_kanban hr.leave.type.kanban hr.leave.type kanban New
hr_holidays_cancel_leave_form hr.holidays.cancel.leave form New
hr_kanban_view_employees_kanban hr.employee.kanban.leaves.status hr.employee xpath Inherits hr.hr_kanban_view_employees
hr_kanban_view_public_employees_kanban hr.employee.public.kanban.leaves.status hr.employee.public xpath Inherits hr.hr_employee_public_view_kanban
hr_leave_allocation_view_activity hr.leave.allocation.view.activity hr.leave.allocation activity New
hr_leave_allocation_view_form hr.leave.allocation.view.form hr.leave.allocation form New
hr_leave_allocation_view_form_dashboard hr.leave.view.form.dashboard hr.leave.allocation xpath Inherits hr_holidays.hr_leave_allocation_view_form
hr_leave_allocation_view_form_manager hr.leave.allocation.view.form.manager hr.leave.allocation xpath Inherits hr_holidays.hr_leave_allocation_view_form
hr_leave_allocation_view_form_manager_dashboard hr.leave.allocation.view.form.manager.dashboard hr.leave.allocation xpath Inherits hr_holidays.hr_leave_allocation_view_form_manager
hr_leave_allocation_view_kanban hr.leave.allocation.view.kanban hr.leave.allocation kanban New
hr_leave_allocation_view_search_manager hr.leave.allocation.view.search.my hr.leave.allocation xpath Inherits view_hr_leave_allocation_filter
hr_leave_allocation_view_search_my hr.leave.allocation.view.search.my hr.leave.allocation xpath Inherits view_hr_leave_allocation_filter
hr_leave_allocation_view_tree hr.leave.allocation.view.tree hr.leave.allocation tree New
hr_leave_allocation_view_tree_my hr.leave.allocation.view.tree.my hr.leave.allocation xpath Inherits hr_leave_allocation_view_tree
hr_leave_employee_type_report hr.leave.employee.type.report.view.pivot hr.leave.employee.type.report pivot New
hr_leave_employee_view_dashboard hr.leave.view.dashboard hr.leave calendar New
hr_leave_report_calendar_view hr.leave.report.calendar.view hr.leave.report.calendar calendar New
hr_leave_report_calendar_view_form hr.leave.report.calendar.view.form hr.leave.report.calendar form New
hr_leave_report_calendar_view_search hr.leave.report.calendar.view.search hr.leave.report.calendar search New
hr_leave_report_pivot report.hr.holidays.report.leave_all.pivot hr.leave.report pivot New
hr_leave_report_tree report.hr.holidays.report.leave_all.tree hr.leave.report tree New
hr_leave_report_view_form hr.leave.report.view.form hr.leave.report form New
hr_leave_stress_day_view_form hr.leave.stress.day form New
hr_leave_stress_day_view_list hr.leave.stress.day tree New
hr_leave_stress_day_view_search hr.leave.stress.day search New
hr_leave_view_activity hr.leave.view.activity hr.leave activity New
hr_leave_view_calendar hr.leave.view.calendar hr.leave calendar New
hr_leave_view_dashboard hr.leave.view.dashboard hr.leave calendar New
hr_leave_view_form hr.leave.view.form hr.leave form New
hr_leave_view_form_dashboard hr.leave.view.form.dashboard hr.leave xpath Inherits hr_holidays.hr_leave_view_form
hr_leave_view_form_dashboard_new_time_off hr.leave.view.form.dashboard.new.time.off hr.leave xpath Inherits hr_holidays.hr_leave_view_form_dashboard
hr_leave_view_form_manager hr.leave.view.form.manager hr.leave xpath Inherits hr_leave_view_form
hr_leave_view_kanban hr.leave.view.kanban hr.leave kanban New
hr_leave_view_kanban_approve_department hr.leave.view.kanban.approve.department hr.leave xpath Inherits hr_leave_view_kanban
hr_leave_view_search_manager hr.holidays.view.search.manager hr.leave xpath Inherits view_hr_holidays_filter
hr_leave_view_search_my hr.holidays.view.search.my hr.leave xpath Inherits view_hr_holidays_filter
hr_leave_view_tree hr.holidays.view.tree hr.leave tree New
hr_leave_view_tree_my hr.holidays.view.tree hr.leave xpath Inherits hr_leave_view_tree
report_holidayssummary report_holidayssummary ir.ui.view qweb New
res_users_view_form hr.user.preferences.view.form.leave.inherit res.users xpath Inherits hr.res_users_view_form_profile
resource_calendar_form_inherit resource.calendar.form.inherit resource.calendar xpath Inherits resource.resource_calendar_form
resource_calendar_leave_form_inherit resource.calendar.leaves.form.inherit resource.calendar.leaves field Inherits resource.resource_calendar_leave_form
resource_calendar_leaves_tree_inherit resource.calendar.leaves.tree.inherit resource.calendar.leaves xpath Inherits resource.resource_calendar_leave_tree
resource_calendar_leaves_view_search_inherit resource.calendar.leaves.search.inherit resource.calendar.leaves filter Inherits resource.view_resource_calendar_leaves_search
view_employee_form_leave_inherit hr.employee.leave.form.inherit hr.employee xpath Inherits hr.view_employee_form
view_employee_tree_inherit_leave hr.employee.tree.leave hr.employee xpath Inherits hr.view_employee_tree
view_evaluation_report_graph hr.holidays.graph hr.leave graph New
view_holiday_graph hr.holidays.report_graph hr.leave graph New
view_holiday_pivot hr.holidays.report_pivot hr.leave pivot New
view_holiday_status_normal_tree hr.leave.type.normal.tree hr.leave.type tree New
view_holidays_status_filter hr.leave.type.filter hr.leave.type search New
view_hr_holidays_filter hr.holidays.filter hr.leave search New
view_hr_holidays_filter_report hr.holidays.filter hr.leave.report search New
view_hr_holidays_summary_employee hr.holidays.summary.employee.form hr.holidays.summary.employee form New
view_hr_leave_allocation_filter hr.holidays.filter_allocations hr.leave.allocation search New
view_search_hr_holidays_employee_type_report hr.holidays.filter hr.leave.employee.type.report search New
Models touched (24)

New fields (3)
  • absence_of_today Integer
    compute='_compute_leave_count' string='Absence by Today'
  • allocation_to_approve_count Integer
    compute='_compute_leave_count' string='Allocation to Approve'
  • leave_to_approve_count Integer
    compute='_compute_leave_count' string='Time Off to Approve'
Public methods (2)
  • action_open_allocation_department(self)
  • action_open_leave_department(self)

New fields (2)
  • archive_allocation Boolean
    default=True help='Remove employee from existing accrual plans.' args: 'Archive Employee Allocations'
  • cancel_leaves Boolean
    default=True help='Cancel all time off after this date.' args: 'Cancel Future Leaves'
Public methods (1)
  • action_register_departure(self)

New fields (1)
  • current_leave_id Many2one → hr.leave.type
    compute='_compute_current_leave' groups='hr.group_hr_user' string='Current Time Off Type' args: 'hr.leave.type'
Public methods (5)
  • action_time_off_dashboard(self)
  • get_public_holidays_data(self, date_start, date_end)
    @api.model
  • get_special_days_data(self, date_start, date_end)
    @api.model
  • get_stress_days(self, start_date, end_date)
  • get_stress_days_data(self, date_start, date_end)
    @api.model

New fields (13)
  • allocation_count Float
    compute='_compute_allocation_count' args: 'Total number of days allocated.'
  • allocation_display Char
    compute='_compute_allocation_count'
  • allocation_remaining_display Char
    compute='_compute_allocation_remaining_display'
  • allocations_count Integer
    compute='_compute_allocation_count' args: 'Total number of allocations'
  • current_leave_state Selection
    compute='_compute_leave_status' selection=[('draft', 'New'), ('confirm', 'Waiting Approval'), ('refuse', 'Refused'), ('validate1', 'Waiting Second Approval'), ('validate', 'Approved'), ('cancel', 'Cancelled')] string='Current Time Off Status'
  • hr_icon_display Selection
    selection_add=[('presence_holiday_absent', 'On leave'), ('presence_holiday_present', 'Present but on leave')]
  • is_absent Boolean
    compute='_compute_leave_status' search='_search_absent_employee' args: 'Absent Today'
  • leave_date_from Date
    compute='_compute_leave_status' args: 'From Date'
  • leave_date_to Date
    compute='_compute_leave_status' args: 'To Date'
  • leave_manager_id Many2one → res.users
    compute='_compute_leave_manager' domain="[('share', '=', False), ('company_ids', 'in', company_id)]" help='Select the user responsible for approving "Time Off" of this employee.\nIf empty, the approval is done by an Administrator or Approver (determined in settings/users).' readonly=False store=True string='Time Off' args: 'res.users'
  • leaves_count Float
    compute='_compute_remaining_leaves' args: 'Number of Time Off'
  • remaining_leaves Float
    compute='_compute_remaining_leaves' help='Total number of paid time off allocated to this employee, change this value to create allocation/time off request. Total based on all the time off types without overriding limit.' string='Remaining Paid Time Off'
  • show_leaves Boolean
    compute='_compute_show_leaves' args: 'Able to see Remaining Time Off'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, values)

New fields (2)
  • leave_id Many2one → hr.leave
    required=True args: 'hr.leave'
  • reason Text
    required=True
Public methods (1)
  • action_cancel_leave(self)

New fields (3)
  • date_from Date
    default=<expr> required=True string='From'
  • emp Many2many → hr.employee
    string='Employee(s)' args: 'hr.employee', 'summary_emp_rel', 'sum_id', 'emp_id'
  • holiday_type Selection
    default='Approved' required=True string='Select Time Off Type' args: [('Approved', 'Approved'), ('Confirmed', 'Confirmed'), ('both', 'Both Approved and Confirmed')]
Public methods (1)
  • print_report(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (54)
  • active Boolean
    default=True readonly=True
  • active_employee Boolean
    readonly=True related='employee_id.active' string='Employee Active'
  • all_employee_ids Many2many → hr.employee
    compute='_compute_all_employees' compute_sudo=True args: 'hr.employee'
  • attachment_ids One2many → ir.attachment
    string='Attachments' args: 'ir.attachment', 'res_id'
  • can_approve Boolean
    compute='_compute_can_approve' args: 'Can Approve'
  • can_cancel Boolean
    compute='_compute_can_cancel' args: 'Can Cancel'
  • can_reset Boolean
    compute='_compute_can_reset' args: 'Can reset'
  • category_id Many2one → hr.employee.category
    compute='_compute_from_holiday_type' help='Category of Employee' states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} store=True string='Employee Tag' args: 'hr.employee.category'
  • color Integer
    related='holiday_status_id.color' args: 'Color'
  • date_from Datetime
    compute='_compute_date_from_to' copy=False index=True readonly=False required=True states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True tracking=True args: 'Start Date'
  • date_to Datetime
    compute='_compute_date_from_to' copy=False readonly=False required=True states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True tracking=True args: 'End Date'
  • department_id Many2one → hr.department
    compute='_compute_department_id' readonly=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Department' args: 'hr.department'
  • duration_display Char
    compute='_compute_duration_display' help='Field allowing to see the leave request duration in days or hours depending on the leave_type_request_unit' store=True args: 'Requested (Days/Hours)'
  • employee_company_id Many2one
    readonly=True related='employee_id.company_id' store=True
  • employee_id Many2one → hr.employee
    compute='_compute_from_employee_ids' compute_sudo=False index=True ondelete='restrict' readonly=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Employee' tracking=True args: 'hr.employee'
  • employee_ids Many2many → hr.employee
    compute='_compute_from_holiday_type' groups='hr_holidays.group_hr_holidays_user' readonly=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Employees' args: 'hr.employee'
  • first_approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validate the time off' readonly=True string='First Approval' args: 'hr.employee'
  • has_stress_day Boolean
    compute='_compute_has_stress_day'
  • holiday_allocation_id Many2one → hr.leave.allocation
    compute='_compute_from_holiday_status_id' readonly=False store=True string='Allocation' args: 'hr.leave.allocation'
  • holiday_status_id Many2one → hr.leave.type
    compute='_compute_from_employee_id' domain="[('company_id', '=?', employee_company_id), '|', ('requires_allocation', '=', 'no'), ('has_valid_allocation', '=', True)]" readonly=False required=True states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Time Off Type' tracking=True args: 'hr.leave.type'
  • holiday_type Selection
    default='employee' help='By Employee: Allocation/Request for individual Employee, By Employee Tag: Allocation/Request for group of employees in category' readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Allocation Mode' args: [('employee', 'By Employee'), ('company', 'By Company'), ('department', 'By Department'), ('category', 'By Employee Tag')]
  • is_hatched Boolean
    compute='_compute_is_hatched' args: 'Hatched'
  • is_striked Boolean
    compute='_compute_is_hatched' args: 'Striked'
  • leave_type_request_unit Selection
    readonly=True related='holiday_status_id.request_unit'
  • leave_type_support_document Boolean
    related='holiday_status_id.support_document'
  • linked_request_ids One2many → hr.leave
    string='Linked Requests' args: 'hr.leave', 'parent_id'
  • manager_id Many2one → hr.employee
    compute='_compute_from_employee_id' readonly=False store=True args: 'hr.employee'
  • meeting_id Many2one → calendar.event
    copy=False string='Meeting' args: 'calendar.event'
  • mode_company_id Many2one → res.company
    compute='_compute_from_holiday_type' states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} store=True string='Company Mode' args: 'res.company'
  • multi_employee Boolean
    compute='_compute_from_employee_ids' compute_sudo=False help='Holds whether this allocation concerns more than 1 employee' store=True
  • name Char
    compute='_compute_description' compute_sudo=False inverse='_inverse_description' search='_search_description' args: 'Description'
  • notes Text
    readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'Reasons'
  • number_of_days Float
    compute='_compute_number_of_days' copy=False help='Number of days of the time off request. Used in the calculation. To manually correct the duration, use this field.' readonly=False store=True tracking=True args: 'Duration (Days)'
  • number_of_days_display Float
    compute='_compute_number_of_days_display' help='Number of days of the time off request according to your working schedule. Used for interface.' readonly=True args: 'Duration in days'
  • number_of_hours_display Float
    compute='_compute_number_of_hours_display' help='Number of hours of the time off request according to your working schedule. Used for interface.' readonly=True args: 'Duration in hours'
  • number_of_hours_text Char
    compute='_compute_number_of_hours_text'
  • parent_id Many2one → hr.leave
    copy=False string='Parent' args: 'hr.leave'
  • private_name Char
    groups='hr_holidays.group_hr_holidays_user' args: 'Time Off Description'
  • report_note Text
    copy=False groups='hr_holidays.group_hr_holidays_manager' args: 'HR Comments'
  • request_date_from Date
    args: 'Request Start Date'
  • request_date_from_period Selection
    default='am' string='Date Period Start' args: [('am', 'Morning'), ('pm', 'Afternoon')]
  • request_date_to Date
    args: 'Request End Date'
  • request_hour_from Selection
    string='Hour from' args: [('0', '12:00 AM'), ('0.5', '12:30 AM'), ('1', '1:00 AM'), ('1.5', '1:30 AM'), ('2', '2:00 AM'), ('2.5', '2:30 AM'), ('3', '3:00 AM'), ('3.5', '3:30 AM'), ('4', '4:00 AM'), ('4.5', '4:30 AM'), ('5', '5:00 AM'), ('5.5', '5:30 AM'), ('6', '6:00 AM'), ('6.5', '6:30 AM'), ('7', '7:00 AM'), ('7.5', '7:30 AM'), ('8', '8:00 AM'), ('8.5', '8:30 AM'), ('9', '9:00 AM'), ('9.5', '9:30 AM'), ('10', '10:00 AM'), ('10.5', '10:30 AM'), ('11', '11:00 AM'), ('11.5', '11:30 AM'), ('12', '12:00 PM'), ('12.5', '12:30 PM'), ('13', '1:00 PM'), ('13.5', '1:30 PM'), ('14', '2:00 PM'), ('14.5', '2:30 PM'), ('15', '3:00 PM'), ('15.5', '3:30 PM'), ('16', '4:00 PM'), ('16.5', '4:30 PM'), ('17', '5:00 PM'), ('17.5', '5:30 PM'), ('18', '6:00 PM'), ('18.5', '6:30 PM'), ('19', '7:00 PM'), ('19.5', '7:30 PM'), ('20', '8:00 PM'), ('20.5', '8:30 PM'), ('21', '9:00 PM'), ('21.5', '9:30 PM'), ('22', '10:00 PM'), ('22.5', '10:30 PM'), ('23', '11:00 PM'), ('23.5', '11:30 PM')]
  • request_hour_to Selection
    string='Hour to' args: [('0', '12:00 AM'), ('0.5', '12:30 AM'), ('1', '1:00 AM'), ('1.5', '1:30 AM'), ('2', '2:00 AM'), ('2.5', '2:30 AM'), ('3', '3:00 AM'), ('3.5', '3:30 AM'), ('4', '4:00 AM'), ('4.5', '4:30 AM'), ('5', '5:00 AM'), ('5.5', '5:30 AM'), ('6', '6:00 AM'), ('6.5', '6:30 AM'), ('7', '7:00 AM'), ('7.5', '7:30 AM'), ('8', '8:00 AM'), ('8.5', '8:30 AM'), ('9', '9:00 AM'), ('9.5', '9:30 AM'), ('10', '10:00 AM'), ('10.5', '10:30 AM'), ('11', '11:00 AM'), ('11.5', '11:30 AM'), ('12', '12:00 PM'), ('12.5', '12:30 PM'), ('13', '1:00 PM'), ('13.5', '1:30 PM'), ('14', '2:00 PM'), ('14.5', '2:30 PM'), ('15', '3:00 PM'), ('15.5', '3:30 PM'), ('16', '4:00 PM'), ('16.5', '4:30 PM'), ('17', '5:00 PM'), ('17.5', '5:30 PM'), ('18', '6:00 PM'), ('18.5', '6:30 PM'), ('19', '7:00 PM'), ('19.5', '7:30 PM'), ('20', '8:00 PM'), ('20.5', '8:30 PM'), ('21', '9:00 PM'), ('21.5', '9:30 PM'), ('22', '10:00 PM'), ('22.5', '10:30 PM'), ('23', '11:00 PM'), ('23.5', '11:30 PM')]
  • request_unit_half Boolean
    compute='_compute_request_unit_half' readonly=False store=True args: 'Half Day'
  • request_unit_hours Boolean
    compute='_compute_request_unit_hours' readonly=False store=True args: 'Custom Hours'
  • second_approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validate the time off with second level (If time off type need second validation)' readonly=True string='Second Approval' args: 'hr.employee'
  • state Selection
    compute='_compute_state' copy=False help=<expr> readonly=False store=True string='Status' tracking=True args: [('draft', 'To Submit'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
  • supported_attachment_ids Many2many → ir.attachment
    compute='_compute_supported_attachment_ids' inverse='_inverse_supported_attachment_ids' string='Attach File' args: 'ir.attachment'
  • supported_attachment_ids_count Integer
    compute='_compute_supported_attachment_ids'
  • tz Selection
    compute='_compute_tz' args: _tz_get
  • tz_mismatch Boolean
    compute='_compute_tz_mismatch'
  • user_id Many2one → res.users
    compute_sudo=True index=True readonly=True related='employee_id.user_id' related_sudo=True store=True string='User' args: 'res.users'
  • validation_type Selection
    readonly=False related='holiday_status_id.leave_validation_type' string='Validation Type'
Public methods (20)
  • action_approve(self)
  • action_cancel(self)
  • action_confirm(self)
  • action_documents(self)
  • action_draft(self)
  • action_refuse(self)
  • action_validate(self)
  • activity_update(self)
  • add_follower(self, employee_id)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields_list)
    @api.model
  • get_unusual_days(self, date_from, date_to=None)
    @api.model
  • message_subscribe(self, partner_ids=None, subtype_ids=None)
  • name_get(self)
  • onchange(self, values, field_name, field_onchange)
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
  • split_leave(self, time_domain_dict)
  • unlink(self)
  • write(self, values)

New fields (26)
  • accrual_plan_id Many2one → hr.leave.accrual.plan
    required=True args: 'hr.leave.accrual.plan', 'Accrual Plan'
  • action_with_unused_accruals Selection
    default='postponed' required='True' string='At the end of the calendar year, unused accruals will be' args: [('postponed', 'Transferred to the next year'), ('lost', 'Lost')]
  • added_value Float
    digits=(16, 5) help='The number of hours/days that will be incremented in the specified Time Off Type for every period' required=True args: 'Rate'
  • added_value_type Selection
    default='days' required=True args: [('days', 'Days'), ('hours', 'Hours')]
  • first_day Integer
    default=1
  • first_day_display Selection
    compute='_compute_days_display' inverse='_inverse_first_day_display' args: _get_selection_days
  • first_month Selection
    default='jan' args: [('jan', 'January'), ('feb', 'February'), ('mar', 'March'), ('apr', 'April'), ('may', 'May'), ('jun', 'June')]
  • first_month_day Integer
    default=1
  • first_month_day_display Selection
    compute='_compute_days_display' inverse='_inverse_first_month_day_display' args: _get_selection_days
  • frequency Selection
    default='daily' required=True string='Frequency' args: [('daily', 'Daily'), ('weekly', 'Weekly'), ('bimonthly', 'Twice a month'), ('monthly', 'Monthly'), ('biyearly', 'Twice a year'), ('yearly', 'Yearly')]
  • is_based_on_worked_time Boolean
    help='If checked, the rate will be prorated on time off type where type is set on Working Time in the configuration.' args: 'Based on worked time'
  • maximum_leave Float
    default=100 help='Choose a cap for this accrual. 0 means no cap.' required=False args: 'Limit to'
  • parent_id Many2one → hr.leave.accrual.level
    help='If this field is empty, this level is the first one.' string='Previous Level' args: 'hr.leave.accrual.level'
  • postpone_max_days Integer
    help='Set a maximum of days an allocation keeps at the end of the year. 0 for no limit.' args: 'Maximum amount of accruals to transfer'
  • second_day Integer
    default=15
  • second_day_display Selection
    compute='_compute_days_display' inverse='_inverse_second_day_display' args: _get_selection_days
  • second_month Selection
    default='jul' args: [('jul', 'July'), ('aug', 'August'), ('sep', 'September'), ('oct', 'October'), ('nov', 'November'), ('dec', 'December')]
  • second_month_day Integer
    default=1
  • second_month_day_display Selection
    compute='_compute_days_display' inverse='_inverse_second_month_day_display' args: _get_selection_days
  • sequence Integer
    compute='_compute_sequence' help='Sequence is generated automatically by start time delta.' store=True string='sequence'
  • start_count Integer
    default='1' help='The accrual starts after a defined period from the allocation start date. This field defines the number of days, months or years after which accrual is used.' args: 'Start after'
  • start_type Selection
    default='day' help='This field defines the unit of time after which the accrual starts.' required=True string=' ' args: [('day', 'day(s)'), ('month', 'month(s)'), ('year', 'year(s)')]
  • week_day Selection
    default='mon' required=True string='Allocation on' args: [('mon', 'Monday'), ('tue', 'Tuesday'), ('wed', 'Wednesday'), ('thu', 'Thursday'), ('fri', 'Friday'), ('sat', 'Saturday'), ('sun', 'Sunday')]
  • yearly_day Integer
    default=1
  • yearly_day_display Selection
    compute='_compute_days_display' inverse='_inverse_yearly_day_display' args: _get_selection_days
  • yearly_month Selection
    default='jan' args: [('jan', 'January'), ('feb', 'February'), ('mar', 'March'), ('apr', 'April'), ('may', 'May'), ('jun', 'June'), ('jul', 'July'), ('aug', 'August'), ('sep', 'September'), ('oct', 'October'), ('nov', 'November'), ('dec', 'December')]
Public methods (0)

No public methods.

New fields (8)
  • allocation_ids One2many → hr.leave.allocation
    args: 'hr.leave.allocation', 'accrual_plan_id'
  • employees_count Integer
    compute='_compute_employee_count' args: 'Employees'
  • level_count Integer
    compute='_compute_level_count' args: 'Levels'
  • level_ids One2many → hr.leave.accrual.level
    copy=True args: 'hr.leave.accrual.level', 'accrual_plan_id'
  • name Char
    required=True args: 'Name'
  • show_transition_mode Boolean
    compute='_compute_show_transition_mode'
  • time_off_type_id Many2one → hr.leave.type
    help='Specify if this accrual plan can only be used with this Time Off Type.\n Leave empty if this accrual plan can be used with any Time Off Type.' string='Time Off Type' args: 'hr.leave.type'
  • transition_mode Selection
    default='immediately' help="Immediately: When the date corresponds to the new level, your accrual is automatically computed, granted and you switch to new level\n After this accrual's period: When the accrual is complete (a week, a month), and granted, you switch to next level if allocation date corresponds" required=True string='Level Transition' args: [('immediately', 'Immediately'), ('end_of_accrual', "After this accrual's period")]
Public methods (2)
  • action_open_accrual_plan_employees(self)
  • copy(self, default=None)
    @api.returns('self', <expr>)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (38)
  • accrual_plan_id Many2one → hr.leave.accrual.plan
    compute='_compute_from_holiday_status_id' domain="['|', ('time_off_type_id', '=', False), ('time_off_type_id', '=', holiday_status_id)]" readonly=False store=True tracking=True args: 'hr.leave.accrual.plan'
  • active Boolean
    default=True
  • active_employee Boolean
    readonly=True related='employee_id.active' args: 'Active Employee'
  • allocation_type Selection
    default='regular' readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Allocation Type' args: [('regular', 'Regular Allocation'), ('accrual', 'Accrual Allocation')]
  • approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validates the allocation' readonly=True string='First Approval' args: 'hr.employee'
  • can_approve Boolean
    compute='_compute_can_approve' args: 'Can Approve'
  • can_reset Boolean
    compute='_compute_can_reset' args: 'Can reset'
  • category_id Many2one → hr.employee.category
    compute='_compute_from_holiday_type' readonly=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Employee Tag' args: 'hr.employee.category'
  • date_from Date
    copy=False default=fields.Date.context_today index=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} tracking=True args: 'Start Date'
  • date_to Date
    copy=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} tracking=True args: 'End Date'
  • department_id Many2one → hr.department
    compute='_compute_department_id' states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} store=True string='Department' args: 'hr.department'
  • duration_display Char
    compute='_compute_duration_display' help='Field allowing to see the allocation duration in days or hours depending on the type_request_unit' args: 'Allocated (Days/Hours)'
  • employee_company_id Many2one
    readonly=True related='employee_id.company_id' store=True
  • employee_id Many2one → hr.employee
    compute='_compute_from_employee_ids' index=True ondelete='restrict' readonly=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Employee' tracking=True args: 'hr.employee'
  • employee_ids Many2many → hr.employee
    compute='_compute_from_holiday_type' readonly=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Employees' args: 'hr.employee'
  • holiday_status_id Many2one → hr.leave.type
    compute='_compute_holiday_status_id' default=_default_holiday_status_id domain=_domain_holiday_status_id readonly=False required=True states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Time Off Type' args: 'hr.leave.type'
  • holiday_type Selection
    default='employee' help='Allow to create requests in batchs:\n- By Employee: for a specific employee\n- By Company: all employees of the specified company\n- By Department: all employees of the specified department\n- By Employee Tag: all employees of the specific employee group category' readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Allocation Mode' args: [('employee', 'By Employee'), ('company', 'By Company'), ('department', 'By Department'), ('category', 'By Employee Tag')]
  • is_officer Boolean
    compute='_compute_is_officer'
  • lastcall Date
    default=fields.Date.context_today readonly=True args: 'Date of the last accrual allocation'
  • leaves_taken Float
    compute='_compute_leaves'
  • linked_request_ids One2many → hr.leave.allocation
    string='Linked Requests' args: 'hr.leave.allocation', 'parent_id'
  • manager_id Many2one → hr.employee
    compute='_compute_manager_id' store=True string='Manager' args: 'hr.employee'
  • max_leaves Float
    compute='_compute_leaves'
  • mode_company_id Many2one → res.company
    compute='_compute_from_holiday_type' readonly=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Company Mode' args: 'res.company'
  • multi_employee Boolean
    compute='_compute_from_employee_ids' help='Holds whether this allocation concerns more than 1 employee' store=True
  • name Char
    compute='_compute_description' compute_sudo=False inverse='_inverse_description' search='_search_description' args: 'Description'
  • name_validity Char
    compute='_compute_description_validity' args: 'Description with validity'
  • nextcall Date
    default=False readonly=True args: 'Date of the next accrual allocation'
  • notes Text
    readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'Reasons'
  • number_of_days Float
    compute='_compute_from_holiday_status_id' default=1 help='Duration in days. Reference field to use when necessary.' readonly=False store=True tracking=True args: 'Number of Days'
  • number_of_days_display Float
    compute='_compute_number_of_days_display' help='If Accrual Allocation: Days given by the accrual system.' states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'Duration (days)'
  • number_of_hours_display Float
    compute='_compute_number_of_hours_display' help="If Accrual Allocation: Number of hours allocated in addition to the ones you will get via the accrual' system." args: 'Duration (hours)'
  • parent_id Many2one → hr.leave.allocation
    string='Parent' args: 'hr.leave.allocation'
  • private_name Char
    groups='hr_holidays.group_hr_holidays_user' args: 'Allocation Description'
  • state Selection
    copy=False default='draft' help=<expr> readonly=True string='Status' tracking=True args: [('draft', 'To Submit'), ('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate', 'Approved')]
  • taken_leave_ids One2many → hr.leave
    domain="[('state', 'in', ['confirm', 'validate1', 'validate'])]" args: 'hr.leave', 'holiday_allocation_id'
  • type_request_unit Selection
    readonly=True related='holiday_status_id.request_unit'
  • validation_type Selection
    readonly=True related='holiday_status_id.allocation_validation_type' string='Validation Type'
Public methods (11)
  • action_confirm(self)
  • action_draft(self)
  • action_refuse(self)
  • action_validate(self)
  • activity_update(self)
  • add_follower(self, employee_id)
  • create(self, vals_list)
    @api.model_create_multi
    Override to avoid automatic logging of creation
  • message_subscribe(self, partner_ids=None, subtype_ids=None)
  • name_get(self)
  • onchange(self, values, field_name, field_onchange)
  • write(self, values)

New fields (10)
  • active_employee Boolean
    readonly=True
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • date_from Datetime
    readonly=True args: 'Start Date'
  • date_to Datetime
    readonly=True args: 'End Date'
  • department_id Many2one → hr.department
    readonly=True string='Department' args: 'hr.department'
  • employee_id Many2one → hr.employee
    readonly=True string='Employee' args: 'hr.employee'
  • holiday_status Selection
    args: [('taken', 'Taken'), ('left', 'Left'), ('planned', 'Planned')]
  • leave_type Many2one → hr.leave.type
    readonly=True string='Leave Type' args: 'hr.leave.type'
  • number_of_days Float
    group_operator='sum' readonly=True args: 'Number of Days'
  • state Selection
    readonly=True string='Status' args: [('draft', 'To Submit'), ('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
Public methods (2)
  • action_time_off_analysis(self)
    @api.model
  • init(self)

New fields (16)
  • active Boolean
    readonly=True
  • active_employee Boolean
    readonly=True
  • allocation_id Many2one → hr.leave.allocation
    readonly=True string='Allocation Request' args: 'hr.leave.allocation'
  • category_id Many2one → hr.employee.category
    readonly=True string='Employee Tag' args: 'hr.employee.category'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • date_from Datetime
    readonly=True args: 'Start Date'
  • date_to Datetime
    readonly=True args: 'End Date'
  • department_id Many2one → hr.department
    readonly=True string='Department' args: 'hr.department'
  • employee_id Many2one → hr.employee
    readonly=True string='Employee' args: 'hr.employee'
  • holiday_status_id Many2one → hr.leave.type
    readonly=True string='Leave Type' args: 'hr.leave.type'
  • holiday_type Selection
    readonly=True string='Allocation Mode' args: [('employee', 'By Employee'), ('category', 'By Employee Tag')]
  • leave_id Many2one → hr.leave
    readonly=True string='Leave Request' args: 'hr.leave'
  • leave_type Selection
    readonly=True string='Request Type' args: [('allocation', 'Allocation'), ('request', 'Time Off')]
  • name Char
    readonly=True args: 'Description'
  • number_of_days Float
    readonly=True args: 'Number of Days'
  • state Selection
    readonly=True string='Status' args: [('draft', 'To Submit'), ('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
Public methods (3)
  • action_open_record(self)
  • action_time_off_analysis(self)
    @api.model
  • init(self)

New fields (12)
  • company_id Many2one → res.company
    readonly=True args: 'res.company'
  • department_id Many2one → hr.department
    readonly=True args: 'hr.department'
  • duration Float
    readonly=True string='Duration'
  • employee_id Many2one → hr.employee
    readonly=True args: 'hr.employee'
  • is_hatched Boolean
    readonly=True args: 'Hatched'
  • is_striked Boolean
    readonly=True args: 'Striked'
  • job_id Many2one → hr.job
    readonly=True args: 'hr.job'
  • name Char
    readonly=True string='Name'
  • start_datetime Datetime
    readonly=True string='From'
  • state Selection
    readonly=True args: [('draft', 'To Submit'), ('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
  • stop_datetime Datetime
    readonly=True string='To'
  • tz Selection
    readonly=True string='Timezone' args: _tz_get
Public methods (2)
  • get_unusual_days(self, date_from, date_to=None)
    @api.model
  • init(self)

New fields (7)
  • color Integer
    default=<expr>
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company'
  • department_ids Many2many → hr.department
    string='Departments' args: 'hr.department'
  • end_date Date
    required=True
  • name Char
    required=True
  • resource_calendar_id Many2one → resource.calendar
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" args: 'resource.calendar', 'Working Hours'
  • start_date Date
    required=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (30)
  • accrual_count Float
    compute='_compute_accrual_count' string='Accruals count'
  • accruals_ids One2many → hr.leave.accrual.plan
    args: 'hr.leave.accrual.plan', 'time_off_type_id'
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the time off type without removing it.' args: 'Active'
  • allocation_count Integer
    compute='_compute_allocation_count' string='Allocations'
  • allocation_notif_subtype_id Many2one → mail.message.subtype
    default=<expr> string='Allocation Notification Subtype' args: 'mail.message.subtype'
  • allocation_validation_type Selection
    compute='_compute_allocation_validation_type' default='no' help="Select the level of approval needed in case of request by employee\n - No validation needed: The employee's request is automatically approved.\n - Approved by Time Off Officer: The employee's request need to be manually approved by the Time Off Officer." readonly=False store=True string='Approval' args: [('officer', 'Approved by Time Off Officer'), ('no', 'No validation needed')]
  • closest_allocation_to_expire Many2one → hr.leave.allocation
    compute='_compute_leaves' args: 'hr.leave.allocation', 'Allocation'
  • color Integer
    help='The color selected here will be used in every screen with the time off type.' string='Color'
  • color_name Selection
    default='red' help='This color will be used in the time off summary located in Reporting > Time off by Department.' required=True string='Color in Report' args: [('red', 'Red'), ('blue', 'Blue'), ('lightgreen', 'Light Green'), ('lightblue', 'Light Blue'), ('lightyellow', 'Light Yellow'), ('magenta', 'Magenta'), ('lightcyan', 'Light Cyan'), ('black', 'Black'), ('lightpink', 'Light Pink'), ('brown', 'Brown'), ('violet', 'Violet'), ('lightcoral', 'Light Coral'), ('lightsalmon', 'Light Salmon'), ('lavender', 'Lavender'), ('wheat', 'Wheat'), ('ivory', 'Ivory')]
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • create_calendar_meeting Boolean
    default=True string='Display Time Off in Calendar'
  • employee_requests Selection
    default='no' help='Extra Days Requests Allowed: User can request an allocation for himself.\n\n Not Allowed: User cannot request an allocation.' required=True string='Employee Requests' args: [('yes', 'Extra Days Requests Allowed'), ('no', 'Not Allowed')]
  • group_days_leave Float
    compute='_compute_group_days_leave' string='Group Time Off'
  • has_valid_allocation Boolean
    compute='_compute_valid' help='This indicates if it is still possible to use this type of leave' search='_search_valid'
  • icon_id Many2one → ir.attachment
    domain="[('res_model', '=', 'hr.leave.type'), ('res_field', '=', 'icon_id')]" string='Cover Image' args: 'ir.attachment'
  • leave_notif_subtype_id Many2one → mail.message.subtype
    default=<expr> string='Time Off Notification Subtype' args: 'mail.message.subtype'
  • leave_validation_type Selection
    default='hr' string='Leave Validation' args: [('no_validation', 'No Validation'), ('hr', 'By Time Off Officer'), ('manager', "By Employee's Approver"), ('both', "By Employee's Approver and Time Off Officer")]
  • leaves_taken Float
    compute='_compute_leaves' help='This value is given by the sum of all time off requests with a negative value.' string='Time off Already Taken'
  • max_leaves Float
    compute='_compute_leaves' help='This value is given by the sum of all time off requests with a positive value.' search='_search_max_leaves' string='Maximum Allowed'
  • name Char
    required=True translate=True args: 'Time Off Type'
  • remaining_leaves Float
    compute='_compute_leaves' help='Maximum Time Off Allowed - Time Off Already Taken' string='Remaining Time Off'
  • request_unit Selection
    default='day' required=True string='Take Time Off in' args: [('day', 'Day'), ('half_day', 'Half Day'), ('hour', 'Hours')]
  • requires_allocation Selection
    default='yes' help='Yes: Time off requests need to have a valid allocation.\n\n No Limit: Time Off requests can be taken without any prior allocation.' required=True string='Requires allocation' args: [('yes', 'Yes'), ('no', 'No Limit')]
  • responsible_id Many2one → res.users
    domain=<expr> help='Choose the Time Off Officer who will be notified to approve allocation or Time Off request' args: 'res.users', 'Responsible Time Off Officer'
  • sequence Integer
    default=100 help='The type with the smallest sequence is the default value in time off request'
  • support_document Boolean
    string='Supporting Document'
  • time_type Selection
    default='leave' help="The distinction between working time (ex. Attendance) and absence (ex. Training) will be used in the computation of Accrual's plan rate." string='Kind of Time Off' args: [('other', 'Worked Time'), ('leave', 'Absence')]
  • unpaid Boolean
    default=False args: 'Is Unpaid'
  • virtual_leaves_taken Float
    compute='_compute_leaves' help='Sum of validated and non validated time off requests.' string='Virtual Time Off Already Taken'
  • virtual_remaining_leaves Float
    compute='_compute_leaves' help='Maximum Time Off Allowed - Time Off Already Taken - Time Off Waiting Approval' search='_search_virtual_remaining_leaves' string='Virtual Remaining Time Off'
Public methods (8)
  • action_see_accrual_plans(self)
  • action_see_days_allocated(self)
  • action_see_group_leaves(self)
  • check_allocation_requirement_edit_validity(self)
    @api.constrains('requires_allocation')
  • get_days_all_request(self)
    @api.model
  • get_employees_days(self, employee_ids, date=None)
  • name_get(self)
  • requested_name_get(self)

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • mail_partner_format(self, fields=None)
    Override to add the current leave status.

New fields (9)
  • allocation_count Float
    related='employee_id.allocation_count'
  • allocation_display Char
    related='employee_id.allocation_display'
  • allocation_remaining_display Char
    related='employee_id.allocation_remaining_display'
  • current_leave_state Selection
    related='employee_id.current_leave_state'
  • hr_icon_display Selection
    related='employee_id.hr_icon_display'
  • is_absent Boolean
    related='employee_id.is_absent'
  • leave_date_to Date
    related='employee_id.leave_date_to'
  • leave_manager_id Many2one
    related='employee_id.leave_manager_id'
  • show_leaves Boolean
    related='employee_id.show_leaves'
Public methods (2)
  • SELF_READABLE_FIELDS(self)
    @property
  • create(self, vals_list)
    @api.model_create_multi

New fields (1)
  • associated_leaves_count Integer
    compute='_compute_associated_leaves_count' args: 'Leave Count'
Public methods (0)

No public methods.

New fields (1)
  • holiday_id Many2one → hr.leave
    string='Leave Request' args: 'hr.leave'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, vals)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/15.0/hr_holidays
VERSION
VERSION 1.5
CATEGORY
CATEGORYHuman Resources/Time Off
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Christophe Simonis, Xavier Morel, Goffin Simon, Nicolas Martinelli, Nicolas Lempereur, Thibault Francois, Aaron Bohy, Barad Mahendra, Yannick Tivisse, Dharmraj Jhala, Romain Derie, Adrien Dieudonne, Christophe Monniez, Julien Castiaux, Xavier-Do, Paul Morelle, Xavier Dubuc, Sébastien Theys, Nasreddin (bon), alt-odoo, Julien Mougenot, Samuel Degueldre, Achraf (abz), Adrien Widart, Ivan Yelizariev, Jérémy Hennecart, Touati Djamel (otd), Prakash Prajapati, nie, Tiffany Chang (tic), IEL, Ivàn Todorovich, Mathieu Duckerts-Antoine, Hiral Bhavsar, yograj tandel, Arnaud Joset, William Braeckman, nounoubensebia, Kevin Baptiste, Philippe Wauthy, Arnaud Baes, Hubert Van de Walle (huvw), sofiagvaladze, Florian Damhaut, Merlin (megu), MerlinGuillaume, tranngocson1996, mafo-odoo, Audric Onockx (auon), Agustín Castro Bugallo, Yolann Sabaux, Aurelien van Delft (avd), Michael Mattiello (mcm), Dossogne Bertrand, dht-odoo, Roy Le, Thomas Lefebvre (thle), Louis Wicket (wil), Tommy (tong), Tom De Caluwé, Malay Khamar, Qiuyu (QHO), Jurgen (jugj), arsi, Krina Oza, Michael (mcm), Simon Goffaux (sigo), prye-odoo, Leonardo Pavan Rocha, Dawn Hwang, Andrzej(pian), Zelong Lin, ravb-odoo, Dang Van Loc, Mattis Megevand, tronghung0398, dasz, Mélanie, Youssef Bashandy
WEBSITE
WEBSITEhttps://www.odoo.com/app/time-off
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:25:26
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - hr
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - resource
    - calendar
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage time off requests and allocations
=====================================

This application controls the time off schedule of your company. It allows employees to request time off. Then, managers can review requests for time off and approve or reject them. This way you can control the overall time off planning for the company or department.

You can configure several kinds of time off (sickness, paid days, ...) and allocate time off to an employee or department quickly using time off allocation. An employee can also make a request for more days off by making a new time off allocation. It will increase the total of available days for that time off type (if the request is accepted).

You can keep track of time off in different ways by following reports:

* Time Off Summary
* Time Off by Department
* Time Off Analysis

A synchronization with an internal agenda (Meetings of the CRM module) is also possible in order to automatically create a meeting when a time off request is accepted by setting up a type of meeting in time off Type.

Code Analysis

Views touched (58)
XML IDNameModelTypeStatus
edit_holiday_status_form hr.leave.type.form hr.leave.type form New
hr_accrual_level_view_form hr.leave.accrual.level.form hr.leave.accrual.level form New
hr_accrual_plan_view_form hr.leave.accrual.plan.form hr.leave.accrual.plan form New
hr_accrual_plan_view_tree hr.leave.accrual.plan.tree hr.leave.accrual.plan tree New
hr_department_view_kanban hr.department.kanban.inherit hr.department data Inherits hr.hr_department_view_kanban
hr_departure_wizard_view_form hr.departure.wizard.view.form.extend3 hr.departure.wizard xpath Inherits hr.hr_departure_wizard_view_form
hr_employee_public_form_view_inherit hr.employee.public.leave.form.inherit hr.employee.public xpath Inherits hr.hr_employee_public_view_form
hr_employee_view_search hr.employee.search.view.inherit hr.employee xpath Inherits hr.view_employee_filter
hr_holiday_status_view_kanban hr.leave.type.kanban hr.leave.type kanban New
hr_kanban_view_employees_kanban hr.employee.kanban.leaves.status hr.employee xpath Inherits hr.hr_kanban_view_employees
hr_kanban_view_public_employees_kanban hr.employee.public.kanban.leaves.status hr.employee.public xpath Inherits hr.hr_employee_public_view_kanban
hr_leave_allocation_view_activity hr.leave.allocation.view.activity hr.leave.allocation activity New
hr_leave_allocation_view_form hr.leave.allocation.view.form hr.leave.allocation form New
hr_leave_allocation_view_form_dashboard hr.leave.view.form.dashboard hr.leave.allocation xpath Inherits hr_holidays.hr_leave_allocation_view_form
hr_leave_allocation_view_form_manager hr.leave.allocation.view.form.manager hr.leave.allocation xpath Inherits hr_holidays.hr_leave_allocation_view_form
hr_leave_allocation_view_form_manager_dashboard hr.leave.allocation.view.form.manager.dashboard hr.leave.allocation xpath Inherits hr_holidays.hr_leave_allocation_view_form_manager
hr_leave_allocation_view_kanban hr.leave.allocation.view.kanban hr.leave.allocation kanban New
hr_leave_allocation_view_search_manager hr.leave.allocation.view.search.my hr.leave.allocation xpath Inherits view_hr_leave_allocation_filter
hr_leave_allocation_view_search_my hr.leave.allocation.view.search.my hr.leave.allocation xpath Inherits view_hr_leave_allocation_filter
hr_leave_allocation_view_tree hr.leave.allocation.view.tree hr.leave.allocation tree New
hr_leave_allocation_view_tree_my hr.leave.allocation.view.tree.my hr.leave.allocation xpath Inherits hr_leave_allocation_view_tree
hr_leave_employee_type_report hr.leave.employee.type.report.view.pivot hr.leave.employee.type.report pivot New
hr_leave_employee_view_dashboard hr.leave.view.dashboard hr.leave calendar New
hr_leave_report_calendar_view hr.leave.report.calendar.view hr.leave.report.calendar calendar New
hr_leave_report_calendar_view_form hr.leave.report.calendar.view.form hr.leave.report.calendar form New
hr_leave_report_calendar_view_search hr.leave.report.calendar.view.search hr.leave.report.calendar search New
hr_leave_report_pivot report.hr.holidays.report.leave_all.pivot hr.leave.report pivot New
hr_leave_report_tree report.hr.holidays.report.leave_all.tree hr.leave.report tree New
hr_leave_view_activity hr.leave.view.activity hr.leave activity New
hr_leave_view_calendar hr.leave.view.calendar hr.leave calendar New
hr_leave_view_dashboard hr.leave.view.dashboard hr.leave calendar New
hr_leave_view_form hr.leave.view.form hr.leave form New
hr_leave_view_form_dashboard hr.leave.view.form.dashboard hr.leave xpath Inherits hr_holidays.hr_leave_view_form
hr_leave_view_form_dashboard_new_time_off hr.leave.view.form.dashboard.new.time.off hr.leave xpath Inherits hr_holidays.hr_leave_view_form_dashboard
hr_leave_view_form_manager hr.leave.view.form.manager hr.leave field Inherits hr_leave_view_form
hr_leave_view_kanban hr.leave.view.kanban hr.leave kanban New
hr_leave_view_search_manager hr.holidays.view.search.manager hr.leave xpath Inherits view_hr_holidays_filter
hr_leave_view_search_my hr.holidays.view.search.my hr.leave xpath Inherits view_hr_holidays_filter
hr_leave_view_tree hr.holidays.view.tree hr.leave tree New
hr_leave_view_tree_my hr.holidays.view.tree hr.leave xpath Inherits hr_leave_view_tree
report_holidayssummary report_holidayssummary ir.ui.view qweb New
res_users_view_form hr.user.preferences.view.form.leave.inherit res.users xpath Inherits hr.res_users_view_form_profile
resource_calendar_form_inherit resource.calendar.form.inherit resource.calendar xpath Inherits resource.resource_calendar_form
resource_calendar_leave_form_inherit resource.calendar.leaves.form.inherit resource.calendar.leaves field Inherits resource.resource_calendar_leave_form
resource_calendar_leaves_tree_inherit resource.calendar.leaves.tree.inherit resource.calendar.leaves xpath Inherits resource.resource_calendar_leave_tree
resource_calendar_leaves_view_search_inherit resource.calendar.leaves.search.inherit resource.calendar.leaves filter Inherits resource.view_resource_calendar_leaves_search
view_employee_form_leave_inherit hr.employee.leave.form.inherit hr.employee xpath Inherits hr.view_employee_form
view_employee_tree_inherit_leave hr.employee.tree.leave hr.employee xpath Inherits hr.view_employee_tree
view_evaluation_report_graph hr.holidays.graph hr.leave graph New
view_holiday_graph hr.holidays.report_graph hr.leave graph New
view_holiday_pivot hr.holidays.report_pivot hr.leave pivot New
view_holiday_status_normal_tree hr.leave.type.normal.tree hr.leave.type tree New
view_holidays_status_filter hr.leave.type.filter hr.leave.type search New
view_hr_holidays_filter hr.holidays.filter hr.leave search New
view_hr_holidays_filter_report hr.holidays.filter hr.leave.report search New
view_hr_holidays_summary_employee hr.holidays.summary.employee.form hr.holidays.summary.employee form New
view_hr_leave_allocation_filter hr.holidays.filter_allocations hr.leave.allocation search New
view_search_hr_holidays_employee_type_report hr.holidays.filter hr.leave.employee.type.report search New
Models touched (18)

New fields (3)
  • absence_of_today Integer
    compute='_compute_leave_count' string='Absence by Today'
  • allocation_to_approve_count Integer
    compute='_compute_leave_count' string='Allocation to Approve'
  • leave_to_approve_count Integer
    compute='_compute_leave_count' string='Time Off to Approve'
Public methods (2)
  • action_open_allocation_department(self)
  • action_open_leave_department(self)

New fields (2)
  • archive_allocation Boolean
    default=True help='Remove employee from existing accrual plans.' args: 'Archive Employee Allocations'
  • cancel_leaves Boolean
    default=True help='Cancel all time off after this date.' args: 'Cancel Future Leaves'
Public methods (1)
  • action_register_departure(self)

New fields (1)
  • current_leave_id Many2one → hr.leave.type
    compute='_compute_current_leave' groups='hr.group_hr_user' string='Current Time Off Type' args: 'hr.leave.type'
Public methods (1)
  • action_time_off_dashboard(self)

New fields (14)
  • allocation_count Float
    compute='_compute_allocation_count' args: 'Total number of days allocated.'
  • allocation_display Char
    compute='_compute_allocation_count'
  • allocation_used_count Float
    compute='_compute_total_allocation_used' args: 'Total number of days off used'
  • allocation_used_display Char
    compute='_compute_total_allocation_used'
  • allocations_count Integer
    compute='_compute_allocation_count' args: 'Total number of allocations'
  • current_leave_state Selection
    compute='_compute_leave_status' selection=[('draft', 'New'), ('confirm', 'Waiting Approval'), ('refuse', 'Refused'), ('validate1', 'Waiting Second Approval'), ('validate', 'Approved'), ('cancel', 'Cancelled')] string='Current Time Off Status'
  • hr_icon_display Selection
    selection_add=[('presence_holiday_absent', 'On leave'), ('presence_holiday_present', 'Present but on leave')]
  • is_absent Boolean
    compute='_compute_leave_status' search='_search_absent_employee' args: 'Absent Today'
  • leave_date_from Date
    compute='_compute_leave_status' args: 'From Date'
  • leave_date_to Date
    compute='_compute_leave_status' args: 'To Date'
  • leave_manager_id Many2one → res.users
    compute='_compute_leave_manager' help='Select the user responsible for approving "Time Off" of this employee.\nIf empty, the approval is done by an Administrator or Approver (determined in settings/users).' readonly=False store=True string='Time Off' args: 'res.users'
  • leaves_count Float
    compute='_compute_remaining_leaves' args: 'Number of Time Off'
  • remaining_leaves Float
    compute='_compute_remaining_leaves' help='Total number of paid time off allocated to this employee, change this value to create allocation/time off request. Total based on all the time off types without overriding limit.' string='Remaining Paid Time Off'
  • show_leaves Boolean
    compute='_compute_show_leaves' args: 'Able to see Remaining Time Off'
Public methods (2)
  • create(self, values)
    @api.model
  • write(self, values)

New fields (3)
  • date_from Date
    default=<expr> required=True string='From'
  • emp Many2many → hr.employee
    string='Employee(s)' args: 'hr.employee', 'summary_emp_rel', 'sum_id', 'emp_id'
  • holiday_type Selection
    default='Approved' required=True string='Select Time Off Type' args: [('Approved', 'Approved'), ('Confirmed', 'Confirmed'), ('both', 'Both Approved and Confirmed')]
Public methods (1)
  • print_report(self)

New fields (51)
  • active_employee Boolean
    readonly=True related='employee_id.active'
  • attachment_ids One2many → ir.attachment
    string='Attachments' args: 'ir.attachment', 'res_id'
  • can_approve Boolean
    compute='_compute_can_approve' args: 'Can Approve'
  • can_reset Boolean
    compute='_compute_can_reset' args: 'Can reset'
  • category_id Many2one → hr.employee.category
    compute='_compute_from_holiday_type' help='Category of Employee' states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} store=True string='Employee Tag' args: 'hr.employee.category'
  • color Integer
    related='holiday_status_id.color' args: 'Color'
  • date_from Datetime
    compute='_compute_date_from_to' copy=False index=True readonly=False required=True states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True tracking=True args: 'Start Date'
  • date_to Datetime
    compute='_compute_date_from_to' copy=False readonly=False required=True states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True tracking=True args: 'End Date'
  • department_id Many2one → hr.department
    compute='_compute_department_id' readonly=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Department' args: 'hr.department'
  • duration_display Char
    compute='_compute_duration_display' help='Field allowing to see the leave request duration in days or hours depending on the leave_type_request_unit' store=True args: 'Requested (Days/Hours)'
  • employee_company_id Many2one
    readonly=True related='employee_id.company_id' store=True
  • employee_id Many2one → hr.employee
    compute='_compute_from_employee_ids' compute_sudo=False index=True ondelete='restrict' readonly=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Employee' tracking=True args: 'hr.employee'
  • employee_ids Many2many → hr.employee
    compute='_compute_from_holiday_type' groups='hr_holidays.group_hr_holidays_user' readonly=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Employees' args: 'hr.employee'
  • first_approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validate the time off' readonly=True string='First Approval' args: 'hr.employee'
  • holiday_allocation_id Many2one → hr.leave.allocation
    compute='_compute_from_holiday_status_id' readonly=False store=True string='Allocation' args: 'hr.leave.allocation'
  • holiday_status_id Many2one → hr.leave.type
    compute='_compute_from_employee_id' domain=['|', ('requires_allocation', '=', 'no'), ('has_valid_allocation', '=', True)] readonly=False required=True states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Time Off Type' args: 'hr.leave.type'
  • holiday_type Selection
    default='employee' help='By Employee: Allocation/Request for individual Employee, By Employee Tag: Allocation/Request for group of employees in category' readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Allocation Mode' args: [('employee', 'By Employee'), ('company', 'By Company'), ('department', 'By Department'), ('category', 'By Employee Tag')]
  • is_hatched Boolean
    compute='_compute_is_hatched' args: 'Hatched'
  • is_striked Boolean
    compute='_compute_is_hatched' args: 'Striked'
  • leave_type_request_unit Selection
    readonly=True related='holiday_status_id.request_unit'
  • leave_type_support_document Boolean
    related='holiday_status_id.support_document'
  • linked_request_ids One2many → hr.leave
    string='Linked Requests' args: 'hr.leave', 'parent_id'
  • manager_id Many2one → hr.employee
    compute='_compute_from_employee_id' readonly=False store=True args: 'hr.employee'
  • meeting_id Many2one → calendar.event
    copy=False string='Meeting' args: 'calendar.event'
  • mode_company_id Many2one → res.company
    compute='_compute_from_holiday_type' states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} store=True string='Company Mode' args: 'res.company'
  • multi_employee Boolean
    compute='_compute_from_employee_ids' compute_sudo=False help='Holds whether this allocation concerns more than 1 employee' store=True
  • name Char
    compute='_compute_description' compute_sudo=False inverse='_inverse_description' search='_search_description' args: 'Description'
  • notes Text
    readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'Reasons'
  • number_of_days Float
    compute='_compute_number_of_days' copy=False help='Number of days of the time off request. Used in the calculation. To manually correct the duration, use this field.' readonly=False store=True tracking=True args: 'Duration (Days)'
  • number_of_days_display Float
    compute='_compute_number_of_days_display' help='Number of days of the time off request according to your working schedule. Used for interface.' readonly=True args: 'Duration in days'
  • number_of_hours_display Float
    compute='_compute_number_of_hours_display' help='Number of hours of the time off request according to your working schedule. Used for interface.' readonly=True args: 'Duration in hours'
  • number_of_hours_text Char
    compute='_compute_number_of_hours_text'
  • parent_id Many2one → hr.leave
    copy=False string='Parent' args: 'hr.leave'
  • private_name Char
    groups='hr_holidays.group_hr_holidays_user' args: 'Time Off Description'
  • report_note Text
    copy=False groups='hr_holidays.group_hr_holidays_manager' args: 'HR Comments'
  • request_date_from Date
    args: 'Request Start Date'
  • request_date_from_period Selection
    default='am' string='Date Period Start' args: [('am', 'Morning'), ('pm', 'Afternoon')]
  • request_date_to Date
    args: 'Request End Date'
  • request_hour_from Selection
    string='Hour from' args: [('0', '12:00 AM'), ('0.5', '12:30 AM'), ('1', '1:00 AM'), ('1.5', '1:30 AM'), ('2', '2:00 AM'), ('2.5', '2:30 AM'), ('3', '3:00 AM'), ('3.5', '3:30 AM'), ('4', '4:00 AM'), ('4.5', '4:30 AM'), ('5', '5:00 AM'), ('5.5', '5:30 AM'), ('6', '6:00 AM'), ('6.5', '6:30 AM'), ('7', '7:00 AM'), ('7.5', '7:30 AM'), ('8', '8:00 AM'), ('8.5', '8:30 AM'), ('9', '9:00 AM'), ('9.5', '9:30 AM'), ('10', '10:00 AM'), ('10.5', '10:30 AM'), ('11', '11:00 AM'), ('11.5', '11:30 AM'), ('12', '12:00 PM'), ('12.5', '12:30 PM'), ('13', '1:00 PM'), ('13.5', '1:30 PM'), ('14', '2:00 PM'), ('14.5', '2:30 PM'), ('15', '3:00 PM'), ('15.5', '3:30 PM'), ('16', '4:00 PM'), ('16.5', '4:30 PM'), ('17', '5:00 PM'), ('17.5', '5:30 PM'), ('18', '6:00 PM'), ('18.5', '6:30 PM'), ('19', '7:00 PM'), ('19.5', '7:30 PM'), ('20', '8:00 PM'), ('20.5', '8:30 PM'), ('21', '9:00 PM'), ('21.5', '9:30 PM'), ('22', '10:00 PM'), ('22.5', '10:30 PM'), ('23', '11:00 PM'), ('23.5', '11:30 PM')]
  • request_hour_to Selection
    string='Hour to' args: [('0', '12:00 AM'), ('0.5', '12:30 AM'), ('1', '1:00 AM'), ('1.5', '1:30 AM'), ('2', '2:00 AM'), ('2.5', '2:30 AM'), ('3', '3:00 AM'), ('3.5', '3:30 AM'), ('4', '4:00 AM'), ('4.5', '4:30 AM'), ('5', '5:00 AM'), ('5.5', '5:30 AM'), ('6', '6:00 AM'), ('6.5', '6:30 AM'), ('7', '7:00 AM'), ('7.5', '7:30 AM'), ('8', '8:00 AM'), ('8.5', '8:30 AM'), ('9', '9:00 AM'), ('9.5', '9:30 AM'), ('10', '10:00 AM'), ('10.5', '10:30 AM'), ('11', '11:00 AM'), ('11.5', '11:30 AM'), ('12', '12:00 PM'), ('12.5', '12:30 PM'), ('13', '1:00 PM'), ('13.5', '1:30 PM'), ('14', '2:00 PM'), ('14.5', '2:30 PM'), ('15', '3:00 PM'), ('15.5', '3:30 PM'), ('16', '4:00 PM'), ('16.5', '4:30 PM'), ('17', '5:00 PM'), ('17.5', '5:30 PM'), ('18', '6:00 PM'), ('18.5', '6:30 PM'), ('19', '7:00 PM'), ('19.5', '7:30 PM'), ('20', '8:00 PM'), ('20.5', '8:30 PM'), ('21', '9:00 PM'), ('21.5', '9:30 PM'), ('22', '10:00 PM'), ('22.5', '10:30 PM'), ('23', '11:00 PM'), ('23.5', '11:30 PM')]
  • request_unit_custom Boolean
    compute='_compute_request_unit_custom' readonly=False store=True args: 'Days-long custom hours'
  • request_unit_half Boolean
    compute='_compute_request_unit_half' readonly=False store=True args: 'Half Day'
  • request_unit_hours Boolean
    compute='_compute_request_unit_hours' readonly=False store=True args: 'Custom Hours'
  • second_approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validate the time off with second level (If time off type need second validation)' readonly=True string='Second Approval' args: 'hr.employee'
  • state Selection
    compute='_compute_state' copy=False help=<expr> readonly=False store=True string='Status' tracking=True args: [('draft', 'To Submit'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
  • supported_attachment_ids Many2many → ir.attachment
    compute='_compute_supported_attachment_ids' inverse='_inverse_supported_attachment_ids' string='Attach File' args: 'ir.attachment'
  • supported_attachment_ids_count Integer
    compute='_compute_supported_attachment_ids'
  • tz Selection
    compute='_compute_tz' args: _tz_get
  • tz_mismatch Boolean
    compute='_compute_tz_mismatch'
  • user_id Many2one → res.users
    compute_sudo=True readonly=True related='employee_id.user_id' related_sudo=True store=True string='User' args: 'res.users'
  • validation_type Selection
    readonly=False related='holiday_status_id.leave_validation_type' string='Validation Type'
Public methods (17)
  • action_approve(self)
  • action_confirm(self)
  • action_documents(self)
  • action_draft(self)
  • action_refuse(self)
  • action_validate(self)
  • activity_update(self)
  • add_follower(self, employee_id)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
    Override to avoid automatic logging of creation
  • default_get(self, fields_list)
    @api.model
  • get_unusual_days(self, date_from, date_to=None)
    @api.model
  • message_subscribe(self, partner_ids=None, subtype_ids=None)
  • name_get(self)
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
  • unlink(self)
  • write(self, values)

New fields (26)
  • accrual_plan_id Many2one → hr.leave.accrual.plan
    required=True args: 'hr.leave.accrual.plan', 'Accrual Plan'
  • action_with_unused_accruals Selection
    default='postponed' required='True' string='At the end of the calendar year, unused accruals will be' args: [('postponed', 'Transferred to the next year'), ('lost', 'Lost')]
  • added_value Float
    digits=(16, 5) help='The number of hours/days that will be incremented in the specified Time Off Type for every period' required=True args: 'Rate'
  • added_value_type Selection
    default='days' required=True args: [('days', 'Days'), ('hours', 'Hours')]
  • first_day Integer
    default=1
  • first_day_display Selection
    compute='_compute_days_display' inverse='_inverse_first_day_display' args: _get_selection_days
  • first_month Selection
    default='jan' args: [('jan', 'January'), ('feb', 'February'), ('mar', 'March'), ('apr', 'April'), ('may', 'May'), ('jun', 'June')]
  • first_month_day Integer
    default=1
  • first_month_day_display Selection
    compute='_compute_days_display' inverse='_inverse_first_month_day_display' args: _get_selection_days
  • frequency Selection
    default='daily' required=True string='Frequency' args: [('daily', 'Daily'), ('weekly', 'Weekly'), ('bimonthly', 'Twice a month'), ('monthly', 'Monthly'), ('biyearly', 'Twice a year'), ('yearly', 'Yearly')]
  • is_based_on_worked_time Boolean
    help='Only accrue for the time worked by the employee. This is the time when the employee did not take time off.' args: 'Based on worked time'
  • level Integer
    compute='_compute_level' help='Level computed through the sequence.'
  • maximum_leave Float
    default=100 help='Choose a cap for this accrual. 0 means no cap.' required=False args: 'Limit to'
  • parent_id Many2one → hr.leave.accrual.level
    help='If this field is empty, this level is the first one.' string='Previous Level' args: 'hr.leave.accrual.level'
  • second_day Integer
    default=15
  • second_day_display Selection
    compute='_compute_days_display' inverse='_inverse_second_day_display' args: _get_selection_days
  • second_month Selection
    default='jul' args: [('jul', 'July'), ('aug', 'August'), ('sep', 'September'), ('oct', 'October'), ('nov', 'November'), ('dec', 'December')]
  • second_month_day Integer
    default=1
  • second_month_day_display Selection
    compute='_compute_days_display' inverse='_inverse_second_month_day_display' args: _get_selection_days
  • sequence Integer
    compute='_compute_sequence' help='Sequence is generated automatically by start time delta.' store=True string='sequence'
  • start_count Integer
    default='1' help='The accrual starts after a defined period from the allocation start date. This field defines the number of days, months or years after which accrual is used.' args: 'Start after'
  • start_type Selection
    default='day' help='This field defines the unit of time after which the accrual starts.' required=True string=' ' args: [('day', 'day(s)'), ('month', 'month(s)'), ('year', 'year(s)')]
  • week_day Selection
    default='mon' required=True string='Allocation on' args: [('mon', 'Monday'), ('tue', 'Tuesday'), ('wed', 'Wednesday'), ('thu', 'Thursday'), ('fri', 'Friday'), ('sat', 'Saturday'), ('sun', 'Sunday')]
  • yearly_day Integer
    default=1
  • yearly_day_display Selection
    compute='_compute_days_display' inverse='_inverse_yearly_day_display' args: _get_selection_days
  • yearly_month Selection
    default='jan' args: [('jan', 'January'), ('feb', 'February'), ('mar', 'March'), ('apr', 'April'), ('may', 'May'), ('jun', 'June'), ('jul', 'July'), ('aug', 'August'), ('sep', 'September'), ('oct', 'October'), ('nov', 'November'), ('dec', 'December')]
Public methods (0)

No public methods.

New fields (7)
  • allocation_ids One2many → hr.leave.allocation
    args: 'hr.leave.allocation', 'accrual_plan_id'
  • employees_count Integer
    compute='_compute_employee_count' args: 'Employees'
  • level_count Integer
    compute='_compute_level_count' args: 'Levels'
  • level_ids One2many → hr.leave.accrual.level
    copy=True args: 'hr.leave.accrual.level', 'accrual_plan_id'
  • name Char
    required=True args: 'Name'
  • time_off_type_id Many2one → hr.leave.type
    help='Specify if this accrual plan can only be used with this Time Off Type.\n Leave empty if this accrual plan can be used with any Time Off Type.' string='Time Off Type' args: 'hr.leave.type'
  • transition_mode Selection
    default='immediately' help="Immediately: When the date corresponds to the new level, your accrual is automatically computed, granted and you switch to new level\n After this accrual's period: When the accrual is complete (a week, a month), and granted, you switch to next level if allocation date corresponds" required=True string='Level Transition' args: [('immediately', 'Immediately'), ('end_of_accrual', "After this accrual's period")]
Public methods (2)
  • action_open_accrual_plan_employees(self)
  • copy(self, default=None)
    @api.returns('self', <expr>)

New fields (38)
  • accrual_plan_id Many2one → hr.leave.accrual.plan
    compute='_compute_from_holiday_status_id' domain="['|', ('time_off_type_id', '=', False), ('time_off_type_id', '=', holiday_status_id)]" readonly=False store=True tracking=True args: 'hr.leave.accrual.plan'
  • active Boolean
    default=True
  • active_employee Boolean
    readonly=True related='employee_id.active' args: 'Active Employee'
  • allocation_type Selection
    default='regular' readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Allocation Type' args: [('regular', 'Regular Allocation'), ('accrual', 'Accrual Allocation')]
  • approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validates the allocation' readonly=True string='First Approval' args: 'hr.employee'
  • can_approve Boolean
    compute='_compute_can_approve' args: 'Can Approve'
  • can_reset Boolean
    compute='_compute_can_reset' args: 'Can reset'
  • category_id Many2one → hr.employee.category
    compute='_compute_from_holiday_type' readonly=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Employee Tag' args: 'hr.employee.category'
  • date_from Date
    copy=False default=fields.Date.context_today index=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} tracking=True args: 'Start Date'
  • date_to Date
    copy=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} tracking=True args: 'End Date'
  • department_id Many2one → hr.department
    compute='_compute_department_id' states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} store=True string='Department' args: 'hr.department'
  • duration_display Char
    compute='_compute_duration_display' help='Field allowing to see the allocation duration in days or hours depending on the type_request_unit' args: 'Allocated (Days/Hours)'
  • employee_company_id Many2one
    readonly=True related='employee_id.company_id' store=True
  • employee_id Many2one → hr.employee
    compute='_compute_from_employee_ids' index=True ondelete='restrict' readonly=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Employee' tracking=True args: 'hr.employee'
  • employee_ids Many2many → hr.employee
    compute='_compute_from_holiday_type' readonly=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Employees' args: 'hr.employee'
  • holiday_status_id Many2one → hr.leave.type
    compute='_compute_holiday_status_id' default=_default_holiday_status_id domain=_domain_holiday_status_id readonly=False required=True states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Time Off Type' args: 'hr.leave.type'
  • holiday_type Selection
    default='employee' help='Allow to create requests in batchs:\n- By Employee: for a specific employee\n- By Company: all employees of the specified company\n- By Department: all employees of the specified department\n- By Employee Tag: all employees of the specific employee group category' readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Allocation Mode' args: [('employee', 'By Employee'), ('company', 'By Company'), ('department', 'By Department'), ('category', 'By Employee Tag')]
  • is_officer Boolean
    compute='_compute_is_officer'
  • lastcall Date
    default=fields.Date.context_today readonly=True args: 'Date of the last accrual allocation'
  • leaves_taken Float
    compute='_compute_leaves'
  • linked_request_ids One2many → hr.leave.allocation
    string='Linked Requests' args: 'hr.leave.allocation', 'parent_id'
  • manager_id Many2one → hr.employee
    compute='_compute_manager_id' store=True string='Manager' args: 'hr.employee'
  • max_leaves Float
    compute='_compute_leaves'
  • mode_company_id Many2one → res.company
    compute='_compute_from_holiday_type' readonly=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Company Mode' args: 'res.company'
  • multi_employee Boolean
    compute='_compute_from_employee_ids' help='Holds whether this allocation concerns more than 1 employee' store=True
  • name Char
    compute='_compute_description' compute_sudo=False inverse='_inverse_description' search='_search_description' args: 'Description'
  • name_validity Char
    compute='_compute_description_validity' args: 'Description with validity'
  • nextcall Date
    default=False readonly=True args: 'Date of the next accrual allocation'
  • notes Text
    readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'Reasons'
  • number_of_days Float
    compute='_compute_from_holiday_status_id' default=1 help='Duration in days. Reference field to use when necessary.' readonly=False store=True tracking=True args: 'Number of Days'
  • number_of_days_display Float
    compute='_compute_number_of_days_display' help="If Accrual Allocation: Number of days allocated in addition to the ones you will get via the accrual' system." states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'Duration (days)'
  • number_of_hours_display Float
    compute='_compute_number_of_hours_display' help="If Accrual Allocation: Number of hours allocated in addition to the ones you will get via the accrual' system." args: 'Duration (hours)'
  • parent_id Many2one → hr.leave.allocation
    string='Parent' args: 'hr.leave.allocation'
  • private_name Char
    groups='hr_holidays.group_hr_holidays_user' args: 'Allocation Description'
  • state Selection
    copy=False default='draft' help=<expr> readonly=True string='Status' tracking=True args: [('draft', 'To Submit'), ('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate', 'Approved')]
  • taken_leave_ids One2many → hr.leave
    domain="[('state', 'in', ['confirm', 'validate1', 'validate'])]" args: 'hr.leave', 'holiday_allocation_id'
  • type_request_unit Selection
    readonly=True related='holiday_status_id.request_unit'
  • validation_type Selection
    readonly=True related='holiday_status_id.allocation_validation_type' string='Validation Type'
Public methods (10)
  • action_confirm(self)
  • action_draft(self)
  • action_refuse(self)
  • action_validate(self)
  • activity_update(self)
  • add_follower(self, employee_id)
  • create(self, vals_list)
    @api.model_create_multi
    Override to avoid automatic logging of creation
  • message_subscribe(self, partner_ids=None, subtype_ids=None)
  • name_get(self)
  • write(self, values)

New fields (10)
  • active_employee Boolean
    readonly=True related='employee_id.active'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • date_from Datetime
    readonly=True args: 'Start Date'
  • date_to Datetime
    readonly=True args: 'End Date'
  • department_id Many2one → hr.department
    readonly=True string='Department' args: 'hr.department'
  • employee_id Many2one → hr.employee
    readonly=True string='Employee' args: 'hr.employee'
  • holiday_status Selection
    args: [('taken', 'Taken'), ('left', 'Left'), ('planned', 'Planned')]
  • leave_type Many2one → hr.leave.type
    readonly=True string='Leave Type' args: 'hr.leave.type'
  • number_of_days Float
    group_operator='sum' readonly=True args: 'Number of Days'
  • state Selection
    readonly=True string='Status' args: [('draft', 'To Submit'), ('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
Public methods (2)
  • action_time_off_analysis(self)
    @api.model
  • init(self)

New fields (13)
  • active_employee Boolean
    readonly=True related='employee_id.active'
  • category_id Many2one → hr.employee.category
    readonly=True string='Employee Tag' args: 'hr.employee.category'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • date_from Datetime
    readonly=True args: 'Start Date'
  • date_to Datetime
    readonly=True args: 'End Date'
  • department_id Many2one → hr.department
    readonly=True string='Department' args: 'hr.department'
  • employee_id Many2one → hr.employee
    readonly=True string='Employee' args: 'hr.employee'
  • holiday_status_id Many2one → hr.leave.type
    readonly=True string='Leave Type' args: 'hr.leave.type'
  • holiday_type Selection
    readonly=True string='Allocation Mode' args: [('employee', 'By Employee'), ('category', 'By Employee Tag')]
  • leave_type Selection
    readonly=True string='Request Type' args: [('allocation', 'Allocation'), ('request', 'Time Off')]
  • name Char
    readonly=True args: 'Description'
  • number_of_days Float
    readonly=True args: 'Number of Days'
  • state Selection
    readonly=True string='Status' args: [('draft', 'To Submit'), ('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
Public methods (2)
  • action_time_off_analysis(self)
    @api.model
  • init(self)

New fields (12)
  • company_id Many2one → res.company
    readonly=True args: 'res.company'
  • department_id Many2one → hr.department
    readonly=True args: 'hr.department'
  • duration Float
    readonly=True store=False string='Duration'
  • employee_id Many2one → hr.employee
    readonly=True args: 'hr.employee'
  • is_hatched Boolean
    readonly=True args: 'Hatched'
  • is_striked Boolean
    readonly=True args: 'Striked'
  • job_id Many2one → hr.job
    readonly=True args: 'hr.job'
  • name Char
    readonly=True string='Name'
  • start_datetime Datetime
    readonly=True string='From'
  • state Selection
    readonly=True args: [('draft', 'To Submit'), ('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
  • stop_datetime Datetime
    readonly=True string='To'
  • tz Selection
    readonly=True string='Timezone' args: _tz_get
Public methods (2)
  • get_unusual_days(self, date_from, date_to=None)
    @api.model
  • init(self)

New fields (29)
  • accrual_count Float
    compute='_compute_accrual_count' string='Accruals count'
  • accruals_ids One2many → hr.leave.accrual.plan
    args: 'hr.leave.accrual.plan', 'time_off_type_id'
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the time off type without removing it.' args: 'Active'
  • allocation_notif_subtype_id Many2one → mail.message.subtype
    default=<expr> string='Allocation Notification Subtype' args: 'mail.message.subtype'
  • allocation_validation_type Selection
    default='officer' string='Approval' args: [('no', 'No validation needed'), ('officer', 'Approved by Time Off Officer'), ('set', 'Set by Time Off Officer')]
  • color Integer
    help='The color selected here will be used in every screen with the time off type.' string='Color'
  • color_name Selection
    default='red' help='This color will be used in the time off summary located in Reporting > Time off by Department.' required=True string='Color in Report' args: [('red', 'Red'), ('blue', 'Blue'), ('lightgreen', 'Light Green'), ('lightblue', 'Light Blue'), ('lightyellow', 'Light Yellow'), ('magenta', 'Magenta'), ('lightcyan', 'Light Cyan'), ('black', 'Black'), ('lightpink', 'Light Pink'), ('brown', 'Brown'), ('violet', 'Violet'), ('lightcoral', 'Light Coral'), ('lightsalmon', 'Light Salmon'), ('lavender', 'Lavender'), ('wheat', 'Wheat'), ('ivory', 'Ivory')]
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • create_calendar_meeting Boolean
    default=True string='Display Time Off in Calendar'
  • employee_requests Selection
    default='no' required=True string='Employee Requests' args: [('yes', 'Extra Days Requests Allowed'), ('no', 'Not Allowed')]
  • group_days_allocation Float
    compute='_compute_group_days_allocation' string='Days Allocated'
  • group_days_leave Float
    compute='_compute_group_days_leave' string='Group Time Off'
  • has_valid_allocation Boolean
    compute='_compute_valid' help='This indicates if it is still possible to use this type of leave' search='_search_valid'
  • icon_id Many2one → ir.attachment
    domain="[('res_model', '=', 'hr.leave.type'), ('res_field', '=', 'icon_id')]" string='Cover Image' args: 'ir.attachment'
  • leave_notif_subtype_id Many2one → mail.message.subtype
    default=<expr> string='Time Off Notification Subtype' args: 'mail.message.subtype'
  • leave_validation_type Selection
    default='hr' string='Leave Validation' args: [('no_validation', 'No Validation'), ('hr', 'By Time Off Officer'), ('manager', "By Employee's Approver"), ('both', "By Employee's Approver and Time Off Officer")]
  • leaves_taken Float
    compute='_compute_leaves' help='This value is given by the sum of all time off requests with a negative value.' string='Time off Already Taken'
  • max_leaves Float
    compute='_compute_leaves' help='This value is given by the sum of all time off requests with a positive value.' search='_search_max_leaves' string='Maximum Allowed'
  • name Char
    required=True translate=True args: 'Time Off Type'
  • remaining_leaves Float
    compute='_compute_leaves' help='Maximum Time Off Allowed - Time Off Already Taken' string='Remaining Time Off'
  • request_unit Selection
    default='day' required=True string='Take Time Off in' args: [('day', 'Day'), ('half_day', 'Half Day'), ('hour', 'Hours')]
  • requires_allocation Selection
    default='yes' required=True string='Requires allocation' args: [('yes', 'Yes'), ('no', 'No Limit')]
  • responsible_id Many2one → res.users
    domain=<expr> help='Choose the Time Off Officer who will be notified to approve allocation or Time Off request' args: 'res.users', 'Responsible Time Off Officer'
  • sequence Integer
    default=100 help='The type with the smallest sequence is the default value in time off request'
  • support_document Boolean
    string='Supporting Document'
  • time_type Selection
    default='leave' help='Whether this should be computed as a holiday or as work time (eg: formation)' string='Kind of Leave' args: [('leave', 'Time Off'), ('other', 'Other')]
  • unpaid Boolean
    default=False args: 'Is Unpaid'
  • virtual_leaves_taken Float
    compute='_compute_leaves' help='Sum of validated and non validated time off requests.' string='Virtual Time Off Already Taken'
  • virtual_remaining_leaves Float
    compute='_compute_leaves' help='Maximum Time Off Allowed - Time Off Already Taken - Time Off Waiting Approval' search='_search_virtual_remaining_leaves' string='Virtual Remaining Time Off'
Public methods (6)
  • action_see_accrual_plans(self)
  • action_see_days_allocated(self)
  • action_see_group_leaves(self)
  • get_days_all_request(self)
    @api.model
  • get_employees_days(self, employee_ids, date=None)
  • name_get(self)

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • mail_partner_format(self)
    Override to add the current leave status.

New fields (10)
  • allocation_count Float
    related='employee_id.allocation_count'
  • allocation_display Char
    related='employee_id.allocation_display'
  • allocation_used_count Float
    related='employee_id.allocation_used_count'
  • allocation_used_display Char
    related='employee_id.allocation_used_display'
  • current_leave_state Selection
    related='employee_id.current_leave_state'
  • hr_icon_display Selection
    related='employee_id.hr_icon_display'
  • is_absent Boolean
    related='employee_id.is_absent'
  • leave_date_to Date
    related='employee_id.leave_date_to'
  • leave_manager_id Many2one
    related='employee_id.leave_manager_id'
  • show_leaves Boolean
    related='employee_id.show_leaves'
Public methods (1)
  • SELF_READABLE_FIELDS(self)
    @property

New fields (1)
  • holiday_id Many2one → hr.leave
    string='Leave Request' args: 'hr.leave'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/14.0/hr_holidays
VERSION
VERSION 1.5
CATEGORY
CATEGORYHuman Resources/Time Off
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Christophe Simonis, Xavier Morel, Joren Van Onder, Goffin Simon, Nicolas Martinelli, Nicolas Lempereur, Thibault Francois, Aaron Bohy, Pedro M. Baeza, Jeremy Kersten, GitHub, Barad Mahendra, Yannick Tivisse, Christophe Monniez, Nans Lefebvre, Alexandre Kühn, Xavier-Do, David Tran, jvm-odoo, Victor Feyens, Andrea Grazioso (agr-odoo), Paul Morelle, Sébastien Theys, Nasreddin (bon), alt-odoo, Julien Mougenot, fw-bot, Rémy Baranx (bar), Achraf (abz), Lucas Lefèvre, Adrien Widart, Ivan Yelizariev, Nasreddin Boulif (bon), Touati Djamel (otd), nie, IEL, Mathieu Duckerts-Antoine, jbm-odoo, Arnaud Joset, William Braeckman, Kevin Baptiste, Philippe Wauthy, Arnaud Baes, laa, Víctor Martínez, Florian Damhaut, MerlinGuillaume, Didier (did), Audric Onockx (auon), Michael Mattiello (mcm), Dossogne Bertrand, bve-odoo, Thomas Lefebvre (thle), Louis Wicket (wil), Tommy (tong), Tom De Caluwé, Anna Janiszewska, Simon Genin (ges)
WEBSITE
WEBSITEhttps://www.odoo.com/page/leaves
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:14:27
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - hr
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - resource
    - calendar
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage time off requests and allocations
=====================================

This application controls the time off schedule of your company. It allows employees to request time off. Then, managers can review requests for time off and approve or reject them. This way you can control the overall time off planning for the company or department.

You can configure several kinds of time off (sickness, paid days, ...) and allocate time off to an employee or department quickly using time off allocation. An employee can also make a request for more days off by making a new time off allocation. It will increase the total of available days for that time off type (if the request is accepted).

You can keep track of time off in different ways by following reports:

* Time Off Summary
* Time Off by Department
* Time Off Analysis

A synchronization with an internal agenda (Meetings of the CRM module) is also possible in order to automatically create a meeting when a time off request is accepted by setting up a type of meeting in time off Type.

Code Analysis

Views touched (49)
XML IDNameModelTypeStatus
assets_backend assets_backend ir.ui.view qweb Inherits web.assets_backend
edit_holiday_status_form hr.leave.type.form hr.leave.type form New
hr_department_view_kanban hr.department.kanban.inherit hr.department data Inherits hr.hr_department_view_kanban
hr_departure_wizard_view_form hr.departure.wizard.view.form.extend3 hr.departure.wizard xpath Inherits hr.hr_departure_wizard_view_form
hr_employee_public_form_view_inherit hr.employee.public.leave.form.inherit hr.employee.public xpath Inherits hr.hr_employee_public_view_form
hr_employee_view_search hr.employee.search.view.inherit hr.employee xpath Inherits hr.view_employee_filter
hr_holiday_status_view_kanban hr.leave.type.kanban hr.leave.type kanban New
hr_kanban_view_employees_kanban hr.employee.kanban.leaves.status hr.employee xpath Inherits hr.hr_kanban_view_employees
hr_kanban_view_public_employees_kanban hr.employee.public.kanban.leaves.status hr.employee.public xpath Inherits hr.hr_employee_public_view_kanban
hr_leave_allocation_view_activity hr.leave.allocation.view.activity hr.leave.allocation activity New
hr_leave_allocation_view_form hr.leave.allocation.view.form hr.leave.allocation form New
hr_leave_allocation_view_form_dashboard hr.leave.view.form.dashboard hr.leave.allocation xpath Inherits hr_holidays.hr_leave_allocation_view_form
hr_leave_allocation_view_form_manager hr.leave.allocation.view.form.manager hr.leave.allocation xpath Inherits hr_holidays.hr_leave_allocation_view_form
hr_leave_allocation_view_kanban hr.leave.allocation.view.kanban hr.leave.allocation kanban New
hr_leave_allocation_view_search_manager hr.leave.allocation.view.search.my hr.leave.allocation xpath Inherits view_hr_leave_allocation_filter
hr_leave_allocation_view_search_my hr.leave.allocation.view.search.my hr.leave.allocation xpath Inherits view_hr_leave_allocation_filter
hr_leave_allocation_view_tree hr.leave.allocation.view.tree hr.leave.allocation tree New
hr_leave_allocation_view_tree_my hr.leave.allocation.view.tree.my hr.leave.allocation xpath Inherits hr_leave_allocation_view_tree
hr_leave_report_calendar_view hr.leave.report.calendar.view hr.leave.report.calendar calendar New
hr_leave_report_calendar_view_form hr.leave.report.calendar.view.form hr.leave.report.calendar form New
hr_leave_report_kanban report.hr.holidays.report.leave_all.kanban hr.leave.report kanban New
hr_leave_report_tree report.hr.holidays.report.leave_all.tree hr.leave.report tree New
hr_leave_view_activity hr.leave.view.activity hr.leave activity New
hr_leave_view_calendar hr.leave.view.calendar hr.leave calendar New
hr_leave_view_dashboard hr.leave.view.dashboard hr.leave calendar New
hr_leave_view_form hr.leave.view.form hr.leave form New
hr_leave_view_form_dashboard hr.leave.view.form.dashboard hr.leave xpath Inherits hr_holidays.hr_leave_view_form
hr_leave_view_form_dashboard_new_time_off hr.leave.view.form.dashboard.new.time.off hr.leave xpath Inherits hr_holidays.hr_leave_view_form_dashboard
hr_leave_view_form_manager hr.leave.view.form.manager hr.leave div Inherits hr_leave_view_form
hr_leave_view_kanban hr.leave.view.kanban hr.leave kanban New
hr_leave_view_search_manager hr.holidays.view.search.manager hr.leave xpath Inherits view_hr_holidays_filter
hr_leave_view_search_my hr.holidays.view.search.my hr.leave xpath Inherits view_hr_holidays_filter
hr_leave_view_tree hr.holidays.view.tree hr.leave tree New
hr_leave_view_tree_my hr.holidays.view.tree hr.leave xpath Inherits hr_leave_view_tree
qunit_suite hr_holidays_qunit_suite ir.ui.view qweb Inherits web.qunit_suite_tests
report_holidayssummary report_holidayssummary ir.ui.view qweb New
res_users_view_form hr.user.preferences.view.form.leave.inherit res.users xpath Inherits hr.res_users_view_form_profile
resource_calendar_leave_form_inherit resource.calendar.leaves.form.inherit resource.calendar.leaves field Inherits resource.resource_calendar_leave_form
view_employee_form_leave_inherit hr.employee.leave.form.inherit hr.employee xpath Inherits hr.view_employee_form
view_employee_tree_inherit_leave hr.employee.tree.leave hr.employee xpath Inherits hr.view_employee_tree
view_evaluation_report_graph hr.holidays.graph hr.leave graph New
view_holiday_graph hr.holidays.report_graph hr.leave graph New
view_holiday_pivot hr.holidays.report_pivot hr.leave pivot New
view_holiday_status_normal_tree hr.leave.type.normal.tree hr.leave.type tree New
view_holidays_status_filter hr.leave.type.filter hr.leave.type search New
view_hr_holidays_filter hr.holidays.filter hr.leave search New
view_hr_holidays_filter_report hr.holidays.filter hr.leave.report search New
view_hr_holidays_summary_employee hr.holidays.summary.employee.form hr.holidays.summary.employee form New
view_hr_leave_allocation_filter hr.holidays.filter_allocations hr.leave.allocation search New
Models touched (17)

New fields (4)
  • absence_of_today Integer
    compute='_compute_leave_count' string='Absence by Today'
  • allocation_to_approve_count Integer
    compute='_compute_leave_count' string='Allocation to Approve'
  • leave_to_approve_count Integer
    compute='_compute_leave_count' string='Time Off to Approve'
  • total_employee Integer
    compute='_compute_total_employee' string='Total Employee'
Public methods (0)

No public methods.

New fields (1)
  • cancel_leaves Boolean
    default=True args: 'Cancel Future Leaves'
Public methods (1)
  • action_register_departure(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (14)
  • allocation_count Float
    compute='_compute_allocation_count' args: 'Total number of days allocated.'
  • allocation_display Char
    compute='_compute_allocation_count'
  • allocation_used_count Float
    compute='_compute_total_allocation_used' args: 'Total number of days off used'
  • allocation_used_display Char
    compute='_compute_total_allocation_used'
  • current_leave_id Many2one → hr.leave.type
    compute='_compute_leave_status' string='Current Time Off Type' args: 'hr.leave.type'
  • current_leave_state Selection
    compute='_compute_leave_status' selection=[('draft', 'New'), ('confirm', 'Waiting Approval'), ('refuse', 'Refused'), ('validate1', 'Waiting Second Approval'), ('validate', 'Approved'), ('cancel', 'Cancelled')] string='Current Time Off Status'
  • hr_icon_display Selection
    selection_add=[('presence_holiday_absent', 'On leave'), ('presence_holiday_present', 'Present but on leave')]
  • is_absent Boolean
    compute='_compute_leave_status' search='_search_absent_employee' args: 'Absent Today'
  • leave_date_from Date
    compute='_compute_leave_status' args: 'From Date'
  • leave_date_to Date
    compute='_compute_leave_status' args: 'To Date'
  • leave_manager_id Many2one → res.users
    compute='_compute_leave_manager' help='Select the user responsible for approving "Time Off" of this employee.\nIf empty, the approval is done by an Administrator or Approver (determined in settings/users).' readonly=False store=True string='Time Off' args: 'res.users'
  • leaves_count Float
    compute='_compute_remaining_leaves' args: 'Number of Time Off'
  • remaining_leaves Float
    compute='_compute_remaining_leaves' help='Total number of paid time off allocated to this employee, change this value to create allocation/time off request. Total based on all the time off types without overriding limit.' string='Remaining Paid Time Off'
  • show_leaves Boolean
    compute='_compute_show_leaves' args: 'Able to see Remaining Time Off'
Public methods (2)
  • create(self, values)
    @api.model
  • write(self, values)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • date_from Date
    default=<expr> required=True string='From'
  • emp Many2many → hr.employee
    string='Employee(s)' args: 'hr.employee', 'summary_emp_rel', 'sum_id', 'emp_id'
  • holiday_type Selection
    default='Approved' required=True string='Select Time Off Type' args: [('Approved', 'Approved'), ('Confirmed', 'Confirmed'), ('both', 'Both Approved and Confirmed')]
Public methods (1)
  • print_report(self)

New fields (40)
  • can_approve Boolean
    compute='_compute_can_approve' args: 'Can Approve'
  • can_reset Boolean
    compute='_compute_can_reset' args: 'Can reset'
  • category_id Many2one → hr.employee.category
    compute='_compute_from_holiday_type' help='Category of Employee' states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} store=True string='Employee Tag' args: 'hr.employee.category'
  • date_from Datetime
    compute='_compute_date_from_to' copy=False index=True readonly=False required=True states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True tracking=True args: 'Start Date'
  • date_to Datetime
    compute='_compute_date_from_to' copy=False readonly=False required=True states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True tracking=True args: 'End Date'
  • department_id Many2one → hr.department
    compute='_compute_department_id' readonly=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Department' args: 'hr.department'
  • duration_display Char
    compute='_compute_duration_display' help='Field allowing to see the leave request duration in days or hours depending on the leave_type_request_unit' store=True args: 'Requested (Days/Hours)'
  • employee_id Many2one → hr.employee
    compute='_compute_from_holiday_type' index=True ondelete='restrict' readonly=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Employee' tracking=True args: 'hr.employee'
  • first_approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validate the time off' readonly=True string='First Approval' args: 'hr.employee'
  • holiday_status_id Many2one → hr.leave.type
    compute='_compute_from_employee_id' domain=[('valid', '=', True)] readonly=False required=True states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Time Off Type' args: 'hr.leave.type'
  • holiday_type Selection
    default='employee' help='By Employee: Allocation/Request for individual Employee, By Employee Tag: Allocation/Request for group of employees in category' readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Allocation Mode' args: [('employee', 'By Employee'), ('company', 'By Company'), ('department', 'By Department'), ('category', 'By Employee Tag')]
  • leave_type_request_unit Selection
    readonly=True related='holiday_status_id.request_unit'
  • linked_request_ids One2many → hr.leave
    string='Linked Requests' args: 'hr.leave', 'parent_id'
  • manager_id Many2one → hr.employee
    compute='_compute_from_employee_id' readonly=False store=True args: 'hr.employee'
  • meeting_id Many2one → calendar.event
    copy=False string='Meeting' args: 'calendar.event'
  • mode_company_id Many2one → res.company
    compute='_compute_from_holiday_type' states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} store=True string='Company Mode' args: 'res.company'
  • name Char
    compute='_compute_description' compute_sudo=False inverse='_inverse_description' search='_search_description' args: 'Description'
  • notes Text
    readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'Reasons'
  • number_of_days Float
    compute='_compute_number_of_days' copy=False help='Number of days of the time off request. Used in the calculation. To manually correct the duration, use this field.' readonly=False store=True tracking=True args: 'Duration (Days)'
  • number_of_days_display Float
    compute='_compute_number_of_days_display' help='Number of days of the time off request according to your working schedule. Used for interface.' readonly=True args: 'Duration in days'
  • number_of_hours_display Float
    compute='_compute_number_of_hours_display' help='Number of hours of the time off request according to your working schedule. Used for interface.' readonly=True args: 'Duration in hours'
  • number_of_hours_text Char
    compute='_compute_number_of_hours_text'
  • parent_id Many2one → hr.leave
    copy=False string='Parent' args: 'hr.leave'
  • payslip_status Boolean
    copy=False help='Green this button when the time off has been taken into account in the payslip.' args: 'Reported in last payslips'
  • private_name Char
    groups='hr_holidays.group_hr_holidays_user' args: 'Time Off Description'
  • report_note Text
    copy=False groups='hr_holidays.group_hr_holidays_manager' args: 'HR Comments'
  • request_date_from Date
    args: 'Request Start Date'
  • request_date_from_period Selection
    default='am' string='Date Period Start' args: [('am', 'Morning'), ('pm', 'Afternoon')]
  • request_date_to Date
    args: 'Request End Date'
  • request_hour_from Selection
    string='Hour from' args: [('0', '12:00 AM'), ('0.5', '12:30 AM'), ('1', '1:00 AM'), ('1.5', '1:30 AM'), ('2', '2:00 AM'), ('2.5', '2:30 AM'), ('3', '3:00 AM'), ('3.5', '3:30 AM'), ('4', '4:00 AM'), ('4.5', '4:30 AM'), ('5', '5:00 AM'), ('5.5', '5:30 AM'), ('6', '6:00 AM'), ('6.5', '6:30 AM'), ('7', '7:00 AM'), ('7.5', '7:30 AM'), ('8', '8:00 AM'), ('8.5', '8:30 AM'), ('9', '9:00 AM'), ('9.5', '9:30 AM'), ('10', '10:00 AM'), ('10.5', '10:30 AM'), ('11', '11:00 AM'), ('11.5', '11:30 AM'), ('12', '12:00 PM'), ('12.5', '12:30 PM'), ('13', '1:00 PM'), ('13.5', '1:30 PM'), ('14', '2:00 PM'), ('14.5', '2:30 PM'), ('15', '3:00 PM'), ('15.5', '3:30 PM'), ('16', '4:00 PM'), ('16.5', '4:30 PM'), ('17', '5:00 PM'), ('17.5', '5:30 PM'), ('18', '6:00 PM'), ('18.5', '6:30 PM'), ('19', '7:00 PM'), ('19.5', '7:30 PM'), ('20', '8:00 PM'), ('20.5', '8:30 PM'), ('21', '9:00 PM'), ('21.5', '9:30 PM'), ('22', '10:00 PM'), ('22.5', '10:30 PM'), ('23', '11:00 PM'), ('23.5', '11:30 PM')]
  • request_hour_to Selection
    string='Hour to' args: [('0', '12:00 AM'), ('0.5', '12:30 AM'), ('1', '1:00 AM'), ('1.5', '1:30 AM'), ('2', '2:00 AM'), ('2.5', '2:30 AM'), ('3', '3:00 AM'), ('3.5', '3:30 AM'), ('4', '4:00 AM'), ('4.5', '4:30 AM'), ('5', '5:00 AM'), ('5.5', '5:30 AM'), ('6', '6:00 AM'), ('6.5', '6:30 AM'), ('7', '7:00 AM'), ('7.5', '7:30 AM'), ('8', '8:00 AM'), ('8.5', '8:30 AM'), ('9', '9:00 AM'), ('9.5', '9:30 AM'), ('10', '10:00 AM'), ('10.5', '10:30 AM'), ('11', '11:00 AM'), ('11.5', '11:30 AM'), ('12', '12:00 PM'), ('12.5', '12:30 PM'), ('13', '1:00 PM'), ('13.5', '1:30 PM'), ('14', '2:00 PM'), ('14.5', '2:30 PM'), ('15', '3:00 PM'), ('15.5', '3:30 PM'), ('16', '4:00 PM'), ('16.5', '4:30 PM'), ('17', '5:00 PM'), ('17.5', '5:30 PM'), ('18', '6:00 PM'), ('18.5', '6:30 PM'), ('19', '7:00 PM'), ('19.5', '7:30 PM'), ('20', '8:00 PM'), ('20.5', '8:30 PM'), ('21', '9:00 PM'), ('21.5', '9:30 PM'), ('22', '10:00 PM'), ('22.5', '10:30 PM'), ('23', '11:00 PM'), ('23.5', '11:30 PM')]
  • request_unit_custom Boolean
    compute='_compute_request_unit_custom' readonly=False store=True args: 'Days-long custom hours'
  • request_unit_half Boolean
    compute='_compute_request_unit_half' readonly=False store=True args: 'Half Day'
  • request_unit_hours Boolean
    compute='_compute_request_unit_hours' readonly=False store=True args: 'Custom Hours'
  • second_approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validate the time off with second level (If time off type need second validation)' readonly=True string='Second Approval' args: 'hr.employee'
  • state Selection
    compute='_compute_state' copy=False help=<expr> readonly=False store=True string='Status' tracking=True args: [('draft', 'To Submit'), ('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
  • tz Selection
    compute='_compute_tz' args: _tz_get
  • tz_mismatch Boolean
    compute='_compute_tz_mismatch'
  • user_id Many2one → res.users
    compute_sudo=True default=<expr> readonly=True related='employee_id.user_id' related_sudo=True store=True string='User' args: 'res.users'
  • validation_type Selection
    readonly=False related='holiday_status_id.leave_validation_type' string='Validation Type'
Public methods (16)
  • action_approve(self)
  • action_confirm(self)
  • action_draft(self)
  • action_refuse(self)
  • action_validate(self)
  • activity_update(self)
  • add_follower(self, employee_id)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
    Override to avoid automatic logging of creation
  • default_get(self, fields_list)
    @api.model
  • get_unusual_days(self, date_from, date_to=None)
    @api.model
  • message_subscribe(self, partner_ids=None, channel_ids=None, subtype_ids=None)
  • name_get(self)
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
  • unlink(self)
  • write(self, values)

New fields (34)
  • accrual_limit Integer
    default=0 help='Maximum of allocation for accrual; 0 means no maximum.' args: 'Balance limit'
  • allocation_type Selection
    default='regular' readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Allocation Type' args: [('regular', 'Regular Allocation'), ('accrual', 'Accrual Allocation')]
  • can_approve Boolean
    compute='_compute_can_approve' args: 'Can Approve'
  • can_reset Boolean
    compute='_compute_can_reset' args: 'Can reset'
  • category_id Many2one → hr.employee.category
    compute='_compute_from_holiday_type' readonly=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Employee Tag' args: 'hr.employee.category'
  • date_from Datetime
    copy=False default=fields.Date.context_today index=True readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} tracking=True args: 'Start Date'
  • date_to Datetime
    compute='_compute_from_holiday_status_id' copy=False readonly=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True tracking=True args: 'End Date'
  • department_id Many2one → hr.department
    compute='_compute_department_id' states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} store=True string='Department' args: 'hr.department'
  • duration_display Char
    compute='_compute_duration_display' help='Field allowing to see the allocation duration in days or hours depending on the type_request_unit' args: 'Allocated (Days/Hours)'
  • employee_id Many2one → hr.employee
    compute='_compute_from_holiday_type' index=True ondelete='restrict' readonly=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Employee' tracking=True args: 'hr.employee'
  • first_approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validates the allocation' readonly=True string='First Approval' args: 'hr.employee'
  • holiday_status_id Many2one → hr.leave.type
    compute='_compute_from_employee_id' domain=_holiday_status_id_domain readonly=False required=True states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Time Off Type' args: 'hr.leave.type'
  • holiday_type Selection
    default='employee' help='Allow to create requests in batchs:\n- By Employee: for a specific employee\n- By Company: all employees of the specified company\n- By Department: all employees of the specified department\n- By Employee Tag: all employees of the specific employee group category' readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Allocation Mode' args: [('employee', 'By Employee'), ('company', 'By Company'), ('department', 'By Department'), ('category', 'By Employee Tag')]
  • interval_number Integer
    compute='_compute_from_holiday_status_id' readonly=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True args: 'Number of unit between two intervals'
  • interval_unit Selection
    compute='_compute_from_holiday_status_id' readonly=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Unit of time between two intervals' args: [('days', 'Days'), ('weeks', 'Weeks'), ('months', 'Months'), ('years', 'Years')]
  • leaves_taken Float
    compute='_compute_leaves'
  • linked_request_ids One2many → hr.leave.allocation
    string='Linked Requests' args: 'hr.leave.allocation', 'parent_id'
  • manager_id Many2one → hr.employee
    compute='_compute_from_employee_id' store=True string='Manager' args: 'hr.employee'
  • max_leaves Float
    compute='_compute_leaves'
  • mode_company_id Many2one → res.company
    compute='_compute_from_holiday_type' readonly=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Company Mode' args: 'res.company'
  • name Char
    compute='_compute_description' compute_sudo=False inverse='_inverse_description' search='_search_description' args: 'Description'
  • nextcall Date
    default=False readonly=True args: 'Date of the next accrual allocation'
  • notes Text
    readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'Reasons'
  • number_of_days Float
    compute='_compute_from_holiday_status_id' default=1 help='Duration in days. Reference field to use when necessary.' readonly=False store=True tracking=True args: 'Number of Days'
  • number_of_days_display Float
    compute='_compute_number_of_days_display' help="If Accrual Allocation: Number of days allocated in addition to the ones you will get via the accrual' system." states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'Duration (days)'
  • number_of_hours_display Float
    compute='_compute_number_of_hours_display' help="If Accrual Allocation: Number of hours allocated in addition to the ones you will get via the accrual' system." args: 'Duration (hours)'
  • number_per_interval Float
    compute='_compute_from_holiday_status_id' readonly=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True args: 'Number of unit per interval'
  • parent_id Many2one → hr.leave.allocation
    string='Parent' args: 'hr.leave.allocation'
  • private_name Char
    groups='hr_holidays.group_hr_holidays_user' args: 'Allocation Description'
  • second_approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validates the allocation with second level (If allocation type need second validation)' readonly=True string='Second Approval' args: 'hr.employee'
  • state Selection
    copy=False default='confirm' help=<expr> readonly=True string='Status' tracking=True args: [('draft', 'To Submit'), ('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
  • type_request_unit Selection
    readonly=True related='holiday_status_id.request_unit'
  • unit_per_interval Selection
    compute='_compute_from_holiday_status_id' readonly=False states={'cancel': [('readonly', True)], 'refuse': [('readonly', True)], 'validate1': [('readonly', True)], 'validate': [('readonly', True)]} store=True string='Unit of time added at each interval' args: [('hours', 'Hours'), ('days', 'Days')]
  • validation_type Selection
    readonly=True related='holiday_status_id.allocation_validation_type' string='Validation Type'
Public methods (12)
  • action_approve(self)
  • action_confirm(self)
  • action_draft(self)
  • action_refuse(self)
  • action_validate(self)
  • activity_update(self)
  • add_follower(self, employee_id)
  • create(self, values)
    @api.model
    Override to avoid automatic logging of creation
  • message_subscribe(self, partner_ids=None, channel_ids=None, subtype_ids=None)
  • name_get(self)
  • unlink(self)
  • write(self, values)

New fields (12)
  • category_id Many2one → hr.employee.category
    readonly=True string='Employee Tag' args: 'hr.employee.category'
  • date_from Datetime
    readonly=True args: 'Start Date'
  • date_to Datetime
    readonly=True args: 'End Date'
  • department_id Many2one → hr.department
    readonly=True string='Department' args: 'hr.department'
  • employee_id Many2one → hr.employee
    readonly=True string='Employee' args: 'hr.employee'
  • holiday_status_id Many2one → hr.leave.type
    readonly=True string='Leave Type' args: 'hr.leave.type'
  • holiday_type Selection
    readonly=True string='Allocation Mode' args: [('employee', 'By Employee'), ('category', 'By Employee Tag')]
  • leave_type Selection
    readonly=True string='Request Type' args: [('allocation', 'Allocation'), ('request', 'Time Off')]
  • name Char
    readonly=True args: 'Description'
  • number_of_days Float
    readonly=True args: 'Number of Days'
  • payslip_status Boolean
    readonly=True args: 'Reported in last payslips'
  • state Selection
    readonly=True string='Status' args: [('draft', 'To Submit'), ('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
Public methods (3)
  • action_time_off_analysis(self)
    @api.model
  • init(self)
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model

New fields (8)
  • company_id Many2one → res.company
    readonly=True args: 'res.company'
  • duration Float
    readonly=True store=False string='Duration'
  • employee_id Many2one → hr.employee
    readonly=True args: 'hr.employee'
  • name Char
    readonly=True string='Name'
  • start_datetime Datetime
    readonly=True string='From'
  • state Selection
    readonly=True args: [('draft', 'To Submit'), ('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
  • stop_datetime Datetime
    readonly=True string='To'
  • tz Selection
    readonly=True string='Timezone' args: _tz_get
Public methods (2)
  • get_unusual_days(self, date_from, date_to=None)
    @api.model
  • init(self)

New fields (26)
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the time off type without removing it.' args: 'Active'
  • allocation_notif_subtype_id Many2one → mail.message.subtype
    default=<expr> string='Allocation Notification Subtype' args: 'mail.message.subtype'
  • allocation_type Selection
    default='no' help='\tNo Limit: no allocation by default, users can freely request time off; \tAllow Employees Requests: allocated by HR and users can request time off and allocations; \tSet by Time Off Officer: allocated by HR and cannot be bypassed; users can request time off;' string='Mode' args: [('no', 'No Limit'), ('fixed_allocation', 'Allow Employees Requests'), ('fixed', 'Set by Time Off Officer')]
  • allocation_validation_type Selection
    default='manager' string='Allocation Validation' args: [('hr', 'By Time Off Officer'), ('manager', "By Employee's Manager"), ('both', "By Employee's Manager and Time Off Officer")]
  • code Char
    args: 'Code'
  • color_name Selection
    default='red' help='This color will be used in the time off summary located in Reporting > Time off by Department.' required=True string='Color in Report' args: [('red', 'Red'), ('blue', 'Blue'), ('lightgreen', 'Light Green'), ('lightblue', 'Light Blue'), ('lightyellow', 'Light Yellow'), ('magenta', 'Magenta'), ('lightcyan', 'Light Cyan'), ('black', 'Black'), ('lightpink', 'Light Pink'), ('brown', 'Brown'), ('violet', 'Violet'), ('lightcoral', 'Light Coral'), ('lightsalmon', 'Light Salmon'), ('lavender', 'Lavender'), ('wheat', 'Wheat'), ('ivory', 'Ivory')]
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • create_calendar_meeting Boolean
    default=True string='Display Time Off in Calendar'
  • group_days_allocation Float
    compute='_compute_group_days_allocation' string='Days Allocated'
  • group_days_leave Float
    compute='_compute_group_days_leave' string='Group Time Off'
  • leave_notif_subtype_id Many2one → mail.message.subtype
    default=<expr> string='Time Off Notification Subtype' args: 'mail.message.subtype'
  • leave_validation_type Selection
    default='hr' string='Leave Validation' args: [('no_validation', 'No Validation'), ('hr', 'By Time Off Officer'), ('manager', "By Employee's Manager"), ('both', "By Employee's Manager and Time Off Officer")]
  • leaves_taken Float
    compute='_compute_leaves' help='This value is given by the sum of all time off requests with a negative value.' string='Time off Already Taken'
  • max_leaves Float
    compute='_compute_leaves' help='This value is given by the sum of all time off requests with a positive value.' search='_search_max_leaves' string='Maximum Allowed'
  • name Char
    required=True translate=True args: 'Time Off Type'
  • remaining_leaves Float
    compute='_compute_leaves' help='Maximum Time Off Allowed - Time Off Already Taken' string='Remaining Time Off'
  • request_unit Selection
    default='day' required=True string='Take Time Off in' args: [('day', 'Day'), ('half_day', 'Half Day'), ('hour', 'Hours')]
  • responsible_id Many2one → res.users
    domain=<expr> help="This user will be responsible for approving this type of time off. This is only used when validation is 'By Time Off Officer' or 'By Employee's Manager and Time Off Officer'" args: 'res.users', 'Responsible'
  • sequence Integer
    default=100 help='The type with the smallest sequence is the default value in time off request'
  • time_type Selection
    default='leave' help='Whether this should be computed as a holiday or as work time (eg: formation)' string='Kind of Leave' args: [('leave', 'Time Off'), ('other', 'Other')]
  • unpaid Boolean
    default=False args: 'Is Unpaid'
  • valid Boolean
    compute='_compute_valid' help='This indicates if it is still possible to use this type of leave' search='_search_valid'
  • validity_start Date
    help='Adding validity to types of time off so that it cannot be selected outside this time period' args: 'From'
  • validity_stop Date
    args: 'To'
  • virtual_leaves_taken Float
    compute='_compute_leaves' help='Sum of validated and non validated time off requests.' string='Virtual Time Off Already Taken'
  • virtual_remaining_leaves Float
    compute='_compute_leaves' help='Maximum Time Off Allowed - Time Off Already Taken - Time Off Waiting Approval' search='_search_virtual_remaining_leaves' string='Virtual Remaining Time Off'
Public methods (6)
  • action_see_days_allocated(self)
  • action_see_group_leaves(self)
  • get_days(self, employee_id)
  • get_days_all_request(self)
    @api.model
  • get_employees_days(self, employee_ids)
  • name_get(self)

New fields (0)

No new fields.

Public methods (1)
  • partner_info(self, all_partners, direct_partners)

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals)
    @api.model
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (10)
  • allocation_count Float
    related='employee_id.allocation_count'
  • allocation_display Char
    related='employee_id.allocation_display'
  • allocation_used_count Float
    related='employee_id.allocation_used_count'
  • allocation_used_display Char
    related='employee_id.allocation_used_display'
  • current_leave_state Selection
    related='employee_id.current_leave_state'
  • hr_icon_display Selection
    related='employee_id.hr_icon_display'
  • is_absent Boolean
    related='employee_id.is_absent'
  • leave_date_to Date
    related='employee_id.leave_date_to'
  • leave_manager_id Many2one
    related='employee_id.leave_manager_id'
  • show_leaves Boolean
    related='employee_id.show_leaves'
Public methods (0)

No public methods.

New fields (1)
  • holiday_id Many2one → hr.leave
    string='Leave Request' args: 'hr.leave'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/13.0/hr_holidays
VERSION
VERSION 1.5
CATEGORY
CATEGORYHuman Resources/Time Off
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Joren Van Onder, Goffin Simon, Nicolas Martinelli, Nicolas Lempereur, Thibault Francois, GitHub, Lucas Perais (lpe), Damien Bouvy, Barad Mahendra, Yannick Tivisse, Martin Geubelle, Odoo Online, Nicolas Seinlet, Jigar Patel, RomainLibert, Christophe Monniez, Jorge Pinna Puissant, Nans Lefebvre, Alexandre Kühn, Toufik Ben Jaa, Adrian Torres, XavierDo, Xavier-Do, David Tran, Romeo Fragomeli, jvm-odoo, Andrea Grazioso (agr-odoo), Enric Tobella, Sébastien Theys, alt-odoo, fw-bot, Lucas Lefèvre, Touati Djamel (otd), jbm-odoo, William Braeckman, Kevin Baptiste, Philippe Wauthy, Víctor Martínez, Florian Damhaut
WEBSITE
WEBSITEhttps://www.odoo.com/page/leaves
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:06:41
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - hr
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - resource
    - mail_bot
    - calendar
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage time off requests and allocations
=====================================

This application controls the time off schedule of your company. It allows employees to request time off. Then, managers can review requests for time off and approve or reject them. This way you can control the overall time off planning for the company or department.

You can configure several kinds of time off (sickness, paid days, ...) and allocate time off to an employee or department quickly using time off allocation. An employee can also make a request for more days off by making a new time off allocation. It will increase the total of available days for that time off type (if the request is accepted).

You can keep track of time off in different ways by following reports:

* Time Off Summary
* Time Off by Department
* Time Off Analysis

A synchronization with an internal agenda (Meetings of the CRM module) is also possible in order to automatically create a meeting when a time off request is accepted by setting up a type of meeting in time off Type.

Code Analysis

Views touched (40)
XML IDNameModelTypeStatus
assets_backend assets_backend ir.ui.view qweb Inherits web.assets_backend
edit_holiday_status_form hr.leave.type.form hr.leave.type form New
hr_department_view_kanban hr.department.kanban.inherit hr.department data Inherits hr.hr_department_view_kanban
hr_employee_public_form_view_inherit hr.employee.public.leave.form.inherit hr.employee.public xpath Inherits hr.hr_employee_public_view_form
hr_employee_view_search hr.employee.search.view.inherit hr.employee xpath Inherits hr.view_employee_filter
hr_holiday_status_view_kanban hr.leave.type.kanban hr.leave.type kanban New
hr_kanban_view_employees_kanban hr.employee.kanban.leaves.status hr.employee xpath Inherits hr.hr_kanban_view_employees
hr_leave_allocation_view_activity hr.leave.allocation.view.activity hr.leave.allocation activity New
hr_leave_allocation_view_form hr.leave.allocation.view.form hr.leave.allocation form New
hr_leave_allocation_view_form_dashboard hr.leave.view.form.dashboard hr.leave.allocation xpath Inherits hr_holidays.hr_leave_allocation_view_form
hr_leave_allocation_view_form_manager hr.leave.allocation.view.form.manager hr.leave.allocation xpath Inherits hr_holidays.hr_leave_allocation_view_form
hr_leave_allocation_view_kanban hr.leave.allocation.view.kanban hr.leave.allocation kanban New
hr_leave_allocation_view_tree hr.leave.allocation.view.tree hr.leave.allocation tree New
hr_leave_allocation_view_tree_my hr.leave.allocation.view.tree.my hr.leave.allocation xpath Inherits hr_leave_allocation_view_tree
hr_leave_report_kanban report.hr.holidays.report.leave_all.kanban hr.leave.report kanban New
hr_leave_report_tree report.hr.holidays.report.leave_all.tree hr.leave.report tree New
hr_leave_view_activity hr.leave.view.activity hr.leave activity New
hr_leave_view_calendar hr.leave.view.calendar hr.leave calendar New
hr_leave_view_dashboard hr.leave.view.dashboard hr.leave calendar New
hr_leave_view_form hr.leave.view.form hr.leave form New
hr_leave_view_form_dashboard hr.leave.view.form.dashboard hr.leave xpath Inherits hr_holidays.hr_leave_view_form
hr_leave_view_form_manager hr.leave.view.form.manager hr.leave div Inherits hr_leave_view_form
hr_leave_view_form_manager_approve hr.leave.view.form.manager.approve hr.leave div Inherits hr_leave_view_form
hr_leave_view_kanban hr.leave.view.kanban hr.leave kanban New
hr_leave_view_tree hr.holidays.view.tree hr.leave tree New
hr_leave_view_tree_my hr.holidays.view.tree hr.leave xpath Inherits hr_leave_view_tree
qunit_suite hr_holidays_qunit_suite ir.ui.view qweb Inherits web.qunit_suite
report_holidayssummary report_holidayssummary ir.ui.view qweb New
res_users_view_form hr.user.preferences.view.form.leave.inherit res.users button Inherits hr.res_users_view_form_profile
resource_calendar_leave_form_inherit resource.calendar.leaves.form.inherit resource.calendar.leaves field Inherits resource.resource_calendar_leave_form
view_employee_form_leave_inherit hr.employee.leave.form.inherit hr.employee xpath Inherits hr.view_employee_form
view_evaluation_report_graph hr.holidays.graph hr.leave graph New
view_holiday_graph hr.holidays.report_graph hr.leave graph New
view_holiday_pivot hr.holidays.report_pivot hr.leave pivot New
view_holiday_status_normal_tree hr.leave.type.normal.tree hr.leave.type tree New
view_holidays_status_filter hr.leave.type.filter hr.leave.type search New
view_hr_holidays_filter hr.holidays.filter hr.leave search New
view_hr_holidays_filter_report hr.holidays.filter hr.leave.report search New
view_hr_holidays_summary_employee hr.holidays.summary.employee.form hr.holidays.summary.employee form New
view_hr_leave_allocation_filter hr.holidays.filter_allocations hr.leave.allocation search New
Models touched (15)

New fields (4)
  • absence_of_today Integer
    compute='_compute_leave_count' string='Absence by Today'
  • allocation_to_approve_count Integer
    compute='_compute_leave_count' string='Allocation to Approve'
  • leave_to_approve_count Integer
    compute='_compute_leave_count' string='Time Off to Approve'
  • total_employee Integer
    compute='_compute_total_employee' string='Total Employee'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (13)
  • allocation_count Float
    compute='_compute_allocation_count' args: 'Total number of days allocated.'
  • allocation_display Char
    compute='_compute_allocation_count'
  • allocation_used_count Float
    compute='_compute_total_allocation_used' args: 'Total number of days off used'
  • allocation_used_display Char
    compute='_compute_total_allocation_used'
  • current_leave_id Many2one → hr.leave.type
    compute='_compute_leave_status' string='Current Time Off Type' args: 'hr.leave.type'
  • current_leave_state Selection
    compute='_compute_leave_status' selection=[('draft', 'New'), ('confirm', 'Waiting Approval'), ('refuse', 'Refused'), ('validate1', 'Waiting Second Approval'), ('validate', 'Approved'), ('cancel', 'Cancelled')] string='Current Time Off Status'
  • is_absent Boolean
    compute='_compute_leave_status' search='_search_absent_employee' args: 'Absent Today'
  • leave_date_from Date
    compute='_compute_leave_status' args: 'From Date'
  • leave_date_to Date
    compute='_compute_leave_status' args: 'To Date'
  • leave_manager_id Many2one → res.users
    help='User responsible of leaves approval.' string='Time Off' args: 'res.users'
  • leaves_count Float
    compute='_compute_remaining_leaves' args: 'Number of Time Off'
  • remaining_leaves Float
    compute='_compute_remaining_leaves' help='Total number of paid time off allocated to this employee, change this value to create allocation/time off request. Total based on all the time off types without overriding limit.' string='Remaining Paid Time Off'
  • show_leaves Boolean
    compute='_compute_show_leaves' args: 'Able to see Remaining Time Off'
Public methods (2)
  • create(self, values)
    @api.model
  • write(self, values)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • date_from Date
    default=<expr> required=True string='From'
  • emp Many2many → hr.employee
    string='Employee(s)' args: 'hr.employee', 'summary_emp_rel', 'sum_id', 'emp_id'
  • holiday_type Selection
    default='Approved' required=True string='Select Time Off Type' args: [('Approved', 'Approved'), ('Confirmed', 'Confirmed'), ('both', 'Both Approved and Confirmed')]
Public methods (1)
  • print_report(self)

New fields (38)
  • can_approve Boolean
    compute='_compute_can_approve' args: 'Can Approve'
  • can_reset Boolean
    compute='_compute_can_reset' args: 'Can reset'
  • category_id Many2one → hr.employee.category
    help='Category of Employee' readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Employee Tag' args: 'hr.employee.category'
  • date_from Datetime
    copy=False default=fields.Datetime.now index=True readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} tracking=True args: 'Start Date'
  • date_to Datetime
    copy=False default=fields.Datetime.now readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} tracking=True args: 'End Date'
  • department_id Many2one → hr.department
    readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Department' args: 'hr.department'
  • duration_display Char
    compute='_compute_duration_display' help='Field allowing to see the leave request duration in days or hours depending on the leave_type_request_unit' args: 'Requested (Days/Hours)'
  • employee_id Many2one → hr.employee
    default=_default_employee domain=_employee_id_domain index=True ondelete='restrict' readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Employee' tracking=True args: 'hr.employee'
  • first_approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validate the time off' readonly=True string='First Approval' args: 'hr.employee'
  • holiday_status_id Many2one → hr.leave.type
    domain=[('valid', '=', True)] readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Time Off Type' args: 'hr.leave.type'
  • holiday_type Selection
    default='employee' help='By Employee: Allocation/Request for individual Employee, By Employee Tag: Allocation/Request for group of employees in category' readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Allocation Mode' args: [('employee', 'By Employee'), ('company', 'By Company'), ('department', 'By Department'), ('category', 'By Employee Tag')]
  • leave_type_request_unit Selection
    readonly=True related='holiday_status_id.request_unit'
  • linked_request_ids One2many → hr.leave
    string='Linked Requests' args: 'hr.leave', 'parent_id'
  • manager_id Many2one → hr.employee
    args: 'hr.employee'
  • meeting_id Many2one → calendar.event
    copy=False string='Meeting' args: 'calendar.event'
  • mode_company_id Many2one → res.company
    readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Company' args: 'res.company'
  • name Char
    args: 'Description'
  • notes Text
    readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'Reasons'
  • number_of_days Float
    copy=False help='Number of days of the time off request. Used in the calculation. To manually correct the duration, use this field.' tracking=True args: 'Duration (Days)'
  • number_of_days_display Float
    compute='_compute_number_of_days_display' help='Number of days of the time off request according to your working schedule. Used for interface.' readonly=True args: 'Duration in days'
  • number_of_hours_display Float
    compute='_compute_number_of_hours_display' help='Number of hours of the time off request according to your working schedule. Used for interface.' readonly=True args: 'Duration in hours'
  • parent_id Many2one → hr.leave
    copy=False string='Parent' args: 'hr.leave'
  • payslip_status Boolean
    copy=False help='Green this button when the time off has been taken into account in the payslip.' args: 'Reported in last payslips'
  • report_note Text
    copy=False groups='hr_holidays.group_hr_holidays_manager' args: 'HR Comments'
  • request_date_from Date
    args: 'Request Start Date'
  • request_date_from_period Selection
    default='am' string='Date Period Start' args: [('am', 'Morning'), ('pm', 'Afternoon')]
  • request_date_to Date
    args: 'Request End Date'
  • request_hour_from Selection
    string='Hour from' args: [('0', '12:00 AM'), ('0.5', '0:30 AM'), ('1', '1:00 AM'), ('1.5', '1:30 AM'), ('2', '2:00 AM'), ('2.5', '2:30 AM'), ('3', '3:00 AM'), ('3.5', '3:30 AM'), ('4', '4:00 AM'), ('4.5', '4:30 AM'), ('5', '5:00 AM'), ('5.5', '5:30 AM'), ('6', '6:00 AM'), ('6.5', '6:30 AM'), ('7', '7:00 AM'), ('7.5', '7:30 AM'), ('8', '8:00 AM'), ('8.5', '8:30 AM'), ('9', '9:00 AM'), ('9.5', '9:30 AM'), ('10', '10:00 AM'), ('10.5', '10:30 AM'), ('11', '11:00 AM'), ('11.5', '11:30 AM'), ('12', '12:00 PM'), ('12.5', '0:30 PM'), ('13', '1:00 PM'), ('13.5', '1:30 PM'), ('14', '2:00 PM'), ('14.5', '2:30 PM'), ('15', '3:00 PM'), ('15.5', '3:30 PM'), ('16', '4:00 PM'), ('16.5', '4:30 PM'), ('17', '5:00 PM'), ('17.5', '5:30 PM'), ('18', '6:00 PM'), ('18.5', '6:30 PM'), ('19', '7:00 PM'), ('19.5', '7:30 PM'), ('20', '8:00 PM'), ('20.5', '8:30 PM'), ('21', '9:00 PM'), ('21.5', '9:30 PM'), ('22', '10:00 PM'), ('22.5', '10:30 PM'), ('23', '11:00 PM'), ('23.5', '11:30 PM')]
  • request_hour_to Selection
    string='Hour to' args: [('0', '12:00 AM'), ('0.5', '0:30 AM'), ('1', '1:00 AM'), ('1.5', '1:30 AM'), ('2', '2:00 AM'), ('2.5', '2:30 AM'), ('3', '3:00 AM'), ('3.5', '3:30 AM'), ('4', '4:00 AM'), ('4.5', '4:30 AM'), ('5', '5:00 AM'), ('5.5', '5:30 AM'), ('6', '6:00 AM'), ('6.5', '6:30 AM'), ('7', '7:00 AM'), ('7.5', '7:30 AM'), ('8', '8:00 AM'), ('8.5', '8:30 AM'), ('9', '9:00 AM'), ('9.5', '9:30 AM'), ('10', '10:00 AM'), ('10.5', '10:30 AM'), ('11', '11:00 AM'), ('11.5', '11:30 AM'), ('12', '12:00 PM'), ('12.5', '0:30 PM'), ('13', '1:00 PM'), ('13.5', '1:30 PM'), ('14', '2:00 PM'), ('14.5', '2:30 PM'), ('15', '3:00 PM'), ('15.5', '3:30 PM'), ('16', '4:00 PM'), ('16.5', '4:30 PM'), ('17', '5:00 PM'), ('17.5', '5:30 PM'), ('18', '6:00 PM'), ('18.5', '6:30 PM'), ('19', '7:00 PM'), ('19.5', '7:30 PM'), ('20', '8:00 PM'), ('20.5', '8:30 PM'), ('21', '9:00 PM'), ('21.5', '9:30 PM'), ('22', '10:00 PM'), ('22.5', '10:30 PM'), ('23', '11:00 PM'), ('23.5', '11:30 PM')]
  • request_unit_custom Boolean
    args: 'Days-long custom hours'
  • request_unit_half Boolean
    args: 'Half Day'
  • request_unit_hours Boolean
    args: 'Custom Hours'
  • second_approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validate the time off with second level (If time off type need second validation)' readonly=True string='Second Approval' args: 'hr.employee'
  • state Selection
    copy=False default='draft' help=<expr> readonly=True string='Status' tracking=True args: [('draft', 'To Submit'), ('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
  • tz Selection
    compute='_compute_tz' args: _tz_get
  • tz_mismatch Boolean
    compute='_compute_tz_mismatch'
  • user_id Many2one → res.users
    compute_sudo=True default=<expr> readonly=True related='employee_id.user_id' related_sudo=True store=True string='User' args: 'res.users'
  • validation_type Selection
    readonly=False related='holiday_status_id.validation_type' args: 'Validation Type'
Public methods (15)
  • action_approve(self)
  • action_confirm(self)
  • action_draft(self)
  • action_refuse(self)
  • action_validate(self)
  • activity_update(self)
  • add_follower(self, employee_id)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
    Override to avoid automatic logging of creation
  • default_get(self, fields_list)
    @api.model
  • message_subscribe(self, partner_ids=None, channel_ids=None, subtype_ids=None)
  • name_get(self)
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
  • unlink(self)
  • write(self, values)

New fields (33)
  • accrual_limit Integer
    default=0 help='Maximum of allocation for accrual; 0 means no maximum.' args: 'Balance limit'
  • allocation_type Selection
    default='regular' readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Allocation Type' args: [('regular', 'Regular Allocation'), ('accrual', 'Accrual Allocation')]
  • can_approve Boolean
    compute='_compute_can_approve' args: 'Can Approve'
  • can_reset Boolean
    compute='_compute_can_reset' args: 'Can reset'
  • category_id Many2one → hr.employee.category
    readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Employee Tag' args: 'hr.employee.category'
  • date_from Datetime
    copy=False index=True readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} tracking=True args: 'Start Date'
  • date_to Datetime
    copy=False readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} tracking=True args: 'End Date'
  • department_id Many2one → hr.department
    readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Department' args: 'hr.department'
  • duration_display Char
    compute='_compute_duration_display' help='Field allowing to see the allocation duration in days or hours depending on the type_request_unit' args: 'Allocated (Days/Hours)'
  • employee_id Many2one → hr.employee
    default=_default_employee index=True ondelete='restrict' readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Employee' tracking=True args: 'hr.employee'
  • first_approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validate the allocation' readonly=True string='First Approval' args: 'hr.employee'
  • holiday_status_id Many2one → hr.leave.type
    default=_default_holiday_status_id domain=_holiday_status_id_domain readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Time Off Type' args: 'hr.leave.type'
  • holiday_type Selection
    default='employee' help='Allow to create requests in batchs:\n- By Employee: for a specific employee\n- By Company: all employees of the specified company\n- By Department: all employees of the specified department\n- By Employee Tag: all employees of the specific employee group category' readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Allocation Mode' args: [('employee', 'By Employee'), ('company', 'By Company'), ('department', 'By Department'), ('category', 'By Employee Tag')]
  • interval_number Integer
    default=1 readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'Number of unit between two intervals'
  • interval_unit Selection
    default='weeks' readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Unit of time between two intervals' args: [('weeks', 'Weeks'), ('months', 'Months'), ('years', 'Years')]
  • leaves_taken Float
    compute='_compute_leaves'
  • linked_request_ids One2many → hr.leave.allocation
    string='Linked Requests' args: 'hr.leave.allocation', 'parent_id'
  • manager_id Many2one → hr.employee
    readonly=True string='Manager' args: 'hr.employee'
  • max_leaves Float
    compute='_compute_leaves'
  • mode_company_id Many2one → res.company
    readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Company' args: 'res.company'
  • name Char
    args: 'Description'
  • nextcall Date
    default=False readonly=True args: 'Date of the next accrual allocation'
  • notes Text
    readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'Reasons'
  • number_of_days Float
    default=1 help='Duration in days. Reference field to use when necessary.' tracking=True args: 'Number of Days'
  • number_of_days_display Float
    compute='_compute_number_of_days_display' help="If Accrual Allocation: Number of days allocated in addition to the ones you will get via the accrual' system." states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'Duration (days)'
  • number_of_hours_display Float
    compute='_compute_number_of_hours_display' help="If Accrual Allocation: Number of hours allocated in addition to the ones you will get via the accrual' system." args: 'Duration (hours)'
  • number_per_interval Float
    default=1 readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'Number of unit per interval'
  • parent_id Many2one → hr.leave.allocation
    string='Parent' args: 'hr.leave.allocation'
  • second_approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validate the allocation with second level (If allocation type need second validation)' readonly=True string='Second Approval' args: 'hr.employee'
  • state Selection
    copy=False default='confirm' help=<expr> readonly=True string='Status' tracking=True args: [('draft', 'To Submit'), ('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
  • type_request_unit Selection
    readonly=True related='holiday_status_id.request_unit'
  • unit_per_interval Selection
    default='hours' readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Unit of time added at each interval' args: [('hours', 'Hours'), ('days', 'Days')]
  • validation_type Selection
    readonly=True related='holiday_status_id.validation_type' args: 'Validation Type'
Public methods (12)
  • action_approve(self)
  • action_confirm(self)
  • action_draft(self)
  • action_refuse(self)
  • action_validate(self)
  • activity_update(self)
  • add_follower(self, employee_id)
  • create(self, values)
    @api.model
    Override to avoid automatic logging of creation
  • message_subscribe(self, partner_ids=None, channel_ids=None, subtype_ids=None)
  • name_get(self)
  • unlink(self)
  • write(self, values)

New fields (12)
  • category_id Many2one → hr.employee.category
    readonly=True string='Employee Tag' args: 'hr.employee.category'
  • date_from Datetime
    readonly=True args: 'Start Date'
  • date_to Datetime
    readonly=True args: 'End Date'
  • department_id Many2one → hr.department
    readonly=True string='Department' args: 'hr.department'
  • employee_id Many2one → hr.employee
    readonly=True string='Employee' args: 'hr.employee'
  • holiday_status_id Many2one → hr.leave.type
    readonly=True string='Leave Type' args: 'hr.leave.type'
  • holiday_type Selection
    readonly=True string='Allocation Mode' args: [('employee', 'By Employee'), ('category', 'By Employee Tag')]
  • leave_type Selection
    readonly=True string='Request Type' args: [('allocation', 'Allocation Request'), ('request', 'Time Off Request')]
  • name Char
    readonly=True args: 'Description'
  • number_of_days Float
    readonly=True args: 'Number of Days'
  • payslip_status Boolean
    readonly=True args: 'Reported in last payslips'
  • state Selection
    readonly=True string='Status' args: [('draft', 'To Submit'), ('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
Public methods (3)
  • action_time_off_analysis(self)
    @api.model
  • init(self)
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model

New fields (24)
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the time off type without removing it.' args: 'Active'
  • allocation_notif_subtype_id Many2one → mail.message.subtype
    default=<expr> string='Allocation Notification Subtype' args: 'mail.message.subtype'
  • allocation_type Selection
    default='no' help='\tNo Allocation Needed: no allocation by default, users can freely request time off;\tFree Allocation Request: allocated by HR and users can request time off and allocations;\tAllocated by HR only: allocated by HR and cannot be bypassed; users can request time off;' string='Mode' args: [('no', 'No Allocation Needed'), ('fixed_allocation', 'Free Allocation Request'), ('fixed', 'Allocated by HR only')]
  • code Char
    args: 'Code'
  • color_name Selection
    default='red' help='This color will be used in the time off summary located in Reporting > Time off by Department.' required=True string='Color in Report' args: [('red', 'Red'), ('blue', 'Blue'), ('lightgreen', 'Light Green'), ('lightblue', 'Light Blue'), ('lightyellow', 'Light Yellow'), ('magenta', 'Magenta'), ('lightcyan', 'Light Cyan'), ('black', 'Black'), ('lightpink', 'Light Pink'), ('brown', 'Brown'), ('violet', 'Violet'), ('lightcoral', 'Light Coral'), ('lightsalmon', 'Light Salmon'), ('lavender', 'Lavender'), ('wheat', 'Wheat'), ('ivory', 'Ivory')]
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • create_calendar_meeting Boolean
    default=True string='Display Time Off in Calendar'
  • group_days_allocation Float
    compute='_compute_group_days_allocation' string='Days Allocated'
  • group_days_leave Float
    compute='_compute_group_days_leave' string='Group Time Off'
  • leave_notif_subtype_id Many2one → mail.message.subtype
    default=<expr> string='Time Off Notification Subtype' args: 'mail.message.subtype'
  • leaves_taken Float
    compute='_compute_leaves' help='This value is given by the sum of all time off requests with a negative value.' string='Time off Already Taken'
  • max_leaves Float
    compute='_compute_leaves' help='This value is given by the sum of all time off requests with a positive value.' search='_search_max_leaves' string='Maximum Allowed'
  • name Char
    required=True translate=True args: 'Time Off Type'
  • remaining_leaves Float
    compute='_compute_leaves' help='Maximum Time Off Allowed - Time Off Already Taken' string='Remaining Time Off'
  • request_unit Selection
    default='day' required=True string='Take Time Off in' args: [('day', 'Day'), ('half_day', 'Half Day'), ('hour', 'Hours')]
  • responsible_id Many2one → res.users
    domain=<expr> help="This user will be responsible for approving this type of times offThis is only used when validation is 'hr' or 'both'" args: 'res.users', 'Responsible'
  • sequence Integer
    default=100 help='The type with the smallest sequence is the default value in time off request'
  • time_type Selection
    default='leave' help='Whether this should be computed as a holiday or as work time (eg: formation)' string='Kind of Leave' args: [('leave', 'Time Off'), ('other', 'Other')]
  • unpaid Boolean
    default=False args: 'Is Unpaid'
  • valid Boolean
    compute='_compute_valid' help='This indicates if it is still possible to use this type of leave' search='_search_valid'
  • validation_type Selection
    default='hr' string='Validation' args: [('no_validation', 'No Validation'), ('hr', 'Time Off Officer'), ('manager', 'Team Leader'), ('both', 'Team Leader and Time Off Officer')]
  • validity_start Date
    help='Adding validity to types of time off so that it cannot be selected outside this time period' args: 'From'
  • validity_stop Date
    args: 'To'
  • virtual_remaining_leaves Float
    compute='_compute_leaves' help='Maximum Time Off Allowed - Time Off Already Taken - Time Off Waiting Approval' search='_search_virtual_remaining_leaves' string='Virtual Remaining Time Off'
Public methods (6)
  • action_see_days_allocated(self)
  • action_see_group_leaves(self)
  • get_days(self, employee_id)
  • get_days_all_request(self)
    @api.model
  • get_employees_days(self, employee_ids)
  • name_get(self)

New fields (0)

No new fields.

Public methods (1)
  • partner_info(self, all_partners, direct_partners)

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals)
    @api.model
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (9)
  • allocation_count Float
    related='employee_id.allocation_count'
  • allocation_display Char
    related='employee_id.allocation_display'
  • allocation_used_count Float
    related='employee_id.allocation_used_count'
  • allocation_used_display Char
    related='employee_id.allocation_used_display'
  • current_leave_state Selection
    related='employee_id.current_leave_state'
  • is_absent Boolean
    related='employee_id.is_absent'
  • leave_date_to Date
    related='employee_id.leave_date_to'
  • leave_manager_id Many2one
    related='employee_id.leave_manager_id'
  • show_leaves Boolean
    related='employee_id.show_leaves'
Public methods (0)

No public methods.

New fields (1)
  • holiday_id Many2one → hr.leave
    string='Leave Request' args: 'hr.leave'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/12.0/hr_holidays
VERSION
VERSION 1.5
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Christophe Simonis, Goffin Simon, Nicolas Martinelli, Nicolas Lempereur, Richard Mathot, qdp-odoo, Géry Debongnie, GitHub, Lucas Perais (lpe), Yannick Tivisse, Alexandre Kühn, qsm-odoo, Toufik Benjaa, jem-odoo, Adrien Dieudonne, RomainLibert, Christophe Monniez, len-odoo, Jorge Pinna Puissant, Nans Lefebvre, Alexandre Kühn, Toufik Ben Jaa, Adrian Torres, mreficent, Xavier-Do, jvm-odoo, Fanny He, fw-bot, Lucas Lefèvre, Adrien Widart, Nasreddin Boulif (bon), Touati Djamel (otd), Prakash Prajapati, Cas Vissers
WEBSITE
WEBSITEhttps://www.odoo.com/page/leaves
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:57:00
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - hr
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - resource
    - calendar
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage leave requests and allocations
=====================================

This application controls the leave schedule of your company. It allows employees to request leaves. Then, managers can review requests for leaves and approve or reject them. This way you can control the overall leave planning for the company or department.

You can configure several kinds of leaves (sickness, paid days, ...) and allocate leaves to an employee or department quickly using leave allocation. An employee can also make a request for more days off by making a new Leave allocation. It will increase the total of available days for that leave type (if the request is accepted).

You can keep track of leaves in different ways by following reports:

* Leaves Summary
* Leaves by Department
* Leaves Analysis

A synchronization with an internal agenda (Meetings of the CRM module) is also possible in order to automatically create a meeting when a leave request is accepted by setting up a type of meeting in Leave Type.

Code Analysis

Views touched (32)
XML IDNameModelTypeStatus
assets_backend assets_backend ir.ui.view qweb Inherits web.assets_backend
edit_holiday_status_form hr.leave.type.form hr.leave.type form New
hr_department_view_kanban hr.department.kanban.inherit hr.department data Inherits hr.hr_department_view_kanban
hr_employee_view_search hr.employee.search.view.inherit hr.employee xpath Inherits hr.view_employee_filter
hr_holiday_status_view_kanban hr.leave.type.kanban hr.leave.type kanban New
hr_kanban_view_employees_kanban hr.employee.kanban.leaves.status hr.employee xpath Inherits hr.hr_kanban_view_employees
hr_leave_allocation_view_form hr.leave.allocation.view.form hr.leave.allocation form New
hr_leave_allocation_view_form_manager hr.leave.allocation.view.form.manager hr.leave.allocation xpath Inherits hr_holidays.hr_leave_allocation_view_form
hr_leave_allocation_view_kanban hr.leave.allocation.view.kanban hr.leave.allocation kanban New
hr_leave_allocation_view_tree hr.leave.allocation.view.tree hr.leave.allocation tree New
hr_leave_allocation_view_tree_my hr.leave.allocation.view.tree.my hr.leave.allocation xpath Inherits hr_leave_allocation_view_tree
hr_leave_report_kanban report.hr.holidays.report.leave_all.kanban hr.leave.report kanban New
hr_leave_report_tree report.hr.holidays.report.leave_all.tree hr.leave.report tree New
hr_leave_view_calendar hr.leave.view.calendar hr.leave calendar New
hr_leave_view_form hr.leave.view.form hr.leave form New
hr_leave_view_form_manager hr.leave.view.form.manager hr.leave xpath Inherits hr_leave_view_form
hr_leave_view_kanban hr.leave.view.kanban hr.leave kanban New
hr_leave_view_tree hr.holidays.view.tree hr.leave tree New
hr_leave_view_tree_my hr.holidays.view.tree hr.leave xpath Inherits hr_leave_view_tree
report_holidayssummary report_holidayssummary ir.ui.view qweb New
resource_calendar_leave_form_inherit resource.calendar.leaves.form.inherit resource.calendar.leaves field Inherits resource.resource_calendar_leave_form
view_employee_form_leave_inherit hr.employee.leave.form.inherit hr.employee xpath Inherits hr.view_employee_form
view_evaluation_report_graph hr.holidays.graph hr.leave graph New
view_holiday_graph hr.holidays.report_graph hr.leave graph New
view_holiday_pivot hr.holidays.report_pivot hr.leave pivot New
view_holiday_status_normal_tree hr.leave.type.normal.tree hr.leave.type tree New
view_holidays_status_filter hr.leave.type.filter hr.leave.type search New
view_hr_holidays_filter hr.holidays.filter hr.leave search New
view_hr_holidays_filter_report hr.holidays.filter hr.leave.report search New
view_hr_holidays_summary_dept hr.holidays.summary.dept.form hr.holidays.summary.dept form New
view_hr_holidays_summary_employee hr.holidays.summary.employee.form hr.holidays.summary.employee form New
view_hr_leave_allocation_filter hr.holidays.filter_allocations hr.leave.allocation search New
Models touched (10)

New fields (4)
  • absence_of_today Integer
    compute='_compute_leave_count' string='Absence by Today'
  • allocation_to_approve_count Integer
    compute='_compute_leave_count' string='Allocation to Approve'
  • leave_to_approve_count Integer
    compute='_compute_leave_count' string='Leave to Approve'
  • total_employee Integer
    compute='_compute_total_employee' string='Total Employee'
Public methods (0)

No public methods.

New fields (8)
  • current_leave_id Many2one → hr.leave.type
    compute='_compute_leave_status' string='Current Leave Type' args: 'hr.leave.type'
  • current_leave_state Selection
    compute='_compute_leave_status' selection=[('draft', 'New'), ('confirm', 'Waiting Approval'), ('refuse', 'Refused'), ('validate1', 'Waiting Second Approval'), ('validate', 'Approved'), ('cancel', 'Cancelled')] string='Current Leave Status'
  • is_absent_totay Boolean
    compute='_compute_absent_employee' search='_search_absent_employee' args: 'Absent Today'
  • leave_date_from Date
    compute='_compute_leave_status' args: 'From Date'
  • leave_date_to Date
    compute='_compute_leave_status' args: 'To Date'
  • leaves_count Float
    compute='_compute_leaves_count' args: 'Number of Leaves'
  • remaining_leaves Float
    compute='_compute_remaining_leaves' help='Total number of legal leaves allocated to this employee, change this value to create allocation/leave request. Total based on all the leave types without overriding limit.' string='Remaining Legal Leaves'
  • show_leaves Boolean
    compute='_compute_show_leaves' args: 'Able to see Remaining Leaves'
Public methods (1)
  • write(self, values)

New fields (3)
  • date_from Date
    default=<expr> required=True string='From'
  • depts Many2many → hr.department
    string='Department(s)' args: 'hr.department', 'summary_dept_rel', 'sum_id', 'dept_id'
  • holiday_type Selection
    default='Approved' required=True string='Leave Type' args: [('Approved', 'Approved'), ('Confirmed', 'Confirmed'), ('both', 'Both Approved and Confirmed')]
Public methods (1)
  • print_report(self)
    @api.multi

New fields (3)
  • date_from Date
    default=<expr> required=True string='From'
  • emp Many2many → hr.employee
    string='Employee(s)' args: 'hr.employee', 'summary_emp_rel', 'sum_id', 'emp_id'
  • holiday_type Selection
    default='Approved' required=True string='Select Leave Type' args: [('Approved', 'Approved'), ('Confirmed', 'Confirmed'), ('both', 'Both Approved and Confirmed')]
Public methods (1)
  • print_report(self)
    @api.multi

New fields (38)
  • can_approve Boolean
    compute='_compute_can_approve' args: 'Can Approve'
  • can_reset Boolean
    compute='_compute_can_reset' args: 'Can reset'
  • category_id Many2one → hr.employee.category
    help='Category of Employee' readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Employee Tag' args: 'hr.employee.category'
  • date_from Datetime
    copy=False default=fields.Datetime.now index=True readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} track_visibility='onchange' args: 'Start Date'
  • date_to Datetime
    copy=False default=fields.Datetime.now readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} track_visibility='onchange' args: 'End Date'
  • department_id Many2one → hr.department
    readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Department' args: 'hr.department'
  • duration_display Char
    compute='_compute_duration_display' help='Field allowing to see the leave request duration in days or hours depending on the leave_type_request_unit' args: 'Requested (Days/Hours)'
  • employee_id Many2one → hr.employee
    default=_default_employee index=True readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Employee' track_visibility='onchange' args: 'hr.employee'
  • first_approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validate the leave' oldname='manager_id' readonly=True string='First Approval' args: 'hr.employee'
  • holiday_status_id Many2one → hr.leave.type
    domain=[('valid', '=', True)] readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Leave Type' args: 'hr.leave.type'
  • holiday_type Selection
    default='employee' help='By Employee: Allocation/Request for individual Employee, By Employee Tag: Allocation/Request for group of employees in category' readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Allocation Mode' args: [('employee', 'By Employee'), ('company', 'By Company'), ('department', 'By Department'), ('category', 'By Employee Tag')]
  • leave_type_request_unit Selection
    readonly=True related='holiday_status_id.request_unit'
  • linked_request_ids One2many → hr.leave
    string='Linked Requests' args: 'hr.leave', 'parent_id'
  • manager_id Many2one → hr.employee
    readonly=True string='Manager' args: 'hr.employee'
  • meeting_id Many2one → calendar.event
    string='Meeting' args: 'calendar.event'
  • mode_company_id Many2one → res.company
    readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Company' args: 'res.company'
  • name Char
    args: 'Description'
  • notes Text
    readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'Reasons'
  • number_of_days Float
    copy=False help='Number of days of the leave request according to your working schedule.' readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} track_visibility='onchange' args: 'Duration (Days)'
  • number_of_days_display Float
    compute='_compute_number_of_days_display' copy=False help='Number of days of the leave request. Used for interface.' readonly=True args: 'Duration in days'
  • number_of_hours_display Float
    compute='_compute_number_of_hours_display' copy=False help='Number of hours of the leave request according to your working schedule. Used for interface.' readonly=True args: 'Duration in hours'
  • parent_id Many2one → hr.leave
    copy=False string='Parent' args: 'hr.leave'
  • payslip_status Boolean
    help='Green this button when the leave has been taken into account in the payslip.' args: 'Reported in last payslips'
  • report_note Text
    args: 'HR Comments'
  • request_date_from Date
    args: 'Request Start Date'
  • request_date_from_period Selection
    default='am' string='Date Period Start' args: [('am', 'Morning'), ('pm', 'Afternoon')]
  • request_date_to Date
    args: 'Request End Date'
  • request_hour_from Selection
    string='Hour from' args: [(0, '12:00 AM'), (-1, '0:30 AM'), (1, '1:00 AM'), (-2, '1:30 AM'), (2, '2:00 AM'), (-3, '2:30 AM'), (3, '3:00 AM'), (-4, '3:30 AM'), (4, '4:00 AM'), (-5, '4:30 AM'), (5, '5:00 AM'), (-6, '5:30 AM'), (6, '6:00 AM'), (-7, '6:30 AM'), (7, '7:00 AM'), (-8, '7:30 AM'), (8, '8:00 AM'), (-9, '8:30 AM'), (9, '9:00 AM'), (-10, '9:30 AM'), (10, '10:00 AM'), (-11, '10:30 AM'), (11, '11:00 AM'), (-12, '11:30 AM'), (12, '12:00 PM'), (-13, '0:30 PM'), (13, '1:00 PM'), (-14, '1:30 PM'), (14, '2:00 PM'), (-15, '2:30 PM'), (15, '3:00 PM'), (-16, '3:30 PM'), (16, '4:00 PM'), (-17, '4:30 PM'), (17, '5:00 PM'), (-18, '5:30 PM'), (18, '6:00 PM'), (-19, '6:30 PM'), (19, '7:00 PM'), (-20, '7:30 PM'), (20, '8:00 PM'), (-21, '8:30 PM'), (21, '9:00 PM'), (-22, '9:30 PM'), (22, '10:00 PM'), (-23, '10:30 PM'), (23, '11:00 PM'), (-24, '11:30 PM')]
  • request_hour_to Selection
    string='Hour to' args: [(0, '12:00 AM'), (-1, '0:30 AM'), (1, '1:00 AM'), (-2, '1:30 AM'), (2, '2:00 AM'), (-3, '2:30 AM'), (3, '3:00 AM'), (-4, '3:30 AM'), (4, '4:00 AM'), (-5, '4:30 AM'), (5, '5:00 AM'), (-6, '5:30 AM'), (6, '6:00 AM'), (-7, '6:30 AM'), (7, '7:00 AM'), (-8, '7:30 AM'), (8, '8:00 AM'), (-9, '8:30 AM'), (9, '9:00 AM'), (-10, '9:30 AM'), (10, '10:00 AM'), (-11, '10:30 AM'), (11, '11:00 AM'), (-12, '11:30 AM'), (12, '12:00 PM'), (-13, '0:30 PM'), (13, '1:00 PM'), (-14, '1:30 PM'), (14, '2:00 PM'), (-15, '2:30 PM'), (15, '3:00 PM'), (-16, '3:30 PM'), (16, '4:00 PM'), (-17, '4:30 PM'), (17, '5:00 PM'), (-18, '5:30 PM'), (18, '6:00 PM'), (-19, '6:30 PM'), (19, '7:00 PM'), (-20, '7:30 PM'), (20, '8:00 PM'), (-21, '8:30 PM'), (21, '9:00 PM'), (-22, '9:30 PM'), (22, '10:00 PM'), (-23, '10:30 PM'), (23, '11:00 PM'), (-24, '11:30 PM')]
  • request_unit_custom Boolean
    args: 'Days-long custom hours'
  • request_unit_half Boolean
    args: 'Half Day'
  • request_unit_hours Boolean
    args: 'Custom Hours'
  • second_approver_id Many2one → hr.employee
    copy=False help='This area is automaticly filled by the user who validate the leave with second level (If Leave type need second validation)' oldname='manager_id2' readonly=True string='Second Approval' args: 'hr.employee'
  • state Selection
    copy=False default='confirm' help=<expr> readonly=True string='Status' track_visibility='onchange' args: [('draft', 'To Submit'), ('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
  • tz Selection
    compute='_compute_tz' args: _tz_get
  • tz_mismatch Boolean
    compute='_compute_tz_mismatch'
  • user_id Many2one → res.users
    compute_sudo=True default=<expr> readonly=True related='employee_id.user_id' related_sudo=True store=True string='User' args: 'res.users'
  • validation_type Selection
    readonly=False related='holiday_status_id.validation_type' args: 'Validation Type'
Public methods (15)
  • action_approve(self)
    @api.multi
  • action_confirm(self)
    @api.multi
  • action_draft(self)
    @api.multi
  • action_refuse(self)
    @api.multi
  • action_validate(self)
    @api.multi
  • activity_update(self)
  • add_follower(self, employee_id)
    @api.multi
  • copy_data(self, default=None)
    @api.multi
  • create(self, values)
    @api.model
    Override to avoid automatic logging of creation
  • default_get(self, fields_list)
    @api.model
  • message_subscribe(self, partner_ids=None, channel_ids=None, subtype_ids=None)
    @api.multi
  • name_get(self)
    @api.multi
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
  • unlink(self)
    @api.multi
  • write(self, values)
    @api.multi

New fields (30)
  • accrual Boolean
    readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'Accrual'
  • accrual_limit Integer
    default=0 help='Maximum of allocation for accrual; 0 means no maximum.' args: 'Balance limit'
  • can_approve Boolean
    compute='_compute_can_approve' args: 'Can Approve'
  • can_reset Boolean
    compute='_compute_can_reset' args: 'Can reset'
  • category_id Many2one → hr.employee.category
    readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Employee Tag' args: 'hr.employee.category'
  • date_from Datetime
    copy=False index=True readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} track_visibility='onchange' args: 'Start Date'
  • date_to Datetime
    copy=False readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} track_visibility='onchange' args: 'End Date'
  • department_id Many2one → hr.department
    readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Department' args: 'hr.department'
  • duration_display Char
    compute='_compute_duration_display' help='Field allowing to see the allocation duration in days or hours depending on the type_request_unit' args: 'Allocated (Days/Hours)'
  • employee_id Many2one → hr.employee
    default=_default_employee index=True readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Employee' track_visibility='onchange' args: 'hr.employee'
  • first_approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validate the leave' oldname='manager_id' readonly=True string='First Approval' args: 'hr.employee'
  • holiday_status_id Many2one → hr.leave.type
    default=_default_holiday_status_id domain=[('valid', '=', True)] readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Leave Type' args: 'hr.leave.type'
  • holiday_type Selection
    default='employee' help='Allow to create requests in batchs:\n- By Employee: for a specific employee\n- By Company: all employees of the specified company\n- By Department: all employees of the specified department\n- By Employee Tag: all employees of the specific employee group category' readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Allocation Mode' args: [('employee', 'By Employee'), ('company', 'By Company'), ('department', 'By Department'), ('category', 'By Employee Tag')]
  • interval_number Integer
    default=1 readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'Number of unit between two intervals'
  • interval_unit Selection
    default='weeks' readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Unit of time between two intervals' args: [('weeks', 'Week(s)'), ('months', 'Month(s)'), ('years', 'Year(s)')]
  • linked_request_ids One2many → hr.leave.allocation
    string='Linked Requests' args: 'hr.leave.allocation', 'parent_id'
  • mode_company_id Many2one → res.company
    readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Company' args: 'res.company'
  • name Char
    args: 'Description'
  • nextcall Date
    default=False readonly=True args: 'Date of the next accrual allocation'
  • notes Text
    readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'Reasons'
  • number_of_days Float
    help='Duration in days. Reference field to use when necessary.' track_visibility='onchange' args: 'Number of Days'
  • number_of_days_display Float
    compute='_compute_number_of_days_display' help='UX field allowing to see and modify the allocation duration, computed in days.' states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'Duration (days)'
  • number_of_hours_display Float
    compute='_compute_number_of_hours_display' help='UX field allowing to see and modify the allocation duration, computed in hours.' args: 'Duration (hours)'
  • number_per_interval Float
    default=1 readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'Number of unit per interval'
  • parent_id Many2one → hr.leave.allocation
    string='Parent' args: 'hr.leave.allocation'
  • second_approver_id Many2one → hr.employee
    copy=False help='This area is automaticly filled by the user who validate the leave with second level (If Leave type need second validation)' oldname='manager_id2' readonly=True string='Second Approval' args: 'hr.employee'
  • state Selection
    copy=False default='confirm' help=<expr> readonly=True string='Status' track_visibility='onchange' args: [('draft', 'To Submit'), ('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
  • type_request_unit Selection
    readonly=True related='holiday_status_id.request_unit'
  • unit_per_interval Selection
    default='hours' readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Unit of time added at each interval' args: [('hours', 'Hour(s)'), ('days', 'Day(s)')]
  • validation_type Selection
    readonly=True related='holiday_status_id.validation_type' args: 'Validation Type'
Public methods (13)
  • action_approve(self)
    @api.multi
  • action_confirm(self)
    @api.multi
  • action_draft(self)
    @api.multi
  • action_refuse(self)
    @api.multi
  • action_validate(self)
    @api.multi
  • activity_update(self)
  • add_follower(self, employee_id)
    @api.multi
  • copy_data(self, default=None)
    @api.multi
  • create(self, values)
    @api.model
    Override to avoid automatic logging of creation
  • message_subscribe(self, partner_ids=None, channel_ids=None, subtype_ids=None)
    @api.multi
  • name_get(self)
    @api.multi
  • unlink(self)
    @api.multi
  • write(self, values)
    @api.multi

New fields (12)
  • category_id Many2one → hr.employee.category
    readonly=True string='Employee Tag' args: 'hr.employee.category'
  • date_from Datetime
    readonly=True args: 'Start Date'
  • date_to Datetime
    readonly=True args: 'End Date'
  • department_id Many2one → hr.department
    readonly=True string='Department' args: 'hr.department'
  • employee_id Many2one → hr.employee
    readonly=True string='Employee' args: 'hr.employee'
  • holiday_status_id Many2one → hr.leave.type
    readonly=True string='Leave Type' args: 'hr.leave.type'
  • holiday_type Selection
    readonly=True string='Allocation Mode' args: [('employee', 'By Employee'), ('category', 'By Employee Tag')]
  • name Char
    readonly=True args: 'Description'
  • number_of_days Float
    readonly=True args: 'Number of Days'
  • payslip_status Boolean
    readonly=True args: 'Reported in last payslips'
  • state Selection
    readonly=True string='Status' args: [('draft', 'To Submit'), ('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
  • type Selection
    readonly=True string='Request Type' args: [('allocation', 'Allocation Request'), ('request', 'Leave Request')]
Public methods (2)
  • init(self)
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model

New fields (21)
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the leave type without removing it.' args: 'Active'
  • allocation_type Selection
    default='fixed' help='\tFixed by HR: allocated by HR and cannot be bypassed; users can request leaves;\tFixed by HR + allocation request: allocated by HR and users can request leaves and allocations;\tNo allocation: no allocation by default, users can freely request leaves;' string='Mode' args: [('fixed', 'Fixed by HR'), ('fixed_allocation', 'Fixed by HR + allocation request'), ('no', 'No allocation')]
  • categ_id Many2one → calendar.event.type
    help='Once a leave is validated, Odoo will create a corresponding meeting of this type in the calendar.' string='Meeting Type' args: 'calendar.event.type'
  • color_name Selection
    default='red' help='This color will be used in the leaves summary located in Reporting > Leaves by Department.' required=True string='Color in Report' args: [('red', 'Red'), ('blue', 'Blue'), ('lightgreen', 'Light Green'), ('lightblue', 'Light Blue'), ('lightyellow', 'Light Yellow'), ('magenta', 'Magenta'), ('lightcyan', 'Light Cyan'), ('black', 'Black'), ('lightpink', 'Light Pink'), ('brown', 'Brown'), ('violet', 'Violet'), ('lightcoral', 'Light Coral'), ('lightsalmon', 'Light Salmon'), ('lavender', 'Lavender'), ('wheat', 'Wheat'), ('ivory', 'Ivory')]
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • double_validation Boolean
    compute='_compute_validation_type' help='When selected, the Allocation/Leave Requests for this type require a second validation to be approved.' inverse='_inverse_validation_type' string='Apply Double Validation'
  • group_days_allocation Float
    compute='_compute_group_days_allocation' string='Days Allocated'
  • group_days_leave Float
    compute='_compute_group_days_leave' string='Group Leaves'
  • leaves_taken Float
    compute='_compute_leaves' help='This value is given by the sum of all leaves requests with a negative value.' string='Leaves Already Taken'
  • max_leaves Float
    compute='_compute_leaves' help='This value is given by the sum of all leaves requests with a positive value.' string='Maximum Allowed'
  • name Char
    required=True translate=True args: 'Leave Type'
  • remaining_leaves Float
    compute='_compute_leaves' help='Maximum Leaves Allowed - Leaves Already Taken' string='Remaining Leaves'
  • request_unit Selection
    default='day' required=True string='Take Leaves in' args: [('day', 'Day'), ('hour', 'Hours')]
  • sequence Integer
    default=100 help='The type with the smallest sequence is the default value in leave request'
  • time_type Selection
    default='leave' help='Whether this should be computed as a holiday or as work time (eg: formation)' string='Kind of Leave' args: [('leave', 'Leave'), ('other', 'Other')]
  • unpaid Boolean
    default=False args: 'Is Unpaid'
  • valid Boolean
    compute='_compute_valid' help='This indicates if it is still possible to use this type of leave' search='_search_valid'
  • validation_type Selection
    default='hr' string='Validation By' args: [('hr', 'Human Resource officer'), ('manager', 'Employee Manager'), ('both', 'Double Validation')]
  • validity_start Date
    default=fields.Date.today help='Adding validity to types of leaves so that it cannot be selected outside this time period' args: 'Start Date'
  • validity_stop Date
    args: 'End Date'
  • virtual_remaining_leaves Float
    compute='_compute_leaves' help='Maximum Leaves Allowed - Leaves Already Taken - Leaves Waiting Approval' string='Virtual Remaining Leaves'
Public methods (4)
  • action_see_days_allocated(self)
    @api.multi
  • action_see_group_leaves(self)
    @api.multi
  • get_days(self, employee_id)
    @api.multi
  • name_get(self)
    @api.multi

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • holiday_id Many2one → hr.leave
    string='Leave Request' args: 'hr.leave'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/11.0/hr_holidays
VERSION
VERSION 1.5
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Goffin Simon, Nicolas Martinelli, Jérome Maes, Richard Mathot, qdp-odoo, Géry Debongnie, Aaron Bohy, GitHub, Yannick Tivisse, qsm-odoo, Martin Geubelle, Odoo Online, Laurent Smet, tbe-odoo, Adrien Dieudonne, RomainLibert, Denis Vermylen
WEBSITE
WEBSITEhttps://www.odoo.com/page/employees
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:53:42
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - hr
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - resource
    - calendar
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage leave requests and allocations
=====================================

This application controls the leave schedule of your company. It allows employees to request leaves. Then, managers can review requests for leaves and approve or reject them. This way you can control the overall leave planning for the company or department.

You can configure several kinds of leaves (sickness, paid days, ...) and allocate leaves to an employee or department quickly using leave allocation. An employee can also make a request for more days off by making a new Leave allocation. It will increase the total of available days for that leave type (if the request is accepted).

You can keep track of leaves in different ways by following reports:

* Leaves Summary
* Leaves by Department
* Leaves Analysis

A synchronization with an internal agenda (Meetings of the CRM module) is also possible in order to automatically create a meeting when a leave request is accepted by setting up a type of meeting in Leave Type.

Code Analysis

Views touched (29)
XML IDNameModelTypeStatus
edit_holiday_new Leave Request hr.holidays form New
edit_holiday_status_form hr.holidays.status.form hr.holidays.status form New
hr_department_view_kanban hr.department.kanban.inherit hr.department data Inherits hr.hr_department_view_kanban
hr_employee_view_search hr.employee.search.view.inherit hr.employee xpath Inherits hr.view_employee_filter
hr_holiday_status_view_kanban hr.holidays.status.kanban hr.holidays.status kanban New
hr_holidays_leaves_assign_tree_view hr.employee.leave.tree hr.employee tree New
hr_kanban_view_employees_kanban hr.employee.kanban.leaves.status hr.employee xpath Inherits hr.hr_kanban_view_employees
report_holidayssummary report_holidayssummary ir.ui.view qweb New
resource_calendar_leave_form_inherit resource.calendar.leaves.form.inherit resource.calendar.leaves field Inherits resource.resource_calendar_leave_form
view_employee_form_leave_inherit hr.employee.leave.form.inherit hr.employee xpath Inherits hr.view_employee_form
view_evaluation_report_graph hr.holidays.graph hr.holidays graph New
view_holiday hr.holidays.tree hr.holidays tree New
view_holiday_allocation_tree hr.holidays.allocation.tree hr.holidays tree New
view_holiday_allocation_tree_customize hr.holidays.allocation.tree.customize hr.holidays tree New
view_holiday_employee hr.holidays.report_employee_tree hr.holidays tree New
view_holiday_graph hr.holidays.report_graph hr.holidays graph New
view_holiday_new_calendar Leave Request hr.holidays calendar New
view_holiday_pivot hr.holidays.report_pivot hr.holidays pivot New
view_holiday_simple hr.holidays.report_tree hr.holidays tree New
view_holiday_status_normal_tree hr.holidays.status.normal.tree hr.holidays.status tree New
view_holiday_status_tree hr.holidays.status.tree hr.holidays.status tree New
view_holidays_status_filter hr.holidays.status.filter hr.holidays.status search New
view_hr_holidays_filter hr.holidays.filter hr.holidays search New
view_hr_holidays_kanban hr.holidays.kanban hr.holidays kanban New
view_hr_holidays_remaining_leaves_user_graph hr.holidays.remaining.leaves.user.graph hr.holidays.remaining.leaves.user graph New
view_hr_holidays_remaining_leaves_user_tree hr.holidays.remaining.leaves.user.tree hr.holidays.remaining.leaves.user tree New
view_hr_holidays_status_search hr.holidays.status.search hr.holidays.status search New
view_hr_holidays_summary_dept hr.holidays.summary.dept.form hr.holidays.summary.dept form New
view_hr_holidays_summary_employee hr.holidays.summary.employee.form hr.holidays.summary.employee form New
Models touched (9)

New fields (4)
  • absence_of_today Integer
    compute='_compute_leave_count' string='Absence by Today'
  • allocation_to_approve_count Integer
    compute='_compute_leave_count' string='Allocation to Approve'
  • leave_to_approve_count Integer
    compute='_compute_leave_count' string='Leave to Approve'
  • total_employee Integer
    compute='_compute_total_employee' string='Total Employee'
Public methods (0)

No public methods.

New fields (8)
  • current_leave_id Many2one → hr.holidays.status
    compute='_compute_leave_status' string='Current Leave Type' args: 'hr.holidays.status'
  • current_leave_state Selection
    compute='_compute_leave_status' selection=[('draft', 'New'), ('confirm', 'Waiting Approval'), ('refuse', 'Refused'), ('validate1', 'Waiting Second Approval'), ('validate', 'Approved'), ('cancel', 'Cancelled')] string='Current Leave Status'
  • is_absent_totay Boolean
    compute='_compute_absent_employee' search='_search_absent_employee' args: 'Absent Today'
  • leave_date_from Date
    compute='_compute_leave_status' args: 'From Date'
  • leave_date_to Date
    compute='_compute_leave_status' args: 'To Date'
  • leaves_count Float
    compute='_compute_leaves_count' args: 'Number of Leaves'
  • remaining_leaves Float
    compute='_compute_remaining_leaves' help='Total number of legal leaves allocated to this employee, change this value to create allocation/leave request. Total based on all the leave types without overriding limit.' inverse='_inverse_remaining_leaves' string='Remaining Legal Leaves'
  • show_leaves Boolean
    compute='_compute_show_leaves' args: 'Able to see Remaining Leaves'
Public methods (1)
  • write(self, values)

New fields (24)
  • can_reset Boolean
    compute='_compute_can_reset' args: 'Can reset'
  • category_id Many2one → hr.employee.category
    help='Category of Employee' readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Employee Tag' args: 'hr.employee.category'
  • date_from Datetime
    copy=False index=True readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} track_visibility='onchange' args: 'Start Date'
  • date_to Datetime
    copy=False readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} track_visibility='onchange' args: 'End Date'
  • department_id Many2one → hr.department
    readonly=True string='Department' args: 'hr.department'
  • double_validation Boolean
    related='holiday_status_id.double_validation' args: 'Apply Double Validation'
  • employee_id Many2one → hr.employee
    default=_default_employee index=True readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Employee' track_visibility='onchange' args: 'hr.employee'
  • first_approver_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validate the leave' oldname='manager_id' readonly=True string='First Approval' args: 'hr.employee'
  • holiday_status_id Many2one → hr.holidays.status
    readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Leave Type' args: 'hr.holidays.status'
  • holiday_type Selection
    default='employee' help='By Employee: Allocation/Request for individual Employee, By Employee Tag: Allocation/Request for group of employees in category' readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Allocation Mode' args: [('employee', 'By Employee'), ('category', 'By Employee Tag')]
  • linked_request_ids One2many → hr.holidays
    string='Linked Requests' args: 'hr.holidays', 'parent_id'
  • manager_id Many2one → hr.employee
    readonly=True string='Manager' args: 'hr.employee'
  • meeting_id Many2one → calendar.event
    string='Meeting' args: 'calendar.event'
  • name Char
    args: 'Description'
  • notes Text
    readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'Reasons'
  • number_of_days Float
    compute='_compute_number_of_days' store=True track_visibility='onchange' args: 'Number of Days'
  • number_of_days_temp Float
    copy=False help='Number of days of the leave request according to your working schedule.' readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'Allocation'
  • parent_id Many2one → hr.holidays
    copy=False string='Parent' args: 'hr.holidays'
  • payslip_status Boolean
    help='Green this button when the leave has been taken into account in the payslip.' args: 'Reported in last payslips'
  • report_note Text
    args: 'HR Comments'
  • second_approver_id Many2one → hr.employee
    copy=False help='This area is automaticly filled by the user who validate the leave with second level (If Leave type need second validation)' oldname='manager_id2' readonly=True string='Second Approval' args: 'hr.employee'
  • state Selection
    copy=False default='confirm' help=<expr> readonly=True string='Status' track_visibility='onchange' args: [('draft', 'To Submit'), ('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
  • type Selection
    default='remove' help="Choose 'Leave Request' if someone wants to take an off-day. \nChoose 'Allocation Request' if you want to increase the number of leaves available for someone" index=True readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Request Type' track_visibility='always' args: [('remove', 'Leave Request'), ('add', 'Allocation Request')]
  • user_id Many2one → res.users
    compute_sudo=True default=<expr> readonly=True related='employee_id.user_id' related_sudo=True store=True string='User' args: 'res.users'
Public methods (10)
  • action_approve(self)
    @api.multi
  • action_confirm(self)
    @api.multi
  • action_draft(self)
    @api.multi
  • action_refuse(self)
    @api.multi
  • action_validate(self)
    @api.multi
  • add_follower(self, employee_id)
    @api.multi
  • create(self, values)
    @api.model
    Override to avoid automatic logging of creation
  • name_get(self)
    @api.multi
  • unlink(self)
    @api.multi
  • write(self, values)
    @api.multi

New fields (4)
  • leave_type Char
    readonly=True args: 'Leave Type'
  • name Char
    readonly=True args: 'Employee'
  • no_of_leaves Integer
    readonly=True args: 'Remaining leaves'
  • user_id Many2one → res.users
    readonly=True string='User' args: 'res.users'
Public methods (1)
  • init(self)

New fields (11)
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the leave type without removing it.' args: 'Active'
  • categ_id Many2one → calendar.event.type
    help='Once a leave is validated, Odoo will create a corresponding meeting of this type in the calendar.' string='Meeting Type' args: 'calendar.event.type'
  • color_name Selection
    default='red' help='This color will be used in the leaves summary located in Reporting > Leaves by Department.' required=True string='Color in Report' args: [('red', 'Red'), ('blue', 'Blue'), ('lightgreen', 'Light Green'), ('lightblue', 'Light Blue'), ('lightyellow', 'Light Yellow'), ('magenta', 'Magenta'), ('lightcyan', 'Light Cyan'), ('black', 'Black'), ('lightpink', 'Light Pink'), ('brown', 'Brown'), ('violet', 'Violet'), ('lightcoral', 'Light Coral'), ('lightsalmon', 'Light Salmon'), ('lavender', 'Lavender'), ('wheat', 'Wheat'), ('ivory', 'Ivory')]
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • double_validation Boolean
    help='When selected, the Allocation/Leave Requests for this type require a second validation to be approved.' string='Apply Double Validation'
  • leaves_taken Float
    compute='_compute_leaves' help='This value is given by the sum of all leaves requests with a negative value.' string='Leaves Already Taken'
  • limit Boolean
    help='If you select this check box, the system allows the employees to take more leaves than the available ones for this type and will not take them into account for the "Remaining Legal Leaves" defined on the employee form.' args: 'Allow to Override Limit'
  • max_leaves Float
    compute='_compute_leaves' help='This value is given by the sum of all leaves requests with a positive value.' string='Maximum Allowed'
  • name Char
    required=True translate=True args: 'Leave Type'
  • remaining_leaves Float
    compute='_compute_leaves' help='Maximum Leaves Allowed - Leaves Already Taken' string='Remaining Leaves'
  • virtual_remaining_leaves Float
    compute='_compute_leaves' help='Maximum Leaves Allowed - Leaves Already Taken - Leaves Waiting Approval' string='Virtual Remaining Leaves'
Public methods (2)
  • get_days(self, employee_id)
    @api.multi
  • name_get(self)
    @api.multi

New fields (3)
  • date_from Date
    default=<expr> required=True string='From'
  • depts Many2many → hr.department
    string='Department(s)' args: 'hr.department', 'summary_dept_rel', 'sum_id', 'dept_id'
  • holiday_type Selection
    default='Approved' required=True string='Leave Type' args: [('Approved', 'Approved'), ('Confirmed', 'Confirmed'), ('both', 'Both Approved and Confirmed')]
Public methods (1)
  • print_report(self)
    @api.multi

New fields (3)
  • date_from Date
    default=<expr> required=True string='From'
  • emp Many2many → hr.employee
    string='Employee(s)' args: 'hr.employee', 'summary_emp_rel', 'sum_id', 'emp_id'
  • holiday_type Selection
    default='Approved' required=True string='Select Leave Type' args: [('Approved', 'Approved'), ('Confirmed', 'Confirmed'), ('both', 'Both Approved and Confirmed')]
Public methods (1)
  • print_report(self)
    @api.multi

New fields (0)

No new fields.

Public methods (1)
  • get_report_values(self, docids, data=None)
    @api.model

New fields (1)
  • holiday_id Many2one → hr.holidays
    string='Leave Request' args: 'hr.holidays'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/10.0/hr_holidays
VERSION
VERSION 1.5
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Denis Ledoux, Christophe Simonis, David Monjoie, Goffin Simon, Nicolas Martinelli, Jérome Maes, Julien Legros, qdp-odoo, Jeremy Kersten, Lucas Perais (lpe), Yannick Tivisse, qsm-odoo, Pierre Masereel, Denis Vermylen (dve), RomainLibert, Denis Vermylen, Toufik Ben Jaa
WEBSITE
WEBSITEhttps://www.odoo.com/page/employees
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:50:47
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - hr
    - base_setup
    - base
    - web_kanban
    - web
    - mail
    - bus
    - web_tour
    - resource
    - calendar
    - base_action_rule
    - web_calendar
    - product
    - decimal_precision
    - report
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage leave requests and allocations
=====================================

This application controls the leave schedule of your company. It allows employees to request leaves. Then, managers can review requests for leaves and approve or reject them. This way you can control the overall leave planning for the company or department.

You can configure several kinds of leaves (sickness, paid days, ...) and allocate leaves to an employee or department quickly using leave allocation. An employee can also make a request for more days off by making a new Leave allocation. It will increase the total of available days for that leave type (if the request is accepted).

You can keep track of leaves in different ways by following reports:

* Leaves Summary
* Leaves by Department
* Leaves Analysis

A synchronization with an internal agenda (Meetings of the CRM module) is also possible in order to automatically create a meeting when a leave request is accepted by setting up a type of meeting in Leave Type.

Code Analysis

Views touched (28)
XML IDNameModelTypeStatus
edit_holiday_new Leave Request hr.holidays form New
edit_holiday_status_form hr.holidays.status.form hr.holidays.status form New
hr_department_view_kanban hr.department.kanban.inherit hr.department data Inherits hr.hr_department_view_kanban
hr_employee_view_search hr.employee.search.view.inherit hr.employee xpath Inherits hr.view_employee_filter
hr_holidays_leaves_assign_tree_view hr.employee.leave.tree hr.employee tree New
hr_kanban_view_employees_kanban hr.employee.kanban.leaves.status hr.employee xpath Inherits hr.hr_kanban_view_employees
report_holidayssummary report_holidayssummary ir.ui.view qweb New
resource_calendar_form_inherit resource.calendar.form.inherit resource.calendar field Inherits resource.resource_calendar_form
resource_calendar_leave_form_inherit resource.calendar.leaves.form.inherit resource.calendar.leaves field Inherits resource.resource_calendar_leave_form
view_employee_form_leave_inherit hr.employee.leave.form.inherit hr.employee xpath Inherits hr.view_employee_form
view_evaluation_report_graph hr.holidays.graph hr.holidays graph New
view_holiday hr.holidays.tree hr.holidays tree New
view_holiday_allocation_tree hr.holidays.allocation.tree hr.holidays tree New
view_holiday_allocation_tree_customize hr.holidays.allocation.tree.customize hr.holidays tree New
view_holiday_employee hr.holidays.report_employee_tree hr.holidays tree New
view_holiday_graph hr.holidays.report_graph hr.holidays graph New
view_holiday_new_calendar Leave Request hr.holidays calendar New
view_holiday_pivot hr.holidays.report_pivot hr.holidays pivot New
view_holiday_simple hr.holidays.report_tree hr.holidays tree New
view_holiday_status_normal_tree hr.holidays.status.normal.tree hr.holidays.status tree New
view_holiday_status_tree hr.holidays.status.tree hr.holidays.status tree New
view_holidays_status_filter hr.holidays.status.filter hr.holidays.status search New
view_hr_holidays_filter hr.holidays.filter hr.holidays search New
view_hr_holidays_remaining_leaves_user_graph hr.holidays.remaining.leaves.user.graph hr.holidays.remaining.leaves.user graph New
view_hr_holidays_remaining_leaves_user_tree hr.holidays.remaining.leaves.user.tree hr.holidays.remaining.leaves.user tree New
view_hr_holidays_status_search hr.holidays.status.search hr.holidays.status search New
view_hr_holidays_summary_dept hr.holidays.summary.dept.form hr.holidays.summary.dept form New
view_hr_holidays_summary_employee hr.holidays.summary.employee.form hr.holidays.summary.employee form New
Models touched (10)

New fields (4)
  • absence_of_today Integer
    compute='_compute_leave_count' string='Absence by Today'
  • allocation_to_approve_count Integer
    compute='_compute_leave_count' string='Allocation to Approve'
  • leave_to_approve_count Integer
    compute='_compute_leave_count' string='Leave to Approve'
  • total_employee Integer
    compute='_compute_total_employee' string='Total Employee'
Public methods (0)

No public methods.

New fields (8)
  • current_leave_id Many2one → hr.holidays.status
    compute='_compute_leave_status' string='Current Leave Type' args: 'hr.holidays.status'
  • current_leave_state Selection
    compute='_compute_leave_status' selection=[('draft', 'New'), ('confirm', 'Waiting Approval'), ('refuse', 'Refused'), ('validate1', 'Waiting Second Approval'), ('validate', 'Approved'), ('cancel', 'Cancelled')] string='Current Leave Status'
  • is_absent_totay Boolean
    compute='_compute_absent_employee' search='_search_absent_employee' args: 'Absent Today'
  • leave_date_from Date
    compute='_compute_leave_status' args: 'From Date'
  • leave_date_to Date
    compute='_compute_leave_status' args: 'To Date'
  • leaves_count Integer
    compute='_compute_leaves_count' args: 'Number of Leaves'
  • remaining_leaves Float
    compute='_compute_remaining_leaves' help='Total number of legal leaves allocated to this employee, change this value to create allocation/leave request. Total based on all the leave types without overriding limit.' inverse='_inverse_remaining_leaves' string='Remaining Legal Leaves'
  • show_leaves Boolean
    compute='_compute_show_leaves' args: 'Able to see Remaining Leaves'
Public methods (0)

No public methods.

New fields (23)
  • can_reset Boolean
    compute='_compute_can_reset' args: 'Can reset'
  • category_id Many2one → hr.employee.category
    help='Category of Employee' readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Employee Tag' args: 'hr.employee.category'
  • date_from Datetime
    copy=False index=True readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'Start Date'
  • date_to Datetime
    copy=False readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'End Date'
  • department_id Many2one → hr.department
    readonly=True related='employee_id.department_id' store=True string='Department' args: 'hr.department'
  • double_validation Boolean
    related='holiday_status_id.double_validation' args: 'Apply Double Validation'
  • employee_id Many2one → hr.employee
    default=_default_employee index=True readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Employee' args: 'hr.employee'
  • holiday_status_id Many2one → hr.holidays.status
    readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Leave Type' args: 'hr.holidays.status'
  • holiday_type Selection
    default='employee' help='By Employee: Allocation/Request for individual Employee, By Employee Tag: Allocation/Request for group of employees in category' readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Allocation Mode' args: [('employee', 'By Employee'), ('category', 'By Employee Tag')]
  • linked_request_ids One2many → hr.holidays
    string='Linked Requests' args: 'hr.holidays', 'parent_id'
  • manager_id Many2one → hr.employee
    copy=False help='This area is automatically filled by the user who validate the leave' readonly=True string='First Approval' args: 'hr.employee'
  • manager_id2 Many2one → hr.employee
    copy=False help='This area is automaticly filled by the user who validate the leave with second level (If Leave type need second validation)' readonly=True string='Second Approval' args: 'hr.employee'
  • meeting_id Many2one → calendar.event
    string='Meeting' args: 'calendar.event'
  • name Char
    args: 'Description'
  • notes Text
    readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'Reasons'
  • number_of_days Float
    compute='_compute_number_of_days' store=True args: 'Number of Days'
  • number_of_days_temp Float
    copy=False readonly=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} args: 'Allocation'
  • parent_id Many2one → hr.holidays
    string='Parent' args: 'hr.holidays'
  • payslip_status Boolean
    help='Green this button when the leave has been taken into account in the payslip.' args: 'Reported in last payslips'
  • report_note Text
    args: 'HR Comments'
  • state Selection
    copy=False default='confirm' help=<expr> readonly=True string='Status' track_visibility='onchange' args: [('draft', 'To Submit'), ('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')]
  • type Selection
    default='remove' help="Choose 'Leave Request' if someone wants to take an off-day. \nChoose 'Allocation Request' if you want to increase the number of leaves available for someone" index=True readonly=True required=True states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]} string='Request Type' args: [('remove', 'Leave Request'), ('add', 'Allocation Request')]
  • user_id Many2one → res.users
    compute_sudo=True default=<expr> readonly=True related='employee_id.user_id' related_sudo=True store=True string='User' args: 'res.users'
Public methods (11)
  • action_approve(self)
    @api.multi
  • action_confirm(self)
    @api.multi
  • action_draft(self)
    @api.multi
  • action_refuse(self)
    @api.multi
  • action_validate(self)
    @api.multi
  • add_follower(self, employee_id)
    @api.multi
  • create(self, values)
    @api.model
    Override to avoid automatic logging of creation
  • name_get(self)
    @api.multi
  • toggle_payslip_status(self)
    @api.multi
  • unlink(self)
    @api.multi
  • write(self, values)
    @api.multi

New fields (4)
  • leave_type Char
    readonly=True args: 'Leave Type'
  • name Char
    readonly=True args: 'Employee'
  • no_of_leaves Integer
    readonly=True args: 'Remaining leaves'
  • user_id Many2one → res.users
    readonly=True string='User' args: 'res.users'
Public methods (1)
  • init(self)

New fields (11)
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the leave type without removing it.' args: 'Active'
  • categ_id Many2one → calendar.event.type
    help='Once a leave is validated, Odoo will create a corresponding meeting of this type in the calendar.' string='Meeting Type' args: 'calendar.event.type'
  • color_name Selection
    default='red' help='This color will be used in the leaves summary located in Reporting > Leaves by Department.' required=True string='Color in Report' args: [('red', 'Red'), ('blue', 'Blue'), ('lightgreen', 'Light Green'), ('lightblue', 'Light Blue'), ('lightyellow', 'Light Yellow'), ('magenta', 'Magenta'), ('lightcyan', 'Light Cyan'), ('black', 'Black'), ('lightpink', 'Light Pink'), ('brown', 'Brown'), ('violet', 'Violet'), ('lightcoral', 'Light Coral'), ('lightsalmon', 'Light Salmon'), ('lavender', 'Lavender'), ('wheat', 'Wheat'), ('ivory', 'Ivory')]
  • company_id Many2one → res.company
    string='Company' args: 'res.company'
  • double_validation Boolean
    help='When selected, the Allocation/Leave Requests for this type require a second validation to be approved.' string='Apply Double Validation'
  • leaves_taken Float
    compute='_compute_leaves' help='This value is given by the sum of all holidays requests with a negative value.' string='Leaves Already Taken'
  • limit Boolean
    help='If you select this check box, the system allows the employees to take more leaves than the available ones for this type and will not take them into account for the "Remaining Legal Leaves" defined on the employee form.' args: 'Allow to Override Limit'
  • max_leaves Float
    compute='_compute_leaves' help='This value is given by the sum of all holidays requests with a positive value.' string='Maximum Allowed'
  • name Char
    required=True translate=True args: 'Leave Type'
  • remaining_leaves Float
    compute='_compute_leaves' help='Maximum Leaves Allowed - Leaves Already Taken' string='Remaining Leaves'
  • virtual_remaining_leaves Float
    compute='_compute_leaves' help='Maximum Leaves Allowed - Leaves Already Taken - Leaves Waiting Approval' string='Virtual Remaining Leaves'
Public methods (2)
  • get_days(self, employee_id)
    @api.multi
  • name_get(self)
    @api.multi

New fields (3)
  • date_from Date
    default=<expr> required=True string='From'
  • depts Many2many → hr.department
    string='Department(s)' args: 'hr.department', 'summary_dept_rel', 'sum_id', 'dept_id'
  • holiday_type Selection
    default='Approved' required=True string='Leave Type' args: [('Approved', 'Approved'), ('Confirmed', 'Confirmed'), ('both', 'Both Approved and Confirmed')]
Public methods (1)
  • print_report(self)
    @api.multi

New fields (3)
  • date_from Date
    default=<expr> required=True string='From'
  • emp Many2many → hr.employee
    string='Employee(s)' args: 'hr.employee', 'summary_emp_rel', 'sum_id', 'emp_id'
  • holiday_type Selection
    default='Approved' required=True string='Select Leave Type' args: [('Approved', 'Approved'), ('Confirmed', 'Confirmed'), ('both', 'Both Approved and Confirmed')]
Public methods (1)
  • print_report(self)
    @api.multi

New fields (0)

No new fields.

Public methods (1)
  • render_html(self, docids, data=None)
    @api.model

New fields (1)
  • uom_id Many2one → product.uom
    default=<expr> help='Average hours of work per day.\n It is used in an employee leave request to compute the number of days consumed based on the resource calendar.\n It can be used to handle various contract types, e.g.:\n - 38 Hours/Week, 5 Days/Week: 1 Day = 7.6 Hours\n - 45 Hours/Week, 5 Days/Week: 1 Day = 9.0 Hours' required=True string='Hours per Day' args: 'product.uom'
Public methods (0)

No public methods.

New fields (1)
  • holiday_id Many2one → hr.holidays
    string='Leave Request' args: 'hr.holidays'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/9.0/hr_holidays
VERSION
VERSION 1.5
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Christophe Matthieu, Martin Trigaux, Antony Lesuisse, Olivier Dony, Thibault Delavallée, Denis Ledoux, Fabien Meghazi, Christophe Simonis, David Monjoie, Goffin Simon, Simon Lejeune, Nicolas Martinelli, Jérome Maes, Richard Mathot, Géry Debongnie, Aaron Bohy, Damien Bouvy, Yannick Tivisse, qsm-odoo, Martin Geubelle, Denis Vermylen (dve)
WEBSITE
WEBSITEhttps://www.odoo.com/page/employees
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:48:29
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - hr
    - base_setup
    - base
    - web_kanban
    - web
    - mail
    - bus
    - resource
    - web_tip
    - calendar
    - base_action_rule
    - web_calendar
    - report
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage leave requests and allocations
=====================================

This application controls the leave schedule of your company. It allows employees to request leaves. Then, managers can review requests for leaves and approve or reject them. This way you can control the overall leave planning for the company or department.

You can configure several kinds of leaves (sickness, paid days, ...) and allocate leaves to an employee or department quickly using leave allocation. An employee can also make a request for more days off by making a new Leave allocation. It will increase the total of available days for that leave type (if the request is accepted).

You can keep track of leaves in different ways by following reports: 

* Leaves Summary
* Leaves by Department
* Leaves Analysis

A synchronization with an internal agenda (Meetings of the CRM module) is also possible in order to automatically create a meeting when a leave request is accepted by setting up a type of meeting in Leave Type.

Code Analysis

Views touched (27)
XML IDNameModelTypeStatus
edit_holiday_new Leave Request hr.holidays form New
edit_holiday_status_form hr.holidays.status.form hr.holidays.status form New
hr_department_view_kanban hr.department.kanban.inherit hr.department data Inherits hr.hr_department_view_kanban
hr_employee_view_search hr.employee.search.view.inherit hr.employee xpath Inherits hr.view_employee_filter
hr_holidays_leaves_assign_tree_view hr.employee.leave.tree hr.employee tree New
hr_kanban_view_employees_kanban HR - Employees Kanban with leave status hr.employee xpath Inherits hr.hr_kanban_view_employees
report_holidayssummary report_holidayssummary ir.ui.view qweb New
resource_calendar_leave_form_inherit resource.calendar.leaves.form.inherit resource.calendar.leaves field Inherits resource.resource_calendar_leave_form
view_employee_form_leave_inherit hr.employee.leave.form.inherit hr.employee xpath Inherits hr.view_employee_form
view_evaluation_report_graph hr.holidays.graph hr.holidays graph New
view_holiday hr.holidays.tree hr.holidays tree New
view_holiday_allocation_tree hr.holidays.allocation.tree hr.holidays tree New
view_holiday_allocation_tree_customize hr.holidays.allocation.tree.customize hr.holidays tree New
view_holiday_employee hr.holidays.report_employee_tree hr.holidays tree New
view_holiday_graph hr.holidays.report_graph hr.holidays graph New
view_holiday_new_calendar Leave Request hr.holidays calendar New
view_holiday_pivot hr.holidays.report_pivot hr.holidays pivot New
view_holiday_simple hr.holidays.report_tree hr.holidays tree New
view_holiday_status_normal_tree hr.holidays.status.normal.tree hr.holidays.status tree New
view_holiday_status_tree hr.holidays.status.tree hr.holidays.status tree New
view_holidays_status_filter hr.holidays.status.filter hr.holidays.status search New
view_hr_holidays_filter hr.holidays.filter hr.holidays search New
view_hr_holidays_remaining_leaves_user_graph hr.holidays.remaining.leaves.user.graph hr.holidays.remaining.leaves.user graph New
view_hr_holidays_remaining_leaves_user_tree hr.holidays.remaining.leaves.user.tree hr.holidays.remaining.leaves.user tree New
view_hr_holidays_status_search hr.holidays.status.search hr.holidays.status search New
view_hr_holidays_summary_dept hr.holidays.summary.dept.form hr.holidays.summary.dept form New
view_hr_holidays_summary_employee hr.holidays.summary.employee.form hr.holidays.summary.employee form New
Models touched (3)

New fields (4)
  • absence_of_today Integer
    compute='_compute_leave_count' string='Absence by Today'
  • allocation_to_approve_count Integer
    compute='_compute_leave_count' string='Allocation to Approve'
  • leave_to_approve_count Integer
    compute='_compute_leave_count' string='Leave to Approve'
  • total_employee Integer
    compute='_compute_total_employee' string='Total Employee'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • render_html(self, cr, uid, ids, data=None, context=None)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/8.0/hr_holidays
VERSION
VERSION 1.5
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Stephane Wirtel, Odoo Translation Bot, Christophe Matthieu, DBR (OpenERP), Martin Trigaux, Ajay Chauhan (OpenERP), Fabien Pinckaers, Antony Lesuisse, Olivier Dony, Tejas Tank, Thibault Delavallée, Vo Minh Thu, Launchpad Translations on behalf of openerp, Quentin (OpenERP), Denis Ledoux, Fabien Meghazi, ggh-openerp, Christophe Simonis, Xavier Morel, Goffin Simon, Frédéric van der Essen, Vishmita, Nicolas Martinelli, Kersten Jeremy, Amit Bhavsar (Open ERP), Paramjit Singh Sahota, Richard Mathot, Géry Debongnie, jke-openerp, Aaron Bohy, Vishmita Jadeja (openerp), Richard Mathot (OpenERP), ged-odoo, Jeremy Kersten, Gery Debongnie, Randhir Mayatra rma-openerp, Darshan Kalola (OpenERP), Darshan Kalola, Jitendra Prajapati (OpenERP), Yogesh Parekh (OpenERP), Sunil Sharma (OpenERP)
WEBSITE
WEBSITEhttps://www.odoo.com/page/employees
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:45:38
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - hr
    - base_setup
    - base
    - web_kanban
    - web
    - mail
    - resource
    - board
    - calendar
    - base_action_rule
    - web_calendar
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage leaves and allocation requests
=====================================

This application controls the holiday schedule of your company. It allows employees to request holidays. Then, managers can review requests for holidays and approve or reject them. This way you can control the overall holiday planning for the company or department.

You can configure several kinds of leaves (sickness, holidays, paid days, ...) and allocate leaves to an employee or department quickly using allocation requests. An employee can also make a request for more days off by making a new Allocation. It will increase the total of available days for that leave type (if the request is accepted).

You can keep track of leaves in different ways by following reports: 

* Leaves Summary
* Leaves by Department
* Leaves Analysis

A synchronization with an internal agenda (Meetings of the CRM module) is also possible in order to automatically create a meeting when a holiday request is accepted by setting up a type of meeting in Leave Type.

Code Analysis

Views touched (22)
XML IDNameModelTypeStatus
allocation_company_new Leaves Management hr.holidays form New
edit_holiday_new Leave Request hr.holidays form New
edit_holiday_status_form hr.holidays.status.form hr.holidays.status form New
hr_holidays_leaves_assign_tree_view hr.employee.leave.tree hr.employee tree New
hr_kanban_view_employees_kanban HR - Employees Kanban with leave status hr.employee xpath Inherits hr.hr_kanban_view_employees
resource_calendar_leave_form_inherit resource.calendar.leaves.form.inherit resource.calendar.leaves field Inherits resource.resource_calendar_leave_form
view_employee_form_leave_inherit hr.employee.leave.form.inherit hr.employee xpath Inherits hr.view_employee_form
view_evaluation_report_graph hr.holidays.graph hr.holidays graph New
view_holiday hr.holidays.tree hr.holidays tree New
view_holiday_allocation_tree hr.holidays.allocation.tree hr.holidays tree New
view_holiday_graph hr.holidays.report_graph hr.holidays graph New
view_holiday_new_calendar Leave Request hr.holidays calendar New
view_holiday_simple hr.holidays.report_tree hr.holidays tree New
view_holiday_status_normal_tree hr.holidays.status.normal.tree hr.holidays.status tree New
view_holiday_status_tree hr.holidays.status.tree hr.holidays.status tree New
view_holidays_status_filter hr.holidays.status.filter hr.holidays.status search New
view_hr_holidays_filter hr.holidays.filter hr.holidays search New
view_hr_holidays_remaining_leaves_user_graph hr.holidays.remaining.leaves.user.graph hr.holidays.remaining.leaves.user graph New
view_hr_holidays_remaining_leaves_user_tree hr.holidays.remaining.leaves.user.tree hr.holidays.remaining.leaves.user tree New
view_hr_holidays_status_search hr.holidays.status.search hr.holidays.status search New
view_hr_holidays_summary_dept hr.holidays.summary.dept.form hr.holidays.summary.dept form New
view_hr_holidays_summary_employee hr.holidays.summary.employee.form hr.holidays.summary.employee form New
Models touched (0)

No models found for this module.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/7.0/hr_holidays
VERSION
VERSION 1.5
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Jagdish Panchal (Open ERP), Twinkle Christian (OpenERP), Cecile Tonglet, Rucha (Open ERP), Atul Patel (OpenERP), Jalpesh Patel (OpenERP), Randhir Mayatra (OpenERP), Stephane Wirtel, Odoo Translation Bot, Turkesh Patel (Open ERP), Christophe Matthieu, Pinakin Nayi (OpenERP), DBR (OpenERP), Harry (OpenERP), Antonin Bourguignon, ajay javiya (OpenERP), Martin Trigaux, Ajay Chauhan (OpenERP), Foram Katharotiya (OpenERP), Purnendu Singh (OpenERP), Saurang Suthar (OpenERP), Fabien Pinckaers, Antony Lesuisse, Bharat Devnani (OpenERP), Meera Trambadia (OpenERP), Saurang Suthar, Olivier Dony, Rajesh Prajapati (OpenERP), Twinkle (OpenERP), Divyesh Makwana (Open ERP), Tejas Tank, Thibault Delavallée, Vo Minh Thu, Hardik, Josse Colpaert, pso (OpenERP), Sbh (Openerp), Amit Patel (OpenERP), Launchpad Translations on behalf of openerp, vta vta@openerp.com, Quentin (OpenERP), Kuldeep Joshi (OpenERP), Nimesh (Open ERP), Denis Ledoux, ara@tinyerp.com, Mayur Maheshwari (OpenERP), Jigar Amin - OpenERP, Sanjay Gohel (Open ERP), help, Xavier ALT, Khushboo Bhatt (Open ERP), dle@openerp.com, Amit Patel, Frédéric van der Essen, Gilles Major, Vijaykumar Baladaniya, Hardik Ansodariya, Dhruti Shastri (OpenERP), Jigar Amin, Somesh Khare (OpenERP), antonylesuisse, JoshuaJan, Ashvin Rathod (OpenERP), Meera Trambadia
WEBSITE
WEBSITEhttp://www.openerp.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:43:09
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - hr
    - base_setup
    - base
    - web_kanban
    - web
    - mail
    - resource
    - process
    - board
    - base_calendar
    - base_status
    - base_action_rule
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage leaves and allocation requests
=====================================

This application controls the holiday schedule of your company. It allows employees to request holidays. Then, managers can review requests for holidays and approve or reject them. This way you can control the overall holiday planning for the company or department.

You can configure several kinds of leaves (sickness, holidays, paid days, ...) and allocate leaves to an employee or department quickly using allocation requests. An employee can also make a request for more days off by making a new Allocation. It will increase the total of available days for that leave type (if the request is accepted).

You can keep track of leaves in different ways by following reports: 

* Leaves Summary
* Leaves by Department
* Leaves Analysis

A synchronization with an internal agenda (Meetings of the CRM module) is also possible in order to automatically create a meeting when a holiday request is accepted by setting up a type of meeting in Leave Type.

Code Analysis

Views touched (22)
XML IDNameModelTypeStatus
allocation_company_new Leaves Management hr.holidays form New
allocation_leave_new Allocation Request hr.holidays form New
board_hr_holidays_leave_by_month_form board.hr.holidays.leave.month.form board.board xpath Inherits hr.board_hr_form
edit_holiday_new Leave Request hr.holidays form New
edit_holiday_status_form hr.holidays.status.form hr.holidays.status form New
hr_holidays_leaves_assign_tree_view hr.employee.leave.tree hr.employee tree New
hr_kanban_view_employees_kanban HR - Employees Kanban with leave status hr.employee xpath Inherits hr.hr_kanban_view_employees
resource_calendar_leave_form_inherit resource.calendar.leaves.form.inherit resource.calendar.leaves field Inherits resource.resource_calendar_leave_form
view_employee_form_leave_inherit hr.employee.leave.form.inherit hr.employee xpath Inherits hr.view_employee_form
view_holiday hr.holidays.tree hr.holidays tree New
view_holiday_allocation_tree hr.holidays.allocation.tree hr.holidays tree New
view_holiday_new_calendar Leave Request hr.holidays calendar New
view_holiday_simple hr.holidays.report_tree hr.holidays tree New
view_holiday_status_normal_tree hr.holidays.status.normal.tree hr.holidays.status tree New
view_holiday_status_tree hr.holidays.status.tree hr.holidays.status tree New
view_holidays_status_filter hr.holidays.status.filter hr.holidays.status search New
view_hr_holidays_filter hr.holidays.filter hr.holidays search New
view_hr_holidays_remaining_leaves_user_graph hr.holidays.remaining.leaves.user.graph hr.holidays.remaining.leaves.user graph New
view_hr_holidays_remaining_leaves_user_tree hr.holidays.remaining.leaves.user.tree hr.holidays.remaining.leaves.user tree New
view_hr_holidays_status_search hr.holidays.status.search hr.holidays.status search New
view_hr_holidays_summary_dept hr.holidays.summary.dept.form hr.holidays.summary.dept form New
view_hr_holidays_summary_employee hr.holidays.summary.employee.form hr.holidays.summary.employee form New
Models touched (0)

No models found for this module.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/6.1/hr_holidays
VERSION
VERSION 1.5
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Jagdish Panchal (Open ERP), Rucha (Open ERP), Stephane Wirtel, Numerigraphe - Lionel Sausin, Fabien Pinckaers, Antony Lesuisse, Meera Trambadia (OpenERP), Olivier Dony, Divyesh Makwana (Open ERP), Thibault Delavallée, Vo Minh Thu, pso (OpenERP), Launchpad Translations on behalf of openerp, Quentin (OpenERP), Mayur Maheshwari (OpenERP), Jigar Amin - OpenERP, vro, niv-openerp, Xavier ALT, Christophe Simonis, Ujjvala Collins (OpenERP), Xavier Morel, Chris Biersbach, Amit (OpenERP), Minh Tran, Amit Bhavsar (Open ERP), Thibault Francois, Carlos Vásquez, Mantavya Gajjar, ksa (Open ERP), Husen Daudi, Els Van Vossel, Israel Fermin Montilla, mayur maheshwari (Open ERP), Hardik Ansodariy (OpenERP), ssu, rch-openerp, Bharat (OpenERP), ARA (OpenERP), aag (OpenERP), ron@tinyerp.com, mtr, fp, AMP (OpenERP), Mustufa Rangwala, psi (Open ERP), Tejas (OpenERP), Hemendra Paregi (Open ERP), skh, Atik Agewan (OpenERP), Julien Thewys
WEBSITE
WEBSITEhttp://www.openerp.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:41:35
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - hr
    - base_setup
    - base
    - mail
    - base_tools
    - resource
    - process
    - board
    - crm
    - base_action_rule
    - base_calendar
    - fetchmail
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module allows you to manage leaves and leaves' requests.
=============================================================

Implements a dashboard for human resource management that includes.
    * Leaves

Note that:
    - A synchronisation with an internal agenda (use of the CRM module) is possible: in order to automatically create a case when an holiday request is accepted, you have to link the holidays status to a case section. You can set up this info and your colour preferences in
                Human Resources/Configuration/Holidays/Leave Type
    - An employee can make an ask for more off-days by making a new Allocation It will increase his total of that leave type available (if the request is accepted).
    - There are two ways to print the employee's holidays:
        * The first will allow to choose employees by department and is used by clicking the menu item located in
                Human Resources/Reporting/Holidays/Leaves by Department
        * The second will allow you to choose the holidays report for specific employees. Go on the list
                Human Resources/Human Resources/Employees
                then select the ones you want to choose, click on the print icon and select the option
                'Employee's Holidays'
    - The wizard allows you to choose if you want to print either the Confirmed & Validated holidays or only the Validated ones. These states must be set up by a user from the group 'HR'. You can define these features in the security tab from the user data in
                Administration / Users / Users
                for example, you maybe will do it for the user 'admin'.

Code Analysis

Views touched (23)
XML IDNameModelTypeStatus
allocation_company_new Leaves Management hr.holidays form New
allocation_leave_new Allocation Request hr.holidays form New
board_hr_holidays_leave_by_month_form board.hr.holidays.leave.month.form board.board xpath Inherits hr.board_hr_form
board_hr_holidays_manager_form board.hr.holidays.manager.form board.board xpath Inherits hr.board_hr_manager_form
edit_holiday_new Leave Request hr.holidays form New
edit_holiday_status_form hr.holidays.status.form hr.holidays.status form New
hr_holidays_leaves_assign_tree_view hr.employee.leave.tree hr.employee tree New
hr_kanban_view_employees_kanban HR - Employees Kanban with leave status hr.employee xpath Inherits hr.hr_kanban_view_employees
resource_calendar_leave_form_inherit resource.calendar.leaves.form.inherit resource.calendar.leaves field Inherits resource.resource_calendar_leave_form
view_employee_form_leave_inherit hr.employee.leave.form.inherit hr.employee field Inherits hr.view_employee_form
view_holiday hr.holidays.tree hr.holidays tree New
view_holiday_allocation_tree hr.holidays.allocation.tree hr.holidays tree New
view_holiday_new_calendar Leave Request hr.holidays calendar New
view_holiday_simple hr.holidays.report_tree hr.holidays tree New
view_holiday_status_normal_tree hr.holidays.status.normal.tree hr.holidays.status tree New
view_holiday_status_tree hr.holidays.status.tree hr.holidays.status tree New
view_holidays_status_filter hr.holidays.status.filter hr.holidays.status search New
view_hr_holidays_filter hr.holidays.filter hr.holidays search New
view_hr_holidays_remaining_leaves_user_graph hr.holidays.remaining.leaves.user.graph hr.holidays.remaining.leaves.user graph New
view_hr_holidays_remaining_leaves_user_tree hr.holidays.remaining.leaves.user.tree hr.holidays.remaining.leaves.user tree New
view_hr_holidays_status_search hr.holidays.status.search hr.holidays.status search New
view_hr_holidays_summary_dept hr.holidays.summary.dept.form hr.holidays.summary.dept form New
view_hr_holidays_summary_employee hr.holidays.summary.employee.form hr.holidays.summary.employee form New
Models touched (0)

No models found for this module.