Beispiel #1
0
 /**
  * Get total
  *
  * @return decimal
  */
 public function getTotal()
 {
     if ($this->getItems() && $this->getItems()->last() && $this->getItems()->last()->isXpcFakeItem()) {
         $total = $this->getItems()->last()->getPrice();
     } else {
         $total = parent::getTotal();
     }
     return $total;
 }
Beispiel #2
0
 /**
  * Prepare shopping cart data
  *
  * @param \XLite\Model\Order            $cart           X-Cart shopping cart
  * @param \XLite\Model\Payment\Method   $paymentMethod  Payment method
  * @param integer                       $refId          Transaction ID OPTIONAL
  * @param boolean                       $forceAuth      Force enable AUTH mode OPTIONAL
  *
  * @return array
  */
 public function prepareCart(\XLite\Model\Order $cart, \XLite\Model\Payment\Method $paymentMethod, $refId = null, $forceAuth = false)
 {
     $config = \XLite\Core\Config::getInstance()->CDev->XPaymentsConnector;
     $profile = $cart->getProfile();
     $result = array('login' => $profile->getLogin() . ' (User ID #' . $profile->getProfileId() . ')', 'items' => array(), 'currency' => $this->getCurrencyCode($paymentMethod), 'shippingCost' => 0.0, 'taxCost' => 0.0, 'discount' => 0.0, 'totalCost' => 0.0, 'description' => 'Order#' . $cart->getOrderNumber(), 'merchantEmail' => \XLite\Core\Config::getInstance()->Company->orders_department, 'forceTransactionType' => $forceAuth ? 'A' : '');
     $result['billingAddress'] = $this->prepareAddress($profile);
     if ($profile->getShippingAddress()) {
         $result['shippingAddress'] = $this->prepareAddress($profile, 'shipping');
     } else {
         $result['shippingAddress'] = $result['billingAddress'];
     }
     // Set items
     if ($cart->getItems()) {
         foreach ($cart->getItems() as $item) {
             $itemElement = array('sku' => strval($item->getSku() ? $item->getSku() : $item->getName()), 'name' => strval($item->getName() ? $item->getName() : $item->getSku()), 'price' => $this->roundCurrency($item->getPrice()), 'quantity' => $item->getAmount());
             if (!$itemElement['sku']) {
                 $itemElement['sku'] = 'N/A';
             }
             if (!$itemElement['name']) {
                 $itemElement['name'] = 'N/A';
             }
             $result['items'][] = $itemElement;
         }
     }
     // Set costs
     $result['shippingCost'] = $this->roundCurrency($cart->getSurchargesSubtotal(\XLite\Model\Base\Surcharge::TYPE_SHIPPING, false));
     $result['taxCost'] = $this->roundCurrency($cart->getSurchargesSubtotal(\XLite\Model\Base\Surcharge::TYPE_TAX, false));
     $result['totalCost'] = $this->roundCurrency($cart->getTotal());
     $result['discount'] = $this->roundCurrency(abs($cart->getSurchargesSubtotal(\XLite\Model\Base\Surcharge::TYPE_DISCOUNT, false)));
     return $result;
 }
