fix salarise endpont
This commit is contained in:
parent
b5155b64ad
commit
60e3dd3d31
|
|
@ -2,13 +2,15 @@
|
||||||
import logging
|
import logging
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
from odoo import http, _
|
from odoo import http, _ ,SUPERUSER_ID
|
||||||
from odoo.exceptions import UserError, AccessError, ValidationError
|
from odoo.exceptions import UserError, AccessError, ValidationError
|
||||||
from odoo.http import request
|
from odoo.http import request
|
||||||
from ...http_helper import http_helper
|
from ...http_helper import http_helper
|
||||||
from ...validator import validator
|
from ...validator import validator
|
||||||
from datetime import date, datetime
|
from datetime import date, datetime
|
||||||
|
from odoo.addons.web.controllers.main import ReportController
|
||||||
|
from werkzeug import exceptions
|
||||||
|
import json
|
||||||
_logger = logging.getLogger(__name__)
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -329,48 +331,90 @@ class EmployeeOtherRequestController(http.Controller):
|
||||||
Build a dictionary of fields to return for a single record
|
Build a dictionary of fields to return for a single record
|
||||||
(similar to the detailed response in 3.3 Get Request by ID)
|
(similar to the detailed response in 3.3 Get Request by ID)
|
||||||
"""
|
"""
|
||||||
|
dict_type_report_name={
|
||||||
|
'salary_define/detail':'employee_requests.action_report_employee_identification',
|
||||||
|
'salary_define/no_detail':'employee_requests.action_report_employee_identify_2',
|
||||||
|
'salary_define/no_salary':'employee_requests.action_report_employee_identify_3',
|
||||||
|
'salary_fixing':'employee_requests.salary_conf_report_act',
|
||||||
|
}
|
||||||
|
define_key = f'{req.request_type}/{req.print_type}' if req.request_type=='salary_define' else req.request_type
|
||||||
res = {
|
res = {
|
||||||
"id": req.id,
|
"id": req.id,
|
||||||
"from_hr": req.from_hr,
|
"from_hr": req.from_hr,
|
||||||
"date": req.date,
|
"date": req.date,
|
||||||
"comment": req.comment or "",
|
"comment": req.comment or "",
|
||||||
"state": req.state,
|
'request_type': req.request_type,
|
||||||
|
'request_type_lable': self.get_lable_selection(req, 'request_type', req.request_type),
|
||||||
|
'state': req.state,
|
||||||
'state_name': self.get_lable_selection(req, 'state', req.state),
|
'state_name': self.get_lable_selection(req, 'state', req.state),
|
||||||
"request_type": req.request_type,
|
|
||||||
"employee_id": req.employee_id.id if req.employee_id else None,
|
"employee_id": req.employee_id.id if req.employee_id else None,
|
||||||
|
"employee_name": req.employee_id.name if req.employee_id else None,
|
||||||
"employee_dependant": [],
|
"employee_dependant": [],
|
||||||
"qualification_employee": [],
|
"qualification_employee": [],
|
||||||
"certification_employee": [],
|
"certification_employee": [],
|
||||||
"create_insurance_request": req.create_insurance_request,
|
"create_insurance_request": req.create_insurance_request,
|
||||||
"print_type": req.print_type,
|
"print_type": req.print_type,
|
||||||
|
"print_type_name": self.get_lable_selection(req, 'print_type', req.print_type),
|
||||||
"destination": req.destination.id if req.destination else None,
|
"destination": req.destination.id if req.destination else None,
|
||||||
|
'destination_name': req.destination.name if req.destination else None,
|
||||||
"parent_request_id": req.parent_request_id.id if req.parent_request_id else None,
|
"parent_request_id": req.parent_request_id.id if req.parent_request_id else None,
|
||||||
"company_id": req.company_id.id if req.company_id else None,
|
"company_id": req.company_id.id if req.company_id else None,
|
||||||
|
"company_name": req.company_id.name if req.company_id else None,
|
||||||
|
"report_url": f'/rest_api/v2/public_report/pdf/{dict_type_report_name.get(define_key,"No Report")}/{req.id}'
|
||||||
}
|
}
|
||||||
res = convert_dates_in_data(res)
|
res = convert_dates_in_data(res)
|
||||||
|
|
||||||
# Build One2many lines for employee_dependant
|
|
||||||
for dep in req.employee_dependant:
|
for dep in req.employee_dependant:
|
||||||
res["employee_dependant"].append({
|
res["employee_dependant"].append({
|
||||||
"name": dep.name,
|
'name': dep.name or '',
|
||||||
"relation": dep.relation,
|
'age': dep.age or '',
|
||||||
"date_of_birth": dep.date_of_birth,
|
'birthday': str(dep.birthday or ''),
|
||||||
|
'gender': dep.gender or '',
|
||||||
|
'gender_lable': self.get_lable_selection(dep, 'gender', dep.gender),
|
||||||
|
'relation': dep.relation or '',
|
||||||
|
'relation_lable': self.get_lable_selection(dep, 'relation', dep.relation),
|
||||||
|
'nationality': dep.nationality.read(['id', 'name'])[0] or {},
|
||||||
|
'passport_no': dep.passport_no or '',
|
||||||
|
'passport_issue_date': str(dep.passport_issue_date or ''),
|
||||||
|
'passport_expire_date': str(dep.passport_expire_date or ''),
|
||||||
|
'degree_medical_insu': dep.degree_medical_insu or '',
|
||||||
|
'medical_insurance_num': dep.medical_insurance_num or '',
|
||||||
|
'identity_num': dep.identity_num or '',
|
||||||
|
'has_ticket': dep.has_ticket,
|
||||||
})
|
})
|
||||||
|
|
||||||
# Build One2many lines for qualification_employee
|
for qua in req.qualification_employee:
|
||||||
for q in req.qualification_employee:
|
|
||||||
res["qualification_employee"].append({
|
res["qualification_employee"].append({
|
||||||
"qualification_name": q.qualification_name,
|
'uni_name_UniversityName': qua.uni_name.read(['id', 'name'])[0] or {},
|
||||||
"date_obtained": q.date_obtained,
|
'col_name_CollegeName': qua.col_name.read(['id', 'name'])[0] or {},
|
||||||
"institute": q.institute,
|
'prg_status': qua.prg_status or '',
|
||||||
|
'comp_date': str(qua.comp_date or ''),
|
||||||
|
'end_date': str(qua.end_date or ''),
|
||||||
|
'degree': qua.degree or 0.0,
|
||||||
|
'contact_name': qua.contact_name or '',
|
||||||
|
'contact_phn': qua.contact_phn or '',
|
||||||
|
'contact_email': qua.contact_email or '',
|
||||||
|
'country_name': qua.country_name.read(['id', 'name'])[0] or {},
|
||||||
|
'qualification_degree': qua.qualification_degree or '',
|
||||||
|
'qualification_degree_lable': self.get_lable_selection(qua, 'qualification_degree',
|
||||||
|
qua.qualification_degree),
|
||||||
|
'qualification_specification_id': qua.qualification_specification_id.read(['id', 'name'])[
|
||||||
|
0] or {},
|
||||||
|
'qualification_id': qua.qualification_id.read(['id', 'name'])[0] or {},
|
||||||
})
|
})
|
||||||
res["qualification_employee"] = convert_dates_in_data(res["qualification_employee"])
|
res["qualification_employee"] = convert_dates_in_data(res["qualification_employee"])
|
||||||
# Build One2many lines for certification_employee
|
for cer in req.certification_employee:
|
||||||
for c in req.certification_employee:
|
|
||||||
res["certification_employee"].append({
|
res["certification_employee"].append({
|
||||||
"certification_name": c.certification_name,
|
'id': cer.id,
|
||||||
"date_obtained": c.date_obtained,
|
'cer_name': cer.car_name or '',
|
||||||
"organization": c.organization,
|
'certification_specification': cer.certification_specification_id.name or '',
|
||||||
|
'issue_org': cer.issue_org or '',
|
||||||
|
'certification_degree': cer.certification_degree or '',
|
||||||
|
'certification_degree_lable': self.get_lable_selection(cer, 'certification_degree',
|
||||||
|
cer.certification_degree),
|
||||||
|
'issue_date': str(cer.issue_date or ''),
|
||||||
|
'exp_date': str(cer.exp_date or ''),
|
||||||
|
'country_id': cer.country_name.read(['id', 'name'])[0] or {},
|
||||||
})
|
})
|
||||||
res["certification_employee"] = convert_dates_in_data(res["certification_employee"])
|
res["certification_employee"] = convert_dates_in_data(res["certification_employee"])
|
||||||
|
|
||||||
|
|
@ -389,15 +433,16 @@ class EmployeeOtherRequestController(http.Controller):
|
||||||
if not result['status']:
|
if not result['status']:
|
||||||
return http_helper.errcode(code=result['code'], message=result['message'])
|
return http_helper.errcode(code=result['code'], message=result['message'])
|
||||||
user = validator.verify(token)
|
user = validator.verify(token)
|
||||||
|
|
||||||
if not user:
|
if not user:
|
||||||
return http_helper.response(
|
return http_helper.response(
|
||||||
code=400,
|
code=400,
|
||||||
message=_("Authentication failed or user is not allowed."),
|
message=_("Authentication failed or user is not allowed."),
|
||||||
success=False
|
success=False
|
||||||
)
|
)
|
||||||
|
employee = request.env['hr.employee'].sudo().search([('user_id', '=', user.id)], limit=1)
|
||||||
# 2) Validate/Parse Body
|
# 2) Validate/Parse Body
|
||||||
required_fields = ["date", "request_type", "employee_id", "company_id"]
|
required_fields = ["date", "request_type"]
|
||||||
missing = [f for f in required_fields if f not in body]
|
missing = [f for f in required_fields if f not in body]
|
||||||
if missing:
|
if missing:
|
||||||
return http_helper.response(
|
return http_helper.response(
|
||||||
|
|
@ -413,8 +458,8 @@ class EmployeeOtherRequestController(http.Controller):
|
||||||
"from_hr": body.get("from_hr", False),
|
"from_hr": body.get("from_hr", False),
|
||||||
"date": body["date"],
|
"date": body["date"],
|
||||||
"comment": body.get("comment") or "",
|
"comment": body.get("comment") or "",
|
||||||
"request_type": body["request_type"],
|
"request_type": body.get('request_type'),
|
||||||
"employee_id": body["employee_id"],
|
"employee_id": employee.id,
|
||||||
"employee_dependant": self._prepare_employee_dependant_lines(body.get("employee_dependant", [])),
|
"employee_dependant": self._prepare_employee_dependant_lines(body.get("employee_dependant", [])),
|
||||||
"qualification_employee": self._prepare_qualification_employee_lines(
|
"qualification_employee": self._prepare_qualification_employee_lines(
|
||||||
body.get("qualification_employee", [])),
|
body.get("qualification_employee", [])),
|
||||||
|
|
@ -422,9 +467,9 @@ class EmployeeOtherRequestController(http.Controller):
|
||||||
body.get("certification_employee", [])),
|
body.get("certification_employee", [])),
|
||||||
"create_insurance_request": body.get("create_insurance_request", False),
|
"create_insurance_request": body.get("create_insurance_request", False),
|
||||||
"print_type": body.get("print_type", ""),
|
"print_type": body.get("print_type", ""),
|
||||||
"destination": body.get("destination") or False,
|
"destination": int(body.get("destination")) if body.get("destination") else False,
|
||||||
"parent_request_id": body.get("parent_request_id") or False,
|
"parent_request_id": int(body.get("parent_request_id")) if body.get("parent_request_id") else False,
|
||||||
"company_id": body["company_id"],
|
"company_id": 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
# Create record
|
# Create record
|
||||||
|
|
@ -470,11 +515,13 @@ class EmployeeOtherRequestController(http.Controller):
|
||||||
try:
|
try:
|
||||||
# 2) Parse Query params
|
# 2) Parse Query params
|
||||||
page = int(kw.get("page", 1))
|
page = int(kw.get("page", 1))
|
||||||
limit = int(kw.get("limit", 10))
|
|
||||||
sort = kw.get("sort", "") # e.g. 'date' or '-state'
|
sort = kw.get("sort", "") # e.g. 'date' or '-state'
|
||||||
|
approvel = kw.get("approvel", 0)
|
||||||
filters_str = kw.get("filters", "") # e.g. 'state=approved'
|
filters_str = kw.get("filters", "") # e.g. 'state=approved'
|
||||||
|
page, offset, limit, prev = validator.get_page_pagination(page)
|
||||||
domain = []
|
domain = []
|
||||||
|
if approvel:
|
||||||
|
domain.append(('state', '!=', 'draft'))
|
||||||
if filters_str:
|
if filters_str:
|
||||||
# Very naive filter parser: "state=approved;request_type=insurance"
|
# Very naive filter parser: "state=approved;request_type=insurance"
|
||||||
for part in filters_str.split(";"):
|
for part in filters_str.split(";"):
|
||||||
|
|
@ -487,7 +534,7 @@ class EmployeeOtherRequestController(http.Controller):
|
||||||
domain.append(('request_type', 'in', ['salary_define', 'salary_fixing']))
|
domain.append(('request_type', 'in', ['salary_define', 'salary_fixing']))
|
||||||
|
|
||||||
offset = (page - 1) * limit if page > 0 else 0
|
offset = (page - 1) * limit if page > 0 else 0
|
||||||
order = False
|
order = "create_date desc"
|
||||||
if sort:
|
if sort:
|
||||||
if sort.startswith("-"):
|
if sort.startswith("-"):
|
||||||
order = sort[1:] + " desc"
|
order = sort[1:] + " desc"
|
||||||
|
|
@ -495,23 +542,32 @@ class EmployeeOtherRequestController(http.Controller):
|
||||||
order = sort + " asc"
|
order = sort + " asc"
|
||||||
|
|
||||||
RequestObj = request.env["employee.other.request"].with_user(user.id)
|
RequestObj = request.env["employee.other.request"].with_user(user.id)
|
||||||
total_count = RequestObj.search_count(domain)
|
|
||||||
records = RequestObj.search(domain, offset=offset, limit=limit, order=order)
|
records = RequestObj.search(domain, offset=offset, limit=limit, order=order)
|
||||||
|
all_records = RequestObj.search_count(domain)
|
||||||
# Build minimal list
|
# Build minimal list
|
||||||
request_list = []
|
request_list = []
|
||||||
for r in records:
|
for r in records:
|
||||||
request_list.append(self._get_request_return_data(r))
|
request_list.append(self._get_request_return_data(r))
|
||||||
|
|
||||||
request_list = convert_dates_in_data(request_list)
|
request_list = convert_dates_in_data(request_list)
|
||||||
result_data = {
|
|
||||||
"page": page,
|
next_page = validator.get_page_pagination_next(page, all_records)
|
||||||
"limit": limit,
|
next_url = "/rest_api/v2/employee_other_request?approvel=%s&page=%s" % (
|
||||||
"total_records": total_count,
|
approvel, next_page) if next_page else False
|
||||||
"requests": request_list,
|
prev_url = "/rest_api/v2/employee_other_request?approvel=%s&page=%s" % (approvel, prev) if prev else False
|
||||||
|
data = {
|
||||||
|
'links': {
|
||||||
|
'prev': prev_url,
|
||||||
|
'next': next_url,
|
||||||
|
},
|
||||||
|
'count': limit,
|
||||||
|
'results': {
|
||||||
|
'employeeRequests': request_list,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return http_helper.response(
|
return http_helper.response(
|
||||||
message=_("Requests retrieved successfully"),
|
message=_("Requests retrieved successfully"),
|
||||||
data=result_data
|
data=data
|
||||||
)
|
)
|
||||||
|
|
||||||
except (UserError, AccessError, ValidationError) as e:
|
except (UserError, AccessError, ValidationError) as e:
|
||||||
|
|
@ -611,7 +667,7 @@ class EmployeeOtherRequestController(http.Controller):
|
||||||
vals = {}
|
vals = {}
|
||||||
for field_name in updatable_fields:
|
for field_name in updatable_fields:
|
||||||
if field_name in body:
|
if field_name in body:
|
||||||
vals[field_name] = body[field_name]
|
vals[field_name] = int(body[field_name]) if field_name in ["destination", "parent_request_id", "company_id"] else body[field_name]
|
||||||
|
|
||||||
# Handle One2many lines if needed
|
# Handle One2many lines if needed
|
||||||
if "employee_dependant" in body:
|
if "employee_dependant" in body:
|
||||||
|
|
@ -797,6 +853,8 @@ class EmployeeOtherRequestRelatedModelsController(http.Controller):
|
||||||
"prg_status": q.prg_status or "",
|
"prg_status": q.prg_status or "",
|
||||||
"comp_date": q.comp_date or "",
|
"comp_date": q.comp_date or "",
|
||||||
"qualification_degree": q.qualification_degree or "",
|
"qualification_degree": q.qualification_degree or "",
|
||||||
|
'qualification_degree_lable': self.get_lable_selection(q, 'qualification_degree',
|
||||||
|
q.qualification_degree),
|
||||||
"country_name": q.country_name.id if q.country_name else None,
|
"country_name": q.country_name.id if q.country_name else None,
|
||||||
"attachment": None,
|
"attachment": None,
|
||||||
})
|
})
|
||||||
|
|
@ -847,20 +905,23 @@ class EmployeeOtherRequestRelatedModelsController(http.Controller):
|
||||||
records = DependentModel.search(domain, offset=offset, limit=limit)
|
records = DependentModel.search(domain, offset=offset, limit=limit)
|
||||||
|
|
||||||
dep_list = []
|
dep_list = []
|
||||||
for d in records:
|
for dep in records:
|
||||||
dep_list.append({
|
dep_list.append({
|
||||||
"id": d.id,
|
'name': dep.name or '',
|
||||||
"name": d.name,
|
'age': dep.age or '',
|
||||||
"birthday": d.birthday,
|
'birthday': str(dep.birthday or ''),
|
||||||
"age": d.age,
|
'gender': dep.gender or '',
|
||||||
"gender": d.gender,
|
'gender_lable': self.get_lable_selection(dep, 'gender', dep.gender),
|
||||||
"relation": d.relation,
|
'relation': dep.relation or '',
|
||||||
"nationality": d.nationality.name if d.nationality else "",
|
'relation_lable': self.get_lable_selection(dep, 'relation', dep.relation),
|
||||||
"passport_no": d.passport_no,
|
'nationality': dep.nationality.read(['id', 'name'])[0] or {},
|
||||||
"passport_issue_date": d.passport_issue_date,
|
'passport_no': dep.passport_no or '',
|
||||||
"passport_expire_date": d.passport_expire_date,
|
'passport_issue_date': str(dep.passport_issue_date or ''),
|
||||||
"remarks": d.remarks,
|
'passport_expire_date': str(dep.passport_expire_date or ''),
|
||||||
"has_ticket": d.has_ticket,
|
'degree_medical_insu': dep.degree_medical_insu or '',
|
||||||
|
'medical_insurance_num': dep.medical_insurance_num or '',
|
||||||
|
'identity_num': dep.identity_num or '',
|
||||||
|
'has_ticket': dep.has_ticket,
|
||||||
})
|
})
|
||||||
|
|
||||||
data = {
|
data = {
|
||||||
|
|
@ -936,4 +997,53 @@ class EmployeeOtherRequestRelatedModelsController(http.Controller):
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
_logger.exception("Error listing certifications")
|
_logger.exception("Error listing certifications")
|
||||||
return http_helper.response(code=400, message=str(e), success=False)
|
return http_helper.response(code=400, message=str(e), success=False)
|
||||||
|
class ReportControllerInherit(ReportController):
|
||||||
|
|
||||||
|
@http.route([
|
||||||
|
'/rest_api/v2/public_report/pdf/<reportname>/<docids>',
|
||||||
|
], type="http", auth="none", methods=["GET"])
|
||||||
|
def public_report_routes(self, reportname, docids=None, converter="pdf", **data):
|
||||||
|
if not converter:
|
||||||
|
converter = 'pdf'
|
||||||
|
http_method, body, headers, token = http_helper.parse_request()
|
||||||
|
# If needed, check token:
|
||||||
|
result = validator.verify_token(token)
|
||||||
|
if not result['status']:
|
||||||
|
return http_helper.errcode(code=result['code'], message=result['message'])
|
||||||
|
|
||||||
|
user = validator.verify(token)
|
||||||
|
if not user:
|
||||||
|
return http_helper.response(code=400, message=_(
|
||||||
|
"You are not allowed to perform this operation. please check with one of your team admins"),
|
||||||
|
success=False)
|
||||||
|
|
||||||
|
env = request.env(user=user.id)
|
||||||
|
|
||||||
|
report = env['ir.actions.report']._get_report_from_name(reportname) or env.ref(reportname)
|
||||||
|
context = dict(request.env.context)
|
||||||
|
|
||||||
|
if docids:
|
||||||
|
docids = [int(i) for i in docids.split(',')]
|
||||||
|
if data.get('options'):
|
||||||
|
data.update(json.loads(data.pop('options')))
|
||||||
|
if data.get('context'):
|
||||||
|
# Ignore 'lang' here, because the context in data is the one from the webclient *but* if
|
||||||
|
# the user explicitely wants to change the lang, this mechanism overwrites it.
|
||||||
|
data['context'] = json.loads(data['context'])
|
||||||
|
if data['context'].get('lang') and not data.get('force_context_lang'):
|
||||||
|
del data['context']['lang']
|
||||||
|
context.update(data['context'])
|
||||||
|
if converter == 'html':
|
||||||
|
html = report.with_context(context)._render_qweb_html(docids, data=data)[0]
|
||||||
|
return request.make_response(html)
|
||||||
|
elif converter == 'pdf':
|
||||||
|
pdf = report.with_context(context)._render_qweb_pdf(docids, data=data)[0]
|
||||||
|
pdfhttpheaders = [('Content-Type', 'application/pdf'), ('Content-Length', len(pdf))]
|
||||||
|
return request.make_response(pdf, headers=pdfhttpheaders)
|
||||||
|
elif converter == 'text':
|
||||||
|
text = report.with_context(context)._render_qweb_text(docids, data=data)[0]
|
||||||
|
texthttpheaders = [('Content-Type', 'text/plain'), ('Content-Length', len(text))]
|
||||||
|
return request.make_response(text, headers=texthttpheaders)
|
||||||
|
else:
|
||||||
|
raise exceptions.HTTPException(description='Converter %s not implemented.' % converter)
|
||||||
Loading…
Reference in New Issue