@@ -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)
|
||||
Reference in New Issue
Block a user