diff --git a/docsource/modules160-170.rst b/docsource/modules160-170.rst index 0ae89b703492..f8bc7a890466 100644 --- a/docsource/modules160-170.rst +++ b/docsource/modules160-170.rst @@ -152,7 +152,7 @@ Module coverage 16.0 -> 17.0 +---------------------------------------------------+----------------------+-------------------------------------------------+ | google_recaptcha | | | +---------------------------------------------------+----------------------+-------------------------------------------------+ -| hr | | | +| hr | Done | | +---------------------------------------------------+----------------------+-------------------------------------------------+ | hr_attendance | | | +---------------------------------------------------+----------------------+-------------------------------------------------+ diff --git a/openupgrade_scripts/scripts/hr/17.0.1.1/end-migration.py b/openupgrade_scripts/scripts/hr/17.0.1.1/end-migration.py new file mode 100644 index 000000000000..558e5d7d3008 --- /dev/null +++ b/openupgrade_scripts/scripts/hr/17.0.1.1/end-migration.py @@ -0,0 +1,26 @@ +# Copyright 2024 Viindoo Technology Joint Stock Company (Viindoo) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from openupgradelib import openupgrade + + +def _merge_employee_contact(env): + """ + Performing merge 'address_home_id' into 'work_contact_id' + """ + partner_merge_wizard = env["base.partner.merge.automatic.wizard"] + partner = env["res.partner"] + env.cr.execute( + """ + SELECT address_home_id, work_contact_id + FROM hr_employee + """ + ) + for address_home_id, work_contact_id in env.cr.fetchall(): + partner_merge_wizard._merge( + [address_home_id, work_contact_id], partner.browse(work_contact_id) + ) + + +@openupgrade.migrate() +def migrate(env, version): + _merge_employee_contact(env) diff --git a/openupgrade_scripts/scripts/hr/17.0.1.1/post-migration.py b/openupgrade_scripts/scripts/hr/17.0.1.1/post-migration.py new file mode 100644 index 000000000000..b71abe3322e3 --- /dev/null +++ b/openupgrade_scripts/scripts/hr/17.0.1.1/post-migration.py @@ -0,0 +1,26 @@ +# Copyright 2024 Viindoo Technology Joint Stock Company (Viindoo) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openupgradelib import openupgrade + +_deleted_xml_records = [ + "hr.dep_sales", + "hr.openupgrade_legacy_17_0_offboarding_plan", + "hr.openupgrade_legacy_17_0_onboarding_plan", + "hr.openupgrade_legacy_17_0_offboarding_setup_compute_out_delais", + "hr.openupgrade_legacy_17_0_offboarding_take_back_hr_materials", + "hr.openupgrade_legacy_17_0_onboarding_plan_training", + "hr.openupgrade_legacy_17_0_onboarding_setup_it_materials", + "hr.openupgrade_legacy_17_0_onboarding_training", + "hr.hr_plan_activity_type_company_rule", + "hr.hr_plan_company_rule", +] + + +@openupgrade.migrate() +def migrate(env, version): + openupgrade.load_data(env, "hr", "17.0.1.1/noupdate_changes.xml") + openupgrade.delete_records_safely_by_xml_id( + env, + _deleted_xml_records, + ) diff --git a/openupgrade_scripts/scripts/hr/17.0.1.1/pre-migration.py b/openupgrade_scripts/scripts/hr/17.0.1.1/pre-migration.py new file mode 100644 index 000000000000..57c85c291d84 --- /dev/null +++ b/openupgrade_scripts/scripts/hr/17.0.1.1/pre-migration.py @@ -0,0 +1,151 @@ +# Copyright 2024 Viindoo Technology Joint Stock Company (Viindoo) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from openupgradelib import openupgrade + +_xmlids_renames = [ + ( + "hr.offboarding_plan", + "hr.openupgrade_legacy_17_0_offboarding_plan", + ), + ( + "hr.onboarding_plan", + "hr.openupgrade_legacy_17_0_onboarding_plan", + ), + ( + "hr.offboarding_setup_compute_out_delais", + "hr.openupgrade_legacy_17_0_offboarding_setup_compute_out_delais", + ), + ( + "hr.offboarding_take_back_hr_materials", + "hr.openupgrade_legacy_17_0_offboarding_take_back_hr_materials", + ), + ( + "hr.onboarding_plan_training", + "hr.openupgrade_legacy_17_0_onboarding_plan_training", + ), + ( + "hr.onboarding_setup_it_materials", + "hr.openupgrade_legacy_17_0_onboarding_setup_it_materials", + ), + ( + "hr.onboarding_training", + "hr.openupgrade_legacy_17_0_onboarding_training", + ), +] + + +def _hr_plan_sync_to_mail_activity_plan(env): + employee_model = env["ir.model"].search([("model", "=", "hr.employee")]) + # Because when loading noupdate, we might create some duplicate plan data + # Therefore check if those plan data still exist then skip insert + env.cr.execute( + """ + SELECT res_id FROM ir_model_data + WHERE model='hr.plan' AND + name in ('offboarding_plan', 'onboarding_plan') + """ + ) + hr_plan_ids = tuple([d[0] for d in env.cr.fetchall()]) + + # sync hr.plan to mail.activity.plan + openupgrade.logged_query( + env.cr, + """ + ALTER TABLE mail_activity_plan ADD COLUMN IF NOT EXISTS department_id INTEGER, + ADD COLUMN IF NOT EXISTS hr_plan_legacy_id INTEGER; + """, + ) + hr_plan_query = f""" + INSERT INTO mail_activity_plan (company_id, res_model_id, create_uid, + write_uid, name, res_model, active, create_date, write_date, department_id, + hr_plan_legacy_id + ) + SELECT company_id, {employee_model.id}, create_uid, write_uid, name, + '{employee_model.model}', active, create_date, write_date, department_id, id + FROM hr_plan t + """ + if hr_plan_ids: + hr_plan_query += f" WHERE t.id NOT IN {hr_plan_ids}" + openupgrade.logged_query( + env.cr, + hr_plan_query, + ) + + # sync hr.plan.activitype.type to mail.activity.plan.template + hr_plan_activity_type_query = """ + INSERT INTO mail_activity_plan_template (activity_type_id, responsible_id, + plan_id, responsible_type, summary, note, create_uid, write_uid, create_date, + write_date + ) + SELECT activity_type_id, responsible_id, t2.id plan_id, responsible, summary, + note, t1.create_uid, t1.write_uid, t1.create_date, t1.write_date + FROM hr_plan_activity_type t1, mail_activity_plan t2 + WHERE t1.plan_id = t2.hr_plan_legacy_id + """ + if hr_plan_ids: + hr_plan_activity_type_query += f" AND t1.plan_id NOT IN {hr_plan_ids}" + openupgrade.logged_query( + env.cr, + hr_plan_activity_type_query, + ) + # Drop hr_plan_legacy_id column + openupgrade.logged_query( + env.cr, + """ + ALTER TABLE mail_activity_plan DROP COLUMN hr_plan_legacy_id; + """, + ) + + +def _employee_sync_address_home_id(env): + openupgrade.logged_query( + env.cr, + """ + ALTER TABLE hr_employee + ADD COLUMN IF NOT EXISTS lang VARCHAR, + ADD COLUMN IF NOT EXISTS private_city VARCHAR, + ADD COLUMN IF NOT EXISTS private_country_id INTEGER, + ADD COLUMN IF NOT EXISTS private_email VARCHAR, + ADD COLUMN IF NOT EXISTS private_phone VARCHAR, + ADD COLUMN IF NOT EXISTS private_state_id INTEGER, + ADD COLUMN IF NOT EXISTS private_street VARCHAR, + ADD COLUMN IF NOT EXISTS private_street2 VARCHAR, + ADD COLUMN IF NOT EXISTS private_zip VARCHAR; + """, + ) + openupgrade.logged_query( + env.cr, + """ + UPDATE hr_employee t1 + SET lang = t2.lang, + private_city = t2.city, + private_country_id = t2.country_id, + private_email = t2.email, + private_phone = t2.phone, + private_state_id = t2.state_id, + private_street = t2.street, + private_street2 = t2.street2, + private_zip = t2.zip + FROM res_partner t2 + WHERE t1.address_home_id = t2.id + """, + ) + + +def _hr_work_location_fill_location_type(env): + openupgrade.logged_query( + env.cr, + """ + ALTER TABLE hr_work_location ADD COLUMN IF NOT EXISTS location_type VARCHAR; + UPDATE hr_work_location + SET location_type = 'office' + """, + ) + + +@openupgrade.migrate() +def migrate(env, version): + _hr_plan_sync_to_mail_activity_plan(env) + openupgrade.rename_xmlids(env.cr, _xmlids_renames) + _employee_sync_address_home_id(env) + _hr_work_location_fill_location_type(env) diff --git a/openupgrade_scripts/scripts/hr/17.0.1.1/upgrade_analysis_work.txt b/openupgrade_scripts/scripts/hr/17.0.1.1/upgrade_analysis_work.txt new file mode 100644 index 000000000000..311f6b69c72c --- /dev/null +++ b/openupgrade_scripts/scripts/hr/17.0.1.1/upgrade_analysis_work.txt @@ -0,0 +1,158 @@ +---Models in module 'hr'--- +obsolete model hr.plan +obsolete model hr.plan.activity.type +# DONE pre-migration: move data into mail.activity.plan + +obsolete model hr.plan.wizard [transient] +# NOTHING TO DO + +---Fields in module 'hr'--- +hr / discuss.channel / subscription_department_ids (many2many): NEW relation: hr.department +hr / mail.channel / subscription_department_ids (many2many): DEL relation: hr.department +# NOTHING TO DO + +hr / hr.contract.type / code (char) : NEW hasdefault: compute +# TODO pre-migration: create column and fill value using 'name' + +hr / hr.contract.type / country_id (many2one) : NEW relation: res.country +# NOTHING TO DO: new feature + +hr / hr.department / message_main_attachment_id (many2one): DEL relation: ir.attachment +# NOTHING TO DO + +hr / hr.department / plan_ids (one2many) : relation is now 'mail.activity.plan' ('hr.plan') [nothing to do] +hr / hr.plan / active (boolean) : DEL +hr / hr.plan / company_id (many2one) : DEL relation: res.company +hr / hr.plan / department_id (many2one) : DEL relation: hr.department +hr / hr.plan / name (char) : DEL required +hr / hr.plan / plan_activity_type_ids (one2many): DEL relation: hr.plan.activity.type +hr / hr.plan.activity.type / activity_type_id (many2one) : DEL relation: mail.activity.type +hr / hr.plan.activity.type / company_id (many2one) : DEL relation: res.company +hr / hr.plan.activity.type / note (html) : DEL +hr / hr.plan.activity.type / plan_id (many2one) : DEL relation: hr.plan +hr / hr.plan.activity.type / responsible (selection) : DEL required, selection_keys: ['coach', 'employee', 'manager', 'other'] +hr / hr.plan.activity.type / responsible_id (many2one) : DEL relation: res.users +hr / hr.plan.activity.type / summary (char) : DEL +hr / mail.activity.plan / department_id (many2one) : NEW relation: hr.department, hasdefault: compute +hr / mail.activity.plan.template / responsible_type (False) : NEW selection_keys: ['coach', 'employee', 'manager', 'on_demand', 'other'], mode: modify +# DONE pre-migration: move data into mail.activity.plan + +hr / hr.department / rating_ids (one2many) : NEW relation: rating.rating +# NOTHING TO DO + +hr / hr.departure.reason / reason_code (integer) : NEW +# DONE post-migration: load noupdate + +hr / hr.employee / activity_user_id (many2one) : not related anymore +hr / hr.employee / activity_user_id (many2one) : now a function +# NOTHING TO DO: no store field + +hr / hr.employee / employee_properties (properties): NEW hasdefault: compute +hr / res.company / employee_properties_definition (properties_definition): NEW +hr / hr.employee / private_car_plate (char) : NEW +# NOTHING TO DO: new feature + +hr / hr.employee / address_home_id (many2one) : DEL relation: res.partner +hr / hr.employee / lang (selection) : is now stored +hr / hr.employee / lang (selection) : not related anymore +hr / hr.employee / private_city (char) : NEW +hr / hr.employee / private_country_id (many2one) : NEW relation: res.country +hr / hr.employee / private_email (char) : is now stored +hr / hr.employee / private_email (char) : not related anymore +hr / hr.employee / private_phone (char) : NEW +hr / hr.employee / private_state_id (many2one) : NEW relation: res.country.state +hr / hr.employee / private_street (char) : NEW +hr / hr.employee / private_street2 (char) : NEW +hr / hr.employee / private_zip (char) : NEW +# DONE pre_migration: create column and fill value from address_home_id and merge merge 'address_home_id' into 'work_contact_id' at end-migration + +hr / hr.employee / rating_ids (one2many) : NEW relation: rating.rating +hr / hr.job / message_main_attachment_id (many2one): DEL relation: ir.attachment +hr / hr.job / rating_ids (one2many) : NEW relation: rating.rating +# NOTHING TO DO: + +hr / hr.work.location / location_type (selection) : NEW required, selection_keys: ['home', 'office', 'other'], hasdefault: default +# TODO pre-migration: create column and update it with default value + +---XML records in module 'hr'--- +NEW hr.contract.type: hr.contract_type_full_time (noupdate) +NEW hr.contract.type: hr.contract_type_part_time (noupdate) +NEW hr.contract.type: hr.contract_type_permanent (noupdate) +NEW hr.contract.type: hr.contract_type_seasonal (noupdate) +NEW hr.contract.type: hr.contract_type_temporary (noupdate) +# NOTHING TO DO + +DEL hr.department: hr.dep_sales (noupdate) +# DONE: removed in pre-migration + +DEL hr.plan: hr.offboarding_plan (noupdate) +DEL hr.plan: hr.onboarding_plan (noupdate) +DEL hr.plan.activity.type: hr.offboarding_setup_compute_out_delais (noupdate) +DEL hr.plan.activity.type: hr.offboarding_take_back_hr_materials (noupdate) +DEL hr.plan.activity.type: hr.onboarding_plan_training (noupdate) +DEL hr.plan.activity.type: hr.onboarding_setup_it_materials (noupdate) +DEL hr.plan.activity.type: hr.onboarding_training (noupdate) +# DONE: renamed in pre-migration and removed in post-migration + +NEW hr.work.location: hr.home_work_location (noupdate) +NEW hr.work.location: hr.home_work_office (noupdate) +NEW hr.work.location: hr.home_work_other (noupdate) +NEW ir.actions.act_window: hr.mail_activity_plan_action +DEL ir.actions.act_window: hr.hr_employee_action_from_user +DEL ir.actions.act_window: hr.hr_plan_action +DEL ir.actions.act_window: hr.hr_plan_activity_type_action +NEW ir.actions.act_window.view: hr.mail_activity_plan_action_employee_view_form +NEW ir.actions.act_window.view: hr.mail_activity_plan_action_employee_view_tree +NEW ir.model.access: hr.access_mail_activity_plan_hr_manager +NEW ir.model.access: hr.access_mail_activity_plan_template_hr_manager +DEL ir.model.access: hr.access_hr_plan_activity_type_employee +DEL ir.model.access: hr.access_hr_plan_activity_type_hr_user +DEL ir.model.access: hr.access_hr_plan_employee +DEL ir.model.access: hr.access_hr_plan_hr_user +DEL ir.model.access: hr.access_hr_plan_wizard +DEL ir.model.constraint: hr.constraint_hr_employee_barcode_uniq +DEL ir.model.constraint: hr.constraint_hr_employee_category_name_uniq +DEL ir.model.constraint: hr.constraint_hr_employee_user_uniq +DEL ir.model.constraint: hr.constraint_hr_job_name_company_uniq +DEL ir.model.constraint: hr.constraint_hr_job_no_of_recruitment_positive +NEW ir.rule: hr.ir_rule_hr_contract_type_multi_company (noupdate) +NEW ir.rule: hr.ir_rule_res_partner_bank_employees (noupdate) +NEW ir.rule: hr.ir_rule_res_partner_bank_internal_users (noupdate) +NEW ir.rule: hr.mail_plan_rule_group_hr_manager (noupdate) +NEW ir.rule: hr.mail_plan_templates_rule_group_hr_manager (noupdate) +# NOTHING TO DO + +DEL ir.rule: hr.hr_plan_activity_type_company_rule (noupdate) +DEL ir.rule: hr.hr_plan_company_rule (noupdate) +# DONE: removed in pre-migration + +NEW ir.ui.menu: hr.menu_resource_calendar_view +NEW ir.ui.view: hr.discuss_channel_view_form +NEW ir.ui.view: hr.hr_employee_plan_activity_summary +NEW ir.ui.view: hr.hr_employee_view_graph +NEW ir.ui.view: hr.hr_employee_view_pivot +NEW ir.ui.view: hr.mail_activity_plan_template_view_form +NEW ir.ui.view: hr.mail_activity_plan_view_form +NEW ir.ui.view: hr.mail_activity_plan_view_form_hr_employee +NEW ir.ui.view: hr.mail_activity_plan_view_tree +NEW ir.ui.view: hr.mail_activity_schedule_view_form +DEL ir.ui.view: hr.hr_plan_activity_type_view_form +DEL ir.ui.view: hr.hr_plan_activity_type_view_tree +DEL ir.ui.view: hr.hr_plan_view_form +DEL ir.ui.view: hr.hr_plan_view_search +DEL ir.ui.view: hr.hr_plan_view_tree +DEL ir.ui.view: hr.mail_channel_view_form_ +DEL ir.ui.view: hr.plan_wizard +DEL ir.ui.view: hr.view_employee_form_smartbutton +DEL ir.ui.view: hr.view_partner_tree2 +NEW mail.activity.plan: hr.offboarding_plan (noupdate) +NEW mail.activity.plan: hr.onboarding_plan (noupdate) +NEW mail.activity.plan.template: hr.offboarding_setup_compute_out_delais (noupdate) +NEW mail.activity.plan.template: hr.offboarding_take_back_hr_materials (noupdate) +NEW mail.activity.plan.template: hr.onboarding_plan_training (noupdate) +NEW mail.activity.plan.template: hr.onboarding_setup_it_materials (noupdate) +NEW mail.activity.plan.template: hr.onboarding_training (noupdate) +# NOTHING TO DO + +DEL res.partner: hr.res_partner_admin_private_address (noupdate) +# DONE: removed in pre-migration