コード例 #1
0
ファイル: sbr_stages.php プロジェクト: Nikitian/fl-ru-damp
 /**
  * АККРЕДИТИВ
  * 
  * Обрабатывает запрос на заверешние этапа одним из участников сделки.
  * Завершение состоит из выставления отзывов (сервису и др. стороне) + выбора валют выплаты у фрилансера и у заказчика (если арбитраж)
  *
  * @param array $request   массив с информацией об отзывах и кодом валюты выплаты.
  * @param boolean $ym_on   разрешены ли в качестве валюты выплаты Яндекс.Деньги. Обычно только админам или работодателю, если резерв в ЯДе.
  * @return boolean   успешно?
  */
 function completeAgnt($request)
 {
     if ($this->_openXact(TRUE)) {
         $ok = true;
         if (isset($request['notnp'])) {
             $ok = $this->setNotNP(!!$request['notnp']);
         }
         if (!$this->sbr->isFrl()) {
             if ($request['sbr_sms_code'] != $_SESSION['close_sbr_smscode']) {
                 $this->error['feedback']['sms'] = 1;
                 $ok = false;
             }
         }
         if ($ok) {
             if ($this->isAccessOldFeedback() && $request['feedback'] && !($this->arbitrage['id'] > 0 && $this->arbitrage['result_id'] == 1) && !($this->sbr->isFrl() && $this->arbitrage['id'] > 0 && ($this->arbitrage['result_id'] == 5 || $this->arbitrage['result_id'] == 6)) && !($this->sbr->isEmp() && $this->arbitrage['id'] > 0 && $this->arbitrage['result_id'] == 7)) {
                 $ok = $this->feedback($request['feedback'], $request['sbr_feedback']);
                 $this->fbked = $ok;
             } else {
                 if ($request['sbr_feedback']) {
                     // Делаем не обязательным поле
                     $ok = $this->sbr->feedback($request['sbr_feedback']);
                 }
             }
             if ($ok && ($this->arbitrage['id'] > 0 && $this->arbitrage['result_id'] == 1 || $this->sbr->isFrl() && $this->arbitrage['id'] > 0 && ($this->arbitrage['result_id'] == 5 || $this->arbitrage['result_id'] == 6) || $this->sbr->isEmp() && $this->arbitrage['id'] > 0 && $this->arbitrage['result_id'] == 7)) {
                 $this->fbked = $ok;
                 if ($this->sbr->isFrl()) {
                     $this->updateCompleteStage(true, 'frl');
                 } elseif ($this->sbr->isEmp()) {
                     $this->updateCompleteStage(true, 'emp');
                 }
             }
         }
         if ($this->sbr->isFrl()) {
             $pskb = new pskb($this->sbr);
             $lc = $pskb->getLC();
             $request['credit_sys'] = pskb::$exrates_map[$this->sbr->isEmp() ? $lc['ps_emp'] : $lc['ps_frl']];
             $emp_percent = 0;
             $frl_percent = 1;
             if ($this->arbitrage === false) {
                 $this->getArbitrage(false, false);
             }
             if ($this->arbitrage && $this->arbitrage['resolved']) {
                 $emp_percent = abs(sbr::EMP - $this->arbitrage['frl_percent']);
                 $frl_percent = abs(sbr::FRL - $this->arbitrage['frl_percent']);
             }
             $sumCust = round($this->data['cost'] * $emp_percent, 2);
             $sumPerf = round($this->data['cost'] * $frl_percent, 2);
             if ($ok && $sumPerf > 0) {
                 $credit_sys = intvalPgSql(pskb::$exrates_map[$lc['ps_frl']]);
                 $this->request['credit_sys'] = $credit_sys;
                 $ok = $this->setPayoutSys($credit_sys, true);
                 $this->sysed = $ok;
             }
             $docs = array();
             if ($ok) {
                 $docs = $this->generateNewPackageDocs($ok, $doc_err);
                 $ok = !empty($docs);
                 // Не ок если документов не сгенерировалось
             }
             if ($doc_err) {
                 if ($this->sysed) {
                     $this->error['credit_sys']['act'] = current($doc_err);
                 } else {
                     $this->error['feedback']['descr'] = current($doc_err);
                 }
                 $ok = false;
             } else {
                 if (!empty($docs)) {
                     foreach ($docs as $doc) {
                         $ok = $this->sbr->addDocR($doc);
                         if (!$ok) {
                             break;
                         }
                     }
                 }
             }
             if ($ok) {
                 if ($sumCust + $sumPerf != $this->data['cost'] && $sumCust > 0) {
                     // Не сходится изза округления, обычно одна копейка не сходится
                     $sumCust -= 0.01;
                     // Работодатель получит меньше.
                 }
                 $resp = $pskb->payoutOpen($this, $sumCust, $sumPerf);
                 $ok = $resp && $resp->state != pskb::STATE_ERR;
             }
         }
         if ($ok) {
             return $this->_commitXact();
         }
         $this->_abortXact();
         if ($this->sysed) {
             $this->payouts = NULL;
         }
     }
     return false;
 }