Merge pull request #28 from expsa/migration-modules

commit for 2 module
This commit is contained in:
ahmed-nouri051 2025-09-30 16:03:38 +02:00 committed by GitHub
commit de9704f6c4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
22 changed files with 1250 additions and 0 deletions

View File

@ -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:

View File

@ -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:

View File

@ -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

View File

@ -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)

View File

@ -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)

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -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;
}
}

View File

@ -0,0 +1 @@
from . import models

View File

@ -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",
],
}

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="entry_document1" model="employee.checklist">
<field name="name">Education Certificate</field>
<field name="document_type">entry</field>
</record>
<record id="entry_document2" model="employee.checklist">
<field name="name">Salary Certificate</field>
<field name="document_type">entry</field>
</record>
<record id="entry_document3" model="employee.checklist">
<field name="name">Experience Certificate</field>
<field name="document_type">entry</field>
</record>
<record id="exit_document1" model="employee.checklist">
<field name="name">Experience Certificate</field>
<field name="document_type">exit</field>
</record>
<record id="exit_document2" model="employee.checklist">
<field name="name">Salary Certificate</field>
<field name="document_type">exit</field>
</record>
</odoo>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="employee_docs_data_reminder" model="ir.cron">
<field name="name">Employee Data Expiration</field>
<field name="model_id" ref="model_hr_employee_document" />
<field name="state">code</field>
<field name="code">model.mail_reminder()</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="active" eval="True" />
</record>
</odoo>

View File

@ -0,0 +1,42 @@
<?xml version="1.0"?>
<odoo>
<data noupdate="1">
<record id="email_template_document_expiry_reminder" model="mail.template">
<field name="name">Document Expiry Reminder</field>
<field name="subject">Document- {{ object.name }} Expired On {{ object.expiry_date }}</field>
<field name="email_to">{{ object.employee_ref.work_email }}</field>
<field name="email_cc">{{ (user.company_id.hr_email.email or '') }}</field>
<field name="model_id" ref="hr_docs_expiry.model_hr_employee_document" />
<field name="auto_delete" eval="True" />
<field name="body_html" type="html">
<div>
<p>Dear {{ object.employee_ref.name }},</p>
<br />
<p>Your Document {{ object.name }} is going to expire on {{ object.expiry_date
}}.
Please renew it before expiry date.</p>
<br />
<p>Best regards,</p>
</div>
</field>
</record>
<record id="email_template_child_age_check" model="mail.template">
<field name="name">Employee Dependant Age Check</field>
<field name="subject">Your Child {{ object.name }} has turned 18</field>
<field name="email_to">{{ object.employee_ref.work_email }}</field>
<field name="email_cc">{{ (user.company_id.hr_email.email or '') }}</field>
<field name="model_id" ref="hr_docs_expiry.model_hr_employee_document" />
<field name="auto_delete" eval="True" />
<field name="body_html" type="html">
<div>
<p>Dear {{ object.employee_ref.name }},</p>
<br />
<p>Greetings, your dependant {{ object.name }} has turned 18.</p>
<br />
<p>Best regards,</p>
</div>
</field>
</record>
</data>
</odoo>

View File

@ -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"
" <p>Dear ${object.employee_ref.name},</p>\n"
" <br/>\n"
" <p> Greetings, your dependant ${object.name} has turned 18.\n"
" <br/>\n"
" <p>Best regards,</p>\n"
" <div>\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 ""
"<p class=\"oe_view_nocontent_create\">\n"
" Click to Create for New Documents\n"
" </p>"
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 "رقم الموظف"

View File

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
from . import employee_documents
from . import employee_entry_exit_check_list

View File

