diff --git a/Classes/Controller/Order/PaymentController.php b/Classes/Controller/Order/PaymentController.php index d547d52..7793c05 100644 --- a/Classes/Controller/Order/PaymentController.php +++ b/Classes/Controller/Order/PaymentController.php @@ -16,7 +16,9 @@ use Extcode\CartPaypal\Event\Order\CancelEvent; use Extcode\CartPaypal\Event\Order\NotifyEvent; use Extcode\CartPaypal\Event\Order\SuccessEvent; +use Psr\Log\LoggerAwareTrait; use Psr\Log\LoggerInterface; +use TYPO3\CMS\Core\Log\LogManager; use TYPO3\CMS\Core\Log\LogManagerInterface; use TYPO3\CMS\Core\Messaging\AbstractMessage; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -28,6 +30,8 @@ class PaymentController extends ActionController { + use LoggerAwareTrait; + const PAYPAL_API_SANDBOX = 'https://www.sandbox.paypal.com/cgi-bin/webscr?'; const PAYPAL_API_LIVE = 'https://www.paypal.com/cgi-bin/webscr?'; @@ -66,6 +70,16 @@ class PaymentController extends ActionController */ protected $cartConf = []; + /** + * @var string|bool + */ + protected $curlResult; + + /** + * @var array + */ + protected $curlResults; + /** * @var array */ @@ -78,7 +92,8 @@ public function __construct( CartRepository $cartRepository, PaymentRepository $paymentRepository ) { - $this->logger = $logManager->getLogger(); + // $this->logger = $logManager->getLogger(); + $this->logger = GeneralUtility::makeInstance(LogManager::class)->getLogger(__CLASS__); $this->persistenceManager = $persistenceManager; $this->sessionHandler = $sessionHandler; $this->cartRepository = $cartRepository; @@ -183,11 +198,18 @@ public function cancelAction(): void } } - public function notifyAction(): void + public function notifyAction() { if ($this->request->getMethod() !== 'POST') { - $this->response->setStatus(405); - exit(); + if ($this->cartPaypalConf['debug']) { + $this->logger->error( + 'Notify Action called without Post vars. ' . ' In class ' . get_class($this) . ':' . __LINE__, + [ + 'order' => ((!empty($_GET['tx_cartpaypal_cart']['order'])) ? $_GET['tx_cartpaypal_cart']['order'] : 'No order ID given') + ] + ); + } + return $this->htmlResponse()->withStatus(405, 'Method not allowed.'); } $postData = GeneralUtility::_POST(); @@ -195,7 +217,7 @@ public function notifyAction(): void $curlRequest = $this->getCurlRequestFromPostData($postData); if ($this->cartPaypalConf['debug']) { - $this->logger->debug( + $this->logger->error( 'Log Data', [ '$parsedPostData' => $postData, @@ -208,15 +230,37 @@ public function notifyAction(): void $cartSHash = $postData['custom']; if (empty($cartSHash)) { - $this->response->setStatus(403); - exit(); + // debug + if ($this->cartPaypalConf['debug']) { + $this->logger->error( + 'Notify Action called with empty cartSHash. ' . ' In class ' . get_class($this) . ':' . __LINE__, + [ + 'order' => ((!empty($_GET['tx_cartpaypal_cart']['order'])) ? $_GET['tx_cartpaypal_cart']['order'] : 'No order ID given'), + '$parsedPostData' => $postData, + '$curlRequest' => $curlRequest + ] + ); + } + // end debug + return $this->htmlResponse()->withStatus(403, 'Not allowed.'); } $this->loadCartByHash($this->request->getArgument('hash')); if ($this->cart === null) { - $this->response->setStatus(404); - exit(); + // debug + if ($this->cartPaypalConf['debug']) { + $this->logger->error( + 'Notify Action but couldn`t load cart by hash. ' . ' In class ' . get_class($this) . ':' . __LINE__, + [ + 'order' => ((!empty($_GET['tx_cartpaypal_cart']['order'])) ? $_GET['tx_cartpaypal_cart']['order'] : 'No order ID given'), + '$parsedPostData' => $postData, + '$curlRequest' => $curlRequest + ] + ); + } + // end debug + return $this->htmlResponse()->withStatus(404, 'Page / Cart not found.'); } $orderItem = $this->cart->getOrderItem(); @@ -229,10 +273,22 @@ public function notifyAction(): void $notifyEvent = new NotifyEvent($this->cart->getCart(), $orderItem, $this->cartConf); $this->eventDispatcher->dispatch($notifyEvent); + } else { + // debug + if ($this->cartPaypalConf['debug']) { + $this->logger->error( + 'Notify Action success. ' . ' In class ' . get_class($this) . ':' . __LINE__, + [ + 'order' => ((!empty($_GET['tx_cartpaypal_cart']['order'])) ? $_GET['tx_cartpaypal_cart']['order'] : 'No order ID given'), + '$parsedPostData' => $postData, + '$curlRequest' => $curlRequest + ] + ); + } + // end debug } - $this->response->setStatus(200); - exit(); + return $this->htmlResponse()->withStatus(200); } protected function restoreCartSession(): void @@ -297,7 +353,7 @@ protected function execCurlRequest(string $curlRequest): bool } if ($this->cartPaypalConf['debug']) { - $this->logger->debug( + $this->logger->error( 'paypal-payment-api', [ 'curl_info' => curl_getinfo($ch, CURLINFO_HEADER_OUT), diff --git a/Classes/EventListener/Order/Payment/ClearCart.php b/Classes/EventListener/Order/Payment/ClearCart.php index 25f95a6..dc1ef5f 100644 --- a/Classes/EventListener/Order/Payment/ClearCart.php +++ b/Classes/EventListener/Order/Payment/ClearCart.php @@ -10,9 +10,23 @@ */ use Extcode\Cart\Event\Order\EventInterface; +use Extcode\Cart\EventListener\Order\Finish\ClearCart as FinishClearCart; +use Extcode\Cart\Service\SessionHandler; +use Extcode\Cart\Utility\CartUtility; +use Extcode\Cart\Utility\ParserUtility; -class ClearCart extends \Extcode\Cart\EventListener\ProcessOrderCreate\ClearCart +class ClearCart extends FinishClearCart { + public function __construct( + CartUtility $cartUtility, + ParserUtility $parserUtility, + SessionHandler $sessionHandler + ) { + $this->cartUtility = $cartUtility; + $this->parserUtility = $parserUtility; + $this->sessionHandler = $sessionHandler; + } + public function __invoke(EventInterface $event): void { $orderItem = $event->getOrderItem(); diff --git a/Classes/EventListener/Order/Payment/ProviderRedirect.php b/Classes/EventListener/Order/Payment/ProviderRedirect.php index 78c7966..872fcb9 100644 --- a/Classes/EventListener/Order/Payment/ProviderRedirect.php +++ b/Classes/EventListener/Order/Payment/ProviderRedirect.php @@ -12,6 +12,7 @@ use Extcode\Cart\Domain\Model\Cart; use Extcode\Cart\Domain\Model\Cart\Cart as CartCart; use Extcode\Cart\Domain\Model\Cart\CartCoupon; +use Extcode\Cart\Domain\Model\Cart\CartCouponPercentage; use Extcode\Cart\Domain\Model\Order\Item as OrderItem; use Extcode\Cart\Domain\Repository\CartRepository; use Extcode\Cart\Event\Order\PaymentEvent; @@ -229,7 +230,12 @@ protected function addEachCouponFromCartToQuery(): void */ foreach ($this->cart->getCoupons() as $cartCoupon) { if ($cartCoupon->getIsUseable()) { - $discount += $cartCoupon->getDiscount(); + // A.K.: Differentiate between percentage and fixed discount + if ($cartCoupon instanceof CartCouponPercentage) { + $discount += (float)($this->orderItem->getGross() * $cartCoupon->getDiscount()); + } else { + $discount += $cartCoupon->getDiscount(); + } } } diff --git a/Configuration/Services.yaml b/Configuration/Services.yaml index 95766b8..dc17ee4 100644 --- a/Configuration/Services.yaml +++ b/Configuration/Services.yaml @@ -17,6 +17,10 @@ services: $paymentRepository: '@Extcode\Cart\Domain\Repository\Order\PaymentRepository' Extcode\CartPaypal\EventListener\Order\Payment\ClearCart: + arguments: + $cartUtility: '@Extcode\Cart\Utility\CartUtility' + $parserUtility: '@Extcode\Cart\Utility\ParserUtility' + $sessionHandler: '@Extcode\Cart\Service\SessionHandler' tags: - name: event.listener identifier: 'cart-paypal--order--payment--clear-cart' @@ -35,7 +39,7 @@ services: event: Extcode\Cart\Event\Order\PaymentEvent Extcode\CartPaypal\EventListener\Order\Notify\Email: - class: 'Extcode\Cart\EventListener\ProcessOrderCreate\Email' + class: 'Extcode\Cart\EventListener\Order\Finish\Email' tags: - name: event.listener identifier: 'cart-paypal--order--notify--email' diff --git a/Configuration/TCA/Overrides/sys_template.php b/Configuration/TCA/Overrides/sys_template.php index f3e6709..611f5a9 100644 --- a/Configuration/TCA/Overrides/sys_template.php +++ b/Configuration/TCA/Overrides/sys_template.php @@ -1,5 +1,5 @@ + + + + + +
+ +
+
+
diff --git a/composer.json b/composer.json index 06c69fb..2b5507a 100644 --- a/composer.json +++ b/composer.json @@ -12,6 +12,7 @@ "PayPal", "cart" ], + "version": "5.1.0", "authors": [ { "name": "Daniel Gohlke", @@ -29,7 +30,11 @@ }, "config": { "bin-dir": ".build/bin", - "vendor-dir": ".build/vendor" + "vendor-dir": ".build/vendor", + "allow-plugins": { + "typo3/cms-composer-installers": true, + "typo3/class-alias-loader": true + } }, "extra": { "typo3/cms": { @@ -39,15 +44,15 @@ } }, "require": { - "php": ">=7.2.0 <7.5", + "php": ">=7.4.0 <8.2", "ext-curl": "*", - "typo3/cms-core": "^10.4", - "typo3/cms-extbase": "^10.4", - "typo3/cms-frontend": "^10.4", - "extcode/cart": "^7.4" + "typo3/cms-core": "^11.5", + "typo3/cms-extbase": "^11.5", + "typo3/cms-frontend": "^11.5", + "extcode/cart": "^8.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.14", + "friendsofphp/php-cs-fixer": "^3.14", "helmich/typo3-typoscript-lint": "^2.0", "overtrue/phplint": "^1.1" }, diff --git a/ext_emconf.php b/ext_emconf.php index 6599737..d5d768f 100644 --- a/ext_emconf.php +++ b/ext_emconf.php @@ -7,20 +7,11 @@ 'author' => 'Daniel Gohlke', 'author_email' => 'ext.cart@extco.de', 'author_company' => 'extco.de UG (haftungsbeschränkt)', - 'shy' => '', - 'priority' => '', - 'module' => '', 'state' => 'beta', - 'internal' => '', - 'uploadfolder' => '0', - 'createDirs' => '', - 'modify_tables' => '', - 'clearCacheOnLoad' => 0, - 'lockType' => '', 'version' => '5.0.0', 'constraints' => [ 'depends' => [ - 'typo3' => '10.4.0-10.4.99', + 'typo3' => '11.5.0-11.5.99', 'cart' => '7.4.0', ], 'conflicts' => [], diff --git a/ext_localconf.php b/ext_localconf.php index a582ece..4baa585 100644 --- a/ext_localconf.php +++ b/ext_localconf.php @@ -1,6 +1,6 @@