/**
 * Выплата по резерву
 * 
 * @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;
}
Exemple #2
0
 }
 if (!$type) {
     throw new Exception('No type param');
 }
 $orderModel = TServiceOrderModel::model();
 $orderModel->attributes(array('is_adm' => true));
 $orderData = $orderModel->getCard($order_id, 0);
 if (!$orderData || !$orderModel->isStatusEmpClose() || !$orderModel->isReserve()) {
     throw new Exception('None');
 }
 $reserveInstance = $orderModel->getReserve();
 if (!$reserveInstance->isAllowPayout($orderData['frl_id']) || !$reserveInstance->isFrlAllowFinance()) {
     throw new Exception('Not isAllowPayout');
 }
 $reservesPayout = new ReservesPayout();
 $status = $reservesPayout->requestPayout($reserveInstance, $type);
 $results['status'] = (int) $status;
 $is_done = $reserveInstance->changePayStatus($status);
 $results['is_done'] = (int) $is_done;
 if ($is_done) {
     //@todo: передача данных устаревший способ но оставляем для поддержки пока
     //посностью не передем на обьекты
     $orderData['reserve_data'] = $reserveInstance->getReserveData();
     //@todo: правильный способ - нужно оперировать обьектами
     $orderData['reserve'] = $reserveInstance;
     try {
         $doc = new DocGenReserves($orderData);
         //$doc->generateInformLetterFRL();
         //@todo: генерируем документ когда резерв закрыт после всех выплат
         if ($reserveInstance->isClosed()) {
             $results['isClosed'] = (int) $reserveInstance->isClosed();