2013-04-10 2 views
0

반복되는 인보이스 생성과 관련된 PHP 코드 작업 중입니다. 나는 논리를 통해 생각할 도움이 필요합니다. 궁극적으로 필자는 일종의 Insert/Select 문으로 끝날 것이라고 생각합니다. 궁극적으로 여기서 생성되는 PHP 코드는 야간에 cron으로 실행됩니다.필드 및 로직을 변경하여 select 문을 삽입 하시겠습니까?

먼저, 참조 테이블에 대한 내 테이블 항목 중 일부를 보여주고 그들이하는 일에 대해 설명합니다. 이 테이블은 Invoice라고하며 다른 테이블이 연관되어 있지만이 테이블의 논리를 이제 손톱에 넣을 수 있다면 다른 테이블에 적용 할 수 있다고 생각합니다.

ID =이 항목은 자동으로 증가하는 기본 키이며 인보이스 번호가됩니다.

되풀이 = 이것은 인보이스가 한 번 또는 반복되는지 여부입니다. O = 한 번, M = 월간 등

recurred = 이것은 삽입시 N으로 설정되며 테이블에 생성 될 다음 되풀이되는 송장이이 기준에 따라야하는지 확인하기 위해 사용하는 논리입니다 송장 여부. 새로운 되풀이 송장이 테이블에 삽입되면, 이것은 Y로 변경되어 cron 작업에 의해 다시 처리되지 않습니다.

date = 청구서가 삽입/생성 된 날짜입니다. 예를 들어, 인보이스 작성일이 이번 달의 15 일인 경우 작성된 ​​다음 인보이스는 다음 달 15 일이됩니다. 본질적으로 M은 월간을 나타냅니다. 그러나 나는 31 일의 창조 날짜에 대해 무엇을해야하는지 아직 알지 못했지만 다음 달에는 30 일 밖에 안 남았고 여기서 도움을 얻을 수있었습니다.

여기 내 논리가 있습니다. 첫째, ((mysql_error를))를 O가 아닌 모든 행을 찾기 위해 쿼리를 실행하고 재발 = N.

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

= 'N'을 ") 또는 죽을;

다음, 나는 각 작업 등, 분기 별 월별, Q에 대한 M을 반복의 종류 .. 분명히 그

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) chang을 다루는 insert select 문 ed 변수 및 2.) 인보이스가 한 달의 31 일에 생성되고 다음 달에만 30 일 (또는 28 일) 만있는 날짜 처리 방법.

SELECT *, DATEDIFF(`date`, NOW()) as diff FROM invoice WHERE recuring != 'O' 
AND recured = 'N' AND diff >= 30; 

으로 반복 그 목록을 통해 함께 계산하여 각 행에 대해 새로운 날짜를 사용 :

답변

1

다시 삽입해야하는 행만을 가지고

$newDate = date("Y-m-d", strtotime($oldDate+" +1 month")); 

이 해결해야 당신의 달 문제의 30 일.

이제 새로 생성 된 데이터를 삽입하십시오.

또한 recum 필드에 열거 형을 사용하고 recured에는 부울 값을 사용하는 것이 좋습니다.

+0

감사 월 값을 변경합니다. enum과 boolean이 무슨 뜻인지 확실치 않습니다. 당신은 정교 할 수 있습니까? – Tom

+0

Avetis, 나는 월간 (M) 분기 별 (Q) 반기 단위 (S) 연감 (A)에 대한 계산을해야 할 것입니다. diff> = 30을 추가 한 이후로 각 유형에 대해이 쿼리를 실행하도록 권장합니까? 아니면 한 번 실행하고 모든 것을 얻고 if 문으로 정렬해야합니까? – Tom

+0

enum과 boolean에 관해서는 O, Y, N, M이라는 글자를 "문자열"로 사용하여 데이터베이스에 문제가있는 것을 식별하고 논리에 따라 유형을 변경해야하므로 예/아니오가 필요한 경우 field of typo는 여러 가지 옵션 (예 : monthly/quarterlu/daily)이있는 경우 부울 (true/false)이어야하며 필드의 유형은 enum (일일, 월간 .eg)이라는 정확한 이름을 가질 수있는 열거 형이어야하며 모두 더 효율적으로 일합니다. –

0

나는 비슷한 용도로 만들었습니다. 필자의 경우 실제 송장과 반복 송장이라는 두 개의 테이블이있었습니다. 되풀이 테이블에는 다음 송장을 생성해야하는 날짜 인 NextDate라는 필드가있었습니다. 일회 송장이 인보이스 테이블에 직접 추가됩니다. 그렇지 않으면 cron 작업이 되풀이 테이블을 검색하고 NextDate 값을 확인합니다.그것이 과거의 경우 새로운 송장이 송장 테이블에 생성되고 NextDate가 업데이트됩니다 (일반적으로 월별로 증가). 월별로 증가 내 경우

나는 그것을 시도 줄 것이다, MySQL의 예를 들어 만 1로

DATE_ADD('2008-01-31', INTERVAL 1 MONTH) --> 2008-02-29 
+0

나는 nextdate 필드에 대한 아이디어를 좋아해 Avetis의 제안과 함께 사용할 수 있습니다. – Tom

+0

역순으로 갈 경우 어떻게됩니까? 2013 년 1 월 31 일 인보이스로 시작하십시오. 생성 된 다음 인보이스는 2-28-2013입니다. 다음은 어떤 모습일까요? 3-31-2013일까요? – Tom

+0

나는 안전한 내기가 원래 날짜 (1-31-2013)를 사용하고 INTERVAL 1, INTERVAL 2 등을 수행하는 것이라고 생각합니다. – Riho

관련 문제