/**
  * Perform the reserve_amount call.
  *
  * @param int    $paymentPlan pclass id
  * @param object $addrs       KlarnaAddr object
  * @param string $option      invoice, part or spec
  *
  * @return void
  */
 public function performReservation($paymentPlan, $addrs, $option)
 {
     global $order;
     $addrHandler = new KlarnaAddressXtc();
     // Fixes potential security problem.
     $order->delivery = array_merge($order->delivery, $addrHandler->klarnaAddrToXtcAddr($addrs));
     // $_POST doesn't have phone number anymore, so it won't be
     // properly set by buildXtCommerceAddress
     $order->delivery['telephone'] = $addrs->getTelno();
     $order->billing['telephone'] = $addrs->getTelno();
     $order->customer['telephone'] = $addrs->getTelno();
     $addrs->setEmail($order->customer['email_address']);
     $pno = $_POST['klarna_pno'];
     $reference = KiTT_String::encode($_POST['klarna_reference']);
     if ($_POST["klarna_{$option}_invoice_type"] == 'company' || $addrs->isCompany) {
         // Company purchase, set the firstname in osCommerce to the reference
         // So we don't lose it.
         $order->delivery['firstname'] = KiTT_String::decode($reference);
         // set Ref: comment to make sure KO finds it
         $this->_klarna->setComment("Ref: " . $reference);
         // Set First and Last name so KO doesn't complain one is missing.
         $name = explode(' ', $reference, 2);
         $addrs->setFirstName(strlen($name[0] > 0) ? $name[0] : " ");
         if (strlen($name[1]) > 0) {
             $addrs->setLastName($name[1]);
         } else {
             $addrs->setLastName(" ");
         }
         //Set Company to order
         $order->delivery['company'] = KiTT_String::decode($addrs->getCompanyName());
     } else {
         $order->delivery['company'] = '';
     }
     if (strlen($order->info['comments']) > 0) {
         $this->_klarna->addComment(KiTT_String::encode($order->info['comments']));
     }
     $this->_klarna->setReference($reference, "");
     $shipping = $addrs;
     $gender = null;
     if (KiTT_CountryLogic::needGender($this->_country)) {
         $gender = $_POST['klarna_gender'];
     }
     if (KiTT_CountryLogic::shippingSameAsBilling($this->_country)) {
         $billing = $shipping;
         $order->billing = $order->delivery;
     } else {
         $billing = $addrHandler->xtcAddressToKlarnaAddr($order->billing);
     }
     try {
         $this->_klarna->setAddress(KlarnaFlags::IS_SHIPPING, $shipping);
         $this->_klarna->setAddress(KlarnaFlags::IS_BILLING, $billing);
         $result = $this->_klarna->reserveAmount($pno, $gender, -1, KlarnaFlags::NO_FLAG, $paymentPlan);
         $this->_handleResponse($option, $result, $country);
     } catch (KlarnaException $e) {
         if ($e instanceof Klarna_ArgumentNotSetException || $e instanceof Klarna_InvalidPNOException) {
             $this->setError(htmlentities($this->translate('error_title_2'), ENT_COMPAT, 'UTF-8'), $option);
         } else {
             $this->setError(htmlentities($e->getMessage()) . " (#" . $e->getCode() . ")", $option);
         }
         xtc_redirect($this->errorLink(FILENAME_CHECKOUT_PAYMENT, '', 'SSL', true, false));
     }
 }
 /**
  * This function implements any checks of any conditions after payment
  * method has been selected.
  *
  * @return void
  */
 public function preConfirmationCheck()
 {
     global $order;
     $addressHandler = new KlarnaAddressXtc();
     $this->_utils->cleanPost();
     $this->_addrs = $this->_utils->handlePost($this->_option);
     if ($this->_isPart() || $this->_isSpec()) {
         $this->_paymentPlan = $_SESSION['klarna_paymentPlan'] = (int) $_POST["klarna_{$this->_option}_paymentPlan"];
     } else {
         $this->_paymentPlan = -1;
     }
     $order->delivery = array_merge($order->delivery, $addressHandler->klarnaAddrToXtcAddr($this->_addrs));
     if (KiTT_CountryLogic::shippingSameAsBilling($this->_country)) {
         $order->billing = $order->delivery;
     }
     $_SESSION['klarna_data']['serial_addr'] = serialize($this->_addrs);
 }