public function start_cc_processing()
 {
     $service_url = (!defined("ENVIRONMENT") or ENVIRONMENT == 'development') ? 'https://hc.mercurydev.net/hcws/hcservice.asmx?WSDL' : 'https://hc.mercurypay.com/hcws/hcservice.asmx?WSDL';
     $cc_amount = to_currency_no_money($this->sales_controller->sale_lib->get_payment_amount(lang('sales_credit')));
     $tax_amount = to_currency_no_money(($this->sales_controller->sale_lib->get_total() - $this->sales_controller->sale_lib->get_subtotal()) * ($cc_amount / $this->sales_controller->sale_lib->get_total()));
     $customer_id = $this->sales_controller->sale_lib->get_customer();
     $customer_name = '';
     if ($customer_id != -1) {
         $customer_info = $this->sales_controller->Customer->get_info($customer_id);
         $customer_name = $customer_info->first_name . ' ' . $customer_info->last_name;
     }
     if (!$this->sales_controller->sale_lib->get_use_saved_cc_info()) {
         $invoice_number = substr(date('mdy') . (time() - strtotime("today")) . $this->sales_controller->Employee->get_logged_in_employee_info()->person_id, 0, 16);
         $parameters = array('request' => array('MerchantID' => $this->sales_controller->Location->get_info_for_key('merchant_id'), 'Password' => $this->sales_controller->Location->get_info_for_key('merchant_password'), 'TranType' => $cc_amount > 0 ? 'Sale' : 'Return', 'TotalAmount' => abs($cc_amount), 'PartialAuth' => 'On', 'Frequency' => 'OneTime', 'OperatorID' => (!defined("ENVIRONMENT") or ENVIRONMENT == 'development') ? 'test' : $this->sales_controller->Employee->get_logged_in_employee_info()->person_id, 'Invoice' => $invoice_number, 'Memo' => 'PHP POS ' . APPLICATION_VERSION, 'TaxAmount' => abs($tax_amount), 'CardHolderName' => substr(preg_replace("/[^A-Za-z ]/", '', $customer_name), 0, 30), 'ForceManualTablet' => 'Off', 'ProcessCompleteUrl' => site_url('sales/finish_cc_processing'), 'ReturnUrl' => site_url('sales/cancel_cc_processing'), 'LaneID' => $this->sales_controller->Employee->get_logged_in_employee_current_register_id() ? $this->sales_controller->Employee->get_logged_in_employee_current_register_id() : 0));
         if (isset($customer_info) && $customer_info->zip && $this->_is_valid_zip($customer_info->zip)) {
             $customer_info->zip = str_replace('-', '', $customer_info->zip);
             $parameters['request']['AVSZip'] = $customer_info->zip;
         }
         $client = new SoapClient($service_url, array('trace' => TRUE));
         $result = $client->InitializePayment($parameters);
         $response_code = $result->InitializePaymentResult->ResponseCode;
         if ($response_code == 0) {
             $payment_id = $result->InitializePaymentResult->PaymentID;
             $hosted_checkout_url = (!defined("ENVIRONMENT") or ENVIRONMENT == 'development') ? 'https://hc.mercurydev.net/CheckoutPOS.aspx' : 'https://hc.mercurypay.com/CheckoutPOS.aspx';
             $this->sales_controller->load->view('sales/mercury_hosted_checkout', array('payment_id' => $payment_id, 'hosted_checkout_url' => $hosted_checkout_url));
         } else {
             $this->sales_controller->_reload(array('error' => lang('sales_credit_card_processing_is_down')), false);
         }
     } elseif ($customer_info->cc_token) {
         $service_url = (!defined("ENVIRONMENT") or ENVIRONMENT == 'development') ? 'https://hc.mercurydev.net/tws/transactionservice.asmx?WSDL' : 'https://hc.mercurypay.com/tws/transactionservice.asmx?WSDL';
         $client = new SoapClient($service_url, array('trace' => TRUE));
         $invoice_number = substr(date('mdy') . (time() - strtotime("today")) . $this->sales_controller->Employee->get_logged_in_employee_info()->person_id, 0, 16);
         $parameters = array('request' => array('Token' => $customer_info->cc_token, 'MerchantID' => $this->sales_controller->Location->get_info_for_key('merchant_id'), 'PurchaseAmount' => $cc_amount, 'PartialAuth' => FALSE, 'Frequency' => 'OneTime', 'OperatorID' => (!defined("ENVIRONMENT") or ENVIRONMENT == 'development') ? 'test' : $this->sales_controller->Employee->get_logged_in_employee_info()->person_id, 'Invoice' => $invoice_number, 'Memo' => 'PHP POS ' . APPLICATION_VERSION, 'TaxAmount' => $tax_amount, 'CardHolderName' => substr(preg_replace("/[^A-Za-z ]/", '', $customer_name), 0, 30)), 'password' => $this->sales_controller->Location->get_info_for_key('merchant_password'));
         if (isset($customer_info) && $customer_info->zip && $this->_is_valid_zip($customer_info->zip)) {
             $customer_info->zip = str_replace('-', '', $customer_info->zip);
             $parameters['request']['Zip'] = $customer_info->zip;
         }
         $result = $client->CreditSaleToken($parameters);
         $status = $result->CreditSaleTokenResult->Status;
         if ($status == 'Approved') {
             $token = $result->CreditSaleTokenResult->Token;
             $ref_no = $result->CreditSaleTokenResult->RefNo;
             $auth_code = $result->CreditSaleTokenResult->AuthCode;
             $masked_account = $customer_info->cc_preview;
             $card_issuer = $customer_info->card_issuer;
             $acq_ref_data = $result->CreditSaleTokenResult->AcqRefData;
             $process_data = $result->CreditSaleTokenResult->ProcessData;
             $person_info = array('person_id' => $this->sales_controller->sale_lib->get_customer());
             $customer_info = array('cc_token' => $token);
             $this->sales_controller->Customer->save($person_info, $customer_info, $this->sales_controller->sale_lib->get_customer());
             $this->sales_controller->session->set_userdata('ref_no', $ref_no);
             $this->sales_controller->session->set_userdata('auth_code', $auth_code);
             $this->sales_controller->session->set_userdata('masked_account', $masked_account);
             $this->sales_controller->session->set_userdata('card_issuer', $card_issuer);
             //If the sale payments cover the total, redirect to complete (receipt)
             if ($this->sales_controller->_payments_cover_total()) {
                 redirect(site_url('sales/complete'));
             } else {
                 $credit_card_amount = to_currency_no_money($this->sales_controller->sale_lib->get_payment_amount(lang('sales_credit')));
                 $partial_transaction = array('AuthCode' => $auth_code, 'Frequency' => 'OneTime', 'Memo' => 'PHP POS ' . APPLICATION_VERSION, 'Invoice' => $invoice_number, 'MerchantID' => $this->sales_controller->Location->get_info_for_key('merchant_id'), 'OperatorID' => (!defined("ENVIRONMENT") or ENVIRONMENT == 'development') ? 'test' : $this->sales_controller->Employee->get_logged_in_employee_info()->person_id, 'PurchaseAmount' => $credit_card_amount, 'RefNo' => $ref_no, 'Token' => $token, 'AcqRefData' => $acq_ref_data, 'ProcessData' => $process_data);
                 $this->sales_controller->sale_lib->delete_payment($this->sales_controller->sale_lib->get_payment_ids(lang('sales_credit')));
                 $this->sales_controller->sale_lib->add_payment(lang('sales_partial_credit'), $credit_card_amount, FALSE, $masked_account, $card_issuer);
                 $this->sales_controller->sale_lib->add_partial_transaction($partial_transaction);
                 $this->sales_controller->_reload(array('warning' => lang('sales_credit_card_partially_charged_please_complete_sale_with_another_payment_method')), false);
             }
         } else {
             //If we have failed, remove cc token and cc preview
             $person_info = array('person_id' => $this->sales_controller->sale_lib->get_customer());
             $customer_info = array('cc_token' => NULL, 'cc_preview' => NULL, 'card_issuer' => NULL);
             $this->sales_controller->Customer->save($person_info, $customer_info, $this->sales_controller->sale_lib->get_customer());
             //Clear cc token for using saved cc info
             $this->sales_controller->sale_lib->clear_use_saved_cc_info();
             $this->sales_controller->_reload(array('error' => lang('sales_charging_card_failed_please_try_again')), false);
         }
     }
 }