diff --git a/odex30_base/base_custom/__init__.py b/odex30_base/base_custom/__init__.py new file mode 100644 index 0000000..308d1f6 --- /dev/null +++ b/odex30_base/base_custom/__init__.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# LCT, Life Connection Technology +# Copyright (C) 2019-2020 LCT +# +############################################################################## +from . import models + + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/odex30_base/base_custom/__manifest__.py b/odex30_base/base_custom/__manifest__.py new file mode 100644 index 0000000..2214219 --- /dev/null +++ b/odex30_base/base_custom/__manifest__.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# LCT, Life Connection Technology +# Copyright (C) 2011-2012 LCT +# +############################################################################## + +{ + 'name' : 'Base Custom', + 'category': 'HR-Odex', + 'version': '18.0.1.0.0', + 'author': 'Expert Co. Ltd.' , + 'website': 'http://exp-sa.com', + 'summary': 'Solving defulat groups for newly created users', + 'description' : """Add the following features: 1-Prevent granting defulat groups for newly created users """, + 'depends' : ['base','hr','hr_contract'], + 'data': [ ], + "assets": { + "web.assets_backend": [ + # Google Fonts (Montserrat) + '/base_custom/static/src/css/website_rtl.css' + ], + }, + 'auto_install': True, + 'installable': True, + 'application': True, + +} +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/odex30_base/base_custom/models/__init__.py b/odex30_base/base_custom/models/__init__.py new file mode 100644 index 0000000..62cbdfa --- /dev/null +++ b/odex30_base/base_custom/models/__init__.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*-# -*- coding: utf-8 -*- +############################################################################## +# +# LCT, Life Connection Technology +# Copyright (C) 2011-2012 LCT +# +############################################################################## + +from . import res_users +from . import hr_employee diff --git a/odex30_base/base_custom/models/hr_employee.py b/odex30_base/base_custom/models/hr_employee.py new file mode 100644 index 0000000..254bbef --- /dev/null +++ b/odex30_base/base_custom/models/hr_employee.py @@ -0,0 +1,47 @@ +from odoo import api, fields, models, _ + + +class HrEmployee(models.Model): + _inherit = 'hr.employee' + + contract_id = fields.Many2one('hr.contract', string='Current Contract', + groups="base.group_user", + domain="[('company_id', '=', company_id)]", + help='Current contract of the employee') + + + barcode = fields.Char(string="Badge ID", help="ID used for employee identification.", groups="base.group_user", + copy=False) + birthday = fields.Date('Date of Birth', groups="base.group_user", tracking=True) + address_home_id = fields.Many2one( + 'res.partner', 'Address', + help='Enter here the private address of the employee, not the one linked to your company.', + groups="base.group_user", tracking=True, + domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]") + + certificate = fields.Selection([ + ('graduate', 'Graduate'), + ('bachelor', 'Bachelor'), + ('master', 'Master'), + ('doctor', 'Doctor'), + ('other', 'Other'), + ], 'Certificate Level', default='other', groups="base.group_user", tracking=True) + children = fields.Integer(string='Number of Children', groups="base.group_user", tracking=True) + country_of_birth = fields.Many2one('res.country', string="Country of Birth", groups="base.group_user", + tracking=True) + emergency_contact = fields.Char("Emergency Contact", groups="base.group_user", tracking=True) + emergency_phone = fields.Char("Emergency Phone", groups="base.group_user", tracking=True) + phone = fields.Char(related='address_home_id.phone', related_sudo=False, readonly=False, string="Private Phone", + groups="base.group_user") + identification_id = fields.Char(string='Identification No', groups="base.group_user", tracking=True) + km_home_work = fields.Integer(string="Home-Work Distance", groups="base.group_user", tracking=True) + permit_no = fields.Char('Work Permit No', groups="base.group_user", tracking=True) + pin = fields.Char(string="PIN", groups="base.group_user", copy=False, + help="PIN used to Check In/Out in Kiosk Mode (if enabled in Configuration).") + place_of_birth = fields.Char('Place of Birth', groups="base.group_user", tracking=True) + spouse_birthdate = fields.Date(string="Spouse Birthdate", groups="base.group_user", tracking=True) + spouse_complete_name = fields.Char(string="Spouse Complete Name", groups="base.group_user", tracking=True) + study_field = fields.Char("Field of Study", groups="base.group_user", tracking=True) + study_school = fields.Char("School", groups="base.group_user", tracking=True) + visa_expire = fields.Date('Visa Expire Date', groups="base.group_user", tracking=True) + visa_no = fields.Char('Visa No', groups="base.group_user", tracking=True) diff --git a/odex30_base/base_custom/models/res_users.py b/odex30_base/base_custom/models/res_users.py new file mode 100644 index 0000000..76e5759 --- /dev/null +++ b/odex30_base/base_custom/models/res_users.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# LCT, Life Connection Technology +# Copyright (C) 2011-2012 LCT +# +############################################################################## + +from odoo import api, fields, models, _ + +class ResUsers(models.Model): + _inherit = 'res.users' + + def _default_groups_custom(self): + """ + pervents newly created user from holding all managers groups. + """ + default_user = self.env.ref('base.group_user', raise_if_not_found=False) + return default_user + + groups_id = fields.Many2many('res.groups', 'res_groups_users_rel', 'uid', 'gid', string='Groups', default =_default_groups_custom) diff --git a/odex30_base/base_custom/static/description/icon.png b/odex30_base/base_custom/static/description/icon.png new file mode 100644 index 0000000..4141f52 Binary files /dev/null and b/odex30_base/base_custom/static/description/icon.png differ diff --git a/odex30_base/base_custom/static/src/css/website_rtl.css b/odex30_base/base_custom/static/src/css/website_rtl.css new file mode 100644 index 0000000..429b820 --- /dev/null +++ b/odex30_base/base_custom/static/src/css/website_rtl.css @@ -0,0 +1,25 @@ +@media (min-width: 768px){ + .rtl .navbar-right{ + float: left !important; + } + .rtl .navbar-right .dropdown .dropdown-menu{ + right: auto !important; + left: 0 !important; + } + .rtl .navbar-left{ + float: right !important; + } + .rtl .navbar-left .dropdown .dropdown-menu{ + left: auto !important; + right: 0 !important; + } + .navbar-nav.navbar-right:last-child{ + margin-left: auto; + } + .rtl .pull-left{ + float: right !important; + } +} + + + diff --git a/odex30_base/hr_docs_expiry/__init__.py b/odex30_base/hr_docs_expiry/__init__.py new file mode 100644 index 0000000..0650744 --- /dev/null +++ b/odex30_base/hr_docs_expiry/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/odex30_base/hr_docs_expiry/__manifest__.py b/odex30_base/hr_docs_expiry/__manifest__.py new file mode 100644 index 0000000..9c84733 --- /dev/null +++ b/odex30_base/hr_docs_expiry/__manifest__.py @@ -0,0 +1,17 @@ +{ + "name": "Employee Documents", + "summary": """Manages Employee Documents With Expiry Notifications.""", + "description": """Manages Employee Related Documents with Expiry Notifications.""", + "category": "Odex25-HR/Odex25-HR", + "author": "Expert Co. Ltd.", + "website": "http://exp-sa.com", + "depends": ["base", "hr"], + "data": [ + "security/ir.model.access.csv", + "data/data.xml", + "data/ir_cron.xml", + "data/mail_template.xml", + "views/employee_check_list_view.xml", + "views/employee_document_view.xml", + ], +} diff --git a/odex30_base/hr_docs_expiry/data/data.xml b/odex30_base/hr_docs_expiry/data/data.xml new file mode 100644 index 0000000..ef0581a --- /dev/null +++ b/odex30_base/hr_docs_expiry/data/data.xml @@ -0,0 +1,23 @@ + + + + Education Certificate + entry + + + Salary Certificate + entry + + + Experience Certificate + entry + + + Experience Certificate + exit + + + Salary Certificate + exit + + \ No newline at end of file diff --git a/odex30_base/hr_docs_expiry/data/ir_cron.xml b/odex30_base/hr_docs_expiry/data/ir_cron.xml new file mode 100644 index 0000000..67c4311 --- /dev/null +++ b/odex30_base/hr_docs_expiry/data/ir_cron.xml @@ -0,0 +1,13 @@ + + + + Employee Data Expiration + + code + model.mail_reminder() + 1 + days + + + + \ No newline at end of file diff --git a/odex30_base/hr_docs_expiry/data/mail_template.xml b/odex30_base/hr_docs_expiry/data/mail_template.xml new file mode 100644 index 0000000..f1034e0 --- /dev/null +++ b/odex30_base/hr_docs_expiry/data/mail_template.xml @@ -0,0 +1,42 @@ + + + + + Document Expiry Reminder + Document- {{ object.name }} Expired On {{ object.expiry_date }} + {{ object.employee_ref.work_email }} + {{ (user.company_id.hr_email.email or '') }} + + + +
+

