私のサイトには、基本的にクレジットカードのように機能するクレジットシステムがあります。各ユーザーには無制限のクレジット制限がありますが、各週の終わりに、彼らはそれを完済しなければなりません。たとえば、ユーザーが3月1日から7日の間に複数の購入を行い、3月7日の終わりに、その週のすべての購入と14日までに支払われる合計をリストした請求書が電子メールで送信される場合があります。彼らがそれを完済しない場合、彼らのアカウントは彼らが完済するまで単に非アクティブ化されます。私はこれを実装する方法に頭を悩ませようとしています。
私は彼らのすべての購入のリストを持っています、それは問題ではありません、しかし私はそれをどうするかを理解しようとしているだけです。7日目の終わりに、基本的にIDと期日を持つ請求書を生成するために、cronジョブを設定できます。次に、すべての購入を請求書にリンクするために、別の多対多のテーブルが必要になります。 。次に、ユーザーがアカウントにお金を追加すると、現在の未払いの請求書に適用されると思いますか?また、新しい請求書が発行されるまでに請求書が返済されない場合、未処理の請求書が2つあるので、どちらに適用するかをどのように知ることができますか?または、cronjobで以前の未払いの請求書をチェックしてキャンセルし、新しいアイテムを「残高転送(+利息)」として新しい請求書に追加しますか??請求書に対してどのようにお金を適用しますか?各支払いは請求書にリンクする必要がありますか、それとも単にそれを彼らのアカウントクレジットに預けて、何が支払われ、何が支払われていないかをどうにかして理解することができますか?請求書が作成される前に前払いした場合はどうなりますか?生成時、または期日が到来した週末に、請求書からクレジットから差し引きますか?これを行うには非常に多くの方法があります...
誰かが彼らが取るであろうアプローチを説明できますか?
誰かが興味を持っているなら、私の請求書モデルは現在次のようになっています(Djangoで)。InvoiceItemsはリバースIDによって実際の「製品」にリンクされています(FKは製品上にあり、異なるアイテムタイプ(異なるテーブル)を許可するための請求書アイテムではありません)が、私はそれを切り替えるつもりだと思います。
class Invoice(models.Model):
user = models.ForeignKey(User, related_name='invoices')
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
closed_date = models.DateTimeField(null=True, blank=True)
due_date = models.DateTimeField(default=_next_weekday())
payment_date = models.DateTimeField(null=True, blank=True) # date the invoice was fully paid
total_payments = CurrencyField(default=0)
interest_charges = CurrencyField(default=0)
@property
def days_overdue(self):
dt = self.due_date - datetime.date.today()
return dt.days if dt.days > 0 else 0
@property
def item_total(self):
return self.items.filter(amount__gt=0).aggregate(t=Sum('amount'))['t'] or Decimal('0.00')
@property
def daily_interest(self):
return _round((self.item_total - self.total_payments) * settings.INTEREST_RATE/Decimal('365.242199'))
@property
def subtotal(self):
return self.item_total + self.interest_charges
@property
def tax(self):
return _round(self.subtotal * settings.GST)
@property
def total(self):
return self.subtotal + self.tax
@property
def balance_owing(self):
return self.total - self.total_payments
@property
def is_paid(self):
return self.payment_date != None
@property
def is_open(self):
return self.closed_date == None
@property
def is_overdue(self):
return not self.is_paid and self.due_date < datetime.date.today()
class InvoiceItem(models.Model):
invoice = models.ForeignKey(Invoice, related_name='items')
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
description = models.CharField(max_length=200)
trans_date = models.DateTimeField(verbose_name='transaction date')
amount = CurrencyField()
延滞しているすべてのアイテムに利息を追加するために、毎晩深夜に実行するようにcrontabを設定しています。請求書は、毎週金曜日の朝に郵送されます。