117 lines
5.0 KiB
Python
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) |