/**
  * /robokassa/init
  * Инициализация транзакции и возврат json-обекта
  *
  * @param sfWebRequest $request
  */
 public function executeInit(sfWebRequest $request)
 {
     $userId = $this->getUser()->getUserRecord()->getId();
     // В качестве параметра ожидаем ID услуги (POST параметр service)
     $serviceId = (int) $request->getParameter("service", 0);
     $term = (int) $request->getParameter("term", 1);
     // Получаем стоимость услуги
     $service = Doctrine::getTable('Service')->find($serviceId);
     $this->forward404Unless($service);
     $price = $service->getPrice();
     // Инициализация транзакции
     $transaction = new BillingTransaction();
     $transaction->setUserId($userId);
     $transaction->setPaysystem('robokassa');
     $transaction->setServiceId($serviceId);
     $transaction->setPrice($price);
     $transaction->setTerm($term);
     $total = round($term * $price, 2);
     $transaction->setTotal($total);
     $transaction->save();
     $url = Robokassa::getScriptURL($transaction);
     $b = new sfWebBrowser();
     $b->get($url);
     $text = $b->getResponseText();
     $matches = array();
     preg_match_all("/^(.*)document.write\\(\\'(.*)\\'\\)/isu", $text, $matches);
     $return = array("result" => array("script" => html_entity_decode(trim($matches[1][0])), "html" => html_entity_decode(trim($matches[2][0]))));
     $this->getResponse()->setHttpHeader('Content-Type', 'application/json');
     return $this->renderText(json_encode($return));
 }
 /**
  * Получить URL на скрипт формы оплаты
  *
  * @param BillingTransaction $transaction транзакция
  * @return string URL скрипта для отображения формы выбора типа оплаты
  */
 public static function getScriptURL(BillingTransaction $transaction)
 {
     $URL = self::getSettings('scriptUrl');
     $URL .= "?";
     $params = array("MrchLogin" => self::getSettings('login'), "OutSum" => $transaction->getTotal(), "InvId" => $transaction->getId(), "IncCurrLabel" => "PCR", "Desc" => $transaction->getService()->getName(), "SignatureValue" => md5(self::getSettings('login') . ':' . $transaction->getTotal() . ':' . $transaction->getId() . ':' . self::getSettings('pass1') . ':' . 'shpa=' . $transaction->getTerm()), "Culture" => "ru", "Encoding" => "utf-8", "shpa" => $transaction->getTerm());
     foreach ($params as $key => $value) {
         if ($URL[strlen($URL) - 1] != '?') {
             $URL .= '&';
         }
         $URL .= $key . "=" . rawurlencode($value);
     }
     return $URL;
 }
 /**
  * Тест каскадных удалений
  *
  */
 public function testCascade()
 {
     $bt = new BillingTransaction();
     // Создаем пользователя, услугу и транзакцию
     $user = $this->helper->makeUser();
     $user->save();
     $service = new Service();
     $service->save();
     $bt->setUserId($user->getId());
     $bt->setServiceId($service->getId());
     $bt->save();
     // При удалении службы транзакция остается
     $service->delete();
     $findBt = Doctrine::getTable('BillingTransaction')->find($bt->getId());
     $this->assertType('BillingTransaction', $findBt);
     $this->assertEquals($findBt->getId(), $bt->getId());
     // При удалении пользователя удаляется запись о транзакции
     $user->delete();
     $findBt = Doctrine::getTable('BillingTransaction')->find($bt->getId());
     $this->assertEquals($findBt, null);
 }
 /**
  * Генерирует транзакцию для пользователя и сервиса
  * @param object $user
  * @param bool $isNew создавать ли новую транзакцию, если есть старая
  * @return BillingTransaction
  */
 private function getTestTransaction($user = null, $isNew = false)
 {
     if ((is_null($this->_transaction) || $isNew) && !is_null($user)) {
         $service = $this->getService();
         $term = 6;
         $transaction = new BillingTransaction();
         $transaction->fromArray(array('service_id' => $service->getId(), 'price' => $service->getPrice(), 'term' => $term, 'status' => 0, 'total' => $term * $service->getPrice(), 'user_id' => $user->getId()));
         $transaction->save();
         $this->_transaction = $transaction;
     }
     return $this->_transaction;
 }