commit
bd945f5050
|
|
@ -9,6 +9,7 @@ from odoo.exceptions import UserError
|
|||
class HrAttendanceTransactions(models.Model):
|
||||
_name = 'hr.attendance.transaction'
|
||||
_rec_name = 'employee_id'
|
||||
_order = 'date DESC'
|
||||
|
||||
date = fields.Date(string='Day')
|
||||
lateness = fields.Float(compute='get_hours')
|
||||
|
|
|
|||
|
|
@ -44,14 +44,14 @@
|
|||
</group>
|
||||
<group>
|
||||
<group>
|
||||
<field name="date" required="1"/>
|
||||
<field name="calendar_id" />
|
||||
<field name="attending_type" />
|
||||
<field name="sequence" />
|
||||
<field name="date" required="1" readonly="1"/>
|
||||
<field name="calendar_id" readonly="1"/>
|
||||
<field name="attending_type" readonly="1"/>
|
||||
<field name="sequence" readonly="1"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="sign_in" widget="float_time" required="1"/>
|
||||
<field name="sign_out" widget="float_time" required="1"/>
|
||||
<field name="sign_in" widget="float_time" required="1" readonly="1"/>
|
||||
<field name="sign_out" widget="float_time" required="1" readonly="1"/>
|
||||
</group>
|
||||
</group>
|
||||
<group name="attendance">
|
||||
|
|
@ -62,11 +62,11 @@
|
|||
<field name="early_exit" string="Early Exit" widget="float_time" required="1" readonly="1"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="plan_hours" widget="float_time"/>
|
||||
<field name="office_hours" widget="float_time"/>
|
||||
<field name="official_hours" widget="float_time"/>
|
||||
<field name="carried_hours" widget="float_time"/>
|
||||
<field name="break_duration" widget="float_time"/>
|
||||
<field name="plan_hours" widget="float_time" readonly="1"/>
|
||||
<field name="office_hours" widget="float_time" readonly="1"/>
|
||||
<field name="official_hours" widget="float_time" readonly="1"/>
|
||||
<field name="carried_hours" widget="float_time" readonly="1"/>
|
||||
<field name="break_duration" widget="float_time" readonly="1"/>
|
||||
</group>
|
||||
</group>
|
||||
</sheet>
|
||||
|
|
|
|||
|
|
@ -2518,19 +2518,6 @@ msgstr "السبب"
|
|||
msgid "Receiving driving License :"
|
||||
msgstr "استلام رخصة القيادة:"
|
||||
|
||||
#. module: employee_requests
|
||||
#: code:addons/employee_requests/models/hr_clearance_form.py:0
|
||||
#: code:addons/employee_requests/models/hr_clearance_form.py:0
|
||||
#: code:addons/employee_requests/models/hr_clearance_form.py:0
|
||||
#: code:addons/employee_requests/models/hr_clearance_form.py:0
|
||||
#: code:addons/employee_requests/models/hr_clearance_form.py:0
|
||||
#: code:addons/employee_requests/models/other_request.py:0
|
||||
#: model_terms:ir.ui.view,arch_db:employee_requests.employee_clearance_form_form_view
|
||||
#: model_terms:ir.ui.view,arch_db:employee_requests.employee_other_request_form_view
|
||||
#, python-format
|
||||
msgid "Refuse"
|
||||
msgstr "مرفوض"
|
||||
|
||||
#. module: employee_requests
|
||||
#: model:ir.model.fields,field_description:employee_requests.field_hr_personal_permission__refuse_cause
|
||||
msgid "Refuse Cause"
|
||||
|
|
@ -2539,17 +2526,24 @@ msgstr "سبب الرفض"
|
|||
#. module: employee_requests
|
||||
#: code:addons/employee_requests/models/employee_department_jobs.py:0
|
||||
#: code:addons/employee_requests/models/employee_effective_form.py:0
|
||||
#: code:addons/employee_requests/models/employee_overtime_request.py:0
|
||||
#: code:addons/employee_requests/models/house_allowance_advance.py:0
|
||||
#: code:addons/employee_requests/models/hr_personal_permission.py:0
|
||||
#: model_terms:ir.ui.view,arch_db:employee_requests.employee_department_jobs_form_view
|
||||
#: model_terms:ir.ui.view,arch_db:employee_requests.employee_overtime_request_form_view
|
||||
#: model_terms:ir.ui.view,arch_db:employee_requests.employee_personal_permission_form_view
|
||||
#: model_terms:ir.ui.view,arch_db:employee_requests.employee_request_effective_form_view
|
||||
#, python-format
|
||||
msgid "Refused"
|
||||
msgstr "مرفوض"
|
||||
|
||||
#. module: employee_requests
|
||||
#: code:addons/employee_requests/models/employee_overtime_request.py:0
|
||||
#: code:addons/employee_requests/models/hr_personal_permission.py:0
|
||||
#: model_terms:ir.ui.view,arch_db:employee_requests.employee_clearance_form_form_view
|
||||
#: model_terms:ir.ui.view,arch_db:employee_requests.employee_other_request_form_view
|
||||
#: model_terms:ir.ui.view,arch_db:employee_requests.employee_overtime_request_form_view
|
||||
#: model_terms:ir.ui.view,arch_db:employee_requests.employee_personal_permission_form_view
|
||||
#, python-format
|
||||
msgid "Refuse"
|
||||
msgstr "رفض"
|
||||
|
||||
#. module: employee_requests
|
||||
#: model:ir.model.fields,field_description:employee_requests.field_hr_personal_permission__refused_by
|
||||
msgid "Refused By"
|
||||
|
|
@ -3800,3 +3794,21 @@ msgstr "طلب تثبيت راتب"
|
|||
#: model_terms:ir.ui.view,arch_db:employee_requests.employee_other_request_form_view
|
||||
msgid "Print Salary Confirmation"
|
||||
msgstr "طباعة تثبيت الراتب"
|
||||
|
||||
#. module: employee_requests
|
||||
#: code:addons/employee_requests/models/hr_personal_permission.py:0
|
||||
#, python-format
|
||||
msgid "Sorry, The Approval For The Direct Manager '%s' Only OR HR Manager!"
|
||||
msgstr "للأسف، لموافقة المدير المباشر '%s' فقط او مدير الموارد البشرية !"
|
||||
|
||||
#. module: employee_requests
|
||||
#: code:addons/employee_requests/models/employee_overtime_request.py:0
|
||||
#, python-format
|
||||
msgid "Sorry, The Approval For The Direct Manager '%s' Only OR HR Manager!"
|
||||
msgstr "للأسف، لموافقة المدير المباشر '%s' فقط او مدير الموارد البشرية !"
|
||||
|
||||
#. module: employee_requests
|
||||
#: code:addons/employee_requests/models/employee_overtime_request.py:0
|
||||
#, python-format
|
||||
msgid "Sorry, The Approval For The Department Manager '%s' Only OR HR Manager!"
|
||||
msgstr "للأسف، لموافقة مدير الإدارة '%s' فقط او مدير الموارد البشرية !"
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ class employee_overtime_request(models.Model):
|
|||
_name = 'employee.overtime.request'
|
||||
_rec_name = 'request_date'
|
||||
_inherit = ['mail.thread', 'mail.activity.mixin']
|
||||
_order = 'request_date DESC'
|
||||
|
||||
request_date = fields.Date(default=lambda self: fields.Date.today())
|
||||
reason = fields.Text()
|
||||
|
|
@ -146,11 +147,27 @@ class employee_overtime_request(models.Model):
|
|||
|
||||
def direct_manager(self):
|
||||
self.chick_not_mission()
|
||||
self.state = "direct_manager"
|
||||
#self.state = "direct_manager"
|
||||
for rec in self:
|
||||
if rec.employee_id.parent_id:
|
||||
if rec.employee_id.parent_id.user_id.id == rec.env.uid or rec.env.company.hr_manager_id.user_id.id == rec.env.uid:
|
||||
rec.write({'state': 'direct_manager'})
|
||||
else:
|
||||
raise exceptions.Warning(_("Sorry, The Approval For The Direct Manager '%s' Only OR HR Manager!")%(rec.employee_id.parent_id.name))
|
||||
else:
|
||||
rec.write({'state': 'direct_manager'})
|
||||
|
||||
def financial_manager(self):
|
||||
self.chick_not_mission()
|
||||
self.state = "financial_manager"
|
||||
#self.state = "financial_manager"
|
||||
for rec in self:
|
||||
if rec.employee_id.coach_id:
|
||||
if rec.employee_id.coach_id.user_id.id == rec.env.uid or rec.env.company.hr_manager_id.user_id.id == rec.env.uid:
|
||||
rec.write({'state': 'financial_manager'})
|
||||
else:
|
||||
raise exceptions.Warning(_("Sorry, The Approval For The Department Manager '%s' Only OR HR Manager!")%(rec.employee_id.coach_id.name))
|
||||
else:
|
||||
rec.write({'state': 'financial_manager'})
|
||||
|
||||
def hr_aaproval(self):
|
||||
self.chick_not_mission()
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ class HrPersonalPermission(models.Model):
|
|||
_name = 'hr.personal.permission'
|
||||
_rec_name = 'employee_id'
|
||||
_inherit = ['mail.thread', 'mail.activity.mixin']
|
||||
_order = 'date DESC'
|
||||
|
||||
from_hr_department = fields.Boolean()
|
||||
date = fields.Date(default=lambda self: fields.Date.today())
|
||||
|
|
@ -21,12 +22,9 @@ class HrPersonalPermission(models.Model):
|
|||
duration = fields.Float(compute='get_duration_no' ,store=True)
|
||||
employee_contract_id = fields.Many2one(comodel_name='hr.contract.type')
|
||||
balance = fields.Float(related='employee_id.contract_id.working_hours.permission_hours')
|
||||
|
||||
permission_number = fields.Float(store=True, readonly=True,
|
||||
help='The Remaining Number of Hours permission This Month')
|
||||
permission_number = fields.Float(store=True, readonly=True, help='The Remaining Number of Hours permission This Month')
|
||||
early_exit = fields.Boolean()
|
||||
mission_purpose = fields.Text()
|
||||
|
||||
employee_no = fields.Char(related='employee_id.emp_no', readonly=True)
|
||||
job_id = fields.Many2one(related='employee_id.job_id', readonly=True)
|
||||
department_id = fields.Many2one(related='employee_id.department_id', readonly=True)
|
||||
|
|
@ -34,20 +32,40 @@ class HrPersonalPermission(models.Model):
|
|||
attach_ids = fields.One2many('ir.attachment', 'personal_permission_id')
|
||||
approved_by = fields.Many2one(comodel_name='res.users')
|
||||
refused_by = fields.Many2one(comodel_name='res.users')
|
||||
employee_id = fields.Many2one('hr.employee', 'Employee Id', default=lambda item: item.get_user_id(),
|
||||
domain=[('state', '=', 'open')])
|
||||
|
||||
state = fields.Selection(
|
||||
[('draft', _('Draft')), ('send', _('Waiting Direct Manager')), ('direct_manager', _('Wait HR Department')),
|
||||
('approve', _('Approved'))
|
||||
, ('refused', _('Refused'))], default="draft", tracking=True)
|
||||
|
||||
type_exit = fields.Selection(
|
||||
[('early_exit', _('Early Exit')), ('late entry', _('Late Entry')), ('during work', _('During Work'))],
|
||||
default="early_exit")
|
||||
|
||||
employee_id = fields.Many2one('hr.employee', 'Employee Id', default=lambda item: item.get_user_id(),domain=[('state', '=', 'open')])
|
||||
state = fields.Selection([('draft', _('Draft')), ('send', _('Waiting Direct Manager')), ('direct_manager', _('Wait HR Department')),('approve', _('Approved')), ('refused', _('Refused'))], default="draft", tracking=True)
|
||||
type_exit = fields.Selection([('early_exit', _('Early Exit')), ('late entry', _('Late Entry')), ('during work', _('During Work'))],default="early_exit")
|
||||
company_id = fields.Many2one('res.company',string="Company", default=lambda self: self.env.user.company_id)
|
||||
time_permission_from = fields.Float(string="Permission From (24h format)", help="Time in 24-hour format (e.g., 13.5 for 1:30 PM)")
|
||||
time_permission_to = fields.Float(string="Permission To (24h format)", help="Time in 24-hour format (e.g., 15.75 for 3:45 PM)")
|
||||
|
||||
|
||||
@api.onchange('time_permission_from', 'time_permission_to', 'date')
|
||||
def _onchange_time(self):
|
||||
for record in self:
|
||||
if (not record.time_permission_from < record.time_permission_to):
|
||||
record.time_permission_to = record.time_permission_from + 0.5
|
||||
record.time_permission_from = record.time_permission_from
|
||||
if record.date:
|
||||
date_from = self._combine_date_and_time(record.date, record.time_permission_from)
|
||||
record.date_from = date_from
|
||||
|
||||
if record.date:
|
||||
date_to = self._combine_date_and_time(record.date, record.time_permission_to)
|
||||
record.date_to = date_to
|
||||
|
||||
def _combine_date_and_time(self, date, time_float):
|
||||
""" Combine a date and a float time (e.g. 13.5) into a datetime object. """
|
||||
hours = int(time_float)
|
||||
minutes = int((time_float - hours) * 60)
|
||||
import pytz
|
||||
date_time = datetime.combine(date, datetime.min.time()) + timedelta(hours=hours, minutes=minutes)
|
||||
# if time_float > 0:
|
||||
date_time = fields.Datetime.to_string(pytz.timezone(self.env.context['tz']).localize(fields.Datetime.from_string(date_time), is_dst=None).astimezone(pytz.utc))
|
||||
# date_time = fields.Datetime.to_string(pytz.timezone(self.env.context['tz']).localize(fields.Datetime.from_string(date_time), is_dst=None).astimezone(pytz.utc) + timedelta(hours=24))
|
||||
return date_time
|
||||
|
||||
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
new_record = super(HrPersonalPermission, self).create(vals)
|
||||
|
|
@ -79,6 +97,7 @@ class HrPersonalPermission(models.Model):
|
|||
@api.depends('date_from', 'date_to')
|
||||
def get_duration_no(self):
|
||||
for item in self:
|
||||
item._onchange_time()
|
||||
if item.date_from and item.date_to:
|
||||
start_date_value = datetime.strptime(str(item.date_from), "%Y-%m-%d %H:%M:%S")
|
||||
end_date = datetime.strptime(str(item.date_to), "%Y-%m-%d %H:%M:%S")
|
||||
|
|
@ -93,6 +112,7 @@ class HrPersonalPermission(models.Model):
|
|||
@api.onchange('date_to', 'date_from', 'employee_id')
|
||||
def permission_number_decrement(self):
|
||||
for item in self:
|
||||
item._onchange_time()
|
||||
if item.employee_id:
|
||||
if not item.employee_id.first_hiring_date:
|
||||
raise exceptions.Warning(
|
||||
|
|
@ -272,7 +292,15 @@ class HrPersonalPermission(models.Model):
|
|||
self.state = "send"
|
||||
|
||||
def direct_manager(self):
|
||||
self.state = "direct_manager"
|
||||
#self.state = "direct_manager"
|
||||
for rec in self:
|
||||
if rec.employee_id.parent_id:
|
||||
if rec.employee_id.parent_id.user_id.id == rec.env.uid or rec.env.company.hr_manager_id.user_id.id == rec.env.uid:
|
||||
rec.write({'state': 'direct_manager'})
|
||||
else:
|
||||
raise exceptions.Warning(_("Sorry, The Approval For The Direct Manager '%s' Only OR HR Manager!")%(rec.employee_id.parent_id.name))
|
||||
else:
|
||||
rec.write({'state': 'direct_manager'})
|
||||
|
||||
def approve(self):
|
||||
self.state = "approve"
|
||||
|
|
|
|||
|
|
@ -30,30 +30,30 @@
|
|||
|
||||
<button name="direct_manager" string="Direct Manager Approve" class="oe_highlight" type="object"
|
||||
states="submit" groups="hr_base.group_division_manager"/>
|
||||
<button name="refused" string="Refused" class="oe_highlight" type="object"
|
||||
<button name="refused" string="Refuse" class="oe_highlight" type="object"
|
||||
states="submit" groups="hr_base.group_division_manager"/>
|
||||
|
||||
<button name="financial_manager" string="Department Manager" class="oe_highlight" type="object"
|
||||
states="direct_manager" groups="hr_base.group_department_manager"/>
|
||||
<button name="refused" string="Refused" class="oe_highlight" type="object"
|
||||
<button name="refused" string="Refuse" class="oe_highlight" type="object"
|
||||
states="direct_manager" groups="hr_base.group_department_manager"/>
|
||||
|
||||
<button name="hr_aaproval" string="HR Approval" class="oe_highlight" type="object"
|
||||
states="financial_manager" groups="hr.group_hr_user, hr.group_hr_manager"/>
|
||||
<button name="refused" string="Refused" class="oe_highlight" type="object"
|
||||
<button name="refused" string="Refuse" class="oe_highlight" type="object"
|
||||
states="financial_manager" groups="hr.group_hr_user, hr.group_hr_manager"/>
|
||||
|
||||
<button name="executive_office" string="Executive Approval" class="oe_highlight" type="object"
|
||||
groups="hr_base.group_general_manager,hr_base.group_executive_manager"
|
||||
attrs="{'invisible':['|',('state','!=','hr_aaproval'),('exception','!=',True)]}"/>
|
||||
<button name="refused" string="Refused" class="oe_highlight" type="object"
|
||||
<button name="refused" string="Refuse" class="oe_highlight" type="object"
|
||||
groups="hr_base.group_general_manager,hr_base.group_executive_manager"
|
||||
attrs="{'invisible':['|',('state','!=','hr_aaproval'),('exception','!=',True)]}"/>
|
||||
|
||||
<button name="validated" string="Finance Approval" class="oe_highlight" type="object"
|
||||
groups="hr_base.group_account_manager"
|
||||
states="executive_office"/>
|
||||
<button name="refused" string="Refused" class="oe_highlight" type="object"
|
||||
<button name="refused" string="Refuse" class="oe_highlight" type="object"
|
||||
states="executive_office" groups="hr_base.group_account_manager"/>
|
||||
|
||||
<button name="re_draft" string="RE-Draft" class="oe_highlight" type="object"
|
||||
|
|
|
|||
|
|
@ -30,12 +30,12 @@
|
|||
|
||||
<button name="direct_manager" string="Direct Manager Approve" class="oe_highlight" type="object"
|
||||
states="send" groups="hr_base.group_division_manager"/>
|
||||
<button name="refused" string="Refused" class="oe_highlight" type="object"
|
||||
<button name="refused" string="Refuse" class="oe_highlight" type="object"
|
||||
states="send" groups="hr_base.group_division_manager"/>
|
||||
|
||||
<button name="approve" string="HR Approve" class="oe_highlight" type="object"
|
||||
states="direct_manager" groups="hr.group_hr_user"/>
|
||||
<button name="refused" string="Refused" class="oe_highlight" type="object"
|
||||
<button name="refused" string="Refuse" class="oe_highlight" type="object"
|
||||
states="direct_manager" groups="hr.group_hr_user"/>
|
||||
<button name="draft_state" string="RE-Draft" class="oe_highlight" type="object"
|
||||
states="approve" groups="hr.group_hr_user"/>
|
||||
|
|
|
|||
|
|
@ -196,7 +196,7 @@ msgstr "وضع تخصيص"
|
|||
#: model:ir.model.fields.selection,name:hr_holidays_community.selection__hr_holidays__type__add
|
||||
#: model:ir.ui.menu,name:hr_holidays_community.menu_open_allocation_holidays
|
||||
msgid "Allocation Request"
|
||||
msgstr "طلب التوزيع"
|
||||
msgstr "طلب اضافة رصيد"
|
||||
|
||||
#. module: hr_holidays_community
|
||||
#: model_terms:ir.ui.view,arch_db:hr_holidays_community.hr_department_view_kanban
|
||||
|
|
|
|||
|
|
@ -3583,3 +3583,9 @@ msgstr ""
|
|||
msgid "وفـاة"
|
||||
msgstr ""
|
||||
|
||||
|
||||
#. module: hr_holidays_public
|
||||
#: code:addons/hr_holidays_public/models/hr_holidays.py:0
|
||||
#, python-format
|
||||
msgid "Sorry, The Approval For The Direct Manager '%s' Only OR HR Manager!"
|
||||
msgstr "للأسف، لموافقة المدير المباشر '%s' فقط او مدير الموارد البشرية !"
|
||||
|
|
|
|||
|
|
@ -981,6 +981,15 @@ class HRHolidays(models.Model):
|
|||
else:
|
||||
raise exceptions.Warning(
|
||||
_('Sorry This %s requires a Documents To Be Attached To Approve') % (self.holiday_status_id.name))
|
||||
#The Approval For The Direct Manager only
|
||||
for rec in self:
|
||||
if rec.employee_id.parent_id:
|
||||
if rec.employee_id.parent_id.user_id.id == rec.env.uid or rec.env.company.hr_manager_id.user_id.id == rec.env.uid:
|
||||
rec.write({'state': 'direct_manager'})
|
||||
else:
|
||||
raise exceptions.Warning(_("Sorry, The Approval For The Direct Manager '%s' Only OR HR Manager!")%(rec.employee_id.parent_id.name))
|
||||
else:
|
||||
rec.write({'state': 'direct_manager'})
|
||||
|
||||
self._chick_leave_balance()
|
||||
self.write({'state': 'validate'})
|
||||
|
|
|
|||
|
|
@ -109,21 +109,23 @@ class HrHolidaysStatus(models.Model):
|
|||
leaves = self.browse(leave_ids)
|
||||
sort_key = lambda l: (l.leave_type, l.sickness_severity, l.virtual_remaining_leaves)
|
||||
employee_id = self._context.get('employee_id')
|
||||
balance = self.env['hr.holidays'].search([
|
||||
('employee_id', '=', int(employee_id)),
|
||||
('holiday_status_id.leave_type', '!=', 'sick'),
|
||||
('type', '=', 'add'),
|
||||
('check_allocation_view', '=', 'balance')
|
||||
]).mapped('holiday_status_id')
|
||||
balance_sick = self.env['hr.holidays'].search([
|
||||
('employee_id', '=', int(employee_id)),
|
||||
('holiday_status_id.leave_type', '=', 'sick'),
|
||||
('type', '=', 'add'),
|
||||
('check_allocation_view', '=', 'balance'),
|
||||
('remaining_leaves', '>', 0)
|
||||
]).mapped('holiday_status_id').sorted(key=lambda eval: eval.sickness_severity, reverse=False)
|
||||
balance_sick = balance_sick and balance_sick[0] or balance_sick
|
||||
leaves = balance | balance_sick
|
||||
type_holiday = self._context.get('type')
|
||||
if type_holiday == "remove":
|
||||
balance = self.env['hr.holidays'].search([
|
||||
('employee_id', '=', int(employee_id)),
|
||||
('holiday_status_id.leave_type', '!=', 'sick'),
|
||||
('type', '=', 'add'),
|
||||
('check_allocation_view', '=', 'balance')
|
||||
]).mapped('holiday_status_id')
|
||||
balance_sick = self.env['hr.holidays'].search([
|
||||
('employee_id', '=', int(employee_id)),
|
||||
('holiday_status_id.leave_type', '=', 'sick'),
|
||||
('type', '=', 'add'),
|
||||
('check_allocation_view', '=', 'balance'),
|
||||
('remaining_leaves', '>', 0)
|
||||
]).mapped('holiday_status_id').sorted(key=lambda eval: eval.sickness_severity, reverse=False)
|
||||
balance_sick = balance_sick and balance_sick[0] or balance_sick
|
||||
leaves = balance | balance_sick
|
||||
return leaves.sorted(key=sort_key, reverse=False).ids
|
||||
return leave_ids
|
||||
|
||||
|
|
|
|||
|
|
@ -24,6 +24,11 @@
|
|||
hr_base.group_division_manager,hr_holidays_community.group_hr_holidays_user
|
||||
</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='holiday_status_id']" position="attributes">
|
||||
<attribute name="context">
|
||||
{'employee_id':employee_id,'type':type}
|
||||
</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='department_id']" position="attributes">
|
||||
<attribute name="readonly">True</attribute>
|
||||
<attribute name="required">True</attribute>
|
||||
|
|
|
|||
Loading…
Reference in New Issue