From 44dd7fff59f085da4d1f7e4fe388166ae58067cb Mon Sep 17 00:00:00 2001
From: zhouzhou <123@qq.com>
Date: Thu, 31 Oct 2024 19:54:26 +0800
Subject: [PATCH] =?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
---
soong_workflow/models/soong_user_role.py | 44 +--
.../views/soong_user_role_views.xml | 2 +-
yuthon_contract/models/inherit_hr_contract.py | 4 +
.../views/inherit_hr_contract_views.xml | 2 +-
yuthon_holiday/models/inherit_hr_leave.py | 48 ++-
.../models/inherit_hr_leave_type.py | 1 +
yuthon_holiday/security/ir.model.access.csv | 1 +
yuthon_holiday/views/hr_leave_batch.xml | 88 ++++--
.../views/inherit_hr_type_views.xml | 6 +
.../models/yuthon_hr_employee.py | 54 +++-
.../views/yuthon_hr_employee_views.xml | 17 +-
.../models/yuthon_transfer_approval.py | 2 +-
yuthon_issue/models/issue_library.py | 22 +-
yuthon_issue/views/issue_library_views.xml | 2 +-
yuthon_property/__manifest__.py | 6 +-
.../data/data_yuthon_resource_mgmt_config.xml | 23 --
.../data/yuthon_property_approval_data.xml | 1 -
yuthon_property/models/__init__.py | 6 +-
yuthon_property/models/property_assess.py | 12 +
.../models/property_evaluate_application.py | 19 --
.../models/property_prospective_customers.py | 15 +
yuthon_property/models/property_type.py | 39 ---
yuthon_property/models/yuthon_property.py | 148 +++++++--
.../models/yuthon_property_evaluated.py | 9 +
.../models/yuthon_property_evaluation.py | 48 +--
.../models/yuthon_property_lessee.py | 15 +
.../models/yuthon_resource_mgmt_config.py | 8 +
yuthon_property/security/ir.model.access.csv | 12 +-
.../static/others/user_template.xlsx | Bin 0 -> 20102 bytes
yuthon_property/views/menuitem.xml | 20 +-
.../views/property_prospective_customers.xml | 51 ++++
yuthon_property/views/property_type_views.xml | 22 --
.../views/yuthon_property_evaluated_views.xml | 80 +++++
.../yuthon_property_evaluation_views.xml | 185 -----------
.../views/yuthon_property_lessee_views.xml | 54 ++++
.../views/yuthon_property_views.xml | 235 ++++++++------
.../yuthon_resource_mgmt_config_views.xml | 15 +
yuthon_property_approval/__init__.py | 3 +-
yuthon_property_approval/__manifest__.py | 6 +-
.../data/sale_renting_code_data.xml | 7 +
yuthon_property_approval/models/__init__.py | 7 +-
.../models/property_approval.py | 56 ++--
.../models/property_assess.py | 32 --
.../models/property_evaluate_application.py | 29 ++
.../models/property_handover.py | 30 ++
.../security/ir.model.access.csv | 12 +-
.../views/property_approval_views.xml | 50 +--
.../property_evaluate_application_views.xml | 25 +-
.../views/property_handover_views.xml | 65 ++++
.../views/property_menu_all.xml | 288 +++++++++---------
.../views/property_record_views.xml | 14 +-
yuthon_property_approval/wizard/__init__.py | 1 +
.../wizard/property_inducts_wizard.py | 35 +++
.../wizard/property_inducts_wizard.xml | 35 +++
54 files changed, 1198 insertions(+), 813 deletions(-)
create mode 100644 yuthon_property/models/property_assess.py
delete mode 100644 yuthon_property/models/property_evaluate_application.py
create mode 100644 yuthon_property/models/property_prospective_customers.py
delete mode 100644 yuthon_property/models/property_type.py
create mode 100644 yuthon_property/models/yuthon_property_lessee.py
create mode 100644 yuthon_property/static/others/user_template.xlsx
create mode 100644 yuthon_property/views/property_prospective_customers.xml
delete mode 100644 yuthon_property/views/property_type_views.xml
create mode 100644 yuthon_property/views/yuthon_property_evaluated_views.xml
delete mode 100644 yuthon_property/views/yuthon_property_evaluation_views.xml
create mode 100644 yuthon_property/views/yuthon_property_lessee_views.xml
delete mode 100644 yuthon_property_approval/models/property_assess.py
create mode 100644 yuthon_property_approval/models/property_evaluate_application.py
create mode 100644 yuthon_property_approval/models/property_handover.py
rename {yuthon_property => yuthon_property_approval}/views/property_evaluate_application_views.xml (80%)
create mode 100644 yuthon_property_approval/views/property_handover_views.xml
create mode 100644 yuthon_property_approval/wizard/__init__.py
create mode 100644 yuthon_property_approval/wizard/property_inducts_wizard.py
create mode 100644 yuthon_property_approval/wizard/property_inducts_wizard.xml
diff --git a/soong_workflow/models/soong_user_role.py b/soong_workflow/models/soong_user_role.py
index 041a9f190..7ed6374a7 100644
--- a/soong_workflow/models/soong_user_role.py
+++ b/soong_workflow/models/soong_user_role.py
@@ -14,26 +14,26 @@ class YuthonUserRole(models.Model):
end_time = fields.Datetime(string="结束时间")
yuthon_company = fields.Selection([('thtz', '天河投资集团'), ('thwg', '天河物管'),
('thlc', '天河粮储'), ('tctj', '天投城建'),
- ('thtjbb', '天河投资本部')], string="所属公司")
+ ('thtjbb', '天河投资本部')], string="所属公司",compute='compute_company')
#
- # @api.depends('department_id')
- # def compute_company(self):
- # company_mapping = {'天河投资集团': 'thtz',
- # '天河物管': 'thwg',
- # '天河粮储': 'thlc',
- # '天投城建': 'tctj',
- # '天河投资本部':'thtjbb'}
- # for record in self:
- # visited_departments = set()
- # department = record.department_id
- # while department and department.id not in visited_departments:
- # visited_departments.add(department.id)
- # if department.name == '天河投资集团':
- # record.yuthon_company = 'thtz'
- # break
- # elif department.name in company_mapping:
- # record.yuthon_company = company_mapping[department.name]
- # break
- # department = department.parent_id
- # else:
- # record.yuthon_company = 'thtz'
+ @api.depends('department_id')
+ def compute_company(self):
+ company_mapping = {'天河投资集团': 'thtz',
+ '天河物管': 'thwg',
+ '天河粮储': 'thlc',
+ '天投城建': 'tctj',
+ '天河投资本部':'thtjbb'}
+ for record in self:
+ visited_departments = set()
+ department = record.department_id
+ while department and department.id not in visited_departments:
+ visited_departments.add(department.id)
+ if department.name == '天河投资集团':
+ record.yuthon_company = 'thtz'
+ break
+ elif department.name in company_mapping:
+ record.yuthon_company = company_mapping[department.name]
+ break
+ department = department.parent_id
+ else:
+ record.yuthon_company = 'thtz'
diff --git a/soong_workflow/views/soong_user_role_views.xml b/soong_workflow/views/soong_user_role_views.xml
index bb08a258f..d8b014798 100644
--- a/soong_workflow/views/soong_user_role_views.xml
+++ b/soong_workflow/views/soong_user_role_views.xml
@@ -9,7 +9,7 @@
-
+
diff --git a/yuthon_contract/models/inherit_hr_contract.py b/yuthon_contract/models/inherit_hr_contract.py
index 6027f1866..5060dd808 100644
--- a/yuthon_contract/models/inherit_hr_contract.py
+++ b/yuthon_contract/models/inherit_hr_contract.py
@@ -17,3 +17,7 @@ class HrContract(models.Model):
salary.wage = salary.job_lv_id.base_wage
salary.name = '劳动合同'
+ work_entry_source = fields.Selection([
+ ('calendar', '考勤安排'),
+ ('attendance', 'Attendances'),
+ ('planning', '特殊排版')])
\ No newline at end of file
diff --git a/yuthon_contract/views/inherit_hr_contract_views.xml b/yuthon_contract/views/inherit_hr_contract_views.xml
index 145b57b8e..452ad4f20 100644
--- a/yuthon_contract/views/inherit_hr_contract_views.xml
+++ b/yuthon_contract/views/inherit_hr_contract_views.xml
@@ -6,7 +6,7 @@
-
+
diff --git a/yuthon_holiday/models/inherit_hr_leave.py b/yuthon_holiday/models/inherit_hr_leave.py
index ff2e75baf..58db48c63 100644
--- a/yuthon_holiday/models/inherit_hr_leave.py
+++ b/yuthon_holiday/models/inherit_hr_leave.py
@@ -6,12 +6,12 @@ from odoo.exceptions import ValidationError
class HrLeave(models.Model):
_inherit = 'hr.leave'
- batch_id = fields.Many2one(string='Batch', comodel_name='hr.leave.batch', required=True, ondelete='cascade')
+ batch_id = fields.Many2one(string='批量', comodel_name='hr.leave.batch', required=True, ondelete='cascade')
class HolidaysRequestBatch(models.Model):
_name = 'hr.leave.batch'
- _description = 'Time Off Batches'
+ _description = '请假审批'
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin']
def _get_default_emp(self):
@@ -20,21 +20,25 @@ class HolidaysRequestBatch(models.Model):
raise
return emp
- name = fields.Char(string='Description')
- employee_id = fields.Many2one(string='Employee', comodel_name='hr.employee', required=True, default=_get_default_emp, index=True)
- leave_ids = fields.One2many(string='Details', comodel_name='hr.leave', inverse_name='batch_id')
- state = fields.Selection(string='State', selection=[
- ('draft', 'To Submit'),
- ('confirm', 'To Approve'),
- ('refuse', 'Refused'),
- ('validate', 'Approved')
+ name = fields.Char(string='标题')
+ employee_id = fields.Many2one(string='员工', comodel_name='hr.employee', required=True, default=_get_default_emp, index=True)
+ leave_ids = fields.One2many(string='详情', comodel_name='hr.leave', inverse_name='batch_id')
+ state = fields.Selection(string='状态', selection=[
+ ('draft', '撤回'),
+ ('confirm', '转交'),
+ ('refuse', '拒绝'),
+ ('validate', '审批')
], default='draft', tracking=True, copy=False)
+ company_page = fields.Selection([('tz', '天河投资'), ('wg', '天河物管'), ('lc', '天河粮储')], string="公司")
+ users_id = fields.Many2one('res.users', string="申请人", default=lambda self: self.env.user.id)
+ leave_id = fields.Many2one('res.users', string="请假人")
+ department_id = fields.Many2one('hr.department', string="部门")
+ days = fields.Float(string='天数')
+ hours = fields.Float(string='小时')
+ text = fields.Html(string='申请事由')
+ leave_line_ids = fields.One2many('hr.leave.line', 'leave_batch_id', string="关联请假详情明细行")
+ is_issues = fields.Boolean(string='是否上会')
- @api.constrains('leave_ids')
- def _check_leave_ids(self):
- for rec in self:
- if len(rec.leave_ids) < 1:
- raise ValidationError(_('You must have at least one leave request in the batch.'))
# 提交
def action_submit(self):
@@ -59,3 +63,17 @@ class HolidaysRequestBatch(models.Model):
class HrLeaveLine(models.Model):
_name = 'hr.leave.line'
+ leave_batch_id = fields.Many2one('hr.leave.batch', string="关联请假审批")
+ leave_type_id = fields.Many2one('hr.leave.type',string="请假类型")
+ available_days = fields.Integer(related='leave_type_id.available_days',string="可用天数")
+ applicants = fields.Selection(related='leave_type_id.request_unit',string="申请单位")
+ leave_documents_ids = fields.Many2many(related='leave_type_id.leave_documents_id',string="假期详情说明")
+ start_time = fields.Date(string="开始时间")
+ end_time = fields.Date(string="结束时间")
+ days = fields.Float(string="天数")
+ residual = fields.Float(string="剩余天数")
+ #
+ # @api.onchange('leave_type_id')
+ # def _onchange_leave_type_id(self):
+ # if self.leave_type_id:
+ # self.leave_documents_ids = self.leave_type_id.leave_documents_id
diff --git a/yuthon_holiday/models/inherit_hr_leave_type.py b/yuthon_holiday/models/inherit_hr_leave_type.py
index 971cecb68..6bc514307 100644
--- a/yuthon_holiday/models/inherit_hr_leave_type.py
+++ b/yuthon_holiday/models/inherit_hr_leave_type.py
@@ -6,4 +6,5 @@ class HrLeaveType(models.Model):
_inherit = 'hr.leave.type'
leave_documents_id = fields.Many2many('ir.attachment', string="假期详细说明")
+ available_days = fields.Integer(string="可用天数")
allocation_validation_type = fields.Selection(defalt='no')
\ No newline at end of file
diff --git a/yuthon_holiday/security/ir.model.access.csv b/yuthon_holiday/security/ir.model.access.csv
index f4129e1d0..d3e6ee678 100644
--- a/yuthon_holiday/security/ir.model.access.csv
+++ b/yuthon_holiday/security/ir.model.access.csv
@@ -1,2 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_hr_leave_batch,hr.leave.batch,model_hr_leave_batch,,1,1,1,1
+access_hr_leave_line,hr.leave.line,model_hr_leave_line,,1,1,1,1
\ No newline at end of file
diff --git a/yuthon_holiday/views/hr_leave_batch.xml b/yuthon_holiday/views/hr_leave_batch.xml
index 2a299707d..dadabf6b7 100644
--- a/yuthon_holiday/views/hr_leave_batch.xml
+++ b/yuthon_holiday/views/hr_leave_batch.xml
@@ -6,14 +6,19 @@
hr.leave.batch.tree
hr.leave.batch
-
-
+
+
-
+
+
+
+
+
+
-
-
-
+
+
+
@@ -25,24 +30,46 @@
@@ -80,7 +122,7 @@
- My Time Off
+ 我的休假
hr.leave.batch
tree,form
{}
@@ -97,7 +139,7 @@
- All Time Off
+ 所有休息时间
hr.leave.batch
tree,form
{}
diff --git a/yuthon_holiday/views/inherit_hr_type_views.xml b/yuthon_holiday/views/inherit_hr_type_views.xml
index 05ddb88ba..0b07271d9 100644
--- a/yuthon_holiday/views/inherit_hr_type_views.xml
+++ b/yuthon_holiday/views/inherit_hr_type_views.xml
@@ -8,6 +8,9 @@
假期类型
+
+
+
1
@@ -23,6 +26,9 @@
+
+
+
1
diff --git a/yuthon_hr_employee/models/yuthon_hr_employee.py b/yuthon_hr_employee/models/yuthon_hr_employee.py
index 9043b1457..8bb4a1801 100644
--- a/yuthon_hr_employee/models/yuthon_hr_employee.py
+++ b/yuthon_hr_employee/models/yuthon_hr_employee.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
from odoo import api, fields, models
-from datetime import datetime
+from datetime import date, datetime
from odoo.exceptions import UserError, ValidationError
nation_list = [('a', '汉族'), ('b', '壮族'), ('v', '满族'), ('d', '回族'), ('e', '苗族'), ('f', '维吾尔族'),
@@ -45,8 +45,9 @@ class YuthonHrEmployee(models.Model):
user_number_start_time = fields.Date(string="身份证开始时间")
user_number_end_time = fields.Date(string="身份证到期时间")
nation = fields.Selection(nation_list, string="民族")
- old = fields.Integer(string="年龄", compute='_compute_birthday_old')
- birthday_month = fields.Integer(string="生日月份", compute='_compute_birthday_old')
+ old = fields.Integer(string="年龄", compute='_compute_info')
+ birthday = fields.Date(string="出生年月", compute='_compute_info')
+ birthday_month = fields.Integer(string="生日月份", compute='_compute_info')
user_type = fields.Char(string="人员类别")
retire_date = fields.Date(string="退休日期")
retire_years = fields.Integer(string="离退休年限", compute='_compute_retire_years')
@@ -171,17 +172,46 @@ class YuthonHrEmployee(models.Model):
else:
record.company_old = None
- @api.depends('birthday')
- def _compute_birthday_old(self):
- """生日月份 年龄 计算"""
+ @api.depends('identification_id') # 只依赖身份证号码
+ def _compute_info(self):
for record in self:
- if record.birthday:
- today = datetime.now().date()
- record.birthday_month = record.birthday.month
- record.old = today.year - record.birthday.year
+ if record.identification_id:
+ id_number = record.identification_id.upper()
+ if len(id_number) != 18:
+ record._clear_info()
+ raise UserError("身份证号码长度应为18位")
+
+ try:
+ if not (all(c.isdigit() for c in id_number[:-1]) and (
+ id_number[-1].isdigit() or id_number[-1] == 'X')):
+ raise ValueError("身份证号码包含无效字符")
+
+ year = int(id_number[6:10])
+ month = int(id_number[10:12])
+ day = int(id_number[12:14])
+ record.birthday = date(year, month, day)
+ record.birthday_month = month
+
+ today = date.today()
+ if year is not None:
+ record.old = today.year - year - ((today.month, today.day) < (month, day))
+ else:
+ record.old = 0
+ gender_code = int(id_number[-2])
+ record.user_sex = 'girl' if gender_code % 2 == 0 else 'boy'
+
+ except ValueError as e:
+ record._clear_info()
+ raise UserError(str(e) or "身份证号码格式不正确") # Raise UserError
else:
- record.birthday_month = 0
- record.old = 0
+ record._clear_info()
+
+ def _clear_info(self):
+ self.birthday = False
+ self.birthday_month = False
+ self.old = 0
+ self.user_sex = False
+
@api.depends('retire_date')
def _compute_retire_years(self):
diff --git a/yuthon_hr_employee/views/yuthon_hr_employee_views.xml b/yuthon_hr_employee/views/yuthon_hr_employee_views.xml
index 34acf0979..3b0711fa9 100644
--- a/yuthon_hr_employee/views/yuthon_hr_employee_views.xml
+++ b/yuthon_hr_employee/views/yuthon_hr_employee_views.xml
@@ -65,17 +65,17 @@
- 岁
+
- 月
+
- 年
+
@@ -258,4 +258,15 @@
tree,kanban,form,activity,graph,pivot,hierarchy
+
+ hr.employee.attendance.form
+ hr.employee
+
+
+
+
+ 1
+
+
+
\ No newline at end of file
diff --git a/yuthon_hr_employee_approval/models/yuthon_transfer_approval.py b/yuthon_hr_employee_approval/models/yuthon_transfer_approval.py
index 86013a697..bd25252a0 100644
--- a/yuthon_hr_employee_approval/models/yuthon_transfer_approval.py
+++ b/yuthon_hr_employee_approval/models/yuthon_transfer_approval.py
@@ -2,7 +2,7 @@ from odoo import models, fields, api
class YutransferApproval(models.Model):
_name = 'yuthon.transfer.approval'
- _inherit = ['mail.activity.mixin']
+ _inherit = ['soong.workflow.mixin']
_description = '工作移交'
documents_ids = fields.Many2many('ir.attachment', string='议题附件')
diff --git a/yuthon_issue/models/issue_library.py b/yuthon_issue/models/issue_library.py
index 9dcf65458..0e1b38b16 100644
--- a/yuthon_issue/models/issue_library.py
+++ b/yuthon_issue/models/issue_library.py
@@ -54,11 +54,13 @@ class IssueLibrary(models.Model):
def all_issue_pull(self):
issue_active_ids = self.env["issue.library"].browse(self._context.get('active_ids', self._context.get('active_id')))
- if self.state != 'draft':
- raise UserError("当前状态不允许提交")
- for i in issue_active_ids:
- if i.state != 'draft':
+ if not issue_active_ids:
+ if self.state != 'draft':
raise UserError("当前状态不允许提交")
+ else:
+ for i in issue_active_ids:
+ if i.state != 'draft':
+ raise UserError("当前状态不允许提交")
form_id = self.env.ref("yuthon_issue.issue_library_approval_form").id
issue_decision_lines = []
specifics_list = []
@@ -76,9 +78,13 @@ class IssueLibrary(models.Model):
'is_note': issue_record.is_note,
'employee_id': issue_record.employee_id.id
}))
+ if len(specifics_list)>1:
+ name = ','.join(specifics_list)
+ else:
+ name = self.name
issue_approval_id = self.env['issue.approval'].create({
'issue_approval_ids': issue_decision_lines,
- 'name': ';'.join(specifics_list),
+ 'name': name,
'employee_id': self.employee_id.id,
})
self.issue_approval_id = issue_approval_id
@@ -98,9 +104,9 @@ class IssueLibrary(models.Model):
def all_meeting_issue(self):
issue_active_ids = self.env["issue.library"].browse(self._context.get('active_ids', self._context.get('active_id')))
- for record in issue_active_ids:
- if record.state != 'will':
- raise UserError("当前状态不允许上会")
+ # for record in issue_active_ids:
+ # if record.state != 'will':
+ # raise UserError("当前状态不允许上会")
for meet in self:
meet.write({"state": "on_meet"})
issue_details = []
diff --git a/yuthon_issue/views/issue_library_views.xml b/yuthon_issue/views/issue_library_views.xml
index 04c197f8a..4a06ad1b4 100644
--- a/yuthon_issue/views/issue_library_views.xml
+++ b/yuthon_issue/views/issue_library_views.xml
@@ -36,7 +36,7 @@
-
+
diff --git a/yuthon_property/__manifest__.py b/yuthon_property/__manifest__.py
index 70661de0a..96134119e 100644
--- a/yuthon_property/__manifest__.py
+++ b/yuthon_property/__manifest__.py
@@ -12,7 +12,6 @@
'data/data_yuthon_resource_mgmt_config.xml',
'data/yuthon_property_approval_data.xml',
'views/yuthon_property_views.xml',
- 'views/property_type_views.xml',
'views/property_patrol_duty.xml',
'views/property_patrol_plan.xml',
'views/property_route_management.xml',
@@ -25,8 +24,9 @@
'views/yuthon_resource_mgmt_config_views.xml',
'views/property_meter_archives_views.xml',
'views/property_meter_water_views.xml',
- 'views/property_evaluate_application_views.xml',
- 'views/yuthon_property_evaluation_views.xml',
+ 'views/yuthon_property_evaluated_views.xml',
+ 'views/property_prospective_customers.xml',
+ 'views/yuthon_property_lessee_views.xml',
'views/menuitem.xml',
],
'demo': [],
diff --git a/yuthon_property/data/data_yuthon_resource_mgmt_config.xml b/yuthon_property/data/data_yuthon_resource_mgmt_config.xml
index 34c99479f..6c8def2e6 100644
--- a/yuthon_property/data/data_yuthon_resource_mgmt_config.xml
+++ b/yuthon_property/data/data_yuthon_resource_mgmt_config.xml
@@ -85,27 +85,4 @@
全电票
-
- 待评估
-
-
- 评估中
-
-
- 评估备案
-
-
- 挂网
-
-
- 签约中
-
-
- 已出租
-
-
- 闲置
-
-
-
\ No newline at end of file
diff --git a/yuthon_property/data/yuthon_property_approval_data.xml b/yuthon_property/data/yuthon_property_approval_data.xml
index eb62db1de..c13930e45 100644
--- a/yuthon_property/data/yuthon_property_approval_data.xml
+++ b/yuthon_property/data/yuthon_property_approval_data.xml
@@ -7,5 +7,4 @@
3
-
\ No newline at end of file
diff --git a/yuthon_property/models/__init__.py b/yuthon_property/models/__init__.py
index 944cc44df..5ea97e7de 100644
--- a/yuthon_property/models/__init__.py
+++ b/yuthon_property/models/__init__.py
@@ -1,5 +1,4 @@
from . import yuthon_property
-from . import property_type
from . import property_patrol_duty
from . import property_patrol_plan
from . import property_patrol_position
@@ -9,8 +8,11 @@ from . import yuthon_resource_mgmt_config
from . import yuthon_draw_result
from . import yuthon_expert_database
from . import yuthon_property_evaluation
-from . import property_evaluate_application
from . import property_rental_form
from . import property_transaction_confirmed
from . import property_meter_archives
from . import property_meter_water
+from . import yuthon_property_evaluated
+from . import property_prospective_customers
+from . import yuthon_property_lessee
+from . import property_assess
diff --git a/yuthon_property/models/property_assess.py b/yuthon_property/models/property_assess.py
new file mode 100644
index 000000000..c170e0e0e
--- /dev/null
+++ b/yuthon_property/models/property_assess.py
@@ -0,0 +1,12 @@
+from odoo import models, fields, api
+
+
+class PropertyAssess(models.Model):
+ _name = 'property.assess'
+
+ name = fields.Char(string="Name")
+
+
+class PropertyAssessLine(models.Model):
+ _name = 'property.assess.line'
+
diff --git a/yuthon_property/models/property_evaluate_application.py b/yuthon_property/models/property_evaluate_application.py
deleted file mode 100644
index b90c410e5..000000000
--- a/yuthon_property/models/property_evaluate_application.py
+++ /dev/null
@@ -1,19 +0,0 @@
-from odoo import models, fields, api
-
-
-class PropertyEvaluateApplication(models.Model):
- _name = 'property.evaluate.application'
- _description = '物业评估申请'
- _inherit = ['soong.workflow.mixin']
-
-
- name = fields.Char(string='标题')
- code = fields.Char(string='编号', required=True, copy=False,
- default=lambda self: self.env['ir.sequence'].next_by_code('yuthon_property_code'))
- main_text = fields.Html(string='正文')
- is_meet = fields.Boolean(string="是否上会")
- is_experts = fields.Boolean(string="是否需要专家评审")
- notice_documents_ids = fields.Many2many('ir.attachment', string='议题附件')
- property_message_ids = fields.One2many('yuthon.property.evaluation', 'property_message_id', string='物业信息明细行')
-
-
diff --git a/yuthon_property/models/property_prospective_customers.py b/yuthon_property/models/property_prospective_customers.py
new file mode 100644
index 000000000..0315d996c
--- /dev/null
+++ b/yuthon_property/models/property_prospective_customers.py
@@ -0,0 +1,15 @@
+from odoo import models, fields, api
+
+
+class PropertyProspectiveCustomers(models.Model):
+ _name = 'property.prospective.customers'
+ _description = '意向客户列表'
+
+ name = fields.Char(string='标题')
+ customer_name = fields.Char(string='意向客户名称')
+ entity_type = fields.Selection([('person', '个人'), ('company', '企业')],string='实体类型')
+ phone = fields.Char(string='联系人')
+ phone_number = fields.Char(string='联系电话')
+ industry = fields.Char(string='行业')
+
+
diff --git a/yuthon_property/models/property_type.py b/yuthon_property/models/property_type.py
deleted file mode 100644
index 14806844e..000000000
--- a/yuthon_property/models/property_type.py
+++ /dev/null
@@ -1,39 +0,0 @@
-# -*- coding: utf-8 -*-
-# Part of Odoo. See LICENSE file for full copyright and licensing details.
-
-from odoo import models, fields, api, exceptions, _
-from datetime import datetime
-from odoo.exceptions import UserError, ValidationError
-
-
-class PropertyType(models.Model):
- _name = 'property.type'
- _description = '物业状态'
- _rec_name = 'name'
-
- name = fields.Char(string='名称')
- create_time = fields.Datetime(string="创建日期", default=lambda self: fields.Datetime.now())
- start_time = fields.Datetime(string="生效日期")
- end_time = fields.Datetime(string="终止日期")
- is_enable = fields.Boolean(string="是否启用", compute='_compute_is_enable')
-
- @api.depends('start_time', 'end_time')
- def _compute_is_enable(self):
- for rec in self:
- if rec.start_time >= rec.end_time:
- raise ValidationError('合同开始日期不能大于合同结束日期')
- if rec.start_time and rec.end_time:
- if rec.start_time < datetime.now() < rec.end_time:
- rec.is_enable = True
- else:
- rec.is_enable = False
- else:
- rec.is_enable = False
-
-
-
-
-
-
-
-
diff --git a/yuthon_property/models/yuthon_property.py b/yuthon_property/models/yuthon_property.py
index 32fb8160c..a8e397f46 100644
--- a/yuthon_property/models/yuthon_property.py
+++ b/yuthon_property/models/yuthon_property.py
@@ -1,5 +1,5 @@
from odoo import models, fields, api
-
+from odoo.exceptions import UserError, ValidationError
class YuthonProperty(models.Model):
_name = 'yuthon.property'
@@ -31,12 +31,13 @@ class YuthonProperty(models.Model):
property_area = fields.Float(string="产权面积")
pooled_area = fields.Float(string="公摊面积")
rentable_area = fields.Float(string="可租面积")
- end_date = fields.Date(string="结束日期")
- state_id = fields.Many2one('property.type', string='状态')
+ state = fields.Selection([('to', '待评估'), ('done', '已评估'), ('ing', '评估中'),
+ ('ing_handover', '移交中') ,('done_handover', '已移交'),
+ ('filing', '评估备案'), ('net', '挂网'), ('signing', '签约中'),
+ ('leased', '已出租'),('idle', '闲置')],string='状态', default='to')
is_meter = fields.Boolean(string="是否有水表")
is_electricity_meter = fields.Boolean(string="是否有电表")
-
- company_page = fields.Selection([('tz', '天河投资'), ('wg', '天河物管'), ('lc', '天河粮储')], string="所属公司")
+ company_page = fields.Selection([('tz', '天河投资'), ('wg', '天河物管'), ('lc', '天河粮储'), ('tj','天河投建')], string="所属公司")
admin_id = fields.Many2one('res.users', string="管理员")
purpose_id = fields.Many2one('yuthon.resource.purpose', string="资产用途")
mgmt_type_id = fields.Many2one('yuthon.resource.management.type', string="管理类型")
@@ -45,24 +46,10 @@ class YuthonProperty(models.Model):
property_card = fields.Html(string="产权证")
life_timer = fields.Datetime(string="使用时间")
property_use_time = fields.Selection([('a', '70年'), ('b', '40年')], string="使用年限")
-
property_precinct = fields.Char(string="片区")
asset_type_id = fields.Many2one('yuthon.resource.type', string="资产类型")
is_hvac = fields.Boolean(string="是否使用中央空调")
is_handle_land = fields.Boolean(string="是否办理土地有偿使用手续")
-
- ame = fields.Char(string='标题')
- decoration_type = fields.Selection([('blank', '毛坯'), ('hardcover', '精装'), ('brands', '简装'), ('rsz', '豪装')],
- string="装修类型")
- water_meter_ids = fields.One2many('yuthon.property.water', 'yuthon_property_id', string='水表列表')
- energy_meter_ids = fields.One2many('yuthon.property.energy', 'yuthon_property_id', string='电表列表')
-
- @api.onchange('building_area')
- def _onchange_building_area(self):
- for rec in self:
- rec.management_area = rec.building_area
- rec.rentable_area = rec.building_area
-
property_use_id = fields.Integer(string="物业用途ID")
image_1920 = fields.Image(string="图片")
description = fields.Html(string="描述")
@@ -72,18 +59,97 @@ class YuthonProperty(models.Model):
address = fields.Char(string="物业地址")
title_number = fields.Char(string="产权编号")
suite_area = fields.Float(string="套内面积")
- start_time = fields.Date(string="开始时间")
-
+ start_time = fields.Date(string="生效时间")
+ end_date = fields.Date(string="失效日期")
manage_standard = fields.Char(string="物业管理费标准")
title_address = fields.Char(string="产权地址")
rental_address = fields.Char(string="出租地址")
+ ame = fields.Char(string='标题')
+ decoration_type = fields.Selection([('blank', '毛坯'), ('hardcover', '精装'), ('brands', '简装'), ('rsz', '豪装')],
+ string="装修类型")
+ water_meter_ids = fields.One2many('yuthon.property.water', 'yuthon_property_id', string='水表列表')
+ energy_meter_ids = fields.One2many('yuthon.property.energy', 'yuthon_property_id', string='电表列表')
+ title_information_ids = fields.One2many('title.information.line', 'yuthon_property_id', string='关联产权信息明细行')
+ manage_information_ids = fields.One2many('manage.information.line', 'yuthon_property_id', string='关联管理信息明细行')
+ disassembly_information_ids = fields.One2many('disassembly.information.line', 'yuthon_property_id', string='关联拆合信息明细行')
+ @api.onchange('building_area')
+ def _onchange_building_area(self):
+ for rec in self:
+ rec.management_area = rec.building_area
+ rec.rentable_area = rec.building_area
+
+ #待评估物业相关信息
+ unit_price = fields.Float(string='单价')
+ current_status = fields.Date(string='现状(合同到期日)')
+ registered_use = fields.Char(string='证载用途')
+ rental_conditions = fields.Text(string='出租条件')
+ district_manager = fields.Char(string='片区负责人')
+ remarks = fields.Text(string='备注')
+ evaluation_asset = fields.Char(string='评估资产')
+ evaluation_area = fields.Float(string='评估面积(m²)')
+ evaluation_category = fields.Char(string='评估类别')
+ last_hand_rent_price = fields.Float(string='上一手历史租金单价(元/m²•月)')
+ gov_rent_price = fields.Float(string='政府租金参考价')
+ evaluation_rent_price = fields.Float(string='评估散租单价(元/m²•月)')
+ evaluation_rent_total = fields.Float(string='评估总价(元•月,散租)')
+ evaluation_whole_rent_price = fields.Float(string='评估整租单价(元/m² •月)')
+ evaluation_whole_rent_total = fields.Float(string='评估总价(元•月,整租)')
+
+ assessment_category = fields.Char(string='评估类别')
+ property_message_id = fields.Many2one('property.evaluate.application', string='关联物业评估申请')
+ # yuthon_property_evaluated_id = fields.Many2one('yuthon.property.evaluated', string='关联评估备案表')
+
def put_change_title(self):
pass
def put_change_manage(self):
pass
+ def put_property_handover(self):
+ property_ids = self.env["yuthon.property"].browse(self._context.get('active_ids', self._context.get('active_id')))
+ form_id = self.env.ref('yuthon_property_approval.view_property_handover_form').id
+ property_list = []
+ for record in property_ids:
+ property_list.append([0, 0, {'property_id': record.id}])
+ for i in property_ids:
+ i.write({'state': 'ing_handover'})
+ return {
+ 'name': '提交物业移交',
+ 'view_mode': 'form',
+ 'res_model': 'property.handover',
+ 'type': 'ir.actions.act_window',
+ 'views': [(form_id, 'form')],
+ "context": {
+ 'default_property_handover_ids':property_list
+ }
+ }
+ def put_assessment_approval(self):
+ property_ids = self.env["yuthon.property"].browse(
+ self._context.get('active_ids', self._context.get('active_id')))
+ if not property_ids:
+ if self.state != 'to':
+ raise UserError("当前状态不允许提交")
+ else:
+ for i in property_ids:
+ if i.state != 'to':
+ raise UserError("当前状态不允许提交")
+ form_id = self.env.ref('yuthon_property_approval.property_evaluate_application_form').id
+ if not property_ids:
+ property_ids = self
+ for i in property_ids:
+ i.write({'state': 'ing'})
+ return {
+ 'name': '提交物业评估',
+ 'view_mode': 'form',
+ 'res_model': 'property.evaluate.application',
+ 'type': 'ir.actions.act_window',
+ 'views': [(form_id, 'form')],
+ "context": {
+ 'default_yuthon_property_ids': [(6, 0, property_ids.ids)]
+ }
+ }
+
class YuthonPropertyWater(models.Model):
_name = 'yuthon.property.water'
@@ -122,3 +188,43 @@ class YuthonPropertyEnergy(models.Model):
def _onchange_water_meter_ids(self):
for rec in self:
rec.property_meter_archives_id.write({'yuthon_property_id': rec.property_meter_archives_id.id})
+
+
+
+class TitleInformationLine(models.Model):
+ _name = 'title.information.line'
+ _description = '产权信息明细行'
+
+ yuthon_property_id = fields.Many2one('yuthon.property', string="关联物业信息")
+ address = fields.Char(string="地址")
+ equity_area = fields.Float(string="产权面积")
+ management_area = fields.Float(string="管理面积")
+ building_area = fields.Float(string="建筑面积")
+ rent_area = fields.Float(string="可租面积")
+ owner = fields.Char(string="权属人")
+ title_certificate = fields.Char(string="产权证号")
+ start_time = fields.Date(string="生效日期")
+ end_date = fields.Date(string="失效日期")
+
+class ManageInformationLine(models.Model):
+ _name = 'manage.information.line'
+ _description = '管理信息明细行'
+
+ yuthon_property_id = fields.Many2one('yuthon.property', string="关联物业信息")
+ purpose_id = fields.Many2one('yuthon.resource.purpose', string="资产用途")
+ precinct = fields.Char(string="片区")
+ admin_id = fields.Many2one('res.users', string="管理员")
+ company_page = fields.Selection([('tz', '天河投资'), ('wg', '天河物管'), ('lc', '天河粮储'), ('tj', '天河投建')],
+ string="所属公司")
+ start_time = fields.Date(string="生效日期")
+ end_date = fields.Date(string="失效日期")
+
+class DisassemblyInformationLine(models.Model):
+ _name = 'disassembly.information.line'
+ _description = '拆合信息明细行'
+
+ yuthon_property_id = fields.Many2one('yuthon.property', string="关联物业信息")
+ property_name = fields.Char(string="物业名称") #逻辑没搞清,暂时先放这里
+ rent_area = fields.Float(string="可租面积")
+ start_time = fields.Date(string="生效日期")
+ end_date = fields.Date(string="失效日期")
\ No newline at end of file
diff --git a/yuthon_property/models/yuthon_property_evaluated.py b/yuthon_property/models/yuthon_property_evaluated.py
index 501037ecc..1f304a91e 100644
--- a/yuthon_property/models/yuthon_property_evaluated.py
+++ b/yuthon_property/models/yuthon_property_evaluated.py
@@ -4,3 +4,12 @@ from odoo import models, fields, api
class YuthonPropertyEvaluated(models.Model):
_name = 'yuthon.property.evaluated'
_description = '评估项目备案表(已评估)'
+
+ name = fields.Char(string='标题')
+ other_company_id = fields.Many2one('res.company', string="评估单位")
+ evaluation_code = fields.Char(string="评估编号")
+ evaluation_way = fields.Char(string='评估方法')
+ base_date = fields.Date(string="基准日")
+ expert_review_time = fields.Date(string="专家评审时间")
+ notice_documents_ids = fields.Many2many('ir.attachment', string='议题附件')
+ # yuthon_property_evaluation_ids = fields.One2many('yuthon.', 'yuthon_property_evaluated_id', string='物业信息明细行')
\ No newline at end of file
diff --git a/yuthon_property/models/yuthon_property_evaluation.py b/yuthon_property/models/yuthon_property_evaluation.py
index 5fd733703..ac6444214 100644
--- a/yuthon_property/models/yuthon_property_evaluation.py
+++ b/yuthon_property/models/yuthon_property_evaluation.py
@@ -5,53 +5,7 @@ from odoo.exceptions import UserError, ValidationError
class YuthonPropertyEvaluation(models.Model):
_name = 'yuthon.property.evaluation'
- _inherit = ['mail.thread', 'mail.activity.mixin']
- _description = '物业评估'
- owner = fields.Char(string='权属人')
- property_address = fields.Char(string='物业地址')
- property_area = fields.Float(string='产权面积')
- rentable_area = fields.Float(string='可租面积')
- unit_price = fields.Float(string='单价')
- current_status = fields.Date(string='现状(合同到期日)')
- registered_use = fields.Char(string='证载用途')
- rental_use = fields.Char(string='出租用途')
- rental_conditions = fields.Text(string='出租条件')
- district_manager = fields.Char(string='片区负责人')
- company = fields.Char(string='所属公司')
- remarks = fields.Text(string='备注')
- state = fields.Selection([('done','已评估'), ('draft','待评估'), ('ing','评估中')],string='评估状态',default='draft')
+ name = fields.Char(string='评估单号')
- sequence = fields.Integer(string='序号', default=10)
- evaluation_asset = fields.Char(string='评估资产')
- evaluation_area = fields.Float(string='评估面积(m²)')
- evaluation_category = fields.Char(string='评估类别')
- set_purpose = fields.Char(string='设定用途')
- last_hand_rent_price = fields.Float(string='上一手历史租金单价(元/m²•月)')
- gov_rent_price = fields.Float(string='政府租金参考价')
- evaluation_rent_price = fields.Float(string='评估散租单价(元/m²•月)')
- evaluation_rent_total = fields.Float(string='评估总价(元•月,散租)')
- evaluation_whole_rent_price = fields.Float(string='评估整租单价(元/m² •月)')
- evaluation_whole_rent_total = fields.Float(string='评估总价(元•月,整租)')
-
- assessment_category = fields.Char(string='评估类别')
- property_message_id = fields.Many2one('property.evaluate.application', string='关联物业评估申请')
-
- def all_issue_pull(self):
- issue_active_ids = self.env["yuthon.property.evaluation"].browse(self._context.get('active_ids', self._context.get('active_id')))
- if self.state != 'draft':
- raise UserError("当前状态不允许提交")
- form_id = self.env.ref("yuthon_property.property_evaluate_application_form").id
- if not issue_active_ids:
- issue_active_ids = self
- for record in issue_active_ids:
- record.write({"state": "ing"})
- return {
- 'name': '提交评估',
- 'type': 'ir.actions.act_window',
- 'res_model': 'property.evaluate.application',
- 'views': [(form_id, 'form')],
- 'context':{'default_property_message_ids':[(6, 0,issue_active_ids.ids)]},
-
- }
diff --git a/yuthon_property/models/yuthon_property_lessee.py b/yuthon_property/models/yuthon_property_lessee.py
new file mode 100644
index 000000000..162d8c0f1
--- /dev/null
+++ b/yuthon_property/models/yuthon_property_lessee.py
@@ -0,0 +1,15 @@
+from odoo import models, fields, api
+
+
+class YuthonPropertyLessee(models.Model):
+ _name = 'yuthon.property.lessee'
+ _description = '承租方列表'
+
+ name = fields.Char(string='标题')
+ customer_name = fields.Char(string='承租方名称')
+ entity_type = fields.Selection([('person', '个人'), ('company', '企业')], string='实体类型')
+ phone = fields.Char(string='联系人')
+ phone_number = fields.Char(string='联系电话')
+ industry = fields.Char(string='行业')
+ invoicing_type = fields.Char(string='开票类型')
+
diff --git a/yuthon_property/models/yuthon_resource_mgmt_config.py b/yuthon_property/models/yuthon_resource_mgmt_config.py
index 8995c7a26..87cea83d1 100644
--- a/yuthon_property/models/yuthon_resource_mgmt_config.py
+++ b/yuthon_property/models/yuthon_resource_mgmt_config.py
@@ -35,3 +35,11 @@ class YuthonResourceBillingType(models.Model):
_description = '开票类型'
name = fields.Char(string="开票类型")
+
+
+class YuthonPropertySource(models.Model):
+ _name = 'yuthon.property.source'
+ _description = '资产来源'
+
+ name = fields.Char(string="资产来源")
+
diff --git a/yuthon_property/security/ir.model.access.csv b/yuthon_property/security/ir.model.access.csv
index 8c1219596..70f19eff9 100644
--- a/yuthon_property/security/ir.model.access.csv
+++ b/yuthon_property/security/ir.model.access.csv
@@ -1,6 +1,5 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_yuthon_property,yuthon_property,model_yuthon_property,base.group_user,1,1,1,1
-access_property_type,property_type,model_property_type,base.group_user,1,1,1,1
access_property_patrol_duty,property_patrol_duty,model_property_patrol_duty,base.group_user,1,1,1,1
access_property_patrol_plan,property_patrol_plan,model_property_patrol_plan,base.group_user,1,1,1,1
access_property_route_management,property_route_management,model_property_route_management,base.group_user,1,1,1,1
@@ -15,11 +14,14 @@ access_yuthon_resource_house_type,yuthon_resource_house_type,model_yuthon_resour
access_yuthon_resource_purpose,yuthon_resource_purpose,model_yuthon_resource_purpose,base.group_user,1,1,1,1
access_yuthon_resource_management_type,yuthon_resource_management_type,model_yuthon_resource_management_type,base.group_user,1,1,1,1
access_yuthon_resource_billing_type,yuthon_resource_billing_type,model_yuthon_resource_billing_type,base.group_user,1,1,1,1
-access_property_evaluate_application,property_evaluate_application,model_property_evaluate_application,base.group_user,1,1,1,1
access_property_rental_form,property_rental_form,model_property_rental_form,base.group_user,1,1,1,1
access_property_transaction_confirmed,property_transaction_confirmed,model_property_transaction_confirmed,base.group_user,1,1,1,1
-access_yuthon_property_evaluation,yuthon_property_evaluation,model_yuthon_property_evaluation,base.group_user,1,1,1,1
access_property_meter_archives,property_meter_archives,model_property_meter_archives,base.group_user,1,1,1,1
access_property_meter_water,property_meter_water,model_property_meter_water,base.group_user,1,1,1,1
-
-
+access_yuthon_property_evaluated,yuthon_property_evaluated,model_yuthon_property_evaluated,base.group_user,1,1,1,1
+access_yuthon_property_lessee,yuthon_property_lessee,model_yuthon_property_lessee,base.group_user,1,1,1,1
+access_property_prospective_customers,property_prospective_customers,model_property_prospective_customers,base.group_user,1,1,1,1
+access_title_information_line,title_information_line,model_title_information_line,base.group_user,1,1,1,1
+access_manage_information_line,manage_information_line,model_manage_information_line,base.group_user,1,1,1,1
+access_disassembly_information_line,disassembly_information_line,model_disassembly_information_line,base.group_user,1,1,1,1
+access_yuthon_property_source,yuthon_property_source,model_yuthon_property_source,base.group_user,1,1,1,1
\ No newline at end of file
diff --git a/yuthon_property/static/others/user_template.xlsx b/yuthon_property/static/others/user_template.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..31abb9116cea0b86fb978cc2f6c4788cbc30c056
GIT binary patch
literal 20102
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
literal 0
HcmV?d00001
diff --git a/yuthon_property/views/menuitem.xml b/yuthon_property/views/menuitem.xml
index 3368b16ee..8a53c399e 100644
--- a/yuthon_property/views/menuitem.xml
+++ b/yuthon_property/views/menuitem.xml
@@ -21,19 +21,14 @@
sequence="1"
name="待评估"
parent="yuthon_property_menu"
- action="yuthon_property_evaluation_action1"/>
-
+ action="yuthon_on_property_action"/>
+ action="action_yuthon_property_evaluated"/>
+ action="action_property_prospective_customers"/>
+ action="action_yuthon_property_lessee"/>
+ sequence="50"/>
@@ -293,7 +288,8 @@
action="yuthon_resource_management_type_action" sequence="10"/>
-
+
+ optional="{'preview_image': 'image_128'}"/>
@@ -65,29 +48,29 @@
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -102,21 +85,60 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
@@ -134,12 +156,6 @@
-
-
-
-
-
-
@@ -153,7 +169,7 @@
-
+
@@ -166,8 +182,6 @@
-
-
@@ -194,20 +208,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -222,36 +223,74 @@
kanban,tree,form
-
-
- yuthon.property.water.tree
- yuthon.property.water
+
+
+ yuthon_property_tree2
+ yuthon.property
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
- yuthon.property.energy.tree
- yuthon.property.energy
+
+ yuthon_property_form2
+ yuthon.property
-
-
-
-
-
-
-
-
+
-
+
+ 待评估物业
+ ir.actions.act_window
+ yuthon.property
+ tree,form
+ [('state','=','to')]
+
+
\ No newline at end of file
diff --git a/yuthon_property/views/yuthon_resource_mgmt_config_views.xml b/yuthon_property/views/yuthon_resource_mgmt_config_views.xml
index f43f3a8bc..9343d2cb6 100644
--- a/yuthon_property/views/yuthon_resource_mgmt_config_views.xml
+++ b/yuthon_property/views/yuthon_resource_mgmt_config_views.xml
@@ -76,4 +76,19 @@
tree
+
+ yuthon.property.source.tree
+ yuthon.property.source
+
+
+
+
+
+
+
+ 物业来源
+ yuthon.property.source
+ tree
+
+
diff --git a/yuthon_property_approval/__init__.py b/yuthon_property_approval/__init__.py
index 9a7e03ede..c536983e2 100644
--- a/yuthon_property_approval/__init__.py
+++ b/yuthon_property_approval/__init__.py
@@ -1 +1,2 @@
-from . import models
\ No newline at end of file
+from . import models
+from . import wizard
\ No newline at end of file
diff --git a/yuthon_property_approval/__manifest__.py b/yuthon_property_approval/__manifest__.py
index 1ab94b39b..803b184df 100644
--- a/yuthon_property_approval/__manifest__.py
+++ b/yuthon_property_approval/__manifest__.py
@@ -11,6 +11,7 @@
'data/sale_renting_code_data.xml',
'security/ir.model.access.csv',
'views/property_billing_confirmation.xml',
+ 'views/property_approval_views.xml',
'views/property_business_confirm.xml',
'views/property_capacity.xml',
'views/property_collection_confirm.xml',
@@ -37,11 +38,12 @@
'views/property_construction_work.xml',
'views/property_confirm_views.xml',
'views/property_move_views.xml',
- 'views/property_assess_views.xml',
'views/property_contract_changes.xml',
'views/property_record_views.xml',
'views/property_equity_views.xml',
- 'views/property_approval_views.xml',
+ 'views/property_handover_views.xml',
+ 'views/property_evaluate_application_views.xml',
+ 'wizard/property_inducts_wizard.xml',
'views/property_menu_all.xml',
],
'demo': [],
diff --git a/yuthon_property_approval/data/sale_renting_code_data.xml b/yuthon_property_approval/data/sale_renting_code_data.xml
index 237791dca..7d36a54b5 100644
--- a/yuthon_property_approval/data/sale_renting_code_data.xml
+++ b/yuthon_property_approval/data/sale_renting_code_data.xml
@@ -189,6 +189,13 @@
3
+
+ 物业移交审批编号
+ property_handover_code
+ XZ%(y)s%(month)s%(day)s
+ 3
+
+
物业合同变更编号
property_contract_changes_code
diff --git a/yuthon_property_approval/models/__init__.py b/yuthon_property_approval/models/__init__.py
index 6435588fb..1ab8a69d7 100644
--- a/yuthon_property_approval/models/__init__.py
+++ b/yuthon_property_approval/models/__init__.py
@@ -1,6 +1,5 @@
from . import property_billing_confirmation
from . import property_business_confirm
-from . import property_approval
from . import property_capacity
from . import property_collection_confirm
from . import property_early_quitting
@@ -24,9 +23,11 @@ from . import property_open_rent
from . import property_confirm
from . import property_move
from . import property_equity
-from . import property_assess
from . import property_renamed
from . import property_record
from . import property_lessee_change
from . import property_contract_changes
-from . import property_construction_work
\ No newline at end of file
+from . import property_construction_work
+from . import property_evaluate_application
+from . import property_approval
+from . import property_handover
\ No newline at end of file
diff --git a/yuthon_property_approval/models/property_approval.py b/yuthon_property_approval/models/property_approval.py
index 5348150fe..a01b88488 100644
--- a/yuthon_property_approval/models/property_approval.py
+++ b/yuthon_property_approval/models/property_approval.py
@@ -1,35 +1,41 @@
- # -*- coding: utf-8 -*-
- # Part of Odoo. See LICENSE file for full copyright and licensing details.
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models, fields, api, exceptions, _
class PropertyApproval(models.Model):
- _name = 'property.approval'
- _inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
- _description = '新增物业审批'
+ _name = 'property.approval'
+ _inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
+ _description = '新增物业审批'
- name = fields.Char(string='标题')
- tip_description = fields.Html('正文')
- code = fields.Char(string="编号", default=lambda self: self.env['ir.sequence'].next_by_code('property_approval_code'))
- property_documents_ids = fields.Many2many('documents.document', string="附件")
- source = fields.Char(string="来源")
-
- property_massage_ids = fields.One2many('property.approval.line', 'property_approval_id', string="审批信息")
+ name = fields.Char(string='标题')
+ tip_description = fields.Html('正文')
+ code = fields.Char(string="编号",
+ default=lambda self: self.env['ir.sequence'].next_by_code('property_approval_code'))
+ property_documents_ids = fields.Many2many('documents.document', string="附件")
+ source = fields.Many2one('yuthon.property.source', string="物业来源")
+ property_massage_ids = fields.One2many('property.approval.line', 'property_approval_id', string="审批信息")
+ def put_message_in(self): # 导入按钮
+ return {
+ "type": "ir.actions.act_window",
+ "name": "批量更新物业信息",
+ "res_model": "property.inducts.wizard",
+ "view_mode": "form",
+ "target": "new",
+ }
class PropertyApprovalLine(models.Model):
- _name = 'property.approval.line'
- _description = '新增物业审批信息'
-
- property_approval_id = fields.Many2one('property.approval', string="审批信息")
- property_address = fields.Char(string="物业地址")
- is_affirmation = fields.Boolean(string="是否确权")
- owner = fields.Char(string="权属人")
- title_number = fields.Char(string="产权编号")
- area = fields.Float(string="面积")
- purposes = fields.Char(string="用途")
- state = fields.Selection([('rental','出租中'), ('vacant', '空置中'), ('rented', '待出租')], string="状态")
-
-
+ _name = 'property.approval.line'
+ _description = '新增物业审批明细行'
+ property_approval_id = fields.Many2one('property.approval', string="审批信息")
+ property_address = fields.Char(string="物业地址")
+ is_affirmation = fields.Boolean(string="是否确权")
+ owner = fields.Char(string="权属人")
+ title_number = fields.Char(string="产权编号")
+ area = fields.Float(string="面积")
+ purposes = fields.Char(string="用途")
+ state = fields.Selection([('rental', '出租中'), ('vacant', '空置中'), ('rented', '待出租')], string="状态",
+ default="rented")
diff --git a/yuthon_property_approval/models/property_assess.py b/yuthon_property_approval/models/property_assess.py
deleted file mode 100644
index 6e8ea2ed8..000000000
--- a/yuthon_property_approval/models/property_assess.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# -*- coding: utf-8 -*-
-# Part of Odoo. See LICENSE file for full copyright and licensing details.
-
-from odoo import models, fields, api, exceptions, _
-
-
-class PropertyAssess(models.Model):
- _name = 'property.assess'
- _description = '物业评估审批'
- _inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
- _rec_name = 'name'
-
- name = fields.Char(string='标题')
- code = fields.Char(string="编号", default=lambda self: self.env['ir.sequence'].next_by_code('property_assess_code'))
- property_documents_ids = fields.Many2many('documents.document', string="评估文件")
- property_assess_line_ids = fields.One2many('property.assess.line', 'property_assess_id', string="评估文件")
-
-
-class PropertyAssessLine(models.Model):
- _name = 'property.assess.line'
-
- property_assess_id = fields.Many2one('property.assess', string='关联审批')
- product_id = fields.Many2one('product.product', string="待评估物业")
- partner_id = fields.Many2one('res.partner', string="评估公司")
- assess_type = fields.Selection([('rent_money', '租金'), ('value', '价值')], string="评估类别")
-
-
-
-
-
-
-
diff --git a/yuthon_property_approval/models/property_evaluate_application.py b/yuthon_property_approval/models/property_evaluate_application.py
new file mode 100644
index 000000000..31bf9691d
--- /dev/null
+++ b/yuthon_property_approval/models/property_evaluate_application.py
@@ -0,0 +1,29 @@
+from odoo import models, fields, api
+
+
+class PropertyEvaluateApplication(models.Model):
+ _name = 'property.evaluate.application'
+ _description = '物业评估申请'
+ _inherit = ['soong.workflow.mixin']
+
+
+ name = fields.Char(string='标题')
+ code = fields.Char(string='编号', required=True, copy=False,
+ default=lambda self: self.env['ir.sequence'].next_by_code('yuthon_property_code'))
+ main_text = fields.Html(string='正文')
+ is_meet = fields.Boolean(string="是否上会")
+ is_experts = fields.Boolean(string="是否需要专家评审")
+ notice_documents_ids = fields.Many2many('ir.attachment', string='议题附件')
+ issue_library_id = fields.Many2one('issue.library', string='关联议题')
+ yuthon_property_ids = fields.One2many('yuthon.property', 'property_message_id', string='物业信息明细行')
+
+ # def put(self):
+ # done_ids = self.env["property.evaluate.application"].browse(self._context.get('active_ids', self._context.get('active_id')))
+ # form_id = self.env.ref('yuthon_property_approval.view_property_handover_form').id
+ # return {
+ # 'name': '已评估',
+ # 'type': 'ir.actions.act_window',
+ # 'res_model': 'property.evaluate.application',
+ # 'view_mode': 'form',
+ # 'views': [(form_id, 'form')],
+
diff --git a/yuthon_property_approval/models/property_handover.py b/yuthon_property_approval/models/property_handover.py
new file mode 100644
index 000000000..07cb9f36b
--- /dev/null
+++ b/yuthon_property_approval/models/property_handover.py
@@ -0,0 +1,30 @@
+from odoo import models, fields, api, exceptions
+
+
+class PropertyHandover(models.Model):
+ _name = 'property.handover'
+ _description = '移交申请'
+ _inherit = ['soong.workflow.mixin']
+
+ name = fields.Char(string='标题')
+ tip_description = fields.Html('正文')
+ code = fields.Char(string="编号",
+ default=lambda self: self.env['ir.sequence'].next_by_code('property_handover_code'))
+ property_documents_ids = fields.Many2many('documents.document', string="附件")
+ source = fields.Char(string="移交单位")
+ property_handover_ids = fields.One2many('property.handover.line','property_handover_id',string="移交申请")
+
+class PropertyHandoverLine(models.Model):
+ _name = 'property.handover.line'
+ _description = '移交申请明细'
+
+ property_handover_id = fields.Many2one('property.handover', string="审批信息")
+ property_id = fields.Many2one('yuthon.property', string="关联物业信息")
+ property_address = fields.Char(related='property_id.property_room',string="物业地址")
+ is_affirmation = fields.Boolean(related='property_id.is_confirm_authorization',string="是否确权")
+ owner = fields.Many2one(related='property_id.owner_id',string="权属人")
+ title_number = fields.Char(string="产权编号")
+ area = fields.Float(related='property_id.actual_area',string="面积")
+ purposes = fields.Many2one(related='property_id.asset_type_id',string="用途")
+ state = fields.Selection(related='property_id.state', string="状态",
+ default="rented")
\ No newline at end of file
diff --git a/yuthon_property_approval/security/ir.model.access.csv b/yuthon_property_approval/security/ir.model.access.csv
index d3d4fb3d4..0321f4e0a 100644
--- a/yuthon_property_approval/security/ir.model.access.csv
+++ b/yuthon_property_approval/security/ir.model.access.csv
@@ -23,12 +23,8 @@ access_property_utility_bills,property_utility_bills,model_property_utility_bill
access_property_open_rent,property_open_rent,model_property_open_rent,base.group_user,1,1,1,1
access_property_confirm,property_confirm,model_property_confirm,base.group_user,1,1,1,1
access_property_move,property_move,model_property_move,base.group_user,1,1,1,1
-access_property_assess,property_assess,model_property_assess,base.group_user,1,1,1,1
-access_property_assess_line,property_assess_line,model_property_assess_line,base.group_user,1,1,1,1
access_property_record,property_record,model_property_record,base.group_user,1,1,1,1
-access_property_approval,property_approval,model_property_approval,base.group_user,1,1,1,1
access_property_equity,property_equity,model_property_equity,base.group_user,1,1,1,1
-access_property_approval_line,property_approval_line,model_property_approval_line,base.group_user,1,1,1,1
access_property_information_detail_lines,property_information_detail_lines,model_property_information_detail_lines,base.group_user,1,1,1,1
access_property_lease_contract_line,property_lease_contract_line,model_property_lease_contract_line,base.group_user,1,1,1,1
access_property_rent_breakdown_line,property_rent_breakdown_line,model_property_rent_breakdown_line,base.group_user,1,1,1,1
@@ -40,4 +36,10 @@ access_property_penalty_relief_line,property_penalty_relief_line,model_property_
access_property_repair_relief_line,property_repair_relief_line,model_property_repair_relief_line,base.group_user,1,1,1,1
access_property_contract_changes,property_contract_changes,model_property_contract_changes,base.group_user,1,1,1,1
access_property_construction_work,property_construction_work,model_property_construction_work,base.group_user,1,1,1,1
-access_property_eligibility_line,property_eligibility_line,model_property_eligibility_line,base.group_user,1,1,1,1
\ No newline at end of file
+access_property_eligibility_line,property_eligibility_line,model_property_eligibility_line,base.group_user,1,1,1,1
+access_property_evaluate_application,property_evaluate_application,model_property_evaluate_application,base.group_user,1,1,1,1
+access_property_approval,property_approval,model_property_approval,base.group_user,1,1,1,1
+access_property_approval_line,property_approval_line,model_property_approval_line,base.group_user,1,1,1,1
+access_property_handover,property_handover,model_property_handover,base.group_user,1,1,1,1
+access_property_handover_line,property_handover_line,model_property_handover_line,base.group_user,1,1,1,1
+access_property_inducts_wizard,property_inducts_wizard,model_property_inducts_wizard,base.group_user,1,1,1,1
\ No newline at end of file
diff --git a/yuthon_property_approval/views/property_approval_views.xml b/yuthon_property_approval/views/property_approval_views.xml
index 3114fcce7..608429a10 100644
--- a/yuthon_property_approval/views/property_approval_views.xml
+++ b/yuthon_property_approval/views/property_approval_views.xml
@@ -26,36 +26,40 @@
-
+
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
新增物业审批
property.approval
tree,form
diff --git a/yuthon_property/views/property_evaluate_application_views.xml b/yuthon_property_approval/views/property_evaluate_application_views.xml
similarity index 80%
rename from yuthon_property/views/property_evaluate_application_views.xml
rename to yuthon_property_approval/views/property_evaluate_application_views.xml
index 984ddc6eb..6f7366b43 100644
--- a/yuthon_property/views/property_evaluate_application_views.xml
+++ b/yuthon_property_approval/views/property_evaluate_application_views.xml
@@ -7,7 +7,6 @@
-
@@ -18,15 +17,18 @@
diff --git a/yuthon_property_approval/views/property_handover_views.xml b/yuthon_property_approval/views/property_handover_views.xml
new file mode 100644
index 000000000..685552884
--- /dev/null
+++ b/yuthon_property_approval/views/property_handover_views.xml
@@ -0,0 +1,65 @@
+
+
+
+ property.handover.tree
+ property.handover
+
+
+
+
+
+
+
+
+
+
+ property.handover.form
+ property.handover
+
+
+
+
+
+ 移交审批
+ property.handover
+ tree,form
+
+
diff --git a/yuthon_property_approval/views/property_menu_all.xml b/yuthon_property_approval/views/property_menu_all.xml
index 2a1240a48..6f2b1b520 100644
--- a/yuthon_property_approval/views/property_menu_all.xml
+++ b/yuthon_property_approval/views/property_menu_all.xml
@@ -2,177 +2,184 @@
+ id="property_approval_menu"
+ parent="yuthon_property.resource_management_menu"
+ name="新增物业审批"
+ action="property_approval_action"
+ sequence="3"/>
+ id="property_billing_confirmation_menu"
+ parent="yuthon_property.property_approval_menu"
+ name="账单确认单审批"
+ action="property_billing_confirmation_action"
+ sequence="20"/>
+ id="property_business_confirm_menu"
+ parent="yuthon_property.property_approval_menu"
+ name="经营报表确认单审批"
+ action="property_business_confirm_action"
+ sequence="21"/>
+ id="property_capacity_menu"
+ parent="yuthon_property.property_approval_menu"
+ name="增容审批"
+ action="property_capacity_action"
+ sequence="22"/>
+ id="property_early_quitting_menu"
+ parent="yuthon_property.property_approval_menu"
+ name="提前退租审批"
+ action="property_early_quitting_action"
+ sequence="24"/>
+ id="property_fitment_menu"
+ parent="yuthon_property.property_approval_menu"
+ name="装修审批"
+ action="property_fitment_action"
+ sequence="26"/>
+ id="property_inventory_table_menu"
+ parent="yuthon_property.property_approval_menu"
+ name="盘点表审批"
+ action="property_inventory_table_action"
+ sequence="27"/>
+ id="property_information_menu"
+ parent="yuthon_property.property_approval_menu"
+ name="物业信息审批"
+ action="property_information_action"
+ sequence="28"/>
+ id="property_lease_alter_menu"
+ parent="yuthon_property.property_approval_menu"
+ name="续租审批审批"
+ action="property_lease_alter_action"
+ sequence="29"/>
+ id="property_lease_contract_menu"
+ parent="yuthon_property.property_approval_menu"
+ name="租赁合同审批"
+ action="property_lease_contract_action"
+ sequence="30"/>
+ id="property_lease_extension_menu"
+ parent="yuthon_property.property_approval_menu"
+ name="延租审批"
+ action="property_lease_extension_action"
+ sequence="31"/>
+ id="property_lease_renewal_menu"
+ parent="yuthon_property.property_approval_menu"
+ name="租赁合同变更审批"
+ action="property_lease_renewal_action"
+ sequence="32"/>
+ id="property_management_menu"
+ parent="yuthon_property.property_approval_menu"
+ name="物业管理变更申请表"
+ action="property_management_action"
+ sequence="33"/>
+ id="property_management_fee_menu"
+ parent="yuthon_property.property_approval_menu"
+ name="管理费审批"
+ action="property_management_fee_action"
+ sequence="34"/>
+ id="property_material_procurement_menu"
+ parent="yuthon_property.property_approval_menu"
+ name="物资配件采购单审批"
+ action="property_material_procurement_action"
+ sequence="35"/>
+ id="property_penalty_proportion_menu"
+ parent="yuthon_property.property_approval_menu"
+ name="违约金比例审批"
+ action="property_penalty_proportion_action"
+ sequence="36"/>
+ id="property_penalty_relief_menu"
+ parent="yuthon_property.property_approval_menu"
+ name="违约金减免审批"
+ action="property_penalty_relief_action"
+ sequence="37"/>
+ id="property_rent_relief_menu"
+ parent="yuthon_property.property_approval_menu"
+ name="租金减免审批"
+ action="property_rent_relief_action"
+ sequence="38"/>
+ id="property_report_repair_menu"
+ parent="yuthon_property.property_approval_menu"
+ name="报事报修审批"
+ action="property_report_repair_action"
+ sequence="39"/>
+ id="property_utility_bills_menu"
+ parent="yuthon_property.property_approval_menu"
+ name="水电费审批"
+ action="property_utility_bills_action"
+ sequence="40"/>
+ id="property_equity_approval_menu"
+ parent="yuthon_property.property_approval_menu"
+ name="物业产权变更"
+ action="property_equity_action"
+ sequence="41"/>
-
-
-
-
-
-
+ id="property_renamed_approval_menu"
+ parent="yuthon_property.property_approval_menu"
+ name="更名申请表"
+ action="property_renamed_action"
+ sequence="42"/>
+
+
+
+
+
+
+ id="property_construction_work_menu"
+ parent="yuthon_property.property_approval_menu"
+ name="建设工程审批"
+ action="action_property_construction_work"
+ sequence="44"/>
+ id="property_handover_approval_menu"
+ parent="yuthon_property.resource_management_menu"
+ name="物业移交审批"
+ action="property_handover_action"
+ sequence="7"/>
+
+
-
-
+ parent="yuthon_property.yuthon_property_menu"
+ name="评估申请"
+ action="property_evaluate_application_action"
+ sequence="7"/>
-
+ sequence="9"/>
+
+
\ No newline at end of file
diff --git a/yuthon_property_approval/views/property_record_views.xml b/yuthon_property_approval/views/property_record_views.xml
index ebcee0e57..8af6e11cf 100644
--- a/yuthon_property_approval/views/property_record_views.xml
+++ b/yuthon_property_approval/views/property_record_views.xml
@@ -26,7 +26,7 @@
-
+
@@ -48,12 +48,12 @@
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/yuthon_property_approval/wizard/__init__.py b/yuthon_property_approval/wizard/__init__.py
new file mode 100644
index 000000000..fb0111b21
--- /dev/null
+++ b/yuthon_property_approval/wizard/__init__.py
@@ -0,0 +1 @@
+from . import property_inducts_wizard
\ No newline at end of file
diff --git a/yuthon_property_approval/wizard/property_inducts_wizard.py b/yuthon_property_approval/wizard/property_inducts_wizard.py
new file mode 100644
index 000000000..120bd3f69
--- /dev/null
+++ b/yuthon_property_approval/wizard/property_inducts_wizard.py
@@ -0,0 +1,35 @@
+from odoo import models, fields, api, _, SUPERUSER_ID
+from odoo.exceptions import ValidationError, UserError
+import xlrd
+import base64
+import datetime
+from datetime import datetime
+
+
+class PropertyInductsWizard(models.Model):
+ _name = 'property.inducts.wizard'
+
+ excel_file = fields.Binary(string="上传Excel表")
+ excel_name = fields.Char(string="文件名")
+
+ def confirm(self):
+ """
+ 导入excel文件,按行读取数据并处理
+ :return: 导入新增物业明细行并更新
+ """
+ if not self.excel_file:
+ raise ValidationError('请上传文件。')
+ book = xlrd.open_workbook(file_contents=base64.decodebytes(self.excel_file))
+ sh = book.sheet_by_index(0)
+ for rx in range(1, sh.nrows):
+ row = sh.row(rx)
+ self.employee_user_data(row)
+ return {
+ 'name': '批量更新新物业信息',
+ 'type': 'ir.actions.act_window',
+ 'view_mode': 'tree',
+ 'res_model': 'property.approval.line',
+ }
+
+ def employee_user_data(self, row):
+ pass
\ No newline at end of file
diff --git a/yuthon_property_approval/wizard/property_inducts_wizard.xml b/yuthon_property_approval/wizard/property_inducts_wizard.xml
new file mode 100644
index 000000000..83095c1a0
--- /dev/null
+++ b/yuthon_property_approval/wizard/property_inducts_wizard.xml
@@ -0,0 +1,35 @@
+
+
+
+ 物业信息模板下载
+ self
+ ...
+
+
+
+ 物业信息导入弹窗
+ property.inducts.wizard
+
+
+
+
+
\ No newline at end of file