Appraisal Oca

hr_appraisal_oca
REPOSITORY
REPOSITORYOCA/hr
GIT
GIThttps://github.com/OCA/hr.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/hr/tree/18.0/hr_appraisal_oca
VERSION
VERSION 1.2.0
CATEGORY
CATEGORYHuman Resources/Employees
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Fundación Esment
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Fundación Esment
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, christian-ramos-tecnativa, Estefanía Bauzá Illán
WEBSITE
WEBSITEhttps://github.com/OCA/hr
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:08
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - hr
    - base_setup
    - web
    - digest
    - mail
    - bus
    - web_tour
    - html_editor
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - phone_validation
    - resource_mail
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module helps maintain the employee motivation process through periodic performance
appraisals.

Managers can evaluate employee performance and enable employees to perform
self-assessments. Review forms can be customized according to organizational needs.

Code Analysis

Views touched (12)
XML IDNameModelTypeStatus
hr_appraisal_form_view hr.appraisal.form.view hr.appraisal form New
hr_appraisal_kanban_view hr.appraisal.kanban.view hr.appraisal kanban New
hr_appraisal_request_wizard_view hr.appraisal.request.wizard.view hr.appraisal.request.wizard form New
hr_appraisal_search_view hr.appraisal.search.view hr.appraisal search New
hr_appraisal_tag_form_view hr.appraisal.tag.form.view hr.appraisal.tag form New
hr_appraisal_tag_tree_view hr.appraisal.tag.list.view hr.appraisal.tag list New
hr_appraisal_template_form_view hr.appraisal.template.form.view hr.appraisal.template form New
hr_appraisal_template_tree_view hr.appraisal.template.list.view hr.appraisal.template list New
hr_appraisal_tree_view hr.appraisal.list.view hr.appraisal list New
hr_appraisal_wizard_form_view hr.appraisal.wizard.form.view hr.appraisal.wizard form New
res_config_settings_view_form res.config.settings.view.form.inherit.hr.appraisal.oca res.config.settings xpath Inherits base.res_config_settings_view_form
view_employee_form hr.employee.form.view hr.employee div Inherits hr.view_employee_form
Models touched (9)

New fields (26)
  • active Boolean
    default=True
  • activity_ids One2many → mail.activity
    args: 'mail.activity', 'res_id', 'Activities'
  • appraisal_template_id Many2one → hr.appraisal.template
    check_company=True string='Appraisal Template' args: 'hr.appraisal.template'
  • can_see_employee_publish Boolean
    compute='_compute_can_see_employee_manager_publish' default=False
  • can_see_manager_publish Boolean
    compute='_compute_can_see_employee_manager_publish' default=False
  • color Integer
    string='Color Index'
  • company_id Many2one → res.company
    related='employee_id.company_id' store=True string='Company' args: 'res.company'
  • created_by Many2one → res.users
    default=<expr> args: 'res.users'
  • date_close Date
    help='Closing date of the current appraisal' required=True string='Appraisal Date'
  • department_id Many2one → hr.department
    related='employee_id.department_id' string='Department' args: 'hr.department'
  • employee_appraisal_count Integer
    related='employee_id.appraisal_count' string='Appraisal Count'
  • employee_domain_ids Many2many → hr.employee
    compute='_compute_employee_domain_ids' args: 'hr.employee'
  • employee_feedback Html
    copy=False readonly=False
  • employee_feedback_published Boolean
    default=True tracking=True
  • employee_id Many2one → hr.employee
    default=<expr> domain="[('id', 'in', employee_domain_ids)]" readonly=True required=True string='Employee' args: 'hr.employee'
  • employee_user_id Many2one → res.users
    related='employee_id.user_id' string='Employee User' args: 'res.users'
  • is_manager Boolean
    compute='_compute_is_manager'
  • job_id Many2one → hr.job
    related='employee_id.job_id' string='Job Position' args: 'hr.job'
  • manager_feedback Html
    copy=False readonly=False
  • manager_feedback_published Boolean
    default=True tracking=True
  • manager_ids Many2many → hr.employee
    check_company=True compute='_compute_manager_ids' domain="[('id', '!=', employee_id)]" inverse='_inverse_manager_ids' required=True store=True args: 'hr.employee', 'hr_appraisal_managers_rel', 'hr_appraisal_id'
  • manager_user_ids Many2many → res.users
    compute='_compute_manager_user' string='Manager Users' args: 'res.users'
  • note Html
    help='The content of this note is not visible by the Employee.' string='Private Note'
  • state Selection
    default='1_new' index=True required=True string='Status' tracking=True args: [('1_new', 'To Confirm'), ('2_pending', 'Confirmed'), ('3_done', 'Done')]
  • tag_ids Many2many → hr.appraisal.tag
    string='Tags' args: 'hr.appraisal.tag'
  • visibility Selection
    default='all' help="If set to 'Visible to managers', the appraisal is only visible to managers and HR officers." required=True selection=[('all', 'Visible to all'), ('manager', 'Visible to managers')]
