首页 > 解决方案 > Django 重复记录/付款计算

问题描述

我有一张“预期付款”表,可以是一次性付款,也可以是每月、每季度或每年定期付款。目标是计算未来 12 个月每个月的预期付款总额。

模型看起来像:

class ExpectedPayment(models.Model):
    id = models.BigIntegerField(primary_key=True)
    period = models.BigIntegerField()
    date_start = models.DateField(blank=True, null=True)
    date_end = models.DateField(blank=True, null=True)
    amount = models.DecimalField(max_digits=1000, decimal_places=1000)

期间 1 = 每月循环
期间 2 = 每季度 - 开始日期之后。(所以从 2 月开始,下一个季度是 5 月)
第 3 期 = 每年重复 - 同样在开始日期之后 第
4 期 = 一次性付款

如何正确计算每个月的总“金额”,同时考虑何时付款?特别是季度付款..

我无法弄清楚付款何时开始和结束时如何合并,因为它可能已经在一年中开始,3个月后结束或者已经完成。当季度总是相对于它的 start_date 时,我怎么知道季度应该算作预期付款的月份。

单月示例:(当月有效的每月付款)

start_of_current_month = datetime.today().replace(day=1)
current_month_expected_monthly_payments = ExpectedPayment.objects.filter(period=1, date_start__lte=start_of_current_month, date_end__gte=start_of_current_month).aggregate(total=Sum("amount"))

标签: pythondjangodjango-queryset

解决方案


假设对于每个给定的时期,付款是在时期开始时收取的。例如 - 对于从 2 月开始的季度付款,2 月、3 月和 4 月的金额将在 2 月本身收取。对于报告,您希望将金额报告为金额/3,因为您希望按月报告。这是我的想法-对于每个时期,您都可以使用注释来计算金额-

ExpectedPayment.objects.filter(
    date_start__lte=start_of_current_month,
    date_end__gte=start_of_current_month
    ).annotate(
         monthly_amount = Case(
             When(period=2, then=F('amount')/3,
             When(period=3, then=F('amount')/12,
             default=F('amount')
    )).aggregate(monthly_sum = Sum(F('monthly_amount'))

由于您每月报告金额,因此您不需要单独的每月付款案例。对于一次性付款,如果交易发生在当月,金额将被考虑。因此,这些案例不需要单独的案例。

我在这里参考了文档:

这是一个使用注释和聚合的问题,我认为您可能会发现它很有用。


推荐阅读