/** * Совершает выплату юзеру по данному этапу СБР. * Выплата -- это отметка, что деньги реально выплачены. * * @param integer $user_id ид. юзера, которому предназначается выплата. * @return boolean успешно? */ function payoutAgnt($user_id, pskb $pskb, pskb_lc $pskb_lc) { setlocale(LC_ALL, 'en_US.UTF-8'); if (!$this->getPayouts($user_id)) { return false; } if ($this->payouts[$user_id]['completed']) { return false; } $account = new account(); $account->GetInfo($user_id); $credit_sys = $this->payouts[$user_id]['credit_sys']; $lc = $pskb->getLC(true); $acc = $user_id == $this->sbr->emp_id ? $lc['accCust'] : $lc['accPerf']; switch ($credit_sys) { case exrates::BANK: $descr = "Безнал на счет: {$acc}"; break; case exrates::YM: $descr = "Яндекс.Деньги на кошелек: {$acc}"; break; case exrates::WMR: $descr = "WMR на кошелек: {$acc}"; break; case exrates::WEBM: $descr = "Вывод на Веб-кошелек"; break; case exrates::CARD: $descr = "Безнал на счет пластиковой карты"; break; default: return !($this->error = 'Неверная валюта'); } $this->sbr->getScheme(); $percent = 1; if ($this->payouts[$user_id]['is_arbitrage'] == 't') { $this->getArbitrage(); $percent = abs((int) ($user_id == $this->sbr->emp_id) - $this->arbitrage['frl_percent']); } $iex = $credit_sys . $this->sbr->cost_sys; if (!$this->exrates) { $this->sbr->getExrates(); } $credit_sum = $this->payouts[$user_id]['credit_sum']; $debit_sum = round($credit_sum * $this->sbr->exrates[$iex], 2); $d_descr = 'Списание ' . ($percent == 1 ? '' : 100 * $percent . '% (арбитраж) ') . "резерва «Безопасной Сделки» (этап #{$this->id})"; $sbr = sbr_meta::getInstanceLocal($user_id); $sbr->initFromId($this->data['sbr_id'], false, false); $comments = sbr_meta::view_cost($credit_sum, $credit_sys) . ', ' . $sbr->getContractNum(); $d_comments = sbr_meta::view_cost($debit_sum, $this->sbr->cost_sys) . ', ' . $sbr->getContractNum(); if (($debit_id = $account->CommitReserved($sbr->emp_id, $this->sbr->reserved_id, $d_descr, sbr::OP_DEBIT, $debit_sum, $d_comments)) && ($credit_id = $account->TransferReserved($user_id, $credit_sum, $credit_sys - 1, $descr, $errors, sbr::OP_CREDIT, $comments))) { $sql = "\n UPDATE sbr_stages_payouts\n SET debit_id = {$debit_id},\n credit_id = {$credit_id},\n completed = now(),\n state = '{$pskb_lc->state}',\n \"stateReason\" = '{$pskb_lc->stateReason}',\n bank_completed = '{$pskb_lc->date}'\n WHERE stage_id = {$this->id}\n AND user_id = {$user_id}\n\n AND completed IS NULL\n RETURNING *\n "; if ($res = pg_query(self::connect(), $sql)) { $this->payoutUpdateState($pskb_lc); $docs = array(); $is_emp_arb = $this->status == sbr_stages::STATUS_ARBITRAGED && $this->arbitrage['resolved'] && floatval($this->arbitrage['frl_percent']) == 0; if ($this->sbr->scheme_type == sbr::SCHEME_LC && !$is_emp_arb) { if ($doc_file = $this->generateEmpAgentReport($doc_err, $rep_num)) { // отчет агента. $docs[] = array('stage_id' => $this->id, 'file_id' => $doc_file->id, 'num' => $rep_num, 'status' => sbr::DOCS_STATUS_PUBL, 'access_role' => sbr::DOCS_ACCESS_EMP, 'owner_role' => 0, 'type' => sbr::DOCS_TYPE_AGENT_REP); if ($doc_file = $this->generateEmpAct($doc_err, $doc_num, $rep_num)) { // акт работодателя по агентской схеме (он же отчет об арбитраже, если был арбитраж). $docs[] = array('stage_id' => $this->id, 'file_id' => $doc_file->id, 'num' => $doc_num, 'status' => sbr::DOCS_STATUS_PUBL, 'access_role' => sbr::DOCS_ACCESS_EMP, 'owner_role' => 0, 'type' => sbr::DOCS_TYPE_ACT); } } } elseif (($this->sbr->scheme_type == sbr::SCHEME_PDRD || $this->sbr->scheme_type == sbr::SCHEME_PDRD2) && !$is_emp_arb) { if ($doc_file = $this->generateArbReportPdrdEmp($doc_err)) { // отчет арбитража по договору подряда для работодателя. $docs[] = array('stage_id' => $this->id, 'file_id' => $doc_file->id, 'status' => sbr::DOCS_STATUS_PUBL, 'access_role' => sbr::DOCS_ACCESS_EMP, 'owner_role' => 0, 'type' => sbr::DOCS_TYPE_ARB_REP); } } if (count($docs)) { foreach ($docs as $doc) { $ok = $this->sbr->addDocR($doc); } } $this->payouts[$user_id] = pg_fetch_assoc($res); return true; } } if ($debit_id && !$credit_id) { $account->Del($user_id, $debit_id); } return false; }