/**
  * /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));
 }
 /**
  * Тест каскадных удалений
  *
  */
 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);
 }