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