Beispiel #3
0
 /**
  * Convert order to array for SetExpressCheckout
  *
  * @param \XLite\Model\Order $order Order
  *
  * @return array
  * @see    https://developer.paypal.com/docs/classic/api/merchant/SetExpressCheckout_API_Operation_NVP/
  */
 public function convertSetExpressCheckoutParams($order)
 {
     /** @var \XLite\Model\Currency $currency */
     $currency = $order->getCurrency();
     $orderTotal = $currency->roundValue($order->getTotal());
     $shippingCost = $this->getShippingCost($order);
     /** @var \XLite\Module\CDev\Paypal\Model\Payment\Processor\ExpressCheckoutMerchantAPI $processor */
     $processor = $this->getProcessor();
     $params = array('RETURNURL' => $processor->getPaymentReturnUrl(), 'CANCELURL' => $processor->getPaymentCancelUrl(), 'NOSHIPPING' => null === $shippingCost ? '1' : '0', 'ALLOWNOTE' => 1, 'PAYMENTREQUEST_0_AMT' => $orderTotal, 'PAYMENTREQUEST_0_PAYMENTACTION' => $this->getPaymentAction(), 'PAYMENTREQUEST_0_CURRENCYCODE' => $currency->getCode(), 'PAYMENTREQUEST_0_HANDLINGAMT' => 0, 'PAYMENTREQUEST_0_INSURANCEAMT' => 0, 'PAYMENTREQUEST_0_SHIPPINGAMT' => (double) $shippingCost);
     if (\XLite\Core\Config::getInstance()->Security->customer_security) {
         $postData['HDRIMG'] = urlencode(\XLite\Module\CDev\Paypal\Main::getLogo());
     }
     $items = $this->getItems($order);
     // To avoid total mismatch clear tax and shipping cost
     $taxAmt = isset($items['PAYMENTREQUEST_0_TAXAMT']) ? $items['PAYMENTREQUEST_0_TAXAMT'] : 0;
     if (abs($orderTotal - $items['PAYMENTREQUEST_0_ITEMAMT'] - $taxAmt - $shippingCost) <= 1.0E-10) {
         $params += $items;
     } else {
         $itemsAmt = $orderTotal - (double) $shippingCost;
         $params['PAYMENTREQUEST_0_ITEMAMT'] = $itemsAmt;
     }
     $type = \XLite\Core\Session::getInstance()->ec_type;
     /** @var \XLite\Model\Profile $profile */
     $profile = $order->getProfile();
     if (\XLite\Module\CDev\Paypal\Model\Payment\Processor\ExpressCheckout::EC_TYPE_SHORTCUT == $type) {
         $params['REQCONFIRMSHIPPING'] = 0;
     }
     if ($profile && $profile->getLogin()) {
         $params += array('EMAIL' => $profile->getLogin());
     }
     if ($profile && $profile->getBillingAddress()) {
         $params += array('PHONENUM' => $profile->getBillingAddress()->getPhone());
     }
     if (null !== $shippingCost && $profile && $profile->getShippingAddress()) {
         /** @var \XLite\Model\Address $address */
         $address = $profile->getShippingAddress();
         $params += array('ADDROVERRIDE' => 1, 'PAYMENTREQUEST_0_SHIPTONAME' => trim($address->getFirstname() . ' ' . $address->getLastname()), 'PAYMENTREQUEST_0_SHIPTOSTREET' => $address->getStreet(), 'PAYMENTREQUEST_0_SHIPTOSTREET2' => '', 'PAYMENTREQUEST_0_SHIPTOCITY' => $address->getCity(), 'PAYMENTREQUEST_0_SHIPTOSTATE' => $address->getState()->getCode() ?: $address->getState()->getState(), 'PAYMENTREQUEST_0_SHIPTOZIP' => $address->getZipcode(), 'PAYMENTREQUEST_0_SHIPTOCOUNTRY' => $address->getCountry()->getCode());
     }
     if (\XLite\Core\Auth::getInstance()->isLogged()) {
         $profile = \XLite\Core\Auth::getInstance()->getProfile();
         if ($profile->isSocialProfile() && 'PayPal' == $profile->getSocialLoginProvider() && \XLite\Core\Session::getInstance()->paypalAccessToken) {
             $accessToken = \XLite\Core\Session::getInstance()->paypalAccessToken;
             if (LC_START_TIME < $accessToken['expirationTime']) {
                 $params['IDENTITYACCESSTOKEN'] = $accessToken['access_token'];
             }
         }
     }
     return $params;
 }
Beispiel #4
0
 /**
  * Return true if order changes can not be saved
  *
  * @param \XLite\Model\Order $order Order entity
  *
  * @return boolean
  */
 protected function isForbiddenOrderChanges(\XLite\Model\Order $order)
 {
     $result = false;
     if (0 > $order->getTotal()) {
         $result = true;
         \XLite\Core\TopMessage::addError('Order changes cannot be saved due to negative total value');
     }
     return $result;
 }
