getUser()->getAttribute('user');
$item = Doctrine::getTable('Item')->find($request->getParameter('id'));
if (!is_object($item))
return sfView::NONE;
$this->bid_limit = $this->item->getBidLimitByUser($this->getUser()->getAttribute('user'));
$data = array(
'user_id' => $user->id,
'price_actual' => round($item->price_actual),
'min_bid' => $this->getMinBid($item),
'min_bid_text' => $this->getComponent('item', 'minBidText', array('item' => $item)),
'time_end' => strtotime($item->time_end),
'my_limit' => $this->bid_limit ? $this->bid_limit->getPriceBid() : 0,
'my_limit_text' => $this->getComponent('item', 'limitText', array('item' => $item)),
);
$json = json_encode($data);
if (!$this->getRequest()->isXmlHttpRequest())
{
var_dump($json);
die();
}
else
{
$this->getResponse()->setHttpHeader('Content-type', 'application/json');
}
return $this->renderText($json);
}
public function executeCheckStatusFinished(sfWebRequest $request)
{
$user = $this->getUser()->getAttribute('user');
$item = Doctrine::getTable('Item')->find($request->getParameter('id'));
if (!is_object($item))
return sfView::NONE;
$data = array('finished' => 0);
if (strtotime($item->time_end) < time())
{
$conn = Doctrine::getConnectionByTableName('Item');
try
{
$conn->beginTransaction();
$item = Doctrine::getTable('Item')->find($request->getParameter('id'));
$item->is_finished = 1;
$item->save();
// email draziteli
$this->emailWinner($item, $item->getuser());
$conn->commit();
}
catch (Exception $e)
{
$conn->rollback();
}
$data['finished'] = 1;
}
$json = json_encode($data);
if (!$this->getRequest()->isXmlHttpRequest())
{
var_dump($json);
die();
}
else
{
$this->getResponse()->setHttpHeader('Content-type', 'application/json');
}
return $this->renderText($json);
}
public function executeShowBids(sfWebRequest $request)
{
$this->forward404Unless($item = Doctrine::getTable('Item')->findOneById($request->getParameter('id')));
return $this->renderComponent('item', 'bidsHistory', array('item' => $item));
}
public function executeBidForm(sfWebRequest $request)
{
$this->item = Doctrine::getTable('Item')->find($request->getParameter('id'));
return $this->renderComponent('item', 'bidForm', array('item' => $this->item));
}
public function executeSendBid(sfWebRequest $request)
{
$conn = Doctrine::getTable('Item')->getConnection();
try
{
$conn->beginTransaction();
Doctrine::getTable('Item')->setOption('ignore_audit', true);
$item = Doctrine::getTable('Item')->find($request->getParameter('id'));
// aukce byla jiz ukoncena
if (strtotime($item->time_end) < time())
{
$conn->commit();
return sfView::NONE;
}
$this->setBit($this->getUser()->getAttribute('user'), $item, $request->getParameter('prihoz'));
$conn->commit();
}
catch (Doctrine_Exception $e)
{
echo $e->getMessage();
exit;
$conn->rollback();
}
return sfView::NONE;
}
private function setBit($user, $item, $prihoz)
{
$check = Doctrine::getTable('Bid')
->createQuery("a")
->where("a.item_id =" . $item->id)
->orderBy("price_bid DESC")
->limit(1)
->execute();
$sum = $this->getMinBid($item);
if ($sum <= $prihoz)
{
$bid = new Bid();
$bid->user_id = $user->getId();
$bid->item_id = $item->id;
$bid->price_bid = $prihoz;
$bid->time_bid = date("Y-m-d H:i:s");
$bid->save();
$item->price_actual = $prihoz;
$item->save();
$this->checkLimitBid($item, $user);
$this->emailSecondBid($item, $user);
$this->continueTime($item);
}
}
private function continueTime($item)
{
if (1/* $item->continuation */ == 1)
{
$sec = sfConfig::get('app_pokracovani_minuty') * 60;
if ((time() + $sec) >= strtotime($item->time_end))
{
$item->time_end = date("Y-m-d H:i:s", strtotime($item->time_end) + $sec);
$item->save();
}
}
}
private function checkLimitBid($item, $user)
{
$check = Doctrine::getTable('Bid_limit')
->createQuery("a")
->Where("a.item_id=" . $item->getId())
->orderBy("price_bid DESC")
->limit(1)
->execute();
// je nejaky limit nastaven?
if (!empty($check) && count($check) == 1)
{
$check = $check[0];
// je to limit uzivatele, ktery prihodil?
if ($check->user_id == $user->id)
{
// pokud uzivatel prehodi vlastni limit - limit se zrusi
if ($item->price_actual > $check->price_bid)
{
$check->delete();
}
return false;
// limit mel jiny uzivatel
}
else
{
// uzivatel neprehodil limit - system prihodi za uzivatele, ktery mel nastaven limit
if ($item->price_actual < $check->price_bid)
{
$min_bid = $this->getMinBid($item);
// novy prihoz je bud novy minimalni prihoz na predmet, nebo nic
$price_bid = $min_bid;
if ($price_bid > $check->price_bid)
{
$this->emailLowLimit($item, $check->User);
$check->delete();
}
else
{
$bid = new Bid();
$bid->user_id = $check->getUserId();
$bid->item_id = $item->getId();
$bid->price_bid = $price_bid;
$bid->time_bid = date("Y-m-d H:i:s");
$bid->save();
$item->price_actual = $price_bid;
$item->save();
}
// pokud byl limit dorovnan, je zrusen - ToDo: poslat E-MAIL
if ($price_bid == $check->price_bid)
{
$this->emailOverLimit($item, $check->User);
$check->delete();
}
// limit byl preskocen - bude zrusen - ToDo: poslat E-MAIL
}
else
{
$this->emailOverLimit($item, $check->User);
$check->delete();
}
}
}
}
private function setLimit($user, $item, $price)
{
$check = Doctrine::getTable('Bid_limit')->createQuery("a")
->where("a.user_id = " . $user)->andWhere("a.item_id=" . $item)->execute();
if (count($check) == 0)
{
$limit = new Bid_limit();
$limit->user_id = $user;
$limit->item_id = $item;
}
else
{
$limit = $check[0];
}
$limit->price_bid = $price;
$limit->save();
return $limit;
}
public function executeSendLimit(sfWebRequest $request)
{
$limit = $request->getParameter('prihoz'); // novy limit nacteny z GETu
$renderText = "";
$conn = Doctrine::getTable('Item')->getConnection();
try
{
$conn->beginTransaction();
Doctrine::getTable('Item')->setOption('ignore_audit', true);
$item = Doctrine::getTable('Item')->find($request->getParameter('id'));
$this->continueTime($item);
$user = $this->getUser()->getAttribute('user');
// zadany limit je mensi, nez minimalni prihoz
if ($this->getMinBid($item) > $limit)
{
$conn->commit();
return sfView::NONE;
}
$check = Doctrine::getTable('Bid_limit')
->createQuery()
->where('item_id = ?', $item->id)
->execute();
// na tomto predmetu jiz existuje limit
if (count($check))
{
$check = $check[0];
// existujici limit je muj
if ($check->user_id == $user->id)
{
// zvysim, pokud je nizsi, jinak neresim
if ($check->price_bid < $limit)
{
$check->delete();
$this->insertBid_limit($item, $user, $limit);
}
elseif ($check->price_bid > $limit)
{
$check->price_bid = $limit;
$check->save();
}
// existujici limit je stejny jako muj
}
elseif ($check->price_bid == $limit)
{
$this->insertBid($item, $user, $limit);
$this->emailLowLimit($item, $check->User);
$check->delete();
$renderText = "";
}
elseif ($check->price_bid > $limit)
{
// zvysim nastaveny limit o 1 Kc
$limit += 1;
$this->insertBid($item, $check->User, $limit);
$this->emailSpecialLimit($item, $check->User);
$renderText = "";
}
else
{
// prihoz ve vysi celeho limitu stavajiciho uzivatele s limitem
$this->insertBid($item, $check->User, $check->price_bid);
// zruseni stavajiciho limitu
$this->emailOverLimit($item, $check->User);
$check->delete();
// prihoz uzivatele, ktery musi prekonat puvodni limit
$minBid = $this->getMinBid($item);
// neni mozne prihodit vice nez je limit (i kdyz je minimalni prihoz vetsi)
if ($minBid > $limit)
{
$this->emailLowLimit($item, $user);
}
else
{
$this->insertBid($item, $user, $minBid);
// pokud existujici uzivatel s limitem dosahl sveho limitu pro prihoz, nezalozi se
if ($minBid != $limit)
{
$this->insertBid_limit($item, $user, $limit);
}
}
}
// jeste neexistuje limit
}
else
{
$current_bid = Doctrine::getTable('Bid')
->createQuery()
->where('item_id = ?', $item->id)
->orderBy('price_bid DESC')
->limit(1)
->execute();
// predmet jiz ma prihozy (beru nejvyssi)
if (count($current_bid))
{
$current_bid = $current_bid[0];
// uzivatel je aktualni drazitel
if ($current_bid->user_id != $user->id)
{
$minBid = $this->getMinBid($item);
$this->insertBid($item, $user, $minBid);
}
// predmet nema prihozy
}
else
{
$minBid = $this->getMinBid($item);
$this->insertBid($item, $user, $minBid);
}
// nastaveni noveho limitu
$this->insertBid_limit($item, $user, $limit);
}
$conn->commit();
}
catch (Doctrine_Exception $e)
{
echo $e->getMessage();
exit;
$conn->rollback();
}
if (!empty($renderText))
return $this->renderText($renderText);
return sfView::NONE;
}
private function randLimit($item, $user, $prihoz)
{
$i = Doctrine::getTable('Item')->find($item);
$check = Doctrine::getTable('Bid_limit')->createQuery("a")->where("a.item_id = " . $item)
->andWhere("a.user_id != " . $user)->execute();
if (count($check) == 0 || empty($check))
{
$this->limit = $this->setLimit($user, $i->getId(), $prihoz);
$bid = Doctrine::getTable('Bid')->createQuery("a")->where("a.item_id = " . $item)->limit(1)->execute();
$sum = 0;
if (!empty($bid) && count($bid) > 0)
$sum += $bid[0]->getPriceBid() + $i->getPriceBid();
else
$sum += $i->getPriceBid() + $i->getPriceStart();
$bid = new Bid();
$bid->user_id = $user;
$bid->item_id = $item;
$bid->price_bid = $sum;
$bid->save();
} else
{
if ($check[0]->price_bid < $prihoz)
{
$this->limit = $this->setLimit($user, $i->getId(), $prihoz);
$bid = new Bid();
$bid->user_id = $user;
$bid->item_id = $item;
$bid->price_bid = $check[0]->price_bid + $i->getPriceBid();
$bid->save();
}
}
}
private function getMinBid($item)
{
return $item->getMinBidPrice();
}
private function insertBid($item, $user, $price_bid)
{
$bid = new Bid();
$bid->user_id = $user->id;
$bid->item_id = $item->id;
$bid->price_bid = $price_bid;
$bid->time_bid = date("Y-m-d H:i:s");
$bid->save();
$item->price_actual = $price_bid;
$item->save();
$this->emailSecondBid($item, $user);
}
private function insertBid_limit($item, $user, $limit)
{
$bid_limit = new Bid_limit();
$bid_limit->user_id = $user->id;
$bid_limit->item_id = $item->id;
$bid_limit->price_bid = $limit;
$bid_limit->save();
}
private function emailSecondBid($item, $user)
{
$bids = Doctrine::getTable('Bid')
->createQuery()
->where('item_id = ?', $item->id)
->orderBy('price_bid DESC')
->limit(2)
->execute();
if ((count($bids) == 2) && ($bids[1]->user_id != $user->id))
{
$mailer = new itemMailer();
$mailer->emailOverBid($item, $bids[1]->User);
}
}
private function emailOverLimit($item, $user)
{
$mailer = new itemMailer();
$mailer->emailOverLimit($item, $user);
}
private function emailLowLimit($item, $user)
{
$mailer = new itemMailer();
$mailer->emailLowLimit($item, $user);
}
private function emailSpecialLimit($item, $user)
{
$mailer = new itemMailer();
$mailer->emailSpecialLimit($item, $user);
}
private function emailWinner($item, $user)
{
$mailer = new itemMailer();
$mailer->emailWinner($item, $user);
}
}