public function finish_cc_processing()
 {
     $return_code = $this->sales_controller->input->get("ReturnCode");
     //TODO
     //Check return code 0
     //Check return code 101: Decline
     //Only make verify payment call with the above return codes
     $service_url = (!defined("ENVIRONMENT") or ENVIRONMENT == 'development') ? 'https://hc.mercurydev.net/hcws/hcservice.asmx?WSDL' : 'https://hc.mercurypay.com/hcws/hcservice.asmx?WSDL';
     $parameters = array('request' => array('MerchantID' => $this->sales_controller->Location->get_info_for_key('merchant_id'), 'PaymentID' => $this->sales_controller->input->get('PaymentID'), 'Password' => $this->sales_controller->Location->get_info_for_key('merchant_password')));
     $client = new SoapClient($service_url, array('trace' => TRUE));
     $result = $client->VerifyPayment($parameters);
     $response_code = $result->VerifyPaymentResult->ResponseCode;
     $status = $result->VerifyPaymentResult->Status;
     $total_amount = $result->VerifyPaymentResult->Amount;
     $auth_amount = $result->VerifyPaymentResult->AuthAmount;
     $auth_code = $result->VerifyPaymentResult->AuthCode;
     $acq_ref_data = $result->VerifyPaymentResult->AcqRefData;
     $ref_no = $result->VerifyPaymentResult->RefNo;
     $token = $result->VerifyPaymentResult->Token;
     $masked_account = $result->VerifyPaymentResult->MaskedAccount;
     $process_data = $result->VerifyPaymentResult->ProcessData;
     $card_issuer = $result->VerifyPaymentResult->CardType;
     if ($response_code == 0 && $status == 'Approved') {
         $result = $client->AcknowledgePayment($parameters);
         $response_code = $result->AcknowledgePaymentResult;
         $this->sales_controller->session->set_userdata('ref_no', $ref_no);
         $this->sales_controller->session->set_userdata('auth_code', $auth_code);
         if ($response_code == 0 && $auth_amount == $total_amount) {
             $this->sales_controller->session->set_userdata('masked_account', $masked_account);
             $this->sales_controller->session->set_userdata('card_issuer', $card_issuer);
             $info = $this->sales_controller->Customer->get_info($this->sales_controller->sale_lib->get_customer());
             //We want to save/update card:
             //1. User decides to save credit card info
             //2. We already have a saved credit and need to update
             if (($this->sales_controller->sale_lib->get_save_credit_card_info() or $info->cc_token && $info->cc_preview) && $this->sales_controller->sale_lib->get_customer() != -1) {
                 $person_info = array('person_id' => $this->sales_controller->sale_lib->get_customer());
                 $customer_info = array('cc_token' => $token, 'cc_preview' => $masked_account, 'card_issuer' => $card_issuer);
                 $this->sales_controller->Customer->save($person_info, $customer_info, $this->sales_controller->sale_lib->get_customer());
             }
             //If the sale payments cover the total, redirect to complete (receipt)
             if ($this->sales_controller->_payments_cover_total()) {
                 redirect(site_url('sales/complete'));
             } else {
                 $invoice_number = substr(date('mdy') . (time() - strtotime("today")) . $this->sales_controller->Employee->get_logged_in_employee_info()->person_id, 0, 16);
                 $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);
             }
         } elseif ($response_code == 0 && $auth_amount < $total_amount) {
             $invoice_number = substr(date('mdy') . (time() - strtotime("today")) . $this->sales_controller->Employee->get_logged_in_employee_info()->person_id, 0, 16);
             $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' => $auth_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'), $auth_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 {
             $this->sales_controller->_reload(array('error' => lang('sales_acknowledge_payment_failed_please_contact_support')), false);
         }
     } else {
         $client->AcknowledgePayment($parameters);
         $this->sales_controller->_reload(array('error' => $result->VerifyPaymentResult->StatusMessage . ': ' . $result->VerifyPaymentResult->DisplayMessage), false);
     }
 }