Public methods (9)
  • action_back(self)
  • action_confirm(self)
    Confirm the appraisal by setting its state to 'pending' and resetting feedback flags. - Sends confirmation emails to the employee and managers. - Creates CFR activities for the employee and managers if they have associated users. - If the appraisal is only visible to managers, the employee is not notified and no employee activity is created.
  • action_done(self)
    Mark the appraisal as done, publish feedback flags, send completion emails, and log the status change. - Sends completion email to employee only if visible. - Managers are always notified.
  • action_open_employee_appraisals(self)
  • action_publish_employee_feedback(self)
  • action_publish_manager_feedback(self)
  • action_send_appraisal_request(self)
  • default_get(self, fields_list)
    @api.model
    Set default template and initialize feedback fields. - If user already provided values, preserve them. - If no template is provided, use the default from config. - If no feedback is provided, populate from the selected template.
  • write(self, vals)

New fields (5)
  • appraisal_id Many2one → hr.appraisal
    required=True args: 'hr.appraisal'
  • recipient_ids Many2many → res.partner
    required=True string='Recipients' args: 'res.partner'
  • recipient_users Many2many → res.users
    store=False string='Recipients Users' args: 'res.users'
  • subject Char
  • user_body Html
    string='User Contents'
Public methods (2)
  • default_get(self, fields)
    @api.model
    Provide default values based on 'default_appraisal_id' in context. Prefills recipients, users, subject, and appraisal ID using related appraisal and appropriate email template.
  • send_button(self)
    Send appraisal request email using the appropriate template.

New fields (2)
  • color Integer
    default=_get_default_color
  • name Char
    required=True args: 'Tag Name'
Public methods (0)

No public methods.

New fields (5)
  • appraisal_employee_feedback_template Html
    string='Employee Feedback' translate=True
  • appraisal_manager_feedback_template Html
    string='Manager Feedback' translate=True
  • company_id Many2one → res.company
    default=<expr> args: 'res.company'
  • description Text
    required=True
  • is_default Boolean
    compute='_compute_is_default'
Public methods (0)

No public methods.

New fields (2)
  • res_id Integer
    required=True string='Resource ID'
  • res_model Char
    required=True string='HR Appraisal'
Public methods (1)
  • ok_button(self)
    Publish employee feedback as manager.

New fields (5)
  • allowed_user_ids Many2many → res.users
    column1='employee_id' column2='user_id' compute='_compute_allowed_user_ids' relation='hr_employee_manager_user_rel' store=True string='Allowed Users' args: 'res.users'
  • appraisal_count Integer
    compute='_compute_appraisal_count' groups='hr.group_hr_user' store=True
  • appraisal_ids One2many → hr.appraisal
    string='Appraisal' args: 'hr.appraisal', 'employee_id'
  • last_appraisal_state Selection
    related='last_appraisal_id.state' string='Status'
  • ongoing_appraisal_count Integer
    compute='_compute_ongoing_appraisal_count' groups='hr.group_hr_user' store=True
Public methods (0)

No public methods.

New fields (2)
  • can_open_last_appraisal Boolean
    compute='_compute_can_open_last_appraisal'
  • last_appraisal_id Many2one → hr.appraisal
    compute='_compute_last_appraisal_id' search='_search_last_appraisal_id' args: 'hr.appraisal'
Public methods (1)
  • action_open_last_appraisal(self)

New fields (1)
  • appraisal_default_template_id Many2one → hr.appraisal.template
    comodel_name='hr.appraisal.template' config_parameter='hr_appraisal_oca.default_appraisal_template_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Default template used for appraisals' string='Default Appraisal Template'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • send_email_with_template(self, template_xml_id, recipient_id, email, ctx)
    @api.model