Beispiel #5
0
 /**
  * Convert order to array for CreateSecureToken
  *
  * @param \XLite\Model\Order $order Order
  *
  * @return array
  * @see    https://www.paypalobjects.com/webstatic/en_US/developer/docs/pdf/pfp_expresscheckout_pp.pdf
  */
 public function convertCreateSecureTokenParams($order)
 {
     /** @var \XLite\Model\Currency $currency */
     $currency = $order->getCurrency();
     $orderTotal = $currency->roundValue($order->getTotal());
     $shippingCost = $this->getShippingCost($order);
     /** @var \XLite\Module\CDev\Paypal\Model\Payment\Processor\ExpressCheckoutMerchantAPI $processor */
     $processor = $this->getProcessor();
     /** @var \XLite\Model\Profile $profile */
     $profile = $order->getProfile();
     /** @var \XLite\Model\Address $billingAddress */
     $billingAddress = $profile->getBillingAddress();
     $postData = array('CREATESECURETOKEN' => 'Y', 'SECURETOKENID' => $this->getSecureTokenId(), 'TRXTYPE' => $this->getPaymentAction(), 'AMT' => $orderTotal, 'BILLTOFIRSTNAME' => $billingAddress->getFirstname(), 'BILLTOLASTNAME' => $billingAddress->getLastname(), 'BILLTOSTREET' => $billingAddress->getStreet(), 'BILLTOCITY' => $billingAddress->getCity(), 'BILLTOSTATE' => $billingAddress->getState()->getCode() ?: $billingAddress->getState()->getState(), 'BILLTOZIP' => $billingAddress->getZipcode(), 'BILLTOCOUNTRY' => strtoupper($billingAddress->getCountry()->getCode()), 'ERRORURL' => $processor->getPaymentReturnUrl(), 'RETURNURL' => $processor->getPaymentReturnUrl(), 'CANCELURL' => $processor->getPaymentCancelUrl(), 'NOTIFYURL' => $processor->getPaymentCallbackUrl(), 'RETURNURLMETHOD' => 'POST', 'URLMETHOD' => 'POST', 'TEMPLATE' => 'MINLAYOUT', 'BILLTOPHONENUM' => $billingAddress->getPhone(), 'BILLTOEMAIL' => $profile->getLogin(), 'ADDROVERRIDE' => '1', 'NOSHIPPING' => null === $shippingCost ? '1' : '0', 'FREIGHTAMT' => (double) $shippingCost, 'HANDLINGAMT' => 0, 'INSURANCEAMT' => 0, 'SILENTPOST' => 'TRUE', 'SILENTPOSTURL' => $processor->getPaymentCallbackUrl(), 'FORCESILENTPOST' => 'FALSE', 'DISABLERECEIPT' => 'TRUE', 'CURRENCY' => $currency->getCode());
     if (null !== $shippingCost) {
         /** @var \XLite\Model\Address $shippingAddress */
         $shippingAddress = $profile->getShippingAddress();
         $postData += array('SHIPTOPHONENUM' => $shippingAddress->getPhone(), 'SHIPTOFIRSTNAME' => $shippingAddress->getFirstname(), 'SHIPTOLASTNAME' => $shippingAddress->getLastname(), 'SHIPTOSTREET' => $shippingAddress->getStreet(), 'SHIPTOCITY' => $shippingAddress->getCity(), 'SHIPTOSTATE' => $shippingAddress->getState()->getCode() ?: $shippingAddress->getState()->getState(), 'SHIPTOZIP' => $shippingAddress->getZipcode(), 'SHIPTOCOUNTRY' => $shippingAddress->getCountry()->getCode(), 'SHIPTOEMAIL' => $profile->getLogin());
     }
     $items = $this->getItems($order);
     // To avoid total mismatch clear tax and shipping cost
     $taxAmt = isset($items['TAXAMT']) ? $items['TAXAMT'] : 0;
     if (abs($orderTotal - $items['ITEMAMT'] - $taxAmt - $shippingCost) > 1.0E-10) {
         $items['ITEMAMT'] = $orderTotal;
         $items['TAXAMT'] = 0;
         $postData['FREIGHTAMT'] = 0;
     }
     if (static::REQUEST_LENGTH_LIMIT > strlen($this->convertParams($postData) . $this->convertParams($items))) {
         $postData += $items;
     }
     return $postData;
 }
 /**
  * {@inheritDoc}
  */
 public function getTotal()
 {
     $this->__initializer__ && $this->__initializer__->__invoke($this, 'getTotal', array());
     return parent::getTotal();
 }
Beispiel #7
0
 /**
  * Collect statistics record
  *
  * @param string             $row   Row identificator
  * @param \XLite\Model\Order $order Order
  *
  * @return void
  */
 protected function collectStatsRecord($row, $order)
 {
     foreach ($this->getStatsColumns() as $period) {
         if ($order->getDate() >= $this->getStartTime($period)) {
             if ($this->isTotalsRow($row)) {
                 $this->stats[$row][$period] += $order->getTotal();
             } else {
                 $this->stats[$row][$period] += 1;
             }
         }
     }
 }