添加功能

This commit is contained in:
zhouzhou
2024-12-13 16:22:09 +08:00
parent e929320c75
commit 49f9dec42f
13 changed files with 208 additions and 52 deletions
@@ -28,11 +28,11 @@ class YuthonContractWizard(models.Model):
def employee_contract_data(self,row):
employee_id = self.env['hr.employee'].search([('name', '=', row[1].value)])
structure_type_id = self.env['hr.payroll.structure.type'].search([('name', '=', row[4].value), ('yuthon_company', '=', 'thwg')])
party_id = self.env['yuthon.party.setting'].search([('party', '=', row[5].value)])
contract_type_id = self.env['hr.contract.type'].search([('name', '=', row[6].value)])
structure_type_id = self.env['hr.payroll.structure.type'].search([('name', '=', row[2].value), ('yuthon_company', '=', 'thtz')])
party_id = self.env['yuthon.party.setting'].search([('party', '=', row[0].value)])
contract_type_id = self.env['hr.contract.type'].search([('name', '=', row[3].value)])
wage_id = self.env['hr.salary.rule'].search([('struct_id.name', '=', structure_type_id.name),
('yuthon_company', '=', 'thwg'),
('yuthon_company', '=', 'thtz'),
('name', '=', '基本工资')])
wage = wage_id.amount_fix
self.env['hr.contract'].create({
@@ -43,3 +43,4 @@ class YuthonContractWizard(models.Model):
'wage':wage,
'state':'open'
})
+1
View File
@@ -33,6 +33,7 @@
'views/leave_approval.xml',
'views/overtime_page_views.xml',
'views/remove_holiday_approval.xml',
'views/yuthon_special_approval_views.xml',
'views/card_approval.xml',
'views/duty_approval.xml',
'views/yuthon_duty_setting_views.xml',
@@ -55,4 +55,18 @@
<field name="prefix">BK%(y)s%(month)s%(day)s</field>
<field name="padding">3</field>
</record>
<record id="seq_shift_approval" model="ir.sequence">
<field name="name">值班调替班申请序号</field>
<field name="code">shift_approval</field>
<field name="prefix">DT%(y)s%(month)s%(day)s</field>
<field name="padding">3</field>
</record>
<record id="seq_special_approval" model="ir.sequence">
<field name="name">值班特殊加班申请序号</field>
<field name="code">special_approval</field>
<field name="prefix">TS%(y)s%(month)s%(day)s</field>
<field name="padding">3</field>
</record>
</odoo>
@@ -14,9 +14,7 @@
<field name="numbercall">-1</field>
<field eval="False" name="doall"/>
</record>
</data>
<!--粮储政考勤-->
<data noupdate="1">
<record forcecreate="True" id="card_lc_remind_time_in" model="ir.cron">
<field name="name">定时任务:粮库上班打卡提醒</field>
<field name="model_id" ref="model_hr_attendance"/>
@@ -65,26 +63,24 @@
<field name="user_id" ref="base.user_root"/>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="nextcall" eval="(DateTime.now() + timedelta(days=1)).strftime('%Y-%m-%d 08:30:00')"/>
<field name="nextcall" eval="(DateTime.now() + timedelta(days=1)).strftime('%Y-%m-%d 16:30:00')"/>
<field name="numbercall">-1</field>
<field eval="False" name="doall"/>
</record>
</data>
<!--工程部打卡提醒-->
<data>
<!-- <record forcecreate="True" id="card_gc_white_remind_time_in" model="ir.cron">-->
<!-- <field name="name">定时任务:工程部白班上班打卡提醒</field>-->
<!-- <field name="model_id" ref="model_hr_attendance"/>-->
<!-- <field name="state">code</field>-->
<!-- <field name="code">model.card_remind()</field>-->
<!-- <field eval="False" name="active"/>-->
<!-- <field name="user_id" ref="base.user_root"/>-->
<!-- <field name="interval_number">1</field>-->
<!-- <field name="interval_type">days</field>-->
<!-- <field name="nextcall" eval="(DateTime.now()).strftime('%Y-%m-%d 7:50:00')"/>-->
<!-- <field name="numbercall">-1</field>-->
<!-- <field eval="False" name="doall"/>-->
<!-- </record>-->
<record forcecreate="True" id="card_gc_white_remind_time_in" model="ir.cron">
<field name="name">定时任务:工程部白班上班打卡提醒</field>
<field name="model_id" ref="model_hr_attendance"/>
<field name="state">code</field>
<field name="code">model.card_remind()</field>
<field eval="False" name="active"/>
<field name="user_id" ref="base.user_root"/>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="nextcall" eval="(DateTime.now()).strftime('%Y-%m-%d 07:50:00')"/>
<field name="numbercall">-1</field>
<field eval="False" name="doall"/>
</record>
<record forcecreate="True" id="card_gc_white_remind_time_out" model="ir.cron">
<field name="name">定时任务:工程部白班下班打卡提醒</field>
<field name="model_id" ref="model_hr_attendance"/>
@@ -124,9 +120,7 @@
<field name="numbercall">-1</field>
<field eval="False" name="doall"/>
</record>
</data>
<!-- 保安部打卡提醒 -->
<data>
<record forcecreate="True" id="card_ba_noon_remind_time_in" model="ir.cron">
<field name="name">定时任务:保安部中班上班打卡提醒</field>
<field name="model_id" ref="model_hr_attendance"/>
+1
View File
@@ -20,6 +20,7 @@ from . import yuthon_adjustments_approval
from . import yuthon_abnormal_approval
from . import yuthon_abnormal_setting
from . import yuthon_shift_approval
from . import yuthon_special_approval
@@ -265,9 +265,7 @@ class HrAttendance(models.Model):
resource = self.env['resource.resource'].browse(resource_id)
_logger.info("定时任务执行中")
if department_id_name == '工程部' and name in ('白班', '中值夜班'):
_logger.info("判断前now:{}---start:{}".format(datetime.now(), slot.start_datetime + timedelta(hours=8)))
if datetime.now() <= slot.start_datetime + timedelta(hours=8):
_logger.info("判断后now:{}---start:{}".format(datetime.now(), slot.start_datetime + timedelta(hours=8)))
self.card_in_comment(resource.employee_id)
elif datetime.now() >= slot.end_datetime + timedelta(hours=8):
self.card_out_comment(resource.employee_id)
@@ -2,6 +2,8 @@ from odoo import api, fields, models, tools, _
from datetime import datetime, time, timedelta
from odoo.exceptions import UserError
from odoo.odoo.api import ondelete
class YuthonShiftApproval(models.Model):
_name = 'yuthon.shift.approval'
@@ -10,10 +12,12 @@ class YuthonShiftApproval(models.Model):
yuthon_company = fields.Selection(related='users_id.employee_id.yuthon_company', string="公司")
users_id = fields.Many2one('res.users', string="申请人", default=lambda self: self.env.user.id)
name = fields.Char(string="标题", compute='_compute_name', readonly=False)
code = fields.Char(string="编号", default=lambda self: self.env['ir.sequence'].next_by_code('adjustments_approval'))
name = fields.Char(string="标题", default=lambda self: self.env.user.employee_id.resource_id.name)
code = fields.Char(string="编号", default=lambda self: self.env['ir.sequence'].next_by_code('shift_approval'))
resource_id = fields.Many2one('resource.resource', string="申请人", default=lambda self: self.env.user.employee_id.resource_id.id)
transferees_id = fields.Many2one('resource.resource', string="调班对象", domain="[('id', 'in', resource_ids)]")
alternate_id = fields.Many2one('resource.resource', string="替班对象", domain="[('id', 'in', resource_ids)]")
alternate_shifts = fields.Selection([('transferees', '调班'), ('alternate', '替班')], string="调替班" , default='transferees')
shift_id = fields.Many2one('planning.slot', string="班次")
return_id = fields.Many2one('planning.slot', string="班次")
department_id = fields.Many2one('hr.department', string="部门", related='resource_id.employee_id.department_id')
@@ -45,9 +49,19 @@ class YuthonShiftApproval(models.Model):
shift_id = self.shift_id
return_id = self.return_id
original_shift_template_id = shift_id.template_id.id
if not self.transferees_id:
shift_id.write({
'template_id': return_id.template_id.id,
start_time= shift_id.start_datetime
end_time = shift_id.end_datetime
role_id = shift_id.role_id
template_id = self.env['planning.slot.template'].search([('id', '=', shift_id.template_id.id)])
if self.alternate_id:
shift_id.unlink()
self.env['planning.slot'].create({
'resource_id':self.alternate_id.id,
'template_id':template_id.id,
'start_datetime':start_time,
'end_datetime':end_time,
'role_id':role_id.id,
'allocated_hours':8
})
else:
shift_id.write({
@@ -57,29 +71,33 @@ class YuthonShiftApproval(models.Model):
'template_id':original_shift_template_id,
})
@api.depends('resource_id', 'transferees_id')
def _compute_name(self):
@api.onchange('resource_id', 'transferees_id', 'alternate_id')
def onchange_name(self):
for rec in self:
if rec.resource_id:
rec.name = '调班:'+ rec.resource_id.name
elif rec.resource_id and rec.transferees_id:
if rec.resource_id and rec.transferees_id and rec.alternate_shifts =='transferees':
rec.name = '调班:'+ rec.resource_id.name + '-' + rec.transferees_id.name
elif rec.resource_id and rec.alternate_id and rec.alternate_shifts =='alternate':
rec.name = '替班:'+ rec.resource_id.name + '-' + rec.alternate_id.name
@api.onchange('department_id')
def _onchange_resource_ids(self):
resource_ids = []
employee_ids = self.env['hr.employee'].search([('department_id', '=', self.department_id.id)])
for employee in employee_ids:
resource_id = self.env['resource.resource'].search([('name', '=', employee.name)], limit=1)
if resource_id:
resource_ids.append(resource_id.id)
target_departments = ['工程部', '保安部', '联安粮库']
# 检查当前部门或其父部门是否在目标部门列表中
current_department = self.department_id
while current_department:
if current_department.name in target_departments:
# 获取所有子部门(包括子部门的子部门)
all_child_departments = self.env['hr.department'].search([('id', 'child_of', current_department.id)])
# 查找所有属于这些子部门的员工
employee_ids = self.env['hr.employee'].search([('department_id', 'in', all_child_departments.ids)])
for employee in employee_ids:
resource_id = self.env['resource.resource'].search([('name', '=', employee.name)], limit=1)
if resource_id:
resource_ids.append(resource_id.id)
break
child_ids = self.env['hr.department'].search([('parent_id', '=', self.department_id.id)])
for child in child_ids:
employee_ids = self.env['hr.employee'].search([('department_id', '=', child.id)])
for employee in employee_ids:
resource_id = self.env['resource.resource'].search([('name', '=', employee.name)], limit=1)
if resource_id:
resource_ids.append(resource_id.id)
current_department = current_department.parent_id # 继续检查父部门
self.resource_ids = [(6, 0, resource_ids)]
self.resource_ids = [(6, 0, resource_ids)]
@@ -0,0 +1,61 @@
from odoo import api, fields, models, tools, _
from datetime import datetime, time, timedelta
from odoo.exceptions import UserError
class YuthonSpecialApproval(models.Model):
_name = 'yuthon.special.approval'
_inherit = ['soong.workflow.mixin', 'mail.thread.main.attachment', 'mail.activity.mixin']
_description = '特殊加班'
yuthon_company = fields.Selection(related='users_id.employee_id.yuthon_company', string="公司")
users_id = fields.Many2one('res.users', string="申请人", default=lambda self: self.env.user.id)
name = fields.Char(string="标题", readonly=False, default=lambda self: self.env.user.employee_id.resource_id.name)
reason_application = fields.Html(string="申请事由")
code = fields.Char(string="编号", default=lambda self: self.env['ir.sequence'].next_by_code('special_approval'))
resource_id = fields.Many2one('resource.resource', string="申请人",
default=lambda self: self.env.user.employee_id.resource_id.id)
template_id = fields.Many2one('planning.slot.template', string="加班模板", domain="[('department_id', '=', departments_id)]")
start_date = fields.Date(string="开始日期")
documents_ids = fields.Many2many('ir.attachment', string="附件")
department_id = fields.Many2one('hr.department', string="部门", related='resource_id.employee_id.department_id')
departments_id = fields.Many2one('hr.department', string="部门")
active = fields.Boolean('Active', default=True, tracking=True)
is_issues = fields.Boolean(string='是否上会')
related_issues_id = fields.Many2one('issue.library', string="关联议题")
@api.onchange('department_id')
def _onchange_resource_ids(self):
target_departments = ['工程部', '保安部', '联安粮库']
current_department = self.department_id
while current_department:
if current_department.name in target_departments:
self.departments_id = current_department.id
break
current_department = current_department.parent_id
def button_special_approval(self):
role_a = self.env['planning.role'].search([('name', '=', self.departments_id.name)], limit=1)
start_datetime = datetime.combine(self.start_date, datetime.min.time())
start_hour = int(self.template_id.start_time)
end_hour = int(self.template_id.end_time)
start_time = start_datetime.replace(hour=start_hour) + timedelta(hours=16) - timedelta(days=1)
if self.template_id.end_time < self.template_id.start_time:
end_time = start_datetime.replace(hour=end_hour) + timedelta(days=1, hours=16) - timedelta(days=1)
else:
end_time = start_datetime.replace(hour=end_hour) + timedelta(hours=16) - timedelta(days=1)
self.env['planning.slot'].create({
'resource_id': self.resource_id.id,
'template_id': self.template_id.id,
'role_id': role_a.id,
'start_datetime': start_time,
'end_datetime': end_time,
'allocated_hours': 8,
})
@api.onchange('resource_id', 'start_date', 'template_id')
def onchange_name(self):
for rec in self:
if rec.resource_id and rec.start_date and rec.template_id:
rec.name = rec.resource_id.name + str(rec.start_date) + rec.template_id.planning_name
@@ -29,4 +29,5 @@ access_yuthon_duty_class_setting,yuthon.duty.class.setting,model_yuthon_duty_cla
access_yuthon_adjustments_approval,yuthon.adjustments.approval,model_yuthon_adjustments_approval,base.group_user,1,1,1,1
access_yuthon_abnormal_approval,yuthon.abnormal.approval,model_yuthon_abnormal_approval,base.group_user,1,1,1,1
access_yuthon_abnormal_setting,yuthon.abnormal.setting,model_yuthon_abnormal_setting,base.group_user,1,1,1,1
access_yuthon_shift_approval,yuthon.shift.approval,model_yuthon_shift_approval,base.group_user,1,1,1,
access_yuthon_shift_approval,yuthon.shift.approval,model_yuthon_shift_approval,base.group_user,1,1,1,1
access_yuthon_special_approval,yuthon.special.approval,model_yuthon_special_approval,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
29 access_yuthon_special_approval yuthon.special.approval model_yuthon_special_approval base.group_user 1 1 1 1
30
31
32
33
@@ -32,8 +32,10 @@
</group>
<group string="个人信息" col="2">
<group>
<field name="alternate_shifts"/>
<field name="resource_id"/>
<field name="transferees_id"/>
<field name="transferees_id" invisible="alternate_shifts != 'transferees'"/>
<field name="alternate_id" invisible="alternate_shifts != 'alternate'"/>
<field name="users_id" invisible="1"/>
<field name="is_issues" invisible="1"/>
<field name="related_issues_id" invisible="not is_issues"/>
@@ -41,8 +43,9 @@
<field name="department_id"/>
</group>
<group>
<separator/>
<field name="shift_id" domain="[('resource_id', '=', resource_id)]"/>
<field name="return_id" domain="[('resource_id', '=', transferees_id)]"/>
<field name="return_id" domain="[('resource_id', '=', transferees_id)]" invisible="alternate_shifts != 'transferees'"/>
</group>
</group>
</sheet>
@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="view_special_approval_tree" model="ir.ui.view">
<field name="name">special.approval.tree</field>
<field name="model">yuthon.special.approval</field>
<field name="arch" type="xml">
<tree string="特殊加班">
<field name="name"/>
<field name="users_id"/>
<field name="yuthon_company" optional="hide"/>
<field name="department_id" optional="hide"/>
</tree>
</field>
</record>
<record id="view_special_approval_form" model="ir.ui.view">
<field name="name">special.approval.form</field>
<field name="model">yuthon.special.approval</field>
<field name="arch" type="xml">
<form string="特殊加班">
<sheet>
<header>
<button name="button_special_approval" type="object" string="批准" class="oe_highlight"/>
</header>
<group string="审批事项">
<group>
<field name="name" placeholder="请输入标题"/>
<field name="code"/>
<field name="reason_application"/>
<field name="documents_ids" widget="preview_many2many"/>
</group>
</group>
<group string="个人信息" col="2">
<group>
<field name="resource_id"/>
<field name="departments_id" invisible="1"/>
<field name="template_id"/>
<field name="users_id" invisible="1"/>
<field name="is_issues" invisible="1"/>
<field name="related_issues_id" invisible="not is_issues"/>
<field name="yuthon_company" invisible="1"/>
</group>
<group>
<field name="department_id"/>
<field name="start_date"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="view_special_approval_action" model="ir.actions.act_window">
<field name="name">特殊加班审批</field>
<field name="res_model">yuthon.special.approval</field>
<field name="view_mode">tree,form</field>
</record>
</odoo>
@@ -35,6 +35,7 @@
<field name="arch" type="xml">
<xpath expr="//field[@name='country_id']" position="after">
<field name="sequence"/>
<field name="level_id"/>
<field name="yuthon_company"/>
<field name="create_time"/>
<field name="end_time"/>
@@ -279,6 +279,11 @@
parent="menu_hr_attendance_approval_request_board"
sequence="13"
action="yuthon_hr_attendance.approval_request_card"/>
<menuitem id="menu_hr_attendance_special_approval_board"
name="特殊加班申请"
parent="menu_hr_attendance_approval_request_board"
sequence="15"
action="yuthon_hr_attendance.view_special_approval_action"/>
<menuitem id="menu_hr_customer_approval_board"
name="客服值班审批"
parent="menu_hr_attendance_approval_request_board"