REPOSITORY
REPOSITORYOCA/hr
GIT
GIThttps://github.com/OCA/hr.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/hr/tree/16.0/hr_appraisal_oca
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYHuman Resources/Employees
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Fundación Esment
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Fundación Esment
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, Estefanía Bauzà Illán
WEBSITE
WEBSITEhttps://github.com/OCA/hr
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:11:53
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - hr
    - base_setup
    - web
    - mail
    - bus
    - web_tour
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module helps maintain the employee motivation process through periodic performance
appraisals.

Managers can evaluate employee performance and enable employees to perform
self-assessments. Review forms can be customized according to organizational needs.

Code Analysis

Views touched (12)
XML IDNameModelTypeStatus
hr_appraisal_form_view hr.appraisal.form.view hr.appraisal form New
hr_appraisal_kanban_view hr.appraisal.kanban.view hr.appraisal kanban New
hr_appraisal_request_wizard_view hr.appraisal.request.wizard.view hr.appraisal.request.wizard form New
hr_appraisal_search_view hr.appraisal.search.view hr.appraisal search New
hr_appraisal_tag_form_view hr.appraisal.tag.form.view hr.appraisal.tag form New
hr_appraisal_tag_tree_view hr.appraisal.tag.tree.view hr.appraisal.tag tree New
hr_appraisal_template_form_view hr.appraisal.template.form.view hr.appraisal.template form New
hr_appraisal_template_tree_view hr.appraisal.template.tree.view hr.appraisal.template tree New
hr_appraisal_tree_view hr.appraisal.tree.view hr.appraisal tree New
hr_appraisal_wizard_form_view hr.appraisal.wizard.form.view hr.appraisal.wizard form New
res_config_settings_view_form res.config.settings.view.form.inherit.hr.appraisal.oca res.config.settings xpath Inherits base.res_config_settings_view_form
view_employee_form hr.employee.form.view hr.employee div Inherits hr.view_employee_form
Models touched (9)

New fields (27)
  • active Boolean
    default=True
  • activity_ids One2many → mail.activity
    args: 'mail.activity', 'res_id', 'Activities'
  • appraisal_template_id Many2one → hr.appraisal.template
    check_company=True string='Appraisal Template' args: 'hr.appraisal.template'
  • can_see_employee_publish Boolean
    compute='_compute_can_see_employee_manager_publish' default=False
  • can_see_manager_publish Boolean
    compute='_compute_can_see_employee_manager_publish' default=False
  • color Integer
    string='Color Index'
  • company_id Many2one → res.company
    related='employee_id.company_id' store=True string='Company' args: 'res.company'
  • created_by Many2one → res.users
    default=<expr> args: 'res.users'
  • date_close Date
    help='Closing date of the current appraisal' required=True string='Appraisal Date'
  • department_id Many2one → hr.department
    compute='_compute_department' args: 'hr.department', 'Department'
  • employee_appraisal_count Integer
    related='employee_id.appraisal_count' string='Appraisal Count'
  • employee_domain_ids Many2many → hr.employee
    compute='_compute_employee_domain_ids' args: 'hr.employee'
  • employee_feedback Html
    compute='_compute_employee_feedback' readonly=False store=True
  • employee_feedback_published Boolean
    default=True tracking=True
  • employee_feedback_template Html
    compute='_compute_feedback_templates'
  • employee_id Many2one → hr.employee
    default=<expr> domain="[('id', 'in', employee_domain_ids)]" readonly=True required=True states={'1_new': [('readonly', False)]} string='Employee' args: 'hr.employee'
  • employee_user_id Many2one → res.users
    related='employee_id.user_id' string='Employee User' args: 'res.users'
  • is_manager Boolean
    compute='_compute_is_manager'
  • job_id Many2one → hr.job
    related='employee_id.job_id' string='Job Position' args: 'hr.job'
  • manager_feedback Html
    compute='_compute_manager_feedback' readonly=False store=True
  • manager_feedback_published Boolean
    default=True tracking=True
  • manager_feedback_template Html
    compute='_compute_feedback_templates'
  • manager_ids Many2many → hr.employee
    check_company=True compute='_compute_manager_ids' domain="[('id', '!=', employee_id)]" inverse='_inverse_manager_ids' required=True store=True args: 'hr.employee', 'hr_appraisal_managers_rel', 'hr_appraisal_id'
  • manager_user_ids Many2many → res.users
    compute='_compute_manager_user' string='Manager Users' args: 'res.users'
  • note Html
    help='The content of this note is not visible by the Employee.' string='Private Note'
  • state Selection
    default='1_new' index=True required=True string='Status' tracking=True args: [('1_new', 'To Confirm'), ('2_pending', 'Confirmed'), ('3_done', 'Done')]
  • tag_ids Many2many → hr.appraisal.tag
    string='Tags' args: 'hr.appraisal.tag'
