添加功能

This commit is contained in:
zhou
2025-04-10 15:49:56 +08:00
parent d73149efc9
commit dec36839ad
8 changed files with 98 additions and 54 deletions
+44 -34
View File
@@ -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):
+25 -4
View File
@@ -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}外出"
+3 -3
View File
@@ -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')))
+3 -1
View File
@@ -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>
+18 -8
View File
@@ -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"/>