Лучший шаблон для ежемесячного цикла выставления счетов - PullRequest
6 голосов
/ 22 марта 2011

Я написал код для моей новой биллинговой системы.Цель состоит в том, чтобы выставлять счет клиенту в один и тот же день каждого месяца.(не 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 ловушки:

  1. Если его cycleDate.Day равен 31, а текущий месяц имеет только 29 дней
  2. cycleDate - 29 февраля 2012 г. - ему будут выставляться счета только в високосные годы

Есть ли здесь распространенная лучшая практика?

, поэтому кажется, что есть кучачто нужно проверить

  1. этот счет уже выставлен в этом месяце?
  2. существует ли день цикла в текущем месяце
  3. - это день цикла больше или равен текущей дате (это идеально, если транзакция провалилась днем ​​ранее)

Спасибо!

Ответы [ 4 ]

6 голосов
/ 22 марта 2011

Разрешить выбор расчетного дня только между 1 - 28 .По моему опыту, именно так большинство кредитных компаний / кредитных компаний справляются с этим, когда им предоставляется выбор.

2 голосов
/ 22 марта 2011

Что означает один и тот же день каждого месяца?

Если я являюсь клиентом, я хочу получать счета 16 числа каждый месяц.Нет проблем.Если я хочу, чтобы счета выставлялись 31-го числа каждого месяца, очевидная проблема заключается не во всех месяцах по 31 дню, как вы указали в своем вопросе.

Почему бы не проверить текущий месяц на количество дней.Если у него меньше 31 дня, укажите последний день месяца в качестве даты счета.

Есть ли еще проблемы?

0 голосов
/ 22 марта 2011

Хорошо, я полагаю, что я был полностью более - думая об этом. Это просто и охватывает все:

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

Это не обязательно будет выставлять счет в тот же день, однако это достаточно близко. Это также добавляет гибкости, если транзакция была отклонена в течение дня или если запланированное задание не было выполнено в течение 1 дня при следующем запуске, оно получит ее.

0 голосов
/ 22 марта 2011

Я бы сказал, что он может выбрать между 1-28 или любым другим днем, но взимать плату в последний день месяца, если в текущем месяце меньше дней, чем в выбранном дне месяца.

...