!3424 添加功能

Merge pull request !3424 from dev_zhou
This commit is contained in:
李鹏宇
2025-06-20 07:50:27 +00:00
committed by Gitee
24 changed files with 279 additions and 104 deletions
+1 -3
View File
@@ -27,7 +27,5 @@ class AttendanceIot(models.Model):
('employee_id', 'in', self.employee_ids.ids),
('attendance_iot_id', '=', self.id),
],
'context': {
'group_by': ['attendance_iot_id'],
},
'context': {'group_by': ['company_id', 'attendance_iot_id']}
}
@@ -7,7 +7,7 @@
<tree editable="bottom">
<field name="employee_id"/>
<field name="image_1920"/>
<field name="attendance_iot_id" column_invisible="1"/>
<field name="attendance_iot_id"/>
<field name="attendance_address"/>
<field name="department_id" column_invisible="1"/>
<field name="company_id" column_invisible="1"/>
+1 -1
View File
@@ -223,7 +223,7 @@ class RoomBooking(models.Model):
'views': [(False, 'form')],
'target': 'new',
'context': {
'default_qrcode_image': qrcode_image,
'efault_default_qrcode_image': qrcode_image,
}
}
return action
@@ -69,6 +69,7 @@
<button class="oe_stat_button" name="update_attendance_month" string="更新考勤明细" type="object"
icon="fa-bars"/>
</header>
<button name="button_put" string="发送" type="object" class="oe_highlight"/>
<field name="employee_id" widget="ztree_select"/>
<field name="department_id" optional="show" widget="ztree_select"/>
<field name="current_year"/>
@@ -105,7 +106,6 @@
<field name="state" widget="badge" decoration-info="state == 'unconfirmed'"
decoration-success="state == 'confirmed'"/>
<field name="company_id" optional="show"/>
<button name="button_put" string="发送" type="object" class="oe_highlight"/>
</tree>
</field>
</record>
@@ -8,6 +8,7 @@ class PropertyAccountsReceivable(models.Model):
_description = '应收账单'
property_id = fields.Many2one('yuthon.property', string='物业')
management_area = fields.Float(related='property_id.management_area', string='面积')
lessee_id = fields.Many2one('property.tenant.information', string='承租方')
admin_id = fields.Many2one(related='property_id.admin_id', string="片区管理员")
company_id = fields.Many2one(related='property_id.company_id', string="公司")
@@ -155,7 +155,7 @@ class PropertyBankStatements(models.Model):
contract_ids = self.env['property.lease.contract'].search([('lessee_id', '=', tenant_id.id)])
for contract in contract_ids:
if contract.lease_ids:
lease_id = contract.lease_ids[0].address_id
lease_id = contract.lease_ids[-1].address_id
if lease_id:
property_ids.append(lease_id.id)
self.property_ids = [(6, 0, property_ids)]
+44 -16
View File
@@ -83,8 +83,6 @@ class YuthonProperty(models.Model):
first_letter = fields.Char(string="首字母", compute='_compute_first_letter', store=True)
# 报表新增字段
title_certificate = fields.Char(string="产权证号")
vacant_duration = fields.Float(string="空置时长", digits=(16, 2))
@@ -108,7 +106,25 @@ class YuthonProperty(models.Model):
if rec.title_information_ids:
latest_title_information = sorted(rec.title_information_ids, key=lambda x: x.start_time, reverse=True)[0]
rec.write({
'title_deed': latest_title_information.title_certificate})
'title_deed': latest_title_information.title_certificate,
'registered_id': latest_title_information.registered_id,
'equity_area': latest_title_information.equity_area,
})
@api.onchange('manage_information_ids')
def _onchange_information_ids(self):
for rec in self:
if rec.manage_information_ids:
latest_title_information = sorted(rec.manage_information_ids, key=lambda x: x.start_time, reverse=True)[
0]
rec.write({
'precinct_id': latest_title_information.precinct_id,
'tenure_type': latest_title_information.tenure_type,
'management_area': latest_title_information.management_area,
'rent_area': latest_title_information.rent_area,
'admin_id': latest_title_information.admin_id,
'company_id' : latest_title_information.company_id,
})
@api.onchange('energy_meter_ids')
def _onchange_energy_meter_ids(self):
@@ -164,6 +180,15 @@ class YuthonProperty(models.Model):
"context": {'default_property_rental_form_line_ids': property_list}
}
def open_record(self):
return {
"type": "ir.actions.act_window",
"res_model": 'yuthon.property',
"res_id": self.id,
"name": '物业详情',
"view_mode": "form",
}
def put_offline_approval(self):
form_id = self.env.ref('yuthon_property_approval.view_property_offline_registration_form').id
return {
@@ -177,6 +202,7 @@ class YuthonProperty(models.Model):
}
}
def put_adjustment_approval(self):
form_id = self.env.ref('yuthon_property_approval.view_property_rental_conditions_form').id
return {
@@ -247,11 +273,11 @@ class YuthonProperty(models.Model):
'name': record.name,
'property_ids': [(6, 0, [record.id])],
'evaluation_area': record.rent_area,
'owner_id': record.title_information_ids[0].owner_id.id if record.title_information_ids else None,
'registered_id': record.title_information_ids[0].registered_id.id if record.title_information_ids else None,
'rent_id': record.reference_ids[0].rent_id.id if record.reference_ids else None,
'lease_period': record.reference_ids[0].lease_period if record.reference_ids else None,
'annual_increase_percentage': record.reference_ids[0].annual_increase_percentage if record.reference_ids else None,
'owner_id': record.title_information_ids[-1].owner_id.id if record.title_information_ids else None,
'registered_id': record.title_information_ids[-1].registered_id.id if record.title_information_ids else None,
'rent_id': record.reference_ids[-1].rent_id.id if record.reference_ids else None,
'lease_period': record.reference_ids[-1].lease_period if record.reference_ids else None,
'annual_increase_percentage': record.reference_ids[-1].annual_increase_percentage if record.reference_ids else None,
'assessment_category': 'rent_money',
'remake': record.remark,
})
@@ -273,11 +299,11 @@ class YuthonProperty(models.Model):
'name': record.name,
'property_ids': [(6, 0, [record.id])],
'evaluation_area': record.rent_area,
'owner_id': record.title_information_ids[0].owner_id.id if record.title_information_ids else None,
'registered_id': record.title_information_ids[0].registered_id.id if record.title_information_ids else None,
'rent_id': record.reference_ids[0].rent_id.id if record.reference_ids else None,
'lease_period': record.reference_ids[0].lease_period if record.reference_ids else None,
'annual_increase_percentage': record.reference_ids[0].annual_increase_percentage if record.reference_ids else None,
'owner_id': record.title_information_ids[-1].owner_id.id if record.title_information_ids else None,
'registered_id': record.title_information_ids[-1].registered_id.id if record.title_information_ids else None,
'rent_id': record.reference_ids[-1].rent_id.id if record.reference_ids else None,
'lease_period': record.reference_ids[-1].lease_period if record.reference_ids else None,
'annual_increase_percentage': record.reference_ids[-1].annual_increase_percentage if record.reference_ids else None,
'assessment_category': 'rent_money',
'remake': record.remark,
})
@@ -346,13 +372,15 @@ class YuthonProperty(models.Model):
self._context.get('active_ids', self._context.get('active_id')))
for record in property_ids:
precinct_id = self.env["yuthon.precinct.message"].search([('employee_id.name', '=', record.admin_id.name)])
company_id = record.manage_information_ids[0].company_id.id if record.manage_information_ids else ''
title_deed = record.title_information_ids[0].title_certificate if record.title_information_ids else ''
company_id = record.manage_information_ids[-1].company_id.id if record.manage_information_ids else ''
title_deed = record.title_information_ids[-1].title_certificate if record.title_information_ids else ''
registered_id = record.title_information_ids[-1].registered_id if record.title_information_ids else ''
record.registered_id = registered_id
record.company_id = company_id
record.title_deed = title_deed
record.precinct_id = precinct_id.id if precinct_id else ''
if record.manage_information_ids:
record.manage_information_ids[0].precinct_id = precinct_id.id if precinct_id else ''
record.manage_information_ids[-1].precinct_id = precinct_id.id if precinct_id else ''
def revert_change(self):
property_ids = self.env["yuthon.property"].browse(
@@ -11,8 +11,8 @@ export class CustomStatementsListController extends ListController {
openAllStatementsWizard() {
this.actionService.doAction({
type: 'ir.actions.act_window',
res_model: 'property.statements.wizard',
name: '批量对账',
res_model: 'click.reconciliation.wizard',
name: '一键对账',
view_mode: 'form',
view_type: 'form',
views: [[false, 'form']],
@@ -3,7 +3,7 @@
<field name="name">property.accounts.receivable.tree</field>
<field name="model">property.accounts.receivable</field>
<field name="arch" type="xml">
<tree editable="bottom" string="应收列表" decoration-danger = "charge_status == 'unpaid'"
<tree editable="bottom" string="应收账单" decoration-danger = "charge_status == 'unpaid'"
decoration-muted="is_reconciliation == True"
decoration-success="charge_status == 'fully_paid'" limit="20">
<header>
@@ -8,6 +8,8 @@
decoration-success="charge_status == 'fully_paid'" js_class="custom_rent_list_button" limit="20">
<field name="property_id"/>
<field name="lessee_id"/>
<field name="admin_id"/>
<field name="company_id"/>
<field name="due_date"/>
<field name="original_amount"/>
<field name="discount_amount"/>
@@ -31,6 +33,8 @@
<field name="property_id"/>
<field name="lessee_id"/>
<group expand="0" string="group_by">
<filter name="group_admin_id" string="公司" context="{'group_by':'admin_id'}"/>
<filter name="group_company_id" string="公司" context="{'group_by':'company_id'}"/>
<filter name="group_property_id" string="物业" context="{'group_by':'property_id'}"/>
<filter name="group_lessee_id" string="承租方" context="{'group_by':'lessee_id'}"/>
</group>
+58 -17
View File
@@ -276,19 +276,11 @@
<filter name="referred_id" string="地段" context="{'group_by': 'referred_id'}"/>
</group>
<searchpanel>
<field name="property_floor_id" select="multi"/>
<field name="company_id" enable_counters="1" select="multi"/>
<field name="tenure_type" enable_counters="1" select="multi" string="权属类型"/>
<field name="precinct_id" string="所属片区" enable_counters="1" select="multi"/>
<field name="property_floor_id" select="multi"/>
<field name="property_floor_id"/>
<field name="company_id" enable_counters="1" />
<field name="tenure_type" enable_counters="1" string="权属类型"/>
<field name="precinct_id" string="所属片区" enable_counters="1"/>
</searchpanel>
<header_search>
<quick_filter string="评估状态">
<filter string="待评估" name="property_state_to" domain="[('property_state', '=', 'to')]"/>
<filter string="评估中" name="property_state_ing" domain="[('property_state', '=', 'ing')]"/>
<filter string="已评估" name="property_state_done" domain="[('property_state', '=', 'done')]"/>
</quick_filter>
</header_search>
</search>
</field>
</record>
@@ -344,21 +336,44 @@
<field name="model">yuthon.property</field>
<field name="arch" type="xml">
<tree string="管理面积报表" editable="bottom" create="false">
<field name="title_certificate"/>
<field name="title_deed" string="产权证号"/>
<field name="name"/>
<field name="rent_area"/>
<field name="management_area"/>
<field name="equity_area"/>
<field name="registered_id"/>
<field name="message_standard_id"/>
<field name="admin_id"/>
<field name="company_id"/>
<field name="tenure_type" optional="hide"/>
<button name="open_record" string="详情" type="object" class="oe_highlight"/>
</tree>
</field>
</record>
<record id="property_management_area_report_search" model="ir.ui.view">
<field name="name">property.management.area.report.search</field>
<field name="model">yuthon.property</field>
<field name="arch" type="xml">
<search string="管理面积报表">
<field name="company_id"/>
<field name="admin_id"/>
<group expand="0" string="Group By">
<filter string="权属类型" name="group_by_tenure_type" context="{'group_by': 'tenure_type'}"/>
</group>
<searchpanel>
<field name="company_id" enable_counters="1" />
<field name="tenure_type" enable_counters="1" string="权属类型"/>
<field name="precinct_id" string="所属片区" enable_counters="1"/>
</searchpanel>
</search>
</field>
</record>
<record id="management_area_report_action" model="ir.actions.act_window">
<field name="name">管理面积报表</field>
<field name="res_model">yuthon.property</field>
<field name="view_mode">tree</field>
<field name="context">{'search_default_group_by_tenure_type': True}</field>
<field name="view_id" ref="yuthon_property.yuthon_property_management_area_report"/>
<field name="search_view_id" ref="yuthon_property.property_management_area_report_search"/>
</record>
<!-- 可租面积报表 -->
@@ -373,13 +388,35 @@
<field name="vacant_duration"/>
<field name="admin_id"/>
<field name="company_id"/>
<field name="tenure_type" optional="hide"/>
</tree>
</field>
</record>
<record id="rent_area_report_search" model="ir.ui.view">
<field name="name">property.management.area.report.search</field>
<field name="model">yuthon.property</field>
<field name="arch" type="xml">
<search string="可租面积报表">
<field name="company_id"/>
<field name="admin_id"/>
<group expand="0" string="Group By">
<filter string="权属类型" name="group_by_tenure_type" context="{'group_by': 'tenure_type'}"/>
</group>
<searchpanel>
<field name="company_id" enable_counters="1" />
<field name="tenure_type" enable_counters="1" string="权属类型"/>
<field name="precinct_id" string="所属片区" enable_counters="1"/>
</searchpanel>
</search>
</field>
</record>
<record id="rent_area_report_action" model="ir.actions.act_window">
<field name="name">可租面积报表</field>
<field name="res_model">yuthon.property</field>
<field name="view_mode">tree</field>
<field name="name">可租面积报表</field>
<field name="res_model">yuthon.property</field>
<field name="view_mode">tree</field>
<field name="context">{'search_default_group_by_tenure_type': True}</field>
<field name="view_id" ref="yuthon_property.yuthon_property_rent_area_report"/>
<field name="search_view_id" ref="yuthon_property.rent_area_report_search"/>
</record>
<record id="yuthon_property_action" model="ir.actions.act_window">
<field name="name">物业</field>
@@ -387,6 +424,8 @@
<field name="view_mode">kanban,tree,form</field>
<field name="context">{'search_default_referred_id': 1}</field>
<field name="search_view_id" ref="yuthon_property_search"/>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'tree', 'view_id': ref('yuthon_property.yuthon_property_tree')})]"/>
</record>
<record id="yuthon_property_my_action" model="ir.actions.act_window">
<field name="name">我的物业</field>
@@ -395,6 +434,8 @@
<field name="domain">[('admin_id','=',uid)]</field>
<field name="context">{'search_default_referred_id': 1}</field>
<field name="search_view_id" ref="yuthon_property_search"/>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'tree', 'view_id': ref('yuthon_property.yuthon_property_tree')})]"/>
</record>
<record id="all_data_write_property" model="ir.actions.server">
<field name="name">批量导入物业信息</field>
+1
View File
@@ -74,6 +74,7 @@
'wizard/choose_contract_wizard_views.xml',
'wizard/property_reconciliation_wizard_views.xml',
'wizard/property_management_wizard.xml',
'wizard/click_reconciliation_wizard_views.xml',
'wizard/property_rental_wizard_views.xml',
'wizard/property_meeting_wizard_views.xml',
'views/property_menu_all.xml',
@@ -65,20 +65,41 @@ class PropertyBankStatements(models.Model):
def _get_reconciliation_vals(self, record):
if record.name:
bank_id = self.env['property.bank.line'].search([('bank', '=', record.name)])
dt = datetime.strptime(str(self.start_time), '%Y-%m-%d %H:%M:%S').date()
bank_id = self.env['property.bank.line'].search([('bank', '=', record.name)], limit=1)
first_day = dt.replace(day=1)
last_day = first_day + relativedelta(months=1) - relativedelta(days=1)
total_rent_month = 0
if bank_id:
tenant_id = bank_id.tenant_id
# 应收租金
rent_ids = self.env['property.rent.list'].search([('lessee_id', '=', tenant_id.id)])
rent_ids = self.env['property.rent.list'].search([
('lessee_id', '=', tenant_id.id),
('due_date', '>=', fields.Date.to_string(first_day)),
('due_date', '<=', fields.Date.to_string(last_day)),
])
# 应收押金
deposit_ids = self.env['property.deposit.list'].search([('lessee_id', '=', tenant_id.id)])
deposit_ids = self.env['property.deposit.list'].search([
('lessee_id', '=', tenant_id.id),
])
# 应收管理费
management_ids = self.env['property.management.list'].search([('lessee_id', '=', tenant_id.id)])
management_ids = self.env['property.management.list'].search([
('lessee_id', '=', tenant_id.id),
('due_date', '>=', fields.Date.to_string(first_day)),
('due_date', '<=', fields.Date.to_string(last_day)),
])
# 应收水费
water_ids = self.env['property.water.list'].search([('lessee_id', '=', tenant_id.id)])
water_ids = self.env['property.water.list'].search([
('lessee_id', '=', tenant_id.id),
('due_date', '>=', fields.Date.to_string(first_day)),
('due_date', '<=', fields.Date.to_string(last_day)),
])
# 应收电费
electricity_ids = self.env['property.tariff.list'].search([('lessee_id', '=', tenant_id.id)])
electricity_ids = self.env['property.tariff.list'].search([
('lessee_id', '=', tenant_id.id),
('due_date', '>=', fields.Date.to_string(first_day)),
('due_date', '<=', fields.Date.to_string(last_day)),
])
def create_reconciliation_vals(ids, collection_type_val, sequence_val):
"""
@@ -95,7 +116,6 @@ class PropertyBankStatements(models.Model):
'repair_fee': '维修费',
'other': '其他'
}
nonlocal total_rent_month
vals_list = []
current_sequence = sequence_val
@@ -200,19 +220,6 @@ class PropertyBankStatements(models.Model):
all_vals, total_rent_month = self._get_reconciliation_vals(record)
return self._get_context_and_action(record, all_vals, total_rent_month)
def button_all_reconciliation(self):
statements_ids = self.env["property.bank.statements"].browse(self._context.get('active_ids', self._context.get('active_id')))
total_all_vals = []
grand_total_rent_month = 0
for record in statements_ids:
all_vals, total_rent_month = self._get_reconciliation_vals(record)
total_all_vals.extend(all_vals)
grand_total_rent_month += total_rent_month
if statements_ids:
first_record = statements_ids[0]
return self._get_context_and_action(first_record, total_all_vals, grand_total_rent_month)
return None
def put_button(self):
form_id = self.env.ref('yuthon_property_approval.view_property_accounts_approval_form').id
bank_list = []
@@ -258,6 +265,8 @@ class PropertyAccountsReceivable(models.Model):
_inherit = 'property.accounts.receivable'
contract_id = fields.Many2one('property.lease.contract', string="关联租赁合同审批")
tenure_type = fields.Selection(related='property_id.tenure_type', string="权属类型", store=True)
precinct_id = fields.Many2one(related='property_id.precinct_id', string="所属片区", store=True)
penalty = fields.Float(string="违约金")
penalty_date = fields.Date(string="违约金日期")
# 报表新增字段
@@ -414,7 +423,7 @@ class PropertyDepositList(models.Model):
'contract_id': rec.contract_id.id,
'property_id': rec.property_id.id,
'lessee_id': rec.contract_id.lessee_id.id if rec.contract_id.lessee_id else None,
'original_amount': rec.aggregate,
'original_amount': rec.original_amount,
'create_time': datetime.now(),
'management_type_id': management_type_id.id,
})
@@ -165,6 +165,14 @@ class PropertyLeaseContract(models.Model):
name_title = fields.Char(compute='_compute_name_title')
def open_record(self):
return {
'type': 'ir.actions.act_window',
'res_model': 'property.lease.contract',
'res_id': self.id,
'view_mode': 'form',
}
@api.depends('contract_code', 'name')
def _compute_name_title(self):
for record in self:
@@ -97,4 +97,5 @@ access_property_meeting_line,property_meeting_line,model_property_meeting_line,b
access_property_management_line, property_management_line,model_property_management_line,base.group_user,1,1,1,1
access_property_management_line2, property_management_line2,model_property_management_line2,base.group_user,1,1,1,1
access_property_management_wizard, property_management_wizard,model_property_management_wizard,base.group_user,1,1,1,1
access_click_reconciliation_wizard, click_reconciliation_wizard,model_click_reconciliation_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
97 access_property_management_line2 property_management_line2 model_property_management_line2 base.group_user 1 1 1 1
98 access_property_management_wizard property_management_wizard model_property_management_wizard base.group_user 1 1 1 1
99 access_click_reconciliation_wizard click_reconciliation_wizard model_click_reconciliation_wizard base.group_user 1 1 1 1
100
101
@@ -386,13 +386,14 @@
</field>
</record>
<record id="property_accounts_receivable_action" model="ir.actions.act_window">
<field name="name">应收列表</field>
<field name="res_model">property.accounts.receivable</field>
<field name="view_mode">tree</field>
<field name="context">{'group_by': 'contract_id'}</field>
<field name="name">应收账单</field>
<field name="res_model">property.accounts.receivable</field>
<field name="view_mode">tree</field>
<field name="context">{'group_by': 'contract_id'}</field>
<field name="view_id" ref="yuthon_property.view_property_accounts_receivable_tree"/>
</record>
<!-- 合同应收报表 -->
<record id="view_property_accounts_receivable_tree" model="ir.ui.view">
<record id="view_property_accounts_receivable_report_tree" model="ir.ui.view">
<field name="name">property.accounts.receivable.tree.form</field>
<field name="model">property.accounts.receivable</field>
<field name="arch" type="xml">
@@ -403,13 +404,35 @@
<field name="property_id"/>
<field name="contract_id"/>
<field name="admin_id"/>
<field name="tenure_type" optional="hide"/>
</tree>
</field>
</record>
<record id="view_property_accounts_receivable_report_search" model="ir.ui.view">
<field name="name">property.accounts.receivable.search</field>
<field name="model">property.accounts.receivable</field>
<field name="arch" type="xml">
<search>
<field name="contract_id"/>
<field name="admin_id"/>
<group expand="0" string="Group By">
<filter string="权属类型" name="group_by_tenure_type" context="{'group_by': 'tenure_type'}"/>
</group>
<searchpanel>
<field name="company_id" enable_counters="1" />
<field name="tenure_type" enable_counters="1" string="权属类型"/>
<field name="precinct_id" string="所属片区" enable_counters="1"/>
</searchpanel>
</search>
</field>
</record>
<record id="accounts_receivable_tree_action" model="ir.actions.act_window">
<field name="name">合同应收报表</field>
<field name="view_mode">tree</field>
<field name="res_model">property.accounts.receivable</field>
<field name="context">{'search_default_group_by_tenure_type': True}</field>
<field name="view_id" ref="yuthon_property_approval.view_property_accounts_receivable_report_tree"/>
<field name="search_view_id" ref="yuthon_property_approval.view_property_accounts_receivable_report_search"/>
</record>
<!-- 违约金明细报表 -->
<record id="view_property_penalty_line_report" model="ir.ui.view">
@@ -431,6 +454,7 @@
<field name="title_certificate"/>
<field name="company_id"/>
<field name="admin_id"/>
<field name="tenure_type" optional="hide"/>
</tree>
</field>
</record>
@@ -438,6 +462,9 @@
<field name="name">违约金明细报表</field>
<field name="res_model">property.accounts.receivable</field>
<field name="view_mode">tree</field>
<field name="context">{'search_default_group_by_tenure_type': True}</field>
<field name="view_id" ref="yuthon_property_approval.view_property_penalty_line_report"/>
<field name="search_view_id" ref="yuthon_property_approval.view_property_accounts_receivable_report_search"/>
</record>
<!--本月实收报表-->
<record id="view_property_received_month_report" model="ir.ui.view">
@@ -451,6 +478,7 @@
<field name="delivered1" string="金额"/>
<field name="company_id"/>
<field name="admin_id"/>
<field name="tenure_type" optional="hide"/>
</tree>
</field>
</record>
@@ -458,6 +486,9 @@
<field name="name">本月实收报表</field>
<field name="res_model">property.accounts.receivable</field>
<field name="view_mode">tree</field>
<field name="context">{'search_default_group_by_tenure_type': True}</field>
<field name="view_id" ref="yuthon_property_approval.view_property_received_month_report"/>
<field name="search_view_id" ref="yuthon_property_approval.view_property_accounts_receivable_report_search"/>
</record>
<!--累计欠收 -->
<record id="view_property_accumulated_underpayment_report" model="ir.ui.view">
@@ -465,7 +496,15 @@
<field name="model">property.accounts.receivable</field>
<field name="arch" type="xml">
<tree string="累计欠收">
<field name="rent_owed"/>
<field name="contract_id" string="合同编号"/>
<field name="property_id"/>
<field name="lessee_id"/>
<field name="management_area"/>
<field name="delivered1"/>
<field name="submitted"/>
<field name="due_date"/>
<field name="company_id"/>
<field name="tenure_type" optional="hide"/>
</tree>
</field>
</record>
@@ -473,6 +512,9 @@
<field name="name">累计欠收报表</field>
<field name="res_model">property.accounts.receivable</field>
<field name="view_mode">tree</field>
<field name="context">{'search_default_group_by_tenure_type': True}</field>
<field name="view_id" ref="yuthon_property_approval.view_property_accumulated_underpayment_report"/>
<field name="search_view_id" ref="yuthon_property_approval.view_property_accounts_receivable_report_search"/>
</record>
<record id="all_button_accounts_receivable" model="ir.actions.server">
<field name="name">批量生成违约金</field>
@@ -501,13 +543,6 @@
<button name="button_reconciliation" type="object" string="对账" class="btn btn-primary" invisible="is_reconciliation"/>
</xpath>
</field>
</record>
<record id="all_data_property_bank_statements" model="ir.actions.server">
<field name="name">批量对账</field>
<field name="model_id" ref="yuthon_property.model_property_bank_statements"/>
<field name="binding_model_id" ref="yuthon_property.model_property_bank_statements"/>
<field name="state">code</field>
<field name="code">action = model.button_all_reconciliation()</field>
</record>
<!-- 违约金 -->
<record id="inherit_view_property_penalty_list_tree" model="ir.ui.view">
@@ -766,17 +766,37 @@
<field name="unit_price"/>
<field name="rent" string="租金"/>
<field name="admin_id"/>
<field name="company_id" string="公告"/>
<field name="company_id" string="公司"/>
<button name="open_record" string="详情" type="object" class="btn-primary"/>
</tree>
</field>
</record>
<record id="yuthon_property_rented_area_report_search" model="ir.ui.view">
<field name="name">yuthon.property.rented.area.report.search</field>
<field name="model">property.lease.contract</field>
<field name="arch" type="xml">
<search string="已租面积报表">
<field name="admin_id"/>
<field name="company_id"/>
<field name="tenure_type"/>
<group expand="0" string="Group By">
<filter string="权属类型" name="group_by_tenure_type" context="{'group_by': 'tenure_type'}"/>
</group>
<searchpanel>
<field name="company_id" enable_counters="1" />
<field name="tenure_type" enable_counters="1" string="权属类型"/>
<field name="precinct_id" string="所属片区" enable_counters="1"/>
</searchpanel>
</search>
</field>
</record>
<record id="rented_area_report_action" model="ir.actions.act_window">
<field name="name">已租面积报表</field>
<field name="res_model">property.lease.contract</field>
<field name="view_mode">tree</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'tree', 'view_id': ref('yuthon_property_approval.yuthon_property_rented_area_report')}),
]"/>
<field name="context">{'search_default_group_by_tenure_type': True}</field>
<field name="view_id" ref="yuthon_property_approval.yuthon_property_rented_area_report"/>
<field name="search_view_id" ref="yuthon_property_approval.yuthon_property_rented_area_report_search"/>
</record>
<record id="property_lease_contract_message_action" model="ir.actions.act_window">
<field name="name">合同管理</field>
@@ -365,7 +365,7 @@
action="property_penalty_line_report_action"/>
<menuitem id="property_received_month_report_menu"
sequence="50"
name="本月应收"
name="本月实收"
parent="yuthon_property.yuthon_property_science_menu"
action="property_received_month_report_action"/>
<menuitem id="accumulated_underpayment_report_report_menu"
+2 -1
View File
@@ -5,4 +5,5 @@ from . import property_add_wizard
from . import property_physical_wizard
from . import property_reconciliation_wizard
from . import property_meeting_wizard
from . import property_management_wizard
from . import property_management_wizard
from . import click_reconciliation_wizard
@@ -0,0 +1,17 @@
from odoo import models, fields, api, _, SUPERUSER_ID
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta
class ClickReconciliationWizard(models.Model):
_name = 'click.reconciliation.wizard'
message = fields.Text(string='确认信息', readonly=True)
def action_confirm(self):
statements_ids = self.env["property.bank.statements"].search([('bank_state', '=', 'not_reconciled')])
for record in statements_ids:
all_vals, total_rent_month = record._get_reconciliation_vals(record)
# 更新对账状态
if total_rent_month == record.original_amount:
record.bank_state = 'reconciled'
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="click_reconciliation_wizard_form" model="ir.ui.view">
<field name="name">click.reconciliation.wizard.form</field>
<field name="model">click.reconciliation.wizard</field>
<field name="arch" type="xml">
<form string="一键对账">
<group>
<field name="message" string="你确认要一键对账吗" readonly="1"/>
</group>
<footer>
<button name="action_confirm" string="确认" type="object" class="oe_highlight"/>
<button string="取消" class="oe_link" special="cancel"/>
</footer>
</form>
</field>
</record>
</odoo>
@@ -36,8 +36,9 @@ class PropertyReconciliationWizard(models.Model):
remaining_amount -= line.amount # 更新剩余金额
# 检查是否违约
if line.due_date and self.actual_date:
# 计算应收日期的下月1号
if(line.due_date and self.actual_date and
line.collection_type != 'deposit'):
# 计算应收日期的下月1号
next_month_first = (fields.Date.from_string(line.due_date) + relativedelta(months=1)).replace(day=1)
# 如果实收日期晚于下月1号,产生违约
@@ -2,6 +2,8 @@ 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 calendar
class PropertyRentalWizard(models.Model):
_name = 'property.rental.wizard'
@@ -133,20 +135,6 @@ class PropertyRentalWizard(models.Model):
if start_year_month <= date_field_year_month < end_year_month:
self.create_rent_list(record, rent_id, adjusted_rent, start_date, multiplier)
self.create_management_list(record, start_date)
elif start_year_month <= date_field_year_month <= end_year_month:
if rent_id.end_data.day < days:
self.create_rent_list(record, rent_id, adjusted_rent, rent_id.start_data,multiplier)
self.create_management_list(record, start_date)
# 尝试处理下一个租金分解
rent_ids = record.breakdown_ids
current_index = rent_ids.ids.index(rent_id.id)
try:
next_rent_id = rent_ids[current_index + 1]
adjusted_rent_next = ( next_rent_id.period_rent if period_month else next_rent_id.monthly_amount) * multiplier
self.create_rent_list(record, next_rent_id, adjusted_rent_next, next_rent_id.start_data,multiplier)
self.create_management_list(record, start_date)
except (IndexError, ValueError):
pass
def get_multiplier(self, cycle_dict):
"""根据周期类型返回相应的租金乘数"""
@@ -158,12 +146,16 @@ class PropertyRentalWizard(models.Model):
def confirm(self):
"""主逻辑入口"""
records = self.env['property.lease.contract'].search(
[('cycle_dict', 'in', ['monthly', 'quarter', 'half', 'year'])])
year, month = int(self.select_year), int(self.select_month)
date_field = datetime(year, month, 1).date()
date_field_year_month = date_field.strftime('%Y-%m')
# 获取当月第一天和最后一天
first_day = datetime.strptime(date_field_year_month, '%Y-%m').date() # 当月第一天
last_day = (first_day + relativedelta(months=1, days=-1)) # 当月最后一天
records = self.env['property.lease.contract'].search([
('actual_start_time', '<=', last_day),
('actual_end_time', '>=', first_day)
])
for record in records:
date_data = {
'five': 5,
@@ -364,6 +364,8 @@
<field name="model">hr.payslip</field>
<field name="arch" type="xml">
<tree string="我的薪资" create="false" delete="false" edit="false">
<button name="payslip_wizard" string="发送" type="object" class="oe_highlight" invisible="confirm_status == 'confirm'"/>
<button name="open_archive_record" string="详情" type="object" class="oe_highlight" invisible="confirm_status == 'confirm'"/>
<field name="employee_id" optional="show"/>
<field name="actual_salary" decoration-danger="1" decoration-bf="1" optional="show"/>
<field name="total_before_tax" decoration-danger="1" decoration-bf="1" optional="show"/>
@@ -374,8 +376,6 @@
<field name="is_salary_release" column_invisible="1"/>
<field name="is_salary_push" column_invisible="1"/>
<field name="confirm_status"/>
<button name="payslip_wizard" string="发送" type="object" class="oe_highlight" invisible="confirm_status == 'confirm'"/>
<button name="open_archive_record" string="详情" type="object" class="oe_highlight" invisible="confirm_status == 'confirm'"/>
</tree>
</field>
</record>