2010-03-08 81 views
5

我的网站将有一个基本上像信用卡一样的信用系统。每个用户都有无限的信用额度,但在每周结束时,他们必须付清。例如,用户可能会在3月1日至7日之间进行多次购物,然后在3月7日结束时,他们会通过电子邮件发送一张发票,其中列出了一周内的所有购买情况以及14日前的购买总额。如果他们没有付清,他们的账户将被停用,直到他们退出。我只是试图围绕如何实现这一点。信用卡系统实施?

我有他们所有的购买清单,这不是问题,但我只是想弄清楚如何处理它。在第七天结束时,我可以设置一个cronjob来生成一张发票,该发票基本上有一个id和到期日期,然后我需要另一个多对多的表来将所有购买链接到发票。那么当用户向他们的账户添加资金时,我想这是针对他们当前的未结发票应用的?而且,如果他们在新发票发行时没有还清发票,那么现在他们有两个未完成的发票,我怎么知道该应用哪一个发票?或者,我是否对以前未完成的发票进行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设置在每晚午夜运行到利息费用添加到所有过期项和发票寄出每周五上午。

回答

10

这里描述的内容基本上是未清项目会计和余额远期会计之间的决定。

在未清项目会计中,每个发票在欠款余额时都保持“打开”状态,付款归因于他们正在支付的个人发票。这样可以更容易地计算出感兴趣的事情 - 例如,如果您只收取30天以上的余额,那么您需要知道哪些发票的结余超过30天。

余额远期会计与信用卡付款类似,只有一笔结转余额结转到总余额中,而不是单个发票。

更新澄清

开放项目会计是好复杂的计费流程,例如,当只有部分产品连接到特定的发票。例如,建筑商购买几十种产品,但要分别开具发票给三个不同的建筑项目。

当您需要跟踪每个单独的发票以进行支付和争议解决时,也会使用未清项目会计。例如,建筑物供应商为客户提供建造者。有时候供应的货物是错的或有缺陷的,所以建造者支付所有其他的发票(包括最近的发票),除了单独跟踪和处理的 - 可能在提供替换货物时获得支付,或者可能获得对付发票。

在平衡远期会计中,您将通过简单地对整个帐户应用贷项来处理这种情况,然后在提供替代货物时重新添加交易。账户余额中的任何利息也可以逆转。

简单地说,这里有一个方法,你可以在你的数据库设置这些:

打开项目会计

您需要以下表格:

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] 

客户端获取创建时的发票购买产品。对于每个购买的产品,都会为该产品创建一个显示购买数量和金额的发票项目。更新发票时,发票余额为发票总额并更新客户账户余额(可以实时计算,但如果自动维护,则更容易,更快速)。当客户支付一张或多张发票时,将创建一张收据并将收款项目分配给每张正在付款的发票。发票的未付余额将根据客户的账户余额进行更新。请注意,超额付款需要单独处理。下一张发票(或单独的发票)上的利息费用作为发票项目(这可以是自定义产品)。

平衡正向会计

您需要以下表格:

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

当购买一个产品,一个交易对显示产品的数量和金额和客户的帐户进行客户的账户余额将被更新。收到货物时,客户的账户再次进行交易,并更新客户的账户余额。超额支付和利息支付只是一个交易。在开票时,您只需抓取所有未分配至发票的交易(采购,收货,利息支付等)并将其添加到新发票中。发票不会显示在交易清单中,只是为了方便跟踪已开发票的交易以及在付款时为您的客户提供参考号码。您可能还想跟踪此模型中的收据。

其他考虑

  • 这并没有考虑到总账发布,这将是一个完全不同的表。这只是为了管理会计,而不是财务会计。
  • 实际上,客户和发票之间可能会有一个项目表来跟踪每个客户与您的个别项目。
  • 这真的很简单,只是给你一个想法。毫无疑问,全面实施需要更多的表格和字段。

关于如果他们在开票时没有支付发票时会发生什么情况,在任一系统中都无关紧要 - 您无法及时回去并更改以前的会计分录。现在发生的任何事情都会在新发票上发生。当然,在新发票上注明“先前未清余额”,显示他们已经欠下的金额(或因超额付款而被抵扣)是完全合适的。

你也希望能够产生一个帐单,这不是一张发票,就像一封信提醒他们他们有未结余额。这是在没有新发票生成时使用的,但客户需要提醒他们的账户余额。

我更喜欢对我的系统进行开放式会计核算,但是从描述性平衡看,前瞻性会计听起来很合适。

+0

随着余额的前移,你无法追踪到期日是什么以及收取什么利息? – mpen 2010-03-08 21:59:25

+0

听起来像我需要与未清项目会计去知道什么时候该过期了......这将是有趣的实施!非常感谢你的帮助,希望我可以多次赞扬你。 – mpen 2010-03-09 02:46:28

+0

只需添加关于新发票的说明。如果有余额,通常会在期末余额中收取任何利息,例如您的信用卡。我使用未清项目会计,因为它可以更好地控制付款历史(您确切知道您的客户正在为什么付款,而不是将所有内容都放入一个大桶中)。但是,余额远期会计适用于诸如电话账单,信用卡等,这取决于您的使用情况。 – 2010-03-09 04:50:22