@ -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": """<p class="oe_view_nocontent_create"> Click to Create for New Documents </p>""",
"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)

View File

@ -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

View File

@ -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
)

View File

@ -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
1 id name model_id/id group_id/id perm_read perm_write perm_create perm_unlink
2 access_hr_employee_checklist_user employee.checklist.user model_employee_checklist hr.group_hr_user 1 1 1 1
3 access_hr_employee_checklist_emp employee.checklist.emp model_employee_checklist base.group_user 1 0 0 0
4 access_hr_employee_document_employee hr.employee.document_employee model_hr_employee_document base.group_user 1 0 0 0
5 access_hr_employee_document_manager hr.employee.document_manager model_hr_employee_document hr.group_hr_manager 1 1 1 1
6 access_hr_employee_document_user hr.employee.document_user model_hr_employee_document hr.group_hr_user 1 1 1 0
7 access_membership_types_hr Access.membership_types_hr model_membership_types hr.group_hr_user 1 1 1 1
8 access_membership_types_emp Access.membership_types_emp model_membership_types base.group_user 1 0 0 0
9 access_membership_categorys_hr Access.membership_categorys_hr model_membership_categorys hr.group_hr_user 1 1 1 1
10 access_membership_categorys_emp Access.membership_categorys_emp model_membership_categorys base.group_user 1 0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -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;
}
}

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record model='ir.ui.view' id='employee_check_list_form_view'>
<field name="name">employee.checklist.form</field>
<field name="model">employee.checklist</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Checklist">
<sheet>
<group>
<field name="name" />
<field name="document_type" />
</group>
</sheet>
<chatter />
</form>
</field>
</record>
<record model='ir.ui.view' id='employee_check_list_tree_view'>
<field name="name">employee.checklist.list</field>
<field name="model">employee.checklist</field>
<field name="type">list</field>
<field name="arch" type="xml">
<list>
<field name="name" />
<field name="document_type" />
</list>
</field>
</record>
</odoo>

View File

@ -0,0 +1,118 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record model="ir.actions.act_window" id="employee_document_list_action">
<field name="name">Employee document</field>
<field name="res_model">hr.employee.document</field>
<field name="view_mode">list,form</field>
</record>
<record model='ir.ui.view' id='employee_document_form_view'>
<field name="name">hr.employee.document.form</field>
<field name="model">hr.employee.document</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<group>
<field name="name" required="1" string="Document Name" />
<field
name="doc_attachment_id"
widget="many2many_binary"
class="oe_inline"
/>
<field name="document_type" string="Document Type" required="1" />
<field name="employee_ref" string="Employee Name" />
<field name="employee_number" string="Employee Number" force_save="1" />
<field name="company_id" groups="base.group_multi_company" readonly="1" />
</group>
<group>
<field name="saudi_id"
invisible="document_type != 'saudi'"
required="document_type == 'saudi'" />
<field name="license_id"
invisible="document_type != 'license'"
required="document_type == 'license'" />
<field name="passport_id"
invisible="document_type != 'passport'"
required="document_type == 'passport'" />
<field name="iqama_id" string="Identity No"
invisible="document_type != 'Iqama'"
required="document_type == 'Iqama'" />
<field name="emp_iqama_job" string="Job Position"
invisible="document_type != 'Iqama'" />
<field name="file_examination" string="File Examination Name"
invisible="document_type != 'medical_Examination'"
required="document_type == 'medical_Examination'" />
<field name="issue_date" required="document_type != 'saudi'" />
<field name="place_issue_id" />
<field name="expiry_date" required="document_type != 'saudi'" />
<field name="reminder_before" />
</group>
<group invisible="document_type != 'professional_certificates'">
<field name="membership_type"
required="document_type == 'professional_certificates'" />
<field name="specialization"
required="document_type == 'professional_certificates'" />
<field name="category"
required="document_type == 'professional_certificates'" />
</group>
</group>
<notebook>
<page string="Description">
<field name="description" />
</page>
</notebook>
</sheet>
<chatter />
</form>
</field>
</record>
<!-- Employee document search view-->
<record id="employee_document_inherit_view" model="ir.ui.view">
<field name="name">Employees Document inherit</field>
<field name="model">hr.employee.document</field>
<field name="type">search</field>
<field name="arch" type="xml">
<search>
<field name="employee_ref" />
<field name="employee_number" />
<field name="saudi_id" />
<field name="iqama_id" />
<field name="passport_id" />
</search>
</field>
</record>
<record model='ir.ui.view' id='employee_document_tree_view'>
<field name="name">hr.employee.document.list</field>
<field name="model">hr.employee.document</field>
<field name="type">list</field>
<field name="arch" type="xml">
<list>
<field name="employee_number" />
<field name="employee_ref" />
<field name="document_type" />
<field name="issue_date" />
<field name="expiry_date" />
</list>
</field>
</record>
<!-- Employee document menu item view-->
<menuitem
name="Employee Documents"
id="Employee_document_menu_item"
parent="hr.menu_hr_main"
sequence="6"
action="employee_document_list_action"
groups="hr.group_hr_manager,hr.group_hr_user"
/>
</odoo>