Theoretical vs Attended Time Analysis

hr_attendance_report_theoretical_time
REPOSITORY
REPOSITORYOCA/hr-attendance
GIT
GIThttps://github.com/OCA/hr-attendance.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/hr-attendance/tree/18.0/hr_attendance_report_theoretical_time
VERSION
VERSION 1.2.0
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSVíctor Martínez, OCA-git-bot, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/hr-attendance
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:16
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/calendar:
    - calendar_public_holiday
OCA/hr-holidays:
    - hr_holidays_public
odoo/odoo:
    - hr_attendance
    - hr
    - base_setup
    - base
    - web
    - digest
    - mail
    - bus
    - web_tour
    - html_editor
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - phone_validation
    - resource_mail
    - barcodes
    - hr_holidays
    - calendar
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES openupgradelib
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module adds a new report called "Theoretical vs Attended Time
Analysis" that compares worked time, measured through attendances
records, with the theoretical time, computed from employee's working
calendar, public holidays and employee specific leaves. Missing
attendance days are generated on the fly in the report with their
corresponding theoretical hours.

There is the possibility of counting as theoretical time some leave
types if specified in them.

As an example, imagine a work week with 40 theoretical hours, and these
attendance situation:

- Monday: Worked 10 hours
- Tuesday: Worked 10 hours
- Wednesday: Worked 10 hours
- Thursday: Worked 10 hours
- Friday: Ask for a compensation leave (said leave type), as already
  worked 40 hours.

On the report, whole week should put 40 theoretical hours - 8 per day -
against 40 worked hours (although they were on previous days, and none
on Friday).

On contrary, if you want to take a holiday one of that days, you should
ask for a leave type without the check for counting as theoretical time,
and then the whole week will be 32 theoretical hours against the worked
hours of that week without the leave.

Code Analysis

Views touched (8)
XML IDNameModelTypeStatus
edit_holiday_status_form hr.leave.type field Inherits hr_holidays.edit_holiday_status_form
hr_attendance_theoretical_view_filter hr.attendance.theoretical.time.report search New
hr_attendance_theoretical_view_graph hr.attendance.theoretical.time.report graph New
hr_attendance_theoretical_view_pivot hr.attendance.theoretical.time.report pivot New
hr_attendance_view_pivot hr.attendance.pivot - Don't show "Theoretical hours" measure hr.attendance field Inherits hr_attendance.hr_attendance_view_pivot
recompute_theoretical_attendance_form recompute.theoretical.attendance form New
view_employee_form_inherit_hr_attendance hr.employee field Inherits hr.view_employee_form
wizard_theoretical_time_form_view wizard.theoretical.time.form (in hr_attendance_report_theoretical_time) wizard.theoretical.time form New
Models touched (10)

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
    Trigger recomputation for the date of the new lines.
  • write(self, vals)
    If the date of a line is changed, we first recompute hours of the previous date, and then the theoretical hours of the current date.

New fields (1)
  • theoretical_hours Float
    compute='_compute_theoretical_hours' compute_sudo=True store=True
Public methods (0)

No public methods.

New fields (7)
  • company_id Many2one
    related='employee_id.company_id'
  • date Date
    readonly=True
  • department_id Many2one → hr.department
    comodel_name='hr.department' readonly=True string='Department'
  • difference Float
    readonly=True
  • employee_id Many2one → hr.employee
    comodel_name='hr.employee' readonly=True string='Employee'
  • theoretical_hours Float
    readonly=True string='Theoric'
  • worked_hours Float
    readonly=True string='Worked'
Public methods (2)
  • init(self)
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
    Compute dynamically theoretical hours amount, computing on the fly theoretical hours for non existing attendances with stored hours. This technique has proven to be more efficient than trying to call recursively `read_group` grouping by date and employee.

New fields (1)
  • theoretical_hours_start_date Date
    help='Fill this field for setting a manual start date for computing the theoretical hours independently from the attendances. If not filled, employee creation date or the calendar start date will be used (the greatest of both).'
Public methods (0)

No public methods.

New fields (1)
  • theoretical_hours_start_date Date
    help='Fill this field for setting a manual start date for computing the theoretical hours independently from the attendances. If not filled, employee creation date or the calendar start date will be used (the greatest of both).'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • include_in_theoretical Boolean
    help="If you check this mark, leaves in this category won't reduce the number of theoretical hours in the attendance report." string='Include in theoretical hours'
Public methods (0)

No public methods.

New fields (3)
  • date_from Datetime
    help='Recompute attendances from this date' required=True string='From'
  • date_to Datetime
    help='Recompute attendances up to this date' required=True string='To'
  • employee_ids Many2many → hr.employee
    comodel_name='hr.employee' help='Recompute these employees attendances' required=True string='Employees'
