Расчет прогноза будущих доходов по периодическим платежам с различными условиями - PullRequest
0 голосов
/ 05 мая 2011

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

Каждый пакет имеет дату срока исполнения, которую я увеличиваю при обновлении.

Нетрудно подсчитать, какой доход я могу примерно рассчитывать в этом месяце, проверив, у кого есть дата погашения в этом месяце.

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

Каков наилучший способ сделать это?Примечание: для этого я игнорирую истощение.Я работаю в PHP и MySQL, но я прошу теории, чтобы это не имело большого значения.

1 Ответ

1 голос
/ 05 мая 2011

Давайте рассмотрим ежемесячный доход на следующие 12 месяцев.

Я вижу два основных способа сделать это:

  1. Создать массив (или хэш) сегментов для каждого из следующих 12 месяцев. Затем выполните итерацию по каждой активной подписке, и для каждой подписки добавьте ожидаемый доход от этого в каждый соответствующий сегмент. Например, если условия ежемесячные, добавьте этот платеж в каждое ведро; если срок является ежеквартальным, добавьте этот платеж к текущему периоду месяца due_date и сегментам на 3, 6 и 9 месяцев после этого; и т. д. Это довольно просто для кода, но с достаточным количеством клиентов создание отчета может занять некоторое время.

  2. Создайте временную таблицу в вашей базе данных mysql со столбцами (month, amount), заполните ее рядом операторов вставки (есть куча; я доберусь до них в минуты), а затем составьте отчет по этой таблице.

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

    Итак, сначала вам понадобится временная таблица, и мы сначала заполним ее ежемесячным доходом на основе текущей даты due_on:

    CREATE TEMPORARY TABLE FutureRevenueReport
    SELECT
      CONCAT(YEAR(s.due_on), '-', MONTH(s.due_on)) as revenue_month,
      s.due_amount as revenue_amount
    FROM subscriptions s WHERE s.active = 'True';
    

    Теперь в том же сеансе mysql выполните эту серию операторов вставки, чтобы заполнить будущий доход:

    INSERT INTO FutureRevenueReport(revenue_month, revenue_amount)
    SELECT CONCAT(YEAR(s.due_on + INTERVAL 1 MONTH), '-', 
                  MONTH(s.due_on + INTERVAL 1 MONTH)), s.due_amount
    FROM subscriptions s WHERE s.active = 'True' AND s.term = 'MONTHLY';
    
    INSERT INTO FutureRevenueReport(revenue_month, revenue_amount)
    SELECT CONCAT(YEAR(s.due_on + INTERVAL 2 MONTH), '-', 
                  MONTH(s.due_on + INTERVAL 2 MONTH)), s.due_amount
    FROM subscriptions s WHERE s.active = 'True' AND s.term = 'MONTHLY';
    
    INSERT INTO FutureRevenueReport(revenue_month, revenue_amount)
    SELECT CONCAT(YEAR(s.due_on + INTERVAL 3 MONTH), '-', 
                  MONTH(s.due_on + INTERVAL 3 MONTH)), s.due_amount
    FROM subscriptions s WHERE s.active = 'True' AND s.term = 'MONTHLY';
    -- etc, up to + INTERVAL 11 MONTH
    
    -- Now the quarterly:
    INSERT INTO FutureRevenueReport(revenue_month, revenue_amount)
    SELECT CONCAT(YEAR(s.due_on + INTERVAL 3 MONTH), '-', 
                  MONTH(s.due_on + INTERVAL 3 MONTH)), s.due_amount
    FROM subscriptions s WHERE s.active = 'True' AND s.term = 'QUARTERLY';
    
    INSERT INTO FutureRevenueReport(revenue_month, revenue_amount)
    SELECT CONCAT(YEAR(s.due_on + INTERVAL 6 MONTH), '-', 
                  MONTH(s.due_on + INTERVAL 6 MONTH)), s.due_amount
    FROM subscriptions s WHERE s.active = 'True' AND s.term = 'QUARTERLY';
    -- And the same for 9 months
    -- Then do the same thing for SEMI-ANNUALLY and + INTERVAL 6 MONTH
    
    -- And now the report:
    SELECT revenue_month, sum(revenue_amount) as revenue from FutureRevenueReport
    GROUP BY revenue_month;
    
...