121 lines
5.7 KiB
Python
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}日"
|
|
|