7

私のサイトには、基本的にクレジットカードのように機能するクレジットシステムがあります。各ユーザーには無制限のクレジット制限がありますが、各週の終わりに、彼らはそれを完済しなければなりません。たとえば、ユーザーが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を設定しています。請求書は、毎週金曜日の朝に郵送されます。

4

1 に答える 1

12

ここで説明しているのは、基本的にオープンアイテム会計とバランスフォワード会計の間の決定です。

未決済明細会計では、各請求書は未払いの残高がある間は「未決済」に保たれ、支払は支払っている個々の請求書に帰属します。これにより、利息などの計算が簡単になります。たとえば、30日以上経過した残高にのみ利息を請求する場合は、30日以上経過した未払いの残高がある請求書を知る必要があります。

残高転送会計は、繰り越される一括残高が1つあり、個々の請求書ではなくその合計残高に対して支払いが行われる場合のクレジットカード支払いに似ています。

明確化のための更新

未決済明細会計は、たとえば一部の製品のみが特定の請求書に添付されている場合など、複雑な請求プロセスに適しています。たとえば、建築業者は数十の製品を購入しますが、それらは3つの異なる建築プロジェクトに別々に請求されます。

未決済明細会計は、支払および紛争解決の目的で個々の請求書を追跡する必要がある場合にも使用されます。たとえば、建物の供給にはクライアント用のビルダーがあります。供給された商品が間違っているか欠陥がある場合があるため、ビルダーは他のすべての請求書(より最近の請求書を含む)を支払います。ただし、追跡されて個別に処理されるものを除きます。請求書。

バランスフォワードアカウンティングでは、アカウント全体に対してクレジットを適用し、交換品が供給されたときにトランザクションを再度追加するだけで、この状況に対処できます。残高に請求された利息は、アカウントに対して取り消すこともできます。

簡単に言うと、データベースにこれらを設定する方法は次のとおりです。

オープンアイテム会計

次のテーブルが必要です。

Client       [ClientId, Name, AccountBalance]
Product      [ProductId, Description, Cost]
Invoice      [InvoiceId, ClientId, Date, TotalAmount, Outstanding]
InvoiceItem  [InvoiceId, ProductId, Quantity, Amount]
Receipt      [ReceiptId, Date, TotalAmount]
ReceiptItem  [ReceiptId, InvoiceId, Amount]

クライアントは、製品の購入時に作成された請求書を受け取ります。購入した製品ごとに、購入した数量と金額を示す請求書アイテムがその製品に対して作成されます。請求書が更新されると、請求書の未払い残高は請求書の合計になり、クライアントアカウントの残高が更新されます(その場で計算できますが、自動的に維持されると簡単かつ迅速になります)。クライアントが1つ以上の請求書を支払うと、領収書が作成され、領収書アイテムが支払われる各請求書に割り当てられます。請求書の未払い残高は、クライアントの口座残高と同様に更新されます。過払いは個別に処理する必要があることに注意してください。利息は、次の請求書(または別の請求書)で請求書アイテム(カスタム製品の場合もあります)として発生します。

バランスフォワード会計

次のテーブルが必要です。

Client       [ClientId, Name, AccountBalance]
Product      [ProductId, Description, Cost]
Invoice      [InvoiceId, ClientId, Date, Amount]
Transaction  [TransactionId, ClientId, InvoiceId, ProductId, Date, Quantity, Amount]

製品を購入すると、クライアントのアカウントで製品の数量と金額を示すトランザクションが実行され、クライアントのアカウントの残高が更新されます。領収書が作成されると、再度クライアントのアカウントでトランザクションが行われ、クライアントのアカウント残高が更新されます。過払いと利息の支払いも単なる取引です。請求時に、請求書に割り当てられていないすべてのトランザクション(購入、領収書、利息の支払いなど)を取得し、それらを新しい請求書に追加するだけです。請求書はトランザクションリストに表示されません。これは、請求されたトランザクションを追跡し、支払い時にクライアントに参照番号を提供するためだけのものです。このモデルで領収書を追跡することもできます。

その他の考慮事項

  • これは、まったく異なるテーブルのセットとなる総勘定元帳の転記を考慮していません。これは管理会計のためだけであり、財務会計のためではありません。
  • 実際には、クライアントと請求書の間にプロジェクトテーブルがあり、各クライアントの個々のプロジェクトを追跡できます。
  • これはあなたにアイデアを与えるためだけに本当に単純です。完全な実装には、間違いなくより多くのテーブルとフィールドが必要になります。

請求時に請求書の支払いを行わなかった場合にどうなるかについては、どちらのシステムでも問題ありません。過去に戻って以前の会計エントリを変更する必要はありません。今起こったことはすべて新しい請求書に記載されます。もちろん、新しい請求書に「以前の未払い残高」という行を記入して、すでに借りている(または過払いのクレジットがある)金額を示すことは完全に適切です。

また、請求書ではなく、残高があることを知らせる手紙のような明細書を作成できるようにする必要があります。これは、生成される新しい請求書がないが、クライアントがアカウントの残高についてリマインダーを必要とする場合に使用されます。

私は自分のシステムにオープンアイテムアカウンティングを好みますが、あなたの説明から、フォワードアカウンティングはぴったりのように思えます。

于 2010-03-08T07:31:58.913 に答える