Esempio n. 1
0
 /**
  * Возвращает этапы текущей сделки
  * 
  * @param integer $stage_id   ид. этапа, если указан, то берем только определенный этап, иначе все текущей сделки.
  * @param boolean $get_attach   нужны ли вложения этапов?
  * @param boolean $get_su   нужны ли данные об отношении юзер/этап (последний просмотра, кол-во прочтенных комментов)?
  * @param boolean $get_feedbacks   взять отзывы по этапу от противоположного юзера.
  * @return array
  */
 function getStages($stage_id = NULL, $get_attach = false, $get_su = false, $get_feedbacks = false, $get_info_pskb = true)
 {
     $stages = NULL;
     $where = $stage_id == NULL ? $this->db()->parse("ss.sbr_id = ?i", $this->id) : $this->db()->parse("ss.id = ?i", $stage_id);
     $order_by = 'ss.num';
     if ($get_su && $this->uid) {
         $join_su = "LEFT JOIN sbr_stages_users su ON su.stage_id = ss.id AND su.user_id = {$this->session_uid}";
         $cols_su = ', ss.msgs_cnt - su.read_msgs_count AS unread_msgs_count, su.read_msgs_count, su.last_msgs_view';
     }
     if ($get_feedbacks) {
         $join_sf = "INNER JOIN sbr_feedbacks sf ON sf.id = ss.{$this->apfx}feedback_id";
         $cols_sf = ", sf.p_rate, sf.a_rate, sf.n_rate";
         $order_by = 'ss.closed_time DESC';
     }
     if ($get_info_pskb) {
         $join_sbr = "LEFT JOIN pskb_lc p ON p.sbr_id = ss.sbr_id";
         $cols_sbr = ", p.ps_emp, p.ps_frl, p.\"tagCust\", p.\"tagPerf\"";
     }
     $join_pskb = " LEFT JOIN sbr_stages_payouts ps ON ps.stage_id = ss.id";
     $cols_pskb = ', ps.state as lc_state, ps."stateReason" as lc_state_reason, COALESCE(ps.bank_completed, ps.completed) as lc_date ';
     $sql = "\n          SELECT ss.*, date_part('day', work_time) as work_days, (start_time - worked_time) as start_time_without_pause, EXTRACT(EPOCH FROM worked_time) as worked_time_sec,\n            (COALESCE(start_time, now()) + work_time)::date - now()::date as work_rem, start_time + work_time as dead_time\n                 {$cols_sbr}\n                 {$cols_su}\n                 {$cols_sf}\n                 {$cols_pskb}\n            FROM sbr_stages ss\n          {$join_sbr}  \n          {$join_su}\n          {$join_sf}\n          {$join_pskb}\n          WHERE {$where}\n          ORDER BY {$order_by}\n        ";
     if ($res = pg_query(DBConnect(), $sql)) {
         while ($row = pg_fetch_assoc($res)) {
             $stage = new sbr_stages($this);
             $stage->data = $row;
             $stage->data['cost_sys'] = $this->cost_sys;
             if ($stage->status == sbr_stages::STATUS_ARBITRAGED || $stage->status == sbr_stages::STATUS_INARBITRAGE) {
                 $stage->getArbitrage();
                 if ($stage->arbitrage['frl_percent'] !== NULL) {
                     $cost_frl = $stage->data['cost'] * $stage->arbitrage['frl_percent'];
                 } else {
                     $cost_frl = $stage->data['cost'];
                 }
             } else {
                 $cost_frl = $stage->data['cost'];
             }
             if ($row['ps_frl'] != null && $cost_frl <= pskb::WW_ONLY_SUM && $row['tagPerf'] == pskb::PHYS) {
                 // Только для физиков
                 $stage->data['ps_frl'] = pskb::WW;
             }
             if ($stage->cost * $this->cost2rur() > $this->maxNorezCost()) {
                 $this->has_norez_overcost = true;
             }
             if ($get_attach) {
                 $stage->data['attach'] = $stage->getAttach();
             }
             if ($get_su && $this->uid && $stage->data['unread_msgs_count']) {
                 $stage->data['unread_first_id'] = $stage->getFirstUnreadMsgId();
             }
             $stages[$row['num']] = $stage;
         }
     }
     return $stages;
 }
