Files
gzth/yuthon_report/models/overdue_amount_report.py
T
2026-03-02 11:40:42 +08:00

117 lines
5.0 KiB
Python

import datetime
from odoo import fields, models, api
class OverdueAmountReport(models.Model):
_inherit = 'property.accounts.receivable'
@api.model
def get_overdue_report(self, params):
domain = [('is_reconciliation', '=', False)]
if params.get("date_start"):
date_start = datetime.datetime.fromisoformat(params.get("date_start")).date()
domain.append(("due_date", ">=", date_start))
if params.get("date_end"):
date_end = datetime.datetime.fromisoformat(params.get("date_end")).date()
domain.append(("due_date", "<=", date_end))
condition = params.get('condition', False)
partner_id = params.get('partner_id', False)
company_id = params.get('company_id', False)
management_type_id = params.get('management_type_id', False)
if condition:
domain.append(('tenure_type', '=', condition))
if partner_id:
domain.append(('precinct_id', '=', partner_id))
if company_id:
domain.append(('company_id', '=', company_id))
if management_type_id:
domain.append(('management_type_id', '=', management_type_id))
receivables = self.search(domain)
sum_dict = {}
type_totals = {}
for rec in receivables:
# 提取基础数据
property_name = rec.property_name or ""
total_area = f"{rec.contract_id.total_area} ㎡" if rec.contract_id and rec.contract_id.total_area else "0 ㎡"
lessee_name = rec.lessee_id.name if (rec.lessee_id and rec.lessee_id.name) else ""
contract_code = rec.contract_id.contract_code if rec.contract_id else ""
rent = round(rec.contract_id.rent, 2) if (rec.contract_id and rec.contract_id.rent) else 0.0
submitted = round(rec.submitted, 2) if rec.submitted else 0.0
due_month = rec.due_date.strftime("%Y-%m-%d") if rec.due_date else ""
management_type_id = rec.management_type_id.name if rec.management_type_id else "未分类"
lessor_referred = rec.contract_id.lessor_id.referred if rec.contract_id and rec.contract_id.lessor_id and hasattr(rec.contract_id.lessor_id, 'referred') else rec.contract_id.lessor_id.name if rec.contract_id and rec.contract_id.lessor_id else ""
admin_name = rec.contract_id.admin_id.name if rec.contract_id and rec.contract_id.admin_id else ""
# 统计每个管理类型的合计
if management_type_id not in type_totals:
type_totals[management_type_id] = {'amount': 0.0, 'arrears': 0.0}
type_totals[management_type_id]['amount'] += rent
type_totals[management_type_id]['arrears'] += submitted
# 构建唯一标识key(合同编号 + 欠费日期)
key = (contract_code, due_month)
if key in sum_dict:
sum_dict[key]["金额"] += rent
sum_dict[key]["欠费金额"] += submitted
else:
sum_dict[key] = {
"应收类型": management_type_id,
"物业名称": property_name,
"面积": total_area,
"承租方": {
'model': 'property.tenant.information',
'id': rec.lessee_id.id,
'display_name': rec.lessee_id.name,
} if rec.lessee_id else "",
"合同编号": {
'model': 'property.lease.contract',
'id': rec.contract_id.id,
'display_name': rec.contract_id.contract_code,
} if rec.contract_id else "",
"金额": rent,
"欠费金额": submitted,
"欠费月份": due_month,
"所属公司": lessor_referred,
"管理员": admin_name
}
rows = []
total_amount = 0.0
total_arrears = 0.0
for idx, item in enumerate(sum_dict.values(), start=1):
rows.append({
"序号": idx,
**item
})
total_amount += item["金额"]
total_arrears += item["欠费金额"]
summary_stats = []
for type_name in sorted(type_totals.keys()):
summary_stats.append({'name': type_name, 'amount': round(type_totals[type_name]['arrears'], 2)})
summary_stats.append({'name': '总合计', 'amount': round(total_arrears, 2)})
return {"rows": rows, "stats": summary_stats}
@api.model
def get_domain(self, start_date=False, end_date=False, company_id=False):
if not start_date or not end_date:
return []
if not company_id:
return []
# 这里进行条件的修改
property_records = self.env['yuthon.property'].search([('company_id', '=', company_id)])
user_ids = set()
for property_record in property_records:
user_ids.add(property_record.precinct_id.id)
return list(user_ids)