diff --git a/yuthon_property/models/property_meter_archives.py b/yuthon_property/models/property_meter_archives.py index 84b60cb55..6bcb2f7eb 100644 --- a/yuthon_property/models/property_meter_archives.py +++ b/yuthon_property/models/property_meter_archives.py @@ -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" diff --git a/yuthon_property/models/property_tariff_list.py b/yuthon_property/models/property_tariff_list.py index 40c66349d..cf277c871 100644 --- a/yuthon_property/models/property_tariff_list.py +++ b/yuthon_property/models/property_tariff_list.py @@ -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='用量') diff --git a/yuthon_property/models/property_water_list.py b/yuthon_property/models/property_water_list.py index dbfd36580..02f9ba643 100644 --- a/yuthon_property/models/property_water_list.py +++ b/yuthon_property/models/property_water_list.py @@ -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='作废') diff --git a/yuthon_property/views/property_tariff_list_views.xml b/yuthon_property/views/property_tariff_list_views.xml index 668c49b96..5cfd1886c 100644 --- a/yuthon_property/views/property_tariff_list_views.xml +++ b/yuthon_property/views/property_tariff_list_views.xml @@ -7,10 +7,8 @@ - - diff --git a/yuthon_property/views/property_water_list_views.xml b/yuthon_property/views/property_water_list_views.xml index 8bbfb0263..21b0eb41b 100644 --- a/yuthon_property/views/property_water_list_views.xml +++ b/yuthon_property/views/property_water_list_views.xml @@ -7,10 +7,8 @@ - - diff --git a/yuthon_property_approval/models/inherit_yuthon_property.py b/yuthon_property_approval/models/inherit_yuthon_property.py index 5b783113e..cb26e44e6 100644 --- a/yuthon_property_approval/models/inherit_yuthon_property.py +++ b/yuthon_property_approval/models/inherit_yuthon_property.py @@ -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' diff --git a/yuthon_property_approval/wizard/property_rental_wizard.py b/yuthon_property_approval/wizard/property_rental_wizard.py index 29f2665bc..098bd3df7 100644 --- a/yuthon_property_approval/wizard/property_rental_wizard.py +++ b/yuthon_property_approval/wizard/property_rental_wizard.py @@ -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}" \ No newline at end of file + self.create_deposit_list(record) \ No newline at end of file