diff --git a/soong_workflow/models/soong_workflow_mixin.py b/soong_workflow/models/soong_workflow_mixin.py
index e577cbde8..32be48522 100644
--- a/soong_workflow/models/soong_workflow_mixin.py
+++ b/soong_workflow/models/soong_workflow_mixin.py
@@ -396,7 +396,7 @@ class SoongWorkflowMixin(models.AbstractModel):
def _add_comment(self, logs, btn_rec):
trans_link_ids = []
wizard = self.env.ref("soong_workflow.view_soong_workflow_comment_wizard")
- workflow_record_id = self.env["soong.workflow.record"].search([("res_model", "=", self._name), ("res_id", "=", self.id)])
+ workflow_record_id = self.env["soong.workflow.record"].search([("res_model", "=", self._name), ("res_id", "=", self.id), ('reclaim_state', '=', False)])
# 状态列表
node_list = btn_rec.workflow_id.node_ids.sorted('sequence')
if self.name_title != '采购申请单':
diff --git a/soong_workflow/models/soong_workflow_record.py b/soong_workflow/models/soong_workflow_record.py
index a7bc97002..6f37131cc 100644
--- a/soong_workflow/models/soong_workflow_record.py
+++ b/soong_workflow/models/soong_workflow_record.py
@@ -498,7 +498,8 @@ class SoongWorkflowRecord(models.Model):
if record_id:
if not hasattr(record_id, 'log_ids'):
continue
- for log in record_id.log_ids:
+ valid_logs = record_id.log_ids.filtered(lambda l: l.node_btn_name != '1')
+ for log in valid_logs:
if log.done_by.name == self.env.user.name:
if log.name == '归档' and (log.approval_state == '0' or log.approval_state == '1'):
record.write({'soong_state': 'to_active'})
diff --git a/yuthon_catering/views/yuthon_catering.xml b/yuthon_catering/views/yuthon_catering.xml
index 0abf85228..706a48611 100644
--- a/yuthon_catering/views/yuthon_catering.xml
+++ b/yuthon_catering/views/yuthon_catering.xml
@@ -15,12 +15,12 @@
+
+
+
+
-
-
-
-
diff --git a/yuthon_hr_attendance/models/yuthon_vacation_reports.py b/yuthon_hr_attendance/models/yuthon_vacation_reports.py
index 3db65e7ac..dabcbff7b 100644
--- a/yuthon_hr_attendance/models/yuthon_vacation_reports.py
+++ b/yuthon_hr_attendance/models/yuthon_vacation_reports.py
@@ -200,6 +200,7 @@ class YuthonVacationReports(models.Model):
"views": [(False, "tree")],
'res_model': 'vacation.meal.line',
'domain': [
+ ('start_time', '>=', datetime(2026, 12, 1)),
('meal', '=', 'yes'),
('vacation_id', '!=', False),
('workflow_id', '!=', False),
diff --git a/yuthon_hr_attendance/wizard/yuthon_vacation_import_wizard.py b/yuthon_hr_attendance/wizard/yuthon_vacation_import_wizard.py
index 2fe0d5053..0153579a3 100644
--- a/yuthon_hr_attendance/wizard/yuthon_vacation_import_wizard.py
+++ b/yuthon_hr_attendance/wizard/yuthon_vacation_import_wizard.py
@@ -46,21 +46,20 @@ class YuthonVacationImportWizard(models.TransientModel):
)
if vacation_id:
- if employee_id.company_id.name == '天河粮储':
- target_leaves = vacation_id.leave_ids.filtered(lambda l: l.text == '年假分配')
- for leave in target_leaves:
- update_value = float(row[1].value) * 8
- if update_value == 0:
- leave.unlink()
- else:
- leave.write({'update_lines': update_value})
- target_leaves1 = vacation_id.leave_ids.filtered(lambda l: l.text == '上月额度继承')
- update_value = float(row[2].value) * 8
- for leave in target_leaves1:
- if update_value == 0:
- leave.unlink()
- else:
- leave.write({'update_lines': update_value})
+ target_leaves = vacation_id.leave_ids.filtered(lambda l: l.text == '年假分配')
+ for leave in target_leaves:
+ update_value = float(row[1].value) * 8
+ if update_value == 0:
+ leave.unlink()
+ else:
+ leave.write({'update_lines': update_value})
+ target_leaves1 = vacation_id.leave_ids.filtered(lambda l: l.text == '上月额度继承')
+ update_value = float(row[2].value) * 8
+ for leave in target_leaves1:
+ if update_value == 0:
+ leave.unlink()
+ else:
+ leave.write({'update_lines': update_value})
target_overtimes = vacation_id.overtime_ids.filtered(lambda o: o.text == '上月额度继承')
diff --git a/yuthon_issue/models/issue_library.py b/yuthon_issue/models/issue_library.py
index 05805a043..38718f46e 100644
--- a/yuthon_issue/models/issue_library.py
+++ b/yuthon_issue/models/issue_library.py
@@ -84,6 +84,10 @@ class IssueLibrary(models.Model):
is_legal_trial = fields.Selection([('no', '否'), ('yes', '是')], string="是否法审", default='no')
workflow_id = fields.Many2one('soong.workflow.record', string="流程")
department_personnel_ids = fields.Many2many('res.users', string='部门人员')
+ is_external_person = fields.Selection([('no', '否'), ('yes', '是')], string="是否有外部人员", default='no')
+ is_admin = fields.Boolean(string='是否管理员', compute='_compute_is_admin')
+ issue_attendee_line_ids = fields.One2many('issue.library.attendee.line', 'issue_library_id', string='列席人员信息')
+ issue_external_person_line_ids = fields.One2many('issue.library.external.person.line', 'issue_library_id', string='外部参会人员')
approval_name = fields.Char(string="审批标题")
meeting_place = fields.Char(string="会议地点")
meeting_name = fields.Char(string="会议名称")
@@ -313,6 +317,11 @@ class IssueLibrary(models.Model):
'issue_state': 'to_approval',
})
+ def _compute_is_admin(self):
+ is_admin = self.env.user.has_group('base.group_system')
+ for rec in self:
+ rec.is_admin = is_admin
+
@api.onchange('is_legal_trial')
def _onchange_is_legal_trial(self):
self.department_personnel_ids = [(5, 0, 0)]
@@ -806,6 +815,28 @@ class IssueLibraryApprovalLine(models.Model):
"view_mode": "form",
}
+class IssueLibraryAttendeeLine(models.Model):
+ _name = "issue.library.attendee.line"
+ _description = '列席人员信息明细'
+
+ issue_library_id = fields.Many2one('issue.library', string="关联议题")
+ attendee_name = fields.Char(string='姓名')
+ company_id = fields.Many2one('res.company', string='公司')
+ department_id = fields.Many2one('hr.department', string='部门')
+ job_position = fields.Char(string='岗位')
+
+
+class IssueLibraryExternalPersonLine(models.Model):
+ _name = "issue.library.external.person.line"
+ _description = '外部参会人员明细'
+
+ issue_library_id = fields.Many2one('issue.library', string="关联议题")
+ person_name = fields.Char(string='姓名')
+ company_unit = fields.Char(string='单位/公司')
+ job_title = fields.Char(string='职务')
+ phone = fields.Char(string='联系电话')
+
+
class IssueLibraryRoomLine(models.Model):
_name = "issue.library.room.line"
_description = '关联会议明细'
diff --git a/yuthon_issue/security/ir.model.access.csv b/yuthon_issue/security/ir.model.access.csv
index 4960211a4..6f491a1f5 100644
--- a/yuthon_issue/security/ir.model.access.csv
+++ b/yuthon_issue/security/ir.model.access.csv
@@ -20,3 +20,5 @@ access_issue_class_approval_line,issue_class_approval_line,model_issue_class_app
access_issue_boss_approval,issue_boss_approval,model_issue_boss_approval,base.group_user,1,1,1,1
access_issue_boss_approval_line,issue_boss_approval_line,model_issue_boss_approval_line,base.group_user,1,1,1,1
+access_issue_library_attendee_line,issue_library_attendee_line,model_issue_library_attendee_line,base.group_user,1,1,1,1
+access_issue_library_external_person_line,issue_library_external_person_line,model_issue_library_external_person_line,base.group_user,1,1,1,1
diff --git a/yuthon_issue/views/issue_library_views.xml b/yuthon_issue/views/issue_library_views.xml
index 1ca9c149b..c7afeef0b 100644
--- a/yuthon_issue/views/issue_library_views.xml
+++ b/yuthon_issue/views/issue_library_views.xml
@@ -156,13 +156,13 @@
+ readonly="not is_admin and issue_state not in ['to_do', 'cancel','to_modify']"/>
+ readonly="not is_admin and issue_state not in ['to_do', 'cancel','to_modify']"/>
-
-
+ readonly="not is_admin and issue_state not in ['to_do', 'cancel','to_modify']"/>
+
+
@@ -171,12 +171,15 @@
-
+
+
+
-
+ readonly="not is_admin and issue_state not in ['to_do', 'cancel','to_modify']"/>
@@ -192,21 +195,21 @@
+ readonly="not is_admin and issue_state not in ['to_do', 'cancel','to_modify']"/>
+ readonly="not is_admin and issue_state not in ['to_do', 'cancel','to_modify']"/>
+ string="党支部会" readonly="not is_admin and issue_state not in ['to_do', 'cancel','to_modify']"/>
-
+
+ readonly="not is_admin and issue_state not in ['to_do', 'cancel','to_modify']"/>
@@ -234,6 +237,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yuthon_property/views/yuthon_property_views.xml b/yuthon_property/views/yuthon_property_views.xml
index 9635f43ae..9ca39b7fe 100644
--- a/yuthon_property/views/yuthon_property_views.xml
+++ b/yuthon_property/views/yuthon_property_views.xml
@@ -65,10 +65,13 @@
-
+
+
+
+
@@ -90,7 +93,6 @@
-
diff --git a/yuthon_report/models/receivable_report.py b/yuthon_report/models/receivable_report.py
index c23970f27..c6f5061fa 100644
--- a/yuthon_report/models/receivable_report.py
+++ b/yuthon_report/models/receivable_report.py
@@ -6,6 +6,37 @@ from odoo import fields, models, api
class YuthonProperty(models.Model):
_inherit = 'property.accounts.receivable'
+ # 固定费用类型列(用于报表横向展示)
+ FEE_COLUMNS = ['租金', '管理费', '水费', '电费', '违约金', '其他费用']
+
+ def _get_tax_rate_display(self, rec):
+ """从合同获取税率显示字符串"""
+ try:
+ tr = rec.contract_id.tax_rate.name if rec.contract_id and rec.contract_id.tax_rate else None
+ if tr and str(tr).replace('%', '').strip():
+ v = float(str(tr).replace('%', '').strip())
+ return f"{v:.1f}%"
+ except (ValueError, TypeError):
+ pass
+ return "0.0%"
+
+ def _classify_fee_type(self, type_name):
+ """将应收类型归类到固定列"""
+ if not type_name:
+ return '其他费用'
+ if '租' in type_name:
+ return '租金'
+ elif '管理' in type_name or '管' in type_name:
+ return '管理费'
+ elif '水' in type_name:
+ return '水费'
+ elif '电' in type_name:
+ return '电费'
+ elif '违约' in type_name:
+ return '违约金'
+ else:
+ return '其他费用'
+
@api.model
def get_complete_ledger_report(self, params):
domain = []
@@ -25,75 +56,82 @@ class YuthonProperty(models.Model):
date_end = datetime.datetime.fromisoformat(params.get("date_end")).date()
domain.append(("due_date", "<=", date_end))
- # condition, 这里需要放到具体的搜索条件中 domain .
condition = params.get('condition', False)
partner_id = params.get('partner_id', False)
company_id = params.get('company_id', False)
if condition:
domain.append(('tenure_type', '=', condition))
-
if partner_id:
domain.append(('precinct_id', '=', partner_id))
if company_id:
domain.append(('company_id', '=', company_id))
- receivables = self.search(domain)
- management_type_map = dict(
- self.env['yuthon.management.type'].search([]).mapped(lambda r: (r.id, r.name))
- )
- invoice_type_map = dict(
- self._fields['invoice_type']._description_selection(self.env)
- )
-
+ receivables = self.search(domain, order="contract_id asc, due_date asc")
+
+ # 按合同分组
+ contract_map = {}
+ for rec in receivables:
+ cid = rec.contract_id.id if rec.contract_id else 0
+ if cid not in contract_map:
+ contract_map[cid] = {
+ 'recs': [],
+ 'info_rec': rec, # 取第一条记录作为基础信息
+ }
+ contract_map[cid]['recs'].append(rec)
+
rows = []
- type_totals = {}
- total_amount = 0.0
-
- for idx, rec in enumerate(receivables, start=1):
- mgmt_type = management_type_map.get(rec.management_type_id.id, "") if rec.management_type_id else "未分类"
- amount = rec.original_amount or 0.0
- total_amount += amount
-
- if mgmt_type not in type_totals:
- type_totals[mgmt_type] = {'amount': 0.0}
- type_totals[mgmt_type]['amount'] += amount
-
- rows.append({
+ total_fees = {col: 0.0 for col in self.FEE_COLUMNS}
+ total_subtotal = 0.0
+ idx = 1
+
+ for cid, data in contract_map.items():
+ info_rec = data['info_rec']
+ fee_row = {col: 0.0 for col in self.FEE_COLUMNS}
+
+ # 归类费用
+ for rec in data['recs']:
+ type_name = rec.management_type_id.name if rec.management_type_id else ''
+ col = self._classify_fee_type(type_name)
+ fee_row[col] += rec.original_amount or 0.0
+
+ subtotal = sum(fee_row.values())
+ for col in self.FEE_COLUMNS:
+ total_fees[col] += fee_row[col]
+ total_subtotal += subtotal
+
+ row = {
"序号": idx,
- "应收类型": mgmt_type,
- "应收开始": rec.due_date.strftime("%Y-%m-%d") if rec.due_date else "",
- "应收结束": rec.due_date_end.strftime("%Y-%m-%d") if rec.due_date_end else "",
- "当期金额": round(amount, 2),
+ "应收开始": info_rec.due_date.strftime("%Y-%m-%d") if info_rec.due_date else "",
+ "应收结束": info_rec.due_date_end.strftime("%Y-%m-%d") if info_rec.due_date_end else "",
"合同编号": {
'model': 'property.lease.contract',
- 'id': rec.contract_id.id,
- 'display_name': rec.contract_id.contract_code,
- } if rec.contract_id else "",
+ 'id': info_rec.contract_id.id,
+ 'display_name': info_rec.contract_id.contract_code,
+ } if info_rec.contract_id else "",
"承租方": {
'model': 'property.tenant.information',
- 'id': rec.lessee_id.id,
- 'display_name': rec.lessee_id.name,
- } if rec.lessee_id else "",
- "物业名称": rec.property_name or "",
- "产权证号": rec.title_deed or "",
- "发票类型": rec.lessee_id.invoicing_ids[0].invoicing_type_id.name if rec.lessee_id and rec.lessee_id.invoicing_ids else "",
- "税率": (
- lambda tr: (
- lambda v: f"{v:.1f}%" if v is not None else "0.0%"
- )(
- float(str(tr).replace('%', '').strip())
- if tr and str(tr).replace('%', '').strip()
- else None
- )
- )(rec.contract_id.tax_rate.name if rec.contract_id and rec.contract_id.tax_rate else None)
- })
-
+ 'id': info_rec.lessee_id.id,
+ 'display_name': info_rec.lessee_id.name,
+ } if info_rec.lessee_id else "",
+ "物业名称": info_rec.property_name or "",
+ "产权证号": info_rec.title_deed or "",
+ "发票类型": info_rec.lessee_id.invoicing_ids[0].invoicing_type_id.name if info_rec.lessee_id and info_rec.lessee_id.invoicing_ids else "",
+ "税率": self._get_tax_rate_display(info_rec),
+ }
+ # 加入各费用列
+ for col in self.FEE_COLUMNS:
+ row[col] = round(fee_row[col], 2) if fee_row[col] else ""
+ row["小计"] = round(subtotal, 2)
+ rows.append(row)
+ idx += 1
+
+ # 合计行
summary_stats = []
- for type_name in sorted(type_totals.keys()):
- summary_stats.append({'name': type_name, 'amount': round(type_totals[type_name]['amount'], 2)})
- summary_stats.append({'name': '总合计', 'amount': round(total_amount, 2)})
-
+ for col in self.FEE_COLUMNS:
+ summary_stats.append({'name': col, 'amount': round(total_fees[col], 2)})
+ summary_stats.append({'name': '小计合计', 'amount': round(total_subtotal, 2)})
+
return {"rows": rows, "stats": summary_stats}
@api.model
diff --git a/yuthon_report/static/src/components/yuthon_report/receivable_report.js b/yuthon_report/static/src/components/yuthon_report/receivable_report.js
index 3ec1ae6c4..de00fdff0 100644
--- a/yuthon_report/static/src/components/yuthon_report/receivable_report.js
+++ b/yuthon_report/static/src/components/yuthon_report/receivable_report.js
@@ -112,6 +112,16 @@ class ReceivableReport extends Component {
},
context: {
actionService: this.actionService // 传递 actionService 用于穿透跳转
+ },
+ onFilterChanged: () => {
+ // 过滤后重新编号序号列
+ let num = 1;
+ this.grid.forEachNodeAfterFilter((node) => {
+ if (node.data) {
+ node.data['序号'] = num++;
+ }
+ });
+ this.grid.refreshCells({ columns: ['序号'], force: true });
}
};
@@ -287,6 +297,8 @@ class ReceivableReport extends Component {
this.state.stats = [];
}
}
+ // 数据刷新后重新应用收款类型过滤
+ this._applyManagementTypeFilter();
}
onExportExcel() {
@@ -305,10 +317,40 @@ class ReceivableReport extends Component {
}
}
+ // 费用类型名称 → 数据列字段名映射
+ _getFeeColumnByTypeName(typeName) {
+ if (!typeName) return null;
+ if (typeName.includes('租')) return '租金';
+ if (typeName.includes('管理') || typeName.includes('管')) return '管理费';
+ if (typeName.includes('水')) return '水费';
+ if (typeName.includes('电')) return '电费';
+ if (typeName.includes('违约')) return '违约金';
+ return '其他费用';
+ }
+
async onUpdateManagementType(v) {
this.state.selectManagementType = v[0] || {};
- // 自动搜索
- await this.onSearch()
+ // 应用前端过滤(不重新请求后端)
+ this._applyManagementTypeFilter();
+ }
+
+ _applyManagementTypeFilter() {
+ if (!this.grid) return;
+ const typeName = this.state.selectManagementType?.display_name || '';
+ if (!typeName) {
+ // 无选择,清除外部过滤
+ this.grid.setGridOption('isExternalFilterPresent', () => false);
+ this.grid.setGridOption('doesExternalFilterPass', () => true);
+ } else {
+ const col = this._getFeeColumnByTypeName(typeName);
+ this.grid.setGridOption('isExternalFilterPresent', () => true);
+ this.grid.setGridOption('doesExternalFilterPass', (node) => {
+ if (!node.data) return true;
+ const val = node.data[col];
+ return val !== '' && val !== null && val !== undefined && val !== 0;
+ });
+ }
+ this.grid.onFilterChanged();
}
onChangeCondition() {
diff --git a/yuthon_report/views/receivable_report_views.xml b/yuthon_report/views/receivable_report_views.xml
index 132782f32..47ba3164e 100644
--- a/yuthon_report/views/receivable_report_views.xml
+++ b/yuthon_report/views/receivable_report_views.xml
@@ -11,16 +11,22 @@
"model": "property.accounts.receivable",
"method": "get_complete_ledger_report",
"columns": [
- {"headerName": "应收类型", "field": "应收类型", "flex": 1},
+ {"headerName": "序号", "field": "序号", "width": 70, "flex": 0, "pinned": "left"},
{"headerName": "应收开始", "field": "应收开始", "flex": 1},
{"headerName": "应收结束", "field": "应收结束", "flex": 1},
- {"headerName": "当期金额", "field": "当期金额", "flex": 1, "type": "number"},
{"headerName": "合同编号", "field": "合同编号", "flex": 1},
{"headerName": "承租方", "field": "承租方", "flex": 1},
- {"headerName": "物业名称", "field": "物业名称", "flex": 1},
+ {"headerName": "物业名称", "field": "物业名称", "flex": 2},
{"headerName": "产权证号", "field": "产权证号", "flex": 1},
{"headerName": "发票类型", "field": "发票类型", "flex": 1},
- {"headerName": "税率", "field": "税率", "flex": 1}
+ {"headerName": "税率", "field": "税率", "flex": 1},
+ {"headerName": "租金", "field": "租金", "flex": 1, "type": "number"},
+ {"headerName": "管理费", "field": "管理费", "flex": 1, "type": "number"},
+ {"headerName": "水费", "field": "水费", "flex": 1, "type": "number"},
+ {"headerName": "电费", "field": "电费", "flex": 1, "type": "number"},
+ {"headerName": "违约金", "field": "违约金", "flex": 1, "type": "number"},
+ {"headerName": "其他费用", "field": "其他费用", "flex": 1, "type": "number"},
+ {"headerName": "小计", "field": "小计", "flex": 1, "type": "number"}
]
}
}
diff --git a/yuthon_salary/models/yuthon_meal_expenses.py b/yuthon_salary/models/yuthon_meal_expenses.py
index a82d17c9a..ddf3444aa 100644
--- a/yuthon_salary/models/yuthon_meal_expenses.py
+++ b/yuthon_salary/models/yuthon_meal_expenses.py
@@ -21,7 +21,7 @@ class YuthonMealExpenses(models.Model):
select_year = fields.Selection(selection=[(str(i), str(i)) for i in range(2024, 2040)], string='年份',
default=lambda self: str(datetime.now().year))
meal_state = fields.Selection([('to_do', '待发送'), ('done', '已发送')], string='状态', default='to_do')
- toll_state = fields.Selection([('to_do', '未缴'), ('done', '已缴')], string='状态', default='to_do')
+ toll_state = fields.Selection([('to_do', '待缴'), ('done', '已缴')], string='缴费状态', default='to_do')
@api.depends('number_breakfasts', 'number_lunches')
diff --git a/yuthon_salary/models/yuthon_salary_party.py b/yuthon_salary/models/yuthon_salary_party.py
index 5f7a33419..d0c01d9aa 100644
--- a/yuthon_salary/models/yuthon_salary_party.py
+++ b/yuthon_salary/models/yuthon_salary_party.py
@@ -20,7 +20,7 @@ class YuthonSalaryParty(models.Model):
select_year = fields.Selection(selection=[(str(i), str(i)) for i in range(2024, 2040)], string='年份',
default=lambda self: str(datetime.now().year))
party_state = fields.Selection([('to_do', '待发送'), ('done', '已发送')], string='状态', default='to_do')
- toll_state = fields.Selection([('to_do', '未缴'), ('done', '已缴')], string='状态', default='to_do')
+ toll_state = fields.Selection([('to_do', '待缴'), ('done', '已缴')], string='缴费状态', default='to_do')
def toll_confirm(self):
self.toll_state = 'done'
diff --git a/yuthon_salary/views/yuthon_meal_expenses_views.xml b/yuthon_salary/views/yuthon_meal_expenses_views.xml
index 8c4bec6fa..5941e4d03 100644
--- a/yuthon_salary/views/yuthon_meal_expenses_views.xml
+++ b/yuthon_salary/views/yuthon_meal_expenses_views.xml
@@ -32,6 +32,7 @@
+
diff --git a/yuthon_salary/views/yuthon_salary_party_views.xml b/yuthon_salary/views/yuthon_salary_party_views.xml
index fcc6918cb..eede7f7d7 100644
--- a/yuthon_salary/views/yuthon_salary_party_views.xml
+++ b/yuthon_salary/views/yuthon_salary_party_views.xml
@@ -13,6 +13,7 @@
+
diff --git a/yuthon_salary/wizard/party_meal_wizard.py b/yuthon_salary/wizard/party_meal_wizard.py
index 3a1202608..d62efe088 100644
--- a/yuthon_salary/wizard/party_meal_wizard.py
+++ b/yuthon_salary/wizard/party_meal_wizard.py
@@ -48,7 +48,8 @@ class PartyMealWizard(models.TransientModel):
employee_list = []
meal_ids = self.env['yuthon.meal.expenses'].search([('select_time', '=', self.meal_month),
('select_year', '=', self.meal_year),
- ('meal_state', '=', 'to_do')
+ ('meal_state', '=', 'to_do'),
+ ('toll_state', '=', 'to_do')
])
for meal_id in meal_ids:
employee_list.append(meal_id.employee_id.id)
@@ -62,7 +63,8 @@ class PartyMealWizard(models.TransientModel):
for employee in self.employee_ids:
meal = self.env['yuthon.meal.expenses'].search([('employee_id', '=', employee.id),
('select_time', '=', self.select_time),
- ('select_year', '=', self.select_year)])
+ ('select_year', '=', self.select_year),
+ ('toll_state', '=', 'to_do')])
self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa',
user_id=employee.wecom_userid,
title="缴纳餐费提醒",
diff --git a/yuthon_salary/wizard/party_send_wizard.py b/yuthon_salary/wizard/party_send_wizard.py
index 56d72c4d3..5deb07073 100644
--- a/yuthon_salary/wizard/party_send_wizard.py
+++ b/yuthon_salary/wizard/party_send_wizard.py
@@ -44,7 +44,8 @@ class PartySendWizard(models.TransientModel):
employee_list = []
party_ids = self.env['yuthon.salary.party'].search([('select_time', '=', self.party_month),
('select_year', '=', self.party_year),
- ('party_state', '=', 'to_do')
+ ('party_state', '=', 'to_do'),
+ ('toll_state', '=', 'to_do')
])
for party_id in party_ids:
employee_list.append(party_id.employee_id.id)
@@ -56,7 +57,8 @@ class PartySendWizard(models.TransientModel):
for employee in self.employee_ids:
party = self.env['yuthon.salary.party'].search([('employee_id', '=', employee.id),
('select_time', '=', self.select_time),
- ('select_year', '=', self.select_year)])
+ ('select_year', '=', self.select_year),
+ ('toll_state', '=', 'to_do')])
self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa',
user_id=employee.wecom_userid,
title="缴纳党费提醒",