Dear {{ object.employee_ref.name }},

+
+

Your Document {{ object.name }} is going to expire on {{ object.expiry_date + }}. + Please renew it before expiry date.

+
+

Best regards,

+
+
+
+ + + Employee Dependant Age Check + Your Child {{ object.name }} has turned 18 + {{ object.employee_ref.work_email }} + {{ (user.company_id.hr_email.email or '') }} + + + +
+

Dear {{ object.employee_ref.name }},

+
+

Greetings, your dependant {{ object.name }} has turned 18.

+
+

Best regards,

+
+
+
+
+
\ No newline at end of file diff --git a/odex30_base/hr_docs_expiry/i18n/ar_001.po b/odex30_base/hr_docs_expiry/i18n/ar_001.po new file mode 100644 index 0000000..b9d7964 --- /dev/null +++ b/odex30_base/hr_docs_expiry/i18n/ar_001.po @@ -0,0 +1,511 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_docs_expiry +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-13 06:24+0000\n" +"PO-Revision-Date: 2022-09-13 06:24+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: hr_docs_expiry +#: model:mail.template,body_html:hr_docs_expiry.email_template_child_age_check +msgid "" +"\n" +" \n" +"

Dear ${object.employee_ref.name},

\n" +"
\n" +"

Greetings, your dependant ${object.name} has turned 18.\n" +"
\n" +"

