Files
gzth/yuthon_property/wizard/task_push_wizard.py
T
2025-12-15 16:35:50 +08:00

121 lines
5.7 KiB
Python

# -*- coding: utf-8 -*-
from odoo import models, fields, api, _, SUPERUSER_ID
from odoo.exceptions import ValidationError, UserError
from pypinyin import pinyin, Style
import xlrd
import base64
import datetime
from datetime import datetime, timedelta, date
import calendar
class TaskPushWizard(models.TransientModel):
_name = 'task.push.wizard'
_description = '电水表任务推送弹窗'
push_date = fields.Date(string='日期', default=fields.date.today())
meter_ids = fields.Many2many('meter.archives.line', string='电表任务')
water_ids = fields.Many2many('meter.water.line', string='水表任务')
def confirm(self):
push_year = self.push_date.year
push_month = self.push_date.month
if push_month == 12:
next_month_first_day = date(push_year + 1, 1, 1)
else:
next_month_first_day = date(push_year, push_month + 1, 1)
due_date = date(push_year, push_month, 1)
due_date_end = next_month_first_day - timedelta(days=1)
if self.meter_ids:
management_type_id = self.env['yuthon.management.type'].search([('name', '=', '电费')], limit=1)
for meter in self.meter_ids:
if meter.unit and meter.contract_id:
start_date, end_date = self._get_date_range_remake(
meter.meter_date,
meter.contract_id.actual_start_time
)
if meter.is_acc:
remark = '新合同,暂无需抄表'
else:
remark = str(start_date) + '到' + str(end_date)
archives_id = meter.archives_id
if archives_id.is_virtual_meter:
if archives_id.daily_readings:
year = start_date.year
month = start_date.month
days_in_month = calendar.monthrange(year, month)[1]
original_amount = archives_id.daily_readings * days_in_month * meter.unit
else:
original_amount = archives_id.moth_readings * meter.unit
else:
if meter.archives_id.fixed_receivables:
original_amount = meter.archives_id.fixed_receivables
else:
original_amount = meter.receivables
if original_amount > 0:
self.env['property.accounts.receivable'].create({
'contract_id': meter.contract_id.id,
'lessee_id': meter.lessee_id.id if meter.lessee_id else None,
'original_amount': original_amount,
'due_date': due_date,
'due_date_end': due_date_end,
'charging_range': f"{start_date.strftime('%Y-%m-%d')} 到 {(end_date).strftime('%Y-%m-%d')}",
'create_time': datetime.now(),
'remark': remark,
'management_type_id': management_type_id.id,
})
meter.is_push = True
if self.water_ids:
management_type_id = self.env['yuthon.management.type'].search([('name', '=', '水费')], limit=1)
for water in self.water_ids:
if water.unit and water.contract_id:
start_date, end_date = self._get_date_range_remake(
water.meter_date,
water.contract_id.actual_start_time
)
if water.is_acc:
remark = '新合同,暂无需抄表'
else:
remark = str(start_date) + '到' + str(end_date)
if water.water_id.fixed_receivables > 0 or water.receivables > 0:
self.env['property.accounts.receivable'].create({
'contract_id': water.contract_id.id,
'lessee_id': water.lessee_id.id if water.lessee_id else None,
'original_amount': water.water_id.fixed_receivables if water.water_id.fixed_receivables else water.receivables,
'due_date': due_date,
'due_date_end': due_date_end,
'charging_range': f"{start_date.strftime('%Y-%m-%d')} 到 {(end_date).strftime('%Y-%m-%d')}",
'create_time': datetime.now(),
'remark': remark,
'management_type_id': management_type_id.id,
})
water.is_push = True
def _get_date_range_remake(self, meter_date, contract_start):
meter_year = meter_date.year
meter_month = meter_date.month
meter_day = meter_date.day
contract_start_year = contract_start.year
contract_start_month = contract_start.month
if contract_start_year == meter_year and (meter_month - 1) == contract_start_month:
start_date = fields.Date.from_string(f"{meter_year}-{meter_month}-01")
else:
if meter_month == 1:
prev_month = 12
prev_year = meter_year - 1
else:
prev_month = meter_month - 1
prev_year = meter_year
prev_month_same_day = fields.Date.from_string(f"{prev_year}-{prev_month}-{meter_day}")
start_date = prev_month_same_day.replace(day=14)
end_date = meter_date.replace(day=15)
return start_date, end_date
def format_date(self, date):
return f"{date.year}年{date.month}月{date.day}日"