soapApiClient = $soapApiClient; $this->logger = $logger; $this->orderRepository = $orderRepository; $this->request = $request; $this->optionsProvider = $optionsProvider; $this->messageManager = $messageManager; $this->commonLogic = $commonLogic; } /** * Process action. * * @return void */ public function processAction(): void { $order = $this->commonLogic->getOrder(); $redirectTo = $this->request->getQuery( PacketActionsCommonLogic::PARAM_REDIRECT_TO ); $packetId = $this->request->getQuery( PacketActionsCommonLogic::PARAM_PACKET_ID ); if ( null === $order ) { $record = new Log\Record(); $record->action = Log\Record::ACTION_PACKET_CANCEL; $record->status = Log\Record::STATUS_ERROR; $record->orderId = null; $record->title = __( 'Packet cancel error', 'packeta' ); $record->params = [ 'referer' => (string) $this->request->getReferer(), 'errorMessage' => 'Order not found', ]; $this->logger->add( $record ); $this->messageManager->flash_message( __( 'Order not found', 'packeta' ), MessageManager::TYPE_ERROR ); $this->commonLogic->redirectTo( $redirectTo, $order ); return; } $this->commonLogic->checkAction( PacketActionsCommonLogic::ACTION_CANCEL_PACKET, $order ); $this->cancelPacket( $order, $packetId ); $this->commonLogic->redirectTo( $redirectTo, $order ); } /** * Cancels single packet. * * @param Entity\Order $order Order ID. * @param string|null $packetId Packet ID. * * @return void */ public function cancelPacket( Entity\Order $order, ?string $packetId ): void { if ( null === $packetId ) { $record = new Log\Record(); $record->action = Log\Record::ACTION_PACKET_CANCEL; $record->status = Log\Record::STATUS_ERROR; $record->orderId = $order->getNumber(); $record->title = __( 'Packet cancel error', 'packeta' ); $record->params = [ 'orderId' => $order->getNumber(), 'packetId' => $packetId, 'referer' => (string) $this->request->getReferer(), 'errorMessage' => 'Packet could not be cancelled', ]; $this->logger->add( $record ); $this->messageManager->flash_message( __( 'Packet could not be cancelled', 'packeta' ), MessageManager::TYPE_ERROR ); return; } $request = new Soap\Request\CancelPacket( $packetId ); $result = $this->soapApiClient->cancelPacket( $request ); if ( ! $result->hasFault() ) { $record = new Log\Record(); $record->action = Log\Record::ACTION_PACKET_CANCEL; $record->status = Log\Record::STATUS_SUCCESS; $record->orderId = $order->getNumber(); $record->title = __( 'Packet cancel success', 'packeta' ); $record->params = [ 'orderId' => $order->getNumber(), 'packetId' => $packetId, ]; $this->logger->add( $record ); $errorMessage = null; } if ( $result->hasFault() ) { $record = new Log\Record(); $record->action = Log\Record::ACTION_PACKET_CANCEL; $record->status = Log\Record::STATUS_ERROR; $record->orderId = $order->getNumber(); $record->title = __( 'Packet cancel error', 'packeta' ); $record->params = [ 'orderId' => $order->getNumber(), 'packetId' => $packetId, 'errorMessage' => $result->getFaultString(), ]; $this->logger->add( $record ); $errorMessage = $result->getFaultString(); } $order->updateApiErrorMessage( $errorMessage ); if ( $packetId === $order->getPacketId() && $this->shouldRevertSubmission( $result ) ) { $order->setIsExported( false ); $order->setIsLabelPrinted( false ); $order->setCarrierNumber( null ); $order->setPacketStatus( null ); $order->setPacketId( null ); $order->updateApiErrorMessage( null ); if ( $result->hasFault() ) { $this->messageManager->flash_message( __( 'Packet could not be canceled in the Packeta system, packet was canceled only in the order list.', 'packeta' ), MessageManager::TYPE_SUCCESS ); } if ( ! $result->hasFault() ) { $this->messageManager->flash_message( __( 'Packet has been successfully canceled both in the order list and the Packeta system.', 'packeta' ), MessageManager::TYPE_SUCCESS ); } } if ( $packetId === $order->getPacketClaimId() && $this->shouldRevertSubmission( $result ) ) { $order->setPacketClaimId( null ); $order->setPacketClaimPassword( null ); $order->updateApiErrorMessage( null ); if ( $result->hasFault() ) { $this->messageManager->flash_message( __( 'Packet claim could not be canceled in the Packeta system, packet was canceled only in the order list.', 'packeta' ), MessageManager::TYPE_SUCCESS ); } if ( ! $result->hasFault() ) { $this->messageManager->flash_message( __( 'Packet claim has been successfully canceled both in the order list and the Packeta system.', 'packeta' ), MessageManager::TYPE_SUCCESS ); } } if ( ! $this->shouldRevertSubmission( $result ) ) { $this->messageManager->flash_message( __( 'Failed to cancel packet. See Packeta log for more details.', 'packeta' ), MessageManager::TYPE_ERROR ); } $this->orderRepository->save( $order ); } /** * Should revert local order submission to Packeta. * * @param Soap\Response\CancelPacket|null $result Packeta API result. * * @return bool */ public function shouldRevertSubmission( ?Soap\Response\CancelPacket $result ): bool { if ( null === $result ) { return false; } $revertSubmission = ! $result->hasFault(); if ( $result->hasCancelNotAllowedFault() && $this->optionsProvider->isPacketCancellationForced() ) { $revertSubmission = true; } return $revertSubmission; } }