From 4ed87de183176e71550f0dfce4f7584cf1221d02 Mon Sep 17 00:00:00 2001 From: drigato Date: Wed, 29 Jul 2015 22:24:17 -0400 Subject: [PATCH] SAAS-973: Airtime Billing page - Add support for August promotion plans Backend side pretty much done --- airtime_mvc/application/common/Billing.php | 45 ++++++++++++- .../controllers/BillingController.php | 63 ++++++++++++------- .../views/scripts/billing/upgrade.phtml | 24 +++++-- 3 files changed, 103 insertions(+), 29 deletions(-) diff --git a/airtime_mvc/application/common/Billing.php b/airtime_mvc/application/common/Billing.php index fa716f6d1..b41ea36ee 100644 --- a/airtime_mvc/application/common/Billing.php +++ b/airtime_mvc/application/common/Billing.php @@ -1,5 +1,7 @@ $p) { - Logging::info($p); if ($p["paytype"] === "free") { unset($products[$k]); @@ -326,4 +327,46 @@ class Billing $result = Billing::makeRequest($credentials["url"], $query_string); } + public static function isClientEligibleForPromo($newProductId, $newProductBillingCycle) + { + $currentPaidPlanProductIds = array( + "25", + "26", + "27", + "28" + ); + + $currentPlanProduct = self::getClientCurrentAirtimeProduct(); + $currentPlanProductId = $currentPlanProduct["pid"]; + $currentPlanBillingCycle = strtolower($currentPlanProduct["billingcycle"]); + + // if client is on trial plan, YES + if ($currentPlanProductId == AIRTIME_PRO_FREE_TRIAL_PLAN_ID) { + return true; + } + + // if client is currently on monthly or old plan AND (upgrading OR upgrading/downgrading to annual plan), YES + if ($currentPlanBillingCycle == "monthly" || $currentPlanBillingCycle == "free account") { + // is the client changing billing cycle to annual? + if ($newProductBillingCycle == "annually") { + return true; + } + + // Is the client staying on monthly and upgrading? + // This won't hold true if the client is on an old plan because the old + // plan ids are higher than the current plan ids. + if ($newProductBillingCycle == "monthly" && $newProductId > $currentPlanProductId) { + return true; + } + + // Is the client staying on monthly and upgrading from an old plan? + if ($newProductBillingCycle == "monthly" && !in_array($currentPlanProductId, $currentPaidPlanProductIds) + && in_array($newProductId, $currentPaidPlanProductIds)) { + return true; + } + } + + return false; + } + } diff --git a/airtime_mvc/application/controllers/BillingController.php b/airtime_mvc/application/controllers/BillingController.php index a6be46e82..420b13644 100644 --- a/airtime_mvc/application/controllers/BillingController.php +++ b/airtime_mvc/application/controllers/BillingController.php @@ -30,10 +30,12 @@ class BillingController extends Zend_Controller_Action { throw new Exception("Must POST data to promoEligibilityCheckAction."); } $data = $request->getPost(); - Logging::info($data); + + $eligible = Billing::isClientEligibleForPromo( + $data["newproductid"], $data["newproductbillingcycle"]); //Set the return JSON value - $this->_helper->json(array("result"=>"ok")); + $this->_helper->json(array("result"=>$eligible)); } public function upgradeAction() @@ -46,24 +48,42 @@ class BillingController extends Zend_Controller_Action { $request = $this->getRequest(); $form = new Application_Form_BillingUpgradeDowngrade(); if ($request->isPost()) { + // for testing $doUpgrade = false; $formData = $request->getPost(); - Logging::info($formData); + if ($doUpgrade && $form->isValid($formData)) { + // for testing Logging::info("---upgrading----"); + // Maps current paid plans to the promo plan ids + // TODO: update these to the correct values + $promoPlanIdMap = array( + "25" => "50", //hobbyist + "26" => "51", //starter + "27" => "52", //plus + "28" => "53" //premium + ); + + // Check if client is eligible for promo and update the new product id if so + $eligibleForPromo = Billing::isClientEligibleForPromo( + $formData["newproductid"], $formData["newproductbillingcycle"]); + if ($eligibleForPromo) { + $formData["newproductid"] = $promoPlanIdMap[$formData["newproductid"]]; + } + $credentials = Billing::getAPICredentials(); - + //Check if VAT should be applied or not to this invoice. if (in_array("7", $formData["customfields"])) { $apply_vat = Billing::checkIfVatShouldBeApplied($formData["customfields"]["7"], $formData["country"]); } else { $apply_vat = false; } - + $placeAnUpgradeOrder = true; - + $currentPlanProduct = Billing::getClientCurrentAirtimeProduct(); $currentPlanProductId = $currentPlanProduct["pid"]; $currentPlanProductBillingCycle = strtolower($currentPlanProduct["billingcycle"]); @@ -76,29 +96,29 @@ class BillingController extends Zend_Controller_Action { { $placeAnUpgradeOrder = false; } - + $postfields = array(); $postfields["username"] = $credentials["username"]; $postfields["password"] = md5($credentials["password"]); $postfields["action"] = "upgradeproduct"; $postfields["clientid"] = Application_Model_Preference::GetClientId(); - + $postfields["serviceid"] = Billing::getClientInstanceId(); $postfields["type"] = "product"; $postfields["newproductid"] = $formData["newproductid"]; $postfields["newproductbillingcycle"] = $formData["newproductbillingcycle"]; $postfields["paymentmethod"] = $formData["paymentmethod"]; $postfields["responsetype"] = "json"; - + $upgrade_query_string = ""; - foreach ($postfields AS $k=>$v) $upgrade_query_string .= "$k=".urlencode($v)."&"; - + foreach ($postfields AS $k => $v) $upgrade_query_string .= "$k=" . urlencode($v) . "&"; + //update client info $clientfields = array(); $clientfields["username"] = $credentials["username"]; $clientfields["password"] = md5($credentials["password"]); - $clientfields["action"] = "updateclient"; + $clientfields["action"] = "updateclient"; $clientfields["clientid"] = Application_Model_Preference::GetClientId(); $clientfields["customfields"] = base64_encode(serialize($formData["customfields"])); unset($formData["customfields"]); @@ -111,8 +131,8 @@ class BillingController extends Zend_Controller_Action { unset($clientfields["password2verify"]); unset($clientfields["submit"]); $client_query_string = ""; - foreach ($clientfields AS $k=>$v) $client_query_string .= "$k=".urlencode($v)."&"; - + foreach ($clientfields AS $k => $v) $client_query_string .= "$k=" . urlencode($v) . "&"; + //Update the client details in WHMCS first $result = Billing::makeRequest($credentials["url"], $client_query_string); Logging::info($result); @@ -121,29 +141,28 @@ class BillingController extends Zend_Controller_Action { $this->view->form = $form; return; } - + //If there were no changes to the plan or billing cycle, we just redirect you to the //invoices screen and show a message. - if (!$placeAnUpgradeOrder) - { + if (!$placeAnUpgradeOrder) { $this->_redirect('billing/invoices?planupdated'); return; } - + //Then place an upgrade order in WHMCS $result = Billing::makeRequest($credentials["url"], $upgrade_query_string); if ($result["result"] == "error") { - Logging::info($_SERVER['HTTP_HOST']." - Account upgrade failed. - ".$result["message"]); + Logging::info($_SERVER['HTTP_HOST'] . " - Account upgrade failed. - " . $result["message"]); $this->setErrorMessage(); $this->view->form = $form; } else { - Logging::info($_SERVER['HTTP_HOST']. "Account plan upgrade request:"); + Logging::info($_SERVER['HTTP_HOST'] . "Account plan upgrade request:"); Logging::info($result); - + // Disable the view and the layout here, squashes an error. $this->view->layout()->disableLayout(); $this->_helper->viewRenderer->setNoRender(true); - + if ($apply_vat) { Billing::addVatToInvoice($result["invoiceid"]); } diff --git a/airtime_mvc/application/views/scripts/billing/upgrade.phtml b/airtime_mvc/application/views/scripts/billing/upgrade.phtml index c74441179..17274c286 100644 --- a/airtime_mvc/application/views/scripts/billing/upgrade.phtml +++ b/airtime_mvc/application/views/scripts/billing/upgrade.phtml @@ -122,14 +122,23 @@ function configureByCountry(countryCode) function promoEligibilityCheck() { - var newproductid = $("input[type='radio'][name='newproductid']:checked"); - var newproductbillingcycle = $("input[type='radio'][name='newproductbillingcycle']:checked"); - console.log(newproductid.val()); - console.log(newproductbillingcycle.val()); + var newproductid = $("input[type='radio'][name='newproductid']:checked").val(); + + // newproductid can be undefined if the client is currently on an old plan + // and they just change the billing cycle value without selecting a new plan type. + // In this case, let's not check if they are eligible for the promo because + // they won't be able to upgrade without selecting a new plan first. + if (newproductid === undefined) { + return; + } + var newproductbillingcycle = $("input[type='radio'][name='newproductbillingcycle']:checked").val(); + $.post("/billing/promo-eligibility-check", {"newproductid": newproductid, "newproductbillingcycle": newproductbillingcycle}) .success(function(data) { - console.log(data); + if (data.result == true) { + $("#promo-plan-eligible").show(); + } }); } @@ -137,7 +146,7 @@ $(document).ready(function() { configureByCountry($("#country").val()); recalculateTotals(); - + $("input[name='newproductid']").change(function() { validatePlan(); recalculateTotals(); @@ -289,6 +298,9 @@ echo($currentProduct["name"]);
Save 15% on annual plans (Hobbyist plan excluded).
+
Subtotal: