[FIX] hr_recruitment: correctly count the number of applications

Previously, the "Other applications" smartbutton was incorrectly
matching with the applicants with '' on the fields. We don't want
applicants to match if both of them has '' on the matching fields.
Moreover, record rules were not correctly applied for application_count
calculation, as current record will not match with similar record
which has no company defined on it.

This commit fixes the above mentioned issues.

task - 3266694

closes odoo/odoo#118805

X-original-commit: e8263e56423432e9465f70d26fce60c021eabaa2
Signed-off-by: Kevin Baptiste <kba@odoo.com>
This commit is contained in:
sofiagvaladze
2023-04-17 18:01:26 +02:00
parent 79b30f13b8
commit faf0f0130b
2 changed files with 53 additions and 10 deletions
+11 -7
View File
@@ -140,7 +140,7 @@ class Applicant(models.Model):
# Count into the companies that are selected from the multi-company widget
company_ids = self.env.context.get('allowed_company_ids')
if company_ids:
query.add_where('other.company_id in %s', [tuple(company_ids)])
query.add_where('other.company_id is null or other.company_id in %s', [tuple(company_ids)])
self._apply_ir_rules(query)
from_clause, where_clause, where_clause_params = query.get_sql()
# In case the applicant phone or mobile is configured in wrong field
@@ -148,9 +148,11 @@ class Applicant(models.Model):
SELECT hr_applicant.id as appl_id,
COUNT(other.id) as count
FROM hr_applicant
JOIN hr_applicant other ON LOWER(other.email_from) = LOWER(hr_applicant.email_from)
OR other.partner_phone = hr_applicant.partner_phone OR other.partner_phone = hr_applicant.partner_mobile
OR other.partner_mobile = hr_applicant.partner_mobile OR other.partner_mobile = hr_applicant.partner_phone
JOIN hr_applicant other ON NULLIF(LOWER(other.email_from), '') = NULLIF(LOWER(hr_applicant.email_from), '')
OR NULLIF(other.partner_phone, '') = NULLIF(hr_applicant.partner_phone, '')
OR NULLIF(other.partner_phone, '') = NULLIF(hr_applicant.partner_mobile, '')
OR NULLIF(other.partner_mobile, '') = NULLIF(hr_applicant.partner_mobile, '')
OR NULLIF(other.partner_mobile, '') = NULLIF(hr_applicant.partner_phone, '')
%(where)s
GROUP BY hr_applicant.id
""" % {
@@ -420,9 +422,11 @@ class Applicant(models.Model):
self.env.cr.execute("""
SELECT other.id
FROM hr_applicant
JOIN hr_applicant other ON LOWER(other.email_from) = LOWER(hr_applicant.email_from)
OR other.partner_phone = hr_applicant.partner_phone OR other.partner_phone = hr_applicant.partner_mobile
OR other.partner_mobile = hr_applicant.partner_mobile OR other.partner_mobile = hr_applicant.partner_phone
JOIN hr_applicant other ON NULLIF(LOWER(other.email_from), '') = NULLIF(LOWER(hr_applicant.email_from), '')
OR NULLIF(other.partner_phone, '') = NULLIF(hr_applicant.partner_phone, '')
OR NULLIF(other.partner_phone, '') = NULLIF(hr_applicant.partner_mobile, '')
OR NULLIF(other.partner_mobile, '') = NULLIF(hr_applicant.partner_mobile, '')
OR NULLIF(other.partner_mobile, '') = NULLIF(hr_applicant.partner_phone, '')
WHERE hr_applicant.id in %s
""", (tuple(self.ids),)
)
@@ -31,7 +31,7 @@ class TestRecruitment(TransactionCase):
""" Test that we find same applicants based on simmilar mail,
phone or mobile phone.
"""
A, B, C, D, E, F = self.env['hr.applicant'].create([
A, B, C, D, E, F, _ = self.env['hr.applicant'].create([
{
'name': 'Application A',
'email_from': 'abc@odoo.com',
@@ -57,15 +57,54 @@ class TestRecruitment(TransactionCase):
},
{
'name': 'Application E',
'partner_phone': '',
},
{
'name': 'Application F',
'partner_phone': '11-12-13', # In case phone is configured in a wrong field
}
},
{
'name': 'Application G',
'partner_phone': '',
},
])
self.assertEqual(A.application_count, 2) # C, D
self.assertEqual(B.application_count, 2) # D, F
self.assertEqual(C.application_count, 2) # A, D
self.assertEqual(D.application_count, 3) # A, B, C
self.assertEqual(E.application_count, 0)
self.assertEqual(E.application_count, 0) # Should not match with G
self.assertEqual(F.application_count, 1) # B
def test_application_count_multi_company(self):
company_A = self.env['res.company'].create({'name': 'A company'})
company_B = self.env['res.company'].create({'name': 'B company'})
appX, _, _ = self.env['hr.applicant'].create([
{
'name': 'Application X',
'email_from': 'abc@odoo.com',
'partner_phone': '123',
'partner_mobile': '14-15-16',
'company_id': company_A.id
},
{
'name': 'Application Y',
'email_from': 'abc@odoo.com',
'partner_phone': '123',
'partner_mobile': '14-15-16',
'company_id': company_B.id
},
{
'name': 'Application Z',
'email_from': 'abc@odoo.com',
'partner_phone': '123',
'partner_mobile': '14-15-16',
'company_id': False
},
])
appX.with_context(allowed_company_ids=[company_A.id])._compute_application_count()
self.assertEqual(appX.application_count, 1, "Should not have counted the applicant from another company.") # Z
appX.with_context(allowed_company_ids=[company_A.id, company_B.id])._compute_application_count()
self.assertEqual(appX.application_count, 2, "Should have counted the applicant from another company as well.") # Y, Z