Public methods (1)
  • action_recompute(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • category_ids Many2many → hr.employee.category
    comodel_name='hr.employee.category' string='Tag'
  • department_id Many2one → hr.department
    comodel_name='hr.department' string='Department'
  • employee_ids Many2many → hr.employee
    comodel_name='hr.employee' string='Employees'
Public methods (3)
  • default_get(self, fields)
    @api.model
  • populate(self)
  • view_report(self)
REPOSITORY
REPOSITORYOCA/hr-attendance
GIT
GIThttps://github.com/OCA/hr-attendance.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/hr-attendance/tree/17.0/hr_attendance_report_theoretical_time
VERSION
VERSION 1.1.0
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSVíctor Martínez, Weblate, OCA-git-bot, Juanjo, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/hr-attendance
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:08
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/hr-holidays:
    - hr_holidays_public
odoo/odoo:
    - hr_attendance
    - hr
    - base_setup
    - base
    - web
    - phone_validation
    - mail
    - bus
    - web_tour
    - resource
    - barcodes
    - hr_holidays
    - calendar
    - onboarding
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module adds a new report called "Theoretical vs Attended Time
Analysis" that compares worked time, measured through attendances
records, with the theoretical time, computed from employee's working
calendar, public holidays and employee specific leaves. Missing
attendance days are generated on the fly in the report with their
corresponding theoretical hours.

There is the possibility of counting as theoretical time some leave
types if specified in them.

As an example, imagine a work week with 40 theoretical hours, and these
attendance situation:

- Monday: Worked 10 hours
- Tuesday: Worked 10 hours
- Wednesday: Worked 10 hours
- Thursday: Worked 10 hours
- Friday: Ask for a compensation leave (said leave type), as already
  worked 40 hours.

On the report, whole week should put 40 theoretical hours - 8 per day -
against 40 worked hours (although they were on previous days, and none
on Friday).

On contrary, if you want to take a holiday one of that days, you should
ask for a leave type without the check for counting as theoretical time,
and then the whole week will be 32 theoretical hours against the worked
hours of that week without the leave.

Code Analysis

Views touched (8)
XML IDNameModelTypeStatus
edit_holiday_status_form hr.leave.type field Inherits hr_holidays.edit_holiday_status_form
hr_attendance_theoretical_view_filter hr.attendance.theoretical.time.report search New
hr_attendance_theoretical_view_graph hr.attendance.theoretical.time.report graph New
hr_attendance_theoretical_view_pivot hr.attendance.theoretical.time.report pivot New
hr_attendance_view_pivot hr.attendance.pivot - Don't show "Theoretical hours" measure hr.attendance field Inherits hr_attendance.hr_attendance_view_pivot
recompute_theoretical_attendance_form recompute.theoretical.attendance form New
view_employee_form_inherit_hr_attendance hr.employee field Inherits hr.view_employee_form
wizard_theoretical_time_form_view wizard.theoretical.time.form (in hr_attendance_report_theoretical_time) wizard.theoretical.time form New
Models touched (9)

New fields (1)
  • theoretical_hours Float
    compute='_compute_theoretical_hours' compute_sudo=True store=True
Public methods (0)

No public methods.

New fields (7)
  • company_id Many2one
    related='employee_id.company_id'
  • date Date
    readonly=True
  • department_id Many2one → hr.department
    comodel_name='hr.department' readonly=True string='Department'
  • difference Float
    readonly=True
  • employee_id Many2one → hr.employee
    comodel_name='hr.employee' readonly=True string='Employee'
  • theoretical_hours Float
    readonly=True string='Theoric'
  • worked_hours Float
    readonly=True string='Worked'
Public methods (2)
  • init(self)
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
    Compute dynamically theoretical hours amount, computing on the fly theoretical hours for non existing attendances with stored hours. This technique has proven to be more efficient than trying to call recursively `read_group` grouping by date and employee.

New fields (1)
  • theoretical_hours_start_date Date
    help='Fill this field for setting a manual start date for computing the theoretical hours independently from the attendances. If not filled, employee creation date or the calendar start date will be used (the greatest of both).'
Public methods (0)

No public methods.

New fields (1)
  • theoretical_hours_start_date Date
    help='Fill this field for setting a manual start date for computing the theoretical hours independently from the attendances. If not filled, employee creation date or the calendar start date will be used (the greatest of both).'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
    Trigger recomputation for the date of the new lines.
  • write(self, vals)
    If the date of a line is changed, we first recompute hours of the previous date, and then the theoretical hours of the current date.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • include_in_theoretical Boolean
    help="If you check this mark, leaves in this category won't reduce the number of theoretical hours in the attendance report." string='Include in theoretical hours'
Public methods (0)

No public methods.

New fields (3)
  • date_from Datetime
    help='Recompute attendances from this date' required=True string='From'
  • date_to Datetime
    help='Recompute attendances up to this date' required=True string='To'
  • employee_ids Many2many → hr.employee
    comodel_name='hr.employee' help='Recompute these employees attendances' required=True string='Employees'
Public methods (1)
  • action_recompute(self)

New fields (3)
  • category_ids Many2many → hr.employee.category
    comodel_name='hr.employee.category' string='Tag'
  • department_id Many2one → hr.department
    comodel_name='hr.department' string='Department'
  • employee_ids Many2many → hr.employee
    comodel_name='hr.employee' string='Employees'
Public methods (3)
  • default_get(self, fields)
    @api.model
  • populate(self)
  • view_report(self)
REPOSITORY
REPOSITORYOCA/hr-attendance
GIT
GIThttps://github.com/OCA/hr-attendance.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/hr-attendance/tree/16.0/hr_attendance_report_theoretical_time
VERSION
VERSION 1.2.0
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSVíctor Martínez, Weblate, OCA-git-bot, oca-ci, Dũng (Trần Đình)
WEBSITE
WEBSITEhttps://github.com/OCA/hr-attendance
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:53
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/hr-holidays:
    - hr_holidays_public
odoo/odoo:
    - hr_attendance
    - hr
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - resource
    - barcodes
    - hr_holidays
    - calendar
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (8)
XML IDNameModelTypeStatus
edit_holiday_status_form hr.leave.type field Inherits hr_holidays.edit_holiday_status_form
hr_attendance_theoretical_view_filter hr.attendance.theoretical.time.report search New
hr_attendance_theoretical_view_graph hr.attendance.theoretical.time.report graph New
hr_attendance_theoretical_view_pivot hr.attendance.theoretical.time.report pivot New
hr_attendance_view_pivot hr.attendance.pivot - Don't show "Theoretical hours" measure hr.attendance.report field Inherits hr_attendance.hr_attendance_report_view_pivot
recompute_theoretical_attendance_form recompute.theoretical.attendance form New
view_employee_form_inherit_hr_attendance hr.employee field Inherits hr.view_employee_form
wizard_theoretical_time_form_view wizard.theoretical.time.form (in hr_attendance_report_theoretical_time) wizard.theoretical.time form New
Models touched (10)

New fields (1)
  • theoretical_hours Float
    compute='_compute_theoretical_hours' compute_sudo=True store=True
Public methods (0)

No public methods.

New fields (1)
  • theoretical_hours Float
    readonly=True
Public methods (0)

No public methods.

New fields (7)
  • company_id Many2one
    related='employee_id.company_id'
  • date Date
    readonly=True
  • department_id Many2one → hr.department
    comodel_name='hr.department' readonly=True string='Department'
  • difference Float
    readonly=True
  • employee_id Many2one → hr.employee
    comodel_name='hr.employee' readonly=True string='Employee'
  • theoretical_hours Float
    readonly=True string='Theoric'
  • worked_hours Float
    readonly=True string='Worked'
Public methods (2)
  • init(self)
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
    Compute dynamically theoretical hours amount, computing on the fly theoretical hours for non existing attendances with stored hours. This technique has proven to be more efficient than trying to call recursively `read_group` grouping by date and employee.

New fields (1)
  • theoretical_hours_start_date Date
    help='Fill this field for setting a manual start date for computing the theoretical hours independently from the attendances. If not filled, employee creation date or the calendar start date will be used (the greatest of both).'
Public methods (0)

No public methods.

New fields (1)
  • theoretical_hours_start_date Date
    help='Fill this field for setting a manual start date for computing the theoretical hours independently from the attendances. If not filled, employee creation date or the calendar start date will be used (the greatest of both).'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
    Trigger recomputation for the date of the new lines.
  • write(self, vals)
    If the date of a line is changed, we first recompute hours of the previous date, and then the theoretical hours of the current date.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • include_in_theoretical Boolean
    help="If you check this mark, leaves in this category won't reduce the number of theoretical hours in the attendance report." string='Include in theoretical hours'
Public methods (0)

No public methods.

New fields (3)
  • date_from Datetime
    help='Recompute attendances from this date' required=True string='From'
  • date_to Datetime
    help='Recompute attendances up to this date' required=True string='To'
  • employee_ids Many2many → hr.employee
    comodel_name='hr.employee' help='Recompute these employees attendances' required=True string='Employees'
Public methods (1)
  • action_recompute(self)

New fields (3)
  • category_ids Many2many → hr.employee.category
    comodel_name='hr.employee.category' string='Tag'
  • department_id Many2one → hr.department
    comodel_name='hr.department' string='Department'
  • employee_ids Many2many → hr.employee
    comodel_name='hr.employee' string='Employees'
Public methods (3)
  • default_get(self, fields)
    @api.model
  • populate(self)
  • view_report(self)
REPOSITORY
REPOSITORYOCA/hr-attendance
GIT
GIThttps://github.com/OCA/hr-attendance.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/hr-attendance/tree/15.0/hr_attendance_report_theoretical_time
VERSION
VERSION 1.3.0
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSVíctor Martínez, Weblate, OCA-git-bot, David, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/hr-attendance
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:39
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/hr-holidays:
    - hr_holidays_public
odoo/odoo:
    - hr_attendance
    - hr
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - resource
    - barcodes
    - hr_holidays
    - calendar
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (8)
XML IDNameModelTypeStatus
edit_holiday_status_form hr.leave.type field Inherits hr_holidays.edit_holiday_status_form
hr_attendance_theoretical_view_filter hr.attendance.theoretical.time.report search New
hr_attendance_theoretical_view_graph hr.attendance.theoretical.time.report graph New
hr_attendance_theoretical_view_pivot hr.attendance.theoretical.time.report pivot New
hr_attendance_view_pivot hr.attendance.pivot - Don't show "Theoretical hours" measure hr.attendance.report field Inherits hr_attendance.hr_attendance_report_view_pivot
recompute_theoretical_attendance_form recompute.theoretical.attendance form New
view_employee_form_inherit_hr_attendance hr.employee field Inherits hr.view_employee_form
wizard_theoretical_time_form_view wizard.theoretical.time.form (in hr_attendance_report_theoretical_time) wizard.theoretical.time form New
Models touched (10)

New fields (1)
  • theoretical_hours Float
    compute='_compute_theoretical_hours' compute_sudo=True store=True
Public methods (0)

No public methods.

New fields (1)
  • theoretical_hours Float
    readonly=True
Public methods (0)

No public methods.

New fields (7)
  • company_id Many2one
    related='employee_id.company_id'
  • date Date
    readonly=True
  • department_id Many2one → hr.department
    comodel_name='hr.department' readonly=True string='Department'
  • difference Float
    readonly=True
  • employee_id Many2one → hr.employee
    comodel_name='hr.employee' readonly=True string='Employee'
  • theoretical_hours Float
    readonly=True string='Theoric'
  • worked_hours Float
    readonly=True string='Worked'
Public methods (2)
  • init(self)
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
    Compute dynamically theoretical hours amount, computing on the fly theoretical hours for non existing attendances with stored hours. This technique has proven to be more efficient than trying to call recursively `read_group` grouping by date and employee.

New fields (1)
  • theoretical_hours_start_date Date
    help='Fill this field for setting a manual start date for computing the theoretical hours independently from the attendances. If not filled, employee creation date or the calendar start date will be used (the greatest of both).'
Public methods (0)

No public methods.

New fields (1)
  • theoretical_hours_start_date Date
    help='Fill this field for setting a manual start date for computing the theoretical hours independently from the attendances. If not filled, employee creation date or the calendar start date will be used (the greatest of both).'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
    Trigger recomputation for the date of the new lines.
  • write(self, vals)
    If the date of a line is changed, we first recompute hours of the previous date, and then the theoretical hours of the current date.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • include_in_theoretical Boolean
    help="If you check this mark, leaves in this category won't reduce the number of theoretical hours in the attendance report." string='Include in theoretical hours'
Public methods (0)

No public methods.

New fields (3)
  • date_from Datetime
    help='Recompute attendances from this date' required=True string='From'
  • date_to Datetime
    help='Recompute attendances up to this date' required=True string='To'
  • employee_ids Many2many → hr.employee
    comodel_name='hr.employee' help='Recompute these employees attendances' required=True string='Employees'
Public methods (1)
  • action_recompute(self)

New fields (3)
  • category_ids Many2many → hr.employee.category
    comodel_name='hr.employee.category' string='Tag'
  • department_id Many2one → hr.department
    comodel_name='hr.department' string='Department'
  • employee_ids Many2many → hr.employee
    comodel_name='hr.employee' string='Employees'
Public methods (3)
  • default_get(self, fields)
    @api.model
  • populate(self)
  • view_report(self)
REPOSITORY
REPOSITORYOCA/hr-attendance
GIT
GIThttps://github.com/OCA/hr-attendance.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/hr-attendance/tree/14.0/hr_attendance_report_theoretical_time
VERSION
VERSION 1.0.5
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSOCA Transbot, Víctor Martínez, oca-travis, Weblate, OCA-git-bot, Maksym Yankin, Aritz Olea
WEBSITE
WEBSITEhttps://github.com/OCA/hr-attendance
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:41:06
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/hr-holidays:
    - hr_holidays_public
odoo/odoo:
    - hr_attendance
    - hr
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - resource
    - barcodes
    - hr_holidays
    - calendar
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (8)
XML IDNameModelTypeStatus
edit_holiday_status_form hr.leave.type field Inherits hr_holidays.edit_holiday_status_form
hr_attendance_theoretical_view_filter hr.attendance.theoretical.time.report search New
hr_attendance_theoretical_view_graph hr.attendance.theoretical.time.report graph New
hr_attendance_theoretical_view_pivot hr.attendance.theoretical.time.report pivot New
hr_attendance_view_pivot hr.attendance.pivot - Don't show "Theoretical hours" measure hr.attendance field Inherits hr_attendance.hr_attendance_view_pivot
recompute_theoretical_attendance_form recompute.theoretical.attendance form New
view_employee_form_inherit_hr_attendance hr.employee field Inherits hr.view_employee_form
wizard_theoretical_time_form_view wizard.theoretical.time.form (in hr_attendance_report_theoretical_time) wizard.theoretical.time form New
Models touched (9)

New fields (1)
  • theoretical_hours Float
    compute='_compute_theoretical_hours' compute_sudo=True store=True
Public methods (0)

No public methods.

New fields (6)
  • date Date
    readonly=True string='Date'
  • department_id Many2one → hr.department
    comodel_name='hr.department' readonly=True string='Department'
  • difference Float
    readonly=True
  • employee_id Many2one → hr.employee
    comodel_name='hr.employee' readonly=True string='Employee'
  • theoretical_hours Float
    readonly=True string='Theoric'
  • worked_hours Float
    readonly=True string='Worked'
Public methods (2)
  • init(self)
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
    Compute dynamically theoretical hours amount, computing on the fly theoretical hours for non existing attendances with stored hours. This technique has proven to be more efficient than trying to call recursively `read_group` grouping by date and employee.

New fields (1)
  • theoretical_hours_start_date Date
    help='Fill this field for setting a manual start date for computing the theoretical hours independently from the attendances. If not filled, employee creation date or the calendar start date will be used (the greatest of both).'
Public methods (0)

No public methods.

New fields (1)
  • theoretical_hours_start_date Date
    help='Fill this field for setting a manual start date for computing the theoretical hours independently from the attendances. If not filled, employee creation date or the calendar start date will be used (the greatest of both).'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
    Trigger recomputation for the date of the new lines.
  • write(self, vals)
    If the date of a line is changed, we first recompute hours of the previous date, and then the theoretical hours of the current date.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • include_in_theoretical Boolean
    help="If you check this mark, leaves in this category won't reduce the number of theoretical hours in the attendance report." string='Include in theoretical hours'
Public methods (0)

No public methods.

New fields (3)
  • date_from Datetime
    help='Recompute attendances from this date' required=True string='From'
  • date_to Datetime
    help='Recompute attendances up to this date' required=True string='To'
  • employee_ids Many2many → hr.employee
    comodel_name='hr.employee' help='Recompute these employees attendances' required=True string='Employees'
Public methods (1)
  • action_recompute(self)

New fields (3)
  • category_ids Many2many → hr.employee.category
    comodel_name='hr.employee.category' string='Tag'
  • department_id Many2one → hr.department
    comodel_name='hr.department' string='Department'
  • employee_ids Many2many → hr.employee
    comodel_name='hr.employee' string='Employees'
Public methods (3)
  • default_get(self, fields)
    @api.model
  • populate(self)
  • view_report(self)
REPOSITORY
REPOSITORYOCA/hr-attendance
GIT
GIThttps://github.com/OCA/hr-attendance.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/hr-attendance/tree/13.0/hr_attendance_report_theoretical_time
VERSION
VERSION 1.1.5
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSmreficent, Enric Tobella, OCA Transbot, Víctor Martínez, oca-travis, Weblate, OCA-git-bot, Pedro Gonzalez
WEBSITE
WEBSITEhttps://github.com/OCA/hr-attendance
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:17
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/hr-holidays:
    - hr_holidays_public
odoo/odoo:
    - hr_attendance
    - hr
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - resource
    - mail_bot
    - barcodes
    - hr_holidays
    - calendar
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (8)
XML IDNameModelTypeStatus
edit_holiday_status_form hr.leave.type field Inherits hr_holidays.edit_holiday_status_form
hr_attendance_theoretical_view_filter hr.attendance.theoretical.time.report search New
hr_attendance_theoretical_view_graph hr.attendance.theoretical.time.report graph New
hr_attendance_theoretical_view_pivot hr.attendance.theoretical.time.report pivot New
hr_attendance_view_pivot hr.attendance.pivot - Don't show "Theoretical hours" measure hr.attendance field Inherits hr_attendance.hr_attendance_view_pivot
recompute_theoretical_attendance_form recompute.theoretical.attendance form New
view_employee_form_inherit_hr_attendance hr.employee field Inherits hr.view_employee_form
wizard_theoretical_time_form_view wizard.theoretical.time.form (in hr_attendance_report_theoretical_time) wizard.theoretical.time form New
Models touched (9)

New fields (1)
  • theoretical_hours Float
    compute='_compute_theoretical_hours' compute_sudo=True store=True
Public methods (0)

No public methods.

New fields (6)
  • date Date
    readonly=True string='Date'
  • department_id Many2one → hr.department
    comodel_name='hr.department' readonly=True string='Department'
  • difference Float
    readonly=True
  • employee_id Many2one → hr.employee
    comodel_name='hr.employee' readonly=True string='Employee'
  • theoretical_hours Float
    readonly=True string='Theoric'
  • worked_hours Float
    readonly=True string='Worked'
Public methods (2)
  • init(self)
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
    Compute dynamically theoretical hours amount, computing on the fly theoretical hours for non existing attendances with stored hours. This technique has proven to be more efficient than trying to call recursively `read_group` grouping by date and employee.

New fields (1)
  • theoretical_hours_start_date Date
    help='Fill this field for setting a manual start date for computing the theoretical hours independently from the attendances. If not filled, employee creation date or the calendar start date will be used (the greatest of both).'
Public methods (0)

No public methods.

New fields (1)
  • theoretical_hours_start_date Date
    help='Fill this field for setting a manual start date for computing the theoretical hours independently from the attendances. If not filled, employee creation date or the calendar start date will be used (the greatest of both).'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
    Trigger recomputation for the date of the new lines.
  • write(self, vals)
    If the date of a line is changed, we first recompute hours of the previous date, and then the theoretical hours of the current date.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • include_in_theoretical Boolean
    help="If you check this mark, leaves in this category won't reduce the number of theoretical hours in the attendance report." string='Include in theoretical hours'
Public methods (0)

No public methods.

New fields (3)
  • date_from Datetime
    help='Recompute attendances from this date' required=True string='From'
  • date_to Datetime
    help='Recompute attendances up to this date' required=True string='To'
  • employee_ids Many2many → hr.employee
    comodel_name='hr.employee' help='Recompute these employees attendances' required=True string='Employees'
Public methods (1)
  • action_recompute(self)

New fields (3)
  • category_ids Many2many → hr.employee.category
    comodel_name='hr.employee.category' string='Tag'
  • department_id Many2one → hr.department
    comodel_name='hr.department' string='Department'
  • employee_ids Many2many → hr.employee
    comodel_name='hr.employee' string='Employees'
Public methods (3)
  • default_get(self, fields)
    @api.model
  • populate(self)
  • view_report(self)
REPOSITORY
REPOSITORYOCA/hr
GIT
GIThttps://github.com/OCA/hr.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/hr/tree/12.0/hr_attendance_report_theoretical_time
VERSION
VERSION 1.5.1
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSPedro M. Baeza, GitHub, Enric Tobella, david, OCA Transbot, Víctor Martínez, oca-travis, Weblate, OCA-git-bot, Timon Tschanz, Jaime Arroyo
WEBSITE
WEBSITEhttps://github.com/OCA/hr
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:19
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/hr:
    - hr_holidays_public
odoo/odoo:
    - hr_attendance
    - hr
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - resource
    - barcodes
    - hr_holidays
    - calendar
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (8)
XML IDNameModelTypeStatus
edit_holiday_status_form hr.leave.type field Inherits hr_holidays.edit_holiday_status_form
hr_attendance_theoretical_view_filter hr.attendance.theoretical.time.report search New
hr_attendance_theoretical_view_graph hr.attendance.theoretical.time.report graph New
hr_attendance_theoretical_view_pivot hr.attendance.theoretical.time.report pivot New
hr_attendance_view_pivot hr.attendance.pivot - Don't show "Theoretical hours" measure hr.attendance field Inherits hr_attendance.hr_attendance_view_pivot
recompute_theoretical_attendance_form recompute.theoretical.attendance form New
view_employee_form_inherit_hr_attendance hr.employee field Inherits hr_attendance.view_employee_form_inherit_hr_attendance
wizard_theoretical_time_form_view wizard.theoretical.time.form (in hr_attendance_report_theoretical_time) wizard.theoretical.time form New
Models touched (8)

New fields (1)
  • theoretical_hours Float
    compute='_compute_theoretical_hours' compute_sudo=True store=True
Public methods (0)

No public methods.

New fields (6)
  • date Date
    readonly=True string='Date'
  • department_id Many2one → hr.department
    comodel_name='hr.department' readonly=True string='Department'
  • difference Float
    readonly=True
  • employee_id Many2one → hr.employee
    comodel_name='hr.employee' readonly=True string='Employee'
  • theoretical_hours Float
    readonly=True string='Theoric'
  • worked_hours Float
    readonly=True string='Worked'
Public methods (2)
  • init(self)
    @api.model_cr
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
    Compute dynamically theoretical hours amount, computing on the fly theoretical hours for non existing attendances with stored hours. This technique has proven to be more efficient than trying to call recursively `read_group` grouping by date and employee.

New fields (1)
  • theoretical_hours_start_date Date
    help='Fill this field for setting a manual start date for computing the theoretical hours independently from the attendances. If not filled, employee creation date or the calendar start date will be used (the greatest of both).'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
    Trigger recomputation for the date of the new lines.
  • write(self, vals)
    If the date of a line is changed, we first recompute hours of the previous date, and then the theoretical hours of the current date.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • include_in_theoretical Boolean
    help="If you check this mark, leaves in this category won't reduce the number of theoretical hours in the attendance report." string='Include in theoretical hours'
Public methods (0)

No public methods.

New fields (3)
  • date_from Datetime
    help='Recompute attendances from this date' required=True string='From'
  • date_to Datetime
    help='Recompute attendances up to this date' required=True string='To'
  • employee_ids Many2many → hr.employee
    comodel_name='hr.employee' help='Recompute these employees attendances' required=True string='Employees'
Public methods (1)
  • action_recompute(self)
    @api.multi

New fields (3)
  • category_ids Many2many → hr.employee.category
    string='Tag' args: 'hr.employee.category'
  • department_id Many2one → hr.department
    string='Department' args: 'hr.department'
  • employee_ids Many2many → hr.employee
    string='Employees' args: 'hr.employee'
Public methods (3)
  • default_get(self, fields)
    @api.model
  • populate(self)
    @api.multi
  • view_report(self)
    @api.multi
REPOSITORY
REPOSITORYOCA/hr
GIT
GIThttps://github.com/OCA/hr.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/hr/tree/11.0/hr_attendance_report_theoretical_time
VERSION
VERSION 1.3.0
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSOCA Transbot, oca-travis, OCA-git-bot, Jaime Arroyo
WEBSITE
WEBSITEhttps://github.com/OCA/hr
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:23:58
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/hr:
    - hr_holidays_public
odoo/odoo:
    - hr_attendance
    - hr
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - resource
    - barcodes
    - hr_holidays
    - calendar
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (8)
XML IDNameModelTypeStatus
edit_holiday_status_form hr.holidays.status field Inherits hr_holidays.edit_holiday_status_form
hr_attendance_theoretical_view_filter hr.attendance.theoretical.time.report search New
hr_attendance_theoretical_view_graph hr.attendance.theoretical.time.report graph New
hr_attendance_theoretical_view_pivot hr.attendance.theoretical.time.report pivot New
hr_attendance_view_pivot hr.attendance.pivot - Don't show "Theoretical hours" measure hr.attendance field Inherits hr_attendance.hr_attendance_view_pivot
recompute_theoretical_attendance_form recompute.theoretical.attendance form New
view_employee_form_inherit_hr_attendance hr.employee field Inherits hr_attendance.view_employee_form_inherit_hr_attendance
wizard_theoretical_time_form_view wizard.theoretical.time.form (in hr_attendance_report_theoretical_time) wizard.theoretical.time form New
Models touched (9)

New fields (1)
  • theoretical_hours Float
    compute='_compute_theoretical_hours' compute_sudo=True store=True
Public methods (0)

No public methods.

New fields (5)
  • date Date
    readonly=True string='Date'
  • difference Float
    readonly=True
  • employee_id Many2one → hr.employee
    comodel_name='hr.employee' readonly=True string='Employee'
  • theoretical_hours Float
    readonly=True string='Theoric'
  • worked_hours Float
    readonly=True string='Worked'
Public methods (2)
  • init(self)
    @api.model_cr
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
    Compute dynamically theoretical hours amount, computing on the fly theoretical hours for non existing attendances with stored hours. This technique has proven to be more efficient than trying to call recursively `read_group` grouping by date and employee.

New fields (1)
  • theoretical_hours_start_date Date
    help='Fill this field for setting a manual start date for computing the theoretical hours independently from the attendances. If not filled, employee creation date or the calendar start date will be used (the greatest of both).'
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 (2)
  • create(self, vals_list)
    @api.model
    Trigger recomputation for the date of the new lines.
  • write(self, vals)
    If the date of a line is changed, we first recompute hours of the previous date, and then the theoretical hours of the current date.

New fields (1)
  • include_in_theoretical Boolean
    help="If you check this mark, leaves in this category won't reduce the number of theoretical hours in the attendance report." string='Include in theoretical hours'
Public methods (0)

No public methods.

New fields (3)
  • date_from Datetime
    help='Recompute attendances from this date' required=True string='From'
  • date_to Datetime
    help='Recompute attendances up to this date' required=True string='To'
  • employee_ids Many2many → hr.employee
    comodel_name='hr.employee' help='Recompute these employees attendances' required=True string='Employees'
Public methods (1)
  • action_recompute(self)
    @api.multi

New fields (0)

No new fields.

Public methods (1)
  • search(self, args, offset=0, limit=None, order=None, count=False)
    @api.model
    Inject extra domain when being called from _theoretical_hours method. WARNING: This method should be called only once with that context from a restricted piece of code, or can have side effects.

New fields (3)
  • category_ids Many2many → hr.employee.category
    string='Tag' args: 'hr.employee.category'
  • department_id Many2one → hr.department
    string='Department' args: 'hr.department'
  • employee_ids Many2many → hr.employee
    string='Employees' args: 'hr.employee'
Public methods (3)
  • default_get(self, fields)
    @api.model
  • populate(self)
    @api.multi
  • view_report(self)
    @api.multi
REPOSITORY
REPOSITORYOCA/hr
GIT
GIThttps://github.com/OCA/hr.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/hr/tree/10.0/hr_attendance_report_theoretical_time
VERSION
VERSION 2.0.0
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSPedro M. Baeza, david, OCA Transbot, oca-travis, OCA-git-bot
WEBSITE
WEBSITEhttps://github.com/OCA/hr
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:19:57
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/hr:
    - hr_holidays_compute_days
    - hr_public_holidays
odoo/odoo:
    - hr_attendance
    - hr
    - base_setup
    - base
    - web_kanban
    - web
    - mail
    - bus
    - web_tour
    - resource
    - report
    - barcodes
    - hr_holidays
    - calendar
    - base_action_rule
    - web_calendar
    - product
    - decimal_precision
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (6)
XML IDNameModelTypeStatus
edit_holiday_status_form hr.holidays.status field Inherits hr_holidays.edit_holiday_status_form
hr_attendance_theoretical_view_filter hr.attendance.theoretical.time.report search New
hr_attendance_theoretical_view_graph hr.attendance.theoretical.time.report graph New
hr_attendance_theoretical_view_pivot hr.attendance.theoretical.time.report pivot New
recompute_theoretical_attendance_form recompute.theoretical.attendance form New
view_employee_form_inherit_hr_attendance hr.employee field Inherits hr_attendance.view_employee_form_inherit_hr_attendance
Models touched (7)

New fields (1)
  • theoretical_hours Float
    compute='_compute_theoretical_hours' compute_sudo=True store=True
Public methods (1)
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
    Don't show anything for this measure in the attendances report.

New fields (5)
  • date Date
    readonly=True string='Date'
  • difference Float
    readonly=True
  • employee_id Many2one → hr.employee
    comodel_name='hr.employee' readonly=True string='Employee'
  • theoretical_hours Float
    readonly=True string='Theoric'
  • worked_hours Float
    readonly=True string='Worked'
Public methods (2)
  • init(self)
    @api.model_cr
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
    Compute dynamically theoretical hours amount, computing on the fly theoretical hours for non existing attendances with stored hours. This technique has proven to be more efficient than trying to call recursively `read_group` grouping by date and employee.

New fields (1)
  • theoretical_hours_start_date Date
    help='Fill this field for setting a manual start date for computing the theoretical hours independently from the attendances. If not filled, employee creation date or the calendar start date will be used (the greatest of both).'
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 (2)
  • create(self, vals)
    Trigger recomputation for the date of the new line.
  • write(self, vals)
    If the date of a line is changed, we first recompute hours of the previous date, and then the theoretical hours of the current date.

New fields (1)
  • include_in_theoretical Boolean
    help="If you check this mark, leaves in this category won't reduce the number of theoretical hours in the attendance report." string='Include in theoretical hours'
Public methods (0)

No public methods.

New fields (3)
  • date_from Datetime
    help='Recompute attendances from this date' required=True string='From'
  • date_to Datetime
    help='Recompute attendances up to this date' required=True string='To'
  • employee_ids Many2many → hr.employee
    comodel_name='hr.employee' help='Recompute these employees attendances' required=True string='Employees'
Public methods (1)
  • action_recompute(self)
    @api.multi
STATUS
STATUSOpen migration PR - not merged yet for this version
REPOSITORY
REPOSITORYOCA/hr-attendance
PULL REQUEST
PULL REQUEST[19.0][MIG] hr_attendance_report_theoretical_time: Migration to 19.0 (#283)