Merge pull request !5632 from 李鹏宇/dev
This commit is contained in:
李鹏宇
2025-10-13 09:10:09 +00:00
committed by Gitee
7 changed files with 107 additions and 111 deletions
@@ -3,7 +3,7 @@ from datetime import datetime
from odoo import models, fields, api
from odoo.exceptions import UserError, ValidationError
from dateutil.relativedelta import relativedelta
class PropertyMeterArchives(models.Model):
_name = "property.meter.archives"
@@ -13,6 +13,7 @@ class PropertyTariffList(models.Model):
original_amount = fields.Float(string='金额', compute='_compute_original_amount', store=True)
deduction_amount = fields.Float(string='减免金额')
remarks = fields.Text(string='备注')
meter_date = fields.Date(string='任务日期')
is_cancel = fields.Boolean(string='作废')
is_red = fields.Boolean(string='红冲')
dosage = fields.Float(string='用量')
@@ -12,6 +12,7 @@ class PropertyWaterList(models.Model):
fee_id = fields.Many2one('yuthon.water.setting', string="水费标准")
original_amount = fields.Float(string='金额', compute='_compute_original_amount', store=True)
deduction_amount = fields.Float(string='减免金额')
meter_date = fields.Date(string='任务日期')
remarks = fields.Text(string='备注')
name = fields.Char(string='仪表编号')
is_cancel = fields.Boolean(string='作废')
@@ -7,10 +7,8 @@
<tree string="电费列表" editable="bottom" edit="false" delete="false">
<field name="name"/>
<field name="lessee_id" options="{'no_create': True}"/>
<field name="tariff_meter_number" optional="hide"/>
<field name="due_date"/>
<field name="tariff_meter_reading" optional="hide"/>
<field name="fee_id" optional="hide" options="{'no_create': True}"/>
<field name="dosage"/>
<field name="unit"/>
<field name="original_amount"/>
@@ -7,10 +7,8 @@
<tree string="水费列表" editable="bottom" edit="false" delete="false">
<field name="name"/>
<field name="lessee_id" options="{'no_create': True}"/>
<field name="water_meter_number" optional="hide"/>
<field name="due_date"/>
<field name="water_meter_reading" optional="hide"/>
<field name="fee_id" optional="hide"/>
<field name="dosage"/>
<field name="unit"/>
<field name="original_amount"/>
@@ -10,22 +10,121 @@ import calendar
class PropertyMeterWater(models.Model):
_inherit = 'property.meter.water'
contract_id = fields.Many2one('property.lease.contract', string="合同")
contract_id = fields.Many2one('property.lease.contract', string="合同", compute='compute_contract_id')
@api.depends('yuthon_property_ids')
def compute_contract_id(self):
for record in self:
if record.yuthon_property_ids:
lease_contract = self.env['property.lease.contract.line'].search(
[('address_id', '=', record.yuthon_property_ids[0].id)], limit=1)
if lease_contract:
record.contract_id = lease_contract.lease_id.id
else:
record.contract_id = False
else:
record.contract_id = False
class PropertyMeterArchives(models.Model):
_inherit = 'property.meter.archives'
contract_id = fields.Many2one('property.lease.contract', string="合同")
contract_id = fields.Many2one('property.lease.contract', string="合同", compute='compute_contract_id')
@api.depends('yuthon_property_ids')
def compute_contract_id(self):
for record in self:
if record.yuthon_property_ids:
lease_contract = self.env['property.lease.contract.line'].search(
[('address_id', '=', record.yuthon_property_ids[0].id)], limit=1)
if lease_contract:
record.contract_id = lease_contract.lease_id.id
else:
record.contract_id = False
else:
record.contract_id = False
class MeterArchivesLine(models.Model):
_inherit = 'meter.archives.line'
contract_id = fields.Many2one('property.lease.contract', string="合同")
contract_id = fields.Many2one('property.lease.contract', string="合同", compute="compute_contract_id")
@api.depends('yuthon_property_ids')
def compute_contract_id(self):
for record in self:
if record.yuthon_property_ids:
lease_contract = self.env['property.lease.contract.line'].search([('address_id', '=', record.yuthon_property_ids[0].id)], limit=1)
if lease_contract:
record.contract_id = lease_contract.lease_id.id
else:
record.contract_id = False
else:
record.contract_id = False
@api.onchange('current_read')
def onchange_current_read(self):
tariff_list = self.env['property.tariff.list'].search(
[('name', '=', self.archives_id.name),
('meter_date', '=', self.meter_date)
], limit=1
)
values = {
'original_amount': self.receivables,
'contract_id': self.contract_id,
'lessee_id': self.lessee_id.id,
'dosage': self.current_meter,
'tariff_meter_reading': self.current_read,
'name': self.archives_id.name,
'meter_date': self.meter_date,
'unit': self.unit,
'remarks': self.remarks,
'due_date': self.meter_date + relativedelta(months=1) - timedelta(days=1) if self.meter_date else None,
}
if tariff_list:
tariff_list.write(values)
else:
self.env['property.tariff.list'].create(values)
class MeterWaterLine(models.Model):
_inherit = 'meter.water.line'
contract_id = fields.Many2one('property.lease.contract', string="合同")
contract_id = fields.Many2one('property.lease.contract', string="合同", compute="compute_contract_id")
@api.depends('yuthon_property_ids')
def compute_contract_id(self):
for record in self:
if record.yuthon_property_ids:
lease_contract = self.env['property.lease.contract.line'].search(
[('address_id', '=', record.yuthon_property_ids[0].id)], limit=1)
if lease_contract:
record.contract_id = lease_contract.lease_id.id
else:
record.contract_id = False
else:
record.contract_id = False
@api.onchange('current_read')
def onchange_current_read(self):
tariff_list = self.env['property.water.list'].search(
[('name', '=', self.archives_id.name),
('meter_date', '=', self.meter_date)
], limit=1
)
values = {
'original_amount': self.receivables,
'contract_id': self.contract_id,
'lessee_id': self.lessee_id.id,
'dosage': self.current_meter,
'tariff_meter_reading': self.current_read,
'name': self.archives_id.name,
'meter_date': self.meter_date,
'unit': self.unit,
'remarks': self.remarks,
'due_date': self.meter_date + relativedelta(months=1) - timedelta(days=1) if self.meter_date else None,
}
if tariff_list:
tariff_list.write(values)
else:
self.env['property.water.list'].create(values)
class YuthonProperty(models.Model):
_inherit = 'yuthon.property'
@@ -62,91 +62,6 @@ class PropertyRentalWizard(models.Model):
"month": self.select_month,
})
def create_water_fee_list(self, record, start_date, end_date):
"""封装创建水费记录的逻辑"""
for lease in record.lease_ids:
if lease.address_id and lease.address_id.is_meter:
active_water_meters = lease.address_id.water_meter_ids.filtered(
lambda m: (not m.demolition_date or m.demolition_date > fields.Date.today())
and m.property_meter_water_id.water_state in ('use', 'rent')
)
remarks = self._get_date_range_remark(record.actual_end_time)
for meter in active_water_meters:
water = meter.property_meter_water_id
target_line = water.line_ids.filtered(
lambda l: start_date <= l.meter_date <= end_date
)[:1]
if target_line:
receivables = target_line.receivables
current_meter = target_line.current_meter
meter_date = target_line.meter_date
else:
receivables = 0.0
current_meter = 0.0
meter_date = None
water_list = self.env['property.water.list'].search(
[('name', '=', meter.property_meter_water_id.name)], limit=1
)
values = {
'contract_id': record.id,
'lessee_id': record.lessee_id.id,
'original_amount': receivables,
'dosage':current_meter,
'name': meter.property_meter_water_id.name,
'unit': meter.property_meter_water_id.unit,
'due_date': meter_date + relativedelta(months=1) - timedelta(days=1) if meter_date else None,
'remarks':remarks
}
if water_list:
water_list.write(values)
else:
self.env['property.water.list'].create(values)
def create_ele_fee_list(self, record, start_date, end_date):
"""封装创建电费记录的逻辑,从明细行获取指定日期范围的数据"""
for lease in record.lease_ids:
if lease.address_id.is_electricity_meter:
# 获取有效的电表
active_electric_meters = lease.address_id.energy_meter_ids.filtered(
lambda m: (not m.demolition_date or m.demolition_date > fields.Date.today())
and m.property_meter_archives_id.archives_state in ('use', 'rent')
)
remarks = self._get_date_range_remark(record.actual_end_time)
for meter in active_electric_meters:
archives = meter.property_meter_archives_id
target_line = archives.line_ids.filtered(
lambda l: start_date <= l.meter_date <= end_date
)[:1]
if target_line:
receivables = target_line.receivables
current_meter = target_line.current_meter
meter_date = target_line.meter_date
else:
receivables = 0.0
current_meter = 0.0
meter_date = None
tariff_list = self.env['property.tariff.list'].search(
[('name', '=', archives.name)], limit=1
)
values = {
'original_amount': receivables,
'contract_id': record.id,
'lessee_id': record.lessee_id.id,
'dosage': current_meter,
'name': archives.name,
'unit': archives.unit,
'remarks': remarks,
'due_date': meter_date + relativedelta(months=1) - timedelta(days=1) if meter_date else None,
}
if tariff_list:
tariff_list.write(values)
else:
self.env['property.tariff.list'].create(values)
def create_deposit_list(self, record):
"""封装创建押金记录的逻辑 - 根据合同中的多种押金类型创建多条记录"""
property_id = record.lease_ids[0].address_id.id if record.lease_ids else None
@@ -262,20 +177,4 @@ class PropertyRentalWizard(models.Model):
multiplier = self.get_multiplier(record.cycle_dict)
for rent_id in record.breakdown_ids:
self.process_rent_record(record, rent_id, date_field_year_month, multiplier)
self.create_deposit_list(record)
# 生成水电费列表
self.create_water_fee_list(record, first_day, last_day)
self.create_ele_fee_list(record, first_day, last_day)
def _get_date_range_remark(self, end_date):
"""生成日期区间备注(格式:YYYYMMDD-YYYYMMDD)"""
# 处理开始日期:如果日大于15,则取16日,否则取1日
start_date = end_date.replace(day=15) - relativedelta(months=1)
start_date_str = start_date.strftime('%Y%m%d')
# 处理结束日期:如果日小于15,则取当日,否则取15日
end_day = end_date.day if end_date.day < 15 else 15
end_date_str = end_date.replace(day=end_day).strftime('%Y%m%d')
return f"{start_date_str}-{end_date_str}"
self.create_deposit_list(record)