From 8c01bfa458376725052e13c578299addb77635f2 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: Tue, 3 Mar 2026 18:00:27 +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 --- .../models/property_lease_renewal.py | 94 ++++++++++--------- .../models/property_management.py | 61 +++++++----- 2 files changed, 88 insertions(+), 67 deletions(-) diff --git a/yuthon_property_approval/models/property_lease_renewal.py b/yuthon_property_approval/models/property_lease_renewal.py index d7746e53d..572c5447b 100644 --- a/yuthon_property_approval/models/property_lease_renewal.py +++ b/yuthon_property_approval/models/property_lease_renewal.py @@ -5,6 +5,7 @@ from odoo import models, fields, api, exceptions, _ from datetime import datetime, timedelta, date from dateutil.relativedelta import relativedelta from odoo.exceptions import UserError +import calendar class PropertyLeaseRenewal(models.Model): @@ -44,7 +45,7 @@ class PropertyLeaseRenewal(models.Model): contact = fields.Char(string='联系人') phone = fields.Char(string='联系电话') card = fields.Char(string='身份证号') - effective_date = fields.Date(string='生效日期') + effective_date = fields.Date(string='生效日期', required=True) entity_type = fields.Selection([('person', '个人'), ('company', '企业')], string='承租方类型') reason = fields.Text(string='变更原因') fee = fields.Float(string='变更费用') @@ -84,50 +85,59 @@ class PropertyLeaseRenewal(models.Model): def end_approval(self): for rec in self: if rec.renewal_type == 'lease': - rec.hide = True origin_contract = rec.contract_id - original_lessee_id = origin_contract.lessee_id.id if origin_contract.lessee_id else False - version_str = origin_contract.version.lstrip('V') - main_version = version_str.split('.')[0] - new_main_version = int(main_version) + 1 - new_version = f"V{new_main_version}.0" - # 删除原承租方的物业合同信息 - contract_to_unlink = origin_contract.lessee_id.property_contract_ids.filtered( - lambda line: line.lease_contract_id.id == rec.contract_id.id - ) - if contract_to_unlink: - contract_to_unlink.unlink() - # 新增新承租方的物业合同信息 - property_contract_list = [] - origin_contract.write({ - 'version': new_version, - 'lessee_id': rec.new_lessee_id.id - }) - if original_lessee_id and origin_contract.id and rec.effective_date: - origin_contract.is_lessee = True - self.env['lessee.alteration.line'].create({ + contract_actual_end = origin_contract.actual_end_time if origin_contract else None + + effective_date = fields.Date.to_date(rec.effective_date) + last_day = calendar.monthrange(effective_date.year, effective_date.month)[1] + month_end_date = date(effective_date.year, effective_date.month, last_day) + + contract_actual_end_date = fields.Date.to_date(contract_actual_end) if contract_actual_end else None + if not contract_actual_end_date or contract_actual_end_date >= month_end_date: + rec.hide = True + origin_contract = rec.contract_id + original_lessee_id = origin_contract.lessee_id.id if origin_contract.lessee_id else False + version_str = origin_contract.version.lstrip('V') + main_version = version_str.split('.')[0] + new_main_version = int(main_version) + 1 + new_version = f"V{new_main_version}.0" + # 删除原承租方的物业合同信息 + contract_to_unlink = origin_contract.lessee_id.property_contract_ids.filtered( + lambda line: line.lease_contract_id.id == rec.contract_id.id + ) + if contract_to_unlink: + contract_to_unlink.unlink() + # 新增新承租方的物业合同信息 + property_contract_list = [] + if original_lessee_id and origin_contract.id and rec.effective_date and origin_contract.contact_state == 'ing': + origin_contract.write({ + 'version': new_version, + 'lessee_id': rec.new_lessee_id.id + }) + origin_contract.is_lessee = True + self.env['lessee.alteration.line'].create({ + 'contract_id': origin_contract.id, + 'lessee_id': original_lessee_id, + 'start_date': origin_contract.actual_start_time, + 'end_date': rec.effective_date - relativedelta(days=1), + }) + origin_contract._compute_contract_count() + property_contract_list.append([0, 0, { + 'tenant_id': rec.new_lessee_id.id, + 'lease_contract_id': rec.contract_id.id, + 'rent': rec.contract_id.rent, + }]) + rec.new_lessee_id.write({'property_contract_ids': property_contract_list}) + # 新增一条更名应收账单 + management_type_id = rec.env["yuthon.management.type"].search([('name', '=', '更名费')]) + if not management_type_id: + management_type_id = rec.env["yuthon.management.type"].create({'name': '更名费'}) + self.env['property.accounts.receivable'].create({ 'contract_id': origin_contract.id, - 'lessee_id': original_lessee_id, - 'start_date': origin_contract.actual_start_time, - 'end_date': rec.effective_date - relativedelta(days=1), + 'original_amount': rec.fee, + 'management_type_id': management_type_id.id, + 'due_date': rec.effective_date, }) - origin_contract._compute_contract_count() - property_contract_list.append([0, 0, { - 'tenant_id': rec.new_lessee_id.id, - 'lease_contract_id': rec.contract_id.id, - 'rent': rec.contract_id.rent, - }]) - rec.new_lessee_id.write({'property_contract_ids': property_contract_list}) - # 新增一条更名应收账单 - management_type_id = rec.env["yuthon.management.type"].search([('name', '=', '更名费')]) - if not management_type_id: - management_type_id = rec.env["yuthon.management.type"].create({'name': '更名费'}) - self.env['property.accounts.receivable'].create({ - 'contract_id': origin_contract.id, - 'original_amount': rec.fee, - 'management_type_id': management_type_id.id, - 'due_date': rec.effective_date, - }) else: rec.contract_id.write({ 'actual_end_time': rec.early_quitting_date diff --git a/yuthon_property_approval/models/property_management.py b/yuthon_property_approval/models/property_management.py index 6b5c423ce..8b6860cba 100644 --- a/yuthon_property_approval/models/property_management.py +++ b/yuthon_property_approval/models/property_management.py @@ -4,6 +4,8 @@ from odoo import models, fields, api, exceptions, _ from datetime import timedelta from dateutil.relativedelta import relativedelta +import calendar +from datetime import datetime, date class PropertyManagement(models.Model): @@ -93,34 +95,43 @@ class PropertyManagement(models.Model): lease_contract = self.env['property.lease.contract.line'].search( [('address_id', '=', manage_line.property_id.id), ('lease_id', '!=', False), - ('lease_id.contact_state', '=', 'ing'), ], limit=1) if lease_contract: - lease_contract_ids = lease_contract.lease_id - original_lessor_id = lease_contract_ids.lessor_id.id - version_str = lease_contract_ids.version.lstrip('V') - main_version = version_str.split('.')[0] - new_main_version = int(main_version) + 1 - new_version = f"V{new_main_version}.0" - record_id = self.env['property.lease.contract'].search( - [('contract_code', '=', lease_contract_ids.contract_code), - ('version', '=', new_version) - ]) - lease_contract_ids.lessor_id = record.company_id.id - lease_contract_ids.is_lessor = True - lease_contract_ids.version = new_version - lease_contract_ids.users_id = record.user_id - if record_id: + contract_actual_end = lease_contract.lease_id.actual_end_time + start_time = record.start_time + if not contract_actual_end or not start_time: continue - lease_contract_ids._compute_name() - lease_contract_ids._update_wkf_records() - if (original_lessor_id and lease_contract_ids.actual_start_time and record.start_time): - self.env['lessor.alteration.line'].create({ - 'contract_id': lease_contract_ids.id, - 'lessor_id': original_lessor_id, - 'start_date': lease_contract_ids.actual_start_time, - 'end_date': record.start_time - relativedelta(days=1) - }) + start_date = fields.Date.to_date(start_time) + last_day = calendar.monthrange(start_date.year, start_date.month)[1] + month_end_date = date(start_date.year, start_date.month, last_day) + + contract_actual_end_date = fields.Date.to_date(contract_actual_end) if contract_actual_end else None + if not contract_actual_end_date or contract_actual_end_date >= month_end_date: + lease_contract_ids = lease_contract.lease_id + original_lessor_id = lease_contract_ids.lessor_id.id + version_str = lease_contract_ids.version.lstrip('V') + main_version = version_str.split('.')[0] + new_main_version = int(main_version) + 1 + new_version = f"V{new_main_version}.0" + record_id = self.env['property.lease.contract'].search( + [('contract_code', '=', lease_contract_ids.contract_code), + ('version', '=', new_version) + ]) + lease_contract_ids.lessor_id = record.company_id.id + lease_contract_ids.is_lessor = True + lease_contract_ids.version = new_version + lease_contract_ids.users_id = record.user_id + if record_id: + continue + lease_contract_ids._compute_name() + lease_contract_ids._update_wkf_records() + if (original_lessor_id and lease_contract_ids.actual_start_time and record.start_time): + self.env['lessor.alteration.line'].create({ + 'contract_id': lease_contract_ids.id, + 'lessor_id': original_lessor_id, + 'start_date': lease_contract_ids.actual_start_time, + 'end_date': record.start_time - relativedelta(days=1) + }) existing_info = self.env['manage.information.line'].search([ ('yuthon_property_id', '=', target_property_id),