162 lines
7.2 KiB
Python
162 lines
7.2 KiB
Python
from odoo import api, fields, models, _
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class HRApplicant(models.Model):
|
|
_inherit = 'hr.applicant'
|
|
|
|
joining_form_link = fields.Char()
|
|
|
|
|
|
class HREmployee(models.Model):
|
|
_inherit = 'hr.employee'
|
|
|
|
applicant_id = fields.Many2one("hr.applicant")
|
|
|
|
def send_jod_form_to_employee(self):
|
|
for rec in self:
|
|
if not rec.applicant_id:
|
|
application = self.env['hr.applicant'].sudo().search([('employee_id', '=', rec.id)], limit=1)
|
|
if not application:
|
|
candidate = self.env['hr.candidate'].sudo().create({
|
|
'partner_name': rec.name,
|
|
'email_from': rec.work_email,
|
|
'partner_phone': rec.work_phone,
|
|
'employee_id': rec.id,
|
|
})
|
|
|
|
application = self.env['hr.applicant'].sudo().create({
|
|
'candidate_id': candidate.id,
|
|
'hr_job_recruitment': self.env.ref('employee_jod.employee_jod_internal_job_recruitment_id').id,
|
|
'recruitment_stage_id': self.env.ref('employee_jod.hired_stage8').id,
|
|
})
|
|
rec.applicant_id = application.id
|
|
return rec.sudo().applicant_id.send_jod_form_to_employee()
|
|
|
|
|
|
class PostOnboardingAttachmentWizard(models.TransientModel):
|
|
_inherit = 'post.onboarding.attachment.wizard'
|
|
|
|
send_mail = fields.Boolean(default=False)
|
|
|
|
@api.onchange('template_id')
|
|
def _onchange_template_id(self):
|
|
""" Update the email body and recipients based on the selected template. """
|
|
if self.template_id:
|
|
record_id = self.env.context.get('applicant_id')
|
|
model = self.env.context.get('active_model')
|
|
if model == 'applicant.request.forms':
|
|
applicant = self.env['hr.applicant'].browse(record_id)
|
|
elif model == 'hr.applicant':
|
|
applicant = self.env['hr.applicant'].browse(self.env.context.get('active_id'))
|
|
else:
|
|
if model == 'hr.employee':
|
|
applicant = self.env['hr.employee'].browse(record_id).applicant_id
|
|
|
|
if applicant:
|
|
record = self.env[self.template_id.model].sudo().browse(applicant.id)
|
|
|
|
if not record.exists():
|
|
raise UserError("The record does not exist or is not accessible.")
|
|
|
|
# Fetch email template
|
|
email_template = self.env['mail.template'].sudo().browse(self.template_id.id)
|
|
|
|
if not email_template:
|
|
raise UserError("Email template not found.")
|
|
|
|
self.email_from = self.env.company.email
|
|
self.email_to = applicant.email_from
|
|
self.email_body = email_template.body_html # Assign the rendered email bodyc
|
|
self.email_subject = email_template.subject
|
|
|
|
def action_confirm(self):
|
|
for rec in self:
|
|
self.ensure_one()
|
|
context = self.env.context
|
|
active_id = context.get('applicant_id')
|
|
model = context.get('active_model')
|
|
request_token = False
|
|
request_upload_url = False
|
|
|
|
if model == 'applicant.request.forms':
|
|
applicant = self.env['hr.applicant'].browse(active_id)
|
|
elif model == 'hr.applicant':
|
|
applicant = self.env['hr.applicant'].browse(context.get('active_id'))
|
|
elif model == 'hr.employee':
|
|
applicant = self.env['hr.employee'].browse(active_id).applicant_id
|
|
else:
|
|
applicant = self.env['hr.applicant'].browse(active_id)
|
|
|
|
if rec.is_pre_onboarding_attachment_request and not rec.request_form_id:
|
|
raise UserError("A document request form is required before sending this email.")
|
|
|
|
if rec.request_form_id:
|
|
request_token = rec.request_form_id._issue_new_access_token()
|
|
base_url = self.get_base_url()
|
|
request_upload_url = (
|
|
f"{base_url}/FTPROTECH/DocRequests/"
|
|
f"{applicant.id}/{rec.request_form_id.id}?token={request_token}"
|
|
)
|
|
|
|
applicant.recruitment_attachments = [(4, attachment.id) for attachment in rec.req_attachment_ids]
|
|
|
|
template = rec.template_id
|
|
|
|
personal_docs = rec.req_attachment_ids.filtered(lambda a: a.attachment_type == 'personal').mapped('name')
|
|
education_docs = rec.req_attachment_ids.filtered(lambda a: a.attachment_type == 'education').mapped('name')
|
|
previous_employer_docs = rec.req_attachment_ids.filtered(
|
|
lambda a: a.attachment_type == 'previous_employer').mapped('name')
|
|
other_docs = rec.req_attachment_ids.filtered(lambda a: a.attachment_type == 'others').mapped('name')
|
|
|
|
email_context = {
|
|
'applicant_request_form_id': rec.request_form_id.id,
|
|
'applicant_request_form_token': request_token,
|
|
'applicant_request_form_url': request_upload_url,
|
|
'personal_docs': personal_docs,
|
|
'education_docs': education_docs,
|
|
'previous_employer_docs': previous_employer_docs,
|
|
'other_docs': other_docs,
|
|
}
|
|
rendered_subject = template.with_context(**email_context)._render_field(
|
|
'subject', [applicant.id]
|
|
)[applicant.id]
|
|
rendered_body_html = template.with_context(**email_context)._render_field(
|
|
'body_html', [applicant.id], compute_lang=True
|
|
)[applicant.id]
|
|
email_values = {
|
|
'email_from': rec.email_from,
|
|
'email_to': rec.email_to,
|
|
'email_cc': rec.email_cc,
|
|
'subject': rendered_subject or rec.email_subject,
|
|
'body_html': rendered_body_html,
|
|
'attachment_ids': [(6, 0, rec.attachment_ids.ids)],
|
|
}
|
|
if rec.send_mail:
|
|
template.sudo().with_context(default_body_html=rec.email_body,
|
|
**email_context).send_mail(applicant.id, email_values=email_values,
|
|
force_send=True)
|
|
base_url = self.get_base_url()
|
|
|
|
if rec.is_pre_onboarding_attachment_request:
|
|
rec.request_form_id.status = 'email_sent_to_candidate'
|
|
else:
|
|
applicant.post_onboarding_form_status = 'email_sent_to_candidate'
|
|
applicant.joining_form_link = '%s/FTPROTECH/JoiningForm/%s'%(base_url,applicant.id)
|
|
|
|
return {'type': 'ir.actions.act_window_close'}
|
|
|
|
|
|
def get_base_url(self):
|
|
""" Return rooturl for a specific record.
|
|
|
|
By default, it returns the ir.config.parameter of base_url
|
|
but it can be overridden by model.
|
|
|
|
:return: the base url for this record
|
|
:rtype: str
|
|
"""
|
|
if len(self) > 1:
|
|
raise ValueError("Expected singleton or no record: %s" % self)
|
|
return self.env['ir.config_parameter'].sudo().get_param('web.base.url')
|