0

私は、定期的な請求書の作成に関係するいくつかの php コードに取り組んでいます。ロジックを考えるのに助けが必要です。最終的には、一種の Insert/Select ステートメントになると思います。ここで最終的に生成される php コードは、夜間の cron で実行されます。

まず、参照フレームとしてテーブル アイテムのいくつかを示し、それらが何をするかについて少し説明します。このテーブルは Invoice と呼ばれ、それに関連付けられた他のテーブルがありますが、この 1 つのテーブルのロジックを理解できれば、他のテーブルにも適用できると思います。

ID = これは、自動インクリメントされる主キーであり、たまたま請求書番号でもあります。

recurring = これは、請求書が 1 回限りか定期的かを示します。O=1回、M=毎月など

recurred = これは挿入時に N に設定され、テーブルに作成される次の定期的な請求書がこの請求書に基づいているかどうかを確認するために使用しているロジックです。新しい定期請求書がテーブルに挿入されると、これは Y に変更されるため、cron ジョブによって再度処理されません。

date = これは、請求書が挿入/作成された日付です。たとえば、請求書が作成された日付が今月の 15 日の場合、次に作成される請求書は翌月の 15 日になります。基本的に M は月次を表します。ただし、31日の作成日をどうするかはまだわかりませんが、翌月には30日しかないため、ここで助けを借りることができます.

だからここに私の論理があります。まず、クエリを実行して、O ではなく繰り返し = 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.) 変更された変数を処理するための挿入選択ステートメントを作成する方法と、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 日の問題が解決するはずです。

新しく作成したデータを挿入します。

また、recured フィールドには enum を使用し、recured には boolean を使用することをお勧めします。

于 2013-04-10T20:26:22.850 に答える
0

私はやや似たようなアプリケーションを作成しました。私の場合、実際の請求書と定期的な請求書の 2 つのテーブルがありました。定期的なテーブルには、NextDate と呼ばれる 1 つのフィールドがありました。これは、次の請求書を作成する日付です。1 回限りの請求書は請求書テーブルに直接追加されます。それ以外の場合、cron ジョブは繰り返しテーブルをスキャンし、NextDate 値をチェックします。過去の場合は、新しい請求書が請求書テーブルに生成され、NextDate が更新されます (通常は月ごとに増分されます)。

私の場合、月ごとにインクリメントすると、月の値が 1 だけ変わります。たとえば、MySQL では

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