11-06-2025

Merge branch 'develop'
This commit is contained in:
administrator 2025-06-11 17:54:28 +05:30
commit 8a3a89fde9
9 changed files with 374 additions and 4 deletions

View File

@ -28,6 +28,7 @@
'data/data.xml',
'data/sequence.xml',
'data/mail_template.xml',
'data/templates.xml',
'views/job_category.xml',
'views/hr_location.xml',
'views/stages.xml',

View File

@ -342,7 +342,7 @@
</p>
</t>
<t t-if="ctx.get('personal_docs') or ctx.get('education_docs') or ctx.get('previous_employer_docs') or ctx.get('other_docs')">
<t t-if="ctx.get('personal_docs') and ctx.get('education_docs') or ctx.get('previous_employer_docs') or ctx.get('other_docs')">
<p>For HR records, please provide soft copies of the following documents:</p>
<!-- Personal Documents -->

View File

@ -0,0 +1,350 @@
<odoo>
<!-- <template id="joining_form_custom_external_layout_standard">-->
<!-- <div t-attf-class="header">-->
<!-- </div>-->
<!-- <div t-attf-class="footer o_company_#{company.id}_layout {{report_type != 'pdf' and 'mt-auto'}}">-->
<!-- <div class="o_footer_content d-flex border-top pt-2">-->
<!-- <div class="flex-grow-1 text-start me-2" t-field="company.report_footer"/>-->
<!-- <div class="text-end text-muted">-->
<!-- <div t-if="report_type == 'pdf' and display_name_in_footer" t-out="o.name">(document name)</div>-->
<!-- <div t-if="report_type == 'pdf'">Page <span class="page"/> / <span class="topage"/></div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </template>-->
<!-- <template id="joining_form_custom_external_layout">-->
<!-- <t t-if="not o" t-set="o" t-value="doc"/>-->
<!-- <t t-if="not company">-->
<!-- &lt;!&ndash; Multicompany &ndash;&gt;-->
<!-- <t t-if="company_id">-->
<!-- <t t-set="company" t-value="company_id"/>-->
<!-- </t>-->
<!-- <t t-elif="o and 'company_id' in o and o.company_id.sudo()">-->
<!-- <t t-set="company" t-value="o.company_id.sudo()"/>-->
<!-- </t>-->
<!-- <t t-else="else">-->
<!-- <t t-set="company" t-value="res_company"/>-->
<!-- </t>-->
<!-- </t>-->
<!-- <t t-if="company.external_report_layout_id" t-call="{{company.external_report_layout_id.sudo().key}}"><t t-out="0"/></t>-->
<!-- <t t-else="else" t-call="hr_recruitment_extended.joining_form_custom_external_layout_standard"><t t-out="0"/></t>-->
<!-- </template>-->
<odoo>
<template id="employee_joining_form_template">
<t t-call="web.external_layout">
<main class="page" style="margin: 0px; padding: 0px; font-size: 16px; font-family: 'Arial', sans-serif;">
<t t-foreach="docs" t-as="doc">
<!-- Candidate Image -->
<t t-if="doc.candidate_id.candidate_image">
<div style="text-align: center; margin-bottom: 30px;">
<img t-attf-src="data:image/png;base64,#{doc.candidate_id.candidate_image}"
style="width: 280px; height: 400px; object-fit: cover; border: 2px solid #333; border-radius: 8px;"/>
</div>
</t>
<!-- Header -->
<div style="text-align:center; margin-bottom: 40px;">
<h1 style="margin: 0; font-size: 24px;">Welcome to FTPROTECH</h1>
<h2 style="margin: 10px 0 0;">Employee Joining Form</h2>
</div>
<!-- Reusable styles -->
<t t-set="row_style" t-value="'display: flex; margin-bottom: 12px; page-break-inside: avoid;'"/>
<t t-set="label_style" t-value="'width: 35%; font-weight: bold; color: #333;'"/>
<t t-set="value_style" t-value="'width: 65%; color: #000;'"/>
<!-- Personal Info -->
<div style="page-break-inside: avoid;">
<h3 style="margin-top: 30px; color: #005580;">Personal Details</h3>
<div t-att-style="row_style">
<div t-att-style="label_style">Employee Code:</div>
<div t-att-style="value_style">
<t t-esc="doc.employee_code or ''"/>
</div>
</div>
<div t-att-style="row_style">
<div t-att-style="label_style">Date of Joining:</div>
<div t-att-style="value_style">
<t t-esc="doc.doj or ''"/>
</div>
</div>
<div t-att-style="row_style">
<div t-att-style="label_style">Full Name:</div>
<div t-att-style="value_style">
<t t-esc="doc.employee_id.name or doc.name or ''"/>
</div>
</div>
<div t-att-style="row_style">
<div t-att-style="label_style">Email:</div>
<div t-att-style="value_style">
<t t-esc="doc.email_from or ''"/>
</div>
</div>
<div t-att-style="row_style">
<div t-att-style="label_style">Mobile No:</div>
<div t-att-style="value_style">
<t t-esc="doc.partner_phone or ''"/>
</div>
</div>
<div t-att-style="row_style">
<div t-att-style="label_style">Alternate Mobile:</div>
<div t-att-style="value_style">
<t t-esc="doc.alternate_phone or ''"/>
</div>
</div>
<div t-att-style="row_style">
<div t-att-style="label_style">Gender:</div>
<div t-att-style="value_style">
<t t-esc="doc.gender or ''"/>
</div>
</div>
<div t-att-style="row_style">
<div t-att-style="label_style">Date of Birth:</div>
<div t-att-style="value_style">
<t t-esc="doc.birthday or ''"/>
</div>
</div>
</div>
<!-- Address -->
<div style="page-break-inside: avoid;">
<h3 style="margin-top: 30px; color: #005580;">Address</h3>
<div t-att-style="row_style">
<div t-att-style="label_style">Present Address:</div>
<div t-att-style="value_style">
<t t-esc="doc.private_street or ''"/>
<t t-esc="doc.private_street2 or ''"/>,
<t t-esc="doc.private_city or ''"/>
<t t-esc="doc.private_zip or ''"/>
</div>
</div>
<div t-att-style="row_style">
<div t-att-style="label_style">Permanent Address:</div>
<div t-att-style="value_style">
<t t-esc="doc.permanent_street or ''"/>
<t t-esc="doc.permanent_street2 or ''"/>,
<t t-esc="doc.permanent_city or ''"/>
<t t-esc="doc.permanent_zip or ''"/>
</div>
</div>
</div>
<div t-att-style="row_style">
<div t-att-style="label_style">Marital Status:</div>
<div t-att-style="value_style">
<t t-esc="doc.marital or ''"/>
</div>
</div>
<!-- Section: Family Details -->
<div style="page-break-inside: avoid;">
<t t-if="doc.family_details">
<h3 style="margin-top: 35px; color: #005580;">Family Details</h3>
<table style="width: 100%; border-collapse: collapse; font-size: 15px;">
<thead style="background: #f1f1f1;">
<tr>
<th style="border: 1px solid #ccc; padding: 8px;">Name</th>
<th style="border: 1px solid #ccc; padding: 8px;">Contact</th>
<th style="border: 1px solid #ccc; padding: 8px;">Date of Birth</th>
<th style="border: 1px solid #ccc; padding: 8px;">Location</th>
</tr>
</thead>
<tbody>
<t t-foreach="doc.family_details" t-as="member">
<tr>
<td style="border: 1px solid #ccc; padding: 8px;">
<t t-esc="member.name or ''"/>
</td>
<td style="border: 1px solid #ccc; padding: 8px;">
<t t-esc="member.contact_no or ''"/>
</td>
<td style="border: 1px solid #ccc; padding: 8px;">
<t t-esc="member.dob or ''"/>
</td>
<td style="border: 1px solid #ccc; padding: 8px;">
<t t-esc="member.location or ''"/>
</td>
</tr>
</t>
</tbody>
</table>
</t>
</div>
<!-- Section: Education -->
<div style="page-break-inside: avoid;">
<t t-if="doc.education_history">
<h3 style="margin-top: 35px; color: #005580;">Education Details</h3>
<table style="width: 100%; border-collapse: collapse; font-size: 15px;">
<thead style="background: #f1f1f1;">
<tr>
<th style="border: 1px solid #ccc; padding: 8px;">Specialization</th>
<th style="border: 1px solid #ccc; padding: 8px;">University</th>
<th style="border: 1px solid #ccc; padding: 8px;">Start Year</th>
<th style="border: 1px solid #ccc; padding: 8px;">End Year</th>
<th style="border: 1px solid #ccc; padding: 8px;">Grade</th>
</tr>
</thead>
<tbody>
<t t-foreach="doc.education_history" t-as="edu">
<tr>
<td style="border: 1px solid #ccc; padding: 8px;">
<t t-esc="edu.name or ''"/>
</td>
<td style="border: 1px solid #ccc; padding: 8px;">
<t t-esc="edu.university or ''"/>
</td>
<td style="border: 1px solid #ccc; padding: 8px;">
<t t-esc="edu.start_year or ''"/>
</td>
<td style="border: 1px solid #ccc; padding: 8px;">
<t t-esc="edu.end_year or ''"/>
</td>
<td style="border: 1px solid #ccc; padding: 8px;">
<t t-esc="edu.marks_or_grade or ''"/>
</td>
</tr>
</t>
</tbody>
</table>
</t>
</div>
<!-- Section: Previous Employer -->
<div style="page-break-inside: avoid;">
<t t-if="doc.employer_history">
<h3 style="margin-top: 35px; color: #005580;">Previous Employment</h3>
<table style="width: 100%; border-collapse: collapse; font-size: 15px;">
<thead style="background: #f1f1f1;">
<tr>
<th style="border: 1px solid #ccc; padding: 8px;">Company</th>
<th style="border: 1px solid #ccc; padding: 8px;">Designation</th>
<th style="border: 1px solid #ccc; padding: 8px;">Joining</th>
<th style="border: 1px solid #ccc; padding: 8px;">Last Working Day</th>
<th style="border: 1px solid #ccc; padding: 8px;">CTC</th>
</tr>
</thead>
<tbody>
<t t-foreach="doc.employer_history" t-as="job">
<tr>
<td style="border: 1px solid #ccc; padding: 8px;">
<t t-esc="job.company_name or ''"/>
</td>
<td style="border: 1px solid #ccc; padding: 8px;">
<t t-esc="job.designation or ''"/>
</td>
<td style="border: 1px solid #ccc; padding: 8px;">
<t t-esc="job.date_of_joining or ''"/>
</td>
<td style="border: 1px solid #ccc; padding: 8px;">
<t t-esc="job.last_working_day or ''"/>
</td>
<td style="border: 1px solid #ccc; padding: 8px;">
<t t-esc="job.ctc or ''"/>
</td>
</tr>
</t>
</tbody>
</table>
</t>
</div>
<!-- Section: Bank Details -->
<div style="page-break-inside: avoid;">
<h3 style="margin-top: 35px; color: #005580;">Bank Account Details</h3>
<table style="width: 100%; border-collapse: collapse; font-size: 15px;">
<tbody>
<tr>
<th style="width: 35%; text-align: left;">Name as per Bank</th>
<td>
<t t-esc="doc.full_name_as_in_bank or ''"/>
</td>
</tr>
<tr>
<th style="text-align: left;">Bank Name</th>
<td>
<t t-esc="doc.bank_name or ''"/>
</td>
</tr>
<tr>
<th style="text-align: left;">Branch</th>
<td>
<t t-esc="doc.bank_branch or ''"/>
</td>
</tr>
<tr>
<th style="text-align: left;">Account No</th>
<td>
<t t-esc="doc.bank_account_no or ''"/>
</td>
</tr>
<tr>
<th style="text-align: left;">IFSC Code</th>
<td>
<t t-esc="doc.bank_ifsc_code or ''"/>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Section: Identification -->
<div style="page-break-inside: avoid;">
<h3 style="margin-top: 35px; color: #005580;">Identification</h3>
<table style="width: 100%; border-collapse: collapse; font-size: 15px;">
<tbody>
<tr>
<th style="width: 35%; text-align: left;">PAN No</th>
<td>
<t t-esc="doc.pan_no or ''"/>
</td>
</tr>
<tr>
<th style="text-align: left;">Aadhar No</th>
<td>
<t t-esc="doc.identification_id or ''"/>
</td>
</tr>
<tr>
<th style="text-align: left;">PF No</th>
<td>
<t t-esc="doc.previous_company_pf_no or ''"/>
</td>
</tr>
<tr>
<th style="text-align: left;">UAN No</th>
<td>
<t t-esc="doc.previous_company_uan_no or ''"/>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Declaration -->
<div style="margin-top: 40px; font-style: italic; text-align: justify;">
I hereby declare that all the above information is true to the best of my knowledge.
</div>
</t>
</main>
</t>
</template>
</odoo>
</odoo>

