Процесс обработки истекающих миль авиакомпаний - PullRequest
1 голос
/ 30 ноября 2009

Я работаю над приложением, которое должно обрабатывать истекающие мили авиакомпаний. Мили могут быть использованы, но если они не используются к определенной дате, они истекают. Я хочу убедиться, что у меня истекает нужное количество миль, но не истекает их, если они были использованы. Поэтому я должен проверить, достаточно ли миль было использовано в заданном диапазоне дат, прежде чем они истекут. Вот мои первые мысли:

Иметь таблицу миль со следующими столбцами:

  • user_id - внешний ключ к таблице пользователей
  • number_miles - Количество миль для этой записи
  • миль_тип - указывает, были ли мили добавлены, использованы или истекли
  • miles_expire - Логическое значение, указывающее, истек ли срок действия этих миль
  • miles_date - дата добавления этой записи
  • exipration_date - Дата истечения срока действия этих миль (если установлен флаг miles_expire)
  • обработано - Указывает, была ли обработана эта запись - применимо, только если для miles_type установлено истечение

Если у меня есть запись при каждом добавлении, использовании или истечении срока действия миль с определенной учетной записи пользователя, я полагаю, что могу рассчитать просроченные мили следующим образом:

  1. Для каждого пользователя получите даты записей, в которых флаг miles_expire установлен в значение true, expiration_date предшествует текущей дате, а флаг processed установлен в значение false. Это позволит получить записи по всем милям, срок действия которых истек.
  2. Получите первый и последний expiration_date из предыдущего запроса.
  3. Используя первое и последнее значения expiration_date из предыдущего шага, получите список всех использованных миль в этом диапазоне дат.
  4. Если сумма использованных миль с предыдущего шага меньше суммы баллов, срок действия которых истекает, разница истекает. Если использованные мили равны или больше, срок действия не должен истекать.
  5. Установите для флага processed значение true для всех записей в первом и последнем expiration_date диапазоне. Либо эти мили истекли, либо проигнорированы по мере их использования.

Похоже, что это соответствует следующим требованиям:

  • Сначала используются истекающие мили
  • Он будет проверять только использованные мили за тот же период времени, что и использованные мили, поэтому использование многих миль в прошлом не спасет будущие мили от истечения срока действия
  • Срок действия миль истекает только после даты, и их не будет, если пользователь использовал достаточно миль

Есть ли другие соображения, которые я должен принять во внимание? Будет ли это работать, чтобы правильно истечь мили?

Ответы [ 2 ]

4 голосов
/ 30 ноября 2009

Ваш метод не будет работать по нескольким причинам. Возможно, проще всего объяснить это:

Для каждого пользователя получите даты записей, где флаг miles_expire установлен в значение true, дата истечения срока действия предшествует текущей дате, а флаг обработки установлен в значение false. Это позволит получить записи по всем милям, срок действия которых истек.

Обратите внимание, что это может быть только одна запись. Если вы выполняете свою проверку очень часто, это будет фактически только одна запись. Давайте для простоты предположим, что максимум одна запись истекает каждый день (если истекает более одной записи, ваш алгоритм все еще не работает, это просто сложнее объяснить).

Получить первую и последнюю дату expiration_date из предыдущего запроса.

Здесь вы получите ту же дату, потому что есть только одна запись.

Используя первое и последнее значения expiration_date из предыдущего шага, получите список всех использованных миль в этом диапазоне дат.

Поскольку первые и последние равны, дальности нет, поэтому в этом диапазоне никогда не будет использовано миль.

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

Поскольку предыдущий шаг не вернул ни одной строки, сумма равна нулю, поэтому у вас всегда будет разница между «просроченными милями» и «0». Даже если мили были использованы.

Этот процесс будет повторяться.

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

Итак, подведем итог: вам не нужно просрочивать ваучеры, просто убедитесь, что в коде платежа не разрешено использование просроченных или использованных ваучеров.

0 голосов
/ 30 ноября 2009

Не думаю, что вам нужно беспокоиться о том, какие мили используются в первую очередь, как в приложении инвентаризации; срок их действия истек или нет (в зависимости от срока годности). Ключ: сколько миль осталось? Мили с истекшим сроком действия, как и использованные мили, будут похожи на дебет счета (только для указания срока действия отдельная транзакция не требуется, вы исключаете их только из формулы, используемой для расчета текущего баланса.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...