Разработка плана подписки на сайт - PullRequest
2 голосов
/ 04 июня 2011

Я работал над сайтом, который имеет отношение к системе подписки, где пользователям придется переходить с одного уровня на другой. Позвольте мне объяснить немного. Есть четыре плана, а именно; Основной, Серебро, Золото, Платимум. Стоимость выглядит следующим образом:

  • Базовый: 0,00 $
  • Серебро: 20,00 $
  • Золото: 30,00 $
  • Платимум: $ 50,00

Варианты предоплаты:

  • 1 месяц
  • 3 месяца
  • 6 месяцев
  • 12 месяцев.

Это мои таблицы;

plans table:
id    name      cost
1     Basic      0.00    
2     Silver    20.00
3     Gold      30.00
4     Platinum  50.00

plans_period table:
id    sub_period
1     1
2     3
3     6
4     12

users table:
user_id  plan  plan_cost      user_plan_period  balance         plan_expiration
1        2     0.00(default)  0 (default)       0.00 (default)  NULL (default)

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

if ($plan & $period) {
    $user = new fncs();
    // What plan was chosen?
    list($name, $cost) = $db->get_row("select name, cost from plans where id='$plan'", ARRAY_N);
    list($sub_period) = $db->get_row("select sub_period from plans_period where sub_period='$period'", ARRAY_N);
    list($plan, $user_plan_period, $plan_cost, $plan_expiration) = $db->get_row("select u.plan, u.user_plan_period, u.plan_cost, u.plan_expiration, p.id from users u LEFT JOIN plans p ON p.id=u.plan where u.user_id='{$_SESSION['user_id']}'", ARRAY_N);
    $plan_expiration = ($plan_expiration = "NULL") ? '30' : '$plan_expiration';
    /*Current Cost of plan chosen */
    $totalcost1 = $cost * $sub_period;
    /* Cost of the user current plan */
    $totalcost2 = $plan_cost * $user_plan_period;
    /* Total number of days of the user current plan */
    $totaldays1 = 30 * $user_plan_period;
    /* Total number of days of the left for the user current plan */
    $today = date("m-d-Y"); 
    $dateDiff = strtotime($plan_expiration) - strtotime($today);
    $Daysleft = floor($dateDiff/(60*60*24));

    $totaldays2 = $totaldays1 - $Daysleft;

    $expiredate = strtotime($plan_expiration);

    $totalcost =  $totalcost1 -  ($totalcost2 * ($Daysleft / $totaldays1));

    $finalcost = number_format($totalcost, 2);

    // sufficient balance?
    if ($totalcost > $user->getBalance())
    {
        $errs[] = 'You have insufficient balance for the upgrade. The total cost is: '.$Daysleft.'';
    }
    else {
        $r = $db->query("update users set plan='$plan', user_plan_period='$period', plan_cost='$cost', plan_expiration=date_add(now(), interval 30 day) where user_id='{$_SESSION['user_id']}'");
        // Update balance
        $balance = $user->getBalance() - $cost;
        $db->query("update users set balance='$balance' where user_id='{$_SESSION['user_id']}'");
        // Reset sessions
        $user->processLogin($_SESSION['email']);
        // Insert into transactions
        $txt = "Account upgrade: <strong>$name</strong> for <s>N</s>$cost. Expires ".$_SESSION['plan_expiration'];
        $db->query("insert into transactions (user_id, txt, direction, amount, balance, date) values ('{$_SESSION['user_id']}', '$txt', 'd', '$cost', '$balance', now())");
        $_SESSION['msg'] = 'Account successfully upgraded. Plan expires on '.$_SESSION['plan_expiration'];

        header('location:my-account.php');
        exit;
    }
}

Ниже приведена форма, в которой пользователь выберет план обновления до

<div class="mainbar">
    <h3>Upgrade Account</h3>
    <?php
    if (isset($errs)) {
        echo '<p class="alert">';
        foreach($errs as $v){
            echo "$v ";
        }
        echo '</p>';
    }
    ?>
    <form class="form" method="post">
        <div class="rc">
            <p><label>Current Balance</label> <b><s>N</s><?= number_format($_SESSION['balance'], 2); ?></b></p>
            <p><label>Plan</label>
                <select class="txt iwdt" name="plan">
                <?php
                $r = $db->get_results("select id, name, cost from plans where id > 1");
                foreach ($r as $v) {
                    list ($id, $name, $cost) = $v;
                    echo '<option value="'.$id.'"';
                    echo $id == $_SESSION['plan'] ? ' selected="selected"' : '';
                    echo '>'.$name.' for N'.$cost.'</option>';
                }
                ?>
                </select>
                <select class="txt iwdt" name="period">
                    <option value="">Select Period</option>
                    <?php
                    $r = $db->get_results("select id, sub_period from plans_period");
                    foreach ($r as $v) {
                        list ($id, $sub_period) = $v;
                        echo '<option value="'.$id.'"';
                        echo $id == $_SESSION['period'] ? ' selected="selected"' : '';
                        echo '>'.$sub_period.' month(s)</option>';
                    }
                    ?>
                </select>
            </p>
            <p>
                <label>&nbsp;</label> <input type="submit" name="submit" class="button" value="Upgrade" /> or <a href="my-account.php">Cancel</a>
            </p>
        </div>
    </form>
</div>

Может кто-нибудь указать мне правильное направление. Есть ли урок, из которого я могу поучиться этому? Спасибо.

Спасибо всем, кто ответил.

В основном это то, где я думаю, что у меня возникли проблемы


$plan_expiration = ($plan_expiration = "NULL") ? '30' : '$plan_expiration';

Это поле plan_expiration является полем даты в этом формате Год-месяц-день, например 2011-06-03. Теперь значением по умолчанию для этого является "NULL". Когда пользователь впервые регистрируется на нашем сайте, ему назначается базовый тарифный план, стоимость которого составляет 0,00 долларов США, а срок его действия установлен на «NULL».

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

я присвоил «30» $ plan_expiration, если оно обнуляется на основании кода выше. Затем я вычислил оставшиеся дни, используя синтаксис ниже

 
 $today = date("m-d-Y"); 
    $dateDiff = strtotime($plan_expiration) - strtotime($today);
    $Daysleft = floor($dateDiff/(60*60*24));

Первая ошибка: $ Daysleft возвращает мне отрицательное значение

1 Ответ

0 голосов
/ 04 июня 2011

Вам также нужна фактическая дата регистрации для расчета пропущенных дней.

Давайте использовать этот пример:

У нас есть регистрация 15 мая (2011-05-15) и истечение предполагаемого 30 дней (что приводит к истечению 15 июня (2011-06-15).

Расчет PHP может работать так:

$signupDate = strtotime('2011-05-15');
$expiration = 30; //this is in days, lets remember that for later
$expirationDate = $signupDate+($expiration*24*60*60); //calculate the expiration date
$today = time(); //theres no need for using date and strtotime of you just want the timestamp

$daysLeft = floor(($expirationDate-$today)/(60*60*24));

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

...