View File

@ -358,6 +358,9 @@ class HRApplicant(models.Model):
})
return action
def print_joining_form(self):
return self.env.ref('hr_recruitment_extended.action_joining_form_report').report_action(self)
class ApplicantGetRefuseReason(models.TransientModel):
_inherit = 'applicant.get.refuse.reason'

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

View File

@ -400,4 +400,17 @@
</xpath>
</field>
</record>
<record id="action_download_joining_form" model="ir.actions.report">
<field name="name">Download Joining Form</field>
<field name="model">hr.applicant</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">hr_recruitment_extended.employee_joining_form_template</field>
<field name="report_file">hr_recruitment_extended.employee_joining_form_template</field>
<field name="binding_model_id" ref="hr_recruitment.model_hr_applicant"/>
<field name="print_report_name">'JOD - %s' % (object.display_name)</field>
<field name="binding_type">report</field>
</record>
</odoo>

View File

@ -51,10 +51,12 @@ class ClientSubmissionsMailTemplateWizard(models.TransientModel):
'email_from': rec.email_from,
'email_to': rec.email_to,
'email_cc': rec.email_cc,
'subject' : rec.email_subject,
'body_html': rec.email_body,
}
render_ctx = dict(client_name=record.hr_job_recruitment.requested_by.name)
# Use 'with_context' to override the email template fields dynamically
template.sudo().with_context(default_body_html=self.email_body, default_subject=self.email_subject,**render_ctx).send_mail(self.env.context.get('active_id'),email_values=values, force_send=True)
template.sudo().with_context(**render_ctx).send_mail(self.env.context.get('active_id'),email_values=values, force_send=True)
record.sudo().write({
'submitted_to_client': True,
'client_submission_date': rec.submit_date,

View File

@ -97,11 +97,12 @@ class PostOnboardingAttachmentWizard(models.TransientModel):
'email_from': rec.email_from,
'email_to': rec.email_to,
'email_cc': rec.email_cc,
'subject': rec.email_subject,
'attachment_ids': [(6, 0, rec.attachment_ids.ids)],
}
# Use 'with_context' to override the email template fields dynamically
template.sudo().with_context(default_body_html=rec.email_body, default_subject=rec.email_subject,
template.sudo().with_context(default_body_html=rec.email_body,
**email_context).send_mail(applicant.id, email_values=email_values,
force_send=True)

View File

@ -248,7 +248,7 @@ class BiometricDeviceDetails(models.Model):
"""Process attendance data from the device"""
users = conn.get_users()
today = datetime.datetime.today().date().strftime("%Y-%m-%d")
tolerance = datetime.timedelta(minutes=10)
tolerance = datetime.timedelta(minutes=1)
# Filter today's attendance
filtered_attendance = [