static function renderAuctionTiming(&$auction, $forceCountdown=false) { $cfg = BidsHelperTools::getConfig(); /* $startDate = BidsHelperDateTime::getTimeStamp($auction->end_date); if( $startDate > time() ) { $auction->countdown = JText::_('COM_BIDS_NOT_YET_STARTED'); return; }*/ $auction->countdown = 0; $expiredate = BidsHelperDateTime::getTimeStamp($auction->end_date); if($auction->close_offer) { $auction->countdown = JText::_('COM_BIDS_CLOSED'); } else if ($cfg->bid_opt_enable_countdown || $forceCountdown) { $diff = $expiredate - time(); if ($diff > 0) { $s = sprintf('%02d', $diff % 60); $diff = intval($diff / 60); $m = sprintf('%02d', $diff % 60); $diff = intval($diff / 60); $h = sprintf('%02d', $diff % 24); $diff = intval($diff / 24); $auction->countdown = ( $diff > 0 ? ( $diff . ' ' . JText::_('COM_BIDS_DAYS') . ', ') : '' ) . $h . ':' . $m . ':' . $s; } else { $auction->countdown = JText::_('COM_BIDS_EXPIRED'); } } $auction->expired = $auction->close_offer ? false : (boolean) ($expiredate <= time() ); }
function saveBidAjax() { if (!$this->checkTCAgreed()) { echo "{\"success\":\"0\",\"message\":\"".JText::_('COM_BIDS_PLEASE_AGREE_TC')."\"}"; exit; } $app = JFactory::getApplication(); $my = JFactory::getUser(); $cfg=BidsHelperTools::getConfig(); $task = strtolower($this->getTask()); $auction_id = JRequest::getInt('id', -1); $proxy = JRequest::getInt('proxy', 0); $amount = JRequest::getVar('amount', 0); if (substr($amount,0,1)=='.') { $amount = (float) '0'.$amount; //american style prices like .95 instead of 0.95 } $quantity_param = JRequest::getInt('quantity', 1); $auctionmodel = $this->getModel('auction'); if ( !$auctionmodel->load($auction_id) ) { echo "{\"success\":\"0\",\"message\":\"".JText::_('COM_BIDS_DOES_NOT_EXIST')."\"}"; exit; } $auction = $auctionmodel->get('auction'); $redirect_link = JHtml::_('auctiondetails.auctionDetailsURL', $auction, false); if ($auction->userid == $my->id) { echo "{\"success\":\"0\",\"message\":\"".JText::_('COM_BIDS_ERR_NO_SELF_BIDDING')."\"}"; exit; } if ($auction->close_offer || $auction->close_by_admin || (BidsHelperDateTime::getTimeStamp($auction->end_date) <= time()) ) { echo "{\"success\":\"0\",\"message\":\"".JText::_('COM_BIDS_AUCTION_IS_CLOSED')."\"}"; exit; } if ( $auction->published != 1 || BidsHelperDateTime::getTimeStamp($auction->start_date) > time() ) { echo "{\"success\":\"0\",\"message\":\"".JText::_('COM_BIDS_DOES_NOT_EXIST')."\"}"; exit; } if ( 'bin'==$task ) { if($auction->BIN_price <=0) { echo "{\"success\":\"0\",\"message\":\"".JText::_('COM_BIDS_NO_BIN')."\"}"; exit; } else { $amount = max($amount, $auction->BIN_price); } } if(AUCTION_TYPE_BIN_ONLY==$auction->auction_type) { if('bin'!=$task) { echo "{\"success\":\"0\",\"message\":\"".JText::_('COM_BIDS_ERR_BIN_ONLY')."\"}"; exit; } if($cfg->bid_opt_quantity_enabled && $auction->quantity<$quantity_param) { echo "{\"success\":\"0\",\"message\":\"".JText::_('COM_BIDS_ERR_QUANTITY_LEFT')."\"}"; exit; } } //HERE ENDS ALL SECURITY CHECKS //TODO:i think bids greater than BIN price should not be considered BIN if ( AUCTION_TYPE_PRIVATE!=$auction->auction_type && ( 'bin'==$task || (!$proxy && $auction->BIN_price>0 && $amount>=$auction->BIN_price) ) ) { // BIN bids //for BIN, take amount from field BIN_price $newBid = $auctionmodel->bid($my->id,$amount,0,$quantity_param); if ( $auction->automatic || $auction->params['auto_accept_bin'] ) { $auctionmodel->close($newBid); } //$this->setRedirect($redirect_link); //return; echo "{\"success\":\"1\",\"bid\":\"{$newBid->bid_price}\"}"; exit; } $acceptedPrice = $auctionmodel->getMinAcceptedPrice(); if( $amount < $acceptedPrice ) { switch($auction->auction_type) { case AUCTION_TYPE_PUBLIC: //$app->enqueueMessage(JText::_('COM_BIDS_ERR_PRICE_MAXBID'));//on public auctions I can't bid lower than min accepted price echo "{\"success\":\"0\",\"message\":\"".JText::_('COM_BIDS_ERR_PRICE_MAXBID')."\"}"; exit; break; case AUCTION_TYPE_PRIVATE: //$app->enqueueMessage(JText::_('COM_BIDS_ERR_PRICE_MYBID'));//on private auctions I can't bid lower second time echo "{\"success\":\"0\",\"message\":\"".JText::_('COM_BIDS_ERR_PRICE_MYBID')."\"}"; exit; break; } //$this->setRedirect($redirect_link); return; } //reserve price message if ($cfg->bid_opt_global_enable_reserve_price && $auction->reserve_price > 0 && $auction->params['show_reserve']) { $app->enqueueMessage( JText::_( $amount<$auction->reserve_price ? 'COM_BIDS_RESERVE_NOT_MET' : 'COM_BIDS_RESERVE_MET') ); } if(AUCTION_TYPE_PUBLIC==$auction->auction_type && $cfg->bid_opt_allow_proxy) { if($proxy) { $auctionmodel->proxyBid($my->id, $amount);//bidding ends here $this->setRedirect($redirect_link); return; } else { $auctionmodel->deleteProxy($my->id); } } $newBid = $auctionmodel->bid($my->id,$amount,0,$quantity_param); echo "{\"success\":\"1\",\"bid\":\"{$newBid->bid_price}\"}"; exit; //$app->enqueueMessage(JText::_('COM_BIDS_SUCCES')); //$this->setRedirect( $redirect_link ); }
function cron() { /* cron script Pass and authentication*/ $cfg=BidsHelperTools::getConfig(); $config =JFactory::getConfig(); $pass=JRequest::getVar('pass'); $debug= JRequest::getVar('debug',0); $date=new JDate(); $nowMysql=$date->toMySQL(false); $database = JFactory::getDbo(); JTheFactoryHelper::modelIncludePath('payments'); JTheFactoryHelper::tableIncludePath('payments'); $log= JTable::getInstance('bidcronlog'); $log->priority='log'; $log->event='cron'; $log->logtime=$nowMysql; $logtext=""; if ($cfg->bid_opt_cron_password!==$pass) { //Bad Password, log and exit; $log->log=JText::_("COM_BIDS_BAD_PASSWORD_USED")." > $pass"; $log->store(); die(JText::_("COM_BIDS_ACCESS_DENIED")); } @set_time_limit(0); @ignore_user_abort(true); // reminder for due to expire suggestions $database->setQuery(" SELECT s.auction_id,a.userid FROM #__bid_suggestions AS s LEFT JOIN #__bid_auctions AS a ON s.auction_id = a.id WHERE s.status=2 AND UTC_TIMESTAMP() > DATE_ADD( s.modified, INTERVAL 24 HOUR) AND a.published=1 AND a.close_offer=0 AND a.close_by_admin=0 AND UTC_TIMESTAMP() < a.end_date GROUP BY s.auction_id"); $curs = $database->loadObjectList(); if(count($curs)>0) { $auction = JTable::getInstance('auction'); $userIds = array(); foreach($curs as $k=>$val) { $userIds[] = $val->userid; } $database->setQuery('SELECT u.* FROM #__users AS u WHERE u.id IN ( '.implode(',',$userIds).' )'); $mails = $database->loadObjectList(); $auction->SendMails($mails,'suggest_reminder'); //Notyfy Sellers abour pending suggestions } // reject expired suggestions $database->setQuery(" SELECT a.id AS suggestionId,a.auction_id,b.userid FROM #__bid_suggestions AS a LEFT JOIN #__bid_auctions AS b ON a.auction_id = b.id WHERE UTC_TIMESTAMP() > DATE_ADD( a.modified, INTERVAL 48 HOUR) AND a.status=2"); $curs = $database->loadObjectList(); if(count($curs)>0) { $auction = JTable::getInstance('auction'); $userIds = array(); $suggestionIds = array(); foreach($curs as $k=>$val) { $suggestionIds[] = $val->suggestionId; $userIds[] = $val->userid; } $database->setQuery('UPDATE #__bid_suggestions SET status=0 WHERE id IN ('.implode(',',$suggestionIds).')'); $database->query();// reject the suggestions $database->setQuery('SELECT u.* FROM #__users AS u WHERE u.id IN ( '.implode(',',$userIds).' )'); $mails = $database->loadObjectList(); $auction->SendMails($mails,'suggest_rejected'); //Notyfy Bidders abour rejected suggestion } //CLOSE auctions $query = "SELECT a.*, a.id as auctionId, GROUP_CONCAT(b.userid) AS bidderIds, GROUP_CONCAT(w.userid) AS watcherIds FROM #__bid_auctions AS a LEFT JOIN #__bids AS b ON a.id=b.auction_id LEFT JOIN #__bid_watchlist AS w ON a.id=w.auction_id WHERE UTC_TIMESTAMP() >= a.end_date AND a.close_offer = 0 AND a.published = 1 AND a.close_by_admin=0 GROUP BY a.id"; $database->setQuery($query); $rows = $database->loadObjectList('auctionId'); $extendedAuctions = array(); if($cfg->bid_opt_auto_extent && $cfg->bid_opt_auto_extent_nobids) { //these auctions have no bids and will be extended foreach($rows as $id=>$r) { if(!$r->bidderIds) { $extendedAuctions[] = $id; } } } if(count($rows)>0) { $auction = JTable::getInstance('auction'); //exclude auctions that are going to be extended $closeAuctions = array_diff(array_keys($rows),$extendedAuctions); if(count($closeAuctions)) { $database->setQuery('UPDATE #__bid_auctions SET close_offer=1, closed_date=UTC_TIMESTAMP() WHERE id IN ('.implode(',', $closeAuctions).')'); $database->query(); } foreach ($rows as $r) { //Notify bidders $auction->bind($r); //extend auctions with no bids if($cfg->bid_opt_auto_extent && $cfg->bid_opt_auto_extent_nobids>0 && !$r->bidderIds) { $extendedPeriodSeconds = $cfg->bid_opt_auto_extent_nobids * BidsHelperDateTime::translateAutoextendPeriod($cfg->bid_opt_auto_extent_nobids_type); $endTime = BidsHelperDateTime::getTimeStamp($auction->end_date); $newEndTime = $endTime + $extendedPeriodSeconds; $auction->end_date = gmdate('Y-m-d H:i:s',$newEndTime); $auction->store(); continue; } jimport('joomla.application.component.model'); JModelLegacy::addIncludePath(JPATH_COMPONENT_SITE.DS.'models'); $auctionmodel = JModelLegacy::getInstance('auction','bidsModel'); $auctionmodel->load($r->auctionId); $seller = JTable::getInstance('user'); $seller->load($r->userid); if($r->automatic) { $a = $auctionmodel->get('auction'); $highestBid = $a->highestBid; $nrHighestBids = 1; if( AUCTION_TYPE_PRIVATE == $a->auction_type ) { if($highestBid) { $query = 'SELECT COUNT(1) AS nrHighestBids FROM #__bids WHERE auction_id='.$r->auctionId.' AND bid_price='.$highestBid->bid_price; $database->setQuery($query); $nrHighestBids = $database->loadResult(); } else { $nrHighestBids = 0; } } if($highestBid) { if ($nrHighestBids>1) { //mark auction as NOT automatic and alert owner that 2 or more bids are the same $database->setQuery('UPDATE #__bid_auctions SET automatic=0 WHERE id='.$a->id); $database->query(); $auctionmodel->SendMails(array($seller),'bid_choose_winner'); } else { if ($cfg->bid_opt_global_enable_reserve_price && $a->reserve_price>0 && $a->reserve_price>=$highestBid->bid_price) { //reserve price not met! $auctionmodel->SendMails(array($seller),'bid_reserve_not_met');//reserve price not met } else { $bid = JTable::getInstance('bid'); $bid->bind($highestBid); $auctionmodel->close($bid); } } } else { $auctionmodel->SendMails(array($seller),'bid_offer_no_winner_to_owner'); } } else { // Notify owner to choose winner OR that his auction has no winner $auctionmodel->SendMails(array($seller), $r->bidderIds ? 'bid_choose_winner' : 'bid_offer_no_winner_to_owner'); } if($r->bidderIds) { $database->setQuery('SELECT u.* FROM #__users AS u WHERE u.id IN ('.$r->bidderIds.')'); $mails = $database->loadObjectList(); $auctionmodel->SendMails($mails,'bid_closed'); //Notyfy Bidders abour closed Auction $database->setQuery('DELETE FROM #__bid_watchlist WHERE auction_id='.$r->id.' AND userid IN ('.$r->bidderIds.')'); $database->query();//delete bidders from watchlist, to avoid double notification } //Notify Watchlist, Clean Watchlist if($r->watcherIds) { $database->setQuery('SELECT u.* FROM #__users AS u WHERE u.id IN ('.$r->watcherIds.')'); $mails = $database->loadObjectList(); $auctionmodel->SendMails($mails,'bid_watchlist_closed'); //Notify Watchlist $database->setQuery('DELETE FROM #__bid_watchlist WHERE auction_id='.$r->id); $database->query(); } } } // END EXPIRED AUCTION //Daily Jobs (things that should run once a day ) $daily= JRequest::getVar('daily',''); if ($daily){ //Notify upcoming expirations $query = "SELECT a.* from #__bid_auctions AS a WHERE UTC_TIMESTAMP() >= DATE_ADD(end_date,INTERVAL -1 DAY) AND a.close_offer != 1 AND published = 1 AND a.close_by_admin!=1"; $database->setQuery($query); $rows = $database->loadObjectList(); $auction = JTable::getInstance('auction'); $logtext.=sprintf("Soon to expire: %d auctions\r\n",count($rows)); foreach ($rows as $row){ $auction->load($row->id); $usr=JFactory::getUser($row->userid); $auction->SendMails(array($usr),'bid_your_will_expire'); // Notify Owner that his auction will soon expire $query = "SELECT u.* FROM #__users u left join #__bid_watchlist w on u.id = w.userid where w.auction_id = ".$row->id; $database->setQuery($query); $watchlist_mails = $database->loadObjectList(); $auction->SendMails($watchlist_mails,'bid_watchlist_will_expire'); //Notify Users in watchlist that an auction will expire } //Close all auctions without a parent user (deleted users?)s $query = "UPDATE #__bid_auctions AS a LEFT JOIN #__users AS b ON a.userid=b.id SET close_by_admin=1, closed_date=UTC_TIMESTAMP() WHERE b.id IS NULL"; $database->setQuery($query); $database->query(); //delete Very old auctions (past Archived time) $interval = intval($bidCfg->bid_opt_archive); $d_opt = ( $bidCfg->bid_opt_archive_type!='') ? $bidCfg->bid_opt_archive_type : 'month'; $d_opt_sql = strtoupper($d_opt); if ($interval>0){ $query = "SELECT id FROM #__bid_auctions WHERE UTC_TIMESTAMP() > DATE_ADD( closed_date, INTERVAL $interval {$d_opt_sql} ) AND (close_offer =1 or close_by_admin=1)"; $database->setQuery($query); $idx = $database->loadResultArray(); //select auctions that have to be purged $row = JTable::getInstance('auction'); if (count($idx)) { foreach ($idx as $id){ $row->delete($id); } } } $model= JModelLegacy::getInstance('Currency','JTheFactoryModel'); $currtable= JTable::getInstance('CurrencyTable','JTheFactory'); $currencies=$model->getCurrencyList(); $default_currency=$model->getDefault(); $results=array(); foreach($currencies as $currency){ if ($currency->name==$default_currency){ $currtable->load($currency->id); $currtable->convert=1; $currtable->store(); $results[]=$currency->name." ---> ".$default_currency." = 1"; continue; } $conversion=$model->getGoogleCurrency($currency->name,$default_currency); if ($conversion===false){ $results[]=JText::_("COM_BIDS_ERROR_CONVERTING")." {$currency->name} --> $default_currency"; continue; } $currtable->load($currency->id); $currtable->convert=$conversion; $currtable->store(); $results[]=$currency->name." ---> ".$default_currency." = $conversion "; } $logtext.=implode("\r\n",$results); $logtext.="\r\n"; //some cleanup } $log->log=$logtext; $log->store(); if ($debug) return; ob_clean(); exit(); }
function display($tmpl) { jimport('joomla.html.parameter'); $cfg = BidsHelperTools::getConfig(); $model = $this->getModel('auctions'); $items = $model->get('auctions'); $lists=array(); $gallery = BidsHelperGallery::getGalleryPlugin(); $i=0; foreach($items as $k=>&$item) { $item->rownr = ++$i; $item->params = new JParameter($item->params); $gallery->clearImages(); $gallery->addImageList(explode(',',$item->pictures)); $item->thumbnail = $gallery->getThumbImage(); $item->start_date_text = JHTML::_('auctiondetails.startDateHtml', $item); $item->description = JFilterOutput::cleanText($item->description); $item->shortdescription = JFilterOutput::cleanText($item->shortdescription); $item->tagIds = $item->tagIds ? explode(',', $item->tagIds) : array(); $item->tagNames = $item->tagNames ? explode(',', $item->tagNames) : array(); $item->links = JHTML::_('auctiondetails.createLinks',$item); if (!isset($item->favorite)) $item->favorite = false; $item->del_from_watchlist = (bool) $item->favorite; $item->add_from_watchlist = !$item->del_from_watchlist; if ($cfg->bid_opt_multiple_shipping) { $p = JTable::getInstance('bidshipzone'); $item->shipping_zones = $p->getPriceList($item->id); } BidsHelperAuction::renderAuctionTiming($item); $item->countdownHtml = JHTML::_('auctiondetails.countdownHtml',$item); if ( BidsHelperDateTime::getTimeStamp($item->end_date) <= time() ) { $item->expired = true; } else { $item->expired = false; } $item->start_date_text = JHTML::_('auctiondetails.startDateHtml', $item); $item->end_date_text = JHTML::_('auctiondetails.endDateHtml', $item); BidsHelperAuction::setAuctionStatus($item); if ($item->params->get('max_price', '1') == 0 || $item->auction_type == AUCTION_TYPE_PRIVATE) { $item->highest_bid = null; } $lists['bidderPaypalButton'][$item->id] = isset($item->wonBids) ? JHTML::_('auctiondetails.bidderPaypalButton',$item) : null; } $this->assign('positions', array()); $filter_type = $model->getState('filters.filter_type'); $filter_bidtype = $model->getState('filters.filter_bidtype'); $filter_archive = $model->getState('filters.filter_archive'); $filter_order = $model->getState('filters.filter_order'); $filter_order_Dir = $model->getState('filters.filter_order_Dir'); $pagination = $model->get('pagination'); $lists['archive'] = JHTML::_('listauctions.selectMyFilter', $model->getState('filters.filter_archive')); $lists['filter_bidtype'] = JHTML::_('listauctions.selectBidType', $model->getState('filters.filter_bidtype') ); $lists['orders'] = JHTML::_('listauctions.selectOrder',$filter_order); $lists['filter_order_asc'] = JHTML::_('listauctions.selectOrderDir', $filter_order_Dir); $lists['filter_cats'] = JHTML::_('listAuctions.selectCategory', $model->getState('filters.cat')); $lists['inputKeyword'] = JHTML::_('listAuctions.inputKeyword', $model->getState('filters.keyword')); $filters = $model->getFilters(); $lists['inputsHiddenFilters'] = JHTML::_('listAuctions.inputsHiddenFilters', $filters ); $lists['htmlLabelFilters'] = JHTML::_('listAuctions.htmlLabelFilters', $filters, false ); $lists['resetFilters'] = JHTML::_('listAuctions.linkResetFilters', $model->getState('behavior')); $this->assign('lists', $lists); $uri = JFactory::getURI(); $this->assign("action", JRoute::_(JFilterOutput::ampReplace($uri->toString()))); $this->assign("auction_rows", $items); $this->assign("filter_type", $filter_type); $this->assign("filter_bidtype", $filter_bidtype); $this->assign("filter_order_Dir", $filter_order_Dir); $this->assign("reverseorder_Dir", $filter_order_Dir=='ASC' ? 'ASC' : 'DESC' ); $this->assign("filter_order", $filter_order); $this->assign("filter_archive", $filter_archive); $this->assign("pagination", $pagination); JHTML::script( JURI::root().'components/com_bids/js/jquery/jquery.js' ); JHTML::script( JURI::root().'components/com_bids/js/jquery/jquery.noconflict.js' ); JHTML::script( JURI::root().'components/com_bids/js/ratings.js' ); JHTML::script( JURI::root().'components/com_bids/js/startup.js' ); JHTML::_('behavior.modal'); JHTML::_('behavior.tooltip'); BidsHelperHtml::loadCountdownJS(); parent::display($tmpl); }
function autoExtend() { $cfg = BidsHelperTools::getConfig(); $endTime = BidsHelperDateTime::getTimeStamp($this->auction->end_date); $remainingTime = $endTime - time(); $endingRange = $cfg->bid_opt_auto_extent_limit * BidsHelperDateTime::translateAutoextendPeriod($cfg->bid_opt_auto_extent_limit_type); if ( (0 < $remainingTime) && ($remainingTime < $endingRange) ) { $extendOffset = $cfg->bid_opt_auto_extent_offset * BidsHelperDateTime::translateAutoextendPeriod($cfg->bid_opt_auto_extent_offset_type); $this->auction->end_date = $endTime + $extendOffset; $this->auction->end_date = gmdate('Y-m-d H:i:s', $this->auction->end_date); $this->auction->extended_counter += 1; $this->store(true); } }