2011-03-22 3 views
6

새 청구 시스템에 대한 코드를 작성했습니다. 그 목적은 매달 같은 날에 고객에게 청구하는 것입니다. (안 제 1 회 또는 월의 마지막 날)월별 결제주기에 가장 적합한 패턴

static bool NeedToBill(DateTime planLastBilled, DateTime cycleDate) 
    { 
     // is today the same date as the cycleDate AND is was the planLastBilled not the same day as today? 
     if (DateTime.UtcNow.Day.Equals(cycleDate.Day) && !DateTime.UtcNow.Day.Equals(planLastBilled)) 
      return true; 
     else 
      return false; 
    } 

2 개 개의 함정은 다음과 같습니다 자신의 cycleDate.Day는 31이며, 현재 달 만

  • cycleDate가 이십구일
  • 을 가지고

    1. 경우 2012 년 2 월 29 일 - 윤년에 대해서만 청구됩니다.

    일반적인 가장 좋은 방법은 여기에 있습니까?

    은 그래서

    1. 이미 이번 달에 청구 된이 계정을 가지고 확인하는 무리 일을있을 것 같아?

    감사 ( 트랜잭션이 전날 실패 할 경우이 이상적입니다) 사이클 날이

  • 이 사이클 일보다 크거나 현재 날짜와 동일 이번 달에 존재한다!

  • 답변

    0

    좋아, 나는 이것이 이상이라고 생각한다. 이 간단하고 모든 것을 커버 : 그것은 반드시 동일한 날에 청구하지 않습니다

    bool NeedToBill = ((DateTime.UTCNow – LastBillDate) >= 30 Days) 
    

    은, 그러나 그것은 충분히 가까이입니다. 트랜잭션이 하루 동안 거부 된 경우 또는 예약 된 작업이 다음에 실행될 때 1 일 동안 실행되지 않은 경우 융통성이 추가되어 선택됩니다.

    +4

    이거 틀림 없습니까? 청구서 발송 일을 매년 ~ 5 일로 변경하여 궁극적으로 고객에게 과금하는 것으로 보입니다 (6 년마다 1 개의 추가 청구서). 회사에 충분한 가입자가있는 경우 집단 소송에 대한 좋은 사례 인 것 같습니다. –

    +0

    DateTime.AddMonths는 윤년과 다른 EOM 날짜를 고려합니다. – gibbocool

    6

    1 - 28 사이의 청구일 선택 만 허용하십시오. 내 경험에 의하면 이것은 대부분의 신용 카드/대출 회사가 선택을 할 때 어떻게 처리 하는가입니다.

    +0

    이 방법이 효과가 있지만 29, 30 및 31을 지원하는 것은 그리 큰 문제가 아닙니다. –

    +1

    참 - 그러나 모든 사람들이 그것을 단순화합니다. OP는 매달 같은 날에 청구서를 요구 했으므로 가능한 유일한 대답입니다. –

    2

    매월 같은 날은 무엇을 의미합니까?

    고객 인 경우 매월 16 일에 청구되기를 원합니다. 문제 없어. 매월 31 일에 청구되기를 원한다면 문제가 지적 된대로 모든 달에 31 일간의 분명한 이슈가있는 것은 아닙니다.

    일 수를 현재 월에 검사하지 않는 이유는 무엇입니까? 31 일 미만일 경우, 월 마지막 날을 청구서 날짜로 만드십시오.

    더 많은 문제가 있습니까?

    0

    내가 선택한 달보다 적은 날인 경우 1-28, 또는 어느 날을 선택하고 그 달의 마지막 날에 요금을 청구한다고 말하고 싶습니다.

    +0

    그들은 사이클 날짜 = 날짜 생성 계정을 선택하지 않습니다. – aron

    +1

    동일 함. 현재 달이 만든 달의 일보다 적은 경우 계정 또는 오늘 마지막 날을 만드십시오. 계정이 –

    관련 문제