commit 76e78d47fc1b54661fba668a5cb97bc92a0a3172 Author: Raghupathy K Date: Mon Jul 8 13:05:10 2024 +0530 Initial commit diff --git a/hrms_recruitment/README.md b/hrms_recruitment/README.md new file mode 100644 index 0000000..d0bd478 --- /dev/null +++ b/hrms_recruitment/README.md @@ -0,0 +1,39 @@ +Manage Recruitment and Job applications +--------------------------------------- + +Publish, promote and organize your job offers with the Odoo +Open Source Recruitment Application. + +Organize your job board, promote your job announces and keep track of +application submissions easily. Follow every applicant and build up a database +of skills and profiles with indexed documents. + +Post Your Jobs on Best Job Boards +--------------------------------- + +Connect automatically to most famous job board websites; linkedIn, Monster, +Craigslist, ... Every job position has a new email address automatically +assigned to route applications automatically to the right job position. + +Whether applicants contact you by email or using an online form, you get all +the data indexed automatically (resumes, motivation letter) and you can answer +in just a click, reusing templates of answers. + +Customize Your Recruitment Process +---------------------------------- + +Use the kanban view and customize the steps of your recruitments process; +pre-qualification, first interview, second interview, negociaiton, ... + +Get accurate statistics on your recruitment pipeline. Get reports to compare +the performance of your different investments on external job boards. + +Streamline Your Recruitment Process +----------------------------------- + +Follow applicants in your recruitment process with the smart kanban view. Save +time by automating some communications with email templates. + +Documents like resumes and motivation letters are indexed automatically, +allowing you to easily find for specific skills and build up a database of +profiles. diff --git a/hrms_recruitment/__init__.py b/hrms_recruitment/__init__.py new file mode 100644 index 0000000..5249770 --- /dev/null +++ b/hrms_recruitment/__init__.py @@ -0,0 +1,5 @@ +# -*- encoding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import models +from . import wizard diff --git a/hrms_recruitment/__manifest__.py b/hrms_recruitment/__manifest__.py new file mode 100644 index 0000000..e1a8a75 --- /dev/null +++ b/hrms_recruitment/__manifest__.py @@ -0,0 +1,41 @@ +# -*- encoding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +{ + 'name': 'Recruitment', + 'version': '1.1', + 'category': 'Human Resources/Recruitment', + 'sequence': -100, + 'summary': 'Track your recruitment pipeline', + 'website': 'https://www.odoo.com/app/recruitment', + 'depends': [ + 'base', + 'hr', + 'calendar', + 'utm', + 'attachment_indexation', + 'web_tour', + 'digest', + ], + 'data': [ + 'security/ir.model.access.csv', + # 'data/interview_invite.xml', + 'wizard/sendmail_wizard.xml', + 'views/hr_applicant_views.xml', + 'views/hr_job_views.xml', + ], + 'demo': [ + 'data/hr_recruitment_demo.xml', + ], + 'installable': True, + 'application': True, + 'assets': { + 'web.assets_backend': [ + 'hr_recruitment/static/src/**/*.js', + 'hr_recruitment/static/src/**/*.scss', + 'hr_recruitment/static/src/**/*.xml', + 'hr_recruitment/static/src/js/tours/hr_recruitment.js', + ], + }, + 'license': 'LGPL-3', +} diff --git a/hrms_recruitment/__pycache__/__init__.cpython-310.pyc b/hrms_recruitment/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000..59f48f3 Binary files /dev/null and b/hrms_recruitment/__pycache__/__init__.cpython-310.pyc differ diff --git a/hrms_recruitment/data/interview_invite.xml b/hrms_recruitment/data/interview_invite.xml new file mode 100644 index 0000000..c1d0afd --- /dev/null +++ b/hrms_recruitment/data/interview_invite.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hrms_recruitment/models/__init__.py b/hrms_recruitment/models/__init__.py new file mode 100644 index 0000000..06bb2f2 --- /dev/null +++ b/hrms_recruitment/models/__init__.py @@ -0,0 +1,2 @@ +from . import hr_applicant +from . import hr_job \ No newline at end of file diff --git a/hrms_recruitment/models/__pycache__/__init__.cpython-310.pyc b/hrms_recruitment/models/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000..b7f5d57 Binary files /dev/null and b/hrms_recruitment/models/__pycache__/__init__.cpython-310.pyc differ diff --git a/hrms_recruitment/models/__pycache__/calendar.cpython-310.pyc b/hrms_recruitment/models/__pycache__/calendar.cpython-310.pyc new file mode 100644 index 0000000..af45672 Binary files /dev/null and b/hrms_recruitment/models/__pycache__/calendar.cpython-310.pyc differ diff --git a/hrms_recruitment/models/__pycache__/digest.cpython-310.pyc b/hrms_recruitment/models/__pycache__/digest.cpython-310.pyc new file mode 100644 index 0000000..7425f30 Binary files /dev/null and b/hrms_recruitment/models/__pycache__/digest.cpython-310.pyc differ diff --git a/hrms_recruitment/models/__pycache__/hr_applicant.cpython-310.pyc b/hrms_recruitment/models/__pycache__/hr_applicant.cpython-310.pyc new file mode 100644 index 0000000..94d347e Binary files /dev/null and b/hrms_recruitment/models/__pycache__/hr_applicant.cpython-310.pyc differ diff --git a/hrms_recruitment/models/__pycache__/hr_applicant_category.cpython-310.pyc b/hrms_recruitment/models/__pycache__/hr_applicant_category.cpython-310.pyc new file mode 100644 index 0000000..03aa90d Binary files /dev/null and b/hrms_recruitment/models/__pycache__/hr_applicant_category.cpython-310.pyc differ diff --git a/hrms_recruitment/models/__pycache__/hr_applicant_refuse_reason.cpython-310.pyc b/hrms_recruitment/models/__pycache__/hr_applicant_refuse_reason.cpython-310.pyc new file mode 100644 index 0000000..545145b Binary files /dev/null and b/hrms_recruitment/models/__pycache__/hr_applicant_refuse_reason.cpython-310.pyc differ diff --git a/hrms_recruitment/models/__pycache__/hr_department.cpython-310.pyc b/hrms_recruitment/models/__pycache__/hr_department.cpython-310.pyc new file mode 100644 index 0000000..4bdcb31 Binary files /dev/null and b/hrms_recruitment/models/__pycache__/hr_department.cpython-310.pyc differ diff --git a/hrms_recruitment/models/__pycache__/hr_employee.cpython-310.pyc b/hrms_recruitment/models/__pycache__/hr_employee.cpython-310.pyc new file mode 100644 index 0000000..51b155a Binary files /dev/null and b/hrms_recruitment/models/__pycache__/hr_employee.cpython-310.pyc differ diff --git a/hrms_recruitment/models/__pycache__/hr_job.cpython-310.pyc b/hrms_recruitment/models/__pycache__/hr_job.cpython-310.pyc new file mode 100644 index 0000000..29a2863 Binary files /dev/null and b/hrms_recruitment/models/__pycache__/hr_job.cpython-310.pyc differ diff --git a/hrms_recruitment/models/__pycache__/hr_recruitment_degree.cpython-310.pyc b/hrms_recruitment/models/__pycache__/hr_recruitment_degree.cpython-310.pyc new file mode 100644 index 0000000..6e42edc Binary files /dev/null and b/hrms_recruitment/models/__pycache__/hr_recruitment_degree.cpython-310.pyc differ diff --git a/hrms_recruitment/models/__pycache__/hr_recruitment_source.cpython-310.pyc b/hrms_recruitment/models/__pycache__/hr_recruitment_source.cpython-310.pyc new file mode 100644 index 0000000..3b9f8d0 Binary files /dev/null and b/hrms_recruitment/models/__pycache__/hr_recruitment_source.cpython-310.pyc differ diff --git a/hrms_recruitment/models/__pycache__/hr_recruitment_stage.cpython-310.pyc b/hrms_recruitment/models/__pycache__/hr_recruitment_stage.cpython-310.pyc new file mode 100644 index 0000000..5ac34ce Binary files /dev/null and b/hrms_recruitment/models/__pycache__/hr_recruitment_stage.cpython-310.pyc differ diff --git a/hrms_recruitment/models/__pycache__/ir_ui_menu.cpython-310.pyc b/hrms_recruitment/models/__pycache__/ir_ui_menu.cpython-310.pyc new file mode 100644 index 0000000..94a2c8d Binary files /dev/null and b/hrms_recruitment/models/__pycache__/ir_ui_menu.cpython-310.pyc differ diff --git a/hrms_recruitment/models/__pycache__/res_config_settings.cpython-310.pyc b/hrms_recruitment/models/__pycache__/res_config_settings.cpython-310.pyc new file mode 100644 index 0000000..3144ead Binary files /dev/null and b/hrms_recruitment/models/__pycache__/res_config_settings.cpython-310.pyc differ diff --git a/hrms_recruitment/models/__pycache__/res_users.cpython-310.pyc b/hrms_recruitment/models/__pycache__/res_users.cpython-310.pyc new file mode 100644 index 0000000..0db1951 Binary files /dev/null and b/hrms_recruitment/models/__pycache__/res_users.cpython-310.pyc differ diff --git a/hrms_recruitment/models/__pycache__/utm_campaign.cpython-310.pyc b/hrms_recruitment/models/__pycache__/utm_campaign.cpython-310.pyc new file mode 100644 index 0000000..15b7ed0 Binary files /dev/null and b/hrms_recruitment/models/__pycache__/utm_campaign.cpython-310.pyc differ diff --git a/hrms_recruitment/models/__pycache__/utm_source.cpython-310.pyc b/hrms_recruitment/models/__pycache__/utm_source.cpython-310.pyc new file mode 100644 index 0000000..e6a30a2 Binary files /dev/null and b/hrms_recruitment/models/__pycache__/utm_source.cpython-310.pyc differ diff --git a/hrms_recruitment/models/hr_applicant.py b/hrms_recruitment/models/hr_applicant.py new file mode 100644 index 0000000..ecd0413 --- /dev/null +++ b/hrms_recruitment/models/hr_applicant.py @@ -0,0 +1,60 @@ +from typing import re + +from odoo import api, fields, models, _ +from datetime import date, datetime, timedelta +from odoo.exceptions import UserError, ValidationError + + +class HrRecruitment(models.Model): + _inherit = "hr.applicant" + + source_ids = fields.Selection([('referral', 'Referral'), ('naukri', 'Naukri'), ('job portal', 'Job Portal')], + string="Source From") + current_city_ids = fields.Char(string="Current City") + preferred_city_ids = fields.Char(string="Preferred City") + current_CTC = fields.Float(string='Current CTC', group_operator="avg", help="Current Salary of the Applicant") + offer_in_hand = fields.Selection([('yes', 'Yes'), ('no', 'No')], string="Offer in Hand") + official_notice_period = fields.Integer(string="Official Notice Period(in days)") + how_soon_can_be_joined = fields.Integer(string="How soon can be joined(in days)") + last_working_day = fields.Date(string="Last Working Day") + current_organization = fields.Text(string="Current Organization") + total_experience = fields.Char(string='Total Experience', + help="Enter the total experience in the format 'X Years Y Months'") + relevant_experience = fields.Char(string="Relevant Experience") + recruiter_name = fields.Many2one("hr.employee", string="Recruiter name") + attachment_ids = fields.One2many('ir.attachment', 'res_id', string="Attachment") + + user_id = fields.Many2one('res.users', string='User', default=lambda self: self.env.user.id) + + # @api.model + # def create(self, vals): + # res = super(HrRecruitment, self).create(vals) + # res._send_interview_invitation() + # return res + # + # def write(self, vals): + # res = super(HrRecruitment, self).write(vals) + # if 'stage_id' in vals and vals['stage_id']: + # self._send_interview_invitation() + # return res + # + # def _send_interview_invitation(self): + # interview_stage = self.env.ref( + # 'hr_recruitment.hr_recruitment_stage_form') + # for applicant in self: + # if applicant.stage_id == interview_stage: + # template = self.env.ref('hrms_recruitment.interview_invitation_meeting') + # if template: + # template.send_mail(applicant.id, force_send=True) + + def action_open_mail_wizard(self): + return { + 'name': _('Send Mail'), + 'type': 'ir.actions.act_window', + 'res_model': 'hr.applicant.mail.wizard', + 'view_mode': 'form', + 'target': 'new', + 'context': { + 'default_applicant_id': self.id, + }, + } diff --git a/hrms_recruitment/models/hr_job.py b/hrms_recruitment/models/hr_job.py new file mode 100644 index 0000000..e22326d --- /dev/null +++ b/hrms_recruitment/models/hr_job.py @@ -0,0 +1,24 @@ +from odoo import api, fields, models, _ +from datetime import date, datetime, timedelta +from odoo.exceptions import UserError, ValidationError + + +class HrRecruitment(models.Model): + _inherit = "hr.job" + + account_manager = fields.Many2one("hr.employee", string="Account Manager") + recruiter_name = fields.Many2one("hr.employee", string="Recruiter assignee") + no_of_position = fields.Integer(string="Number of positions") + status = fields.Selection([('in progress', 'In progress'), ('inactive', 'Inactive')], + string="Status") + type_ids = fields.Selection([('fte', 'FTE'), ('tpc', 'TPC')], string="Type") + work_experience = fields.Integer(string="Work Experience(Years)") + skills = fields.Char(string="Skills") + attachment_ids = fields.One2many('ir.attachment', 'res_id', string="Attachment") + rate = fields.Integer(string="Rate", default=0) + city = fields.Char(string="City") + country_id = fields.Many2one('res.country', string="Country") + zip_code = fields.Char(string="Zip Code") + + user_id = fields.Many2one('res.users', string='User', default=lambda self: self.env.user.id) + diff --git a/hrms_recruitment/security/ir.model.access.csv b/hrms_recruitment/security/ir.model.access.csv new file mode 100644 index 0000000..c839c89 --- /dev/null +++ b/hrms_recruitment/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_hr_applicant_user,hr.applicant.user,model_hr_applicant,base.group_user,1,1,1,1 +access_hr_applicant_mail_wizard_user,hr.applicant.mail.wizard.user,model_hr_applicant_mail_wizard,base.group_user,1,1,1,1 diff --git a/hrms_recruitment/static/applicant_cvs/Cecile_Donth_CV.pdf b/hrms_recruitment/static/applicant_cvs/Cecile_Donth_CV.pdf new file mode 100644 index 0000000..eb0ccee Binary files /dev/null and b/hrms_recruitment/static/applicant_cvs/Cecile_Donth_CV.pdf differ diff --git a/hrms_recruitment/static/applicant_cvs/David_Armstrong_CV.pdf b/hrms_recruitment/static/applicant_cvs/David_Armstrong_CV.pdf new file mode 100644 index 0000000..d05f0c8 Binary files /dev/null and b/hrms_recruitment/static/applicant_cvs/David_Armstrong_CV.pdf differ diff --git a/hrms_recruitment/static/applicant_cvs/David_Billy_CV.pdf b/hrms_recruitment/static/applicant_cvs/David_Billy_CV.pdf new file mode 100644 index 0000000..686ec7b Binary files /dev/null and b/hrms_recruitment/static/applicant_cvs/David_Billy_CV.pdf differ diff --git a/hrms_recruitment/static/applicant_cvs/Enrique_Jones_CV.pdf b/hrms_recruitment/static/applicant_cvs/Enrique_Jones_CV.pdf new file mode 100644 index 0000000..0c94d3c Binary files /dev/null and b/hrms_recruitment/static/applicant_cvs/Enrique_Jones_CV.pdf differ diff --git a/hrms_recruitment/static/applicant_cvs/Hubert_Blank_CV.pdf b/hrms_recruitment/static/applicant_cvs/Hubert_Blank_CV.pdf new file mode 100644 index 0000000..154e633 Binary files /dev/null and b/hrms_recruitment/static/applicant_cvs/Hubert_Blank_CV.pdf differ diff --git a/hrms_recruitment/static/applicant_cvs/Johan_Duck_CV.pdf b/hrms_recruitment/static/applicant_cvs/Johan_Duck_CV.pdf new file mode 100644 index 0000000..7b52771 Binary files /dev/null and b/hrms_recruitment/static/applicant_cvs/Johan_Duck_CV.pdf differ diff --git a/hrms_recruitment/static/applicant_cvs/John_Bruno_CV.pdf b/hrms_recruitment/static/applicant_cvs/John_Bruno_CV.pdf new file mode 100644 index 0000000..7335063 Binary files /dev/null and b/hrms_recruitment/static/applicant_cvs/John_Bruno_CV.pdf differ diff --git a/hrms_recruitment/static/applicant_cvs/Joren_Jacob_CV.pdf b/hrms_recruitment/static/applicant_cvs/Joren_Jacob_CV.pdf new file mode 100644 index 0000000..e90dd9d Binary files /dev/null and b/hrms_recruitment/static/applicant_cvs/Joren_Jacob_CV.pdf differ diff --git a/hrms_recruitment/static/applicant_cvs/Jose_CV.pdf b/hrms_recruitment/static/applicant_cvs/Jose_CV.pdf new file mode 100644 index 0000000..ac06464 Binary files /dev/null and b/hrms_recruitment/static/applicant_cvs/Jose_CV.pdf differ diff --git a/hrms_recruitment/static/applicant_cvs/Kelly_Wallant_CV.pdf b/hrms_recruitment/static/applicant_cvs/Kelly_Wallant_CV.pdf new file mode 100644 index 0000000..c3d9fe6 Binary files /dev/null and b/hrms_recruitment/static/applicant_cvs/Kelly_Wallant_CV.pdf differ diff --git a/hrms_recruitment/static/applicant_cvs/Marie_Justine_CV.pdf b/hrms_recruitment/static/applicant_cvs/Marie_Justine_CV.pdf new file mode 100644 index 0000000..972a75b Binary files /dev/null and b/hrms_recruitment/static/applicant_cvs/Marie_Justine_CV.pdf differ diff --git a/hrms_recruitment/static/applicant_cvs/Meldona_Thang_CV.pdf b/hrms_recruitment/static/applicant_cvs/Meldona_Thang_CV.pdf new file mode 100644 index 0000000..af81412 Binary files /dev/null and b/hrms_recruitment/static/applicant_cvs/Meldona_Thang_CV.pdf differ diff --git a/hrms_recruitment/static/applicant_cvs/Ohen_Rizome_CV.pdf b/hrms_recruitment/static/applicant_cvs/Ohen_Rizome_CV.pdf new file mode 100644 index 0000000..3ed08fc Binary files /dev/null and b/hrms_recruitment/static/applicant_cvs/Ohen_Rizome_CV.pdf differ diff --git a/hrms_recruitment/static/applicant_cvs/Sandra_Elvis_CV.pdf b/hrms_recruitment/static/applicant_cvs/Sandra_Elvis_CV.pdf new file mode 100644 index 0000000..7a78c77 Binary files /dev/null and b/hrms_recruitment/static/applicant_cvs/Sandra_Elvis_CV.pdf differ diff --git a/hrms_recruitment/static/applicant_cvs/Shane_Williams_CV.pdf b/hrms_recruitment/static/applicant_cvs/Shane_Williams_CV.pdf new file mode 100644 index 0000000..6b81bd0 Binary files /dev/null and b/hrms_recruitment/static/applicant_cvs/Shane_Williams_CV.pdf differ diff --git a/hrms_recruitment/static/applicant_cvs/Tina_Augustie_CV.pdf b/hrms_recruitment/static/applicant_cvs/Tina_Augustie_CV.pdf new file mode 100644 index 0000000..b16cf37 Binary files /dev/null and b/hrms_recruitment/static/applicant_cvs/Tina_Augustie_CV.pdf differ diff --git a/hrms_recruitment/static/applicant_cvs/Yin_Lee_CV.pdf b/hrms_recruitment/static/applicant_cvs/Yin_Lee_CV.pdf new file mode 100644 index 0000000..4a4f7c7 Binary files /dev/null and b/hrms_recruitment/static/applicant_cvs/Yin_Lee_CV.pdf differ diff --git a/hrms_recruitment/static/description/icon.png b/hrms_recruitment/static/description/icon.png new file mode 100644 index 0000000..c87b692 Binary files /dev/null and b/hrms_recruitment/static/description/icon.png differ diff --git a/hrms_recruitment/static/description/icon.svg b/hrms_recruitment/static/description/icon.svg new file mode 100644 index 0000000..5cbc581 --- /dev/null +++ b/hrms_recruitment/static/description/icon.svg @@ -0,0 +1 @@ + diff --git a/hrms_recruitment/static/src/applicant_char/applicant_char.js b/hrms_recruitment/static/src/applicant_char/applicant_char.js new file mode 100644 index 0000000..17114b1 --- /dev/null +++ b/hrms_recruitment/static/src/applicant_char/applicant_char.js @@ -0,0 +1,36 @@ +/** @odoo-module */ + +import { CharField, charField } from "@web/views/fields/char/char_field"; +import { registry } from "@web/core/registry"; + +import { useService } from "@web/core/utils/hooks"; + +export class ApplicantCharField extends CharField { + setup() { + super.setup(); + + this.action = useService("action"); + } + + onClick() { + const record = this.props.record.data; + if (record.res_id !== undefined && record.res_model == 'hr.applicant') { + this.action.doAction({ + type: 'ir.actions.act_window', + res_model: 'hr.applicant', + res_id: record.res_id, + views: [[false, "form"]], + view_mode: "form", + target: "current", + }); + } + } +} +ApplicantCharField.template = "hr_recruitment.ApplicantCharField"; + +export const applicantCharField = { + ...charField, + component: ApplicantCharField, +}; + +registry.category("fields").add("applicant_char", applicantCharField); diff --git a/hrms_recruitment/static/src/applicant_char/applicant_char.scss b/hrms_recruitment/static/src/applicant_char/applicant_char.scss new file mode 100644 index 0000000..0743591 --- /dev/null +++ b/hrms_recruitment/static/src/applicant_char/applicant_char.scss @@ -0,0 +1,7 @@ +.o_field_applicant_char { + color: $link-color; + + &:hover { + color: $link-hover-color; + } +} diff --git a/hrms_recruitment/static/src/applicant_char/applicant_char.xml b/hrms_recruitment/static/src/applicant_char/applicant_char.xml new file mode 100644 index 0000000..adfd20b --- /dev/null +++ b/hrms_recruitment/static/src/applicant_char/applicant_char.xml @@ -0,0 +1,8 @@ + + + + + onClick + + + diff --git a/hrms_recruitment/static/src/img/congratulations.png b/hrms_recruitment/static/src/img/congratulations.png new file mode 100644 index 0000000..bcdd887 Binary files /dev/null and b/hrms_recruitment/static/src/img/congratulations.png differ diff --git a/hrms_recruitment/static/src/js/tours/hr_recruitment.js b/hrms_recruitment/static/src/js/tours/hr_recruitment.js new file mode 100644 index 0000000..840498b --- /dev/null +++ b/hrms_recruitment/static/src/js/tours/hr_recruitment.js @@ -0,0 +1,105 @@ +/** @odoo-module **/ + +import { _t } from "@web/core/l10n/translation"; +import { registry } from "@web/core/registry"; +import { stepUtils } from "@web_tour/tour_service/tour_utils"; +import { markup } from "@odoo/owl"; + +registry.category("web_tour.tours").add('hr_recruitment_tour',{ + url: "/web", + rainbowManMessage: () => markup(_t("
Great job! You hired a new colleague!
Try the Website app to publish job offers online.
")), + fadeout: 'very_slow', + sequence: 230, + steps: () => [stepUtils.showAppsMenuItem(), { + trigger: '.o_app[data-menu-xmlid="hr_recruitment.menu_hr_recruitment_root"]', + content: markup(_t("Let's have a look at how to improve your hiring process.")), + position: 'right', + edition: 'community' +}, { + trigger: '.o_app[data-menu-xmlid="hr_recruitment.menu_hr_recruitment_root"]', + content: markup(_t("Let's have a look at how to improve your hiring process.")), + position: 'bottom', + edition: 'enterprise' +}, { + trigger: ".o-kanban-button-new", + content: _t("Create your first Job Position."), + position: "bottom", + width: 195 +}, { + trigger: ".o_job_name", + extra_trigger: '.o_hr_job_simple_form', + content: _t("What do you want to recruit today? Choose a job title..."), + position: "right" +}, { + trigger: ".o_job_alias", + extra_trigger: '.o_hr_job_simple_form', + content: _t("Choose an application email."), + position: "right", + width: 195 +}, { + trigger: '.o_create_job', + content: _t('Let\'s create the position. An email will be setup for applications, and a public job description, if you use the Website app.'), + position: 'bottom', + run: function (actions) { + actions.auto('.modal:visible .btn.btn-primary'); + }, +}, { + trigger: ".oe_kanban_action_button", + extra_trigger: '.o_hr_recruitment_kanban', + content: _t("Let\'s have a look at the applications pipeline."), + position: "bottom" +}, { + trigger: ".o_copy_paste_email", + content: _t("Copy this email address, to paste it in your email composer, to apply."), + position: "bottom" +}, { + trigger: ".breadcrumb-item:not(.active):last", + extra_trigger: '.o_kanban_applicant', + content: _t("Let’s go back to the dashboard."), + position: "bottom", + width: 195 +}, { + trigger: ".oe_kanban_action_button", + extra_trigger: '.o_hr_recruitment_kanban', + content: markup(_t("Did you apply by sending an email? Check incoming applications.")), + position: "bottom" +}, { + trigger: ".oe_kanban_card", + extra_trigger: '.o_kanban_applicant', + content: markup(_t("Drag this card, to qualify him for a first interview.")), + position: "bottom", + run: "drag_and_drop .o_kanban_group:eq(1) ", +}, { + trigger: ".oe_kanban_card", + extra_trigger: '.o_kanban_applicant', + content: markup(_t("Click to view the application.")), + position: "bottom", + width: 195 +}, { + trigger: "button:contains(Send message)", + extra_trigger: '.o_applicant_form', + content: markup(_t("
Try to send an email to the applicant.
Tips: All emails sent or received are saved in the history here")), + position: "bottom" +}, { + trigger: ".o-mail-Chatter .o-mail-Composer button[aria-label='Send']", + extra_trigger: '.o_applicant_form', + content: _t("Send your email. Followers will get a copy of the communication."), + position: "bottom" +}, { + trigger: "button:contains(Log note)", + extra_trigger: '.o_applicant_form', + content: _t("Or talk about this applicant privately with your colleagues."), + position: "bottom" +}, { + trigger: ".o_create_employee", + extra_trigger: '.o_applicant_form', + content: _t("Let’s create this new employee now."), + position: "bottom", + width: 225 +}, { + trigger: ".o_form_button_save", + extra_trigger: ".o_hr_employee_form_view", + content: _t("Save it!"), + position: "bottom", + width: 80 +}]}); diff --git a/hrms_recruitment/static/src/scss/hr_applicant.scss b/hrms_recruitment/static/src/scss/hr_applicant.scss new file mode 100644 index 0000000..e63457c --- /dev/null +++ b/hrms_recruitment/static/src/scss/hr_applicant.scss @@ -0,0 +1,22 @@ +.o_applicant_interviewer_form { + .o-mail-Chatter-sendMessage, + .o-mail-Chatter-logNote, + .o-mail-Thread-empty { + display: none; + } +} + +.o_form_view.o_applicant_form .o_form_renderer { + &.o_form_readonly { + .o_field_empty:empty { + min-height: unset; + } + } + + &.o_form_editable { + .oe_title { + max-width: unset; + } + } +} + diff --git a/hrms_recruitment/static/src/scss/hr_job.scss b/hrms_recruitment/static/src/scss/hr_job.scss new file mode 100644 index 0000000..1cfc50c --- /dev/null +++ b/hrms_recruitment/static/src/scss/hr_job.scss @@ -0,0 +1,43 @@ +.o_kanban_dashboard.o_hr_recruitment_kanban { + .o_kanban_renderer { + &.o_kanban_ungrouped .o_kanban_record { + width: 450px; + &:not(.o_kanban_ghost) { + min-height: 220px; + } + } + + .text_top_padding{ + padding-top: 0.375rem; + } + + .o_primary { + display: flex !important; + align-items: center; + justify-content: space-between; + padding-right: 24px !important; + + .fa { + margin-left: 0; + } + } + + .o_job_activities { + list-style-type: none; + } + + .o_kanban_card_header_title { + min-height: 3rem; + + .o_field_boolean_favorite { + display: inline; + } + } + } +} + +.o_kanban_view { + .o_view_sample_data .ribbon { + display: none; + } +} diff --git a/hrms_recruitment/static/src/views/form_view.js b/hrms_recruitment/static/src/views/form_view.js new file mode 100644 index 0000000..1f31a8c --- /dev/null +++ b/hrms_recruitment/static/src/views/form_view.js @@ -0,0 +1,28 @@ +/** @odoo-module */ + +import { registry } from '@web/core/registry'; + +import { formView } from '@web/views/form/form_view'; +import { FormController } from '@web/views/form/form_controller'; + +export class InterviewerFormController extends FormController { + + /** + * Add `o_applicant_interviewer_form` class if necessary + */ + get className() { + const result = super.className; + const root = this.model.root; + if (!root.data.interviewer_ids || !root.data.user_id) { + return result; + } + result["o_applicant_interviewer_form"] = root.data.interviewer_ids.records.findIndex( + interviewer => interviewer.resId === root.data.user_id[0]) > -1; + return result; + } +} + +registry.category('views').add('hr_recruitment_interviewer', { + ...formView, + Controller: InterviewerFormController, +}); diff --git a/hrms_recruitment/views/hr_applicant_views.xml b/hrms_recruitment/views/hr_applicant_views.xml new file mode 100644 index 0000000..c0237a3 --- /dev/null +++ b/hrms_recruitment/views/hr_applicant_views.xml @@ -0,0 +1,101 @@ + + + + + hr.applicant.form.view + hr.applicant + + + + + + + + + + + + hr.applicant.form.view + hr.applicant + + + + + + + 0 + + + 1 + + + + + + hr.applicant.form.view + hr.applicant + + + + 1 + + + + + + ld.hr.applicant.current.ctc + hr.applicant + + + + + + + + + + ld.hr.applicant.offer + hr.applicant + + + + + + + + + + + + + + + + + + + + + ld.hr.applicant.offer + hr.applicant + + + + + + + + + + hr.applicant.form.view.send.mail + hr.applicant + + + +