Files
grzanieplus.pl/plugins/stPlaypalPlugin/lib/stPayPalExpressCheckout.class.php
2025-03-12 17:06:23 +01:00

241 lines
9.0 KiB
PHP

<?php
class stPayPalExpressCheckout {
public function addOrder($response, Product $product) {
$config = stConfig::getInstance('stPaypal');
$custom = $response->getPaymentRequest_0_Custom();
if (!empty($custom)) $custom = json_decode($custom, true);
/**
* User
**/
$c = new Criteria();
$c->add(sfGuardUserPeer::USERNAME, $response->getEmail());
$user = sfGuardUserPeer::doSelectOne($c);
$billingUserData = $this->getUserDataFromResponse($response, new UserData());
$deliveryUserData = clone $billingUserData;
if (is_null($user)) {
$user = stUser::addUser($response->getEmail());
$billingUserData->setSfGuardUserId($user->getId());
$billingUserData->setIsDefault(1);
$billingUserData->setIsBilling(1);
$billingUserData->save();
$deliveryUserData->setSfGuardUserId($user->getId());
$deliveryUserData->setIsDefault(1);
$deliveryUserData->setIsBilling(0);
$deliveryUserData->save();
} else {
$c = new Criteria();
$c->add(UserDataPeer::SF_GUARD_USER_ID, $user->getId());
$c->add(UserDataPeer::IS_BILLING, 1);
$c->add(UserDataPeer::IS_DEFAULT, 1);
$defaultBillingUserData = UserDataPeer::doSelectOne($c);
$c = new Criteria();
$c->add(UserDataPeer::SF_GUARD_USER_ID, $user->getId());
$c->add(UserDataPeer::IS_BILLING, 0);
$c->add(UserDataPeer::IS_DEFAULT, 1);
$defaultDeliveryUserData = UserDataPeer::doSelectOne($c);
$stUser = sfContext::getInstance()->getUser();
if (!$stUser->thisSameUserDataObject($defaultBillingUserData, $billingUserData)) {
$billingUserData->setSfGuardUserId($user->getId());
$billingUserData->setIsBilling(1);
$billingUserData->save();
stUser::setDefaultUserData($billingUserData->getId(), 1, $user->getId());
}
if (!$stUser->thisSameUserDataObject($defaultDeliveryUserData, $deliveryUserData)) {
$deliveryUserData->setSfGuardUserId($user->getId());
$deliveryUserData->save();
stUser::setDefaultUserData($deliveryUserData->getId(), 0, $user->getId());
}
}
/**
* Order
**/
$order = new Order();
$order->setClientCulture(sfContext::getInstance()->getUser()->getCulture());
$order->setHost(sfContext::getInstance()->getRequest()->getHost());
$order->setOrderStatus(OrderStatusPeer::retrieveDefaultPendingStatus());
/**
* User billing and delivery data for order
**/
$order->setGuardUser($user);
$orderBilling = $this->mirrorUserData($order->getOrderUserDataBilling(), $billingUserData);
$orderDelivery = $this->mirrorUserData($order->getOrderUserDataDelivery(), $deliveryUserData);
/**
* Order currency
**/
$orderCurrency = $order->getOrderCurrency();
$c = new Criteria();
$c->add(CurrencyPeer::SHORTCUT, $response->getPaymentRequest_0_CurrencyCode());
$currency = CurrencyPeer::doSelectOne($c);
$orderCurrency->setName($currency->getName());
$orderCurrency->setExchange($currency->getExchange());
$orderCurrency->setFrontSymbol($currency->getFrontSymbol());
$orderCurrency->setBackSymbol($currency->getBackSymbol());
$orderCurrency->setShortcut($currency->getShortcut());
$orderProduct = new OrderProduct();
$orderProduct->setProductId($product->getId());
$orderProduct->setQuantity($response->getL_PaymentRequest_0_Qty0());
$orderProduct->setCode($product->getCode());
$orderProduct->setName($product->getName());
$orderProduct->setBasePriceBrutto($response->getL_PaymentRequest_0_Amt0());
$orderProduct->setImage($product->getOptImage());
$orderProduct->setTax($product->getTax());
$orderProduct->setPointsEarn($product->getPointsEarn());
$priceModifiers = $product->getPriceModifiers();
if ($priceModifiers)
{
foreach ($priceModifiers as $index => $price_modifier)
{
$priceModifiers[$index]['value'] = null;
if (isset($priceModifiers[$index]['custom']['label']))
{
$priceModifiers[$index]['label'] = $priceModifiers[$index]['custom']['label'];
}
}
$orderProduct->setPriceModifiers($priceModifiers);
}
$order->addOrderProduct($orderProduct);
/**
* Order delivery
**/
$delivery = DeliveryPeer::retrieveByPK($config->get('express_delivery'));
$orderDelivery = $order->getOrderDelivery();
$orderDelivery->setName($delivery->getName());
$orderDelivery->setTaxId($delivery->getTaxId());
$orderDelivery->setDeliveryId($delivery->getId());
$orderDelivery->setCostBrutto($response->getPaymentRequest_0_ShippingAmt()*$currency->getExchange());
$orderDelivery->setOptTax($delivery->getTax()->getVat());
/**
* Confirm order
**/
if (stUser::isFullAccount($user)) {
$order->setIsConfirmed(1);
}
/**
* Save order
**/
$order->save();
/**
* Generate order number
**/
$dateFormat = new sfDateFormat();
$orderConfig = stConfig::getInstance('stOrder');
$format = $orderConfig->get('number_format');
$date = $dateFormat->getDate($order->getCreatedAt(), 'd');
$number = str_replace(array('{NUMER}', '{DZIEN}', '{MIESIAC}', '{ROK}'), array($order->getId(), $date['mday'], $date['mon'], $date['year']), $format);
$order->setNumber($number);
$order->save();
/**
* Payment
**/
$c = new Criteria();
$c->add(PaymentTypePeer::MODULE_NAME, 'stPaypal');
$paymentType = PaymentTypePeer::doSelectOne($c);
$stPayment = new stPayment();
$paymentId = $stPayment->add($user->getId(), $paymentType->getId(), stPayment::getUnpayedAmountByOrder($order));
$stPayment->addPaymentForOrder($order->getId(), $paymentId);
/**
* Invoice
**/
stInvoiceListener::crateInvoiceProforma($order);
return $order;
}
protected function getUserDataFromResponse(stPaypalCallerResponse $r, UserData $u) {
$u->setFullName($r->getPaymentRequest_0_ShipToName());
$u->setAddress($r->getPaymentRequest_0_ShipToStreet());
$u->setCode($r->getPaymentRequest_0_ShipToZip());
$u->setTown($r->getPaymentRequest_0_ShipToCity());
$u->setRegion($r->getPaymentRequest_0_ShipToState());
$c = new Criteria();
$c->add(CountriesPeer::ISO_A2, $r->getPaymentRequest_0_ShipToCountryCode());
$country = CountriesPeer::doSelectOne($c);
$u->setCountriesId(is_null($country) ? '36' : $country->getId());
return $u;
}
protected function mirrorUserData($target, $source) {
$attributes = array('countries', 'full_name', 'address', 'region', 'code', 'town');
foreach($attributes as $attribute) {
$setter = 'set'.sfInflector::camelize($attribute);
$getter = 'get'.sfInflector::camelize($attribute);
$target->$setter($source->$getter());
}
}
public static function validateProduct(Product $product, $quantity) {
$context = sfContext::getInstance();
$i18n = $context->getI18n();
if ($product->getPriceBrutto() <= 0)
return self::returnValidareProductError($i18n->__('Cena produktu musi być większa niż 0'));
if (!is_numeric($quantity) || empty($quantity))
return self::returnValidareProductError($i18n->__('Podana wartość musi być liczbą całkowitą...', null, 'stBasket'));
$minAmount = stConfig::getInstance('stOrder')->get('min_amount', 0);
if ($minAmount > 0 && $minAmount > $product->getPriceBrutto())
return self::returnValidareProductError($i18n->__('Minimalna wartość zamówienia wynosi %min_amount%', array('%min_amount%' => st_price($min_amount, true, true)), 'stOrder'));
$maxQuantity = $product->getStock();
if ($product->getStock() == null || !$product->getIsStockValidated())
$maxQuantity = stConfig::getInstance('stBasket')->get('max_quantity', 0);
$productMaxQty = $product->getMaxQty();
$max = $productMaxQty && $productMaxQty < $maxQuantity ? $productMaxQty : $maxQuantity;
if ($max < $quantity)
return self::returnValidareProductError($i18n->__('Brak wymaganej ilości towaru w magazynie', null, 'stBasket'));
return true;
}
public static function returnValidareProductError($message) {
sfContext::getInstance()->getUser()->setAttribute('express_checkout_error', $message, 'stPaypal');
return false;
}
}