添加功能
This commit is contained in:
@@ -25,6 +25,8 @@ class CardApprovals(models.Model):
|
||||
reason_application = fields.Html(string="申请事由")
|
||||
documents_ids = fields.Many2many('ir.attachment', string="附件")
|
||||
attendance_id = fields.Many2one('hr.attendance', string="补卡日期")
|
||||
attendance = fields.Char(string="补卡日期")
|
||||
is_attendance = fields.Boolean(string="字段隐藏")
|
||||
replacement_time = fields.Selection([('work', '上班卡'), ('quitting', '下班卡'), ('all', '全天卡')], string="补卡", store=True)
|
||||
active = fields.Boolean('Active', default=True)
|
||||
urgency_level = fields.Selection([('normal', '普件'), ('urgent', '急件'), ('emergency', '特急件')], string='紧急度',
|
||||
@@ -39,6 +41,7 @@ class CardApprovals(models.Model):
|
||||
@api.onchange('attendance_id')
|
||||
def onchange_replacement_time(self):
|
||||
for rep in self:
|
||||
rep.attendance = rep.attendance_id.display_name
|
||||
rep.replacement_time = None
|
||||
if rep.attendance_id.is_early_card and not rep.attendance_id.is_late_card:
|
||||
rep.replacement_time = 'quitting'
|
||||
@@ -71,41 +74,48 @@ class CardApprovals(models.Model):
|
||||
record.name = f"{record.users_id.name}补卡"
|
||||
|
||||
def confirm_approval(self):
|
||||
if not self.users_id.employee_id.resource_id.calendar_id:
|
||||
planning_id = self.env['planning.slot.template'].search([('planning_name', '=', self.shift_id.template_id.planning_name), ('department_id.name', '=', self.shift_id.role_id.name)], limit=1)
|
||||
start_hour = int(planning_id.start_time)
|
||||
end_hour = float(planning_id.end_time)
|
||||
hour = int(end_hour) # 小时部分
|
||||
current_datetime = datetime.combine(self.attendance_id.current_data, time(0, 0, 0))
|
||||
start_time = current_datetime.replace(hour=start_hour) - timedelta(hours=8)
|
||||
end_time = current_datetime.replace(hour=hour)- timedelta(hours=8)
|
||||
self.attendance_id.write({'check_in': start_time, 'check_out': end_time})
|
||||
else:
|
||||
min_hour_from = self.users_id.employee_id.resource_id.calendar_id.attendance_ids[0].hour_from
|
||||
min_hour = int(min_hour_from)
|
||||
min_minute = int(min_hour_from * 10 % min_hour_from)
|
||||
max_hour_to = self.users_id.employee_id.resource_id.calendar_id.attendance_ids[-1].hour_to
|
||||
max_hour = int(max_hour_to)
|
||||
max_minute = int(max_hour_to * 10 % max_hour_to)
|
||||
for rec in self:
|
||||
current_data = rec.attendance_id.current_data
|
||||
current_datetime = datetime.combine(current_data, datetime.min.time())
|
||||
if rec.attendance_id.check_in:
|
||||
rec.attendance_id.check_in = rec.attendance_id.check_in.replace(hour=min_hour, minute=min_minute) - timedelta(hours=8)
|
||||
else:
|
||||
rec.attendance_id.check_in = current_datetime.replace(hour=min_hour, minute=min_minute) - timedelta(hours=8)
|
||||
if rec.attendance_id.check_out:
|
||||
rec.attendance_id.check_out = rec.attendance_id.check_in.replace(hour=max_hour, minute=max_minute) - timedelta(hours=8)
|
||||
else:
|
||||
rec.attendance_id.check_out = current_datetime.replace(hour=max_hour, minute=max_minute) - timedelta(hours=8)
|
||||
if not self.users_id.employee_id.resource_id.calendar_id:
|
||||
planning_id = self.env['planning.slot.template'].search([('planning_name', '=', self.shift_id.template_id.planning_name), ('department_id.name', '=', self.shift_id.role_id.name)], limit=1)
|
||||
start_hour = int(planning_id.start_time)
|
||||
end_hour = float(planning_id.end_time)
|
||||
hour = int(end_hour) # 小时部分
|
||||
current_datetime = datetime.combine(self.attendance_id.current_data, time(0, 0, 0))
|
||||
start_time = current_datetime.replace(hour=start_hour) - timedelta(hours=8)
|
||||
end_time = current_datetime.replace(hour=hour)- timedelta(hours=8)
|
||||
original_attendance = self.attendance
|
||||
self.attendance_id.write({'check_in': start_time, 'check_out': end_time})
|
||||
self.is_attendance = True
|
||||
self.attendance = original_attendance
|
||||
|
||||
self.attendance_id.sudo().write({
|
||||
'is_approval': True,
|
||||
'is_abnormal': False,
|
||||
'is_no_card': False,
|
||||
'is_late_card': False,
|
||||
'is_early_card': False,
|
||||
})
|
||||
else:
|
||||
min_hour_from = self.users_id.employee_id.resource_id.calendar_id.attendance_ids[0].hour_from
|
||||
min_hour = int(min_hour_from)
|
||||
min_minute = int(min_hour_from * 10 % min_hour_from)
|
||||
max_hour_to = self.users_id.employee_id.resource_id.calendar_id.attendance_ids[-1].hour_to
|
||||
max_hour = int(max_hour_to)
|
||||
max_minute = int(max_hour_to * 10 % max_hour_to)
|
||||
for rec in self:
|
||||
current_data = rec.attendance_id.current_data
|
||||
current_datetime = datetime.combine(current_data, datetime.min.time())
|
||||
original_attendance = self.attendance
|
||||
if rec.attendance_id.check_in:
|
||||
rec.attendance_id.check_in = rec.attendance_id.check_in.replace(hour=min_hour, minute=min_minute) - timedelta(hours=8)
|
||||
else:
|
||||
rec.attendance_id.check_in = current_datetime.replace(hour=min_hour, minute=min_minute) - timedelta(hours=8)
|
||||
if rec.attendance_id.check_out:
|
||||
rec.attendance_id.check_out = rec.attendance_id.check_in.replace(hour=max_hour, minute=max_minute) - timedelta(hours=8)
|
||||
else:
|
||||
rec.attendance_id.check_out = current_datetime.replace(hour=max_hour, minute=max_minute) - timedelta(hours=8)
|
||||
self.is_attendance = True
|
||||
self.attendance = original_attendance
|
||||
|
||||
self.attendance_id.sudo().write({
|
||||
'is_approval': True,
|
||||
'is_abnormal': False,
|
||||
'is_no_card': False,
|
||||
'is_late_card': False,
|
||||
'is_early_card': False,
|
||||
})
|
||||
|
||||
@api.onchange('is_issues')
|
||||
def _onchange_is_issues(self):
|
||||
|
||||
@@ -35,12 +35,33 @@ class GoApprovals(models.Model):
|
||||
default='normal')
|
||||
active = fields.Boolean('Active', default=True, tracking=True)
|
||||
work_end = fields.Boolean(string="结束")
|
||||
is_day = fields.Boolean(string="按天")
|
||||
is_hour = fields.Boolean(string="按小时")
|
||||
start_day_selection = fields.Selection([('half', '上半天'),('afternoon', '下半天')], string="天")
|
||||
end_day_selection = fields.Selection([('half', '上半天'), ('afternoon', '下半天')], string="天")
|
||||
statr_date = fields.Date(string="开始日期")
|
||||
end_date = fields.Date(string="结束日期")
|
||||
|
||||
def _get_default_name_title(self):
|
||||
return self._description if self._description else self._name
|
||||
|
||||
name_title = fields.Char(default=_get_default_name_title)
|
||||
|
||||
@api.onchange('start_day_selection', 'end_day_selection')
|
||||
def _onchange_selection_fields(self):
|
||||
for record in self:
|
||||
if record.start_day_selection == 'afternoon' and record.end_day_selection == 'half':
|
||||
raise ValidationError("当开始日期为下半天时,结束选择日期只能下半天。")
|
||||
if record.start_day_selection == 'afternoon' and record.end_day_selection == 'afternoon':
|
||||
record.hours = 4
|
||||
record.days = 0.5
|
||||
elif record.start_day_selection == 'half' and record.end_day_selection == 'afternoon':
|
||||
record.hours = 8
|
||||
record.days = 1
|
||||
else:
|
||||
record.hours = 0
|
||||
record.days = 0
|
||||
|
||||
@api.onchange('date_start', 'date_end')
|
||||
def _onchange_date_range(self):
|
||||
if self.date_start and self.date_end:
|
||||
@@ -70,11 +91,11 @@ class GoApprovals(models.Model):
|
||||
@api.depends('users_id', 'days', 'hours')
|
||||
def _compute_name(self):
|
||||
for rec in self:
|
||||
if rec.days == 0 and rec.hours == 0:
|
||||
rec.name = f"{rec.users_id.name}外出"
|
||||
elif rec.days == 0:
|
||||
if rec.is_hour == True:
|
||||
rec.name = f"{rec.users_id.name}外出{rec.hours}小时"
|
||||
elif rec.is_day == True:
|
||||
rec.name = f"{rec.users_id.name}外出{rec.days}天"
|
||||
else:
|
||||
rec.name = f"{rec.users_id.name}外出{rec.days}天{rec.hours}小时"
|
||||
rec.name = f"{rec.users_id.name}外出"
|
||||
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@ class HrAttendance(models.Model):
|
||||
if not attendance.check_out:
|
||||
attendance.display_name = _(
|
||||
str(attendance.current_data) + " 上午:%s" + is_late_card + " -下午缺卡",
|
||||
format_datetime(self.env, attendance.check_in, dt_format="HH:mm"),
|
||||
format_datetime(self.env, attendance.check_in, dt_format="HH:mrm"),
|
||||
)
|
||||
elif not attendance.check_in:
|
||||
attendance.display_name = _(
|
||||
@@ -192,7 +192,7 @@ class HrAttendance(models.Model):
|
||||
max_hour = int(max_hour_to)
|
||||
max_minute = int(max_hour_to * 10 % max_hour_to)
|
||||
will_datetime_end = current_date.replace(year=year, month=month, day=day, hour=max_hour, minute=max_minute) - timedelta(hours=8)
|
||||
record.write({'check_out': will_datetime_end, 'is_approval': True, 'is_abnormal':False, 'is_no_card':False, 'is_early_card':False, 'is_late_card':False })
|
||||
record.write({'check_out': will_datetime_end, 'is_approval': True, 'is_abnormal':False, 'is_no_card':False, 'is_early_card':False, 'is_late_card':False, 'absenteeism_card':False})
|
||||
else:
|
||||
check_in_start = record.shift_id.template_id.check_in_start
|
||||
check_out_end = record.shift_id.template_id.check_out_end
|
||||
@@ -212,7 +212,7 @@ class HrAttendance(models.Model):
|
||||
end_datetime = end_datetime + timedelta(days=1)
|
||||
record.write(
|
||||
{'check_out': end_datetime, 'check_in':start_datetime, 'is_approval': True, 'is_abnormal': False, 'is_no_card': False,
|
||||
'is_early_card': False, 'is_late_card': False})
|
||||
'is_early_card': False, 'is_late_card': False, 'absenteeism_card':False})
|
||||
|
||||
def button_batch_correct(self):
|
||||
attendance_ids = self.env["hr.attendance"].browse(self._context.get('active_ids', self._context.get('active_id')))
|
||||
|
||||
@@ -49,7 +49,9 @@
|
||||
<field name="employee_id" invisible="1"/>
|
||||
<field name="shift_id" invisible="shift_name"/>
|
||||
<field name="shift_name" invisible="shift_id"/>
|
||||
<field name="attendance_id" domain="[('employee_id', '=', employee_id), '|', '|', '|', '|', ('is_abnormal', '=', True), ('is_early_card', '=', True), ('is_late_card', '=', True), ('absenteeism_card', '=', True), ('is_no_card', '=', True)]"/>
|
||||
<field name="is_attendance" invisible="1"/>
|
||||
<field name="attendance_id" domain="[('employee_id', '=', employee_id), '|', '|', '|', '|', ('is_abnormal', '=', True), ('is_early_card', '=', True), ('is_late_card', '=', True), ('absenteeism_card', '=', True), ('is_no_card', '=', True)]" invisible="is_attendance"/>
|
||||
<field name="attendance" invisible="not is_attendance"/>
|
||||
<field name="replacement_time"/>
|
||||
<field name="documents_ids" widget="preview_many2many"/>
|
||||
</group>
|
||||
|
||||
@@ -49,25 +49,35 @@
|
||||
<field name="name" required="1" placeholder="请输入标题"/>
|
||||
</h1>
|
||||
</div>
|
||||
<group>
|
||||
<group>
|
||||
<field name="users_id" invisible="1"/>
|
||||
<field name="days"/>
|
||||
<field name="hours"/>
|
||||
<field name="is_day"/>
|
||||
<field name="is_hour"/>
|
||||
<field name="days" invisible="not is_day"/>
|
||||
<field name="hours" invisible="not is_hour"/>
|
||||
<field name="work_end" invisible="1"/>
|
||||
<field name="date_start" required="1"/>
|
||||
<field name="date_end" required="1"/>
|
||||
</group>
|
||||
<group col="2">
|
||||
<group>
|
||||
<field name="statr_date" invisible="not is_day"/>
|
||||
<field name="end_date" invisible="not is_day"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="start_day_selection" invisible="not is_day"/>
|
||||
<field name="end_day_selection" invisible="not is_day"/>
|
||||
</group>
|
||||
</group>
|
||||
<group>
|
||||
<field name="date_start" invisible="not is_hour"/>
|
||||
<field name="date_end" invisible="not is_hour"/>
|
||||
<field name="reason_application"/>
|
||||
<field name="documents_ids" widget="preview_many2many"/>
|
||||
<field name="employee_ids" widget="many2many_tags"/>
|
||||
<field name="is_issues" invisible="is_issues == False"/>
|
||||
<field name="meal"/>
|
||||
<field name="details"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="department_id" invisible="1"/>
|
||||
</group>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
<button name="button_leave" type="object" string="请假" class="oe_highlight" invisible="not (is_abnormal or is_early_card or is_late_card or absenteeism_card or is_no_card)"/>
|
||||
<button name="button_card_approval" type="object" string="补卡" class="oe_highlight" invisible="not (is_abnormal or is_early_card or is_late_card or absenteeism_card or is_no_card)"/>
|
||||
<button name="button_duty_approval" type="object" string="外出" class="oe_highlight" invisible="not (is_abnormal or is_early_card or is_late_card or absenteeism_card or is_no_card)"/>
|
||||
<button name="button_correct_approval" type="object" string="修正" class="oe_highlight" groups="yuthon_hr_attendance.group_he_attendance_planning_manager" invisible="is_approval"/>
|
||||
<button name="button_correct_approval" type="object" string="修正" class="oe_highlight" groups="yuthon_hr_attendance.group_he_attendance_planning_manager" invisible="not (is_abnormal or is_early_card or is_late_card or absenteeism_card or is_no_card)"/>
|
||||
<button name="button_source" type="object" string="详情" class="oe_highlight"/>
|
||||
</tree>
|
||||
</field>
|
||||
|
||||
@@ -49,7 +49,7 @@ class YuthonPayrollCommon(models.Model):
|
||||
"""
|
||||
insurances_ids = self.env["yuthon.payroll.common"].browse(self._context.get('active_ids', self._context.get('active_id')))
|
||||
for ins in insurances_ids:
|
||||
for sal in self.env["hr.payroll.structure"].search([]):
|
||||
for sal in self.env["hr.payroll.structure"].search(['company_id', '=', ins.company_id.id]):
|
||||
if sal.id in ins.payroll_structure_ids.ids:
|
||||
continue
|
||||
rule_list = []
|
||||
@@ -112,7 +112,7 @@ class YuthonPayrollTemporary(models.Model):
|
||||
"""
|
||||
insurances_ids = self.env["yuthon.payroll.temporary"].browse(self._context.get('active_ids', self._context.get('active_id')))
|
||||
for ins in insurances_ids:
|
||||
for sal in self.env["hr.payroll.structure"].search([]):
|
||||
for sal in self.env["hr.payroll.structure"].search(['company_id', '=', ins.company_id.id]):
|
||||
rule_list = []
|
||||
if ins.name not in sal.rule_ids.mapped('name'):
|
||||
rule_list.append([0, 0, {
|
||||
@@ -167,7 +167,7 @@ class YuthonPayrollInsurances (models.Model):
|
||||
"""
|
||||
insurances_ids = self.env["yuthon.payroll.insurances"].browse(self._context.get('active_ids', self._context.get('active_id')))
|
||||
for ins in insurances_ids:
|
||||
salary_lv_ids = self.env["hr.payroll.structure"].search([])
|
||||
salary_lv_ids = self.env["hr.payroll.structure"].search(['company_id', '=', ins.company_id.id])
|
||||
for sal in salary_lv_ids:
|
||||
if sal.id in ins.payroll_structure_ids.ids:
|
||||
continue
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
<xpath expr="//field[@name='country_id']" position="after">
|
||||
<field name="sequence"/>
|
||||
<field name="level_id"/>
|
||||
<field name="company_id"/>
|
||||
<field name="create_time"/>
|
||||
<field name="end_time"/>
|
||||
<field name="is_enable"/>
|
||||
|
||||
Reference in New Issue
Block a user