生成发票

时间:2011-06-11 12:20:33

标签: php database e-commerce shopping-cart billing

我想每两周创建一张发票。发票可以包含1到15和16到31 order_date之间的1个或多个订单。这样做的方式是什么?

假设表格设计为:

order table
- order_id (PK)
- user_id (FK)
- total
- status
- order_date
- invoice_id (FK, default is 0)

invoice table
- invoice_id (PK)
- invoice_date
- total (total of all orders that is linked to order.invoice_id)
- status (Paid, Unpaid, etc)

//order.invoice_id can have multiple same invoice id

第一个解决方案:

每2周通过Crob Job运行一次。它扫描订单表(找到1到15或16到31之间的order_date,状态= 1),然后添加到发票表中,然后更新订单.invoice_id

如果今天日期是2010年6月11日,那么它将在发票表中插入一行,invoice_date将在2010年6月1日.PHP将在添加行之前检查invoice_date,如果它已经存在则会更新order.invoice_id代替。

第二个解决方案:

从后端手动将order.status更改为1,然后它将执行与“First Solution”类似的功能(除了Cron Job)

伪代码:

NowDate = Date();

//Invoice Date can be 01 or 16 date current month
InvoiceDate = InvoiceDate(NowDate)

if (there is invoice for InvoiceDate) {
  invoiceNumber = getNumber(invoice)
} else {
  invoiceNumber = new Invoice(InvoiceDate)
}
new Order(invoiceNumber, orderitems)

哪个会更好,还是有其他更好的解决方案?

1 个答案:

答案 0 :(得分:2)

我真的很喜欢cron的日程安排。它做了一件事,它做得很好。

计划任务非常理想的另一个设计方面是idempotent,这意味着您可以再次运行它而不会造成任何损害。

在您的情况下,这意味着您的更新/插入必须处理已经运行了一段时间。你想要这个的原因首先是防御(如果它意外重新运行)和健壮(如果你需要重新运行它)