python - 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"))
解决方案
假设对于每个给定的时期,付款是在时期开始时收取的。例如 - 对于从 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'))
由于您每月报告金额,因此您不需要单独的每月付款案例。对于一次性付款,如果交易发生在当月,金额将被考虑。因此,这些案例不需要单独的案例。
我在这里参考了文档:
这是一个使用注释和聚合的问题,我认为您可能会发现它很有用。
推荐阅读
- xamarin - Xamarin:我可以在不使用 Google Maps API 的情况下使用地图吗?
- ios - iOS 设计:TableViews 还是其他?
- jquery - jQuery scroll() 方法在 pagepiling.js 上不起作用
- shell - Shell脚本:获取日期作为变量
- jquery - JQuery toggleClass 不适用于动态数据
- android - 我可以选择未附加到布局的微调器项目吗?它在 Spinner.MODE_DIALOG
- python - 比较具有熊猫字符串列表的两列
- javafx - JavaFX 任务 updateValue 抛出 IllegalStateException:不在 FX 应用程序线程上
- csv - 读取缺少列和随机列顺序的 csv 文件
- ruby-on-rails - Rails/Ruby:将查询结果转换为多级哈希