예제 #1
0
/**
 * Вынесение решения арбитром
 * @param array $form
 * @return \xajaxResponse
 */
function reservesArbitrageApply($form)
{
    $objResponse = new xajaxResponse();
    $order_id = @$form['order_id'];
    $price_pay = (int) @$form['price'];
    //Сумма для выплаты исполнителю
    $allow_fb_frl = (bool) @$form['allow_fb_frl'];
    $allow_fb_emp = (bool) @$form['allow_fb_emp'];
    $orderModel = TServiceOrderModel::model();
    $orderModel->attributes(array('is_adm' => hasPermissions('tservices')));
    $order = $orderModel->getCard((int) $order_id, get_uid(false));
    if (!$order) {
        return $objResponse;
    }
    $reservesArbitrage = new ReservesArbitrage();
    $reservesArbitrage->db()->start();
    try {
        if ($price_pay > $order['reserve_data']['price']) {
            $price_pay = $order['reserve_data']['price'];
        }
        $price_back = $order['reserve_data']['price'] - $price_pay;
        //запоминаем суммы, которые надо выплатить сторонам, закрываем арбитраж и заказ
        $ok = $reservesArbitrage->closeArbitrage($order['reserve_data'], array('price_pay' => $price_pay, 'price_back' => $price_back, 'allow_fb_frl' => $allow_fb_frl, 'allow_fb_emp' => $allow_fb_emp));
        if ($ok) {
            $is_emp = true;
            //Закрываем заказ от лица заказчика
            $orderModel->changeStatus($order_id, 'close', $is_emp);
            //Отправляем уведомления
            $reservesSmail = new ReservesSmail();
            $reservesSmail->onApplyArbitrage($order, $price_pay);
            $order = $orderModel->getOrderData();
            //Новый статус отображаем без перезагрузки
            $order['reserve_data']['arbitrage_price'] = $price_pay;
            $order['reserve_data']['arbitrage_date_close'] = date('Y-m-d H:i:s');
            //Так как мы в статусах используем обьект то обновляем его данные
            $order['reserve']->setReserveData($order['reserve_data']);
            //$order['status'] = TServiceOrderModel::STATUS_EMPCLOSE;
            //Генерируем документы
            try {
                $doc = new DocGenReserves($order);
                if ($price_pay > 0) {
                    $doc->generateActCompletedFrl();
                }
                $doc->generateArbitrageReport();
            } 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", $order['id'], iconv('CP1251', 'UTF-8', $e->getMessage())));
            }
            $tservicesOrderHistory = new tservices_order_history($order_id);
            $tservicesOrderHistory->reserveArbitrageDecide($price_pay, $price_back);
            $tserviceOrderStatusWidget = new TServiceOrderStatus();
            $tserviceOrderStatusWidget->setIsOwner(false);
            $tserviceOrderStatusWidget->setOrder($order);
            $tserviceOrderStatusWidget->init();
            ob_start();
            $tserviceOrderStatusWidget->run();
            $sHtml = ob_get_contents();
            ob_end_clean();
            $objResponse->assign('tservices_order_status_' . $order_id, 'innerHTML', $sHtml);
        }
    } catch (Exception $e) {
        $reservesArbitrage->db()->rollback();
        $sHtml = tservices_helper::getMessage($e->getMessage(), 'error');
        $objResponse->call('TServices_Order.showBeforeStatus', $order_id, $sHtml);
        return $objResponse;
    }
    $reservesArbitrage->db()->commit();
    $objResponse->call('TServices_Order.hideBeforeStatus', $order_id);
    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;
}