/** * Create bicycle subform * * @return void */ public function init() { $pageSession = new Zend_Session_Namespace('tenants_insurance_quote'); $bike = new Datasource_Insurance_Policy_Cycles($pageSession->CustomerRefNo, $pageSession->PolicyNumber); $maximumReached = $bike->countBikes() == $bike->maxBicycles; // Grab view and add the bicycle JavaScript into the page head $view = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('view'); // JavaScript that shows or hides promo panels, depending on values in subform $view->headScript()->appendFile('/assets/tenants-insurance-quote-b/js/bicycle.js', 'text/javascript'); // Add own a bicycle element $this->addElement('radio', 'bicycle', array('label' => 'Would you like to cover your bicycle?', 'required' => true, 'multiOptions' => array('yes' => 'Yes', 'no' => 'No'), 'separator' => '', 'label_placement' => 'prepend', 'validators' => array(array('NotEmpty', true, array('messages' => array('isEmpty' => 'Please select whether you own a bicycle', 'notEmptyInvalid' => 'Please select whether own a bicycle')))))); // Add fields for all new bicycle values (the visible fields associated with the "Add bike" button) $this->addElement('text', "bicycle_make", array('label' => "Make of bicycle", 'required' => false, 'filters' => array('StringTrim'), 'validators' => array(array('NotEmpty', true, array('messages' => array('isEmpty' => 'Please enter a bicycle make', 'notEmptyInvalid' => 'Please enter a bicycle make'))), array('regex', true, array('pattern' => '/^[0-9a-z\\ \\-\\,\\(\\)\\.\']{3,}$/i', 'messages' => 'Bicycle make must contain at least three alphanumeric characters and only basic punctuation (space, hyphen, comma, round brackets, full stop and single quote)'))))); $this->addElement('text', "bicycle_model", array('label' => "Model of bicycle", 'required' => false, 'filters' => array('StringTrim'), 'validators' => array(array('NotEmpty', true, array('messages' => array('isEmpty' => 'Please enter a bicycle model', 'notEmptyInvalid' => 'Please enter a bicycle model'))), array('regex', true, array('pattern' => '/^[0-9a-z\\ \\-\\,\\(\\)\\.\']{3,}$/i', 'messages' => 'Bicycle model must contain at least three alphanumeric characters and only basic punctuation (space, hyphen, comma, round brackets, full stop and single quote)'))))); $this->addElement('text', "bicycle_serial", array('label' => "Serial number of bicycle", 'required' => false, 'filters' => array('StringTrim'), 'validators' => array(array('NotEmpty', true, array('messages' => array('isEmpty' => 'Please enter a bicycle serial', 'notEmptyInvalid' => 'Please enter a bicycle serial'))), array('regex', true, array('pattern' => '/^[0-9a-z\\ \\-\\,\\(\\)\\.\']{5,}$/i', 'messages' => 'Bicycle serial must contain at least five alphanumeric characters and only basic punctuation (space, hyphen, comma, round brackets, full stop and single quote)'))))); $this->addElement('text', "bicycle_value", array('required' => false, 'attribs' => array('class' => 'currency'), 'filters' => array(array('filter' => 'PregReplace', 'options' => array('match' => '/[^\\d\\.]/', 'replace' => ''))), 'validators' => array(array('NotEmpty', true, array('messages' => array('isEmpty' => 'Please enter the bicycle value', 'notEmptyInvalid' => 'Please enter the bicycle value'))), array('regex', true, array('pattern' => '/^\\d+\\.?\\d{0,2}$/', 'messages' => 'Bicycle value must be a valid currency number')), array('GreaterThan', true, array('min' => 200, 'messages' => 'Bicycle value must be above £200'))))); if ($maximumReached) { // Disable the bike entry forms $this->bicycle_make->setAttrib('disabled', 'disabled'); $this->bicycle_model->setAttrib('disabled', 'disabled'); $this->bicycle_serial->setAttrib('disabled', 'disabled'); $this->bicycle_value->setAttrib('disabled', 'disabled'); } // Set custom subform decorator $this->setDecorators(array(array('ViewScript', array('viewScript' => 'subforms/bicycle.phtml')))); // Strip all tags to prevent XSS errors $this->setElementFilters(array('StripTags')); $this->setElementDecorators(array(array('ViewHelper', array('escape' => false)), array('Label', array('escape' => false)))); }
/** * Helper function for generating bike summary HTML fragment * * @return string */ public function yourBicycle() { $pageSession = new Zend_Session_Namespace('tenants_insurance_quote'); $bike = new Datasource_Insurance_Policy_Cycles($pageSession->CustomerRefNo, $pageSession->PolicyNumber); $bicycleData = $bike->listBikes(); if (count($bicycleData) > 0) { return $this->view->partial('partials/ajax-bicycle-list.phtml', array('bicycleData' => $bicycleData)); } else { return; } }
/** * Helper function for generating view breakdown HTML fragment * * @param bool $showAdminFees Optional switch to include admin fees, defaults to false * * @return string */ public function viewBreakdown($includeAdminFees = true) { // Get customer ref no and policy number $pageSession = new Zend_Session_Namespace('tenants_insurance_quote'); $this->_customerReferenceNumber = $pageSession->CustomerRefNo; $this->_policyNumber = $pageSession->PolicyNumber; // Get premium values for quote $quoteManager = new Manager_Insurance_TenantsContentsPlus_Quote(null, null, $this->_policyNumber); $premiums = $quoteManager->calculatePremiums(); $this->view->premiums = $premiums; // Get cover amounts $this->view->contentsCoverAmount = $quoteManager->getCoverAmount(Manager_Insurance_TenantsContentsPlus_Quote::CONTENTS); $this->view->bicyclesCoverAmount = $quoteManager->getCoverAmount(Manager_Insurance_TenantsContentsPlus_Quote::PEDALCYCLES); $this->view->specifiedPossessionsCoverAmount = $quoteManager->getCoverAmount(Manager_Insurance_TenantsContentsPlus_Quote::SPECIFIEDPOSSESSIONS); $this->view->unspecifiedPossessionsCoverAmount = $quoteManager->getCoverAmount(Manager_Insurance_TenantsContentsPlus_Quote::UNSPECIFIEDPOSSESSIONS); // Get any sharer occupation details $sharersManager = new Manager_Insurance_TenantsContentsPlus_Sharers(); $sharerData = $sharersManager->getSharers($this->_policyNumber); $this->view->sharer1 = !is_null($sharerData) ? $sharerData->getSharerOccupation(1) : ''; $this->view->sharer2 = !is_null($sharerData) ? $sharerData->getSharerOccupation(2) : ''; // Get specified possessions info $possession = new Datasource_Insurance_Policy_SpecPossessions($this->_policyNumber); $this->view->possessions = $possession->listPossessions(); // Get bicycle info $bike = new Datasource_Insurance_Policy_Cycles($this->_customerReferenceNumber, $this->_policyNumber); $this->view->bicycles = $bike->listBikes(); // Get Current IPT percentage $quote = $quoteManager->getQuoteObject(); $postcode = $quote->propertyPostcode; $taxDatasource = new Datasource_Core_Tax(); $tax = $taxDatasource->getTaxbyTypeAndPostcode('ipt', $postcode); $ipt = 1 + $tax['rate']; // Get admin fees, if required if ($includeAdminFees) { $fees = $quoteManager->getFees(); $this->view->feeMonthly = $fees->tenantspMonthlyFee; $this->view->feeAnnual = 0; // TODO: parameterise? Legacy DB and fee object currently don't handle annual fees } else { $this->view->feeMonthly = 0; $this->view->feeAnnual = 0; } $this->view->includeAdminFees = $includeAdminFees; // Return partial view HTML return $this->view->partial('partials/view-breakdown.phtml', $this->view); }
/** * Helper function to populate the zend form elements with database data * * @param Zend_Form $pageForm form definition for this step * @param int $stepNum current step number * * @return void */ private function _formStepCommonPopulate($pageForm, $stepNum) { $pageSession = new Zend_Session_Namespace('tenants_insurance_quote'); // First of all check that this form should be viewable and the user isn't trying to skip ahead $this->view->stepNum = $stepNum; $this->view->stepMax = $this->_stepMax; // Check to see if the user is trying to skip ahead in the quote $tooFarAhead = false; if ((!isset($pageSession->completed) || is_null($pageSession->completed)) && $stepNum != 1) { $tooFarAhead = true; $lastCompleted = 1; } elseif ($stepNum > 1) { // Check to see if any pages previous to the one the user's trying to get to are incomplete $tooFarAhead = false; for ($i = 1; $i < $stepNum; $i++) { if (!isset($pageSession->completed[$i]) || !$pageSession->completed[$i]) { $tooFarAhead = true; $lastCompleted = $i; break; break; } } } if ($tooFarAhead) { // Drop user onto page that needs completing $this->_helper->redirector->gotoUrl('/tenants/insurance-quote-b/step' . $lastCompleted); return false; } // Now check to see if they need to login (using an existing email address without being logged in) if ($stepNum > 1) { // Before we do ANYTHING we need to check to see if the email address entered matches a customer record // we already have - if it does we need to ask them to login before they proceed. $customerReferenceNumber = $pageSession->CustomerRefNo; $customerManager = new Manager_Core_Customer(); $legacyCustomer = $customerManager->getCustomer(Model_Core_Customer::LEGACY_IDENTIFIER, $customerReferenceNumber); $emailAddress = $legacyCustomer->getEmailAddress(); $customer = $customerManager->getCustomerByEmailAddress($emailAddress); if ($customer) { // There is already a customer entry for this email address - so we need to see if they are logged in // if not we need to force them to login $auth = Zend_Auth::getInstance(); $auth->setStorage(new Zend_Auth_Storage_Session('homelet_customer')); /*if ($auth->hasIdentity()) { $loggedInEmail = $auth->getStorage()->read()->email_address; if ($loggedInEmail != $customer->getEmailAddress()) { // They are logged in but not who they should be to do this quote $this->_helper->redirector->gotoUrl('/account/login?refer=tenants-insurance&step='. $stepNum); return false; } } else { // They aren't logged in and need to $this->_helper->redirector->gotoUrl('/account/login?refer=tenants-insurance&step='. $stepNum); return false; }*/ } } // Echo out some debug info if not in production mode Application_Core_Logger::log("Policy Number : " . $this->_policyNumber); Application_Core_Logger::log("Customer Ref No : " . $this->_customerReferenceNumber); Application_Core_Logger::log("agentSchemeNumber : " . $this->_agentSchemeNumber); $formData = array(); // If step 1 and not in session (so producing a quick quote) - we need to pre-populate // a few bits if the customer is already logged into the site if ($stepNum == 1 && !isset($pageSession->CustomerRefNo)) { $auth = Zend_Auth::getInstance(); $auth->setStorage(new Zend_Auth_Storage_Session('homelet_customer')); if ($auth->hasIdentity()) { // Customer is logged in and starting a new quote - so we need to pre-populate the customers details from stored details $customerID = $auth->getStorage()->read()->id; $customerManager = new Manager_Core_Customer(); $customer = $customerManager->getCustomer(Model_Core_Customer::IDENTIFIER, $customerID); // Get the customer's legacy record too as DoB is only in the old system $legacyCustomer = $customerManager->getCustomer(Model_Core_Customer::LEGACY_IDENTIFIER, $customerID); $formData['title'] = $customer->getTitle(); $formData['first_name'] = $customer->getFirstName(); $formData['last_name'] = $customer->getLastName(); $formData['phone_number'] = $customer->getTelephone(Model_Core_Customer::TELEPHONE1); $formData['mobile_number'] = $customer->getTelephone(Model_Core_Customer::TELEPHONE2); $formData['email_address'] = $customer->getEmailAddress(); // Fetch DoB from old customer manager $formData['date_of_birth_at'] = $legacyCustomer->getDateOfBirth(); $pageForm->populate($formData); } } // Only populate from DB if we are in session and have a reference number if (isset($pageSession->CustomerRefNo)) { $customerReferenceNumber = $pageSession->CustomerRefNo; $policyNumber = $pageSession->PolicyNumber; // Populate $formData with data from model, if available switch ($stepNum) { case 1: // Personal Details section $customerManager = new Manager_Core_Customer(); $customer = $customerManager->getCustomer(Model_Core_Customer::LEGACY_IDENTIFIER, $customerReferenceNumber); $titleOptions = TenantsInsuranceQuoteB_Form_Subforms_PersonalDetails::$titles; if (in_array($customer->getTitle(), $titleOptions)) { $formData['title'] = $customer->getTitle(); } else { $formData['title'] = "Other"; $formData['other_title'] = $customer->getTitle(); } $formData['first_name'] = $customer->getFirstName(); $formData['last_name'] = $customer->getLastName(); $formData['phone_number'] = $customer->getTelephone(Model_Core_Customer::TELEPHONE1); $formData['mobile_number'] = $customer->getTelephone(Model_Core_Customer::TELEPHONE2); $formData['email_address'] = $customer->getEmailAddress(); $dob = $customer->getDateOfBirthAt(); if (null != $dob && '0000-00-00' != $dob) { $formData['date_of_birth_at'] = Application_Core_Utilities::mysqlDateToUk($dob); } // Data Protection section $dpaManager = new Manager_Core_DataProtection(); $dpaItems = $dpaManager->getItems($customerReferenceNumber, Model_Core_DataProtection_ItemEntityTypes::INSURANCE); foreach ($dpaItems as $currentItem) { switch ($currentItem->constraintTypeId) { case Model_Core_DataProtection_ItemConstraintTypes::MARKETING_BY_PHONEANDPOST: if ($currentItem->isAllowed) { $formData['dpa_phone_post'] = 0; } else { $formData['dpa_phone_post'] = 1; } break; case Model_Core_DataProtection_ItemConstraintTypes::MARKETING_BY_SMSANDEMAIL: if ($currentItem->isAllowed) { $formData['dpa_sms_email'] = 0; // For Redmine Ref #8003, "Updated marketing preference questions on online quotes" } else { $formData['dpa_sms_email'] = 1; // For Redmine Ref #8003, "Updated marketing preference questions on online quotes" } break; case Model_Core_DataProtection_ItemConstraintTypes::MARKETING_BY_THIRDPARTY: if ($currentItem->isAllowed) { $formData['dpa_resale'] = 1; } else { $formData['dpa_resale'] = 0; } break; } } // Contents Insurance section $quoteManager = new Manager_Insurance_TenantsContentsPlus_Quote(null, null, $this->_policyNumber); // If we've retrieved this quote we need to setup some session variables to match the quote (agent scheme number mostly) $session = new Zend_Session_Namespace('homelet_global'); $session->agentSchemeNumber = Manager_Core_Agent::filterAsn($quoteManager->getAgentSchemeNumber()); $contentsSI = $quoteManager->getCoverAmount(Manager_Insurance_TenantsContentsPlus_Quote::CONTENTS); // TODO: Remove the hard-coded contents insured splits - should be loaded from DB if ($contentsSI == '5000' || $contentsSI == '7500' || $contentsSI == '10000' || $contentsSI == '15000') { $formData['contents_cover_a'] = $contentsSI; } else { $formData['contents_cover_a'] = '15000+'; $formData['contents_cover_b'] = $contentsSI; } // Shares section $sharersManager = new Manager_Insurance_TenantsContentsPlus_Sharers(); $existingSharers = $sharersManager->getSharers($policyNumber); $formData['policy_sharers'] = 0; if ($existingSharers) { if ($existingSharers->getSharerOccupation(1) != '') { $formData['policy_sharers'] = 1; $formData['policy_sharer1_occupation'] = $existingSharers->getSharerOccupation(1); } if ($existingSharers->getSharerOccupation(2) != '') { $formData['policy_sharers'] = 2; $formData['policy_sharer2_occupation'] = $existingSharers->getSharerOccupation(2); } } for ($i = 1; $i <= $pageForm->maxSharers; $i++) { $formData["policy_sharer{$i}_occupation"] = $existingSharers->getSharerOccupation($i); } // Decide max number of sharers allowed based on contents insured value $contentsAmount = new Zend_Currency(array('value' => $contentsSI, 'precision' => 0)); $sharersAllowed = $sharersManager->getNoOfSharersAllowed($contentsAmount); // Push this into Javascript on the page $this->view->headScript()->appendScript("var sharersAllowed = {$sharersAllowed};"); // Initial Disclosure Agreement section // As we have a customer reference number they must have saved step 1 at some point which means // they must have agreed to the IDD section $formData['idd'] = 1; break; case 2: // Unspecified Possessions section $quoteManager = new Manager_Insurance_TenantsContentsPlus_Quote(null, null, $this->_policyNumber); $unspecSI = $quoteManager->getCoverAmount(Manager_Insurance_TenantsContentsPlus_Quote::UNSPECIFIEDPOSSESSIONS); // If step has been completed before we can assume some defaults that we'll over-write later if (isset($pageSession->completed[2]) && $pageSession->completed[2] == true or $quoteManager->getPropertyPostcode() != '') { $formData['away_from_home'] = 'no'; $formData['above_x'] = 'no'; $formData['bicycle'] = 'no'; } // TODO: Re-factor this so that it doesn't use hardcoded pricing breaks anymore if ($unspecSI > 0) { $formData['away_from_home'] = 'yes'; $formData['possessions_cover'] = $unspecSI; } //TODO: This should be talking to the quote manager NOT directly to the datasource $possessions = new Datasource_Insurance_Policy_SpecPossessions($pageSession->PolicyNumber); if ($possessions->countPossessions() > 0) { $formData['above_x'] = 'yes'; } // Bicycle section //TODO: This should be talking to the quote manager NOT directly to the datasource $bicycle = new Datasource_Insurance_Policy_Cycles($this->_customerReferenceNumber, $this->_policyNumber); if ($bicycle->countBikes() > 0) { $formData['bicycle'] = 'yes'; } break; case 3: // Insured Address section // Fetch previously stored address $quoteManager = new Manager_Insurance_TenantsContentsPlus_Quote(null, null, $this->_policyNumber); $addressArray = $quoteManager->getPropertyAddress(); if ($addressArray['postcode'] != '') { if (strpos($addressArray['address1'], ',') !== false) { $formData['ins_house_number_name'] = preg_replace('/,.*$/', '', $addressArray['address1']); } else { $formData['ins_house_number_name'] = preg_replace('/ .*$/', '', $addressArray['address1']); } $formData['ins_postcode'] = $addressArray['postcode']; // Look up address again to populate dropdown $postcodeLookup = new Manager_Core_Postcode(); $addresses = $postcodeLookup->getPropertiesByPostcode(preg_replace('/[^\\w\\ ]/', '', $formData['ins_postcode'])); $addressList = array('' => '--- please select ---'); $filterString = is_numeric($formData['ins_house_number_name']) ? $formData['ins_house_number_name'] . ", " : $formData['ins_house_number_name']; foreach ($addresses as $address) { $addressList[$address['id']] = $address['singleLineWithoutPostcode']; if (stripos($address['singleLineWithoutPostcode'], $filterString) === 0) { $addressID = $address['id']; } } // Add some validation $ins_address = $pageForm->getSubForm('subform_insuredaddress')->getElement('ins_address'); $ins_address->setMultiOptions($addressList); $validator = new Zend_Validate_InArray(array('haystack' => array_keys($addressList))); $validator->setMessages(array(Zend_Validate_InArray::NOT_IN_ARRAY => 'Insured address does not match with postcode')); $ins_address->addValidator($validator, true); // Set the address to selected $ins_address->setValue($addressID); $addressID = null; // Make sure we don't use this again for the correspondance address! // Upsell Message section $pageSession = new Zend_Session_Namespace('tenants_insurance_quote'); $session = new Zend_Session_Namespace('homelet_global'); $agentSchemeNumber = $session->agentSchemeNumber; } // Correspondance Address section $customerManager = new Manager_Core_Customer(); $customer = $customerManager->getCustomer(Model_Core_Customer::LEGACY_IDENTIFIER, $this->_customerReferenceNumber); $addressLine1 = $customer->getAddressLine(Model_Core_Customer::ADDRESSLINE1); $addressPostcode = $customer->getPostCode(); if ($addressPostcode != '') { if (strpos($addressLine1, ',') !== false) { $formData['cor_house_number_name'] = preg_replace('/,.*$/', '', $addressLine1); } else { $formData['cor_house_number_name'] = preg_replace('/ .*$/', '', $addressLine1); } $formData['cor_postcode'] = $addressPostcode; // TODO: Surely if this postcode and house number matches the previous one // we can just tick the YES box and hide the correspondance address form?? $postcodeLookup = new Manager_Core_Postcode(); $addresses = $postcodeLookup->getPropertiesByPostcode(preg_replace('/[^\\w\\ ]/', '', $formData['cor_postcode'])); $addressList = array('' => '--- please select ---'); $filterString = is_numeric($formData['cor_house_number_name']) ? $formData['cor_house_number_name'] . ", " : $formData['cor_house_number_name']; foreach ($addresses as $address) { $addressList[$address['id']] = $address['singleLineWithoutPostcode']; if (stripos($address['singleLineWithoutPostcode'], $filterString) === 0) { $addressID = $address['id']; } } $cor_address = $pageForm->getSubForm('subform_correspondencedetails')->getElement('cor_address'); $cor_address->setMultiOptions($addressList); $validator = new Zend_Validate_InArray(array('haystack' => array_keys($addressList))); $validator->setMessages(array(Zend_Validate_InArray::NOT_IN_ARRAY => 'Insured address does not match with postcode')); $cor_address->addValidator($validator, true); $cor_address->setValue($addressID); } if ($addressPostcode != '' && $addressArray['postcode'] != '') { if ($cor_address->getValue() == $ins_address->getValue()) { $formData['cor_same_address'] = 'yes'; } else { $formData['cor_same_address'] = 'no'; } } // Letting Agent section // If the agent scheme number is not our default one - load the agent details $params = Zend_Registry::get('params'); $agentSchemeNumber = Manager_Core_Agent::filterAsn($quoteManager->getAgentSchemeNumber()); // How did you hear about us section $marketQuestion = new Manager_Core_ManagementInformation(); $formData['how_hear'] = $marketQuestion->getMarketingAnswers($this->_policyNumber); //Campaign code section $webLeadManager = new Manager_Core_WebLead(); $webLeadSummary = $webLeadManager->getSummary($this->_webLeadSummaryId); $formData['campaign_code'] = $webLeadSummary->promotionCode; // Start and end date $startDate = $quoteManager->getStartDate(); if ($startDate != '' && $startDate != '0000-00-00') { $formData['policy_start'] = substr($startDate, 8, 2) . '/' . substr($startDate, 5, 2) . '/' . substr($startDate, 0, 4); } break; case 4: // Important Information section // If this page has previously passed validation, we know what the answers // given must have been without hitting the DB (as anything else refers) if (isset($pageSession->completed[$stepNum]) && $pageSession->completed[$stepNum]) { $formData['declaration1'] = 'no'; $formData['declaration2'] = 'no'; $formData['declaration3'] = 'no'; $formData['declaration4'] = 'no'; $formData['declaration_confirmation'] = 'yes'; // If the step is completed we can also assume they said yes to the declaration agreement $formData['declaration_statement'] = 1; } break; case 5: // Not sure if we should really be loading payment methods back in // surely it would be best to just let them choose again break; case 'dd': $quoteManager = new Manager_Insurance_TenantsContentsPlus_Quote(null, null, $this->_policyNumber); $this->view->payMonthly = strtolower($quoteManager->getPayBy()) == 'monthly'; break; } $pageForm->populate($formData); // Populate the quick quote box $quoteManager = new Manager_Insurance_TenantsContentsPlus_Quote(null, null, $this->_policyNumber); $premiums = $quoteManager->calculatePremiums(); $fees = $quoteManager->getFees(); $this->view->premiums = $premiums; $this->view->fees = $fees; } else { // Not in session but there are some defaults we need to set for step 1 // TODO: Write the javascript better so we don't need to do fudges like this $this->view->headScript()->appendScript("var sharersAllowed = 0;"); } return true; }
/** * Validate and handle adding and removing bikes via AJAX * * @return void */ public function bicycleAction() { $output = array(); $pageSession = new Zend_Session_Namespace('tenants_insurance_quote'); $bike = new Datasource_Insurance_Policy_Cycles($pageSession->CustomerRefNo, $pageSession->PolicyNumber); $ajaxForm = new TenantsInsuranceQuote_Form_Json_Bicycle(); // Ignore 'bicycle' field for AJAX requests $ajaxForm->subform_bicycle->getElement('bicycle')->setRequired(false); $request = $this->getRequest(); $postdata = $request->getPost(); // Filter to mirror the subform element definitions. $currencyFilterElements = array('bicycle_value'); foreach ($currencyFilterElements as $filterElement) { if (isset($postdata[$filterElement])) { $postdata[$filterElement] = preg_replace(array('/[^\\d\\.]/'), array(''), $postdata[$filterElement]); } } // Force the elements to be required as this is an add item click - ugly :( if (isset($postdata['addBike']) && $postdata['addBike'] == 1) { $ajaxForm->subform_bicycle->getElement('bicycle_make')->setRequired(true); $ajaxForm->subform_bicycle->getElement('bicycle_model')->setRequired(true); $ajaxForm->subform_bicycle->getElement('bicycle_serial')->setRequired(false); $ajaxForm->subform_bicycle->getElement('bicycle_value')->setRequired(true); } $quoteManager = new Manager_Insurance_TenantsContentsPlus_Quote(null, null, $pageSession->PolicyNumber); if ($ajaxForm->isValid($postdata)) { // Check if a new bike's details are being added and bicycles is below max if (isset($postdata['addBike']) && $postdata['addBike'] == 1) { $cleanData = $ajaxForm->getValues(); $bike->addNew($cleanData['subform_bicycle']); } // Check if an existing bike's details are being removed if (isset($postdata['removeBike']) && $postdata['removeBike'] == 1) { $bike->remove($postdata['bikeNum']); } $totalValue = $bike->getTotalValue(); // Now we need to update the total amounts covered in the quote manager $quoteManager->setCoverAmount($totalValue, Manager_Insurance_TenantsContentsPlus_Quote::PEDALCYCLES); } $errorMessages = $ajaxForm->getMessagesFlattened(); $output['errorJs'] = $errorMessages; $output['errorCount'] = count($errorMessages); $output['errorHtml'] = $this->view->partial('partials/error-list.phtml', array('errors' => $errorMessages)); // Tell page if max bikes reached $output['disableAdd'] = $bike->countBikes() == $bike->maxBicycles ? 1 : 0; $output['html'] = $this->view->yourBicycle(); $premiums = $quoteManager->calculatePremiums(); $fees = $quoteManager->getFees(); $output['premiums'] = $premiums; $output['fees'] = $fees; echo Zend_Json::encode($output); }
/** * Implements abstract method from superclass - refer to superclass for description. */ public function getReferralReasons($policyNumber) { $referralReasons = array(); $params = Zend_Registry::get('params'); $quote = new Manager_Insurance_TenantsContentsPlus_Quote(null, null, $policyNumber); if ($quote->getPolicyName() == 'tenantsp') { //Test 1: If the cover is greater than the threshold, then refer. $contentsAmount = $quote->getPolicyOptionAmountCovered('contentstp'); $contentsThreshold = new Zend_Currency(array('value' => $params->uw->rt->tenantsp->contents, 'precision' => 0)); if ($contentsAmount >= $contentsThreshold) { $referralReasons[] = $params->uw->rr->tenantsp->cover; } //Test 2: If claim values are greater than 1000 then refer. if (empty($this->_previousClaimsModel)) { $this->_previousClaimsModel = new Datasource_Insurance_PreviousClaims(); } $previousClaimsArray = $this->_previousClaimsModel->getPreviousClaims($quote->getRefno()); if (!empty($previousClaimsArray)) { //Tenant has one or more claims. Add the totals together to see if they exceed //the threshold. $claimsTotal = new Zend_Currency(array('value' => 0, 'precision' => 2)); foreach ($previousClaimsArray as $previousClaim) { $claimsTotal->add($previousClaim->getClaimValue()); } //Test against the previous claims threshold $claimsThreshold = new Zend_Currency(array('value' => $params->uw->rt->tenantsp->claimsThreshold, 'precision' => 2)); if ($claimsTotal->isMore($claimsThreshold)) { $referralReasons[] = $params->uw->rr->tenantsp->previousClaims; } } //Test 3: Answering the underwriting questions. $answersManager = new Manager_Insurance_Answers(); $answersArray = $answersManager->getUnderwritingAnswers($policyNumber); if (empty($answersArray)) { //You can't process for referral if no underwriting answers have first been provided. throw new Zend_Exception(get_class() . __FUNCTION__ . ": no underwriting answers provided."); } foreach ($answersArray as $currentAnswer) { //Identify if the current answer is one that should be checked. if (in_array($currentAnswer->getQuestionNumber(), $params->uw->rt->tenantsp->checkAnswer->toArray())) { $answer = $currentAnswer->getAnswer(); if ($answer == Model_Insurance_Answer::YES) { $referralReasons[] = $params->uw->rr->tenantsp->answer; } } } //Test 4: pedal cycles over 1500 $pedalCyclesModel = new Datasource_Insurance_Policy_Cycles($quote->getRefno(), $policyNumber); $pedalCyclesArray = $pedalCyclesModel->listBikes(); if (!empty($pedalCyclesArray)) { $pedalCycleThreshold = new Zend_Currency(array('value' => $params->uw->rt->tenantsp->pedalCycle, 'precision' => 2)); foreach ($pedalCyclesArray as $currentPedalCycle) { //Compare the pedal cycle values in Zend_Currency format for simplity. $currentCycleValue = new Zend_Currency(array('value' => $currentPedalCycle['value'], 'precision' => 2)); if ($currentCycleValue->isMore($pedalCycleThreshold)) { $referralReasons[] = $params->uw->rr->tenantsp->pedalCycle; } } } //Test 5: specified possessions greater than threshold $specPossessionsModel = new Datasource_Insurance_Policy_SpecPossessions($policyNumber); $specPossessionsArray = $specPossessionsModel->listPossessions(); if (!empty($specPossessionsArray)) { //Wrap the threshold parameter in a Zend_Currency object for easier comparisons. $specPossessionThreshold = new Zend_Currency(array('value' => $params->uw->rt->tenantsp->specPossession, 'precision' => 2)); //Cycle through each specpossession... foreach ($specPossessionsArray as $currentSpecPossession) { //Wrap the current specpossession value in a Zend_Currency for easier comparision. $currentSpecPossessionValue = new Zend_Currency(array('value' => $currentSpecPossession['value'], 'precision' => 2)); //Determine if the threshold is exceeded: if ($currentSpecPossessionValue->isMore($specPossessionThreshold)) { $referralReasons[] = $params->uw->rr->tenantsp->specPossession; } } } } else { throw new Zend_Exception("Invalid product."); } return $referralReasons; }