@@ -14,5 +14,18 @@
|
||||
<field name="numbercall">-1</field>
|
||||
<field eval="False" name="doall"/>
|
||||
</record>
|
||||
<record forcecreate="True" id="yuthon_regularization_time_data" model="ir.cron">
|
||||
<field name="name">定时任务:自动生成转正审批</field>
|
||||
<field name="model_id" ref="model_hr_employee"/>
|
||||
<field name="state">code</field>
|
||||
<field name="code">model.regularization_task()</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 00:00:00')"/>
|
||||
<field name="numbercall">-1</field>
|
||||
<field eval="False" name="doall"/>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
|
||||
@@ -189,6 +189,7 @@ class YuthonHrEmployee(models.Model):
|
||||
string='薪资计算年金人员'
|
||||
)
|
||||
salary_year = fields.Integer(compute='_compute_salary_year', store=True)
|
||||
is_create = fields.Boolean(string='是否已创建转正流程审批')
|
||||
last_year_salary = fields.Float(string="年金基数")
|
||||
converted = fields.Float(string="折算实际系数")
|
||||
conversion_factor = fields.Float(string="上年有效计算")
|
||||
@@ -911,3 +912,38 @@ class YuthonHrEmployee(models.Model):
|
||||
'number_of_days': total_days,
|
||||
})
|
||||
|
||||
def regularization_task(self):
|
||||
today = fields.Date.today()
|
||||
target_date = today + timedelta(days=15)
|
||||
eligible_employees = self.search([
|
||||
('is_create', '=', False),
|
||||
('contract_id.is_probation', '=', True),
|
||||
('contract_id.end_date', '=', target_date),
|
||||
('contract_id', '!=', False)
|
||||
])
|
||||
if not eligible_employees:
|
||||
return
|
||||
|
||||
for employee in eligible_employees:
|
||||
contract_structure_type = employee.contract_id.structure_type_id
|
||||
approval_name = f"转正申请表-{employee.name}"
|
||||
self.env['yuthon.regularization.approval'].create({
|
||||
'name': approval_name,
|
||||
'users_id': employee.user_id.id,
|
||||
'create_uid': employee.user_id.id,
|
||||
'structure_type_id': contract_structure_type.id,
|
||||
'structure_type_id1': contract_structure_type.id,
|
||||
'is_adjust': False,
|
||||
})
|
||||
menu_id = self.env['ir.ui.menu'].search([('name', '=', '转正申请表')])
|
||||
url = f'https://oa.thtzjt.com/web#id={self.id}&cids=2&action={menu_id.action.id}&model=yuthon.regularization.approval&view_type=list&menu_id={menu_id.id}'
|
||||
self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa',
|
||||
user_id=employee.wecom_userid,
|
||||
title="转正申请",
|
||||
description=f"""您好!近期即将开展您的转正流程,现就转正申请事宜温馨提醒如下,确保流程顺利推进:
|
||||
待办工作流:已为您生成「转正申请审批单」待办任务,可登录 OA 查看处理;
|
||||
提交时限:请于试用期截止前 1 周(即{employee.contract_id.end_date.year}年{employee.contract_id.end_date.month}月{employee.contract_id.end_date.day}日)完成审批单提交,逾期可能影响转正进度;
|
||||
材料准备:需同步上传《转正申请书》(可向人事部门索取,企业微信联系人事对接人)。""",
|
||||
url=url, btntxt="详细信息")
|
||||
|
||||
employee.write({'is_create': True})
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
from odoo import models, fields, api
|
||||
from odoo.exceptions import UserError
|
||||
from dateutil.relativedelta import relativedelta
|
||||
|
||||
|
||||
class YuthonRegularizationPrepareApproval(models.Model):
|
||||
@@ -8,40 +9,25 @@ class YuthonRegularizationPrepareApproval(models.Model):
|
||||
_inherit = ['soong.workflow.mixin', 'mail.thread.main.attachment', 'mail.activity.mixin']
|
||||
|
||||
name = fields.Char(string="名称")
|
||||
department_id = fields.Many2one(related='employee_id.department_id', string="部门")
|
||||
department_id = fields.Many2one(related='users_id.employee_id.department_id', string="部门")
|
||||
users_id = fields.Many2one('res.users', string="申请人", default=lambda self: self.env.user.id)
|
||||
employee_id = fields.Many2one('hr.employee', string="员工姓名")
|
||||
code = fields.Char(string="编号",
|
||||
default=lambda self: self.env['ir.sequence'].next_by_code('yuthon_regularization_approval_code'))
|
||||
job_id = fields.Many2one(related='employee_id.job_id', string="主岗")
|
||||
phone = fields.Char(related='employee_id.mobile_phone', string='手机号')
|
||||
onboarding_time = fields.Date(related='employee_id.entry_date', string="入职日期")
|
||||
trial_end_date = fields.Date(related='employee_id.open_start_time', string="试用期结束日期")
|
||||
parent_id = fields.Many2one(related='employee_id.parent_id',string="直线上级")
|
||||
business_leader = fields.Char(string="业务线上级")
|
||||
structure_type_id = fields.Many2one('hr.payroll.structure.type', string="转正前职级")
|
||||
end_date = fields.Date(string="转正日期", compute="_compute_end_date")
|
||||
|
||||
documents_id = fields.Many2one('ir.attachment', string="转正申请书")
|
||||
documents_id1 = fields.Many2one('ir.attachment', string="转正考核表")
|
||||
assessment_rating = fields.Char(string="考核评级")
|
||||
structure_type_id1 = fields.Many2one('hr.payroll.structure.type', string="转正后职级")
|
||||
is_adjust = fields.Boolean(string='是否调整')
|
||||
adjust_reason = fields.Text(string="调整原因")
|
||||
remake = fields.Text(string="备注")
|
||||
|
||||
is_issues = fields.Boolean(string='是否上会')
|
||||
issues_result = fields.Html(string="会议结果")
|
||||
related_issues_id = fields.Many2one('issue.library', string="关联议题")
|
||||
work_end = fields.Boolean(string="结束")
|
||||
# 转正考核
|
||||
job_coach = fields.Char(string="工作指导人一")
|
||||
job_coach2 = fields.Char(string="工作指导人二")
|
||||
scoring_system = fields.Char(string="评分分制")
|
||||
appraisal_total = fields.Char(string="考核权重合计")
|
||||
trial_scores = fields.Char(string="试用考核得分")
|
||||
assessment_date = fields.Date(string="自评日期")
|
||||
self_evaluation = fields.Text(string="自我评价")
|
||||
employee_pros = fields.Text(string="员工优点")
|
||||
improvements = fields.Text(string="需改进事项")
|
||||
documents_ids = fields.Many2many('ir.attachment', string="考核文档")
|
||||
#转正结果
|
||||
positive_results = fields.Char(string="转正结果")
|
||||
positive_date = fields.Date(string="转正日期")
|
||||
is_salary_adjustments = fields.Boolean(string="是否调整薪资")
|
||||
related_notes = fields.Text(string="转正相关说明")
|
||||
approval_regularization = fields.Selection([('none', '未发起'), ('done', '已发起')], string='转正审批状态', default='none')
|
||||
regularization = fields.Selection([('none', '未发起'), ('done', '已发起')], string='试用期考核状态', default='none')
|
||||
regularization_rules = fields.Char(string="转正规则")
|
||||
urgency_level = fields.Selection([('normal', '普件'), ('urgent', '急件'), ('emergency', '特急件')], string='紧急度',
|
||||
default='normal')
|
||||
active = fields.Boolean('Active', default=True, tracking=True)
|
||||
@@ -52,8 +38,39 @@ class YuthonRegularizationPrepareApproval(models.Model):
|
||||
name_title = fields.Char(default=_get_default_name_title)
|
||||
self_users_ids = fields.Many2many('res.users', string="当前经办人", default=lambda self: [(6, 0, [self.env.user.id])])
|
||||
|
||||
#试用信息明细行
|
||||
trial_assessment_ids = fields.One2many('yuthon.trial.scenario.detail.line', 'regularization_login_id', string="试用期考核方案",help='请选择适用本人主岗的试用考核方案,或直接在下方填写')
|
||||
@api.onchange('structure_type_id1')
|
||||
def _onchange_is_adjust(self):
|
||||
if self.structure_type_id1 and self.structure_type_id1 != self.structure_type_id:
|
||||
self.is_adjust = True
|
||||
else:
|
||||
self.is_adjust = False
|
||||
|
||||
@api.depends('users_id')
|
||||
def _compute_end_date(self):
|
||||
for rec in self:
|
||||
if rec.users_id:
|
||||
rec.end_date = rec.users_id.employee_ids.contract_id.end_date + relativedelta(days=1)
|
||||
|
||||
def end_approval(self):
|
||||
for rec in self:
|
||||
version_str = rec.users_id.employee_ids.contract_id.version.lstrip('V')
|
||||
main_version = version_str.split('.')[0]
|
||||
new_main_version = int(main_version) + 1
|
||||
new_version = f"V{new_main_version}.0"
|
||||
original_contract = rec.users_id.employee_ids.contract_id
|
||||
original_contract.write({
|
||||
'state': 'cancel',
|
||||
})
|
||||
new_contract_vals = {
|
||||
'structure_type_id': rec.structure_type_id1.id,
|
||||
'version': new_version,
|
||||
'state': 'open',
|
||||
}
|
||||
new_contract = original_contract.with_context(skip_contract_code_check=True).copy(new_contract_vals)
|
||||
rec.users_id.employee_ids.write({
|
||||
'contract_id': new_contract.id,
|
||||
})
|
||||
|
||||
|
||||
@api.onchange('is_issues')
|
||||
def _onchange_is_issues(self):
|
||||
|
||||
@@ -5,16 +5,10 @@
|
||||
<field name="model">yuthon.regularization.approval</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree>
|
||||
<field name="users_id" string="姓名" widget="ztree_select"/>
|
||||
<field name="phone"/>
|
||||
<field name="onboarding_time"/>
|
||||
<field name="department_id"/>
|
||||
<field name="job_id"/>
|
||||
<field name="job_coach" string="导师"/>
|
||||
<field name="regularization_rules"/>
|
||||
<field name="approval_regularization"/>
|
||||
<field name="regularization"/>
|
||||
<field name="trial_end_date" string="预计转正日期"/>
|
||||
<field name="users_id"/>
|
||||
<field name="end_date"/>
|
||||
<field name="structure_type_id"/>
|
||||
<field name="structure_type_id1"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
@@ -52,87 +46,30 @@
|
||||
<group>
|
||||
<field name="issues_result" invisible="is_issues == False"/>
|
||||
</group>
|
||||
<group string="员工信息" col="3">
|
||||
<group>
|
||||
<field name="users_id" required="1" widget="ztree_select"/>
|
||||
<field name="department_id"/>
|
||||
<field name="onboarding_time"/>
|
||||
<field name="work_end" invisible="1"/>
|
||||
<field name="business_leader"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="employee_id" widget="ztree_select"/>
|
||||
<field name="trial_end_date"/>
|
||||
<field name="phone"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="job_id"/>
|
||||
<field name="parent_id"/>
|
||||
</group>
|
||||
<group string="审批详情">
|
||||
<field name="users_id"/>
|
||||
<field name="department_id" invisible="1"/>
|
||||
<field name="end_date"/>
|
||||
<field name="work_end" invisible="1"/>
|
||||
<field name="documents_id" widget="preview_many2one"/>
|
||||
</group>
|
||||
<group string="转正考核" col="4">
|
||||
<group>
|
||||
<field name="job_coach"/>
|
||||
<field name="trial_scores"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="job_coach2"/>
|
||||
<field name="assessment_date"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="scoring_system"/>
|
||||
<field name="documents_ids" widget="preview_many2many"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="appraisal_total"/>
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="工作详情">
|
||||
<field name="trial_assessment_ids">
|
||||
<tree editable="bottom">
|
||||
<field name="job_responsibilities" required="1"/>
|
||||
<field name="regularization_login_id" column_invisible="1"/>
|
||||
<field name="mission_objectives"/>
|
||||
<field name="completion_flag"/>
|
||||
<field name="weight"/>
|
||||
<field name="completion_score"/>
|
||||
<field name="assessment_scoring"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
</notebook>
|
||||
<group>
|
||||
<field name="self_evaluation"/>
|
||||
<field name="employee_pros"/>
|
||||
<field name="improvements"/>
|
||||
</group>
|
||||
<group col="3" string="转正结果">
|
||||
<group>
|
||||
<field name="positive_results"/>
|
||||
<field name="regularization_rules"/>
|
||||
<field name="related_notes"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="positive_date"/>
|
||||
<field name="approval_regularization"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="is_salary_adjustments"/>
|
||||
<field name="regularization"/>
|
||||
</group>
|
||||
<group string="考核详情">
|
||||
<field name="documents_id1" widget="preview_many2one"/>
|
||||
<field name="structure_type_id"/>
|
||||
<field name="assessment_rating"/>
|
||||
<field name="structure_type_id1"/>
|
||||
<field name="is_adjust"/>
|
||||
<field name="adjust_reason" invisible="is_adjust == False"/>
|
||||
<field name="remake"/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="yuthon_regularization_approval_action" model="ir.actions.act_window">
|
||||
<field name="name">转正申请表</field>
|
||||
<field name="res_model">yuthon.regularization.approval</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
|
||||
|
||||
@@ -9,12 +9,15 @@ from odoo.exceptions import UserError, ValidationError
|
||||
class ProcessingOrderApproval(models.Model):
|
||||
_name = 'processing.order.approval'
|
||||
_description = '处理单审批'
|
||||
_rec_name = 'display_name'
|
||||
_inherit = ['soong.workflow.mixin', 'mail.thread.main.attachment', 'mail.activity.mixin']
|
||||
|
||||
name = fields.Char(string='标题', compute='_compute_name', store=True)
|
||||
name = fields.Char(string='标题', store=True)
|
||||
display_name = fields.Char(string='名称', compute='_compute_name',)
|
||||
code = fields.Char(string="编号",
|
||||
default=lambda self: self.env['ir.sequence'].next_by_code('processing_order_approval_code'))
|
||||
users_id = fields.Many2one('res.users', string="申请人", default=lambda self: self.env.user.id)
|
||||
applicant_id = fields.Many2one('res.users', string="申请人")
|
||||
users_id = fields.Many2one('res.users', string="处理人", default=lambda self: self.env.user.id)
|
||||
department_id = fields.Many2one(related='users_id.employee_id.department_id', string="部门")
|
||||
company_id = fields.Many2one(related='users_id.employee_id.company_id', string="公司")
|
||||
documents_ids = fields.Many2many('ir.attachment', string="维修图片")
|
||||
@@ -51,7 +54,7 @@ class ProcessingOrderApproval(models.Model):
|
||||
],
|
||||
string='故障原因',
|
||||
)
|
||||
processing_results = fields.Selection([('done', '已解决 '), ('undone', '未解决'), ('part', '部分解决')], string="处理结果", default='done')
|
||||
processing_results = fields.Selection([('done', '已解决 '), ('undone', '未解决'), ('part', '部分解决')], string="处理结果", default='undone')
|
||||
is_fee = fields.Boolean(string="是否产生费用")
|
||||
|
||||
labor_costs = fields.Float(string="人工费")
|
||||
@@ -67,18 +70,6 @@ class ProcessingOrderApproval(models.Model):
|
||||
|
||||
name_title = fields.Char(default=_get_default_name_title)
|
||||
|
||||
@api.depends('property_id')
|
||||
def _compute_contract_id(self):
|
||||
for record in self:
|
||||
if record.property_id:
|
||||
contract_id = self.env["property.lease.contract.line"].search(
|
||||
[('address_id', '=', record.property_id.id)],
|
||||
limit=1
|
||||
)
|
||||
else:
|
||||
contract_id = False
|
||||
record.contract_id = contract_id.lease_id.id if contract_id else False
|
||||
|
||||
@api.depends("company_id")
|
||||
def _compute_name(self):
|
||||
self.name = False
|
||||
@@ -87,6 +78,22 @@ class ProcessingOrderApproval(models.Model):
|
||||
if self.device_id:
|
||||
self.name = self.device_id.name + '-处理单'
|
||||
|
||||
@api.depends('property_id')
|
||||
def _compute_contract_id(self):
|
||||
for record in self:
|
||||
contract_id = self.env["property.lease.contract.line"].browse()
|
||||
if record.property_id:
|
||||
contract_id = self.env["property.lease.contract.line"].search(
|
||||
[
|
||||
('address_id', '=', record.property_id.id),
|
||||
],
|
||||
limit=1
|
||||
)
|
||||
if contract_id and contract_id.lease_id:
|
||||
record.contract_id = contract_id.lease_id.id
|
||||
else:
|
||||
record.contract_id = None
|
||||
|
||||
@api.onchange('repair_id')
|
||||
def _onchange_repair_id(self):
|
||||
if self.repair_id:
|
||||
@@ -132,8 +139,18 @@ class ProcessingOrderApproval(models.Model):
|
||||
'remark': remark
|
||||
})
|
||||
|
||||
|
||||
|
||||
|
||||
def end_approval(self):
|
||||
for rec in self:
|
||||
menu_id = self.env['ir.ui.menu'].search([('name', '=', '处理单')])
|
||||
url = f'https://oa.thtzjt.com/web#id={self.id}&cids=2&action={menu_id.action.id}&model=processing.order.approval&view_type=list&menu_id={menu_id.id}'
|
||||
self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa',
|
||||
user_id=rec.applicant_id.employee_id.wecom_userid,
|
||||
title="处理单",
|
||||
description="你有一份已处理的报时报修",
|
||||
url=url, btntxt="详细信息")
|
||||
if rec.device_id:
|
||||
rec.device_id.report_state = 'done'
|
||||
else:
|
||||
rec.repair_id.report_state = 'done'
|
||||
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo import models, fields, api, exceptions, _
|
||||
from odoo.exceptions import UserError, ValidationError
|
||||
|
||||
|
||||
class PropertyDeviceRelief(models.Model):
|
||||
@@ -42,9 +43,12 @@ class PropertyDeviceRelief(models.Model):
|
||||
|
||||
def pull_order(self):
|
||||
soong_workflow_line_list = []
|
||||
self.report_state = 'done'
|
||||
if self.env['processing.order.approval'].search([('device_id', '=', self.id)]):
|
||||
raise UserError('该设备已生成处理单')
|
||||
order_id = self.env['processing.order.approval'].create({
|
||||
'device_id': self.id,
|
||||
'applicant_id': self.users_id.id,
|
||||
'name': self.problem_description,
|
||||
'code': self.env['ir.sequence'].next_by_code('property_device_repair_code'),
|
||||
})
|
||||
workflow_record_id = self.env['soong.workflow.record'].search([
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo import models, fields, api, exceptions, _
|
||||
from odoo.exceptions import UserError
|
||||
|
||||
|
||||
class PropertyRentRelief(models.Model):
|
||||
@@ -65,10 +66,13 @@ class PropertyRentRelief(models.Model):
|
||||
self.phone = False
|
||||
|
||||
def pull_order(self):
|
||||
self.report_state = 'done'
|
||||
soong_workflow_line_list = []
|
||||
if self.env['processing.order.approval'].search([('repair_id', '=', self.id)]):
|
||||
raise UserError('该设备已生成处理单')
|
||||
order_id = self.env['processing.order.approval'].create({
|
||||
'repair_id': self.id,
|
||||
'applicant_id': self.users_id.id,
|
||||
'name': self.problem_description,
|
||||
'code': self.env['ir.sequence'].next_by_code('property_report_repair_code'),
|
||||
})
|
||||
workflow_record_id = self.env['soong.workflow.record'].search([
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
<button name="pull_accounts" type="object" string="生成应收" class="oe_highlight"/>
|
||||
</header>
|
||||
<field name="name"/>
|
||||
<field name="applicant_id"/>
|
||||
<field name="users_id"/>
|
||||
<field name="processing_results"/>
|
||||
<field name="create_time"/>
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
<field name="software_processing_id"/>
|
||||
<field name="report_state"/>
|
||||
<field name="create_time"/>
|
||||
<button name="pull_order" type="object" string="处理" class="btn-primary" invisible="report_state != 'to'"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
<field name="leader_id"/>
|
||||
<field name="report_state"/>
|
||||
<field name="create_time"/>
|
||||
<button name="pull_order" type="object" string="处理" class="btn-primary" invisible="report_state != 'to'"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
Reference in New Issue
Block a user