当前流程是否结束,请确认
diff --git a/yuthon_holiday/views/hr_leave_batch.xml b/yuthon_holiday/views/hr_leave_batch.xml
index 785f57890..5d9b68de4 100644
--- a/yuthon_holiday/views/hr_leave_batch.xml
+++ b/yuthon_holiday/views/hr_leave_batch.xml
@@ -30,7 +30,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_holiday/views/yuthon_breastfeed_leave_views.xml b/yuthon_holiday/views/yuthon_breastfeed_leave_views.xml
index 3cadb567d..86eaff653 100644
--- a/yuthon_holiday/views/yuthon_breastfeed_leave_views.xml
+++ b/yuthon_holiday/views/yuthon_breastfeed_leave_views.xml
@@ -22,7 +22,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_holiday/views/yuthon_fixes_approval_views.xml b/yuthon_holiday/views/yuthon_fixes_approval_views.xml
index 30ddc8827..6fc81dc5d 100644
--- a/yuthon_holiday/views/yuthon_fixes_approval_views.xml
+++ b/yuthon_holiday/views/yuthon_fixes_approval_views.xml
@@ -20,7 +20,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_attendance/views/back_approval.xml b/yuthon_hr_attendance/views/back_approval.xml
index 1912d1245..f2ef3960c 100644
--- a/yuthon_hr_attendance/views/back_approval.xml
+++ b/yuthon_hr_attendance/views/back_approval.xml
@@ -21,7 +21,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_attendance/views/card_approval.xml b/yuthon_hr_attendance/views/card_approval.xml
index d1872014b..c6bc85c5e 100644
--- a/yuthon_hr_attendance/views/card_approval.xml
+++ b/yuthon_hr_attendance/views/card_approval.xml
@@ -25,7 +25,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_attendance/views/duty_approval.xml b/yuthon_hr_attendance/views/duty_approval.xml
index e963668eb..9d3b8dc90 100644
--- a/yuthon_hr_attendance/views/duty_approval.xml
+++ b/yuthon_hr_attendance/views/duty_approval.xml
@@ -19,7 +19,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_attendance/views/expatriation_approval.xml b/yuthon_hr_attendance/views/expatriation_approval.xml
index 968e94d80..93c8116c1 100644
--- a/yuthon_hr_attendance/views/expatriation_approval.xml
+++ b/yuthon_hr_attendance/views/expatriation_approval.xml
@@ -21,7 +21,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_attendance/views/go_approval.xml b/yuthon_hr_attendance/views/go_approval.xml
index 82ba1f253..cc911b7f0 100644
--- a/yuthon_hr_attendance/views/go_approval.xml
+++ b/yuthon_hr_attendance/views/go_approval.xml
@@ -22,7 +22,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_attendance/views/leave_approval.xml b/yuthon_hr_attendance/views/leave_approval.xml
index d16bc8363..2c3888aee 100644
--- a/yuthon_hr_attendance/views/leave_approval.xml
+++ b/yuthon_hr_attendance/views/leave_approval.xml
@@ -29,7 +29,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_attendance/views/meal_approval.xml b/yuthon_hr_attendance/views/meal_approval.xml
index 7c7357e71..aea10daf3 100644
--- a/yuthon_hr_attendance/views/meal_approval.xml
+++ b/yuthon_hr_attendance/views/meal_approval.xml
@@ -20,7 +20,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_attendance/views/overtime_approval.xml b/yuthon_hr_attendance/views/overtime_approval.xml
index be8b8741d..43a23976d 100644
--- a/yuthon_hr_attendance/views/overtime_approval.xml
+++ b/yuthon_hr_attendance/views/overtime_approval.xml
@@ -24,7 +24,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_attendance/views/remove_holiday_approval.xml b/yuthon_hr_attendance/views/remove_holiday_approval.xml
index 7358e5483..7146fac86 100644
--- a/yuthon_hr_attendance/views/remove_holiday_approval.xml
+++ b/yuthon_hr_attendance/views/remove_holiday_approval.xml
@@ -24,7 +24,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_attendance/views/yuthon_abnormal_approval_views.xml b/yuthon_hr_attendance/views/yuthon_abnormal_approval_views.xml
index 6fc578ecf..59a93933f 100644
--- a/yuthon_hr_attendance/views/yuthon_abnormal_approval_views.xml
+++ b/yuthon_hr_attendance/views/yuthon_abnormal_approval_views.xml
@@ -21,7 +21,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_attendance/views/yuthon_adjustments_approval_views.xml b/yuthon_hr_attendance/views/yuthon_adjustments_approval_views.xml
index a9e04448c..c15c8050d 100644
--- a/yuthon_hr_attendance/views/yuthon_adjustments_approval_views.xml
+++ b/yuthon_hr_attendance/views/yuthon_adjustments_approval_views.xml
@@ -21,7 +21,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_attendance/views/yuthon_customer_approval_views.xml b/yuthon_hr_attendance/views/yuthon_customer_approval_views.xml
index 8c12ae755..3b4361673 100644
--- a/yuthon_hr_attendance/views/yuthon_customer_approval_views.xml
+++ b/yuthon_hr_attendance/views/yuthon_customer_approval_views.xml
@@ -20,7 +20,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_attendance/views/yuthon_shift_approval_views.xml b/yuthon_hr_attendance/views/yuthon_shift_approval_views.xml
index 4ba973976..99dadb989 100644
--- a/yuthon_hr_attendance/views/yuthon_shift_approval_views.xml
+++ b/yuthon_hr_attendance/views/yuthon_shift_approval_views.xml
@@ -24,7 +24,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_attendance/views/yuthon_special_approval_views.xml b/yuthon_hr_attendance/views/yuthon_special_approval_views.xml
index 8f9695c29..fb0c430e7 100644
--- a/yuthon_hr_attendance/views/yuthon_special_approval_views.xml
+++ b/yuthon_hr_attendance/views/yuthon_special_approval_views.xml
@@ -24,7 +24,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_employee_approval/models/yuthon_leaving_approval.py b/yuthon_hr_employee_approval/models/yuthon_leaving_approval.py
index 9007ff877..901f2d54b 100644
--- a/yuthon_hr_employee_approval/models/yuthon_leaving_approval.py
+++ b/yuthon_hr_employee_approval/models/yuthon_leaving_approval.py
@@ -60,6 +60,7 @@ class YuthonLeavingApproval(models.Model):
record.employee_id.user_state = 'leave'
if record.employee_id.contract_id:
record.employee_id.contract_id.state = 'cancel'
+ record.employee_id.contract_id.termination_date = record.separation_date
record.is_execution = True
def action_print_leaving_approval(self):
diff --git a/yuthon_hr_employee_approval/views/contract_review_approval_views.xml b/yuthon_hr_employee_approval/views/contract_review_approval_views.xml
index eb3ab551c..d346df31c 100644
--- a/yuthon_hr_employee_approval/views/contract_review_approval_views.xml
+++ b/yuthon_hr_employee_approval/views/contract_review_approval_views.xml
@@ -27,7 +27,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_employee_approval/views/property_reimbursement_form_views.xml b/yuthon_hr_employee_approval/views/property_reimbursement_form_views.xml
index 597057d81..780ebd266 100644
--- a/yuthon_hr_employee_approval/views/property_reimbursement_form_views.xml
+++ b/yuthon_hr_employee_approval/views/property_reimbursement_form_views.xml
@@ -20,7 +20,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_employee_approval/views/yuthon_appointment_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_appointment_approval_views.xml
index 6f0c19880..49f291d2d 100644
--- a/yuthon_hr_employee_approval/views/yuthon_appointment_approval_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_appointment_approval_views.xml
@@ -24,7 +24,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_employee_approval/views/yuthon_department_change_viwes.xml b/yuthon_hr_employee_approval/views/yuthon_department_change_viwes.xml
index 956ea5565..c24886b8a 100644
--- a/yuthon_hr_employee_approval/views/yuthon_department_change_viwes.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_department_change_viwes.xml
@@ -23,7 +23,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_employee_approval/views/yuthon_employee_add_views.xml b/yuthon_hr_employee_approval/views/yuthon_employee_add_views.xml
index d649edb26..4080f14ab 100644
--- a/yuthon_hr_employee_approval/views/yuthon_employee_add_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_employee_add_views.xml
@@ -20,7 +20,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_employee_approval/views/yuthon_interview_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_interview_approval_views.xml
index d16ab58c7..9c9d5337a 100644
--- a/yuthon_hr_employee_approval/views/yuthon_interview_approval_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_interview_approval_views.xml
@@ -26,7 +26,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_employee_approval/views/yuthon_leaving_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_leaving_approval_views.xml
index 3cdff96d3..e37e8278a 100644
--- a/yuthon_hr_employee_approval/views/yuthon_leaving_approval_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_leaving_approval_views.xml
@@ -27,7 +27,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_employee_approval/views/yuthon_message_login_views.xml b/yuthon_hr_employee_approval/views/yuthon_message_login_views.xml
index f7de9a13a..cde0fe5c3 100644
--- a/yuthon_hr_employee_approval/views/yuthon_message_login_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_message_login_views.xml
@@ -26,7 +26,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_employee_approval/views/yuthon_onboard_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_onboard_approval_views.xml
index 5af48dd76..52c58c4b8 100644
--- a/yuthon_hr_employee_approval/views/yuthon_onboard_approval_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_onboard_approval_views.xml
@@ -26,7 +26,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_employee_approval/views/yuthon_pre_examination_views.xml b/yuthon_hr_employee_approval/views/yuthon_pre_examination_views.xml
index 375ab0efb..fc9a5d220 100644
--- a/yuthon_hr_employee_approval/views/yuthon_pre_examination_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_pre_examination_views.xml
@@ -21,7 +21,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_employee_approval/views/yuthon_prepare_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_prepare_approval_views.xml
index e20d23b60..1bfb350cf 100644
--- a/yuthon_hr_employee_approval/views/yuthon_prepare_approval_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_prepare_approval_views.xml
@@ -21,7 +21,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_employee_approval/views/yuthon_reassignment_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_reassignment_approval_views.xml
index fd4841702..04fc6dbd3 100644
--- a/yuthon_hr_employee_approval/views/yuthon_reassignment_approval_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_reassignment_approval_views.xml
@@ -26,7 +26,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_employee_approval/views/yuthon_recruitment_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_recruitment_approval_views.xml
index a555482c6..f795f6796 100644
--- a/yuthon_hr_employee_approval/views/yuthon_recruitment_approval_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_recruitment_approval_views.xml
@@ -24,7 +24,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_employee_approval/views/yuthon_regularization_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_regularization_approval_views.xml
index 0f648c3d0..18b371614 100644
--- a/yuthon_hr_employee_approval/views/yuthon_regularization_approval_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_regularization_approval_views.xml
@@ -22,7 +22,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_employee_approval/views/yuthon_renewal_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_renewal_approval_views.xml
index 40b67e724..5b43511d6 100644
--- a/yuthon_hr_employee_approval/views/yuthon_renewal_approval_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_renewal_approval_views.xml
@@ -21,7 +21,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_employee_approval/views/yuthon_retired_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_retired_approval_views.xml
index 3330b2eb4..074096552 100644
--- a/yuthon_hr_employee_approval/views/yuthon_retired_approval_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_retired_approval_views.xml
@@ -22,7 +22,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_employee_approval/views/yuthon_reward_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_reward_approval_views.xml
index 8b443fbf3..d58ffdcf7 100644
--- a/yuthon_hr_employee_approval/views/yuthon_reward_approval_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_reward_approval_views.xml
@@ -23,7 +23,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_employee_approval/views/yuthon_service_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_service_approval_views.xml
index a63fd49b8..8d30863a8 100644
--- a/yuthon_hr_employee_approval/views/yuthon_service_approval_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_service_approval_views.xml
@@ -23,7 +23,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_employee_approval/views/yuthon_social_files_approval_view.xml b/yuthon_hr_employee_approval/views/yuthon_social_files_approval_view.xml
index 293b12ec4..d5dfe1c55 100644
--- a/yuthon_hr_employee_approval/views/yuthon_social_files_approval_view.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_social_files_approval_view.xml
@@ -37,7 +37,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_hr_employee_approval/views/yuthon_transfer_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_transfer_approval_views.xml
index 639013102..f052adabd 100644
--- a/yuthon_hr_employee_approval/views/yuthon_transfer_approval_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_transfer_approval_views.xml
@@ -24,7 +24,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_issue/models/inherit_room_booking.py b/yuthon_issue/models/inherit_room_booking.py
index 6018fd3ac..3f223a3da 100644
--- a/yuthon_issue/models/inherit_room_booking.py
+++ b/yuthon_issue/models/inherit_room_booking.py
@@ -11,6 +11,16 @@ class RoomBooking(models.Model):
number_of_meetings = fields.Integer(string='会议次数')
minutes_id = fields.Many2one('issue.meeting.minutes', string='会议纪要流程')
+ @api.depends('number_of_meetings', 'meeting_type_id', 'start_datetime')
+ def _compute_name(self):
+ if self.meeting_type_id and self.start_datetime:
+ if self.number_of_meetings:
+ self.name = str(self.start_datetime.date()) + f'第{self.number_of_meetings}次' + self.meeting_type_id.name
+ else:
+ self.name = str(self.start_datetime.date()) + self.meeting_type_id.name
+ else:
+ self.name = ''
+
def end_approval(self):
self.write({'work_end': True})
for meet in self.issue_meeting_line_ids:
@@ -22,14 +32,17 @@ class RoomBooking(models.Model):
meet.issue_library_id.class_char = str(self.start_datetime.date()) + f'第{self.number_of_meetings}' + self.meeting_type_id.name
if '董事' in meeting_type_name:
meet.issue_library_id.boss_char = str(self.start_datetime.date()) + self.meeting_type_id.name
+ if self.code:
+ self.env['issue.library.approval.line'].create({
+ 'issue_library_id': meet.issue_library_id.id,
+ 'code': self.code,
+ 'approval_date': fields.Datetime.now() + timedelta(hours=8),
+ })
def bottom_meeting_approval(self):
library_data = []
for library in self.issue_meeting_line_ids:
- if library.state == 'done':
- raise UserError('当前纪要不允许重复提交')
- library.state = 'done'
library_data.append((0, 0, {
'minutes_id': library.issue_library_id.id,
'decision_results': library.decision_results,
@@ -46,41 +59,26 @@ class RoomBooking(models.Model):
'default_host': self.host.id,
'default_meeting_type_id': self.meeting_type_id.id,
'default_meeting_date': self.start_datetime,
+ 'default_room_id': self.room_id.id,
'default_number_of_meetings': self.number_of_meetings,
'default_meeting_minutes_ids': library_data
}}
- @api.model_create_multi
- def create(self, vals_list):
- # 步骤1:先调用父类create方法,批量创建主记录,获取有效记录集
- res = super().create(vals_list)
- if not res:
- return res
- for idx, (main_record, vals) in enumerate(zip(res, vals_list)):
- issue_meeting_lines = vals.get('issue_meeting_line_ids', [])
- if not isinstance(issue_meeting_lines, list):
+ @api.constrains('issue_meeting_line_ids', 'room_id', 'meeting_type_id', 'start_datetime')
+ def _constrains_create_room_line(self):
+ for main_record in self:
+ if not (main_record.issue_meeting_line_ids and main_record.room_id and main_record.meeting_type_id):
continue
- for line_triple in issue_meeting_lines:
- if not (isinstance(line_triple, (list, tuple)) and len(line_triple) == 3):
- continue
- line_state, line_id, line_vals = line_triple
- if line_state != 0 or not isinstance(line_vals, dict):
- continue
- issue_library_id = line_vals.get('issue_library_id')
- room_id = vals.get('room_id')
- meeting_type_id = vals.get('meeting_type_id')
- approval_date = vals.get('start_datetime')
- if not (issue_library_id and main_record.id and room_id and meeting_type_id):
+ for line in main_record.issue_meeting_line_ids:
+ if not line.issue_library_id:
continue
self.env['issue.library.room.line'].create({
- 'issue_library_id': issue_library_id,
+ 'issue_library_id': line.issue_library_id.id,
'room_booking_id': main_record.id,
- 'room_id': room_id,
- 'meeting_type_id': meeting_type_id,
- 'approval_date': approval_date,
+ 'room_id': main_record.room_id.id,
+ 'meeting_type_id': main_record.meeting_type_id.id,
+ 'approval_date': main_record.start_datetime,
})
- return res
-
class IssueMeetingLine(models.Model):
_name = 'issue.meeting.line'
@@ -125,5 +123,3 @@ class IssueMeetingLine(models.Model):
self.issue_library_id.is_boss_passed = is_agree
original_boss_char = self.issue_library_id.boss_char or ""
self.issue_library_id.boss_char = original_boss_char + agree_name
-
- self.issue_library_id.library_push()
diff --git a/yuthon_issue/models/issue_approval.py b/yuthon_issue/models/issue_approval.py
index c7e398de9..aafe77515 100644
--- a/yuthon_issue/models/issue_approval.py
+++ b/yuthon_issue/models/issue_approval.py
@@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
from odoo import api, fields, models
+from datetime import datetime, timedelta, date
class IssueApproval(models.Model):
@@ -78,6 +79,12 @@ class IssueApproval(models.Model):
if rec.issue_approval_ids:
for issue_library in rec.issue_approval_ids:
issue_library.issue_library_id.write({'issue_state': 'will'})
+ if rec.code:
+ self.env['issue.library.approval.line'].create({
+ 'issue_library_id': issue_library.issue_library_id.id,
+ 'code': self.code,
+ 'approval_date': fields.Datetime.now() + timedelta(hours=8),
+ })
class IssueApprovalLine(models.Model):
_name = 'issue.approval.line'
diff --git a/yuthon_issue/models/issue_library.py b/yuthon_issue/models/issue_library.py
index a0e65bba2..f7a39916d 100644
--- a/yuthon_issue/models/issue_library.py
+++ b/yuthon_issue/models/issue_library.py
@@ -51,7 +51,7 @@ class IssueLibrary(models.Model):
employee_id = fields.Many2one('hr.employee', string='创建人', default=lambda self: self.env.user.employee_id)
department_id = fields.Many2one('hr.department', string='部门', related='employee_id.department_id')
users_role_ids = fields.Many2many('soong.user.role', string='角色范围', related='employee_id.user_role_ids')
- company_id = fields.Many2one('res.company', string='公司', related='employee_id.company_id', stroe=True)
+ company_id = fields.Many2one('res.company', string='公司', related='employee_id.company_id', store=True)
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='部门人员')
@@ -68,11 +68,58 @@ class IssueLibrary(models.Model):
is_party_passed = fields.Selection([('',''), ('pass', '通过'), ('reject', '未通过')])
is_class_passed = fields.Selection([('',''), ('pass', '通过'), ('reject', '未通过')])
is_boss_passed = fields.Selection([('',''), ('pass', '通过'), ('reject', '未通过')])
+ push_invisible = fields.Boolean(string="推送隐藏", compute='_compute_push_invisible')
+
is_push_party = fields.Boolean(string="党推送")
is_push_class = fields.Boolean(string="班子推送")
is_push_boss = fields.Boolean(string="董事推送")
is_push_depart = fields.Boolean(string="部门推送")
+ @api.depends(
+ 'is_party', 'is_class', 'is_boss',
+ 'is_push_party', 'is_party_passed',
+ 'is_push_class', 'is_class_passed',
+ 'is_push_boss', 'is_boss_passed',
+ 'is_push_depart'
+ )
+ def _compute_push_invisible(self):
+ for record in self:
+ record.push_invisible = False
+ type_mapping = {
+ 'party': (record.is_party, record.is_party_passed),
+ 'class': (record.is_class, record.is_class_passed),
+ 'boss': (record.is_boss, record.is_boss_passed),
+ }
+ # 筛选开关为True的类型,收集其passed值
+ active_passed_values = []
+ for type_key, (type_switch, type_passed) in type_mapping.items():
+ if type_switch:
+ active_passed_values.append(type_passed)
+ # 所有激活类型的passed都为pass → 设为True
+ if active_passed_values and all(passed == 'pass' for passed in active_passed_values):
+ record.push_invisible = True
+ continue
+
+ if record.is_party:
+ if record.is_push_party and (record.is_party_passed == 'reject' or not record.is_party_passed):
+ record.push_invisible = True
+ continue
+ if record.is_class:
+ if record.is_push_class and (record.is_class_passed == 'reject' or not record.is_class_passed):
+ record.push_invisible = True
+ continue
+ if record.is_boss:
+ if record.is_push_boss and (record.is_boss_passed == 'reject' or not record.is_boss_passed):
+ record.push_invisible = True
+ continue
+
+ if record.issue_state in ['will', 'on_meet']:
+ if record.push_invisible:
+ record.issue_state = 'on_meet'
+ else:
+ record.issue_state = 'will'
+
+
@api.depends('issue_library_line_ids',
'issue_library_line_ids.issue_approval_decision_id',
'issue_library_line_ids.district_state_id',
@@ -343,6 +390,7 @@ class IssueLibrary(models.Model):
"views": [[form_id, "form"]],
"context": {
'default_is_issue': True,
+ 'default_state': '申请人',
'default_start_datetime': fields.Datetime.now() + timedelta(hours=8),
'default_issue_meeting_line_ids': issue_details,
}
@@ -363,6 +411,7 @@ class IssueLibrary(models.Model):
"views": [[form_id, "form"]],
"context": {
'default_is_issue': True,
+ 'default_state': '申请人',
'default_issue_meeting_line_ids': issue_details,
}
}
@@ -459,6 +508,7 @@ class IssueLibraryLine(models.Model):
class IssueLibraryApprovalLine(models.Model):
_name = "issue.library.approval.line"
_description = '关联流程明细'
+ _order = 'approval_date desc'
issue_library_id = fields.Many2one('issue.library', string="关联议题")
workflow_name = fields.Char(string="标题", compute='compute_issue_soong')
diff --git a/yuthon_issue/models/issue_meeting_minutes.py b/yuthon_issue/models/issue_meeting_minutes.py
index 80d5093cd..d6417e8be 100644
--- a/yuthon_issue/models/issue_meeting_minutes.py
+++ b/yuthon_issue/models/issue_meeting_minutes.py
@@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
from odoo import api, fields, models, tools
from odoo.exceptions import UserError, ValidationError
+from datetime import datetime, timedelta, date
class IssueMeetingMinutes(models.Model):
@@ -8,9 +9,9 @@ class IssueMeetingMinutes(models.Model):
_description = '会议纪要'
_inherit = ['soong.workflow.mixin', 'mail.thread.main.attachment', 'mail.activity.mixin']
- name = fields.Char(string='名称', compute='_compute_name')
number_of_meetings = fields.Integer(string='会议次数')
- meeting_id = fields.Many2one('room.booking', string='会议名称', required=True)
+ name = fields.Char(related='meeting_id.name',string='会议名称')
+ meeting_id = fields.Many2one('room.booking', string='会议名称')
meeting_type_id = fields.Many2one('room.meeting.type', string="会议类型")
users_id = fields.Many2one('res.users', string="申请人", default=lambda self: self.env.user.id)
department_id = fields.Many2one(related='users_id.employee_ids.department_id', string="部门")
@@ -19,6 +20,7 @@ class IssueMeetingMinutes(models.Model):
user_id = fields.Many2one('res.users', string="记录人")
room_users_ids = fields.Many2many('res.users', string="出席人员")
host = fields.Many2one('hr.employee', string="主持人")
+ room_id = fields.Many2one('room.room', string="会议地点")
code = fields.Char(string='编号', required=True, copy=False,
default=lambda self: self.env['ir.sequence'].next_by_code('issue_meeting_minutes_code'))
meeting_minutes_ids = fields.One2many('issue.meeting.minutes.line', 'meeting_minutes_id', string="会议纪要明细")
@@ -34,19 +36,49 @@ class IssueMeetingMinutes(models.Model):
name_title = fields.Char(default=_get_default_name_title)
- @api.depends('number_of_meetings', 'meeting_id', 'meeting_type_id', 'meeting_date')
+ @api.depends('number_of_meetings', 'meeting_type_id', 'meeting_date')
def _compute_name(self):
- if self.number_of_meetings and self.meeting_id and self.meeting_type_id and self.meeting_date:
- self.name = self.number_of_meetings + ' ' + self.meeting_id.name + ' ' + self.meeting_type_id.name + ' ' + self.meeting_date
+ if self.number_of_meetings and self.meeting_type_id and self.meeting_date:
+ self.name = self.number_of_meetings + ' ' + ' ' + self.meeting_type_id.name + ' ' + self.meeting_date
else:
self.name = ''
+ @api.depends('meeting_id.name')
+ def _compute_meeting_display_name(self):
+ for record in self:
+ if record.meeting_id:
+ record.meeting_display_name = record.meeting_id.name
+ else:
+ record.meeting_display_name = False
+
@api.constrains('meeting_id')
def _check_meeting_id(self):
for record in self:
if record.meeting_id:
record.meeting_id.minutes_id = self.id
+ @api.constrains('number_of_meetings', 'meeting_type_id', 'meeting_date')
+ def _constrains_create_room_booking(self):
+ for record in self:
+ if not (record.number_of_meetings and record.meeting_type_id and record.meeting_date):
+ continue
+ if record.meeting_id:
+ continue
+ booking_vals = {
+ 'name': f"{record.meeting_date}第{record.number_of_meetings}次会议{record.meeting_type_id.name}",
+ 'meeting_type_id': record.meeting_type_id.id,
+ 'start_datetime': record.meeting_date + timedelta(hours=8),
+ 'stop_datetime': record.meeting_date + timedelta(hours=9),
+ 'organizer_id': record.users_id.id,
+ 'number_of_meetings': record.number_of_meetings,
+ 'room_id': record.room_id.id,
+ 'host': record.host.id if record.host else False,
+ 'room_users_ids': [(6, 0, record.room_users_ids.ids)] if record.room_users_ids else False,
+ }
+ booking_record = self.env['room.booking'].create(booking_vals)
+ record.meeting_id = booking_record.id
+ booking_record.minutes_id = record.id
+
def open_record(self):
return {
"type": "ir.actions.act_window",
diff --git a/yuthon_issue/views/issue_approval_views.xml b/yuthon_issue/views/issue_approval_views.xml
index b0d11aaef..cd55ff76b 100644
--- a/yuthon_issue/views/issue_approval_views.xml
+++ b/yuthon_issue/views/issue_approval_views.xml
@@ -24,7 +24,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_issue/views/issue_library_views.xml b/yuthon_issue/views/issue_library_views.xml
index 4871558ca..2ba0cdc73 100644
--- a/yuthon_issue/views/issue_library_views.xml
+++ b/yuthon_issue/views/issue_library_views.xml
@@ -49,6 +49,7 @@
+
@@ -67,8 +68,9 @@
+
-
+
@@ -90,7 +92,6 @@
-
@@ -108,11 +109,7 @@
-
-
-
-
-
+
@@ -129,7 +126,7 @@
invisible="urgency_level != 'normal'"/>
-
@@ -305,7 +302,7 @@
-
+
@@ -315,7 +312,7 @@
-
+
@@ -333,7 +330,7 @@
invisible="urgency_level != 'normal'"/>
-
@@ -463,7 +460,7 @@
-
+
@@ -472,7 +469,7 @@
-
+
@@ -490,7 +487,7 @@
invisible="urgency_level != 'normal'"/>
-
@@ -608,7 +605,7 @@
-
+
@@ -617,7 +614,7 @@
-
+
@@ -635,7 +632,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_issue/views/issue_meeting_minutes_views.xml b/yuthon_issue/views/issue_meeting_minutes_views.xml
index c4418d4ac..f8a7e97b9 100644
--- a/yuthon_issue/views/issue_meeting_minutes_views.xml
+++ b/yuthon_issue/views/issue_meeting_minutes_views.xml
@@ -22,7 +22,7 @@
invisible="urgency_level != 'normal'"/>
-
@@ -40,20 +40,20 @@
-
-
+
+
-
+
diff --git a/yuthon_lessee_service/views/property_report_repair.xml b/yuthon_lessee_service/views/property_report_repair.xml
index 2e548fb29..f6ebcaa1f 100644
--- a/yuthon_lessee_service/views/property_report_repair.xml
+++ b/yuthon_lessee_service/views/property_report_repair.xml
@@ -21,7 +21,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_maintain/views/processing_order_approval_views.xml b/yuthon_maintain/views/processing_order_approval_views.xml
index bd87980b5..54355e5ff 100644
--- a/yuthon_maintain/views/processing_order_approval_views.xml
+++ b/yuthon_maintain/views/processing_order_approval_views.xml
@@ -26,7 +26,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_maintain/views/property_device_repair_views.xml b/yuthon_maintain/views/property_device_repair_views.xml
index 43d3dc357..8d0bc927e 100644
--- a/yuthon_maintain/views/property_device_repair_views.xml
+++ b/yuthon_maintain/views/property_device_repair_views.xml
@@ -26,7 +26,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_maintain/views/property_report_repair.xml b/yuthon_maintain/views/property_report_repair.xml
index 53ea13d0d..4240e4ba2 100644
--- a/yuthon_maintain/views/property_report_repair.xml
+++ b/yuthon_maintain/views/property_report_repair.xml
@@ -26,7 +26,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_notice/views/yuthon_notice_views.xml b/yuthon_notice/views/yuthon_notice_views.xml
index f760ae790..50305a7cb 100644
--- a/yuthon_notice/views/yuthon_notice_views.xml
+++ b/yuthon_notice/views/yuthon_notice_views.xml
@@ -34,7 +34,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_official/views/yuthon_cross_departmental_views.xml b/yuthon_official/views/yuthon_cross_departmental_views.xml
index 7603bcdf8..a8eed1e61 100644
--- a/yuthon_official/views/yuthon_cross_departmental_views.xml
+++ b/yuthon_official/views/yuthon_cross_departmental_views.xml
@@ -20,7 +20,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_official/views/yuthon_file_processing_views.xml b/yuthon_official/views/yuthon_file_processing_views.xml
index 66b7fa3cc..c1aea3db9 100644
--- a/yuthon_official/views/yuthon_file_processing_views.xml
+++ b/yuthon_official/views/yuthon_file_processing_views.xml
@@ -26,7 +26,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_official/views/yuthon_official_incoming_labor_views.xml b/yuthon_official/views/yuthon_official_incoming_labor_views.xml
index 4d59a5fc0..ef4dc8684 100644
--- a/yuthon_official/views/yuthon_official_incoming_labor_views.xml
+++ b/yuthon_official/views/yuthon_official_incoming_labor_views.xml
@@ -26,7 +26,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_official/views/yuthon_official_incoming_normal_views.xml b/yuthon_official/views/yuthon_official_incoming_normal_views.xml
index 3479da46b..b1ebcfcae 100644
--- a/yuthon_official/views/yuthon_official_incoming_normal_views.xml
+++ b/yuthon_official/views/yuthon_official_incoming_normal_views.xml
@@ -21,7 +21,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_official/views/yuthon_official_incoming_party_views.xml b/yuthon_official/views/yuthon_official_incoming_party_views.xml
index 72de3c845..6e94e67c5 100644
--- a/yuthon_official/views/yuthon_official_incoming_party_views.xml
+++ b/yuthon_official/views/yuthon_official_incoming_party_views.xml
@@ -25,7 +25,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_official/views/yuthon_official_labor_views.xml b/yuthon_official/views/yuthon_official_labor_views.xml
index b7ce3126a..0099a4396 100644
--- a/yuthon_official/views/yuthon_official_labor_views.xml
+++ b/yuthon_official/views/yuthon_official_labor_views.xml
@@ -23,7 +23,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_official/views/yuthon_official_party_views.xml b/yuthon_official/views/yuthon_official_party_views.xml
index cafd4738b..54805c6be 100644
--- a/yuthon_official/views/yuthon_official_party_views.xml
+++ b/yuthon_official/views/yuthon_official_party_views.xml
@@ -26,7 +26,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_official/views/yuthon_official_views.xml b/yuthon_official/views/yuthon_official_views.xml
index c1d3185f5..89245e416 100644
--- a/yuthon_official/views/yuthon_official_views.xml
+++ b/yuthon_official/views/yuthon_official_views.xml
@@ -33,7 +33,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_official/views/yuthon_sub_enterprises_view.xml b/yuthon_official/views/yuthon_sub_enterprises_view.xml
index 012b1ebd4..625e820da 100644
--- a/yuthon_official/views/yuthon_sub_enterprises_view.xml
+++ b/yuthon_official/views/yuthon_sub_enterprises_view.xml
@@ -41,6 +41,7 @@
+
diff --git a/yuthon_property_approval/__manifest__.py b/yuthon_property_approval/__manifest__.py
index 8efd0ff7b..e882079be 100644
--- a/yuthon_property_approval/__manifest__.py
+++ b/yuthon_property_approval/__manifest__.py
@@ -25,6 +25,7 @@
'views/property_collection_confirm.xml',
'views/property_eligibility.xml',
'views/yuthon_property_ledger_views.xml',
+ 'views/property_fee_spending_view.xml',
'views/property_lessee_analysis_viwes.xml',
'views/property_bills_list_views.xml',
'views/property_fitment.xml',
diff --git a/yuthon_property_approval/data/sale_renting_code_data.xml b/yuthon_property_approval/data/sale_renting_code_data.xml
index f3b7e36fa..56d1c817f 100644
--- a/yuthon_property_approval/data/sale_renting_code_data.xml
+++ b/yuthon_property_approval/data/sale_renting_code_data.xml
@@ -1,5 +1,12 @@
+
+ 费用支出编号
+ property_fee_spending_code
+ FYZC%(y)s%(month)s%(day)s
+ 3
+
+
应付账单编号
property_bills_payable_code
diff --git a/yuthon_property_approval/models/__init__.py b/yuthon_property_approval/models/__init__.py
index 992949364..4e3af1bdb 100644
--- a/yuthon_property_approval/models/__init__.py
+++ b/yuthon_property_approval/models/__init__.py
@@ -60,4 +60,5 @@ from . import payment_process
from . import contract_accounts_receivable
from . import property_bills_payable
from . import property_payment_notice
-from . import property_bills_list
\ No newline at end of file
+from . import property_bills_list
+from . import property_fee_spending
\ No newline at end of file
diff --git a/yuthon_property_approval/models/property_fee_spending.py b/yuthon_property_approval/models/property_fee_spending.py
new file mode 100644
index 000000000..781532dd9
--- /dev/null
+++ b/yuthon_property_approval/models/property_fee_spending.py
@@ -0,0 +1,47 @@
+# -*- coding: utf-8 -*-
+# 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 PropertyFeeSpending(models.Model):
+ _name = 'property.fee.spending'
+ _inherit = ['soong.workflow.mixin', 'mail.thread.main.attachment', 'mail.activity.mixin']
+ _description = '费用支出'
+
+ name = fields.Char(string='标题')
+ tip_description = fields.Text('事项名称')
+ property_address = fields.Text(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="部门")
+ code = fields.Char(string="编号",
+ default=lambda self: self.env['ir.sequence'].next_by_code('property_fee_spending_code'))
+ is_issues = fields.Boolean(string='是否上会')
+ issues_result = fields.Html(string="会议结果")
+ related_issues_id = fields.Many2one('issue.library', string="关联议题")
+ property_documents_ids = fields.Many2many('documents.document', string="附件")
+ tenure_type = fields.Selection([('self', '自有'), ('agency', '代管')], string='权属类型')
+ urgency_level = fields.Selection([('normal', '普件'), ('urgent', '急件'), ('emergency', '特急件')], string='紧急度',
+ default='normal')
+ active = fields.Boolean('Active', default=True, tracking=True)
+ work_end = fields.Boolean(string="结束")
+ company_id = fields.Many2one('yuthon.property.company', string="所属公司")
+ spending_fee = fields.Float(string="支付金额")
+ pay_date = fields.Date(string="支付日期")
+ expenses_type = fields.Many2one('yuthon.expenses.type', string="支出类型")
+ remake = fields.Text(string="备注")
+
+ def _get_default_name_title(self):
+ return self._description if self._description else self._name
+
+ 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])])
+
+
+
+class YuthonExpensesType(models.Model):
+ _name = 'yuthon.expenses.type'
+ _description = '支出类型'
+
+ name = fields.Char(string="支出类型")
diff --git a/yuthon_property_approval/security/ir.model.access.csv b/yuthon_property_approval/security/ir.model.access.csv
index a95046db0..f87f5c550 100644
--- a/yuthon_property_approval/security/ir.model.access.csv
+++ b/yuthon_property_approval/security/ir.model.access.csv
@@ -125,4 +125,8 @@ access_property_bills_wizard,property_bills_wizard,model_property_bills_wizard,b
access_action_refuse_wizard,action_refuse_wizard,model_action_refuse_wizard,base.group_user,1,1,1,1
access_property_deposit_wizard,property_deposit_wizard,model_property_deposit_wizard,base.group_user,1,1,1,1
access_deposit_reconciliation_line,deposit_reconciliation_line,model_deposit_reconciliation_line,base.group_user,1,1,1,1
-access_property_management_line2,property_management_line2,model_property_management_line2,base.group_user,1,1,1,1
\ No newline at end of file
+access_property_management_line2,property_management_line2,model_property_management_line2,base.group_user,1,1,1,1
+
+
+access_yuthon_expenses_type,yuthon.expenses.type,model_yuthon_expenses_type,base.group_user,1,1,1,1
+access_property_fee_spending,property_fee_spending,model_property_fee_spending,base.group_user,1,1,1,1
\ No newline at end of file
diff --git a/yuthon_property_approval/views/payment_process_viwes.xml b/yuthon_property_approval/views/payment_process_viwes.xml
index 0717976a7..504c76abd 100644
--- a/yuthon_property_approval/views/payment_process_viwes.xml
+++ b/yuthon_property_approval/views/payment_process_viwes.xml
@@ -21,7 +21,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/perperty_claim_approval_views.xml b/yuthon_property_approval/views/perperty_claim_approval_views.xml
index d78c25d69..bbbb9c5d8 100644
--- a/yuthon_property_approval/views/perperty_claim_approval_views.xml
+++ b/yuthon_property_approval/views/perperty_claim_approval_views.xml
@@ -21,7 +21,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_accounting_approval_views.xml b/yuthon_property_approval/views/property_accounting_approval_views.xml
index af629fc59..79aa19f72 100644
--- a/yuthon_property_approval/views/property_accounting_approval_views.xml
+++ b/yuthon_property_approval/views/property_accounting_approval_views.xml
@@ -23,7 +23,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_accounts_approval_views.xml b/yuthon_property_approval/views/property_accounts_approval_views.xml
index 6b0575326..74a68f8d1 100644
--- a/yuthon_property_approval/views/property_accounts_approval_views.xml
+++ b/yuthon_property_approval/views/property_accounts_approval_views.xml
@@ -20,7 +20,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_approval_views.xml b/yuthon_property_approval/views/property_approval_views.xml
index 581a02dec..67d769f6d 100644
--- a/yuthon_property_approval/views/property_approval_views.xml
+++ b/yuthon_property_approval/views/property_approval_views.xml
@@ -22,7 +22,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_bills_payable_views.xml b/yuthon_property_approval/views/property_bills_payable_views.xml
index 350dbb517..853217c56 100644
--- a/yuthon_property_approval/views/property_bills_payable_views.xml
+++ b/yuthon_property_approval/views/property_bills_payable_views.xml
@@ -21,7 +21,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_borrowing_approval_views.xml b/yuthon_property_approval/views/property_borrowing_approval_views.xml
index a658c2bcd..39d769f8a 100644
--- a/yuthon_property_approval/views/property_borrowing_approval_views.xml
+++ b/yuthon_property_approval/views/property_borrowing_approval_views.xml
@@ -22,7 +22,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_capacity.xml b/yuthon_property_approval/views/property_capacity.xml
index 61f401373..874afc1cb 100644
--- a/yuthon_property_approval/views/property_capacity.xml
+++ b/yuthon_property_approval/views/property_capacity.xml
@@ -20,7 +20,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_construction_approval_views.xml b/yuthon_property_approval/views/property_construction_approval_views.xml
index beda3b9e5..ce2490d66 100644
--- a/yuthon_property_approval/views/property_construction_approval_views.xml
+++ b/yuthon_property_approval/views/property_construction_approval_views.xml
@@ -23,7 +23,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_current_approval_views.xml b/yuthon_property_approval/views/property_current_approval_views.xml
index 7acc2835b..a519e3f2f 100644
--- a/yuthon_property_approval/views/property_current_approval_views.xml
+++ b/yuthon_property_approval/views/property_current_approval_views.xml
@@ -22,7 +22,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_delegated_agent_views.xml b/yuthon_property_approval/views/property_delegated_agent_views.xml
index bfd543829..4855a9ef4 100644
--- a/yuthon_property_approval/views/property_delegated_agent_views.xml
+++ b/yuthon_property_approval/views/property_delegated_agent_views.xml
@@ -21,7 +21,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_design_approval_views.xml b/yuthon_property_approval/views/property_design_approval_views.xml
index 4555f5d9a..3e281ac45 100644
--- a/yuthon_property_approval/views/property_design_approval_views.xml
+++ b/yuthon_property_approval/views/property_design_approval_views.xml
@@ -23,7 +23,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_eligibility.xml b/yuthon_property_approval/views/property_eligibility.xml
index 993f24acf..809264611 100644
--- a/yuthon_property_approval/views/property_eligibility.xml
+++ b/yuthon_property_approval/views/property_eligibility.xml
@@ -20,7 +20,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_engineering_approval_views.xml b/yuthon_property_approval/views/property_engineering_approval_views.xml
index 2759e2225..704691285 100644
--- a/yuthon_property_approval/views/property_engineering_approval_views.xml
+++ b/yuthon_property_approval/views/property_engineering_approval_views.xml
@@ -23,7 +23,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_fee_spending_view.xml b/yuthon_property_approval/views/property_fee_spending_view.xml
new file mode 100644
index 000000000..c4cb20f42
--- /dev/null
+++ b/yuthon_property_approval/views/property_fee_spending_view.xml
@@ -0,0 +1,84 @@
+
+
+
+ property.fee.spending.tree
+ property.fee.spending
+
+
+
+
+
+
+
+
+
+
+ property.fee.spending.form
+ property.fee.spending
+
+
+
+
+
+ yuthon.expenses.type.tree
+ yuthon.expenses.type
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yuthon_property_approval/views/property_handover_views.xml b/yuthon_property_approval/views/property_handover_views.xml
index 6e30fc914..8a7979f1d 100644
--- a/yuthon_property_approval/views/property_handover_views.xml
+++ b/yuthon_property_approval/views/property_handover_views.xml
@@ -22,7 +22,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_intention_views.xml b/yuthon_property_approval/views/property_intention_views.xml
index db378e8ba..5a324a421 100644
--- a/yuthon_property_approval/views/property_intention_views.xml
+++ b/yuthon_property_approval/views/property_intention_views.xml
@@ -21,7 +21,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_lease_extension.xml b/yuthon_property_approval/views/property_lease_extension.xml
index 02500ed9e..79e907e86 100644
--- a/yuthon_property_approval/views/property_lease_extension.xml
+++ b/yuthon_property_approval/views/property_lease_extension.xml
@@ -23,7 +23,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_lease_renewal.xml b/yuthon_property_approval/views/property_lease_renewal.xml
index 9099b87b8..143a5aadd 100644
--- a/yuthon_property_approval/views/property_lease_renewal.xml
+++ b/yuthon_property_approval/views/property_lease_renewal.xml
@@ -22,7 +22,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_management.xml b/yuthon_property_approval/views/property_management.xml
index 55dbdc750..9274efd94 100644
--- a/yuthon_property_approval/views/property_management.xml
+++ b/yuthon_property_approval/views/property_management.xml
@@ -25,7 +25,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_management_fee.xml b/yuthon_property_approval/views/property_management_fee.xml
index 80bb3ee06..c545cf316 100644
--- a/yuthon_property_approval/views/property_management_fee.xml
+++ b/yuthon_property_approval/views/property_management_fee.xml
@@ -21,7 +21,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_meeting_approval_views.xml b/yuthon_property_approval/views/property_meeting_approval_views.xml
index 2afa5e6e6..c463f43e7 100644
--- a/yuthon_property_approval/views/property_meeting_approval_views.xml
+++ b/yuthon_property_approval/views/property_meeting_approval_views.xml
@@ -22,7 +22,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_merge_approval_views.xml b/yuthon_property_approval/views/property_merge_approval_views.xml
index 7c4850b42..40d7790e4 100644
--- a/yuthon_property_approval/views/property_merge_approval_views.xml
+++ b/yuthon_property_approval/views/property_merge_approval_views.xml
@@ -27,7 +27,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_offline_registration.xml b/yuthon_property_approval/views/property_offline_registration.xml
index 726be052b..5d7e8d501 100644
--- a/yuthon_property_approval/views/property_offline_registration.xml
+++ b/yuthon_property_approval/views/property_offline_registration.xml
@@ -23,7 +23,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_penalty_proportion.xml b/yuthon_property_approval/views/property_penalty_proportion.xml
index 6511d4ec7..86d458599 100644
--- a/yuthon_property_approval/views/property_penalty_proportion.xml
+++ b/yuthon_property_approval/views/property_penalty_proportion.xml
@@ -21,7 +21,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_penalty_relief.xml b/yuthon_property_approval/views/property_penalty_relief.xml
index 975e3aa16..799d3fe42 100644
--- a/yuthon_property_approval/views/property_penalty_relief.xml
+++ b/yuthon_property_approval/views/property_penalty_relief.xml
@@ -21,7 +21,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_project_approval_views.xml b/yuthon_property_approval/views/property_project_approval_views.xml
index da5a26b5a..f2bf6ed84 100644
--- a/yuthon_property_approval/views/property_project_approval_views.xml
+++ b/yuthon_property_approval/views/property_project_approval_views.xml
@@ -23,7 +23,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_record_views.xml b/yuthon_property_approval/views/property_record_views.xml
index af2937743..c24a297eb 100644
--- a/yuthon_property_approval/views/property_record_views.xml
+++ b/yuthon_property_approval/views/property_record_views.xml
@@ -27,7 +27,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_rent_relief.xml b/yuthon_property_approval/views/property_rent_relief.xml
index 9d6142863..8bc2eeb9c 100644
--- a/yuthon_property_approval/views/property_rent_relief.xml
+++ b/yuthon_property_approval/views/property_rent_relief.xml
@@ -23,7 +23,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_rental_conditions.xml b/yuthon_property_approval/views/property_rental_conditions.xml
index 84e8326fd..76db6e76d 100644
--- a/yuthon_property_approval/views/property_rental_conditions.xml
+++ b/yuthon_property_approval/views/property_rental_conditions.xml
@@ -24,7 +24,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_service_approval_views.xml b/yuthon_property_approval/views/property_service_approval_views.xml
index 30e737a09..277d3abe8 100644
--- a/yuthon_property_approval/views/property_service_approval_views.xml
+++ b/yuthon_property_approval/views/property_service_approval_views.xml
@@ -22,7 +22,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_property_approval/views/property_split_approval_views.xml b/yuthon_property_approval/views/property_split_approval_views.xml
index 070aa6cd3..13b50cd77 100644
--- a/yuthon_property_approval/views/property_split_approval_views.xml
+++ b/yuthon_property_approval/views/property_split_approval_views.xml
@@ -27,7 +27,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_trade/views/parking_fee_approval_views.xml b/yuthon_trade/views/parking_fee_approval_views.xml
index 833402131..786a7cc66 100644
--- a/yuthon_trade/views/parking_fee_approval_views.xml
+++ b/yuthon_trade/views/parking_fee_approval_views.xml
@@ -20,7 +20,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_trade/views/trade_project_approval_views.xml b/yuthon_trade/views/trade_project_approval_views.xml
index a1586f55d..33fe7e441 100644
--- a/yuthon_trade/views/trade_project_approval_views.xml
+++ b/yuthon_trade/views/trade_project_approval_views.xml
@@ -22,7 +22,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_trade/views/trade_reward_approval_views.xml b/yuthon_trade/views/trade_reward_approval_views.xml
index bd4c1c1ca..d31419134 100644
--- a/yuthon_trade/views/trade_reward_approval_views.xml
+++ b/yuthon_trade/views/trade_reward_approval_views.xml
@@ -20,7 +20,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_trade/views/yuthon_business_approval_viwes.xml b/yuthon_trade/views/yuthon_business_approval_viwes.xml
index 6518c95b1..f5980e6e2 100644
--- a/yuthon_trade/views/yuthon_business_approval_viwes.xml
+++ b/yuthon_trade/views/yuthon_business_approval_viwes.xml
@@ -25,7 +25,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_trade/views/yuthon_care_condolences_views.xml b/yuthon_trade/views/yuthon_care_condolences_views.xml
index ba59f988b..026259778 100644
--- a/yuthon_trade/views/yuthon_care_condolences_views.xml
+++ b/yuthon_trade/views/yuthon_care_condolences_views.xml
@@ -21,7 +21,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_trade/views/yuthon_contract_addition_views.xml b/yuthon_trade/views/yuthon_contract_addition_views.xml
index e97140c82..efa95ae93 100644
--- a/yuthon_trade/views/yuthon_contract_addition_views.xml
+++ b/yuthon_trade/views/yuthon_contract_addition_views.xml
@@ -19,7 +19,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_trade/views/yuthon_message_approval_views.xml b/yuthon_trade/views/yuthon_message_approval_views.xml
index 88eb1dcaf..2e7ba8dc3 100644
--- a/yuthon_trade/views/yuthon_message_approval_views.xml
+++ b/yuthon_trade/views/yuthon_message_approval_views.xml
@@ -21,7 +21,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_trade/views/yuthon_mutual_approval_views.xml b/yuthon_trade/views/yuthon_mutual_approval_views.xml
index 9b38c0f34..5082fcd5a 100644
--- a/yuthon_trade/views/yuthon_mutual_approval_views.xml
+++ b/yuthon_trade/views/yuthon_mutual_approval_views.xml
@@ -22,7 +22,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_trade/views/yuthon_seals_approval_views.xml b/yuthon_trade/views/yuthon_seals_approval_views.xml
index 1ad92e33a..4c6762331 100644
--- a/yuthon_trade/views/yuthon_seals_approval_views.xml
+++ b/yuthon_trade/views/yuthon_seals_approval_views.xml
@@ -22,7 +22,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_trade/views/yuthon_social_transfer.xml b/yuthon_trade/views/yuthon_social_transfer.xml
index bf4ab1950..3f9ccff63 100644
--- a/yuthon_trade/views/yuthon_social_transfer.xml
+++ b/yuthon_trade/views/yuthon_social_transfer.xml
@@ -19,7 +19,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_trade/views/yuthon_task_approval_views.xml b/yuthon_trade/views/yuthon_task_approval_views.xml
index 5478859a9..e8aef1615 100644
--- a/yuthon_trade/views/yuthon_task_approval_views.xml
+++ b/yuthon_trade/views/yuthon_task_approval_views.xml
@@ -21,7 +21,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_trade/views/yuthon_trade_premium.xml b/yuthon_trade/views/yuthon_trade_premium.xml
index 0a19c708f..78907eba2 100644
--- a/yuthon_trade/views/yuthon_trade_premium.xml
+++ b/yuthon_trade/views/yuthon_trade_premium.xml
@@ -20,7 +20,7 @@
invisible="urgency_level != 'normal'"/>
-
diff --git a/yuthon_trade/views/yuthon_work_condolences_views.xml b/yuthon_trade/views/yuthon_work_condolences_views.xml
index ee34e1cd9..87d52559f 100644
--- a/yuthon_trade/views/yuthon_work_condolences_views.xml
+++ b/yuthon_trade/views/yuthon_work_condolences_views.xml
@@ -21,7 +21,7 @@
invisible="urgency_level != 'normal'"/>
-