diff --git a/attendance_iot/controllers/kaoqin_test.py b/attendance_iot/controllers/kaoqin_test.py
index bfed3b0c0..5fef97b99 100644
--- a/attendance_iot/controllers/kaoqin_test.py
+++ b/attendance_iot/controllers/kaoqin_test.py
@@ -55,16 +55,14 @@ class BusController(Controller):
user_id = data.get('logs')[0].get('user_id')
employee_id = request.env(user=SUPERUSER_ID)["hr.employee"].search([('mobile_phone', '=', user_id)])
recog_time_str = data.get('logs')[0].get("recog_time")
- checkin_time = datetime.strptime(recog_time_str, "%Y-%m-%d %H:%M:%S")
attendance_iot_id = request.env(user=SUPERUSER_ID)["attendance.iot"].search([('name', '=', data.get('sn'))])
if employee_id:
request.env(user=SUPERUSER_ID)["hr.attendance.detail"].create({
'employee_id': employee_id.id, # 员工
- 'checkin_time': checkin_time, # 打卡时间
+ 'checkin_time': fields.Datetime.now(), # 打卡时间
'source': 'iot', # 打卡来源
'attendance_iot_id': attendance_iot_id.id, # 打卡设备
})
- request.env(user=SUPERUSER_ID)["hr.attendance.detail"].get_hr_attendance_time(employee_id.user_id.login)
return {"Result": 0, "Msg": "添加成功"}
@route('/api/v1/user/inf_photo', methods=['POST'], type='json', auth='none', csrf=False)
diff --git a/attendance_iot/views/attendance_iot_user_views.xml b/attendance_iot/views/attendance_iot_user_views.xml
index 91e7936bf..f2182902c 100644
--- a/attendance_iot/views/attendance_iot_user_views.xml
+++ b/attendance_iot/views/attendance_iot_user_views.xml
@@ -11,6 +11,7 @@
+
diff --git a/yuthon_hr_attendance/controllers/applet_attendance.py b/yuthon_hr_attendance/controllers/applet_attendance.py
index 637bb33e9..c47cd2807 100644
--- a/yuthon_hr_attendance/controllers/applet_attendance.py
+++ b/yuthon_hr_attendance/controllers/applet_attendance.py
@@ -108,13 +108,22 @@ class AppletAttendance(Controller):
_logger.info(f"\n应打卡地址 地址验证: {address_id.address_name} 详细: {address_id.address_name2}___")
_logger.info(f"\n人员: {employee_id.name} 当前所在地址: {self_address['formatted_address']}__________")
_logger.info(f"\n可打卡 当前经度: {kw['att_longitude']} 当前纬度: {kw['att_latitude']} 范围:{address_id.card_rice}米__________")
- if self.is_within_radius_geopy(kw['att_latitude'], kw['att_longitude'], address_id.latitude, address_id.longitude, card_rice) and kw['wifi_name'] in wifi_name_list:
- message = '可以打卡'
- state = 'yes'
- _logger.info(f"\n可打卡")
- break
+ if wifi_name_list:
+ if self.is_within_radius_geopy(kw['att_latitude'], kw['att_longitude'], address_id.latitude, address_id.longitude, card_rice) and kw['wifi_name'] in wifi_name_list:
+ message = '可以打卡'
+ state = 'yes'
+ _logger.info(f"\n可打卡")
+ break
+ else:
+ _logger.info(f"\n不可打卡 ")
else:
- _logger.info(f"\n不可打卡 ")
+ if self.is_within_radius_geopy(kw['att_latitude'], kw['att_longitude'], address_id.latitude, address_id.longitude, card_rice):
+ message = '可以打卡'
+ state = 'yes'
+ _logger.info(f"\n可打卡")
+ break
+ else:
+ _logger.info(f"\n不可打卡 ")
if self.is_workday(current_date):
attendance_id_class = f"{attendance_id.shift_name} {start_time_str}-{end_time_str}"
else:
@@ -198,7 +207,7 @@ class AppletAttendance(Controller):
"""
_logger.info("-------触发打卡接口/yuthon/att/record---------")
res_user_id = request.env(user=SUPERUSER_ID)["res.users"].search([('id', '=', kw.get('user_id'))])
- _logger.info(f"传过来的user_id{kw.get('user_id')},名称{res_user_id.name}")
+ _logger.info(f"传过来的user_id:{kw.get('user_id')},名称{res_user_id.name}")
employee_id = request.env(user=SUPERUSER_ID)["hr.employee"].search([('name', '=', res_user_id.name)])
if res_user_id:
request.env(user=SUPERUSER_ID)["hr.attendance.detail"].create({
@@ -207,7 +216,6 @@ class AppletAttendance(Controller):
'source': 'mini_programs',
})
return_data = {'code': '200', 'message': '打卡成功'}
- request.env(user=SUPERUSER_ID)["hr.attendance.detail"].get_hr_attendance_time(res_user_id.login)
_logger.info("打卡记录创建成功")
else:
return_data = {'code': '200', 'message': '未识别到员工'}
diff --git a/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py b/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py
index 5888b0760..b33e3276c 100644
--- a/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py
+++ b/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py
@@ -86,15 +86,15 @@ class HrAttendanceDetail(models.Model):
def create(self, vals_list):
res = super(HrAttendanceDetail, self).create(vals_list)
for attendance_obj in res:
- self.sudo()._do_save_wx_attendance_data(attendance_obj.user_id, attendance_obj.current_data)
- self.sudo()._do_plan_save_wx_attendance_data(attendance_obj.user_id, attendance_obj.current_data)
+ self.sudo()._do_save_wx_attendance_data(attendance_obj.employee_id.user_id, attendance_obj.create_date.date())
+ self.sudo()._do_plan_save_wx_attendance_data(attendance_obj.employee_id.user_id, attendance_obj.create_date.date())
return res
def write(self, vals):
res = super(HrAttendanceDetail, self).write(vals)
for attendance_obj in self:
- self.sudo()._do_save_wx_attendance_data(attendance_obj.user_id, attendance_obj.current_data)
- self.sudo()._do_plan_save_wx_attendance_data(attendance_obj.user_id, attendance_obj.current_data)
+ self.sudo()._do_save_wx_attendance_data(attendance_obj.employee_id.user_id, attendance_obj.create_date.date())
+ self.sudo()._do_plan_save_wx_attendance_data(attendance_obj.employee_id.user_id, attendance_obj.create_date.date())
return res
@@ -332,8 +332,8 @@ class HrAttendanceDetail(models.Model):
# 同步整理当天出勤数据
attendance_obj = self.env['hr.attendance'].search([("userid", "=", user.oauth_uid), ("current_data", "=", current_date)], limit=1)
hr_employee_obj = self.env['hr.employee'].sudo().search([("user_id", "=", user.id)], limit=1)
- current_datetime_start = datetime.combine(datetime.strptime(current_date, '%Y-%m-%d'), datetime.min.time())
- current_datetime_end = datetime.combine(datetime.strptime(current_date, '%Y-%m-%d'), datetime.max.time())
+ # current_datetime_start = datetime.combine(datetime.strptime(current_date, '%Y-%m-%d'), datetime.min.time())
+ # current_datetime_end = datetime.combine(datetime.strptime(current_date, '%Y-%m-%d'), datetime.max.time())
if not attendance_obj:
# 判断是否是 普通打卡
if not hr_employee_obj.default_planning_role_id:
@@ -367,6 +367,7 @@ class HrAttendanceDetail(models.Model):
:return:
"""
# 同步整理当天出勤数据
+ current_date = str(current_date)
hr_employee_obj = self.env['hr.employee'].sudo().search([("user_id", "=", user.id)], limit=1)
current_datetime_start = datetime.combine(datetime.strptime(current_date, '%Y-%m-%d'), datetime.min.time())
current_datetime_end = datetime.combine(datetime.strptime(current_date, '%Y-%m-%d'), datetime.max.time())
@@ -406,6 +407,7 @@ class HrAttendanceDetail(models.Model):
:param attendance_obj: 判断的时刻的考勤集合
:return:
"""
+ current_date = str(current_date)
current_datetime_start = datetime.combine(datetime.strptime(current_date, '%Y-%m-%d'), datetime.min.time())
current_datetime_end = datetime.combine(datetime.strptime(current_date, '%Y-%m-%d'), datetime.max.time())
hr_employee_obj = self.env['hr.employee'].sudo().search([("user_id", "=", user.id)], limit=1)
diff --git a/yuthon_hr_attendance/wizard/hr_attendance_month_wizard.py b/yuthon_hr_attendance/wizard/hr_attendance_month_wizard.py
index 1d3441713..8576a1006 100644
--- a/yuthon_hr_attendance/wizard/hr_attendance_month_wizard.py
+++ b/yuthon_hr_attendance/wizard/hr_attendance_month_wizard.py
@@ -5,6 +5,7 @@ from odoo import models, api, fields, _
from odoo.tools.float_utils import float_round
from odoo.exceptions import ValidationError, UserError
from datetime import date
+from datetime import timedelta
class HrAttendanceMonthWizard(models.TransientModel):
@@ -101,16 +102,16 @@ class HrAttendanceMonthWizard(models.TransientModel):
# 1 生成出勤生成记录
# 2 生成出勤月度明细
# 获取出勤月度汇总记录结果表
- for record in self:
- year = record.current_year
- month = record.current_month
- existing_records = self.env["hr.attendance.month"].search([
- ('current_year', '=', year),
- ('current_month', '=', month),
- ('company_id', '=', record.company_id.id)
- ])
- if existing_records:
- raise ValidationError(f"{year}年{month}月分的记录已经存在,不能重复操作.")
+ # for record in self:
+ # year = record.current_year
+ # month = record.current_month
+ # existing_records = self.env["hr.attendance.month"].search([
+ # ('current_year', '=', year),
+ # ('current_month', '=', month),
+ # ('company_id', '=', record.company_id.id)
+ # ])
+ # if existing_records:
+ # raise ValidationError(f"{year}年{month}月分的记录已经存在,不能重复操作.")
self.ensure_one()
attendance_month_obj = self._get_attendance_month_obj()
# 查询所有的当前员工? 是否需要判断当前员工是否关联企业微信??预留
@@ -127,7 +128,7 @@ class HrAttendanceMonthWizard(models.TransientModel):
for employee in hr_employee_obj:
if (
employee.id not in resource_user_ids and
- employee.contract.state not in ['draft', 'cancel']
+ employee.contract_id.state not in ['draft', 'cancel']
):
if employee.id not in all_employee_ids:
# 判断当前是否已经创建了考勤明细
@@ -140,8 +141,8 @@ class HrAttendanceMonthWizard(models.TransientModel):
attendance_month_detail_obj.analysis_attendance_month_detail()
self.get_leave_and_overtime_info(employee.id)
# 返回action动作
- action = self._hr_attendance_month_detail_action()
- return action
+ action = self._hr_attendance_month_detail_action()
+ return action
# 考勤定时任务
def button_attendance_month(self):
@@ -218,10 +219,8 @@ class HrAttendanceMonthWizard(models.TransientModel):
start_date = start_in_month
end_date = end_in_month
- leave = self._create_leave_record(holiday_status_id, start_date, end_date)
- leave_days[leave_type] = leave.number_of_days
- # leave_days[leave_type] = self._process_shift_days(leave, start_date, end_date)
- leave.unlink()
+ days = self._create_leave_record(holiday_status_id, start_date, end_date)
+ leave_days[leave_type] = days
else:
for leave in leave_records:
total_days += leave.number_of_days_display
@@ -241,13 +240,44 @@ class HrAttendanceMonthWizard(models.TransientModel):
# 创建用户记录传入日期来获取天数
def _create_leave_record(self, holiday_status_id, start_date, end_date):
- admin_id = self.env['hr.employee'].search([("name", "=", 'Administrator')])
- if not admin_id:
- return None
- return self.env['hr.leave'].sudo().create({
- 'employee_id': admin_id.id,
- 'holiday_status_id': holiday_status_id.id,
- 'request_date_from': start_date,
- 'request_date_to': end_date,
- 'state': 'confirm',
- })
+ if holiday_status_id.type_of_work == 0:
+ calendar_leaves = self.env['resource.calendar.leaves'].search([("calendar_id", "=", "行政考勤工作日")])
+ holidays_list = []
+ shift_days_list = []
+ # 提取节假日和调休日
+ for leave in calendar_leaves:
+ if leave.holidays:
+ holidays_list.extend(leave.holidays.split(','))
+ if leave.alternate_rest_day:
+ holidays_list.extend(leave.alternate_rest_day.split(','))
+ if leave.shift_replacement_day:
+ shift_days_list.extend(leave.shift_replacement_day.split(','))
+
+ holidays_list = [self.remove_leading_zero(date) for date in holidays_list]
+ shift_days_list = [self.remove_leading_zero(date) for date in shift_days_list]
+
+ days = 0 # 初始化工作日计数
+ current_date = start_date
+
+ while current_date <= end_date:
+ current_date_str = current_date.strftime('%m月%d日')
+ current_date_str = self.remove_leading_zero(current_date_str)
+ is_weekend = current_date.weekday() in [5, 6]
+
+ if current_date_str in holidays_list:
+ # 如果是法定节假日,不计为工作日
+ pass
+ elif current_date_str in shift_days_list:
+ # 如果是调休日,无论是否周末都算作工作日
+ days += 1
+ elif not is_weekend:
+ # 如果不是周末且不是节假日,算作工作日
+ days += 1
+
+ current_date += timedelta(days=1)
+ else:
+ delta = end_date - start_date
+ days = delta.days + 1
+ return days
+
+
diff --git a/yuthon_property_approval/wizard/choose_property_wizard.py b/yuthon_property_approval/wizard/choose_property_wizard.py
index ef53deabb..1b41a5cb8 100644
--- a/yuthon_property_approval/wizard/choose_property_wizard.py
+++ b/yuthon_property_approval/wizard/choose_property_wizard.py
@@ -28,14 +28,18 @@ class ChoosePropertyWizard(models.Model):
else:
rec.is_mange = False
manage_id = record.manage_information_ids[-1] if record.manage_information_ids else False
+
+ admin_id = False
+ company_id = False
+ precinct_id = False
if manage_id:
- rec.admin_id = manage_id.admin_line_id.id
- rec.company_id = manage_id.company_id.id
- rec.precinct_id = manage_id.precinct_id.id
- else:
- rec.admin_id = False
- rec.company_id = False
- rec.precinct_id = False
+ admin_id = manage_id.admin_id.id if manage_id.admin_id else False
+ company_id = manage_id.company_id.id if manage_id.company_id else False
+ precinct_id = manage_id.precinct_id.id if manage_id.precinct_id else False
+ rec.admin_id = admin_id
+ rec.company_id = company_id
+ rec.precinct_id = precinct_id
+
self.lease_contract_id.lease_ids = lease_ids_to_add
self.lease_contract_id.write({'name': ','.join(lease_name),
'use_address': ','.join(lease_name),
diff --git a/yuthon_salary/models/inherit_hr_payslip.py b/yuthon_salary/models/inherit_hr_payslip.py
index fc9c45ead..dc675ba0f 100644
--- a/yuthon_salary/models/inherit_hr_payslip.py
+++ b/yuthon_salary/models/inherit_hr_payslip.py
@@ -18,7 +18,7 @@ class InheritHrPayslip(models.Model):
date_of_entry = fields.Date(related='employee_id.entry_date', string="入职时间", store=True)
base_salary = fields.Float(string='基本工资', compute='_compute_salary', store=True)
bank_account_id = fields.Many2one(string='银行账号', related='employee_id.bank_account_id', store=True)
- tax_payable = fields.Float(string='应补(退)税额', store=True)
+ tax_payable = fields.Float(string='应补(退)税额')
actual_salary = fields.Float(string='实发工资', store=True, compute='_compute_actual_salary')
three_one = fields.Float(string='三险一金', store=True, compute='_compute_salary')
identification_id = fields.Char(string='证件号码', related='employee_id.identification_id', store=True)
diff --git a/yuthon_salary/views/inherit_hr_payslip_views.xml b/yuthon_salary/views/inherit_hr_payslip_views.xml
index ac6eb5a4c..6573d5176 100644
--- a/yuthon_salary/views/inherit_hr_payslip_views.xml
+++ b/yuthon_salary/views/inherit_hr_payslip_views.xml
@@ -188,63 +188,65 @@
+
hr.payslip.tree.validation.jtbb
hr.payslip
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -252,106 +254,114 @@
+
+
- hr.payslip.tree.validation.wg
- hr.payslip
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ hr.payslip.tree.validation.wg
+ hr.payslip
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- hr.payslip.tree.validation_lc
- hr.payslip
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ hr.payslip.tree.validation_lc
+ hr.payslip
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
hr.payslip.tree.jtbb
hr.payslip
@@ -362,59 +372,63 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
hr.payslip.tree.wg
hr.payslip
@@ -425,46 +439,48 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
hr.payslip.tree.lc
hr.payslip
@@ -475,44 +491,45 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
hr.payslip.tree
hr.payslip
diff --git a/yuthon_work_brand/views/hr_menus.xml b/yuthon_work_brand/views/hr_menus.xml
index 33e9e709f..f82da962b 100644
--- a/yuthon_work_brand/views/hr_menus.xml
+++ b/yuthon_work_brand/views/hr_menus.xml
@@ -169,8 +169,8 @@
parent="hr_attendance_root_board_menu"
sequence="15"
action="yuthon_hr_attendance.hr_attendance_detail_action"/>
-