From a51f01756ae212d1092b467f8ef3248690fb68f7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?=
<9664676+pengyuthon@user.noreply.gitee.com>
Date: Thu, 25 Dec 2025 11:35:14 +0800
Subject: [PATCH 01/24] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
yuthon_property_approval/wizard/penalty_line_wizard.py | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/yuthon_property_approval/wizard/penalty_line_wizard.py b/yuthon_property_approval/wizard/penalty_line_wizard.py
index 88800d163..36ee0b30a 100644
--- a/yuthon_property_approval/wizard/penalty_line_wizard.py
+++ b/yuthon_property_approval/wizard/penalty_line_wizard.py
@@ -129,10 +129,13 @@ class PenaltyLineWizard(models.Model):
# 计算剩余本金
remaining_principal = max(0, pay_line.not_collected - pay_amount)
penalty_start_date = pay_date
-
+ if is_penalty:
+ remake = f'支付违约金¥{pay_line.amount}'
+ else:
+ remake = f'支付金额¥{pay_line.amount}'
new_penalty_lines.append((0, 0, {
'date': pay_date,
- 'remake': f'支付金额¥{pay_line.amount}',
+ 'remake':remake,
'days_overdue': days_overdue,
'remaining_principal': remaining_principal,
'penalty': round(current_penalty, 2),
From 4402f66d979ab696ee897c4d6a3145034c478367 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?=
<9664676+pengyuthon@user.noreply.gitee.com>
Date: Thu, 25 Dec 2025 11:39:59 +0800
Subject: [PATCH 02/24] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
yuthon_property_approval/wizard/penalty_line_wizard.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/yuthon_property_approval/wizard/penalty_line_wizard.py b/yuthon_property_approval/wizard/penalty_line_wizard.py
index 36ee0b30a..fb7f39025 100644
--- a/yuthon_property_approval/wizard/penalty_line_wizard.py
+++ b/yuthon_property_approval/wizard/penalty_line_wizard.py
@@ -199,7 +199,7 @@ class PenaltyLineWizard(models.Model):
'date': self.calculation_date,
'days_overdue': days_overdue,
'remaining_principal': prev_line.remaining_principal,
- 'remake': f'{base_date}至{self.calculation_date}',
+ 'remake': f'违约金:{base_date}至{self.calculation_date}',
'penalty': round(current_penalty, 2),
'is_realtime': True,
}))
From c80af2bc7ed8f3b5fffa567b8ada1397439d011b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?=
<9664676+pengyuthon@user.noreply.gitee.com>
Date: Thu, 25 Dec 2025 11:57:27 +0800
Subject: [PATCH 03/24] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../controllers/applet_attendance.py | 17 ++++++++++++++---
.../models/yuthon_employee_setting.py | 2 +-
2 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/yuthon_hr_attendance/controllers/applet_attendance.py b/yuthon_hr_attendance/controllers/applet_attendance.py
index 2056e7b68..2bf14d1f2 100644
--- a/yuthon_hr_attendance/controllers/applet_attendance.py
+++ b/yuthon_hr_attendance/controllers/applet_attendance.py
@@ -889,15 +889,26 @@ class AppletAttendance(Controller):
last_day_str = last_day.strftime('%Y-%m-%d')
two_months_ago = datetime.now().date() - relativedelta(months=2)
# 去掉 数据为 0 的数据.
- valid_archives_ids = request.env(user=SUPERUSER_ID)['property.meter.archives'].search([
+ valid_archives = request.env(user=SUPERUSER_ID)['property.meter.archives'].search([
('is_virtual_meter', '!=', True),
'|',
('end_time', '=', False),
('end_time', '<=', two_months_ago)
- ]).ids
+ ])
+
+ valid_archives_names = [arch.name or "未命名电表库" for arch in valid_archives]
+ valid_archives_count = len(valid_archives_names)
+ _logger.info(
+ "【电表库过滤】查询条件:非虚拟电表 + (无拆除日期 或 拆除日期≤%s);"
+ "符合条件的电表库数量:%d;电表库名称列表:%s",
+ two_months_ago,
+ valid_archives_count,
+ valid_archives_names if valid_archives_count > 0 else "无"
+ )
+
electric_records = request.env(user=SUPERUSER_ID)['meter.archives.line'].search([
('archives_state', '!=', 'stop'),
- ('archives_id', 'in', valid_archives_ids),
+ ('archives_id', 'in', valid_archives.ids),
('meter_date', '>=', first_day_str),
('meter_date', '<=', last_day_str),
])
diff --git a/yuthon_hr_employee_approval/models/yuthon_employee_setting.py b/yuthon_hr_employee_approval/models/yuthon_employee_setting.py
index 591a681c8..889c36df6 100644
--- a/yuthon_hr_employee_approval/models/yuthon_employee_setting.py
+++ b/yuthon_hr_employee_approval/models/yuthon_employee_setting.py
@@ -6,4 +6,4 @@ class YuthonServiceType(models.Model):
_name = 'yuthon.service.type'
_description = '服务类型'
- name = fields.Char(string="名称")
+ name = fields.Char(string="名称")
\ No newline at end of file
From e04616421bf159634b7f2c8084c2b781c2b2c15e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?=
<9664676+pengyuthon@user.noreply.gitee.com>
Date: Thu, 25 Dec 2025 12:02:38 +0800
Subject: [PATCH 04/24] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../controllers/applet_attendance.py | 28 ++++++++-----------
1 file changed, 12 insertions(+), 16 deletions(-)
diff --git a/yuthon_hr_attendance/controllers/applet_attendance.py b/yuthon_hr_attendance/controllers/applet_attendance.py
index 2bf14d1f2..a21eee297 100644
--- a/yuthon_hr_attendance/controllers/applet_attendance.py
+++ b/yuthon_hr_attendance/controllers/applet_attendance.py
@@ -895,17 +895,6 @@ class AppletAttendance(Controller):
('end_time', '=', False),
('end_time', '<=', two_months_ago)
])
-
- valid_archives_names = [arch.name or "未命名电表库" for arch in valid_archives]
- valid_archives_count = len(valid_archives_names)
- _logger.info(
- "【电表库过滤】查询条件:非虚拟电表 + (无拆除日期 或 拆除日期≤%s);"
- "符合条件的电表库数量:%d;电表库名称列表:%s",
- two_months_ago,
- valid_archives_count,
- valid_archives_names if valid_archives_count > 0 else "无"
- )
-
electric_records = request.env(user=SUPERUSER_ID)['meter.archives.line'].search([
('archives_state', '!=', 'stop'),
('archives_id', 'in', valid_archives.ids),
@@ -1082,14 +1071,21 @@ class AppletAttendance(Controller):
# ('meter_date', '>=', first_day_str),
# ('meter_date', '<=', last_day_str)]
- # 去掉 state
- domain = [('epitope_values_id.name', '=', floor_name),
- ('meter_date', '>=', first_day_str),
- ('meter_date', '<=', last_day_str)]
-
+ domain = [
+ ('epitope_values_id.name', '=', floor_name),
+ ('meter_date', '>=', first_day_str),
+ ('meter_date', '<=', last_day_str)
+ ]
+ two_months_ago = datetime.now().date() - relativedelta(months=2)
if type == 'electric':
domain.append(('archives_state', '!=', 'stop'))
model = 'meter.archives.line'
+ domain.extend([
+ ('archives_id.is_virtual_meter', '!=', True),
+ '|',
+ ('archives_id.end_time', '=', False),
+ ('archives_id.end_time', '<=', two_months_ago)
+ ])
else:
domain.append(('water_state', '!=', 'stop'))
model = 'meter.water.line'
From be3ea250fbf4a4c2de14fd5df7f85583b61a9a87 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?=
<9664676+pengyuthon@user.noreply.gitee.com>
Date: Thu, 25 Dec 2025 14:33:47 +0800
Subject: [PATCH 05/24] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../models/yuthon_hr_employee.py | 22 +++++++++++++++++++
.../wizard/property_reconciliation_wizard.py | 2 ++
2 files changed, 24 insertions(+)
diff --git a/yuthon_hr_employee/models/yuthon_hr_employee.py b/yuthon_hr_employee/models/yuthon_hr_employee.py
index c7d1b7bfe..051661af5 100644
--- a/yuthon_hr_employee/models/yuthon_hr_employee.py
+++ b/yuthon_hr_employee/models/yuthon_hr_employee.py
@@ -286,6 +286,28 @@ class YuthonHrEmployee(models.Model):
else:
record.date_end = None
+ def renew(self):
+ employee_ids = self.env["hr.employee"].browse(
+ self._context.get("active_ids", self._context.get("active_id"))
+ )
+ for record in employee_ids:
+ if len(record) > 1:
+ raise UserError("只能选择一个员工续签")
+ return {
+ "name": "续签",
+ "type": "ir.actions.act_window",
+ "res_model": "yuthon.renewal.approval",
+ "view_mode": "form",
+ "context": {
+ "default_employee_id": self.employee_id.id,
+ "default_current_status": self.employee_id.contract_id.date_end,
+ "default_department1_id": self.employee_id.department_id.id,
+ "default_contract_id": self.employee_id.contract_id.id,
+ },
+ }
+
+
+
def update_social_base(self):
current_year = fields.Date.today().year
group_company = self.env['res.company'].search([('name', '=', '集团本部')], limit=1)
diff --git a/yuthon_property_approval/wizard/property_reconciliation_wizard.py b/yuthon_property_approval/wizard/property_reconciliation_wizard.py
index a25031ea2..df19bfe17 100644
--- a/yuthon_property_approval/wizard/property_reconciliation_wizard.py
+++ b/yuthon_property_approval/wizard/property_reconciliation_wizard.py
@@ -538,6 +538,8 @@ class PropertyReconciliationWizard(models.Model):
]
# 检查是否已有相同记录
existing_record = self.env['property.accounts.receivable'].search(check_domain)
+ if len(existing_record)>1:
+ raise UserError(f'合同{line.contract_id.contract_code}应收日期为{line.due_date}的违约金存在多条相同记录,请检查数据')
is_reconciliation = round(line.amount,2) == round(line.rent, 2)
receivable_id = self.env['property.accounts.receivable']
if not existing_record and is_create:
From acdf344fb0d8327f59a78082e778f7f873103ce0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?=
<9664676+pengyuthon@user.noreply.gitee.com>
Date: Thu, 25 Dec 2025 14:45:49 +0800
Subject: [PATCH 06/24] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../wizard/property_reconciliation_wizard.py | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/yuthon_property_approval/wizard/property_reconciliation_wizard.py b/yuthon_property_approval/wizard/property_reconciliation_wizard.py
index df19bfe17..1980fe84b 100644
--- a/yuthon_property_approval/wizard/property_reconciliation_wizard.py
+++ b/yuthon_property_approval/wizard/property_reconciliation_wizard.py
@@ -538,8 +538,6 @@ class PropertyReconciliationWizard(models.Model):
]
# 检查是否已有相同记录
existing_record = self.env['property.accounts.receivable'].search(check_domain)
- if len(existing_record)>1:
- raise UserError(f'合同{line.contract_id.contract_code}应收日期为{line.due_date}的违约金存在多条相同记录,请检查数据')
is_reconciliation = round(line.amount,2) == round(line.rent, 2)
receivable_id = self.env['property.accounts.receivable']
if not existing_record and is_create:
@@ -588,9 +586,13 @@ class PropertyReconciliationWizard(models.Model):
'is_write': True if line.amount != 0 else False,
'is_penalty': True,
'reconciliation_date': rec.actual_date if line.amount != 0 else None,
- 'receivable_id': receivable_id.id,
+ 'receivable_id': receivable_id[0].id,
'amount': line.amount,
})
+ # 删除多余的违约金数据
+ if len(receivable_id) > 1:
+ receivable_id = existing_record[1:]
+ receivable_id.unlink()
rec.amount_been_reconciled += line.amount
yes_amount += line.amount
@@ -609,7 +611,6 @@ class PropertyReconciliationWizard(models.Model):
if unreconciled_receivables:
remaining_contract_ids.append(contract.id)
-
class PropertyReconciliationLine(models.Model):
_name = 'property.reconciliation.line'
_description = '对账明细'
From 3f51aba487a3868bc7b72aa4ea5842e136f98671 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?=
<9664676+pengyuthon@user.noreply.gitee.com>
Date: Thu, 25 Dec 2025 15:47:33 +0800
Subject: [PATCH 07/24] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
yuthon_issue/models/issue_approval_decision.py | 1 +
yuthon_issue/views/issue_approval_decision_views.xml | 8 +++++---
yuthon_maintain/models/property_device_repair.py | 3 +--
3 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/yuthon_issue/models/issue_approval_decision.py b/yuthon_issue/models/issue_approval_decision.py
index 40e941104..fe423ce41 100644
--- a/yuthon_issue/models/issue_approval_decision.py
+++ b/yuthon_issue/models/issue_approval_decision.py
@@ -27,6 +27,7 @@ class IssueApprovalDecision(models.Model):
end_date = fields.Date(string="失效日期")
remarks = fields.Text(string='备注')
issue_approval_id = fields.Many2one('issue.approval', string="关联议题审批")
+ version = fields.Char(string="版本", default="V3.0")
def _get_default_company(self):
company = self.env['res.company'].search([('name', '=', '集团本部')], limit=1)
diff --git a/yuthon_issue/views/issue_approval_decision_views.xml b/yuthon_issue/views/issue_approval_decision_views.xml
index 11f01459e..8bc051342 100644
--- a/yuthon_issue/views/issue_approval_decision_views.xml
+++ b/yuthon_issue/views/issue_approval_decision_views.xml
@@ -20,6 +20,7 @@
+
@@ -47,14 +48,14 @@
-
-
-
+
+
+
@@ -62,6 +63,7 @@
+
diff --git a/yuthon_maintain/models/property_device_repair.py b/yuthon_maintain/models/property_device_repair.py
index 951e84e2e..9078e2f8a 100644
--- a/yuthon_maintain/models/property_device_repair.py
+++ b/yuthon_maintain/models/property_device_repair.py
@@ -18,7 +18,6 @@ class PropertyDeviceRelief(models.Model):
company_id = fields.Many2one(related='users_id.employee_id.company_id', string="公司")
software_processing_id = fields.Many2one('software.issues.processing', string="设备类型")
problem_description = fields.Text(string="问题描述")
- remake = fields.Text(string="问题描述")
report_state = fields.Selection([('to', '待处理'), ('done', '已处理')], string='状态', default='to')
create_time = fields.Date(string="填报日期", default=fields.Datetime.now)
urgency_level = fields.Selection([('normal', '普件'), ('urgent', '急件'), ('emergency', '特急件')], string='紧急度',
@@ -38,7 +37,7 @@ class PropertyDeviceRelief(models.Model):
def _compute_name(self):
for rec in self:
if rec.users_id and rec.software_processing_id:
- rec.name = f" {rec.software_processing_id.name}-{rec.users_id.name}-{rec.remake}"
+ rec.name = f"{rec.users_id.name}-{rec.software_processing_id.name}-{rec.problem_description}"
def get_no_read_count(self):
From f2410593706338592cf623d8d5151ccfca9bea8e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?=
<9664676+pengyuthon@user.noreply.gitee.com>
Date: Thu, 25 Dec 2025 16:44:24 +0800
Subject: [PATCH 08/24] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
yuthon_maintain/models/property_device_repair.py | 14 +++++++++++++-
.../views/property_device_repair_views.xml | 10 +++++++---
yuthon_will_task/views/yuthon_will_task_views.xml | 4 ++--
3 files changed, 22 insertions(+), 6 deletions(-)
diff --git a/yuthon_maintain/models/property_device_repair.py b/yuthon_maintain/models/property_device_repair.py
index 9078e2f8a..dbe632474 100644
--- a/yuthon_maintain/models/property_device_repair.py
+++ b/yuthon_maintain/models/property_device_repair.py
@@ -18,7 +18,7 @@ class PropertyDeviceRelief(models.Model):
company_id = fields.Many2one(related='users_id.employee_id.company_id', string="公司")
software_processing_id = fields.Many2one('software.issues.processing', string="设备类型")
problem_description = fields.Text(string="问题描述")
- report_state = fields.Selection([('to', '待处理'), ('done', '已处理')], string='状态', default='to')
+ report_state = fields.Selection([('to_submitted', '待提交'), ('to', '待处理'), ('done', '已处理')], string='状态', default='to_submitted')
create_time = fields.Date(string="填报日期", default=fields.Datetime.now)
urgency_level = fields.Selection([('normal', '普件'), ('urgent', '急件'), ('emergency', '特急件')], string='紧急度',
default='normal')
@@ -39,12 +39,24 @@ class PropertyDeviceRelief(models.Model):
if rec.users_id and rec.software_processing_id:
rec.name = f"{rec.users_id.name}-{rec.software_processing_id.name}-{rec.problem_description}"
+ def device_delete(self):
+ self.unlink()
+
+ def open_record(self):
+ return {
+ "type": "ir.actions.act_window",
+ "res_model": 'processing.order.approval',
+ "res_id": self.processing_order_id.id,
+ "name": '详情',
+ "view_mode": "form",
+ }
def get_no_read_count(self):
return self.search_count([('report_state', '=', 'to')])
def pull_order(self):
soong_workflow_line_list = []
+ self.report_state = 'to'
if self.env['processing.order.approval'].search([('device_id', '=', self.id)]):
raise UserError('该设备已生成处理单')
order_id = self.env['processing.order.approval'].create({
diff --git a/yuthon_maintain/views/property_device_repair_views.xml b/yuthon_maintain/views/property_device_repair_views.xml
index 63af193ca..0f73b7abf 100644
--- a/yuthon_maintain/views/property_device_repair_views.xml
+++ b/yuthon_maintain/views/property_device_repair_views.xml
@@ -4,13 +4,15 @@
property.device.repair.tree
property.device.repair
-
+
-
+
+
+
@@ -18,7 +20,7 @@
property.device.repair.form
property.device.repair
-
diff --git a/yuthon_maintain/models/processing_order_approval.py b/yuthon_maintain/models/processing_order_approval.py
index 33de5f59c..07ecc4ae5 100644
--- a/yuthon_maintain/models/processing_order_approval.py
+++ b/yuthon_maintain/models/processing_order_approval.py
@@ -100,6 +100,26 @@ class ProcessingOrderApproval(models.Model):
else:
record.contract_id = False
+ def open_record(self):
+ if self.device_id:
+ return {
+ 'type': 'ir.actions.act_window',
+ 'name': self.device_id.display_name,
+ 'res_model': 'property.device.repair',
+ 'res_id': self.device_id.id,
+ 'view_mode': 'form',
+ 'view_type': 'form',
+ }
+ elif self.repair_id:
+ return {
+ 'type': 'ir.actions.act_window',
+ 'name': self.repair_id.display_name,
+ 'res_model': 'property.report.repair',
+ 'res_id': self.repair_id.id,
+ 'view_mode': 'form',
+ 'view_type': 'form',
+ }
+
@api.onchange('repair_id')
def onchange_repair_id(self):
if self.repair_id:
diff --git a/yuthon_maintain/views/processing_order_approval_views.xml b/yuthon_maintain/views/processing_order_approval_views.xml
index 286816ce0..d7bf900b3 100644
--- a/yuthon_maintain/views/processing_order_approval_views.xml
+++ b/yuthon_maintain/views/processing_order_approval_views.xml
@@ -43,8 +43,9 @@
-
+
+
@@ -53,7 +54,6 @@
-
@@ -70,12 +70,11 @@
-
-
+
diff --git a/yuthon_purchase/models/purchase_workflow.py b/yuthon_purchase/models/purchase_workflow.py
index 5ea9e7a37..f8c9b9f86 100644
--- a/yuthon_purchase/models/purchase_workflow.py
+++ b/yuthon_purchase/models/purchase_workflow.py
@@ -30,7 +30,7 @@ class PurchaseWorkflow(models.Model):
work_end = fields.Boolean(string="审批结束", default=False, tracking=True)
purchase_order_id = fields.Many2one('purchase.order', string="采购订单", readonly=True)
- purchase_type = fields.Selection([('fixed', '固定资产'), ('low', '低值易耗'), ('service', '服务')],
+ purchase_type = fields.Selection([('fixed', '固定资产'), ('low', '低值易耗'), ('service', '服务'), ('day', '日常消耗品明细')],
string="采购类型", required=True, default='fixed')
service_content = fields.Text(string="服务内容")
diff --git a/yuthon_purchase/views/purchase_workflow_views.xml b/yuthon_purchase/views/purchase_workflow_views.xml
index f7b3b9aec..1b060285c 100644
--- a/yuthon_purchase/views/purchase_workflow_views.xml
+++ b/yuthon_purchase/views/purchase_workflow_views.xml
@@ -92,6 +92,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
From 1e5867c286584c84232d4de644a63d13f5069116 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?=
<9664676+pengyuthon@user.noreply.gitee.com>
Date: Thu, 25 Dec 2025 18:06:33 +0800
Subject: [PATCH 12/24] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
yuthon_purchase/models/purchase_workflow.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/yuthon_purchase/models/purchase_workflow.py b/yuthon_purchase/models/purchase_workflow.py
index f8c9b9f86..b6613f89d 100644
--- a/yuthon_purchase/models/purchase_workflow.py
+++ b/yuthon_purchase/models/purchase_workflow.py
@@ -30,7 +30,7 @@ class PurchaseWorkflow(models.Model):
work_end = fields.Boolean(string="审批结束", default=False, tracking=True)
purchase_order_id = fields.Many2one('purchase.order', string="采购订单", readonly=True)
- purchase_type = fields.Selection([('fixed', '固定资产'), ('low', '低值易耗'), ('service', '服务'), ('day', '日常消耗品明细')],
+ purchase_type = fields.Selection([('fixed', '固定资产'), ('low', '低值易耗'), ('service', '服务'), ('day', '日常消耗品')],
string="采购类型", required=True, default='fixed')
service_content = fields.Text(string="服务内容")
From 5a852d22298cb24d4def70116646f9a8ced94d30 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?=
<9664676+pengyuthon@user.noreply.gitee.com>
Date: Thu, 25 Dec 2025 18:11:39 +0800
Subject: [PATCH 13/24] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
yuthon_maintain/models/processing_order_approval.py | 2 ++
yuthon_maintain/views/processing_order_approval_views.xml | 4 +++-
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/yuthon_maintain/models/processing_order_approval.py b/yuthon_maintain/models/processing_order_approval.py
index 07ecc4ae5..982e7b7ab 100644
--- a/yuthon_maintain/models/processing_order_approval.py
+++ b/yuthon_maintain/models/processing_order_approval.py
@@ -109,6 +109,7 @@ class ProcessingOrderApproval(models.Model):
'res_id': self.device_id.id,
'view_mode': 'form',
'view_type': 'form',
+ 'target': 'current'
}
elif self.repair_id:
return {
@@ -118,6 +119,7 @@ class ProcessingOrderApproval(models.Model):
'res_id': self.repair_id.id,
'view_mode': 'form',
'view_type': 'form',
+ 'target': 'current'
}
@api.onchange('repair_id')
diff --git a/yuthon_maintain/views/processing_order_approval_views.xml b/yuthon_maintain/views/processing_order_approval_views.xml
index d7bf900b3..fd2429116 100644
--- a/yuthon_maintain/views/processing_order_approval_views.xml
+++ b/yuthon_maintain/views/processing_order_approval_views.xml
@@ -45,7 +45,6 @@
-
@@ -55,6 +54,9 @@
+
+
+
From 2e4513a958505580e305143ed4874cac7c77f2ac Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?=
<9664676+pengyuthon@user.noreply.gitee.com>
Date: Thu, 25 Dec 2025 18:13:31 +0800
Subject: [PATCH 14/24] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
yuthon_maintain/models/processing_order_approval.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/yuthon_maintain/models/processing_order_approval.py b/yuthon_maintain/models/processing_order_approval.py
index 982e7b7ab..67042f1a8 100644
--- a/yuthon_maintain/models/processing_order_approval.py
+++ b/yuthon_maintain/models/processing_order_approval.py
@@ -109,7 +109,7 @@ class ProcessingOrderApproval(models.Model):
'res_id': self.device_id.id,
'view_mode': 'form',
'view_type': 'form',
- 'target': 'current'
+ 'target': 'new'
}
elif self.repair_id:
return {
@@ -119,7 +119,7 @@ class ProcessingOrderApproval(models.Model):
'res_id': self.repair_id.id,
'view_mode': 'form',
'view_type': 'form',
- 'target': 'current'
+ 'target': 'new'
}
@api.onchange('repair_id')
From 1a1cf7b489e2930957040f3976b9a0f403bab505 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?=
<9664676+pengyuthon@user.noreply.gitee.com>
Date: Thu, 25 Dec 2025 18:17:34 +0800
Subject: [PATCH 15/24] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
yuthon_hr_employee/models/yuthon_hr_employee.py | 2 +-
yuthon_maintain/views/property_device_repair_views.xml | 3 +++
yuthon_maintain/views/property_report_repair.xml | 3 +++
3 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/yuthon_hr_employee/models/yuthon_hr_employee.py b/yuthon_hr_employee/models/yuthon_hr_employee.py
index 051661af5..0c6e29c9d 100644
--- a/yuthon_hr_employee/models/yuthon_hr_employee.py
+++ b/yuthon_hr_employee/models/yuthon_hr_employee.py
@@ -299,7 +299,7 @@ class YuthonHrEmployee(models.Model):
"res_model": "yuthon.renewal.approval",
"view_mode": "form",
"context": {
- "default_employee_id": self.employee_id.id,
+ "default_employee_id": self.id,
"default_current_status": self.employee_id.contract_id.date_end,
"default_department1_id": self.employee_id.department_id.id,
"default_contract_id": self.employee_id.contract_id.id,
diff --git a/yuthon_maintain/views/property_device_repair_views.xml b/yuthon_maintain/views/property_device_repair_views.xml
index 43d3dc357..ef7abfd3c 100644
--- a/yuthon_maintain/views/property_device_repair_views.xml
+++ b/yuthon_maintain/views/property_device_repair_views.xml
@@ -45,6 +45,9 @@
+
+
+
diff --git a/yuthon_maintain/views/property_report_repair.xml b/yuthon_maintain/views/property_report_repair.xml
index 1f75d9501..b213ad580 100644
--- a/yuthon_maintain/views/property_report_repair.xml
+++ b/yuthon_maintain/views/property_report_repair.xml
@@ -47,6 +47,9 @@
+
+
+
From af9cc1f2dadd26bd29910bfaf76e15b1a779defc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?=
<9664676+pengyuthon@user.noreply.gitee.com>
Date: Thu, 25 Dec 2025 18:18:08 +0800
Subject: [PATCH 16/24] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
yuthon_hr_employee/models/yuthon_hr_employee.py | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/yuthon_hr_employee/models/yuthon_hr_employee.py b/yuthon_hr_employee/models/yuthon_hr_employee.py
index 0c6e29c9d..9fc7fd241 100644
--- a/yuthon_hr_employee/models/yuthon_hr_employee.py
+++ b/yuthon_hr_employee/models/yuthon_hr_employee.py
@@ -300,9 +300,9 @@ class YuthonHrEmployee(models.Model):
"view_mode": "form",
"context": {
"default_employee_id": self.id,
- "default_current_status": self.employee_id.contract_id.date_end,
- "default_department1_id": self.employee_id.department_id.id,
- "default_contract_id": self.employee_id.contract_id.id,
+ "default_current_status": self.contract_id.date_end,
+ "default_department1_id": self.department_id.id,
+ "default_contract_id": self.contract_id.id,
},
}
From e414f8f3438da092164234834858b682193be6a4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?=
<9664676+pengyuthon@user.noreply.gitee.com>
Date: Thu, 25 Dec 2025 18:35:30 +0800
Subject: [PATCH 17/24] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../models/property_device_repair.py | 1 -
.../models/property_report_repair.py | 3 --
.../views/processing_order_approval_views.xml | 2 +-
.../views/property_device_repair_views.xml | 3 --
.../views/property_report_repair.xml | 4 ---
yuthon_purchase/models/purchase_workflow.py | 33 ++++++++++++-------
6 files changed, 23 insertions(+), 23 deletions(-)
diff --git a/yuthon_maintain/models/property_device_repair.py b/yuthon_maintain/models/property_device_repair.py
index ec69bbb97..44514a058 100644
--- a/yuthon_maintain/models/property_device_repair.py
+++ b/yuthon_maintain/models/property_device_repair.py
@@ -8,7 +8,6 @@ from odoo.exceptions import UserError, ValidationError
class PropertyDeviceRelief(models.Model):
_name = 'property.device.repair'
_description = '报事报修'
- _inherit = ['soong.workflow.mixin', 'mail.thread.main.attachment', 'mail.activity.mixin']
name = fields.Char(string='标题', compute='_compute_name', store=True)
code = fields.Char(string="报修编号",
diff --git a/yuthon_maintain/models/property_report_repair.py b/yuthon_maintain/models/property_report_repair.py
index f058dafd0..b51dfce9b 100644
--- a/yuthon_maintain/models/property_report_repair.py
+++ b/yuthon_maintain/models/property_report_repair.py
@@ -8,7 +8,6 @@ from odoo.exceptions import UserError
class PropertyRentRelief(models.Model):
_name = 'property.report.repair'
_description = '报事报修(物业)'
- _inherit = ['soong.workflow.mixin', 'mail.thread.main.attachment', 'mail.activity.mixin']
name = fields.Char(string='标题', compute='_compute_name', store=True)
code = fields.Char(string="报修编号",
@@ -29,8 +28,6 @@ class PropertyRentRelief(models.Model):
documents_ids = fields.Many2many('ir.attachment', string="附件")
active = fields.Boolean('Active', default=True, tracking=True)
work_end = fields.Boolean(string="结束")
- self_users_ids = fields.Many2many('res.users', string="当前经办人",
- default=lambda self: [(6, 0, [self.env.user.id])])
create_time = fields.Date(string="填报日期", default=fields.Datetime.now)
processing_order_id = fields.Many2one('processing.order.approval', string="处理单")
def _get_default_name_title(self):
diff --git a/yuthon_maintain/views/processing_order_approval_views.xml b/yuthon_maintain/views/processing_order_approval_views.xml
index fd2429116..fd90c73fb 100644
--- a/yuthon_maintain/views/processing_order_approval_views.xml
+++ b/yuthon_maintain/views/processing_order_approval_views.xml
@@ -55,7 +55,7 @@
-
+
diff --git a/yuthon_maintain/views/property_device_repair_views.xml b/yuthon_maintain/views/property_device_repair_views.xml
index ef7abfd3c..43d3dc357 100644
--- a/yuthon_maintain/views/property_device_repair_views.xml
+++ b/yuthon_maintain/views/property_device_repair_views.xml
@@ -45,9 +45,6 @@
-
-
-
diff --git a/yuthon_maintain/views/property_report_repair.xml b/yuthon_maintain/views/property_report_repair.xml
index b213ad580..53ea13d0d 100644
--- a/yuthon_maintain/views/property_report_repair.xml
+++ b/yuthon_maintain/views/property_report_repair.xml
@@ -47,12 +47,8 @@
-
-
-
-
diff --git a/yuthon_purchase/models/purchase_workflow.py b/yuthon_purchase/models/purchase_workflow.py
index b6613f89d..f76c32a0b 100644
--- a/yuthon_purchase/models/purchase_workflow.py
+++ b/yuthon_purchase/models/purchase_workflow.py
@@ -127,12 +127,12 @@ class PurchaseFixedLine(models.Model):
product_id = fields.Many2one('product.product', string="物品名称")
brand = fields.Char(string="品牌")
specs = fields.Char(string="规格")
- number = fields.Integer(string="数量",)
+ number = fields.Integer(string="数量")
name = fields.Text(string="描述")
product_packaging_id = fields.Many2one('product.packaging', string="包装")
taxes_id = fields.Many2one('account.tax', string='税项')
- unit_id = fields.Many2one(related='product_id.uom_id', string="单位")
- price_unit = fields.Float(related='product_id.standard_price', string="单价", store=True)
+ unit_id = fields.Many2one('uom.uom', string="单位")
+ price_unit = fields.Float(string="单价", store=True)
total = fields.Float(string="合计", compute='_compute_total', store=True)
@api.depends('price_unit', 'number')
@@ -144,20 +144,23 @@ class PurchaseFixedLine(models.Model):
def _onchange_product_id(self):
if self.product_id:
self.name = self.product_id.display_name
+ self.unit_id = self.product_id.uom_id
+ self.price_unit = self.product_id.standard_price
+
class PurchaseLowLine(models.Model):
_name = 'purchase.low.line'
_description = '低值易耗采购明细'
purchase_id = fields.Many2one('purchase.workflow', string="关联采购工作流")
product_id = fields.Many2one('product.product', string="物品名称")
- brand = fields.Char(related="product_id.brand", string="品牌")
- specs = fields.Char(related="product_id.specs", string="规格")
+ brand = fields.Char(string="品牌")
+ specs = fields.Char(string="规格")
name = fields.Text(string="描述")
product_packaging_id = fields.Many2one('product.packaging', string="包装")
taxes_id = fields.Many2one('account.tax', string='税项')
number = fields.Integer(string="数量")
- unit_id = fields.Many2one(related='product_id.uom_id', string="单位")
- price = fields.Float(related='product_id.standard_price', string="单价", store=True)
+ unit_id = fields.Many2one('uom.uom', string="单位")
+ price = fields.Float(string="单价", store=True)
total = fields.Float(string="合计", compute='_compute_total', store=True)
@api.depends('price', 'number')
@@ -169,7 +172,12 @@ class PurchaseLowLine(models.Model):
def _onchange_product_id(self):
if self.product_id:
self.name = self.product_id.display_name
+ self.brand = self.product_id.brand
+ self.specs = self.product_id.specs
+ self.unit_id = self.product_id.uom_id
+ self.price = self.product_id.standard_price
+# 服务采购明细
class PurchaseServiceLine(models.Model):
_name = 'purchase.service.line'
_description = '服务采购明细'
@@ -178,11 +186,11 @@ class PurchaseServiceLine(models.Model):
product_id = fields.Many2one('product.product', string="服务项目")
frequency = fields.Integer(string='频次')
fee = fields.Float(string="费用")
- name = fields.Text(string="描述", default=lambda self: self.product_id.display_name if self.product_id else False )
+ name = fields.Text(string="描述")
product_packaging_id = fields.Many2one('product.packaging', string="包装")
taxes_id = fields.Many2one('account.tax', string='税项')
- unit_id = fields.Many2one(related='product_id.uom_id', string="单位")
- price = fields.Float(related='product_id.standard_price', string="单价", store=True)
+ unit_id = fields.Many2one('uom.uom', string="单位")
+ price = fields.Float(string="单价", store=True)
total = fields.Float(string="合计", compute='_compute_total', store=True)
@api.depends('price', 'frequency')
@@ -193,7 +201,10 @@ class PurchaseServiceLine(models.Model):
@api.onchange('product_id')
def _onchange_product_id(self):
if self.product_id:
- self.name = self.product_id.display_name
+ self.name = self.product_id.display_name)
+ self.unit_id = self.product_id.uom_id
+ self.price = self.product_id.standard_price
+
class PurchaseFixedAssets(models.Model):
_name = 'purchase.fixed.assets'
From 802605d08c52087ede376f1d472bc9a1b9763529 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?=
<9664676+pengyuthon@user.noreply.gitee.com>
Date: Thu, 25 Dec 2025 18:36:43 +0800
Subject: [PATCH 18/24] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
yuthon_purchase/models/purchase_workflow.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/yuthon_purchase/models/purchase_workflow.py b/yuthon_purchase/models/purchase_workflow.py
index f76c32a0b..8f5d2e554 100644
--- a/yuthon_purchase/models/purchase_workflow.py
+++ b/yuthon_purchase/models/purchase_workflow.py
@@ -201,7 +201,7 @@ class PurchaseServiceLine(models.Model):
@api.onchange('product_id')
def _onchange_product_id(self):
if self.product_id:
- self.name = self.product_id.display_name)
+ self.name = self.product_id.display_name
self.unit_id = self.product_id.uom_id
self.price = self.product_id.standard_price
From 24ab84cc3c3822f71d379c25f22c11abbdae0009 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?=
<9664676+pengyuthon@user.noreply.gitee.com>
Date: Thu, 25 Dec 2025 18:45:02 +0800
Subject: [PATCH 19/24] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
yuthon_purchase/models/purchase_workflow.py | 1 +
yuthon_purchase/views/purchase_workflow_views.xml | 1 +
2 files changed, 2 insertions(+)
diff --git a/yuthon_purchase/models/purchase_workflow.py b/yuthon_purchase/models/purchase_workflow.py
index 8f5d2e554..2a6380fcb 100644
--- a/yuthon_purchase/models/purchase_workflow.py
+++ b/yuthon_purchase/models/purchase_workflow.py
@@ -24,6 +24,7 @@ class PurchaseWorkflow(models.Model):
default='normal', required=True)
pay_way = fields.Selection([('onetime', '一次性'), ('installment', '分期')], string="付款方式", default='onetime',
required=True)
+ pay_amount = fields.Float(string="付款金额")
total = fields.Float(string="合计金额", readonly=True)
document_ids = fields.Many2many('ir.attachment', string="附件")
active = fields.Boolean('启用', default=True, tracking=True)
diff --git a/yuthon_purchase/views/purchase_workflow_views.xml b/yuthon_purchase/views/purchase_workflow_views.xml
index 1b060285c..9e415102a 100644
--- a/yuthon_purchase/views/purchase_workflow_views.xml
+++ b/yuthon_purchase/views/purchase_workflow_views.xml
@@ -50,6 +50,7 @@
+
From f7afeb2e93b5db11d11f8e3e8fabecc1eba8065a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?=
<9664676+pengyuthon@user.noreply.gitee.com>
Date: Thu, 25 Dec 2025 19:04:45 +0800
Subject: [PATCH 20/24] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../wizard/soong_workflow_record_revoke_wizard.py | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/soong_workflow/wizard/soong_workflow_record_revoke_wizard.py b/soong_workflow/wizard/soong_workflow_record_revoke_wizard.py
index f9b09b9bf..793e4435c 100644
--- a/soong_workflow/wizard/soong_workflow_record_revoke_wizard.py
+++ b/soong_workflow/wizard/soong_workflow_record_revoke_wizard.py
@@ -43,7 +43,11 @@ class SoongWorkflowRecordRevokeWizard(models.TransientModel):
])
meal_line.unlink()
-
record_to_update.write({'log_ids': [(5, 0, 0)]})
record_to_update.state = '申请人'
- self.record_id.approve_state = 'start'
\ No newline at end of file
+ self.record_id.write({
+ 'approve_state': 'start',
+ 'soong_state': 'to_do',
+ 'employee_ids': [(6, 0, [self.record_id.create_uid.employee_ids.id])],
+ 'users_ids': [(6, 0, [self.record_id.create_uid.id])]
+ })
\ No newline at end of file
From c839492016a0442133c6c8014c6a6bd615f2a725 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?=
<9664676+pengyuthon@user.noreply.gitee.com>
Date: Thu, 25 Dec 2025 19:10:31 +0800
Subject: [PATCH 21/24] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
yuthon_will_task/models/inherit_room_booking.py | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/yuthon_will_task/models/inherit_room_booking.py b/yuthon_will_task/models/inherit_room_booking.py
index 95c6b86f2..ef3c36720 100644
--- a/yuthon_will_task/models/inherit_room_booking.py
+++ b/yuthon_will_task/models/inherit_room_booking.py
@@ -5,6 +5,18 @@ from datetime import datetime, timedelta, date
class InheritRoomBooking(models.Model):
_inherit = 'room.booking'
+
+ def get_no_read_count(self):
+ today = date.today() + timedelta(hours=8)
+ today_start = datetime.combine(today, datetime.min.time())
+ today_end = datetime.combine(today, datetime.max.time())
+ domain = [
+ ('start_datetime', '>=', today_start),
+ ('start_datetime', '<=', today_end)
+ ]
+ return self.search_count(domain)
+
+
@api.model
def create(self, vals):
task_time_ids = self.env['yuthon.task.time'].search([('name', '=', '30分钟')])
From c2297fb5963ba7d75c63371e1919df45378441d2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?=
<9664676+pengyuthon@user.noreply.gitee.com>
Date: Thu, 25 Dec 2025 19:12:52 +0800
Subject: [PATCH 22/24] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
yuthon_will_task/security/yuthon_will_task_security.xml | 8 ++++++++
yuthon_will_task/views/yuthon_task_menu.xml | 1 +
2 files changed, 9 insertions(+)
diff --git a/yuthon_will_task/security/yuthon_will_task_security.xml b/yuthon_will_task/security/yuthon_will_task_security.xml
index d8e1b26a8..0056a273e 100644
--- a/yuthon_will_task/security/yuthon_will_task_security.xml
+++ b/yuthon_will_task/security/yuthon_will_task_security.xml
@@ -13,5 +13,13 @@
+
+ 会议组
+
+
+ 会议管理员
+
+
+
\ No newline at end of file
diff --git a/yuthon_will_task/views/yuthon_task_menu.xml b/yuthon_will_task/views/yuthon_task_menu.xml
index 1b7b5861e..c83c199c5 100644
--- a/yuthon_will_task/views/yuthon_task_menu.xml
+++ b/yuthon_will_task/views/yuthon_task_menu.xml
@@ -23,6 +23,7 @@
name="预定会议"
action="room.room_booking_action"
parent="menu_yuthon_will_task"
+ groups="yuthon_will_task.group_room_booking_manager"
sequence="10"/>