累计欠收报表
This commit is contained in:
@@ -73,8 +73,8 @@ class CumulativeArrearsReport(models.Model):
|
||||
type_totals = {}
|
||||
total_original = 0.0 # 总应收
|
||||
total_received = 0.0 # 总已收
|
||||
total_discount = 0.0 # 总减免
|
||||
total_arrears = 0.0 # 总欠收
|
||||
|
||||
for idx, rec in enumerate(receivables, start=1):
|
||||
contract = rec.contract_id
|
||||
|
||||
@@ -84,8 +84,10 @@ class CumulativeArrearsReport(models.Model):
|
||||
# 已收金额:从预先构建的映射中获取(截止查询日期的累计收款)
|
||||
received = received_amount_map.get(rec.id, 0.0)
|
||||
|
||||
# 当前欠收 = 应收 - 已收 - 减免
|
||||
# 减免金额
|
||||
discount = rec.discount_amount or 0.0
|
||||
|
||||
# 当前欠收 = 应收 - 已收 - 减免
|
||||
arrears = original - received - discount
|
||||
# 确保欠收不为负数
|
||||
if arrears < 0:
|
||||
@@ -94,16 +96,17 @@ class CumulativeArrearsReport(models.Model):
|
||||
# 累计统计
|
||||
total_original += original
|
||||
total_received += received
|
||||
total_discount += discount
|
||||
total_arrears += arrears
|
||||
|
||||
# 按类型统计
|
||||
type_name = rec.management_type_id.name if rec.management_type_id else "未分类"
|
||||
if type_name not in type_totals:
|
||||
type_totals[type_name] = {'original': 0.0, 'received': 0.0, 'arrears': 0.0}
|
||||
type_totals[type_name] = {'original': 0.0, 'received': 0.0, 'discount': 0.0, 'arrears': 0.0}
|
||||
type_totals[type_name]['original'] += original
|
||||
type_totals[type_name]['received'] += received
|
||||
type_totals[type_name]['discount'] += discount
|
||||
type_totals[type_name]['arrears'] += arrears
|
||||
|
||||
|
||||
# 计费区间(应收开始 ~ 应收结束)
|
||||
billing_period = ""
|
||||
if rec.due_date and rec.due_date_end:
|
||||
@@ -120,6 +123,7 @@ class CumulativeArrearsReport(models.Model):
|
||||
"应收类型": type_name,
|
||||
"应收金额": round(original, 2),
|
||||
"已收金额": round(received, 2),
|
||||
"减免金额": round(discount, 2),
|
||||
"当前欠收": round(arrears, 2),
|
||||
"计费区间": billing_period,
|
||||
"所属公司": contract.lessor_id.referred if contract and contract.lessor_id and hasattr(contract.lessor_id, 'referred') else contract.lessor_id.name if contract and contract.lessor_id else "",
|
||||
@@ -130,16 +134,12 @@ class CumulativeArrearsReport(models.Model):
|
||||
for type_name in sorted(type_totals.keys()):
|
||||
summary_stats.append({
|
||||
'name': type_name,
|
||||
'original': round(type_totals[type_name]['original'], 2),
|
||||
'received': round(type_totals[type_name]['received'], 2),
|
||||
'arrears': round(type_totals[type_name]['arrears'], 2)
|
||||
'amount': round(type_totals[type_name]['arrears'], 2)
|
||||
})
|
||||
summary_stats.append({
|
||||
'name': '总合计',
|
||||
'original': round(total_original, 2),
|
||||
'received': round(total_received, 2),
|
||||
'arrears': round(total_arrears, 2)
|
||||
})
|
||||
summary_stats.append({'name': '总应收', 'amount': round(total_original, 2)})
|
||||
summary_stats.append({'name': '总已收', 'amount': round(total_received, 2)})
|
||||
summary_stats.append({'name': '总减免', 'amount': round(total_discount, 2)})
|
||||
summary_stats.append({'name': '总欠收', 'amount': round(total_arrears, 2)})
|
||||
|
||||
return {"rows": rows, "stats": summary_stats}
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
{"headerName": "应收类型", "field": "应收类型", "flex": 1},
|
||||
{"headerName": "应收金额", "field": "应收金额", "flex": 1, "type": "number"},
|
||||
{"headerName": "已收金额", "field": "已收金额", "flex": 1, "type": "number"},
|
||||
{"headerName": "减免金额", "field": "减免金额", "flex": 1, "type": "number"},
|
||||
{"headerName": "当前欠收", "field": "当前欠收", "flex": 1, "type": "number"},
|
||||
{"headerName": "计费区间", "field": "计费区间", "flex": 1.5},
|
||||
{"headerName": "所属公司", "field": "所属公司", "flex": 1},
|
||||
|
||||
Reference in New Issue
Block a user