/**
 * Выплата по резерву
 * 
 * @todo: пока только приспособлено только для заказа
 * но возможна доработка при работе резерва с любым другим объектом
 * 
 * @param type $type - тип способа выплаты
 * @param type $params - данные
 * @return \xajaxResponse
 */
function reservesPayoutProcess($type, $params)
{
    $objResponse =& new xajaxResponse();
    $orderModel = TServiceOrderModel::model();
    $uid = get_uid(false);
    $order_id = intval(@$params['oid']);
    $hash = @$params['hash'];
    $test_hash = md5(TServiceOrderModel::SOLT . $order_id);
    $error = false;
    try {
        if ($uid <= 0 || $hash !== $test_hash || !in_array($type, ReservesPayoutPopup::$payment_list)) {
            throw new Exception();
        }
        $orderData = $orderModel->getCard($order_id, $uid);
        if (!$orderData || !$orderModel->isStatusEmpClose() || !$orderModel->isReserve()) {
            throw new Exception();
        }
        $reserveInstance = $orderModel->getReserve();
        if (!$reserveInstance->isAllowPayout($uid) || !$reserveInstance->isFrlAllowFinance()) {
            throw new Exception();
        }
        $history = new tservices_order_history($order_id);
        $reservesPayout = new ReservesPayout();
        $status = $reservesPayout->requestPayout($reserveInstance, $type);
        $is_done = $reserveInstance->changePayStatus($status);
        if ($is_done) {
            //@todo: передача данных устаревший способ но оставляем для поддержки пока
            //посностью не передем на обьекты
            $orderData['reserve_data'] = $reserveInstance->getReserveData();
            //@todo: правильный способ - нужно оперировать обьектами
            $orderData['reserve'] = $reserveInstance;
            try {
                $doc = new DocGenReserves($orderData);
                $doc->generateInformLetterFRL();
            } catch (Exception $e) {
                require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/log.php';
                $log = new log('reserves_docs/' . SERVER . '-%d%m%Y.log', 'a', "%d.%m.%Y %H:%M:%S: ");
                $log->writeln(sprintf("Order Id = %s: %s", $orderData['id'], iconv('CP1251', 'UTF-8', $e->getMessage())));
                //$sHtml = tservices_helper::getMessage($e->getMessage(),'error');
                //$objResponse->call('TServices_Order.showBeforeStatus', $order_id, $sHtml);
            }
        }
        $feedback = @$params['feedback'];
        $is_feedback = !empty($feedback);
        $fbtype = @$params['fbtype'];
        //Сохраняем отзыв если он есть
        if ($is_feedback && !$orderModel->isFrlFeedback()) {
            $is_emp = false;
            $orderFeedbackModel = new TServiceOrderFeedbackModel();
            $is_valid = $orderFeedbackModel->attributes(array('feedback' => $feedback, 'rating' => $fbtype, 'is_emp' => $is_emp, 'user_id' => $uid));
            //Тут обрабатывать ошибки при валидации
            if (!$is_valid || !$orderFeedbackModel->addFeedback($order_id)) {
                return $objResponse;
            }
            $attributes = $orderFeedbackModel->attributes();
            $orderData['frl_feedback'] = $attributes['feedback'];
            $orderData['frl_rating'] = $attributes['rating'];
            //Сохранить действие в историю
            $history->saveFeedback($is_emp, $fbtype);
            //Чистим кеш кол-во новых сообщений юзера после написания комментария
            $orderModel->clearCountEvent($orderData["emp_id"]);
        }
        $tserviceOrderStatusWidget = new TServiceOrderStatus();
        $tserviceOrderStatusWidget->setIsEmp(false);
        $tserviceOrderStatusWidget->setOrder($orderData);
        $tserviceOrderStatusWidget->init();
        ob_start();
        $tserviceOrderStatusWidget->run();
        $sHtml = ob_get_contents();
        ob_end_clean();
        $objResponse->assign('tservices_order_status_' . $order_id, 'innerHTML', $sHtml);
        $objResponse->script('window.order_feedback_factory = new OrderFeedbackFactory();');
    } catch (Exception $e) {
        $error = $e->getMessage();
    }
    if ($error !== false) {
        //Если есть ошибки то статус не обновляется и
        //в окошке попапа можно их показать или просто закрыть его
        $idx = ReservesPayoutPopup::getPopupId($order_id);
        $objResponse->script("\n            var rp = window.reserves_payout_factory.getReservesPayout('{$idx}');\n            if(rp) " . (!empty($error) ? "rp.show_error('{$error}');" : "rp.close_popup();\n        "));
    } else {
        //иначе статус обновился и нужно обновить JS события
        $objResponse->script("\n            Bar_Ext.popuper();\n            window.reserves_payout_factory = new ReservesPayoutFactory();\n        ");
    }
    return $objResponse;
}
/**
 * Новый отзыв по заказу ТУ
 * 
 * @global type $uid
 * @global type $orderModel
 * @param type $params
 * @return \xajaxResponse
 */
