# -*- 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}日"