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); } }