/**
  * Call PAYMENT_CHANGE with the subtype full or 
  * part cancellation and updates order and item data
  */
 public static function cancelAction()
 {
     $post = rpGlobals::getPost();
     $orderId = rpGlobals::getPostEntry('order_number');
     $order = new order($orderId);
     $payment = rpLoader::getRatepayPayment($order->info['payment_method']);
     $transactionId = rpDb::getRatepayOrderDataEntry($orderId, 'transaction_id');
     $transactionShortId = rpDb::getRatepayOrderDataEntry($orderId, 'transaction_short_id');
     $subType = 'cancellation';
     $data = array('HeadInfo' => rpRequestMapper::getHeadInfoModel($order, $transactionId, $transactionShortId, $orderId, $subType), 'BasketInfo' => rpRequestMapper::getBasketInfoModel($order, $orderId, self::getCancelPostData($post), $subType), 'PaymentInfo' => rpRequestMapper::getPaymentInfoModel($order, $orderId, self::getCancelPostData($post), $subType));
     $requestService = new rpRequestService($payment->sandbox, $data);
     $result = $requestService->callPaymentChange();
     rpDb::xmlLog($order, $requestService->getRequest(), $orderId, $requestService->getResponse());
     if ($result) {
         rpSession::setRpSessionEntry('message_css_class', 'messageStackSuccess');
         rpSession::setRpSessionEntry('message', RATEPAY_ORDER_MESSAGE_CANCEL_SUCCESS);
         rpDb::cancelRpOrder(self::getCancelPostData($post), $order);
         rpDb::setRpHistoryEntrys($post, 'PAYMENT_CHANGE', $subType);
         rpDb::cancelOrRefundShopItems($post, $orderId);
         rpDb::updateShopOrderTotals($orderId);
     } else {
         rpSession::setRpSessionEntry('message_css_class', 'messageStackError');
         rpSession::setRpSessionEntry('message', RATEPAY_ORDER_MESSAGE_CANCEL_ERROR);
     }
     xtc_redirect(xtc_href_link("ratepay_order.php", 'oID=' . $orderId, 'SSL'));
 }