Esempio n. 2
0
 /**
  * Уведомление одному из участников СБР о том, что другая строна обратилась в арбитраж.
  * @param array $events   информация по событиям (если событий нескольлко, то содержит несколько элементов).
  */
 function SbrArb($events)
 {
     $ev0 = $events[0];
     $url = $GLOBALS['host'] . '/' . sbr::NEW_TEMPLATE_SBR . '/';
     $sbr = sbr_meta::getInstanceLocal($ev0['e_uid']);
     $sbr->initFromId($ev0['sbr_id']);
     $stage = new sbr_stages($sbr, array('id' => $ev0['own_id']));
     $arb = $stage->getArbitrage(false, false);
     $stage_name = sbr_meta::getNameForMail($ev0);
     $sbr_num = $stage->sbr->getContractNum();
     if ($arb['user_id'] == $ev0['f_uid']) {
         $r = 'e_';
         $arb = 'f_';
         $this->subject = "Фрилансер обратился в Арбитраж сервиса Безопасная Сделка";
         $userlink = $GLOBALS["host"] . "/users/" . $ev0['f_login'];
         //$msg = "Информируем вас о том, что по проекту «<a href='{$url}?site=Stage&id={$ev0['own_id']}{$this->_addUrlParams($r == 'e_' ? 'e' : 'f', '&')}'>{$stage_name}</a>» Исполнитель <a href='{$userlink}'>{$ev0['f_uname']} {$ev0['f_usurname']}</a> [<a href='{$userlink}'>{$ev0['f_login']}</a>] обратился в Арбитраж по причине:<br/><br/>";
     } else {
         $r = 'f_';
         $arb = 'e_';
         $this->subject = "Заказчик обратился в Арбитраж сервиса Безопасная Сделка";
         $userlink = $GLOBALS["host"] . "/users/" . $ev0['e_login'];
         //$msg = "Информируем вас о том, что по проекту «<a href='{$url}?site=Stage&id={$ev0['own_id']}{$this->_addUrlParams($r == 'e_' ? 'e' : 'f', '&')}'>{$stage_name}</a>» Заказчик <a href='{$userlink}'>{$ev0['e_uname']} {$ev0['e_usurname']}</a> [<a href='{$userlink}'>{$ev0['e_login']}</a>] обратился в Арбитраж по причине:<br/><br/>";
     }
     $msg = "Информируем вас о том, что пользователь <a href='{$userlink}'>{$ev0[$arb . 'uname']} {$ev0[$arb . 'usurname']}</a> [<a href='{$userlink}'>{$ev0[$arb . 'login']}</a>] обратился в Арбитраж по причине:<br/><br/>";
     $msg .= "«" . reformat($arb['descr']) . "»<br/><br/>";
     $msg .= "Работа по этапу <a href='{$url}?site=Stage&id={$ev0['own_id']}{$this->_addUrlParams($r == 'e_' ? 'e' : 'f', '&')}'>{$ev0['stage_name']}</a> «Безопасной Сделки» <a href='{$url}?id={$ev0['sbr_id']}{$this->_addUrlParams($r == 'e_' ? 'e' : 'f', '&')}'>{$sbr_num}</a> приостановлена. Срок вынесения решения – до " . sbr_stages::MAX_ARBITRAGE_DAYS . " рабочих дней с момента обращения в арбитраж.<br/><br/>";
     $msg .= "Вы можете оставить свой комментарий по поводу сложившейся ситуации в разделе «Мои Сделки», в системе комментариев к сделке «<a href='{$url}?site=Stage&id={$ev0['own_id']}{$this->_addUrlParams($r == 'e_' ? 'e' : 'f', '&')}'>{$stage_name}</a>».";
     //$msg .= "«" . reformat($arb['descr']) . "»<br/><br/>";
     //$msg .= "Пожалуйста, перейдите в <a href='{$url}?site=Stage&id={$ev0['own_id']}{$this->_addUrlParams($r == 'e_' ? 'e' : 'f', '&')}'>сделку</a> и прокомментируйте ситуацию.";
     $this->message = $this->splitMessage($this->GetHtml($ev0[$r . 'uname'], $msg, array('header' => 'simple', 'footer' => 'norisk_robot')));
     $this->recipient = $ev0[$r . 'uname'] . " " . $ev0[$r . 'usurname'] . " [" . $ev0[$r . 'login'] . "] <" . $ev0[$r . 'email'] . ">";
     $this->SmtpMail('text/html');
 }
Esempio n. 3
0
 /**
  * 
  * @return boolean
  */
 public function resendCode(sbr_stages $stage)
 {
     $lc = $this->getLC();
     if (!$lc) {
         $this->_setError('Аккредитив не найден.');
         return false;
     }
     $pskb_lc = $this->_checkLC($lc['lc_id']);
     if ($pskb_lc->state == pskb::STATE_COVER && strstr($pskb_lc->stateReason, 'nosignPerf')) {
         $emp_percent = 0;
         $frl_percent = 1;
         $stage->getPayouts(get_uid());
         if ($stage->arbitrage === false) {
             $stage->getArbitrage(false, false);
         }
         if ($stage->arbitrage && $stage->arbitrage['resolved']) {
             $emp_percent = abs(sbr::EMP - $stage->arbitrage['frl_percent']);
             $frl_percent = abs(sbr::FRL - $stage->arbitrage['frl_percent']);
         }
         $sumCust = round($stage->data['cost'] * $emp_percent, 2);
         $sumPerf = round($stage->data['cost'] * $frl_percent, 2);
         if ($sumCust + $sumPerf != $this->data['cost'] && $sumCust > 0) {
             // Не сходится изза округления, обычно одна копейка не сходится
             $sumCust -= 0.01;
             // Работодатель получит меньше.
         }
         $idAct = $stage->getOuterNum();
         $dateAct = date('d.m.Y', strtotime($stage->payouts[$stage->sbr->data['frl_id']]['requested']));
         $resp = $this->_openLC($lc['lc_id'], $sumCust, $sumPerf, $dateAct, $idAct);
         if ($resp->state != 'passed') {
             $resp->state = 'err';
         }
         if (!$resp->id) {
             $this->_setError($resp->stateReason);
             return false;
         }
         if ($resp->state == pskb::STATE_PASSED) {
             $data['state'] = $resp->state;
             $data['stateReason'] = $resp->stateReason;
             $this->upLC($data, $lc['lc_id']);
         }
         return $resp;
     }
     if ($lc['state'] != 'passed') {
         $this->_setError('Недопустимый статус аккредитива.');
         return false;
     }
     $resp = $this->_reqCode($lc['lc_id']);
     if (!$resp->id || $resp->state == 'err') {
         $this->_setError($resp->stateReason);
         return false;
     }
     return $resp;
 }