0

我正在处理一些与创建经常性发票有关的 php 代码。我需要一些帮助来思考逻辑。我认为最终我会得到一种插入/选择语句。最终在此处生成的 php 代码将在每晚的 cron 中运行。

首先,让我向您展示一些我的表格项目以供参考,并解释一下它们的作用。该表称为 Invoice 并且还有其他表与之关联,但我认为如果我现在可以确定该表的逻辑,我可以将其应用于其他表。

ID = 这是自动递增的主键,也恰好是发票编号。

recurring = 这是发票是一次性的还是经常性的。O=一次,M=每月等

recurred = 这将在插入时设置为 N,这是我用来查看将在表中创建的下一张定期发票是否应基于此发票的逻辑。当将新的定期发票插入表中时,这将更改为 Y,因此 cron 作业不会再次处理它。

date = 这是插入/创建发票的日期。例如,如果创建发票的日期是本月 15 日,则创建的下一张发票将是下个月 15 日。本质上,M 代表每月。但是,我还没有弄清楚如何处理 31 日的创建日期,但下个月只有 30 天,可以在这里使用一些帮助。

所以这是我的逻辑。首先,我运行一个查询来查找所有不是 O 且 recurred = N 的行。

$result = mysql_query("SELECT * FROM invoice WHERE recurring != 'O' and recurred

= 'N'") 或死(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.)如何创建插入选择语句来处理更改的变量和 2.)如果发票是在一个月的 31 日创建并且下个月只有 30 天(或28)。

4

2 回答 2

1

只取需要重新插入的行:

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 天的问题。

现在插入新创建的数据。

此外,使用枚举作为递归字段的好建议,使用布尔值作为递归字段。

于 2013-04-10T20:26:22.850 回答
0

我做了一些类似的应用程序。就我而言,我有 2 张表:实际发票和经常性发票。循环表有一个名为 NextDate 的字段 - 应创建下一张发票的日期。一次发票直接添加到发票表中,否则 cron 作业会扫描循环表并检查 NextDate 值。如果是过去,则新发票会生成到发票表中,并且 NextDate 会更新(通常按月递增)。

在我的情况下,按月递增只会将月份值更改 1。例如在 MySQL 中

DATE_ADD('2008-01-31', INTERVAL 1 MONTH)  --> 2008-02-29
于 2013-04-10T20:32:48.480 回答