/** * Возвращает этапы текущей сделки * * @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; }
/** * Уведомление одному из участников СБР о том, что другая строна обратилась в арбитраж. * @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'); }
/** * * @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; }