Best regards,

\n" +"
\n" +" \n" +" " +msgstr "" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee__document_count +msgid "# Documents" +msgstr "# المستندات" + +#. module: hr_docs_expiry +#: code:addons/hr_docs_expiry/models/employee_documents.py:0 +#, python-format +msgid "" +"

\n" +" Click to Create for New Documents\n" +"

" +msgstr "" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_employee_checklist__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: hr_docs_expiry +#: model:ir.model,name:hr_docs_expiry.model_ir_attachment +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__doc_attachment_id +#: model:ir.model.fields,field_description:hr_docs_expiry.field_ir_attachment__doc_attach_rel +msgid "Attachment" +msgstr "مرفق" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_employee_checklist__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: hr_docs_expiry +#: model_terms:ir.ui.view,arch_db:hr_docs_expiry.employee_check_list_form_view +msgid "Checklist" +msgstr "" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_employee_checklist__document_type +msgid "Checklist Type" +msgstr "" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_employee_checklist__create_uid +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__create_uid +msgid "Created by" +msgstr "" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_employee_checklist__create_date +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__create_date +msgid "Created on" +msgstr "" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__description +#: model_terms:ir.ui.view,arch_db:hr_docs_expiry.employee_document_form_view +msgid "Description" +msgstr "الوصف" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_employee_checklist__display_name +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee__display_name +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__display_name +#: model:ir.model.fields,field_description:hr_docs_expiry.field_ir_attachment__display_name +#: model:ir.model.fields,field_description:hr_docs_expiry.field_res_users__display_name +msgid "Display Name" +msgstr "الاسم المعروض" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__document_name +msgid "Document" +msgstr "مستند" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_employee_checklist__name +msgid "Document Name" +msgstr "اسم المستند" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__name +#: model_terms:ir.ui.view,arch_db:hr_docs_expiry.employee_document_form_view +msgid "Document Name" +msgstr "اسم المستند" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__document_type +#: model_terms:ir.ui.view,arch_db:hr_docs_expiry.employee_document_form_view +msgid "Document Type" +msgstr "نوع المستند" + +#. module: hr_docs_expiry +#: code:addons/hr_docs_expiry/models/employee_documents.py:0 +#, python-format +msgid "Documents" +msgstr "المستندات" + +#. module: hr_docs_expiry +#: model:ir.model,name:hr_docs_expiry.model_hr_employee +msgid "Employee" +msgstr "الموظف" + +#. module: hr_docs_expiry +#: model:ir.actions.server,name:hr_docs_expiry.employee_docs_data_reminder_ir_actions_server +#: model:ir.cron,cron_name:hr_docs_expiry.employee_docs_data_reminder +#: model:ir.cron,name:hr_docs_expiry.employee_docs_data_reminder +msgid "Employee Data Expiration" +msgstr "" + +#. module: hr_docs_expiry +#: model:ir.model,name:hr_docs_expiry.model_employee_checklist +#: model:ir.ui.menu,name:hr_docs_expiry.Employee_document_menu_item +msgid "Employee Documents" +msgstr "مستندات الموظف" + + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__employee_ref +#: model_terms:ir.ui.view,arch_db:hr_docs_expiry.employee_document_form_view +msgid "Employee Name" +msgstr "إسم الموظف" + +#. module: hr_docs_expiry +#: model:ir.actions.act_window,name:hr_docs_expiry.employee_document_list_action +msgid "Employee document" +msgstr "مستندات الموظف" + +#. module: hr_docs_expiry +#: model:ir.model.fields.selection,name:hr_docs_expiry.selection__employee_checklist__document_type__entry +msgid "Entry Process" +msgstr "مستند دخول" + +#. module: hr_docs_expiry +#: model:ir.model.fields.selection,name:hr_docs_expiry.selection__employee_checklist__document_type__exit +msgid "Exit Process" +msgstr "مستند خروج" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee__expiry_license +msgid "License Expiry Date" +msgstr " تاريخ انتهاء الرخصة" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__file_examination +msgid "File Examination" +msgstr "ملف كشف طبي" + +#. module: hr_docs_expiry +#: model_terms:ir.ui.view,arch_db:hr_docs_expiry.employee_document_form_view +msgid "File Examination Name" +msgstr "رقم الكشف/الإفصاح الطبي" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_employee_checklist__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_employee_checklist__message_channel_ids +msgid "Followers (Channels)" +msgstr "" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_employee_checklist__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: hr_docs_expiry +#: model:ir.actions.server,name:hr_docs_expiry.employee_data_reminder_ir_actions_server +#: model:ir.cron,cron_name:hr_docs_expiry.employee_data_reminder +#: model:ir.cron,name:hr_docs_expiry.employee_data_reminder +msgid "HR Employee Data Expiration" +msgstr "" + +#. module: hr_docs_expiry +#: model:ir.model,name:hr_docs_expiry.model_hr_employee_document +msgid "HR Employee Documents" +msgstr "مستندات الموظف" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_employee_checklist__id +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee__id +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__id +#: model:ir.model.fields,field_description:hr_docs_expiry.field_ir_attachment__id +#: model:ir.model.fields,field_description:hr_docs_expiry.field_res_users__id +msgid "ID" +msgstr "المُعرف" + +#. module: hr_docs_expiry +#: model:ir.model.fields,help:hr_docs_expiry.field_employee_checklist__message_needaction +#: model:ir.model.fields,help:hr_docs_expiry.field_employee_checklist__message_unread +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: hr_docs_expiry +#: model:ir.model.fields,help:hr_docs_expiry.field_employee_checklist__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: hr_docs_expiry +#: code:addons/hr_docs_expiry/models/employee_documents.py:0 +#: model:ir.model.fields.selection,name:hr_docs_expiry.selection__hr_employee_document__document_type__iqama +#, python-format +msgid "Identity" +msgstr "الهوية" + +#. module: hr_docs_expiry +#: code:addons/hr_docs_expiry/models/employee_documents.py:0 +#: model:ir.model.fields.selection,name:hr_docs_expiry.selection__hr_employee_document__document_type__professional_certificates +#, python-format +msgid "Professional Certificates" +msgstr "شهادات مهنية" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__iqama_id +#: model_terms:ir.ui.view,arch_db:hr_docs_expiry.employee_document_form_view +msgid "Identity No" +msgstr "رقم الهوية" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_employee_checklist__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__issue_date +msgid "Issue Date" +msgstr "تاريخ الاصدار" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__job_id +#: model_terms:ir.ui.view,arch_db:hr_docs_expiry.employee_document_form_view +msgid "Job Position" +msgstr "المهنة" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_employee_checklist____last_update +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee____last_update +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document____last_update +#: model:ir.model.fields,field_description:hr_docs_expiry.field_ir_attachment____last_update +#: model:ir.model.fields,field_description:hr_docs_expiry.field_res_users____last_update +msgid "Last Modified on" +msgstr "آخر تعديل في" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_employee_checklist__write_uid +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_employee_checklist__write_date +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__write_date +msgid "Last Updated on" +msgstr "" + +#. module: hr_docs_expiry +#: code:addons/hr_docs_expiry/models/employee_documents.py:0 +#: model:ir.model.fields.selection,name:hr_docs_expiry.selection__hr_employee_document__document_type__license +#, python-format +msgid "License" +msgstr "رخصة القيادة" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__license_id +msgid "License ID" +msgstr "رقم رخصة القيادة" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee__license_number_id +msgid "License Number" +msgstr "رقم رخصة القيادة" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_employee_checklist__message_main_attachment_id +msgid "Main Attachment" +msgstr "" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_employee_checklist__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_employee_checklist__message_ids +msgid "Messages" +msgstr "" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_employee_checklist__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_employee_checklist__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: hr_docs_expiry +#: model:ir.model.fields,help:hr_docs_expiry.field_employee_checklist__message_needaction_counter +msgid "Number of messages which requires an action" +msgstr "" + +#. module: hr_docs_expiry +#: model:ir.model.fields,help:hr_docs_expiry.field_employee_checklist__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: hr_docs_expiry +#: model:ir.model.fields,help:hr_docs_expiry.field_employee_checklist__message_unread_counter +msgid "Number of unread messages" +msgstr "" + +#. module: hr_docs_expiry +#: code:addons/hr_docs_expiry/models/employee_documents.py:0 +#: model:ir.model.fields.selection,name:hr_docs_expiry.selection__employee_checklist__document_type__other +#: model:ir.model.fields.selection,name:hr_docs_expiry.selection__hr_employee_document__document_type__other +#, python-format +msgid "Other" +msgstr "اخرى" + +#. module: hr_docs_expiry +#: code:addons/hr_docs_expiry/models/employee_documents.py:0 +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee__passport_id +#: model:ir.model.fields,field_description:hr_docs_expiry.field_res_users__passport_id +#: model:ir.model.fields.selection,name:hr_docs_expiry.selection__hr_employee_document__document_type__passport +#, python-format +msgid "Passport" +msgstr "جواز السفر" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__passport_id +msgid "Passport Number" +msgstr "رقم الجواز" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__place_issue_id +msgid "Place of Issue" +msgstr "مكان استخراج المستند" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__reminder_before +msgid "Reminder Before" +msgstr "تذكير قبل (يوم)" + +#. module: hr_docs_expiry +#: code:addons/hr_docs_expiry/models/employee_documents.py:0 +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__saudi_id +#: model:ir.model.fields.selection,name:hr_docs_expiry.selection__hr_employee_document__document_type__saudi +#, python-format +msgid "Saudi ID" +msgstr "رقم الهوية الوطنية" + +#. module: hr_docs_expiry +#: code:addons/hr_docs_expiry/models/employee_documents.py:0 +#, python-format +msgid "This Identity Number already Exiting" +msgstr "رقم الهوية هذا موجود بالفعل" + +#. module: hr_docs_expiry +#: code:addons/hr_docs_expiry/models/employee_documents.py:0 +#, python-format +msgid "This License Number already Exiting" +msgstr "رقم رخصة القيادة هذا موجود بالفعل" + +#. module: hr_docs_expiry +#: code:addons/hr_docs_expiry/models/employee_documents.py:0 +#, python-format +msgid "This Medical Examination Number already Exiting" +msgstr "رقم الفحص الطبي هذا موجود بالفعل" + +#. module: hr_docs_expiry +#: code:addons/hr_docs_expiry/models/employee_documents.py:0 +#, python-format +msgid "This Passport Number already Exiting" +msgstr "رقم جواز السفر هذا موجود بالفعل" + +#. module: hr_docs_expiry +#: code:addons/hr_docs_expiry/models/employee_documents.py:0 +#, python-format +msgid "This Saudi Identity already Exiting" +msgstr "رقم الهوية الوطنية هذا موجود بالفعل" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_employee_checklist__message_unread +msgid "Unread Messages" +msgstr "" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_employee_checklist__message_unread_counter +msgid "Unread Messages Counter" +msgstr "" + +#. module: hr_docs_expiry +#: model:ir.model,name:hr_docs_expiry.model_res_users +msgid "Users" +msgstr "المستخدمون" + +#. module: hr_docs_expiry +#: model:ir.model.fields,help:hr_docs_expiry.field_hr_employee_document__doc_attachment_id +msgid "You can attach the copy of your document" +msgstr "يجب ارفاق المستند للملف" + +#. module: hr_docs_expiry +#: model:mail.template,subject:hr_docs_expiry.email_template_child_age_check +msgid "Your Child ${object.name} has turned 18" +msgstr "تاجوز عمر 18 سنة ${object.name} هذا الطفل" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__membership_type +msgid "Membership Type" +msgstr "نوع العضوية" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__specialization +msgid "Specialization" +msgstr "التخصص" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__category +msgid "Category" +msgstr "التصنيف" + +#. module: hr_docs_expiry +#: code:addons/hr_docs_expiry/models/employee_documents.py:0 +#, python-format +msgid "Saudi ID must be 10 digits" +msgstr "رقم الهويه الوطنية يجب ان يكون 10 ارقام" + +#. module: hr_docs_expiry +#: code:addons/hr_docs_expiry/models/employee_documents.py:0 +#, python-format +msgid "The Saudi ID number should begin with 1" +msgstr "رقم الهويه الوطنية يجب ان يبدأ ب 1" + +#. module: hr_docs_expiry +#: code:addons/hr_docs_expiry/models/employee_documents.py:0 +#, python-format +msgid "Identity must be 10 digits" +msgstr "رقم الهويه يجب ان يكون 10 ارقام" + +#. module: hr_docs_expiry +#: code:addons/hr_docs_expiry/models/employee_documents.py:0 +#, python-format +msgid "Identity must begin with 2 or 3 or 4" +msgstr "رقم الهويه يجب ان يبدأ ب 2 او 3 او 4" + +#. module: hr_docs_expiry +#: code:addons/hr_docs_expiry/models/employee_documents.py:0 +#, python-format +msgid "medical Examination" +msgstr "الكشف/الإفصاح الطبي" + +#. module: hr_docs_expiry +#: code:addons/hr_docs_expiry/models/employee_documents.py:0 +#, python-format +msgid "Error, date of issue must be less than expiry date" +msgstr "خطأ, تاريخ اصدار الهويه يجب ان تكون اقل من تاريخ النهاية" + +#. module: hr_docs_expiry +#: code:addons/hr_docs_expiry/models/employee_documents.py:0 +#, python-format +msgid "Error,the expiry date must be greater than the date of the day" +msgstr "خطأ, تاريخ النهاية يجب ان يكون اكبر من تاريخ اليوم" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__company_id +msgid "Company" +msgstr "الشركة" + +#. module: hr_docs_expiry +#: model:ir.model.fields,field_description:hr_docs_expiry.field_hr_employee_document__employee_number +#: model_terms:ir.ui.view,arch_db:hr_docs_expiry.employee_document_form_view +#: model_terms:ir.ui.view,arch_db:hr_docs_expiry.employee_document_inherit_view +#: model_terms:ir.ui.view,arch_db:hr_docs_expiry.employee_document_tree_view +msgid "Employee Number" +msgstr "رقم الموظف" + + + diff --git a/odex30_base/hr_docs_expiry/models/__init__.py b/odex30_base/hr_docs_expiry/models/__init__.py new file mode 100644 index 0000000..7997bd9 --- /dev/null +++ b/odex30_base/hr_docs_expiry/models/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import employee_documents +from . import employee_entry_exit_check_list diff --git a/odex30_base/hr_docs_expiry/models/employee_documents.py b/odex30_base/hr_docs_expiry/models/employee_documents.py new file mode 100644 index 0000000..9170853 --- /dev/null +++ b/odex30_base/hr_docs_expiry/models/employee_documents.py @@ -0,0 +1,268 @@ +# -*- coding: utf-8 -*- +from odoo import api, fields, models +from datetime import datetime, date, timedelta +from odoo.tools.translate import _ +from odoo.exceptions import ValidationError +import logging + +_logger = logging.getLogger(__name__) + +class HrEmployeeDocument(models.Model): + _name = "hr.employee.document" + _description = "HR Employee Documents" + _inherit = ['mail.thread', 'mail.activity.mixin'] + + @api.model + def mail_reminder(self): + now = datetime.now() + timedelta(days=1) + date_now = now.date() + matches = self.search([]) + for record in matches: + if record.expiry_date: + exp_date = fields.Date.from_string(record.expiry_date) - timedelta(days=record.reminder_before) + if date_now >= exp_date and record.employee_ref.state not in ['draft', 'out_of_service']: + template = self.env.ref('hr_docs_expiry.email_template_document_expiry_reminder', raise_if_not_found=False) + if template: + template.send_mail(record.id) + + if record.employee_ref.state not in ['draft', 'out_of_service'] and record.employee_ref.employee_dependant: + for dependant in record.employee_ref.employee_dependant: + if dependant.relation == 'child' and dependant.age >= 18: + template2 = self.env.ref('hr_docs_expiry.email_template_child_age_check', raise_if_not_found=False) + if template2: + template2.send_mail(record.id) + + @api.constrains('expiry_date', 'saudi_id', 'iqama_id', 'issue_date') + def check_expr_date(self): + for record in self: + if record.expiry_date: + exp_date = fields.Date.from_string(record.expiry_date) + if exp_date < date.today(): + raise ValidationError('Your Document Is Expired.') + + if record.saudi_id: + if len(record.saudi_id) != 10: + raise ValidationError(_('Saudi ID must be 10 digits')) + if record.saudi_id[0] != '1': + raise ValidationError(_('The Saudi ID number should begin with 1')) + + if record.iqama_id: + if len(record.iqama_id) != 10: + raise ValidationError(_('Identity must be 10 digits')) + if record.iqama_id[0] not in ['2', '3', '4']: + raise ValidationError(_('Identity must begin with 2 or 3 or 4')) + + if record.expiry_date and record.issue_date: + if record.expiry_date <= record.issue_date: + raise ValidationError(_('Error, date of issue must be less than expiry date')) + if date.today() >= record.expiry_date: + raise ValidationError(_("Error, the expiry date must be greater than today's date")) + + saudi_id = fields.Char(string="Saudi ID") + license_id = fields.Char(string="License ID") + passport_id = fields.Char(string="Passport Number") + iqama_id = fields.Char(string="Identity No") + place_issue_id = fields.Char(string="Place of Issue") + name = fields.Char(string="Document Name", required=True, copy=False) + document_name = fields.Many2one(comodel_name="employee.checklist", string="Document") + description = fields.Text(string="Description", copy=False) + expiry_date = fields.Date(string="Expiry Date", tracking=True) + employee_ref = fields.Many2one('hr.employee', copy=False, string="Employee Name") + doc_attachment_id = fields.Many2many( + "ir.attachment", + "doc_attach_rel", + "doc_id", + "attach_id3", + string="Attachment", + help="You can attach the copy of your document", + copy=False + ) + file_examination = fields.Char() + document_type = fields.Selection([ + ("passport", _("Passport")), + ("license", _("License")), + ("Iqama", _("Identity")), + ("saudi", _("Saudi ID")), + ("medical_Examination", _("Medical Examination")), + ("professional_certificates", _("Professional Certificates")), + ("other", _("Other")) + ]) + issue_date = fields.Date( + string="Issue Date", + default=fields.Date.context_today, + copy=False, + tracking=True + ) + reminder_before = fields.Integer(default=0) + job_id = fields.Many2one("hr.job", "Job Position") + emp_iqama_job = fields.Char("Job Position") + membership_type = fields.Many2one(comodel_name="membership.types", string="Membership Type") + specialization = fields.Char(string="Specialization") + category = fields.Many2one(comodel_name="membership.categorys", string="Category") + company_id = fields.Many2one( + 'res.company', + string="Company", + default=lambda self: self.env.company + ) + employee_number = fields.Char( + related="employee_ref.contract_id.name", + copy=False, + string='Employee Number' + ) + + def set_last_document(self): + self.ensure_one() + emp_id = self.env["hr.employee"].search([("id", "=", self.employee_ref.id)]) + if emp_id: + if self.document_type == "passport": + emp_id.passport_id = self.id + elif self.document_type == "Iqama": + emp_id.iqama_number = self.id + elif self.document_type == "saudi": + emp_id.saudi_number = self.id + elif self.document_type == "license": + emp_id.license_number_id = self.id + elif self.document_type == "medical_Examination": + emp_id.copy_examination_file = self.id + + @api.model_create_multi + def create(self, vals_list): + records = super(HrEmployeeDocument, self).create(vals_list) + for record in records: + record.set_last_document() + return records + + def name_get(self): + result = [] + for record in self: + name = "" + if record.saudi_id: + name = record.saudi_id + elif record.passport_id: + name = record.passport_id + elif record.iqama_id: + name = record.iqama_id + elif record.license_id: + name = record.license_id + elif record.file_examination: + name = record.file_examination + elif record.document_type == "other": + name = record.name + + result.append((record.id, name)) + return result + + @api.constrains("passport_id", "saudi_id", "iqama_id", "license_id", "file_examination") + def unique_fields(self): + for record in self: + domain = [] + if record.document_type == "passport" and record.passport_id: + domain = [("passport_id", "=", record.passport_id), ("document_type", "=", record.document_type)] + elif record.document_type == "saudi" and record.saudi_id: + domain = [("saudi_id", "=", record.saudi_id), ("document_type", "=", record.document_type)] + elif record.document_type == "Iqama" and record.iqama_id: + domain = [("iqama_id", "=", record.iqama_id), ("document_type", "=", record.document_type)] + elif record.document_type == "license" and record.license_id: + domain = [("license_id", "=", record.license_id), ("document_type", "=", record.document_type)] + elif record.document_type == "medical_Examination" and record.file_examination: + domain = [("file_examination", "=", record.file_examination), ("document_type", "=", record.document_type)] + + if domain: + duplicate_count = self.search_count(domain) + if duplicate_count > 1: + doc_type_names = { + "passport": "Passport", + "saudi": "Saudi Identity", + "Iqama": "Identity", + "license": "License", + "medical_Examination": "Medical Examination" + } + doc_name = doc_type_names.get(record.document_type, "Document") + raise ValidationError(_(f"This {doc_name} Number already exists")) + + +class HrEmployee(models.Model): + _inherit = "hr.employee" + + passport_id = fields.Many2one( + "hr.employee.document", + domain=[("document_type", "=", "passport")], + tracking=True, + ) + expiry_license = fields.Date( + related="license_number_id.expiry_date", + readonly=True, + string="License Expiry Date" + ) + license_number_id = fields.Many2one( + comodel_name="hr.employee.document", + domain="[('document_type','=','license')]" + ) + + + document_ids = fields.One2many( + 'hr.employee.document', + 'employee_ref', + string="Documents" + ) + + document_count = fields.Integer( + compute="_compute_document_count", + string="# Documents" + ) + + @api.depends('document_ids') + def _compute_document_count(self): + for employee in self: + employee.document_count = len(employee.document_ids) + + def document_view(self): + self.ensure_one() + return { + "name": _("Documents"), + "domain": [("employee_ref", "=", self.id)], + "res_model": "hr.employee.document", + "type": "ir.actions.act_window", + "view_mode": "tree,form", + "help": """

