开票和订阅的应用程序逻辑?

时间:2010-12-15 19:11:54

标签: mysql logic subscription invoices

我们正处于为我们的客户提供订阅的网络应用程序的规划阶段。订阅期有所不同,可以由我们的客户无限期延长,但始终至少一个月(30天)。

当客户注册时,客户信息(账单地址,电话号码等)存储在customers表中,并在subscriptions表中创建订阅:

id    |    start_date    |     end_date    | customer_id
--------------------------------------------------------
1     |    2010-12-31    |     2011-01-31  | 1

每个月我们都会循环遍历subscriptions表(最好是cronjob),并为过去的订阅期创建发票,这些发票存放在他们自己的表格中invoices。根据客户的不同,发票可以手动打印出来并通过邮件发送,或者只是通过电子邮件发送给客户。

由于我们的客户和产品的性质,我们需要提供各种不同的付款方式,包括电汇和信用卡付款,因此某些发票可能需要手工处理并注册为我们的员工支付。

每个月的第15天,invoices表都会循环播放,如果没有为实际发票标记付款,则相应的订阅将被删除。如果已注册付款,则end_date表中的subscriptions会再增加30天(或现在我们客户选择的时间段)。

我们是否通过增加日期前进和后退来处理非付费客户和扩展订阅?随着客户扩展订阅,添加新订阅会更好吗?

4 个答案:

答案 0 :(得分:5)

我认为只要您只有一个订阅类型,就不需要为单个客户创建多个订阅记录。如果结算周期始终是固定价格的月度,则更改订阅end_date就足够了。您需要知道的是,当他的订阅用完时,您可以停止开具发票。因此,如果他扩展了他的订阅,您只需更新一个记录,以便下个月恢复结算。

另外,我认为标记未付费订阅而不是删除订阅会更好。如果客户错过了每月付款,请将订阅标记为未付款,以便停止将来的发票(和服务)。当/如果他们付款,您取消订阅,以便恢复服务/下个月的发票。

答案 1 :(得分:5)

我所处理的其中一个应用程序遇到了这个问题,我们通过跟踪用户的订阅来解决问题,但跟踪到期日期。然后,我们跟踪他们应该在他们的帐户上收费的日期 - 所以,如果我们想看看有人在哪个订阅,我们可以只检索他们帐户的最新订阅记录,如果我们想看到下次他们被收费时,我们只需检查他们的next_bill_date

通过这种方式,您可以跟踪用户的订阅并查看他们何时升级/降级,但您的结算代码保持简单 - 您永远不必担心重叠(因为订阅没有结束日期到处理)。

答案 2 :(得分:3)

我会使用订阅表来跟踪订阅。 这意味着,当客户扩展其订阅时,会插入新记录。

此外,我会在customer表中添加一个subscription_end日期列,以便在插入新订阅时通过触发器进行更新。

虽然这是非规范化,但这种方法将允许您的Web应用程序在没有任何连接的情况下检查客户对服务的访问权限(减少数据库服务器负载)。 实际上,只有批处理才能查询订阅表。

此外,保留订阅历史记录可能很有用

  • 如与客户有争议
  • 如果企业的业务逻辑发生变化(例如根据保真度给予最佳客户折扣)
  • 以供将来统计

当您的用户群和订阅历史记录变得庞大时,您可以决定通过以方便的格式导出来定期备份(我将始终使用xml,但我使用首选csv的某些企业)。

答案 3 :(得分:2)

为了跟踪单个客户的订阅历史记录,我会说最好添加新的订阅。

你也可以省去头痛的问题,为什么1月30日订购的订阅会在3月到期(你知道,2月是最短的月份......)。