public static function EGOP_transaction_o_complete()
 {
     $id = Core::validate($_GET['id']);
     $hash = Core::validate($_GET['hash']);
     $at = new AtEgop();
     if (!$at->findById($id)) {
         header('Location: ' . URL_WRONG_DATA_INPUT);
         exit;
     }
     if ($hash != self::hash_for_money_output_link($at->getId(), $at->getUID())) {
         header('Location: ' . URL_WRONG_DATA_INPUT);
         exit;
     }
     $currency = new Currency();
     $currency->findById($at->getCurrencyId());
     $wallets = self::EGOP_MinAndMaxWallets($currency);
     $amount = $at->getAmount();
     if ($wallets['max'] == null || $wallets['max']['current_balance'] < $amount) {
         Core::write_log(EGOPAY_LOG_PATH, __FUNCTION__ . ' : Not enough money on this wallet (id) : ' . $wallets['max']['id'] . '(at_egop id=' . $at->getId() . ')');
         header('Location: ' . URL_SERVER_ERROR);
         exit;
     }
     $wallet = new WalletsEgop();
     $wallet->findById($wallets['max']['id']);
     $oAuth = new EgoPayAuth($wallet->getEmail(), $wallet->getApiId(), $wallet->getApiPassword());
     $oEgoPayJsonAgent = new EgoPayJsonApiAgent($oAuth);
     $oEgoPayJsonAgent->setVerifyPeer(false);
     try {
         $oResponse = $oEgoPayJsonAgent->getTransfer($at->getClientAccount(), $at->getAmount(), $currency->getName(), 'Transfer from Bitmonex');
         // for debug
         Core::write_log(EGOPAY_LOG_PATH, __FUNCTION__ . ' : getTransfer response: ' . print_r($oResponse, true));
         reset($oResponse);
         //
     } catch (EgoPayApiException $e) {
         // error codes from here: https://www.egopay.com/developers/api/payments/send-payment
         if ($e->getCode() == 11 || $e->getCode() == 12) {
             header('Location: ' . URL_WRONG_DATA_INPUT);
             exit;
         }
         Core::write_log(EGOPAY_LOG_PATH, __FUNCTION__ . ' : getTransfer Error: ' . $e->getCode() . " : " . $e->getMessage());
         header('Location: ' . URL_SERVER_ERROR);
         exit;
     }
     $limits = self::transactionLimits($currency->getId(), 'EGOP', 1);
     $feeVolume = $amount * $limits['fee'];
     $feeVolume = Core::round_up($feeVolume, 2);
     $purses = Purse::findBy(array('UID' => $at->getUID(), 'CurId' => $currency->getId()));
     $purse = new Purse();
     $purse->findById($purses[0]['id']);
     $purse->addValue(-($amount + $feeVolume));
     $purse->save();
     $systemFeeVolume = $amount * $limits['system_fee'];
     $systemFeeVolume = Core::round_up($systemFeeVolume, 2);
     $profit = ($feeVolume - $systemFeeVolume) * $wallet->getShare();
     $wallet->setProfit($wallet->getProfit() + $profit);
     $wallet->save();
     $at->setStatus(1);
     $at->setOurWalletId($wallet->getId());
     $at->setTransactionId($oResponse->transaction->sId);
     $at->setTimestamp(Core::timestamp_gmp());
     $at->save();
     header('Location: ' . URL_SUCCESS_PAYMENT);
 }
 public static function changeOrderVolume(Order $order, $newVolume)
 {
     if ($order->getStatus() != OrderStatus::ACTIVE || $newVolume == $order->getVolume()) {
         return false;
     }
     $deal = new Deal();
     $deal->findActiveDealByOrderId($order->getId());
     $volumeDifference = $order->getVolume() - $newVolume;
     if ($deal->getVolume() < $volumeDifference) {
         return false;
     }
     $rate = new Rate();
     $rate->findById($order->getRateId());
     $purse = new Purse();
     if ($order->getType() == OrderType::BUY) {
         $purseSelect = Purse::findBy(array('UID' => $order->getUserId(), 'CurId' => $rate->getSecondCurrencyId()));
         $purse->findById($purseSelect[0]['id']);
         $difference = $order->getPrice() * $volumeDifference * (1.0 + $rate->getFee());
         $purse->addValue($difference);
     } else {
         $purseSelect = Purse::findBy(array('UID' => $order->getUserId(), 'CurId' => $rate->getFirstCurrencyId()));
         $purse->findById($purseSelect[0]['id']);
         $purse->addValue($volumeDifference);
     }
     if ($purse->getValue() < 0) {
         return false;
     }
     $purse->save();
     $deal->setDate(date("Y-m-d H:i:s"));
     $deal->setVolume($newVolume);
     $deal->save();
     $order->setVolume($newVolume);
     $order->updatePart();
     $order->save();
     return true;
 }