function tservicesOrdersNewFeedback($params)
{
    $uid = get_uid(false);
    $orderModel = TServiceOrderModel::model();
    $objResponse =& new xajaxResponse();
    $order_id = intval(@$params['oid']);
    $hash = @$params['hash'];
    $test_hash = md5(TServiceOrderModel::SOLT . $order_id);
    if ($uid <= 0 || $hash !== $test_hash) {
        return $objResponse;
    }
    $memebuff = new memBuff();
    if ($memebuff->get('feedback_process_' . $order_id)) {
        return $objResponse;
    }
    $memebuff->set('feedback_process_' . $order_id, true);
    $is_emp = is_emp();
    $prefix = $is_emp ? 'emp' : 'frl';
    $sufix = $is_emp ? 'frl' : 'emp';
    $allow_status = array(TServiceOrderModel::STATUS_ACCEPT, TServiceOrderModel::STATUS_FIX, TServiceOrderModel::STATUS_EMPCLOSE, TServiceOrderModel::STATUS_FRLCLOSE);
    $feedback = @$params['feedback'];
    $is_feedback = !empty($feedback);
    $fbtype = @$params['fbtype'];
    $orderData = $orderModel->getCard($order_id, $uid);
    //Если не существует или статус не подходящий
    if (!$orderData || !in_array($orderData['status'], $allow_status)) {
        $memebuff->delete('feedback_process_' . $order_id);
        return $objResponse;
    }
    //Если есть отзыв и он не удален
    if (!empty($orderData[$prefix . '_feedback'])) {
        $memebuff->delete('feedback_process_' . $order_id);
        return $objResponse;
    }
    $order_id = $orderData['id'];
    $status = $orderData['status'];
    if ($orderModel->isDisallowFeedback()) {
        $memebuff->delete('feedback_process_' . $order_id);
        return $objResponse;
    }
    //Меняем статус при необходимости и тем самым закрываем заказ
    if ($status != TServiceOrderModel::STATUS_EMPCLOSE) {
        try {
            $new_status = $orderModel->changeStatus($order_id, 'close', $is_emp, $fbtype);
        } catch (Exception $e) {
            $sHtml = tservices_helper::getMessage($e->getMessage(), 'error');
            $objResponse->call('TServices_Order.showBeforeStatus', $order_id, $sHtml);
            $memebuff->delete('feedback_process_' . $order_id);
            return $objResponse;
        }
        $orderData['status'] = $new_status;
    }
    //Сохраняем отзыв если он есть
    if ($is_feedback) {
        $orderFeedbackModel = new TServiceOrderFeedbackModel();
        $is_valid = $orderFeedbackModel->attributes(array('feedback' => $feedback, 'rating' => $fbtype, 'is_emp' => $is_emp, 'user_id' => $uid));
        //Тут обрабатывать ошибки при валидации
        if (!$is_valid || !$orderFeedbackModel->addFeedback($order_id)) {
            $memebuff->delete('feedback_process_' . $order_id);
            return $objResponse;
        }
        $attributes = $orderFeedbackModel->attributes();
        $orderData[$prefix . '_feedback'] = $attributes['feedback'];
        $orderData[$prefix . '_rating'] = $attributes['rating'];
        //Сохранить действие в историю
        $history = new tservices_order_history($order_id);
        $history->saveFeedback($is_emp, $fbtype);
        //Чистим кеш кол-во новых сообщений юзера после написания комментария
        $orderModel->clearCountEvent($orderData["{$sufix}_id"]);
        /*
                if ($status == TServiceOrderModel::STATUS_EMPCLOSE && $is_emp && $fbtype < 0) 
                {
           $orderModel->cancelTax($order_id);
                }
        */
    }
    //Уведомление на почту
    $tservices_smail = new tservices_smail();
    $tservices_smail->attributes(array('order' => $orderData, 'is_emp' => $is_emp));
    $tservices_smail->closeOrderAndFeedback($status);
    $tserviceOrderStatusWidget = new TServiceOrderStatus();
    $tserviceOrderStatusWidget->setIsEmp($is_emp);
    $tserviceOrderStatusWidget->setOrder($orderData);
    $tserviceOrderStatusWidget->init();
    ob_start();
    $tserviceOrderStatusWidget->run();
    $sHtml = ob_get_contents();
    ob_end_clean();
    $objResponse->assign('tservices_order_status_' . $order_id, 'innerHTML', $sHtml);
    //если фрилансер закрывает заказ или оставляет отзыв
    //то обновляем ему информацию о состоянии счета
    if (!$is_emp) {
        //не показываем отрицательную сумму
        //$balance = ($_SESSION['ac_sum'] > 0)?number_format(round(zin($_SESSION['ac_sum']),2), 2, ",", " ").' руб.':'Мои услуги';
        //$balance = '<span class="b-bar__icon b-bar__icon_fm"></span>' . $balance;
        //для новой шапки
        $balance = number_format(round(zin($_SESSION['ac_sum']), 2), 2, ",", " ") . ' Р';
        $objResponse->script("\$\$('.b-user-menu-wallet-clause a').set('html', '" . $balance . "');");
    }
    //Обновляем события так как у mootools нет Live
    //а Delegation не работает.
    $objResponse->script('
        Bar_Ext.popuper();
        window.order_feedback_factory = new OrderFeedbackFactory();
    ');
    $memebuff->delete('feedback_process_' . $order_id);
    return $objResponse;
}