/** * АККРЕДИТИВ * * Обрабатывает запрос на заверешние этапа одним из участников сделки. * Завершение состоит из выставления отзывов (сервису и др. стороне) + выбора валют выплаты у фрилансера и у заказчика (если арбитраж) * * @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; }