添加功能

This commit is contained in:
zhou
2025-01-14 16:32:19 +08:00
parent d5e68b8fb2
commit 41ff63b1a4
16 changed files with 240 additions and 34 deletions
+2
View File
@@ -45,11 +45,13 @@
'views/property_check_stairs_views.xml',
'views/property_check_decorate_views.xml',
'views/property_other_list_views.xml',
'views/property_bank_statements_views.xml',
'views/property_meter_reading_views.xml',
'wizard/yuthon_property_wizard_views.xml',
'wizard/property_meter_wizard_views.xml',
'wizard/property_tenant_wizard_views.xml',
'wizard/property_water_wizard_views.xml',
'wizard/property_statements_wizard_views.xml',
'views/menuitem.xml',
],
'assets': {
@@ -1,8 +1,29 @@
from odoo import models, fields, api
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models, fields, api, exceptions, _
class PropertyBankStatements(models.Model):
_name = 'property.bank.statements'
_description = 'Bank Statement'
_description = '银行流水'
name = fields.Char(string='Name')
name = fields.Char('账号', required=True)
company_id = fields.Many2one('yuthon.property.company', string="出租方")
start_time = fields.Datetime('交易时间', required=True)
withdraw = fields.Float('支取')
deposit = fields.Float('收入')
balance = fields.Float('余额')
currency = fields.Char('币种')
lessee_id = fields.Many2one('property.tenant.information', string='对方户名')
lessee_account = fields.Char('对方账号')
lessee_agencies = fields.Char('对方开户机构')
billing_date = fields.Date('记账日期')
registered = fields.Char(string='用途')
summary = fields.Char('摘要')
remark = fields.Char('备注')
bank_id = fields.Many2one('yuthon.bank.setting', string='银行')
transaction_number = fields.Char('交易流水号')
business_number = fields.Char('企业流水号')
voucher_type = fields.Char('凭证种类')
voucher_number = fields.Char('凭证号')
@@ -124,4 +124,10 @@ class YuthonManagementType(models.Model):
_name = 'yuthon.management.type'
_description = '管理类型'
name = fields.Char(string="管理类型")
name = fields.Char(string="管理类型")
class YuthonBankSetting(models.Model):
_name = 'yuthon.bank.setting'
_description = '银行'
name = fields.Char(string="银行")
+4 -1
View File
@@ -59,4 +59,7 @@ access_yuthon_industry_setting,yuthon_industry_setting,model_yuthon_industry_set
access_property_tenant_wizard,property_tenant_wizard,model_property_tenant_wizard,base.group_user,1,1,1,1
access_property_water_wizard,property_water_wizard,model_property_water_wizard,base.group_user,1,1,1,1
access_yuthon_purpose_evidence,yuthon_purpose_evidence,model_yuthon_purpose_evidence,base.group_user,1,1,1,1
access_yuthon_management_type,yuthon_management_type,model_yuthon_management_type,base.group_user,1,1,1,1
access_yuthon_management_type,yuthon_management_type,model_yuthon_management_type,base.group_user,1,1,1,1
access_yuthon_bank_setting,yuthon_bank_setting,model_yuthon_bank_setting,base.group_user,1,1,1,1
access_property_bank_statements,property_bank_statements,model_property_bank_statements,base.group_user,1,1,1,1
access_property_statements_wizard,property_statements_wizard,model_property_statements_wizard,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
59 access_property_tenant_wizard property_tenant_wizard model_property_tenant_wizard base.group_user 1 1 1 1
60 access_property_water_wizard property_water_wizard model_property_water_wizard base.group_user 1 1 1 1
61 access_yuthon_purpose_evidence yuthon_purpose_evidence model_yuthon_purpose_evidence base.group_user 1 1 1 1
62 access_yuthon_management_type yuthon_management_type model_yuthon_management_type base.group_user 1 1 1 1
63 access_yuthon_bank_setting yuthon_bank_setting model_yuthon_bank_setting base.group_user 1 1 1 1
64 access_property_bank_statements property_bank_statements model_property_bank_statements base.group_user 1 1 1 1
65 access_property_statements_wizard property_statements_wizard model_property_statements_wizard base.group_user 1 1 1 1
+8 -2
View File
@@ -195,7 +195,12 @@
sequence="3"
name="银行流水"
parent="yuthon_property_other_list"
action="view_property_rent_list_action2"/>
action="view_property_bank_statements_action"/>
<menuitem id="yuthon_bank_statement_wizard_menu"
sequence="10"
name="银行流水向导"
parent="yuthon_property_other_list"
action="property_statements_wizard_action"/>
<menuitem id="yuthon_security_inspection_menu"
sequence="19"
name="安全巡检(二期)"
@@ -368,7 +373,8 @@
action="view_yuthon_purpose_evidence_action" sequence="65"/>
<menuitem id="yuthon_management_type_menu" parent="resource_mgmt_config_menu" name="管理类型"
action="view_yuthon_management_type_action" sequence="70"/>
<menuitem id="yuthon_bank_setting_menu" parent="resource_mgmt_config_menu" name="银行"
action="view_yuthon_bank_setting_action" sequence="75"/>
<menuitem
@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="view_property_bank_statements_tree" model="ir.ui.view">
<field name="name">property.bank.statements.tree</field>
<field name="model">property.bank.statements</field>
<field name="arch" type="xml">
<tree string="银行流水" editable="bottom">
<field name="name"/>
<field name="company_id"/>
<field name="start_time"/>
<field name="withdraw"/>
<field name="deposit"/>
<field name="balance"/>
<field name="bank_id"/>
<field name="currency" optional="hide"/>
<field name="lessee_id" optional="hide"/>
<field name="lessee_account" optional="hide"/>
<field name="lessee_agencies" optional="hide"/>
<field name="billing_date" optional="hide"/>
<field name="registered" optional="hide"/>
<field name="summary" optional="hide"/>
<field name="remark" optional="hide"/>
<field name="transaction_number" optional="hide"/>
<field name="business_number" optional="hide"/>
<field name="voucher_type" optional="hide"/>
<field name="voucher_number" optional="hide"/>
</tree>
</field>
</record>
<record id="view_property_bank_statements_action" model="ir.actions.act_window">
<field name="name">Property Bank Statements</field>
<field name="res_model">property.bank.statements</field>
<field name="view_mode">tree</field>
</record>
</odoo>
@@ -235,4 +235,18 @@
<field name="res_model">yuthon.management.type</field>
<field name="view_mode">tree</field>
</record>
<record id="view_yuthon_bank_setting_tree" model="ir.ui.view">
<field name="name">yuthon.bank.setting.tree</field>
<field name="model">yuthon.bank.setting</field>
<field name="arch" type="xml">
<tree editable="bottom">
<field name="name"/>
</tree>
</field>
</record>
<record id="view_yuthon_bank_setting_action" model="ir.actions.act_window">
<field name="name">银行设置</field>
<field name="res_model">yuthon.bank.setting</field>
<field name="view_mode">tree</field>
</record>
</odoo>
+1
View File
@@ -2,3 +2,4 @@ from . import yuthon_property_wizard
from . import property_meter_wizard
from . import property_tenant_wizard
from . import property_water_wizard
from . import property_statements_wizard
@@ -0,0 +1,75 @@
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
class PropertyStatementsWizard(models.Model):
_name = 'property.statements.wizard'
_description = '银行流水向导弹窗'
selection_bank_id = fields.Many2one('yuthon.bank.setting', string='选择银行', required=True)
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)
self.property_bank_statements_data(row)
def property_bank_statements_data(self, row):
name = row[0].value
start_time = pd.to_datetime(row[2].value, unit='d', origin='1899-12-30')
company_id = self.env['yuthon.property.company'].search([('name', '=', row[1].value)])
withdraw = row[3].value
deposit = row[4].value
balance = row[5].value
currency = row[6].value
if row[7].value:
lessee_id = self.env['property.tenant.information'].search([('name', '=', row[7].value)])
else:
lessee_id = None
lessee_account = row[8].value
lessee_agencies = row[9].value
billing_date = pd.to_datetime(row[10].value, unit='d', origin='1899-12-30')
summary = row[11].value
remark = row[12].value
transaction_number = row[13].value
business_number = row[14].value
voucher_type = row[15].value
voucher_number = row[16].value
registered = row[17].value
bank_data = {
'name':name,
'start_time':start_time,
'company_id': company_id.id,
'withdraw': withdraw,
'deposit': deposit,
'balance': balance,
'currency': currency,
'lessee_id': lessee_id.id if lessee_id else False,
'lessee_account': lessee_account,
'lessee_agencies': lessee_agencies,
'billing_date': billing_date,
'summary': summary,
'remark': remark,
'transaction_number': transaction_number,
'business_number': business_number,
'voucher_type': voucher_type,
'voucher_number': voucher_number,
'bank_id':self.selection_bank_id.id,
'registered': registered
}
self.env['property.bank.statements'].create(bank_data)
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="property_template_downloads_statements_action" model="ir.actions.act_url">
<field name="name">银行流水模板 下载</field>
<field name="target">self</field>
<field name="url">.</field>
</record>
<record id="property_statements_wizard_form" model="ir.ui.view">
<field name="name">银行流水导入弹窗</field>
<field name="model">property.statements.wizard</field>
<field name="arch" type="xml">
<form>
<sheet>
<header>
<button name="%(property_template_downloads_statements_action)d" string="模板下载" type="action"
class="btn btn-primary"/>
</header>
<group>
<group>
<field name="selection_bank_id"/>
<field name="excel_file" filename="excel_name"/>
<field name="excel_name" invisible="1"/>
</group>
<group>
</group>
</group>
</sheet>
<footer>
<button name="confirm" string="确认" type="object" class="oe_highlight"/>
<button string="返回" class="btn-secondary" special="cancel"/>
</footer>
</form>
</field>
</record>
<record id="property_statements_wizard_action" model="ir.actions.act_window">
<field name="name">银行流水向导</field>
<field name="res_model">property.statements.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</odoo>
+1 -1
View File
@@ -36,4 +36,4 @@ from . import property_rental_conditions
from . import property_merge_approval
from . import property_split_approval
from . import property_intention_approval
from . import property_transfer_approval
from . import property_transfer_approval
@@ -44,7 +44,7 @@ class PropertyLeaseContract(models.Model):
contract_code = fields.Char(string="合同编号")
contract_date = fields.Date(string="合同签订日期")
property_documents_ids = fields.Many2many('ir.attachment', string="租赁合同文件")
title_certificate = fields.Char('产权证号')
title_address = fields.Char(string="产权地址")
company_id = fields.Many2one('yuthon.property.company', string="出租方")
rent_company = fields.Char(related='company_id.name', string="收租公司名称")
rent_account = fields.Char(related='company_id.rent_account', string="收租公司账号")
@@ -101,7 +101,7 @@ class PropertyLeaseContract(models.Model):
date_payment_month = fields.Char(string="支付日期")
date_payment_day = fields.Char(string="支付日期")
first_pay = fields.Date(string="首次付款日")
unit_price = fields.Float(string="单价")
unit_price = fields.Float(string="单价", store=True)
deposit_type = fields.Selection([('deposit', '押金'), ('performance', '履约保证金')], string="押金/履约保证金")
deposit_status = fields.Selection([('unpaid', '未支付'), ('paid', '已支付'), ('returned','已退'),('no_paid', '没收')], string='押金状态')
deposit = fields.Float(string="押金/履约保证金", store=True)
@@ -808,13 +808,16 @@ class PropertyLeaseContract(models.Model):
def _onchange_lease_ids(self):
lease_name = []
electricity_list = []
title_address = []
fee_list = []
for rec in self:
for record in rec.lease_ids:
if record.address_id:
lease_name.append(record.address_id.name)
title_address.append(record.address_id.title_address.name)
rec.name = ','.join(lease_name)
rec.use_address = ','.join(lease_name)
rec.title_address = ','.join(title_address)
property_id = self.env['yuthon.property'].search([('id', '=', record.address_id.id)])
if property_id.energy_meter_ids:
rec.is_electricity = True
@@ -836,7 +839,6 @@ class PropertyLeaseContract(models.Model):
rec.electricity_fee_ids = [(5, 0, 0)]
rec.mange_fee_ids = [(5, 0, 0)]
rec.title_certificate = rec.lease_ids[0].address_id.title_deed if rec.lease_ids else ''
rec.admin_id = rec.lease_ids[0].admin_id.id if rec.lease_ids else ''
rec.company_id = rec.lease_ids[0].address_id.company_id.id if rec.lease_ids else ''
rec.precinct_id = rec.lease_ids[0].address_id.precinct_id.id if rec.lease_ids else ''
@@ -64,4 +64,4 @@ access_property_subset_contract,property_subset_contract,model_property_subset_c
access_property_contract_line,property_contract_line,model_property_contract_line,base.group_user,1,1,1,1
access_choose_property_wizard,choose_property_wizard,model_choose_property_wizard,base.group_user,1,1,1,1
access_property_rental_wizard,property_rental_wizard,model_property_rental_wizard,base.group_user,1,1,1,1
access_property_rental_wizard,property_rental_wizard,model_property_rental_wizard,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
64 access_property_contract_line property_contract_line model_property_contract_line base.group_user 1 1 1 1
65 access_choose_property_wizard choose_property_wizard model_choose_property_wizard base.group_user 1 1 1 1
66 access_property_rental_wizard property_rental_wizard model_property_rental_wizard base.group_user 1 1 1 1
67
@@ -71,7 +71,7 @@
<field name="name"/>
<field name="use_address"/>
<field name="address_for_delivery"/>
<field name="title_certificate"/>
<field name="title_address"/>
<field name="condition" readonly="1" invisible="1"/>
</group>
</group>
@@ -136,18 +136,22 @@
<field name="lease_term_day"/>
日
</div>
<field name="term_start_time"/>
<field name="term_end_time" readonly="1" force_save="1"/>
<label for="term_start_time"/>
<div class="d-inline-flex w-100">
<field name="term_start_time" class="me-2" style="max-width: 11rem !important;"/>结束时间
<field name="term_end_time" class="me-2" style="max-width: 11rem !important;" readonly="1" force_save="1"/>
</div>
<label for="cycle_mode"/>
<div class="d-inline-flex w-100">
<field name="cycle_mode" class="me-2" style="max-width: 11rem !important;"/>付款方式
<field name="cycle_dict" class="me-2" style="max-width: 11rem !important;"/>
</div>
<field name="total_area"/>
<field name="rent" string="月租金" invisible="cycle_dict != 'monthly'"/>
<field name="rent" string="季租金" invisible="cycle_dict != 'quarter'"/>
<field name="rent" string="半年租金" invisible="cycle_dict != 'half'"/>
<field name="rent" string="年租金" invisible="cycle_dict != 'year'"/>
<field name="unit_price" readonly="1"/>
<field name="unit_price" readonly="1" force_save="1"/>
</group>
<group>
<field name="first_pay"/>
@@ -158,7 +162,6 @@
<field name="date_payment_day"/>
日
</div>
<field name="total_area"/>
<field name="expected_reminders"/>
</group>
</group>
@@ -453,8 +456,11 @@
<field name="lease_term_day"/>
日
</div>
<field name="term_start_time"/>
<field name="term_end_time" readonly="1" force_save="1"/>
<label for="term_start_time"/>
<div class="d-inline-flex w-100">
<field name="term_start_time" class="me-2" style="max-width: 11rem !important;"/>结束时间
<field name="term_end_time" class="me-2" style="max-width: 11rem !important;" readonly="1" force_save="1"/>
</div>
<field name="actual_start_time" invisible="1"/>
<field name="actual_end_time" invisible="1"/>
<label for="cycle_mode"/>
@@ -464,11 +470,12 @@
<field name="cycle_dict" class="me-2"
style="max-width: 11rem !important;"/>
</div>
<field name="total_area"/>
<field name="rent" string="月租金" invisible="cycle_dict != 'monthly'"/>
<field name="rent" string="季租金" invisible="cycle_dict != 'quarter'"/>
<field name="rent" string="半年租金" invisible="cycle_dict != 'half'"/>
<field name="rent" string="年租金" invisible="cycle_dict != 'year'"/>
<field name="unit_price" readonly="1"/>
<field name="unit_price" readonly="1" force_save="1"/>
</group>
<group>
<field name="first_pay"/>
@@ -479,7 +486,6 @@
<field name="date_payment_day"/>
日
</div>
<field name="total_area"/>
<field name="expected_reminders"/>
</group>
</group>
@@ -636,7 +642,7 @@
<filter name="group_by_lessee_id" context="{'group_by': 'lessee_id'}"/>
<filter name="group_by_company_id" context="{'group_by': 'company_id'}"/>
<filter name="group_by_admin_id" context="{'group_by': 'admin_id'}"/>
<filter name="group_by_title_certificate" context="{'group_by': 'title_certificate'}"/>
<filter name="group_by_title_address" context="{'group_by': 'title_address'}"/>
</group>
</search>
</field>
@@ -646,7 +652,6 @@
<field name="res_model">property.lease.contract</field>
<field name="view_mode">tree,form,search</field>
<field name="domain">[('condition', '=', 'be_executed')]</field>
<field name="context">{'search_default_group_by_condition':1}</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'tree', 'view_id': ref('yuthon_property_approval.view_property_lease_contract_tree1')}),
(0, 0, {'view_mode': 'form', 'view_id': ref('yuthon_property_approval.view_property_lease_contract_form1')})]"/>
@@ -656,7 +661,6 @@
<field name="res_model">property.lease.contract</field>
<field name="view_mode">tree,form,search</field>
<field name="domain">[('condition', '=', 'executed')]</field>
<field name="context">{'search_default_group_by_condition':1}</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'tree', 'view_id': ref('yuthon_property_approval.view_property_lease_contract_tree1')}),
(0, 0, {'view_mode': 'form', 'view_id': ref('yuthon_property_approval.view_property_lease_contract_form1')})]"/>
@@ -665,8 +669,6 @@
<field name="name">已终止</field>
<field name="res_model">property.lease.contract</field>
<field name="view_mode">tree,form,search</field>
<field name="domain">[('condition', '=', 'expired')]</field>
<field name="context">{'search_default_group_by_condition':1}</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'tree', 'view_id': ref('yuthon_property_approval.view_property_lease_contract_tree1')}),
(0, 0, {'view_mode': 'form', 'view_id': ref('yuthon_property_approval.view_property_lease_contract_form1')})]"/>
@@ -675,7 +677,6 @@
<field name="name">即将到期</field>
<field name="res_model">property.lease.contract</field>
<field name="view_mode">tree,form,search</field>
<field name="domain">[('expiration_coming', '=', 'coming')]</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'tree', 'view_id': ref('yuthon_property_approval.view_property_lease_contract_tree1')}),
(0, 0, {'view_mode': 'form', 'view_id': ref('yuthon_property_approval.view_property_lease_contract_form1')})]"/>
@@ -703,7 +704,6 @@
<field name="res_model">property.lease.contract</field>
<field name="view_mode">tree,form,search</field>
<field name="domain">[('condition', 'in', ['new', 'approval', 'cancel'])]</field>
<field name="context">{'search_default_group_by_condition':1}</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'tree', 'view_id': ref('yuthon_property_approval.view_property_lease_contract_tree')}),
(0, 0, {'view_mode': 'form', 'view_id': ref('yuthon_property_approval.view_property_lease_contract_form')})]"/>
@@ -211,11 +211,6 @@
name="待执行"
action="property_lease_contract_be_executed_action"
sequence="1"/>
<menuitem id="property_lease_contract_executing_menu"
parent="property_lease_contract_management_menu"
name="已终止"
action="property_lease_contract_expired_action"
sequence="3"/>
<menuitem id="property_lease_contract_executed_menu"
parent="property_lease_contract_management_menu"
name="已执行"
@@ -231,6 +226,11 @@
name="合同到期"
action="property_lease_contract_due_action"
sequence="10"/>
<menuitem id="property_lease_contract_executing_menu"
parent="property_lease_contract_management_menu"
name="已终止"
action="property_lease_contract_expired_action"
sequence="13"/>
<menuitem id="property_lease_contract_all_menu"
parent="property_lease_contract_management_menu"
name="全部合同"
+1 -1
View File
@@ -1,3 +1,3 @@
from . import property_contract_wizard
from . import choose_property_wizard
from . import property_rental_wizard
from . import property_rental_wizard