!2787 添加功能

Merge pull request !2787 from 李鹏宇/dev_zhou
This commit is contained in:
李鹏宇
2025-05-19 14:00:28 +00:00
committed by Gitee
9 changed files with 111 additions and 17 deletions
@@ -26,6 +26,7 @@ class SoongWorkflowLog(models.Model):
approval_state = fields.Selection([('0', '待办'), ('1', '办理中'), ('2', '已办结'), ('3', '结束')], string='状态', default='0')
comment = fields.Char(string="意见")
date_create = fields.Datetime(string="时间", default=lambda self: fields.Datetime.now())
document_ids = fields.Many2many('ir.attachment', string="附件")
active = fields.Boolean(string="归档", default=True)
@api.depends("workflow_id", "node_id", "node_btn_id")
@@ -47,6 +48,13 @@ class SoongWorkflowLog(models.Model):
logs_obj = self.sudo().search([("res_id", "=", record.res_id), ("model", "=", record.model), ("workflow_id", "=", record.workflow_id.id), ("date_create", "<", record.date_create)])
record.sequence = len(logs_obj) + 1
def open_record(self):
return {
"type": "ir.actions.act_window",
"res_model": 'soong.workflow.record',
"view_mode": "tree",
}
class SoongWorkflowLog2(models.Model):
_name = "soong.workflow.log2"
@@ -62,8 +70,10 @@ class SoongWorkflowLog2(models.Model):
done_by = fields.Many2one(comodel_name="res.users", string="审批人")
name = fields.Char(string="节点名称", compute="_compute_name", store=True)
approval_state = fields.Selection([('0', '未读'), ('1', '已读')], string='状态', default='0')
document_ids = fields.Many2many('ir.attachment', string="附件")
lase_click_date = fields.Datetime(string="操作时间")
@api.depends("workflow_id", "node_id", "node_btn_id")
def _compute_name(self):
for rec in self:
+24 -1
View File
@@ -80,7 +80,6 @@ class SoongWorkflowMixin(models.AbstractModel):
string="Workflow Ref.",
compute="_compute_workflow_id",
)
approval_users_ids = fields.One2many("soong.approval.users", "res_id",
domain=lambda self: [('res_model', '=', self._name)], auto_join=True,
string="审批明细")
@@ -123,6 +122,7 @@ class SoongWorkflowMixin(models.AbstractModel):
domain=lambda self: [("model", "=", self._name)], auto_join=True)
log_ids2 = fields.One2many(comodel_name="soong.workflow.log2", inverse_name="res_id", string=" ",
domain=lambda self: [("model", "=", self._name)], auto_join=True)
soong_record_ids = fields.One2many(comodel_name="soong.workflow.line", inverse_name="res_id", string=" ",)
@api.model_create_multi
def create(self, vals_list):
@@ -965,3 +965,26 @@ class SoongWorkflowMixin(models.AbstractModel):
if not isinstance(msg, str):
msg = str(msg)
_logger.info(msg)
class SoongWorkflowLine(models.Model):
_name = "soong.workflow.line"
model = fields.Char(string="Related Document Model", index=True)
res_id = fields.Integer(string="Related Document ID", index=True)
workflow_record_id = fields.Many2one("soong.workflow.record", string="名称")
code = fields.Char(related="workflow_record_id.code", string="流水号")
approvals_group_id = fields.Many2one(related="workflow_record_id.approvals_group_id", string="审批组")
create_uid = fields.Many2one(related="workflow_record_id.create_uid", string="创建人")
write_date2 = fields.Datetime(related="workflow_record_id.write_date2", string="最后更新日期")
def open_record(self):
return {
"type": "ir.actions.act_window",
"res_model": self.workflow_record_id.res_model,
"res_id": self.workflow_record_id.res_id,
"name": self.workflow_record_id.name,
"view_mode": "form",
}
@@ -75,6 +75,15 @@ class SoongWorkflowRecord(models.Model):
return [('id', operator, user_employee.id)]
return (['!'] if operator == '!=' else []) + [('department_id', '=', user_employee.department_id.id)]
def open_record(self):
return {
"type": "ir.actions.act_window",
"res_model": self.res_model,
"res_id": self.res_id,
"name": self.name,
"view_mode": "form",
}
# def get_department_employees(self, department_id):
# valid_user_ids = set()
# employee_ids = self.sudo().env['hr.employee'].search([('department_id', '=', department_id.id)])
@@ -186,12 +195,3 @@ class SoongWorkflowRecord(models.Model):
for record in self:
record.active = False
def open_record(self):
return {
"type": "ir.actions.act_window",
"res_model": self.res_model,
"res_id": self.res_id,
"name": self.name,
"view_mode": "form",
}
+2 -1
View File
@@ -39,4 +39,5 @@ access_soong_workflow_apostille_wizard_user,soong_workflow_apostille_wizard,mode
access_soong_workflow_apostille_ok_wizard_user,soong_workflow_apostille_ok_wizard,model_soong_workflow_apostille_ok_wizard,soong_workflow.group_soong_workflow_user,1,1,1,1
access_soong_workflow_record_delete_wizard,soong_workflow_record_delete_wizard,model_soong_workflow_record_delete_wizard,soong_workflow.group_soong_workflow_user,1,1,1,1
access_role_group_wizard,role_group_wizard,model_role_group_wizard,soong_workflow.group_soong_workflow_user,1,1,1,1
access_soong_workflow_record_revoke_wizard,soong_workflow_record_revoke_wizard,model_soong_workflow_record_revoke_wizard,soong_workflow.group_soong_workflow_user,1,1,1,1
access_soong_workflow_record_revoke_wizard,soong_workflow_record_revoke_wizard,model_soong_workflow_record_revoke_wizard,soong_workflow.group_soong_workflow_user,1,1,1,1
access_soong_workflow_line,soong_workflow_line,model_soong_workflow_line,soong_workflow.group_soong_workflow_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
39 access_soong_workflow_record_revoke_wizard soong_workflow_record_revoke_wizard model_soong_workflow_record_revoke_wizard soong_workflow.group_soong_workflow_user 1 1 1 1
40 access_soong_workflow_line soong_workflow_line model_soong_workflow_line soong_workflow.group_soong_workflow_user 1 1 1 1
41
42
43
@@ -5,13 +5,14 @@
<page string="审批详情" invisible="not log_ids">
<field name="log_ids" style="width:100%%; margin-top: 10px;">
<tree create="false" edit="true" delete="true" editable="bottom">
<field name="sequence" string=""/>
<field name="sequence" string="" column_invisible="1"/>
<field name="name" string=""/>
<field name="done_by" string=""/>
<field name="lase_click_date" string=""/>
<field name="comment" string=""/>
<field name="approval_state" string=""/>
<field name="node_btn_name" string=""/>
<field name="document_ids" string="" widget="preview_many2many"/>
</tree>
</field>
</page>
@@ -25,6 +26,18 @@
</tree>
</field>
</page>
<page string="关联流程" invisible="not log_ids">
<field name="soong_record_ids" style="width:100%%; margin-top: 10px;">
<tree edit="true" delete="true" editable="bottom">
<field name="code"/>
<field name="workflow_record_id"/>
<field name="approvals_group_id"/>
<field name="create_uid"/>
<field name="write_date2"/>
<button name="open_record" type="object" string="详情" class="btn-primary"/>
</tree>
</field>
</page>
</notebook>
</template>
<template id="soong_workflow_log">
@@ -32,19 +45,20 @@
<page string="审批详情" invisible="not log_ids">
<field name="log_ids" style="width:100%%; margin-top: 10px;">
<tree create="false" edit="false" delete="false" editable="bottom" decoration-danger="node_btn_name == '1'">
<field name="sequence" string=""/>
<field name="sequence" string="" column_invisible="1"/>
<field name="name" string=""/>
<field name="done_by" string=""/>
<field name="lase_click_date" string=""/>
<field name="comment" string=""/>
<field name="approval_state" string=""/>
<field name="node_btn_name" string=""/>
<field name="document_ids" string="" widget="preview_many2many"/>
</tree>
</field>
</page>
<page string="抄送/传阅记录" invisible="not log_ids">
<field name="log_ids2" style="width:100%%; margin-top: 10px;">
<tree create="false" edit="false" delete="false" editable="bottom">
<tree edit="true" delete="true" editable="bottom">
<field name="done_by" string=""/>
<field name="name" string=""/>
<field name="approval_state" string=""/>
@@ -52,6 +66,17 @@
</tree>
</field>
</page>
<page string="关联流程" invisible="not log_ids">
<field name="soong_record_ids" style="width:100%%; margin-top: 10px;">
<tree editable="bottom">
<field name="workflow_record_id" domain="[('users_ids', 'in', uid)]"/>
<field name="approvals_group_id"/>
<field name="create_uid"/>
<field name="write_date2"/>
<button name="open_record" type="object" string="详情" class="btn-primary"/>
</tree>
</field>
</page>
</notebook>
</template>
</odoo>
@@ -33,12 +33,15 @@ class PropertyAccountsReceivable(models.Model):
is_billing = fields.Boolean(string='开票')
is_reconciliation = fields.Boolean(string='对账')
difference_amount = fields.Float(string='差额')
is_submitted = fields.Boolean(string='未交')
is_invalid = fields.Boolean(string='作废')
is_red = fields.Boolean(string='红冲')
is_push = fields.Boolean(string='已推送')
management_type_id = fields.Many2one('yuthon.management.type', string='应收类型')
last_update_time = fields.Datetime(string='最后修改时间')
def unlink(self):
return super().unlink()
@@ -12,6 +12,7 @@
<field name="due_date"/>
<field name="original_amount"/>
<field name="discount_amount"/>
<field name="is_submitted"/>
<field name="charge_status" column_invisible="1"/>
<field name="multiplier" column_invisible="1"/>
<field name="is_push" optional="hide"/>
@@ -21,7 +22,7 @@
<field name="is_billing" column_invisible="1"/>
<field name="is_invalid" column_invisible="1"/>
<field name="is_red" column_invisible="1"/>
<field name="is_reconciliation" column_invisible="1"/>
<field name="is_reconciliation" optional="hide"/>
<field name="difference_amount"/>
<button name="unlink" string="删除" type="object" class="oe_highlight"/>
</tree>
@@ -28,4 +28,17 @@
<field name="numbercall">-1</field>
<field eval="False" name="doall"/>
</record>
<record forcecreate="True" id="update_property_contract_receivable" model="ir.cron">
<field name="name">定时任务:更新合同违约金</field>
<field name="model_id" ref="model_property_bank_statements"/>
<field name="state">code</field>
<field name="code">model.contract_penalty()</field>
<field eval="True" name="active"/>
<field name="user_id" ref="base.user_root"/>
<field name="interval_number">1</field>
<field name="interval_type">months</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>
</odoo>
@@ -34,12 +34,23 @@ class PropertyBankStatements(models.Model):
def button_manage(self):
pass
def contract_penalty(self):
statements_ids = self.env['property.bank.statements'].search([])
for record in statements_ids:
self._handle_contract_penalty(record)
def _handle_contract_penalty(self, record):
'''
处理合同违约金
:param record: property.bank.statements 记录
:return:
'''
for contract_id in record.contract_ids:
receivable_id = self.env['property.accounts.receivable'].search([('contract_id', '=', contract_id.id)])
if receivable_id:
dt = datetime.strptime(str(record.start_time), '%Y-%m-%d %H:%M:%S').date()
due = datetime.strptime(str(receivable_id.due_date), '%Y-%m-%d').date()
dt = datetime.strptime(str(record.start_time), '%Y-%m-%d %H:%M:%S').date() # 对账日期
due = datetime.strptime(str(receivable_id.due_date), '%Y-%m-%d').date() # 应收日期
# 判断是否违约
if receivable_id.due_date > record.start_time and not receivable_id.is_reconciliation:
original_amount = (due - dt).days * (receivable_id.original_amount - record.original_amount) * 0.001
@@ -226,6 +237,13 @@ class PropertyAccountsReceivable(models.Model):
penalty = fields.Float(string="违约金")
penalty_date = fields.Date(string="违约金日期")
@api.model
def write(self, vals):
# 当修改 penalty_date 时,自动将 is_reconciliation 设置为 True
if 'penalty_date' in vals:
vals['is_reconciliation'] = True
return super(PropertyAccountsReceivable, self).write(vals)
@api.onchange('penalty_date')
def _onchange_penalty_date(self):
for record in self: