368 lines
14 KiB
Python
368 lines
14 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
import json
|
|
|
|
from odoo import Command
|
|
from odoo.tests.common import HttpCase, tagged
|
|
from odoo.tools import file_open, mute_logger
|
|
|
|
|
|
@tagged('-at_install', 'post_install')
|
|
class TestSalaryPackageItems(HttpCase):
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super().setUpClass()
|
|
cls.structure_type = cls.env['hr.payroll.structure.type'].create({
|
|
'name': 'struct',
|
|
'country_id': cls.env.ref('base.be').id,
|
|
})
|
|
cls.default_contract = cls.env['hr.version'].create({
|
|
'name': "Test Default Contract",
|
|
'employee_id': False,
|
|
'wage': 1000,
|
|
'structure_type_id': cls.structure_type.id,
|
|
})
|
|
cls.job = cls.env['hr.job'].create({
|
|
'name': 'Test job',
|
|
})
|
|
|
|
cls.company_id = cls.env['res.company'].create({
|
|
'name': 'My Belgian Company - TEST',
|
|
'country_id': cls.env.ref('base.be').id,
|
|
})
|
|
cls.employee = cls.env['hr.employee'].create({
|
|
'email': '[email protected]',
|
|
'name': 'Test Employee',
|
|
'work_email': '[email protected]',
|
|
'job_id': cls.job.id,
|
|
'company_id': cls.company_id.id,
|
|
})
|
|
cls.employee.user_id.write({
|
|
'password': "employee_password",
|
|
'partner_id': cls.env['res.partner'].create({
|
|
'name': 'Laurie Poiret',
|
|
'street': '58 rue des Wallons',
|
|
'city': 'Louvain-la-Neuve',
|
|
'zip': '1348',
|
|
'country_id': cls.env.ref("base.be").id,
|
|
'phone': '+0032476543210',
|
|
'email': '[email protected]',
|
|
'company_id': cls.company_id.id,
|
|
}).id,
|
|
'company_id': cls.company_id.id,
|
|
'company_ids': [Command.link(cls.company_id.id)],
|
|
})
|
|
|
|
with file_open('hr_contract_salary/static/src/demo/employee_contract.pdf', "rb") as f:
|
|
cls.pdf_content = f.read()
|
|
|
|
attachment = cls.env['ir.attachment'].create({
|
|
'type': 'binary',
|
|
'raw': cls.pdf_content,
|
|
'name': 'test_employee_contract.pdf',
|
|
})
|
|
|
|
cls.template = cls.env['sign.template'].create({})
|
|
cls.document = cls.env['sign.document'].create({
|
|
'template_id': cls.template.id,
|
|
'attachment_id': attachment.id,
|
|
'sign_item_ids': [
|
|
Command.create({
|
|
'type_id': cls.env.ref('sign.sign_item_type_text').id,
|
|
'name': 'employee_id.name',
|
|
'required': True,
|
|
'responsible_id': cls.env.ref('hr_sign.sign_item_role_employee_signatory').id,
|
|
'page': 1,
|
|
'posX': 0.273,
|
|
'posY': 0.158,
|
|
'width': 0.150,
|
|
'height': 0.015,
|
|
}),
|
|
Command.create({
|
|
'type_id': cls.env.ref('sign.sign_item_type_date').id,
|
|
'name': False,
|
|
'required': True,
|
|
'responsible_id': cls.env.ref('hr_sign.sign_item_role_employee_signatory').id,
|
|
'page': 1,
|
|
'posX': 0.707,
|
|
'posY': 0.158,
|
|
'width': 0.150,
|
|
'height': 0.015,
|
|
}),
|
|
Command.create({
|
|
'type_id': cls.env.ref('sign.sign_item_type_text').id,
|
|
'name': 'private_city',
|
|
'required': True,
|
|
'responsible_id': cls.env.ref('hr_sign.sign_item_role_employee_signatory').id,
|
|
'page': 1,
|
|
'posX': 0.506,
|
|
'posY': 0.184,
|
|
'width': 0.150,
|
|
'height': 0.015,
|
|
}),
|
|
Command.create({
|
|
'type_id': cls.env.ref('sign.sign_item_type_text').id,
|
|
'name': 'private_country_id.name',
|
|
'required': True,
|
|
'responsible_id': cls.env.ref('hr_sign.sign_item_role_employee_signatory').id,
|
|
'page': 1,
|
|
'posX': 0.663,
|
|
'posY': 0.184,
|
|
'width': 0.150,
|
|
'height': 0.015,
|
|
}),
|
|
Command.create({
|
|
'type_id': cls.env.ref('sign.sign_item_type_text').id,
|
|
'name': 'private_street',
|
|
'required': True,
|
|
'responsible_id': cls.env.ref('hr_sign.sign_item_role_employee_signatory').id,
|
|
'page': 1,
|
|
'posX': 0.349,
|
|
'posY': 0.184,
|
|
'width': 0.150,
|
|
'height': 0.015,
|
|
}),
|
|
Command.create({
|
|
'type_id': cls.env.ref('sign.sign_item_type_signature').id,
|
|
'name': False,
|
|
'required': True,
|
|
'responsible_id': cls.env.ref('hr_sign.sign_item_role_job_responsible').id,
|
|
'page': 2,
|
|
'posX': 0.333,
|
|
'posY': 0.575,
|
|
'width': 0.200,
|
|
'height': 0.050,
|
|
}),
|
|
Command.create({
|
|
'type_id': cls.env.ref('sign.sign_item_type_signature').id,
|
|
'name': False,
|
|
'required': True,
|
|
'responsible_id': cls.env.ref('hr_sign.sign_item_role_employee_signatory').id,
|
|
'page': 2,
|
|
'posX': 0.333,
|
|
'posY': 0.665,
|
|
'width': 0.200,
|
|
'height': 0.050,
|
|
}),
|
|
Command.create({
|
|
'type_id': cls.env.ref('sign.sign_item_type_date').id,
|
|
'name': False,
|
|
'required': True,
|
|
'responsible_id': cls.env.ref('hr_sign.sign_item_role_employee_signatory').id,
|
|
'page': 2,
|
|
'posX': 0.665,
|
|
'posY': 0.694,
|
|
'width': 0.150,
|
|
'height': 0.015,
|
|
}),
|
|
]
|
|
})
|
|
|
|
cls.default_contract.contract_update_template_id = cls.template
|
|
cls.default_contract.sign_template_id = cls.template
|
|
cls.env.ref('base.user_admin').write({
|
|
'email': '[email protected]'
|
|
})
|
|
|
|
@mute_logger('odoo.http')
|
|
def test_submit_salary_package(self):
|
|
# Create an offer for an applicant
|
|
contract = self.env['hr.version'].create({
|
|
'name': "Test Contract",
|
|
'wage': 1000,
|
|
'structure_type_id': self.structure_type.id,
|
|
'sign_template_id': self.template.id,
|
|
'contract_update_template_id': self.template.id,
|
|
'hr_responsible_id': self.env.ref('base.user_admin').id,
|
|
})
|
|
applicant = self.env["hr.applicant"].create({
|
|
"partner_name": "Test Applicant",
|
|
"email_from": "[email protected]",
|
|
})
|
|
salary_offer = self.env['hr.contract.salary.offer'].create([{
|
|
'contract_template_id': self.default_contract.id,
|
|
'employee_version_id': contract.id,
|
|
'applicant_id': applicant.id,
|
|
'sign_template_id': self.template.id,
|
|
'access_token': '42' * 10,
|
|
# 'employee_id': self.employee.id,
|
|
}])
|
|
|
|
data = {
|
|
"params": {
|
|
"offer_id": salary_offer.id,
|
|
"benefits": {
|
|
'version': {
|
|
'wage': 1000,
|
|
'final_yearly_costs': 1000,
|
|
},
|
|
'version_personal': {
|
|
'private_city': "Louvain-La-Neuve",
|
|
'private_country_id': self.env.ref("base.be").id,
|
|
'private_street': "58 rue des Wallons",
|
|
},
|
|
'employee': {
|
|
'name': 'New Employee',
|
|
'private_email': '[email protected]',
|
|
'employee_job_id': None,
|
|
'department_id': None,
|
|
'job_title': None,
|
|
},
|
|
'address': {},
|
|
'bank_account': {},
|
|
},
|
|
"token": salary_offer.access_token,
|
|
},
|
|
}
|
|
|
|
res = self.url_open("/salary_package/submit", json=data)
|
|
content = json.loads(res.content)
|
|
self.assertIn('result', content)
|
|
|
|
request_id = self.env['sign.request'].browse(content['result']['request_id'])
|
|
version = self.env['hr.version'].browse(content['result']['new_version_id'])
|
|
self.assertTrue(request_id)
|
|
self.assertTrue(version)
|
|
self.assertEqual(version.private_city, "Louvain-La-Neuve")
|
|
self.assertEqual(version.private_country_id.id, self.env.ref("base.be").id)
|
|
self.assertEqual(version.private_street, "58 rue des Wallons")
|
|
|
|
self.assertEqual(
|
|
{
|
|
item_value.sign_item_id.name: item_value.value
|
|
for item_value in request_id.request_item_ids.sign_item_value_ids
|
|
},
|
|
{
|
|
"employee_id.name": "New Employee",
|
|
"private_city": "Louvain-La-Neuve",
|
|
"private_country_id.name": "Belgium",
|
|
"private_street": "58 rue des Wallons",
|
|
},
|
|
)
|
|
|
|
@mute_logger('odoo.http')
|
|
def test_submit_salary_package_employee(self):
|
|
# Create an offer for an employee
|
|
contract = self.employee.version_id
|
|
salary_offer = self.env['hr.contract.salary.offer'].create([{
|
|
'contract_template_id': self.default_contract.id,
|
|
'employee_version_id': contract.id,
|
|
'employee_id': contract.employee_id.id,
|
|
'sign_template_id': self.template.id,
|
|
}])
|
|
self.employee.user_id = self.env['res.users'].create({
|
|
'name': "foo",
|
|
'login': "foo",
|
|
'email': "[email protected]",
|
|
'password': "foopassword",
|
|
})
|
|
|
|
data = {
|
|
"params": {
|
|
"version_id": None,
|
|
"offer_id": salary_offer.id,
|
|
"benefits": {
|
|
'version': {
|
|
'wage': 1000,
|
|
'final_yearly_costs': 1000,
|
|
},
|
|
'version_personal': {
|
|
'private_city': "Louvain-La-Neuve",
|
|
'private_country_id': self.env.ref("base.be").id,
|
|
'private_street': "58 rue des Wallons",
|
|
},
|
|
'employee': {
|
|
'name': 'New Employee',
|
|
'private_email': '[email protected]',
|
|
'employee_job_id': None,
|
|
'department_id': None,
|
|
'job_title': None,
|
|
},
|
|
'address': {},
|
|
'bank_account': {},
|
|
},
|
|
},
|
|
}
|
|
|
|
self.authenticate("foo", "foopassword")
|
|
res = self.url_open("/salary_package/submit", json=data)
|
|
content = json.loads(res.content)
|
|
self.assertIn('result', content)
|
|
|
|
request_id = self.env['sign.request'].browse(content['result']['request_id'])
|
|
contract_id = self.env['hr.version'].browse(content['result']['new_version_id'])
|
|
self.assertTrue(request_id)
|
|
self.assertTrue(contract_id)
|
|
self.assertEqual(contract_id.private_city, "Louvain-La-Neuve")
|
|
self.assertEqual(contract_id.private_country_id.id, self.env.ref("base.be").id)
|
|
self.assertEqual(contract_id.private_street, "58 rue des Wallons")
|
|
|
|
self.assertEqual(
|
|
{
|
|
item_value.sign_item_id.name: item_value.value
|
|
for item_value in request_id.request_item_ids.sign_item_value_ids
|
|
},
|
|
{
|
|
"employee_id.name": "New Employee",
|
|
"private_city": "Louvain-La-Neuve",
|
|
"private_country_id.name": "Belgium",
|
|
"private_street": "58 rue des Wallons",
|
|
},
|
|
)
|
|
|
|
def test_sign_item_access(self):
|
|
hradmin, hruser = self.env['res.users'].create([{
|
|
'name': "foo",
|
|
'login': "foo",
|
|
'email': "[email protected]",
|
|
'group_ids': [Command.set([self.env.ref('hr.group_hr_manager').id])],
|
|
}, {
|
|
'name': "bar",
|
|
'login': "bar",
|
|
'email': "[email protected]",
|
|
'group_ids': [Command.set([
|
|
self.env.ref('sign.group_sign_manager').id,
|
|
self.env.ref('hr.group_hr_user').id,
|
|
])],
|
|
}])
|
|
|
|
HRSignItem = self.env['sign.item'].with_user(hradmin)
|
|
UserSignItem = self.env['sign.item'].with_user(hruser)
|
|
values = {
|
|
'document_id': self.document.id,
|
|
'type_id': self.env.ref('sign.sign_item_type_text').id,
|
|
'required': True,
|
|
'responsible_id': self.env.ref('hr_sign.sign_item_role_employee_signatory').id,
|
|
'page': 1,
|
|
'posX': 0.273,
|
|
'posY': 0.158,
|
|
'width': 0.150,
|
|
'height': 0.015,
|
|
}
|
|
|
|
self.template.user_id = hradmin
|
|
# HR Manager only
|
|
item = HRSignItem.create({'name': 'sign_template_signatories_ids.signatory', **values})
|
|
self.assertEqual(item.name, 'sign_template_signatories_ids.signatory')
|
|
|
|
# Field with a group
|
|
item = HRSignItem.create({'name': 'contracts_count', **values})
|
|
self.assertEqual(item.name, 'contracts_count')
|
|
|
|
self.template.user_id = hruser
|
|
# But regular users don't
|
|
item = UserSignItem.create({'name': 'sign_template_signatories_ids.signatory', **values})
|
|
self.assertEqual(item.name, '')
|
|
|
|
# Accessible fields through an unaccessible model should not work
|
|
item = UserSignItem.create({'name': 'sign_template_signatories_ids.partner_id.name', **values})
|
|
self.assertEqual(item.name, '')
|
|
|
|
# But access to normal fields should work
|
|
item = UserSignItem.create({'name': 'name', **values})
|
|
self.assertEqual(item.name, 'name')
|
|
|
|
# Non-field should remain as-is
|
|
item = UserSignItem.create({'name': 'Signature', **values})
|
|
self.assertEqual(item.name, 'Signature')
|