diff --git a/odex25_hr/exp_official_mission/i18n/ar_001.po b/odex25_hr/exp_official_mission/i18n/ar_001.po index 9470c6d2b..c1baadb38 100644 --- a/odex25_hr/exp_official_mission/i18n/ar_001.po +++ b/odex25_hr/exp_official_mission/i18n/ar_001.po @@ -678,6 +678,14 @@ msgstr "المدة بالايــام" msgid "Duration Hours" msgstr "المدة بالساعات" + + +#. module: exp_official_mission +#: model_terms:ir.ui.view,arch_db:exp_official_mission.employee_especially_hours_form_view +#: model_terms:ir.ui.view,arch_db:exp_official_mission.employee_training_form_view +msgid "Total Hours" +msgstr "مجموع الساعات" + #. module: exp_official_mission #: model:ir.model.fields,field_description:exp_official_mission.field_hr_official_mission__duration_type #: model:ir.model.fields,field_description:exp_official_mission.field_hr_official_mission_type__duration_type @@ -2597,6 +2605,28 @@ msgstr "المدرب" msgid "Training Details" msgstr "تفاصيل الدورة التدريبية" +#. module: exp_official_mission +#: model:ir.model.fields,field_description:exp_official_mission.field_hr_official_mission__training_details +#: model:ir.model.fields,field_description:exp_official_mission.field_hr_official_mission_employee__training_details +#: model_terms:ir.ui.view,arch_db:exp_official_mission.employee_training_form_view +msgid "Training Table" +msgstr "جدول الدورة" + +#. module: exp_official_mission +#: model:ir.model.fields,field_description:exp_official_mission.field_hr_official_mission__training_details +#: model:ir.model.fields,field_description:exp_official_mission.field_hr_official_mission_employee__training_details +#: model_terms:ir.ui.view,arch_db:exp_official_mission.employee_training_form_view +msgid "Description" +msgstr "وصف" + +#. module: exp_official_mission +#: model:ir.model.fields,field_description:exp_official_mission.field_hr_official_mission__training_details +#: model:ir.model.fields,field_description:exp_official_mission.field_hr_official_mission_employee__training_details +#: model_terms:ir.ui.view,arch_db:exp_official_mission.employee_training_form_view +msgid "Trainer" +msgstr "المدرب" + + #. module: exp_official_mission #: code:addons/exp_official_mission/models/hr_official_mission.py:0 #: model:ir.actions.act_window,name:exp_official_mission.action_training_appraisal_wizard @@ -2681,6 +2711,13 @@ msgstr "اقصى ايام للسنة" msgid "Sorry The Employee %s, The Number of Requests Cannot Exceed %s Maximum Days Per year." msgstr "للأسف الموظف %s, لايمكن تجاوز عدد ايام الطلبات %s يوم وهي اقصى أيام للإنتدابات بالسنة." +#. module: exp_official_mission +#: code:addons/exp_official_mission/models/hr_official_mission.py:0 +#, python-format +msgid "The mission date %(date)s must be between destination's date from %(date_from)s and date to %(date_to)s." +msgstr "يجب أن يكون تاريخ المهمة %(date)s بين تاريخ البداية %(date_from)s وتاريخ النهاية %(date_to)s للوجهة." + + #. module: exp_official_mission #: code:addons/exp_official_mission/models/hr_official_mission.py:0 #, python-format diff --git a/odex25_hr/exp_official_mission/models/hr_official_mission.py b/odex25_hr/exp_official_mission/models/hr_official_mission.py index 4c3cec17b..fda9e7628 100644 --- a/odex25_hr/exp_official_mission/models/hr_official_mission.py +++ b/odex25_hr/exp_official_mission/models/hr_official_mission.py @@ -24,6 +24,7 @@ class HrOfficialMission(models.Model): hour_to = fields.Float(default=16) date_duration = fields.Float() hour_duration = fields.Float(default=8) + total_hours = fields.Float() balance = fields.Float() early_exit = fields.Boolean() mission_purpose = fields.Text() @@ -43,6 +44,8 @@ class HrOfficialMission(models.Model): department_id = fields.Many2many('hr.department') attach_ids = fields.One2many('ir.attachment', 'mission_id') employee_ids = fields.One2many('hr.official.mission.employee', 'official_mission_id') + table_ids = fields.One2many('mission.table', 'destination_id',) + approved_by = fields.Many2one(comodel_name='res.users') refused_by = fields.Many2one(comodel_name='res.users') mission_type = fields.Many2one('hr.official.mission.type', tracking=True) @@ -99,6 +102,12 @@ class HrOfficialMission(models.Model): appraisal_count = fields.Integer(string="Appraisals", compute="get_employees_appraisal") hr_nomination = fields.Boolean(string="HR Nomination") + @api.onchange('hour_duration', 'date_duration') + def compute_number_of_hours(self): + for item in self: + + item.total_hours = item.hour_duration * item.date_duration + '''@api.constrains('employee_ids') @@ -252,7 +261,7 @@ class HrOfficialMission(models.Model): raise exceptions.Warning( _('Employee %s, The course does not follow the career record') % emp.employee_id.name) - @api.onchange('date_from', 'date_to', 'hour_to', 'hour_from', 'mission_type', 'state') + @api.onchange('date_from', 'date_to', 'hour_to', 'hour_from', 'mission_type', 'state','table_ids') def _get_mission_no(self): for item in self: @@ -266,8 +275,12 @@ class HrOfficialMission(models.Model): end_mission_date = datetime.strptime(str(item.date_to), "%Y-%m-%d") if end_mission_date >= start_mission_date: - days = (end_mission_date - start_mission_date).days - item.date_duration = days + 1 + if not item.table_ids: + days = (end_mission_date - start_mission_date).days + item.date_duration = days + 1 + else: + unique_dates = set(item.table_ids.mapped('date')) + item.date_duration = len(unique_dates) else: # item.duration = 0.0 raise exceptions.Warning(_('Date Form Must Be Less than Date To')) @@ -1630,3 +1643,33 @@ class HrContract(models.Model): status = 'work' active_mission_id = False emp_rec.write({'work_state': status, 'active_mission_id': active_mission_id}) + + + + +class MissionTable(models.Model): + _name = 'mission.table' + _rec_name = 'description' + _inherit = ['mail.thread', 'mail.activity.mixin'] + + description = fields.Char(translate=True,string='Description') + + date = fields.Date() + + hour_from = fields.Float(default=8) + hour_to = fields.Float(default=16) + trainer_id = fields.Many2one('res.partner', string="Trainer") + destination_id = fields.Many2one('hr.official.mission', string="Destination ") + + @api.constrains('date', 'destination_id') + def _check_date_within_destination(self): + for rec in self: + if rec.destination_id and rec.date: + date_from = rec.destination_id.date_from + date_to = rec.destination_id.date_to + if date_from and date_to: + if not (date_from <= rec.date <= date_to): + raise exceptions.ValidationError( + _("The mission date %(date)s must be between destination's date from %(date_from)s and date to %(date_to)s.", + date=rec.date, date_from=date_from, date_to=date_to) + ) diff --git a/odex25_hr/exp_official_mission/security/ir.model.access.csv b/odex25_hr/exp_official_mission/security/ir.model.access.csv index bc3442cca..c428351d0 100644 --- a/odex25_hr/exp_official_mission/security/ir.model.access.csv +++ b/odex25_hr/exp_official_mission/security/ir.model.access.csv @@ -14,3 +14,5 @@ access_employee_mission_selection_wizard,employee.mission.selection.wizard,model access_training_appraisal_wizard,training_appraisal_wizard,model_training_appraisal_wizard,base.group_user,1,1,1,1 access_hr_mission_type_account_hr_user,access_hr_mission_type_account,model_hr_mission_type_account,hr.group_hr_user,1,1,1,1 access_hr_mission_type_account_emp,access_hr_mission_type_account,model_hr_mission_type_account,base.group_user,1,0,0,0 + +access_mission_table,access_mission_table,model_mission_table,base.group_user,1,1,1,1 diff --git a/odex25_hr/exp_official_mission/views/training.xml b/odex25_hr/exp_official_mission/views/training.xml index 9c46a8b03..a1dd4be13 100644 --- a/odex25_hr/exp_official_mission/views/training.xml +++ b/odex25_hr/exp_official_mission/views/training.xml @@ -97,6 +97,9 @@ + + @@ -225,7 +228,7 @@ - + + + + + + + + + + + + + + + @@ -350,6 +370,8 @@ + +