/** * Устанавливает сделку в состояние зарезервированной после успешной операции резервирования на счете. * Добавляет к операции подробный комментарий. * * @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; }
/** * Необходима для того чтобы фрилансеру упало письмо об отказе в сделке */ 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(); }
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; }
/** * Возвращаем в работу сделки у которых истекли сроки действия паузы * * @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(); } } }