Public methods (9)
  • action_back(self)
  • action_confirm(self)
    Confirm the appraisal by setting its state to 'pending' and resetting feedback flags. - Sends confirmation emails to the employee and managers. - Creates CFR activities for the employee and managers if they have associated users.
  • action_done(self)
    Mark the appraisal as done, publish feedback flags, send completion emails, and log the status change. - Sets state to 'done' and marks feedback as published. - Sends completion emails to the employee and all managers with valid emails. - Posts a message indicating the appraisal was completed by the current user.
  • action_open_employee_appraisals(self)
  • action_publish_employee_feedback(self)
  • action_publish_manager_feedback(self)
  • action_send_appraisal_request(self)
  • default_get(self, fields_list)
    @api.model
    Set default template and initialize feedback fields. - If user already provided values, preserve them. - If no template is provided, use the default from config. - If no feedback is provided, populate from the selected template.
  • write(self, vals)

New fields (5)
  • appraisal_id Many2one → hr.appraisal
    required=True args: 'hr.appraisal'
  • recipient_ids Many2many → res.partner
    required=True string='Recipients' args: 'res.partner'
  • recipient_users Many2many → res.users
    store=False string='Recipients Users' args: 'res.users'
  • subject Char
  • user_body Html
    string='User Contents'
Public methods (2)
  • default_get(self, fields)
    @api.model
    Provide default values based on 'default_appraisal_id' in context. Prefills recipients, users, subject, and appraisal ID using related appraisal and appropriate email template.
  • send_button(self)
    Send appraisal request email using the appropriate template.

New fields (2)
  • color Integer
    default=_get_default_color
  • name Char
    required=True args: 'Tag Name'
Public methods (0)

No public methods.

New fields (5)
  • appraisal_employee_feedback_template Html
    string='Employee Feedback' translate=True
  • appraisal_manager_feedback_template Html
    string='Manager Feedback' translate=True
  • company_id Many2one → res.company
    default=<expr> args: 'res.company'
  • description Text
    required=True
  • is_default Boolean
    compute='_compute_is_default'
Public methods (0)

No public methods.

New fields (2)
  • res_id Integer
    required=True string='Resource ID'
  • res_model Char
    required=True string='HR Appraisal'
Public methods (1)
  • ok_button(self)
    Publish employee feedback as manager.

New fields (5)
  • allowed_user_ids Many2many → res.users
    column1='employee_id' column2='user_id' compute='_compute_allowed_user_ids' relation='hr_employee_manager_user_rel' store=True string='Allowed Users' args: 'res.users'
  • appraisal_count Integer
    compute='_compute_appraisal_count' groups='hr.group_hr_user' store=True
  • appraisal_ids One2many → hr.appraisal
    string='Appraisal' args: 'hr.appraisal', 'employee_id'
  • last_appraisal_state Selection
    related='last_appraisal_id.state' string='Status'
  • ongoing_appraisal_count Integer
    compute='_compute_ongoing_appraisal_count' groups='hr.group_hr_user' store=True
Public methods (0)

No public methods.

New fields (2)
  • can_open_last_appraisal Boolean
    compute='_compute_can_open_last_appraisal'
  • last_appraisal_id Many2one → hr.appraisal
    compute='_compute_last_appraisal_id' search='_search_last_appraisal_id' args: 'hr.appraisal'
Public methods (1)
  • action_open_last_appraisal(self)

New fields (1)
  • appraisal_default_template_id Many2one → hr.appraisal.template
    comodel_name='hr.appraisal.template' config_parameter='hr_appraisal_oca.default_appraisal_template_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Default template used for appraisals' string='Default Appraisal Template'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • send_email_with_template(self, template_xml_id, recipient_id, email, ctx)
    @api.model