188 lines
7.8 KiB
Python
188 lines
7.8 KiB
Python
from odoo import models, fields, api, _, SUPERUSER_ID
|
|
from odoo.exceptions import UserError, ValidationError
|
|
from dateutil.relativedelta import relativedelta
|
|
from datetime import datetime, time, timedelta
|
|
import xlrd
|
|
import base64
|
|
import pandas as pd
|
|
import re
|
|
|
|
class PropertyStatementsWizard(models.Model):
|
|
_name = 'property.statements.wizard'
|
|
_description = '银行流水向导弹窗'
|
|
|
|
selection_bank = fields.Selection([('js', '建设银行'), ('gs', '工商银行'),('sh', '农商')], string="选择银行")
|
|
excel_file = fields.Binary(string="上传Excel表")
|
|
excel_name = fields.Char(string="文件名")
|
|
|
|
def confirm(self):
|
|
"""
|
|
导入excel文件,按行读取数据并处理
|
|
"""
|
|
if not self.excel_file:
|
|
raise ValidationError('请上传文件。')
|
|
book = xlrd.open_workbook(file_contents=base64.decodebytes(self.excel_file))
|
|
sh = book.sheet_by_index(0)
|
|
for rx in range(1, sh.nrows):
|
|
row = sh.row(rx)
|
|
if self.selection_bank == 'js':
|
|
self.property_bank_statements_jh_data(row)
|
|
elif self.selection_bank == 'gs':
|
|
self.property_bank_statements_gc_data(row)
|
|
elif self.selection_bank == 'sh':
|
|
self.property_bank_statements_sh_data(row)
|
|
|
|
def property_bank_statements_gc_data(self, row):
|
|
if row[0].value:
|
|
start_time = datetime.strptime(row[0].value, '%Y-%m-%d %H:%M:%S')
|
|
else:
|
|
start_time = None
|
|
name = row[4].value
|
|
name_account = row[1].value
|
|
remake = row[2].value
|
|
original_amount = row[3].value
|
|
your_own_account = row[6].value
|
|
cleaned_amount = original_amount.replace(',', '')
|
|
float_amount = float(cleaned_amount)
|
|
your_own_unit = self.classify_by_last_four(your_own_account)
|
|
if your_own_unit in ['天河投资', '天投城建']:
|
|
company_id = self.env['res.company'].search([('name', '=', '集团本部')], limit=1)
|
|
elif your_own_unit in ['天河物管']:
|
|
company_id = self.env['res.company'].search([('name', '=', '天河物管')], limit=1)
|
|
elif your_own_unit in ['天河粮储']:
|
|
company_id = self.env['res.company'].search([('name', '=', '天河粮储')], limit=1)
|
|
sequence_number = row[5].value
|
|
bank_data = {
|
|
'name': name,
|
|
'your_own_unit': your_own_unit,
|
|
'original_amount': float_amount,
|
|
'company_id': company_id.id,
|
|
'sequence_number': sequence_number,
|
|
'start_time': start_time - timedelta(hours=8),
|
|
'your_own_account': your_own_account,
|
|
'name_account': name_account,
|
|
'remake': remake,
|
|
}
|
|
existing_record = self.env['property.bank.statements'].search(
|
|
[('sequence_number', '=', sequence_number)], limit=1
|
|
)
|
|
if not existing_record:
|
|
self.env['property.bank.statements'].create(bank_data)
|
|
|
|
def property_bank_statements_jh_data(self, row):
|
|
your_own_account = row[0].value
|
|
if row[1].value:
|
|
start_time = datetime.strptime(row[2].value, '%Y%m%d %H:%M:%S')
|
|
else:
|
|
start_time = None
|
|
if row[3].value:
|
|
original_amount = float(row[3].value)
|
|
lending_direction = 'borrow'
|
|
elif row[4].value:
|
|
original_amount = float(row[4].value)
|
|
lending_direction = 'loan'
|
|
name_account = row[7].value
|
|
name = row[8].value
|
|
bank_branch = row[9].value
|
|
remake = row[12].value
|
|
extract = row[11].value
|
|
serial_number = row[13].value
|
|
your_own_unit = self.classify_by_last_four(your_own_account)
|
|
if your_own_unit in ['天河投资', '天投城建']:
|
|
company_id = self.env['res.company'].search([('name', '=', '集团本部')], limit=1)
|
|
elif your_own_unit in ['天河物管']:
|
|
company_id = self.env['res.company'].search([('name', '=', '天河物管')], limit=1)
|
|
elif your_own_unit in ['天河粮储']:
|
|
company_id = self.env['res.company'].search([('name', '=', '天河粮储')], limit=1)
|
|
bank_data = {
|
|
'name': name,
|
|
'serial_number': serial_number,
|
|
'your_own_unit': your_own_unit,
|
|
'no_amount': original_amount,
|
|
'company_id': company_id.id,
|
|
'bank_branch': bank_branch,
|
|
'original_amount': original_amount,
|
|
'start_time': start_time - timedelta(hours=8),
|
|
'your_own_account': your_own_account,
|
|
'extract': extract,
|
|
'name_account': name_account,
|
|
'remake': remake,
|
|
'lending_direction': lending_direction
|
|
}
|
|
existing_record = self.env['property.bank.statements'].search(
|
|
[('serial_number', '=', serial_number)], limit=1
|
|
)
|
|
if not existing_record:
|
|
self.env['property.bank.statements'].create(bank_data)
|
|
else:
|
|
existing_record.write(bank_data)
|
|
|
|
def property_bank_statements_sh_data(self, row):
|
|
your_own_account = row[12].value
|
|
if row[2].value:
|
|
clean_str = row[2].value.replace('\n', ' ') # 处理后:'2025-01-17 10:10:31'
|
|
start_time = datetime.strptime(clean_str, '%Y-%m-%d %H:%M:%S')
|
|
else:
|
|
start_time = None
|
|
if row[3].value != '-':
|
|
lending_direction = 'borrow'
|
|
original_amount = float(row[3].value)
|
|
if row[4].value != '-':
|
|
lending_direction = 'loan'
|
|
original_amount = float(row[4].value)
|
|
name_account = row[5].value
|
|
name = row[6].value
|
|
remake = row[11].value
|
|
bank_branch = row[7].value
|
|
extract = row[10].value
|
|
serial_number = row[0].value
|
|
lending_direction = lending_direction
|
|
your_own_unit = self.classify_by_last_four(your_own_account)
|
|
if your_own_unit in ['天河投资', '天投城建']:
|
|
company_id = self.env['res.company'].search([('name', '=', '集团本部')], limit=1)
|
|
elif your_own_unit in ['天河物管']:
|
|
company_id = self.env['res.company'].search([('name', '=', '天河物管')], limit=1)
|
|
elif your_own_unit in ['天河粮储']:
|
|
company_id = self.env['res.company'].search([('name', '=', '天河粮储')], limit=1)
|
|
bank_data = {
|
|
'name': name,
|
|
'serial_number': serial_number,
|
|
'your_own_unit': your_own_unit,
|
|
'company_id': company_id.id,
|
|
'bank_branch': bank_branch,
|
|
'no_amount': original_amount,
|
|
'original_amount': original_amount,
|
|
'start_time': start_time - timedelta(hours=8) ,
|
|
'your_own_account': your_own_account,
|
|
'extract': extract,
|
|
'name_account': name_account,
|
|
'remake': remake,
|
|
'lending_direction': lending_direction
|
|
}
|
|
if original_amount and serial_number:
|
|
existing_record = self.env['property.bank.statements'].search(
|
|
[('serial_number', '=', serial_number)], limit=1
|
|
)
|
|
if not existing_record:
|
|
self.env['property.bank.statements'].create(bank_data)
|
|
else:
|
|
existing_record.write(bank_data)
|
|
|
|
elif original_amount:
|
|
self.env['property.bank.statements'].create(bank_data)
|
|
|
|
|
|
def classify_by_last_four(self, input_str):
|
|
if not isinstance(input_str, str) or len(input_str) < 4:
|
|
return "天投城建" # 输入不是字符串或长度不足4,默认为天投城建
|
|
|
|
last_four = input_str[-4:] # 获取后四位字符
|
|
|
|
if last_four == "3619":
|
|
return "天河物管"
|
|
elif last_four == "0222":
|
|
return "天河投资"
|
|
elif last_four == "9661":
|
|
return "天河粮储"
|
|
else:
|
|
return "天投城建" |