Exemple #1
0
 /**
  * Совершает выплату юзеру по данному этапу СБР.
  * Выплата -- это отметка, что деньги реально выплачены.
  *
  * @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;
 }