diff --git a/exp_employee_custody/__init__.py b/exp_employee_custody/__init__.py
new file mode 100644
index 0000000..5305644
--- /dev/null
+++ b/exp_employee_custody/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+
+from . import models
\ No newline at end of file
diff --git a/exp_employee_custody/__manifest__.py b/exp_employee_custody/__manifest__.py
new file mode 100644
index 0000000..4c5916d
--- /dev/null
+++ b/exp_employee_custody/__manifest__.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+{
+ 'name': 'HR Custody',
+ 'category': 'Odex25-HR/Odex25-HR',
+ 'summary': 'Custody and receiving Employee custody',
+ 'version': '1.0',
+ 'sequence': 4,
+ 'website': 'http://exp-sa.com',
+ 'license': 'GPL-3',
+ 'author': 'Expert Co. Ltd.',
+
+ 'depends': ['base','hr_base','employee_requests'],
+
+ 'data': [
+ 'security/ir.model.access.csv',
+ 'security/custody_security.xml',
+ 'views/employee_custody_views.xml',
+ 'views/receiving_employee_custody.xml',
+ ],
+ }
diff --git a/exp_employee_custody/i18n/ar_001.po b/exp_employee_custody/i18n/ar_001.po
new file mode 100644
index 0000000..20d2146
--- /dev/null
+++ b/exp_employee_custody/i18n/ar_001.po
@@ -0,0 +1,753 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * exp_employee_custody
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 14.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-01-31 10:22+0000\n"
+"PO-Revision-Date: 2023-01-31 10:22+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: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__message_needaction
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__message_needaction
+msgid "Action Needed"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__activity_ids
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__activity_ids
+msgid "Activities"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__activity_exception_decoration
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__activity_exception_decoration
+msgid "Activity Exception Decoration"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__activity_state
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__activity_state
+msgid "Activity State"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__activity_type_icon
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__activity_type_icon
+msgid "Activity Type Icon"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+msgid "Add Comments here ...."
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__advantage_line_id
+msgid "Advantage Line"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_custody_line__amount
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_form_view
+msgid "Amount"
+msgstr "المبلغ"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__message_attachment_count
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__message_attachment_count
+msgid "Attachment Count"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__call_compute_function
+msgid "Call Compute Function"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__create_uid
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_custody_line__create_uid
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_return_custody_line__create_uid
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__create_uid
+msgid "Created by"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__create_date
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_custody_line__create_date
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_return_custody_line__create_date
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__create_date
+msgid "Created on"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__current_date
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__current_date
+msgid "Current Date"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.ui.menu,name:exp_employee_custody.custody_submenu
+msgid "Custody"
+msgstr "العُهــده"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__custody_line_ids
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_return_custody_line__custody_line_id
+msgid "Custody Line"
+msgstr "عهد الموظف"
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_form_view
+msgid "Custody Lines"
+msgstr "عهد الموظفين"
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_form_view
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_tree_view
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_tree_view
+msgid "Date"
+msgstr "التاريخ"
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_form_view
+msgid "Date Delivering"
+msgstr "تاريخ الاستلام"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_return_custody_line__deduction_amount
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__deduction_amount
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+msgid "Deduction Amount"
+msgstr "قيمة الخصم"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__department_id
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__department_id
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_form_view
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_tree_view
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_tree_view
+msgid "Department"
+msgstr "الإدارة"
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_form_view
+msgid "Description"
+msgstr "الوصف"
+
+#. module: exp_employee_custody
+#: code:addons/exp_employee_custody/models/employee_custody.py:0
+#: code:addons/exp_employee_custody/models/receiving_employee_custody.py:0
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_form_view
+#, python-format
+msgid "Direct Manager"
+msgstr "المدير المباشر"
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+msgid "Directed Manager"
+msgstr "المدير المباشر"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__display_name
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_custody_line__display_name
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_return_custody_line__display_name
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: exp_employee_custody
+#: code:addons/exp_employee_custody/models/employee_custody.py:0
+#: code:addons/exp_employee_custody/models/receiving_employee_custody.py:0
+#, python-format
+msgid "Draft"
+msgstr "مبدئي"
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_form_view
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_tree_view
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_tree_view
+msgid "Employee"
+msgstr "الموظف"
+
+#. module: exp_employee_custody
+#: code:addons/exp_employee_custody/models/receiving_employee_custody.py:0
+#, python-format
+msgid "Employee \"%s\" has not contract !"
+msgstr "الموظف \"%s\" ليس لديه عقد!"
+
+#. module: exp_employee_custody
+#: model:ir.actions.act_window,name:exp_employee_custody.employee_custody_action
+#: model:ir.ui.menu,name:exp_employee_custody.employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_tree_view
+msgid "Employee Custody"
+msgstr "العهد الغير مالية"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_custody_line__employee_custody_line
+msgid "Employee Custody Line"
+msgstr "عهد الموظف"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__employee_id
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__employee_id
+msgid "Employee"
+msgstr "الموظف"
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+msgid "Employee Info"
+msgstr "معلومات الموظف"
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_form_view
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+msgid "Employee Number"
+msgstr "رقم الموظف"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_return_custody_line__employee_return_custody_line_id
+msgid "Employee Return Custody Line"
+msgstr "عهد الموظف المرجعة"
+
+#. module: exp_employee_custody
+#: model:ir.model,name:exp_employee_custody.model_custom_employee_custody
+msgid "Employee custody"
+msgstr "العهد الغير مالية"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__employee_no
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__employee_no
+msgid "Employee number"
+msgstr "رقم الموظف"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__message_follower_ids
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__message_follower_ids
+msgid "Followers"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__message_channel_ids
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__message_channel_ids
+msgid "Followers (Channels)"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__message_partner_ids
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__message_partner_ids
+msgid "Followers (Partners)"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,help:exp_employee_custody.field_custom_employee_custody__activity_type_icon
+#: model:ir.model.fields,help:exp_employee_custody.field_hr_custody_receiving__activity_type_icon
+msgid "Font awesome icon e.g. fa-tasks"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__from_hr_department
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__from_hr_department
+msgid "From Hr Department"
+msgstr "من موظف آخر"
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+msgid "HR Manager"
+msgstr "مدير الموارد البشرية"
+
+#. module: exp_employee_custody
+#: code:addons/exp_employee_custody/models/employee_custody.py:0
+#: code:addons/exp_employee_custody/models/receiving_employee_custody.py:0
+#: model:ir.model.fields.selection,name:exp_employee_custody.selection__custom_employee_custody__state__admin
+#: model:ir.model.fields.selection,name:exp_employee_custody.selection__hr_custody_receiving__state__admin
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_form_view
+#, python-format
+msgid "Human Resources Manager"
+msgstr "تصديق الموارد البشرية"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__id
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_custody_line__id
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_return_custody_line__id
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__id
+msgid "ID"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__activity_exception_icon
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__activity_exception_icon
+msgid "Icon"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,help:exp_employee_custody.field_custom_employee_custody__activity_exception_icon
+#: model:ir.model.fields,help:exp_employee_custody.field_hr_custody_receiving__activity_exception_icon
+msgid "Icon to indicate an exception activity."
+msgstr ""
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_form_view
+msgid "Identification code"
+msgstr "رقم المتسلسل"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,help:exp_employee_custody.field_custom_employee_custody__message_needaction
+#: model:ir.model.fields,help:exp_employee_custody.field_custom_employee_custody__message_unread
+#: model:ir.model.fields,help:exp_employee_custody.field_hr_custody_receiving__message_needaction
+#: model:ir.model.fields,help:exp_employee_custody.field_hr_custody_receiving__message_unread
+msgid "If checked, new messages require your attention."
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,help:exp_employee_custody.field_custom_employee_custody__message_has_error
+#: model:ir.model.fields,help:exp_employee_custody.field_custom_employee_custody__message_has_sms_error
+#: model:ir.model.fields,help:exp_employee_custody.field_hr_custody_receiving__message_has_error
+#: model:ir.model.fields,help:exp_employee_custody.field_hr_custody_receiving__message_has_sms_error
+msgid "If checked, some messages have a delivery error."
+msgstr ""
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+msgid "Invisible field to Call compute function"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__message_is_follower
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__message_is_follower
+msgid "Is Follower"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__job_id
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__job_id
+msgid "Job Position"
+msgstr "المناصب الوظيفية"
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_form_view
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+msgid "Job Title"
+msgstr "الوظيفة"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody____last_update
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_custody_line____last_update
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_return_custody_line____last_update
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving____last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__write_uid
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_custody_line__write_uid
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_return_custody_line__write_uid
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__write_uid
+msgid "Last Updated by"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__write_date
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_custody_line__write_date
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_return_custody_line__write_date
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__write_date
+msgid "Last Updated on"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__message_main_attachment_id
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__message_main_attachment_id
+msgid "Main Attachment"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__message_has_error
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__message_has_error
+msgid "Message Delivery error"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__message_ids
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__message_ids
+msgid "Messages"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__my_activity_date_deadline
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__my_activity_date_deadline
+msgid "My Activity Deadline"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_custody_line__name
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_return_custody_line__name
+msgid "Name"
+msgstr "الاسم"
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_form_view
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+msgid "Nationality"
+msgstr "الجنسية"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__country_id
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__country_id
+msgid "Nationality (Country)"
+msgstr "الجنسية (البلد)"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__activity_date_deadline
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__activity_date_deadline
+msgid "Next Activity Deadline"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__activity_summary
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__activity_summary
+msgid "Next Activity Summary"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__activity_type_id
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__activity_type_id
+msgid "Next Activity Type"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__note
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_custody_line__note
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_return_custody_line__note
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__note
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+msgid "Note"
+msgstr "ملاحظات"
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_form_view
+msgid "Notes"
+msgstr "ملاحظات"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__message_needaction_counter
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__message_needaction_counter
+msgid "Number of Actions"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__message_has_error_counter
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__message_has_error_counter
+msgid "Number of errors"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,help:exp_employee_custody.field_custom_employee_custody__message_needaction_counter
+#: model:ir.model.fields,help:exp_employee_custody.field_hr_custody_receiving__message_needaction_counter
+msgid "Number of messages which requires an action"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,help:exp_employee_custody.field_custom_employee_custody__message_has_error_counter
+#: model:ir.model.fields,help:exp_employee_custody.field_hr_custody_receiving__message_has_error_counter
+msgid "Number of messages with delivery error"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,help:exp_employee_custody.field_custom_employee_custody__message_unread_counter
+#: model:ir.model.fields,help:exp_employee_custody.field_hr_custody_receiving__message_unread_counter
+msgid "Number of unread messages"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_form_view
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+msgid "Other Employee"
+msgstr "موظف آخر"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_custody_line__quantity
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_return_custody_line__quantity
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_form_view
+msgid "Quantity"
+msgstr "الكمية"
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+msgid "Re-fill"
+msgstr "تحديث عهد الموظف"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__receiving_custody
+msgid "Receiving Custody"
+msgstr "تسوية العهده"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_custody_line__receiving_date
+msgid "Receiving Date"
+msgstr "تاريخ الاستلام"
+
+#. module: exp_employee_custody
+#: model:ir.actions.act_window,name:exp_employee_custody.receiving_employee_custody_action
+#: model:ir.ui.menu,name:exp_employee_custody.receiving_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_tree_view
+msgid "Receiving Employee Custody"
+msgstr "تسوية عهد الموظف"
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+msgid "Receiving Info"
+msgstr "معلومات الارجاع"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_custody_line__receiving_quantity
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_form_view
+msgid "Receiving Quantity"
+msgstr "الكمية المرجعة"
+
+#. module: exp_employee_custody
+#: model:ir.model,name:exp_employee_custody.model_hr_custody_receiving
+msgid "Receiving custody"
+msgstr "تسوية العهده"
+
+#. module: exp_employee_custody
+#: code:addons/exp_employee_custody/models/receiving_employee_custody.py:0
+#, python-format
+msgid "Receiving quantity can not be greater than original quantity"
+msgstr "الكمية المرجعة لا يمكن أن تكون أكبر من الكمية المستلمة"
+
+#. module: exp_employee_custody
+#: code:addons/exp_employee_custody/models/receiving_employee_custody.py:0
+#: code:addons/exp_employee_custody/models/receiving_employee_custody.py:0
+#, python-format
+msgid "Receiving quantity can not be negative value "
+msgstr "لا يمكن أن تكون كمية الاستلام قيمة سالبة"
+
+#. module: exp_employee_custody
+#: code:addons/exp_employee_custody/models/employee_custody.py:0
+#: code:addons/exp_employee_custody/models/receiving_employee_custody.py:0
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_form_view
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+#, python-format
+msgid "Refuse"
+msgstr "رفض"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__activity_user_id
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__activity_user_id
+msgid "Responsible User"
+msgstr "المستخدم المسؤول"
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_form_view
+msgid "Rest To Draft"
+msgstr "إرجاع لمبدئي"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__return_custody_line_ids
+msgid "Return Custody Line"
+msgstr "عهد الموظف المرجعة"
+
+#. module: exp_employee_custody
+#: code:addons/exp_employee_custody/models/employee_custody.py:0
+#: code:addons/exp_employee_custody/models/receiving_employee_custody.py:0
+#: model:ir.model.fields.selection,name:exp_employee_custody.selection__custom_employee_custody__state__done
+#: model:ir.model.fields.selection,name:exp_employee_custody.selection__hr_custody_receiving__state__done
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_form_view
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+#, python-format
+msgid "Return Done"
+msgstr "تم ارجاع العهده"
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+msgid "Return Lines"
+msgstr "عناصر العهد المرجعة"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__message_has_sms_error
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__message_has_sms_error
+msgid "SMS Delivery error"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__salary_rule_id
+msgid "Salary Rule"
+msgstr "قاعده الراتب"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__salary_rule_flag
+msgid "Salary Rule Flag"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+msgid "Salary rule"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+msgid "Salary rule flag"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+msgid "Save contract advantage line"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_custody_line__serial
+#: model:ir.model.fields,field_description:exp_employee_custody.field_employee_return_custody_line__serial
+msgid "Serial"
+msgstr "متسلسل"
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+msgid "Set to draft"
+msgstr "إرجاع لمبدئي"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__state
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__state
+msgid "State"
+msgstr "الحالة"
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+msgid "Statement of Custody"
+msgstr "العهد المرجعة"
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_tree_view
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_tree_view
+msgid "Status"
+msgstr "الحالة"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,help:exp_employee_custody.field_custom_employee_custody__activity_state
+#: model:ir.model.fields,help:exp_employee_custody.field_hr_custody_receiving__activity_state
+msgid ""
+"Status based on activities\n"
+"Overdue: Due date is already passed\n"
+"Today: Activity date is today\n"
+"Planned: Future activities."
+msgstr ""
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+msgid "Submit"
+msgstr "إرسال"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,help:exp_employee_custody.field_custom_employee_custody__activity_exception_decoration
+#: model:ir.model.fields,help:exp_employee_custody.field_hr_custody_receiving__activity_exception_decoration
+msgid "Type of the exception activity on record."
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__message_unread
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__message_unread
+msgid "Unread Messages"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__message_unread_counter
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__message_unread_counter
+msgid "Unread Messages Counter"
+msgstr ""
+
+#. module: exp_employee_custody
+#: code:addons/exp_employee_custody/models/employee_custody.py:0
+#: code:addons/exp_employee_custody/models/receiving_employee_custody.py:0
+#: model:ir.model.fields.selection,name:exp_employee_custody.selection__custom_employee_custody__state__approve
+#: model:ir.model.fields.selection,name:exp_employee_custody.selection__hr_custody_receiving__state__approve
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_form_view
+#, python-format
+msgid "Warehouse Keeper"
+msgstr "إعتماد مسؤول المخزن"
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+msgid "Warehouse keeper"
+msgstr "إعتماد مسؤول المخزن"
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,field_description:exp_employee_custody.field_custom_employee_custody__website_message_ids
+#: model:ir.model.fields,field_description:exp_employee_custody.field_hr_custody_receiving__website_message_ids
+msgid "Website Messages"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields,help:exp_employee_custody.field_custom_employee_custody__website_message_ids
+#: model:ir.model.fields,help:exp_employee_custody.field_hr_custody_receiving__website_message_ids
+msgid "Website communication history"
+msgstr ""
+
+#. module: exp_employee_custody
+#: code:addons/exp_employee_custody/models/employee_custody.py:0
+#: code:addons/exp_employee_custody/models/receiving_employee_custody.py:0
+#, python-format
+msgid "You can not delete record in state not in draft"
+msgstr "لا يمكن حذف السجل اذا كان في حالة غير مبدئي"
+
+#. module: exp_employee_custody
+#: model:ir.model,name:exp_employee_custody.model_employee_custody_line
+msgid "employee.custody.line"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model,name:exp_employee_custody.model_employee_return_custody_line
+msgid "employee.return.custody.line"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.receiving_employee_custody_form_view
+msgid "line"
+msgstr "بند"
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_form_view
+msgid "receiving_custody"
+msgstr ""
+
+#. module: exp_employee_custody
+#: code:addons/exp_employee_custody/models/employee_custody.py:0
+#: code:addons/exp_employee_custody/models/receiving_employee_custody.py:0
+#: model:ir.model.fields.selection,name:exp_employee_custody.selection__custom_employee_custody__state__submit
+#: model:ir.model.fields.selection,name:exp_employee_custody.selection__hr_custody_receiving__state__submit
+#, python-format
+msgid "send"
+msgstr "إرسال"
+
+#. module: exp_employee_custody
+#: model_terms:ir.ui.view,arch_db:exp_employee_custody.employee_custody_form_view
+msgid "submit"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields.selection,name:exp_employee_custody.selection__custom_employee_custody__state__direct
+#: model:ir.model.fields.selection,name:exp_employee_custody.selection__hr_custody_receiving__state__direct
+msgid "المدير المباشر"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields.selection,name:exp_employee_custody.selection__custom_employee_custody__state__refuse
+#: model:ir.model.fields.selection,name:exp_employee_custody.selection__hr_custody_receiving__state__refuse
+msgid "رفض"
+msgstr ""
+
+#. module: exp_employee_custody
+#: model:ir.model.fields.selection,name:exp_employee_custody.selection__custom_employee_custody__state__draft
+#: model:ir.model.fields.selection,name:exp_employee_custody.selection__hr_custody_receiving__state__draft
+msgid "مسودة"
+msgstr ""
diff --git a/exp_employee_custody/models/__init__.py b/exp_employee_custody/models/__init__.py
new file mode 100644
index 0000000..83c6eef
--- /dev/null
+++ b/exp_employee_custody/models/__init__.py
@@ -0,0 +1,4 @@
+# -*- coding: utf-8 -*-
+
+from . import employee_custody
+from . import receiving_employee_custody
\ No newline at end of file
diff --git a/exp_employee_custody/models/employee_custody.py b/exp_employee_custody/models/employee_custody.py
new file mode 100644
index 0000000..4c3ea57
--- /dev/null
+++ b/exp_employee_custody/models/employee_custody.py
@@ -0,0 +1,92 @@
+from odoo import models, fields, api, _, exceptions
+from odoo import SUPERUSER_ID
+from odoo.exceptions import ValidationError
+
+
+# from datetime import datetime , date
+
+
+class EmployeeCustody(models.Model):
+ _name = 'custom.employee.custody'
+ _rec_name = 'employee_id'
+ _description = 'Employee custody'
+ _inherit = ['mail.thread', 'mail.activity.mixin']
+
+ current_date = fields.Date(default=lambda self: fields.Date.today())
+ from_hr_department = fields.Boolean()
+ employee_no = fields.Char(related="employee_id.emp_no", readonly=True)
+ note = fields.Text()
+ state = fields.Selection(selection=[
+ ("draft", _("Draft")),
+ ("submit", _("send")),
+ ("direct", _("Direct Manager")),
+ ("admin", _("Human Resources Manager")),
+ ("approve", _("Warehouse Keeper")),
+ ("done", _("Return Done")),
+ ("refuse", _("Refuse"))
+ ], default='draft')
+
+ # Relational fields
+ receiving_custody = fields.Many2one('hr.custody.receiving')
+ custody_line_ids = fields.One2many('employee.custody.line', 'employee_custody_line')
+ employee_id = fields.Many2one('hr.employee', 'Employee', default=lambda item: item.get_user_id(),
+ domain=[('state', '=', 'open')])
+ department_id = fields.Many2one(related="employee_id.department_id", readonly=True)
+ job_id = fields.Many2one(related="employee_id.job_id", readonly=True)
+ country_id = fields.Many2one(related="employee_id.country_id", readonly=True)
+ company_id = fields.Many2one(related="employee_id.company_id", store=True)
+
+ def draft(self):
+ self.state = "draft"
+
+ def submit(self):
+ self.state = "submit"
+
+ def direct(self):
+ self.state = "direct"
+
+ def admin(self):
+ self.state = "admin"
+
+ def approve(self):
+ self.state = "approve"
+
+ def done(self):
+ self.state = "done"
+
+ def refuse(self):
+ self.state = "refuse"
+
+ def get_user_id(self):
+ employee_id = self.env['hr.employee'].search([('user_id', '=', self.env.uid), ('state', '=', 'open')], limit=1)
+ if employee_id:
+ return employee_id.id
+ else:
+ return False
+
+ def unlink(self):
+ for i in self:
+ if i.state != 'draft':
+ raise ValidationError(_('You can not delete record in state not in draft'))
+ return super(EmployeeCustody, self).unlink()
+
+
+# EmployeeCustody()
+
+
+class EmployeeCustodyLine(models.Model):
+ _name = 'employee.custody.line'
+
+ name = fields.Char()
+ serial = fields.Char()
+ quantity = fields.Float()
+ receiving_quantity = fields.Float()
+ note = fields.Char()
+ receiving_date = fields.Date()
+ amount = fields.Float()
+
+ # Relational fields
+ employee_custody_line = fields.Many2one('custom.employee.custody') # Inverse field
+
+
+# EmployeeCustodyLine()
\ No newline at end of file
diff --git a/exp_employee_custody/models/receiving_employee_custody.py b/exp_employee_custody/models/receiving_employee_custody.py
new file mode 100644
index 0000000..16123bd
--- /dev/null
+++ b/exp_employee_custody/models/receiving_employee_custody.py
@@ -0,0 +1,252 @@
+from odoo import models, fields, api, _, exceptions
+from odoo import SUPERUSER_ID
+from datetime import datetime, date
+import calendar
+from pprint import pprint
+from odoo.exceptions import ValidationError
+
+
+class EmployeeReceiveCustody(models.Model):
+ _name = 'hr.custody.receiving'
+ _inherit = ['mail.thread', 'mail.activity.mixin']
+ _rec_name = 'employee_id'
+ _description = 'Receiving custody'
+
+ current_date = fields.Date(default=lambda self: fields.Date.today())
+ from_hr_department = fields.Boolean()
+ employee_no = fields.Char(related="employee_id.emp_no", readonly=True)
+ note = fields.Text()
+ deduction_amount = fields.Float()
+ salary_rule_flag = fields.Boolean()
+ state = fields.Selection(selection=[
+ ("draft", _("Draft")),
+ ("submit", _("send")),
+ ("direct", _("Direct Manager")),
+ ("admin", _("Human Resources Manager")),
+ ("approve", _("Warehouse Keeper")),
+ ("done", _("Return Done")),
+ ("refuse", _("Refuse"))
+ ], default='draft')
+ call_compute_function = fields.Char(compute='_get_custody_line_domain')
+
+ # Relational fields
+ department_id = fields.Many2one(related="employee_id.department_id", readonly=True)
+ job_id = fields.Many2one(related="employee_id.job_id", readonly=True)
+ country_id = fields.Many2one(related="employee_id.country_id", readonly=True)
+ return_custody_line_ids = fields.One2many('employee.return.custody.line', 'employee_return_custody_line_id',
+ store=True)
+ employee_id = fields.Many2one('hr.employee', 'Employee', default=lambda item: item.get_user_id())
+ salary_rule_id = fields.Many2one('hr.salary.rule', domain=['|', ('category_id.rule_type', '=', 'deduction'),
+ ('category_id.name', '=', 'Deduction')])
+ advantage_line_id = fields.Many2one('contract.advantage') # To save advantage line
+
+ def get_user_id(self):
+ employee_id = self.env['hr.employee'].search([('user_id', '=', self.env.uid)], limit=1)
+ if employee_id:
+ return employee_id.id
+ else:
+ return False
+
+
+ @api.depends('employee_id')
+ def _get_custody_line_domain(self):
+ for item in self:
+ item.return_custody_line_ids = [(0, 0, val) for val in []]
+ if item.employee_id:
+ employee_custody = self.env['custom.employee.custody'].search(
+ [('employee_id', '=', item.employee_id.id), ('state', 'in', ['approve', 'done'])])
+ items = []
+ for record in employee_custody:
+ if ((item.state == 'done' and record.state == 'done') and (
+ record.receiving_custody.id == item.id)) or record.state == 'approve':
+ for line in record.custody_line_ids:
+ if line.quantity - line.receiving_quantity > 0 and line.amount == 0:
+ items.append({
+ 'name': line.name,
+ 'serial': line.serial,
+ 'employee_return_custody_line_id': item.id,
+ 'quantity': line.quantity - line.receiving_quantity,
+ 'note': line.note,
+ 'custody_line_id': line.id})
+ item.return_custody_line_ids = [(0, 0, val) for val in items]
+
+ item.call_compute_function = ""
+
+ # Re-fill receive custody lines
+
+ def re_fill_receive_custody_lines(self):
+ for item in self:
+ item.return_custody_line_ids = False
+ if item.employee_id:
+ employee_custody = self.env['custom.employee.custody'].search(
+ [('employee_id', '=', item.employee_id.id), ('state', 'in', ['approve', 'done'])])
+ items = []
+ for record in employee_custody:
+ if ((item.state == 'done' and record.state == 'done') and (
+ record.receiving_custody.id == item.id)) or record.state == 'approve':
+ for line in record.custody_line_ids:
+ if line.quantity - line.receiving_quantity > 0 and line.amount == 0:
+ items.append({
+ 'name': line.name,
+ 'serial': line.serial,
+ 'employee_return_custody_line_id': item.id,
+ 'quantity': line.quantity - line.receiving_quantity,
+ 'note': line.note,
+ 'custody_line_id': line.id})
+ item.return_custody_line_ids = [(0, 0, val) for val in items]
+
+ @api.onchange('return_custody_line_ids')
+ def compute_deduction_amount(self):
+ total_amount = 0.0
+ for item in self:
+ item.salary_rule_flag = False
+ for line in item.return_custody_line_ids:
+ total_amount += line.deduction_amount
+ item.deduction_amount = total_amount
+
+ # salary_rule_flag Flag do visible salary rule
+ if item.deduction_amount > 0.0:
+ item.salary_rule_flag = True
+
+
+ def set_to_draft(self):
+ for item in self:
+ if item.employee_id and item.state == 'done':
+ employee_custody = self.env['custom.employee.custody'].search(
+ [('employee_id', '=', item.employee_id.id), ('state', 'in', ['done', 'approve'])])
+ for line in employee_custody:
+ for element in self.return_custody_line_ids:
+ for custody in line.custody_line_ids:
+ if custody.receiving_quantity > 0.0:
+ line.state = 'approve'
+ if element.custody_line_id.id == custody.id:
+ if custody.receiving_quantity - element.quantity >= 0:
+ custody.receiving_quantity = custody.receiving_quantity - element.quantity
+ custody.amount = 0.0
+ else:
+ raise ValidationError(_('Receiving quantity can not be negative value '))
+
+ # Remove contract advantage line when re-draft
+ if item.advantage_line_id:
+ item.advantage_line_id.unlink()
+
+ self.state = 'draft'
+
+ def send(self):
+ self.state = 'submit'
+
+ def dr_manager(self):
+ self.state = 'direct'
+
+
+ def dr_hr_manager(self):
+ self.state = 'admin'
+
+
+ def done(self):
+ for item in self:
+
+ # If return any custody quantity fill it in receiving quantity
+ for line in item.return_custody_line_ids:
+ if (line.custody_line_id.receiving_quantity + line.quantity) > line.custody_line_id.quantity:
+ raise ValidationError(_('Receiving quantity can not be greater than original quantity'))
+ else:
+ line.custody_line_id.receiving_quantity = line.custody_line_id.receiving_quantity + line.quantity
+ line.custody_line_id.amount = line.deduction_amount
+
+ if line.custody_line_id.receiving_quantity < 0.0:
+ raise ValidationError(_('Receiving quantity can not be negative value '))
+
+ if item.employee_id:
+ custody_not_complete = 0.0
+ employee_custody = self.env['custom.employee.custody'].search(
+ [('employee_id', '=', item.employee_id.id), ('state', '=', 'approve')])
+ for record in employee_custody:
+ record.write({
+ 'receiving_custody': item.id,
+ })
+
+ # Check all employee custody line are completed the change state to done
+ for record in employee_custody:
+ for line in record.custody_line_ids:
+ if line.receiving_quantity != line.quantity and line.amount == 0.0:
+ custody_not_complete += 1
+ if custody_not_complete == 0:
+ record.state = 'done'
+
+ # Move deduction amount to employee contract advantage lines
+ if item.employee_id.contract_id:
+ if item.deduction_amount and item.salary_rule_id:
+ contract = item.employee_id.contract_id
+ # get start and end date of the current month
+ current_date = date.today()
+ month_start = date(current_date.year, current_date.month, 1)
+ month_end = date(current_date.year, current_date.month, calendar.mdays[current_date.month])
+
+ advantage_line_id = self.env['contract.advantage'].create({
+ 'benefits_discounts': item.salary_rule_id.id,
+ 'type': 'customize',
+ 'date_from': month_start,
+ 'date_to': month_end,
+ 'amount': item.deduction_amount,
+ 'contract_advantage_id': contract.id,
+ })
+ item.advantage_line_id = advantage_line_id.id
+ else:
+ raise ValidationError(_('Employee "%s" has not contract !') % item.employee_id.name)
+
+ item.state = 'done'
+
+
+ def warehouse_keeper(self):
+ self.state = 'approve'
+
+
+ def refuse(self):
+ self.state = 'refuse'
+
+ # Override create function
+ # make sure the one2many return_custody_line_ids save changes when create and updates
+ # @api.model
+ # def create(self , values):
+ # deduction_amount = values.get('return_custody_line_ids')
+ # deduction_amount_list = []
+ # quantity_list = []
+ #
+ # for line in deduction_amount:
+ # deduction_amount_list.append(line[2]['deduction_amount'])
+ # quantity_list.append(line[2]['quantity'])
+ # print(deduction_amount)
+ # print(deduction_amount_list)
+ # res = super(EmployeeReceiveCustody ,self).create(values)
+ #
+ # index = 0
+ # for element in res.return_custody_line_ids:
+ # element.deduction_amount = deduction_amount_list[index]
+ # element.quantity = quantity_list[index]
+ # index +=1
+ #
+ # print(quantity_list)
+ # return res
+
+ # Override unlink function
+ def unlink(self):
+ for i in self:
+ if i.state != 'draft':
+ raise ValidationError(_('You can not delete record in state not in draft'))
+ return super(EmployeeReceiveCustody, self).unlink()
+
+
+class EmployeeReturnCustodyLine(models.Model):
+ _name = 'employee.return.custody.line'
+ _rec_name = 'name'
+
+ name = fields.Char()
+ serial = fields.Char()
+ quantity = fields.Float()
+ note = fields.Char()
+ deduction_amount = fields.Float()
+
+ # Relational fields
+ employee_return_custody_line_id = fields.Many2one(comodel_name='hr.custody.receiving') # inverse field
+ custody_line_id = fields.Many2one('employee.custody.line') # to save custody_id
\ No newline at end of file
diff --git a/exp_employee_custody/security/custody_security.xml b/exp_employee_custody/security/custody_security.xml
new file mode 100644
index 0000000..df61107
--- /dev/null
+++ b/exp_employee_custody/security/custody_security.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+ Employee custody multi company rule
+
+ ['|', ('company_id','=',False), ('company_id', 'in', company_ids)]
+
+
+
+ Employee: views custody
+
+ [('employee_id.user_id','=', user.id)]
+
+
+
+
+ Division manager: views custody of its subordinates
+
+ ['|',('employee_id.parent_id.user_id','=', user.id),('employee_id.coach_id.user_id','=', user.id)]
+
+
+
+
+ Allow HR : views custody of all employees
+
+ [(1 ,'=', 1)]
+
+
+
+
+ Employee: views its custody receiving records
+
+ [('employee_id.user_id','=', user.id)]
+
+
+
+
+ Division manager: views custody receiving records of its subordinates
+
+ ['|',('employee_id.parent_id.user_id','=', user.id),('employee_id.coach_id.user_id','=', user.id)]
+
+
+
+
+ Allow HR : views custody receiving records of all employees
+
+ [(1 ,'=', 1)]
+
+
+
+
+
+
\ No newline at end of file
diff --git a/exp_employee_custody/security/ir.model.access.csv b/exp_employee_custody/security/ir.model.access.csv
new file mode 100644
index 0000000..ad766a9
--- /dev/null
+++ b/exp_employee_custody/security/ir.model.access.csv
@@ -0,0 +1,6 @@
+id,name,model_id:id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
+access_hr_custody_receiving,access_hr_custody_receiving,exp_employee_custody.model_hr_custody_receiving,base.group_user,1,0,0,0
+access_hr_custody_receiving_emp,hr.custody.receiving.emp,exp_employee_custody.model_hr_custody_receiving,base.group_user,1,1,1,1
+access_employee_custody,access_employee_custody,exp_employee_custody.model_custom_employee_custody,base.group_user,1,1,1,1
+access_employee_custody_line,access_employee_custody_line,exp_employee_custody.model_employee_custody_line,base.group_user,1,1,1,1
+access_employee_return_custody_emp,Employee.return.custody.line.emp,exp_employee_custody.model_employee_return_custody_line,base.group_user,1,1,1,1
diff --git a/exp_employee_custody/views/employee_custody_views.xml b/exp_employee_custody/views/employee_custody_views.xml
new file mode 100644
index 0000000..517205f
--- /dev/null
+++ b/exp_employee_custody/views/employee_custody_views.xml
@@ -0,0 +1,126 @@
+
+
+
+
+ Employee Custody
+ custom.employee.custody
+ list,form
+
+
+
+ Employee Custody
+ custom.employee.custody
+
+
+
+
+
+
+ Employee Custody
+ custom.employee.custody
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/exp_employee_custody/views/receiving_employee_custody.xml b/exp_employee_custody/views/receiving_employee_custody.xml
new file mode 100644
index 0000000..b98294d
--- /dev/null
+++ b/exp_employee_custody/views/receiving_employee_custody.xml
@@ -0,0 +1,114 @@
+
+
+
+
+ Receiving Employee Custody
+ hr.custody.receiving
+ list,form
+
+
+
+ Receiving Employee Custody
+ hr.custody.receiving
+
+
+
+
+
+
+ Receiving Employee Custody
+ hr.custody.receiving
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file