Click to Create for New Documents

""", + "limit": 80, + "context": {"default_employee_ref": self.id}, + } + + + +class HrEmployeeAttachment(models.Model): + _inherit = "ir.attachment" + + doc_attach_rel = fields.Many2many( + "hr.employee.document", + "doc_attachment_id", + "attach_id3", + "doc_id", + string="Attachment", + invisible=True + ) + + +class User(models.Model): + _inherit = "res.users" + + passport_id = fields.Many2one( + "hr.employee.document", + related="employee_id.passport_id", + readonly=False + ) + + +class MembershipTypes(models.Model): + _name = 'membership.types' + _description = 'Membership Types' + + name = fields.Char(required=True) + + +class MembershipCategorys(models.Model): + _name = 'membership.categorys' + _description = 'Membership Categories' + + name = fields.Char(required=True) \ No newline at end of file diff --git a/odex30_base/hr_docs_expiry/models/employee_entry_exit_check_list.py b/odex30_base/hr_docs_expiry/models/employee_entry_exit_check_list.py new file mode 100644 index 0000000..7ae72e6 --- /dev/null +++ b/odex30_base/hr_docs_expiry/models/employee_entry_exit_check_list.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- + +from odoo import fields, models + + +class EmployeeEntryDocuments(models.Model): + _name = "employee.checklist" + _inherit = ["mail.thread", "mail.activity.mixin"] + _description = "Employee Documents" + + name = fields.Char(string="Document Name", copy=False, required=True) + document_type = fields.Selection( + selection=[ + ("entry", "Entry Process"), + ("exit", "Exit Process"), + ("other", "Other") + ], + string="Checklist Type", + required=True + ) + + def name_get(self): + result = [] + for record in self: + name = record.name + if record.document_type == "entry": + name += "_en" + elif record.document_type == "exit": + name += "_ex" + elif record.document_type == "other": + name += "_ot" + result.append((record.id, name)) + return result \ No newline at end of file diff --git a/odex30_base/hr_docs_expiry/models/res_users.py b/odex30_base/hr_docs_expiry/models/res_users.py new file mode 100644 index 0000000..d87f560 --- /dev/null +++ b/odex30_base/hr_docs_expiry/models/res_users.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- + +from odoo import fields, models + + +class User(models.Model): + _inherit = "res.users" + + passport_id = fields.Many2one( + "hr.employee.document", + related="employee_id.passport_id", + readonly=False + ) diff --git a/odex30_base/hr_docs_expiry/security/ir.model.access.csv b/odex30_base/hr_docs_expiry/security/ir.model.access.csv new file mode 100644 index 0000000..f0676d2 --- /dev/null +++ b/odex30_base/hr_docs_expiry/security/ir.model.access.csv @@ -0,0 +1,10 @@ +id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink +access_hr_employee_checklist_user,employee.checklist.user,model_employee_checklist,hr.group_hr_user,1,1,1,1 +access_hr_employee_checklist_emp,employee.checklist.emp,model_employee_checklist,base.group_user,1,0,0,0 +access_hr_employee_document_employee,hr.employee.document_employee,model_hr_employee_document,base.group_user,1,0,0,0 +access_hr_employee_document_manager,hr.employee.document_manager,model_hr_employee_document,hr.group_hr_manager,1,1,1,1 +access_hr_employee_document_user,hr.employee.document_user,model_hr_employee_document,hr.group_hr_user,1,1,1,0 +access_membership_types_hr,Access.membership_types_hr,model_membership_types,hr.group_hr_user,1,1,1,1 +access_membership_types_emp,Access.membership_types_emp,model_membership_types,base.group_user,1,0,0,0 +access_membership_categorys_hr,Access.membership_categorys_hr,model_membership_categorys,hr.group_hr_user,1,1,1,1 +access_membership_categorys_emp,Access.membership_categorys_emp,model_membership_categorys,base.group_user,1,0,0,0 diff --git a/odex30_base/hr_docs_expiry/static/description/icon.png b/odex30_base/hr_docs_expiry/static/description/icon.png new file mode 100644 index 0000000..4141f52 Binary files /dev/null and b/odex30_base/hr_docs_expiry/static/description/icon.png differ diff --git a/odex30_base/hr_docs_expiry/static/src/css/website_rtl.css b/odex30_base/hr_docs_expiry/static/src/css/website_rtl.css new file mode 100644 index 0000000..7a8ddfb --- /dev/null +++ b/odex30_base/hr_docs_expiry/static/src/css/website_rtl.css @@ -0,0 +1,22 @@ +@media (min-width: 768px) { + .rtl .navbar-right { + float: left !important; + } + .rtl .navbar-right .dropdown .dropdown-menu { + right: auto !important; + left: 0 !important; + } + .rtl .navbar-left { + float: right !important; + } + .rtl .navbar-left .dropdown .dropdown-menu { + left: auto !important; + right: 0 !important; + } + .navbar-nav.navbar-right:last-child { + margin-left: auto; + } + .rtl .pull-left { + float: right !important; + } +} diff --git a/odex30_base/hr_docs_expiry/views/employee_check_list_view.xml b/odex30_base/hr_docs_expiry/views/employee_check_list_view.xml new file mode 100644 index 0000000..b3d0caa --- /dev/null +++ b/odex30_base/hr_docs_expiry/views/employee_check_list_view.xml @@ -0,0 +1,31 @@ + + + + employee.checklist.form + employee.checklist + form + +
+ + + + + + + + +
+
+ + + employee.checklist.list + employee.checklist + list + + + + + + + +
\ No newline at end of file diff --git a/odex30_base/hr_docs_expiry/views/employee_document_view.xml b/odex30_base/hr_docs_expiry/views/employee_document_view.xml new file mode 100644 index 0000000..d0b8ce8 --- /dev/null +++ b/odex30_base/hr_docs_expiry/views/employee_document_view.xml @@ -0,0 +1,118 @@ + + + + Employee document + hr.employee.document + list,form + + + + hr.employee.document.form + hr.employee.document + form + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + Employees Document inherit + hr.employee.document + search + + + + + + + + + + + + + hr.employee.document.list + hr.employee.document + list + + + + + + + + + + + + + + +
\ No newline at end of file