function aCompleteEvent($xact_id) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/sbr_notification.php'; $objResponse = new xajaxResponse(); if (!(hasPermissions('sbr') && $_SESSION['access'] == 'A')) { return $objResponse; } $xact_id = intval($xact_id); $compl = sbr_notification::setNotificationCompletedAdmin($xact_id); if ($compl) { $objResponse->script("\$('event_react_{$xact_id}').removeClass('b-fon__body_bg_f0ffdf').removeClass('b-fon__body');"); $objResponse->script("\$('adm_react_link_{$xact_id}').dispose()"); } return $objResponse; }
echo $stage->data['int_work_time']; ?> <?php echo ending(abs($stage->data['int_work_time']), 'день', 'дня', 'дней'); ?> на этап</div> </td> <td class="b-layout__right b-layout__right_width_400"> <div class="b-layout__txt b-layout__txt_right_0 b-layout__txt_absolute b-layout__txt_padright_15 b-layout__txt_relative b-layout__txt_zindex_1 <?php echo sbr_notification::isReaction($stage->notification) ? '' : 'b-layout__txt_hide'; ?> "><a class="b-layout__link" href="?site=Stage&id=<?php echo $stage->data['id']; ?> "><?php echo sbr_notification::isReaction($stage->notification) ? 'Посмотреть' : 'Перейти в этап'; ?> </a></div> <div class="b-layout__txt b-layout__txt_relative <?php echo $stage->getStatusColor(); ?> "><span class="b-icon b-icon_top_1 <?php echo $stage->getStatusICO(); ?> "></span><?php echo $stage->getStatusName(); ?> <span class="b-layout__hider" style="display:none;"></span></div> </td> </tr> </table>
<div class="b-fon b-fon_padbot_30"> <div class="b-fon__inner b-fon__inner_bordtop_cdcdcd b-fon__inner_bordbot_cdcdcd"> <div class="b-fon__body <?php echo sbr_notification::isReaction($stage->notification) ? "b-fon__body_bg_f0ffdf" : "b-fon__body_bg_eff2f3"; ?> b-fon__body_bordtop_e4e7e8 b-fon__body_bordbot_e4e7e8"> <?php include $_SERVER['DOCUMENT_ROOT'] . "/sbr/tpl.stage-header-info.php"; ?> <?php include $_SERVER['DOCUMENT_ROOT'] . "/sbr/{$fpath}tpl.stage-header.php"; ?> <?php include $_SERVER['DOCUMENT_ROOT'] . "/sbr/tpl.stage-header-form.php"; ?> </div> </div> </div>
/** * Устанавливает сделку в состояние зарезервированной после успешной операции резервирования на счете. * Добавляет к операции подробный комментарий. * * @see account::deposit(). * * @param int $reserved_id ид. операции резервирования (account_operations.id). * * @return bool успешно? */ public function reserve($reserved_id) { if (!$this->_openXact(true)) { return false; } $tax_emp = 0; $pskb = new pskb($this); $lc = $pskb->getLC(); $dvals = array('P' => pskb::$exrates_map[$lc['ps_emp']]); foreach ($this->scheme['taxes'][sbr::EMP] as $tax) { $tax_emp += sbr_meta::calcAnyTax($tax['tax_id'], $tax['scheme_id'], $this->cost, $dvals); } $comments = sbr_meta::view_cost($this->getReserveSum(), $this->cost_sys) . ', ' . $this->getContractNum() . ', ' . round($tax_emp / $this->cost * 100) . '% за услугу сервиса СБР и Банка - ' . sbr_meta::view_cost($tax_emp, $this->cost_sys); $sql = "\n UPDATE sbr SET reserved_id = ?i WHERE id = ?i;\n UPDATE account_operations SET comments = '{$comments}' WHERE id = ?i;\n "; $sql = $this->db()->parse($sql, $reserved_id, $this->id, $reserved_id); if (!pg_query(self::connect(false), $sql)) { $this->_abortXact(); return false; } if ($this->scheme_type == sbr::SCHEME_AGNT) { if ($doc_file = $this->generateAgreement($err)) { $doc = array('file_id' => $doc_file->id, 'status' => sbr::DOCS_STATUS_SIGN, 'access_role' => sbr::DOCS_ACCESS_ALL, 'owner_role' => 0, 'type' => sbr::DOCS_TYPE_OFFER, 'subtype' => 2); $this->addDocR($doc); } if (!$err) { if ($doc_file = $this->generateContract($err)) { $doc = array('file_id' => $doc_file->id, 'status' => sbr::DOCS_STATUS_SIGN, 'access_role' => sbr::DOCS_ACCESS_ALL, 'owner_role' => 0, 'type' => sbr::DOCS_TYPE_OFFER, 'subtype' => 1); $this->addDocR($doc); } } } elseif ($this->scheme_type == sbr::SCHEME_PDRD || $this->scheme_type == sbr::SCHEME_PDRD2) { if ($doc_file = $this->genereteBailmentEmp($err)) { $doc = array('file_id' => $doc_file->id, 'status' => sbr::DOCS_STATUS_SIGN, 'access_role' => sbr::DOCS_ACCESS_EMP, 'owner_role' => 0, 'type' => sbr::DOCS_TYPE_OFFER); $this->addDocR($doc); } if (!$err) { if ($doc_file = $this->genereteBailmentFrl($err)) { $doc = array('file_id' => $doc_file->id, 'status' => sbr::DOCS_STATUS_SIGN, 'access_role' => sbr::DOCS_ACCESS_FRL, 'owner_role' => 0, 'type' => sbr::DOCS_TYPE_OFFER); $this->addDocR($doc); } } } if ($err) { $this->error['fatal'] = $err; } if ($this->error) { $this->_abortXact(); return false; } $this->_commitXact(); if ($this->scheme_type == sbr::SCHEME_LC) { if ($XACT_ID = $this->_openXact(true)) { $result = sbr_notification::sbr_add_event($XACT_ID, $this->id, $this->stages[0]->id, 'sbr_stages.STARTED_WORK', $this->version, null, null); if (!$result) { $this->_abortXact(); } $this->_commitXact(); } } return true; }
$g_help_id = 219; if ($stage->data['lc_state'] == pskb::STATE_PASSED) { $g_help_id = 217; } $is_filled = explode(',', preg_replace('/[}{]/', '', $sbr->user_reqvs['is_filled'])); $isReqvsFilled[sbr::FT_PHYS] = $is_filled[sbr::FT_PHYS - 1] == 't'; $isReqvsFilled[sbr::FT_JURI] = $is_filled[sbr::FT_JURI - 1] == 't'; $attachedfiles = new attachedfiles($_POST['attachedfiles_session']); $comment_files = array(); $feedback_sent = isset($_SESSION["thnx_block{$stage_id}"]); if ($feedback_sent) { unset($_SESSION["thnx_block{$stage_id}"]); } if ($action == 'frl_refund') { if ($stage->refund()) { sbr_notification::setNotificationCompleted(array('sbr_stages.FRL_PAID', 'sbr_stages.DOC_RECEIVED', 'sbr_stages.FRL_FEEDBACK'), $stage->data['sbr_id'], $stage->data['id']); header_location_exit("/" . sbr::NEW_TEMPLATE_SBR . "/?site=Stage&id={$stage->data['id']}"); } } if ($action == 'agree_stage') { $ok = __paramInit('bool', NULL, 'ok'); $version = __paramInit('int', NULL, 'version'); $sbr_version = __paramInit('int', NULL, 'sbr_version'); if ($ok) { if ($stage->agreeChanges($version, $sbr_version)) { header_location_exit("/" . sbr::NEW_TEMPLATE_SBR . "/?site=Stage&id={$stage->data['id']}"); } } else { $reason = __paramInit('string', null, 'frl_refuse_reason'); //stripslashes($_POST['frl_refuse_reason']); // !!! $reason = substr(pg_escape_string($reason), 0, 512);
public function refund($event = 'sbr_stages.MONEY_PAID', $role = 1) { if (!($XACT_ID = $this->_openXact(true))) { return false; } $version = $this->sbr->isEmp() ? $this->data['version'] : $this->data['frl_version']; $result = sbr_notification::sbr_add_event($XACT_ID, $this->data['sbr_id'], $this->data['id'], $event, $version, null, $role); if (!$result) { $this->_abortXact(); return false; } $this->_commitXact(); return true; }
/** * Необходима для того чтобы фрилансеру упало письмо об отказе в сделке */ public function sbrCanceledSaveEvent() { $XACT_ID = $this->_openXact(true); sbr_notification::sbr_add_event($XACT_ID, $this->id, $this->id, 'sbr.CANCEL', $this->version, null, 3); $this->_commitXact(); }
"> <a href="javascript:void(0)" onclick="if(confirm('Вы действительно хотите завершить данное событие?')) xajax_aCompleteEvent('<?php echo $current['xact_id']; ?> ')" class="b-layout__link b-layout__link_color_ee1d16 b-layout__link_bordbot_dot_ee1d16">Завершить</a> </div> <?php } ?> </td> </tr> </table> <?php if ($greenEvent) { ?> </div> </div> <?php } //if } //foreach if (count($update_event) > 0) { sbr_notification::setNotificationCompleted($update_event, $stage->data['sbr_id'], $stage->id); } if (count($update_event_sbr) > 0) { sbr_notification::setNotificationCompleted($update_event_sbr, $stage->data['sbr_id'], $stage->data['sbr_id']); } if ($is_run_comment == true) { sbr_notification::setNotificationCommentViewCompleted($stage->data['sbr_id'], $stage->id); }
} if (!$css_file) { $css_file = array(); } if ($css_file && !is_array($css_file)) { $css_file = array($css_file); } array_push($js_file, 'highlight.min.js', 'highlight.init.js', 'attachedfiles2.js', 'tawl_bem.js'); array_push($css_file, 'hljs.css'); $js_file_utf8[] = '/scripts/ckedit/ckeditor.js'; $stage->initNotification(); $stage->dateVersionTz(); $stage->orders = $_COOKIE['sbr_order'] == 1 ? 'ASC' : 'DESC'; $stage->getHistoryStage($stage->orders); $stage->getAllFiles(); $stage->active_event = sbr_notification::getNotificationActive($sbr->id, $stage->id); if (!is_array($stage->active_event)) { $stage->active_event = array(); } if (($sbr->status == sbr::STATUS_CANCELED || $sbr->status == sbr::STATUS_REFUSED || $stage->status == sbr_stages::STATUS_ARBITRAGED || $stage->status == sbr_stages::STATUS_COMPLETED) && $stage->history) { foreach ($stage->history as $xact => $history) { $current = current($history); if ($current['abbr'] == 'sbr_stages.MONEY_PAID') { $frl_sum_paid = true; } if ($current['abbr'] == 'sbr_stages.EMP_MONEY_REFUNDED') { $emp_sum_paid = true; } if ($current['abbr'] == 'sbr.CANCEL') { $stage->canceled_time = strtotime($current['xtime']); }
} if ($stage->sbr->status == sbr::STATUS_CLOSED && action != 'msg-add') { $action = ''; } $is_filled = explode(',', preg_replace('/[}{]/', '', $sbr->user_reqvs['is_filled'])); $isReqvsFilled[sbr::FT_PHYS] = $is_filled[sbr::FT_PHYS - 1] == 't'; $isReqvsFilled[sbr::FT_JURI] = $is_filled[sbr::FT_JURI - 1] == 't'; $attachedfiles = new attachedfiles($_POST['attachedfiles_session']); $comment_files = array(); $feedback_sent = isset($_SESSION["thnx_block{$stage_id}"]); if ($feedback_sent) { unset($_SESSION["thnx_block{$stage_id}"]); } if ($action == 'emp_refund') { if ($stage->refund('sbr_stages.EMP_MONEY_REFUNDED', 2)) { sbr_notification::setNotificationCompleted(array('sbr_stages.EMP_PAID'), $stage->data['sbr_id'], $stage->data['id']); header_location_exit('/' . sbr::NEW_TEMPLATE_SBR . "/?site=Stage&id={$stage->data['id']}"); } } if ($action == 'resolve_changes') { $resend = __paramInit('bool', NULL, 'resend'); $cancel = __paramInit('bool', NULL, 'cancel'); $version = __paramInit('int', NULL, 'version'); if ($resend) { if ($stage->resendChanges()) { // !!! header_location_exit('/' . sbr::NEW_TEMPLATE_SBR . "/?site=Stage&id={$stage->data['id']}"); } } else { if ($cancel) { if ($stage->cancelChanges()) {
<div class="b-fon b-fon_padbot_30"> <div class="b-fon__inner b-fon__inner_bordtop_cdcdcd b-fon__inner_bordbot_cdcdcd"> <div class="b-fon__body <?php echo sbr_notification::isReaction($stage->notification) ? 'b-fon__body_bg_f0ffdf' : 'b-fon__body_bg_eff2f3'; ?> b-fon__body_bordtop_e4e7e8 b-fon__body_bordbot_e4e7e8"> <?php include $_SERVER['DOCUMENT_ROOT'] . '/sbr/tpl.stage-header-info.php'; ?> <?php include $_SERVER['DOCUMENT_ROOT'] . "/sbr/{$fpath}tpl.stage-header.php"; ?> <?php include $_SERVER['DOCUMENT_ROOT'] . '/sbr/tpl.stage-header-form.php'; ?> </div> </div> </div>
/** * Возвращаем в работу сделки у которых истекли сроки действия паузы * * @global type $DB */ public function renewalWorkStagesByFrozen() { global $DB; // Обновляем тех кто не согласился с событий паузы (удаляем само событие) $sql = "DELETE FROM sbr_events WHERE id IN (\n SELECT se.id FROM \n sbr_stages ss\n INNER JOIN sbr_events se ON se.own_id = ss.id\n INNER JOIN sbr_versions sv ON sv.event_id = se.id\n WHERE \n ss.status = ?i\n AND ss.days_pause IS NOT NULL\n AND ( ss.start_pause + ( CAST(ss.days_pause as varchar) || ' days' )::interval ) <= NOW()\n AND se.ev_code IN(14,12) AND se.fstatus IS NULL AND sv.src_type_id IN( 23, 8) )\n RETURNING own_id, sbr_id, version, ev_code"; $deleted = $DB->rows($sql, sbr_stages::STATUS_FROZEN); $pause_reset = array(); if (!empty($deleted)) { //@todo нужна оптимизация но мешает то что XACT_ID должен быть для каждой сделкий свой foreach ($deleted as $event) { if ($event['ev_code'] == 12) { continue; } if ($XACT_ID = $this->_openXact(true)) { $result = sbr_notification::sbr_add_event($XACT_ID, $event['sbr_id'], $event['own_id'], "sbr_stages.PAUSE_RESET", $event['version'], null, null); if (!$result) { $this->_abortXact(); } $this->_commitXact(); $pause_reset_ids[] = $event['own_id']; $pause_reset[] = $event['sbr_id'] . "_" . $event['own_id']; } } } // Фиксируем дни паузы за рабочие у отмененных пауз $sql = "UPDATE sbr_stages SET worked_time = worked_time + (days_pause::text || ' days')::interval WHERE id IN(?l)"; $DB->query($sql, $pause_reset_ids); // Возвращаем в работу $sql = "UPDATE sbr_stages SET status = ?i, days_pause = NULL, start_pause = NULL, frl_version = version \n WHERE status = ?i \n AND days_pause IS NOT NULL\n AND ( start_pause + ( CAST(days_pause as varchar) || ' days' )::interval ) <= NOW()\n RETURNING sbr_id, id, version"; $result = $DB->rows($sql, sbr_stages::STATUS_PROCESS, sbr_stages::STATUS_FROZEN); foreach ($result as $event) { if (in_array($event['sbr_id'] . "_" . $event['id'], $pause_reset)) { continue; } //@todo нужна оптимизация но мешает то что XACT_ID должен быть для каждой сделкий свой if ($XACT_ID = $this->_openXact(true)) { $result = sbr_notification::sbr_add_event($XACT_ID, $event['sbr_id'], $event['id'], "sbr_stages.PAUSE_OVER", $event['version'], null, null); if (!$result) { $this->_abortXact(); } $this->_commitXact(); } } }
echo $stage->data['int_work_time']; ?> <?php echo ending(abs($stage->data['int_work_time']), 'день', 'дня', 'дней'); ?> на этап</div> </td> <td class="b-layout__right b-layout__right_width_400"> <div class="b-layout__txt b-layout__txt_right_0 b-layout__txt_absolute b-layout__txt_padright_15 b-layout__txt_relative b-layout__txt_zindex_1 <?php echo sbr_notification::isReaction($stage->notification) ? '' : 'b-layout__txt_hide'; ?> "><a class="b-layout__link" href="?site=Stage&id=<?php echo $stage->data['id']; ?> "><?php echo sbr_notification::isReaction($stage->notification) ? "Посмотреть" : "Перейти в этап"; ?> </a></div> <div class="b-layout__txt b-layout__txt_relative <?php echo $stage->getStatusColor(); ?> "><span class="b-icon b-icon_top_1 <?php echo $stage->getStatusICO(); ?> "></span><?php echo $stage->getStatusName(); ?> <span class="b-layout__hider" style="display:none;"></span></div> </td> </tr> </table>