我正在编写一些与创建循环发票有关的php代码。我需要一些帮助来思考逻辑。我想最终我会得到一种Insert/Select语句。最终在这里生成的php代码将在夜间cron中运行。
首先,让我向您展示一些我的表项作为参考,并解释一下它们的作用。该表名为Invoice,还有其他表与之关联,但我认为如果我现在可以确定这一个表的逻辑,我就可以将其应用于其他表。
ID =这是自动递增的主键,也恰好是发票编号。
递归=这是发票是一次性还是递归的。O=One时间、M=Monthly等
当一个新的经常性发票插入到表中时,它将被更改为Y,这样它就不会被cron作业再次处理。
日期=这是发票插入/创建的日期。例如,如果发票的创建日期是本月15日,则下一次创建的发票将是下个月的15日。本质上,M代表每月。然而,我还没有想出如何处理31号的创建日期,但下个月只有30天,这里可能需要一些帮助。
这就是我的逻辑。首先,我运行一个查询来查找所有不是O且recurred = N的行。
$result = mysql_query("SELECT * FROM invoice WHERE recurring != 'O' and recurred= 'N'")或die(mysql_error());
接下来,我处理每种循环的M表示每月,Q表示季度,等等。
if recurring = M
if todays date day = 'date' day
copy line item into a new row with the following changes: new ID, todays date, and mark the recurred to N for the new insert (will mark the old one Y)显然,这不是实际的代码,而是我正在考虑的。
所以我的问题是1。)如何创建insert select语句来处理更改的变量和2.)如何处理日期,如果发票是在一个月的31号创建的,而下一个月只有30天(或28天)。
发布于 2013-04-11 04:26:23
只接受需要重新插入的行:
SELECT *, DATEDIFF(`date`, NOW()) as diff FROM invoice WHERE recuring != 'O'
AND recured = 'N' AND diff >= 30;遍历该列表,并对每一行使用一个新日期,计算方法为:
$newDate = date("Y-m-d", strtotime($oldDate+" +1 month"));这应该可以解决你每月30日的问题。
现在插入新创建的数据。
另外,建议使用enum表示重复字段,使用boolean表示重复出现。
发布于 2013-04-11 04:32:48
我也做过类似的申请。在我的例子中,我有两个表:实际发票和经常性发票。循环表有一个名为NextDate的字段-应创建下一张发票的日期。一次将发票直接添加到invoices表中,否则cron作业将扫描循环表并检查NextDate值。如果它是过去的,那么新的发票被生成到发票表中,并更新NextDate (通常按月递增)。
在我的示例中,按月递增只会将Month值更改1。
DATE_ADD('2008-01-31', INTERVAL 1 MONTH) --> 2008-02-29https://stackoverflow.com/questions/15934860
复制相似问题