123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922 |
- <?php
- /**
- *
- * PHP Pro Bid $Id$ c/WhzHP7QQGgz+1n75/63kwUxwZIVLB4JrDdh2v4hRs=
- *
- * @link http://www.phpprobid.com
- * @copyright Copyright (c) 2017 Online Ventures Software & CodeCube SRL
- * @license http://www.phpprobid.com/license Commercial License
- *
- * @version 7.10 [rev.7.10.02]
- */
- /**
- * cron jobs service class
- */
- namespace Ppb\Service;
- use Cube\Db\Adapter\AbstractAdapter,
- Cube\Controller\Front,
- Cube\Cache\Adapter\AbstractAdapter as CacheAdapter,
- Cube\Db\Expr,
- Ppb\Db\Table,
- Cube\Config,
- Cube\Db\Table\AbstractTable,
- Ppb\Service\Table\SalesListings as SalesListingsService;
- class Cron extends AbstractService
- {
- /**
- * maximum number of rows to be selected in a transaction
- */
- const SELECT_TRANSACTION_LIMIT = 50;
- /**
- * unused files from the uploads folder are to be removed after 6 hours
- */
- const UNUSED_FILES_REMOVAL_TIME_LIMIT = 21600;
- /**
- * default number of days after which unused autocomplete tags are removed
- */
- const AUTOCOMPLETE_TAGS_PURGE_DAYS = 60;
- /**
- * default number of days when the subscription expiration emails are to be sent
- */
- const DEFAULT_EXPIRATION_DAYS = 3;
- /**
- * number of minutes after which data is purged from the users statistics table for online users.
- */
- const ONLINE_USERS_STATS_PURGE = 5;
- /**
- *
- * listings service
- *
- * @var \Ppb\Service\Listings
- */
- protected $_listings;
- /**
- *
- * users service
- *
- * @var \Ppb\Service\Users
- */
- protected $_users;
- /**
- *
- * sales service
- *
- * @var \Ppb\Service\Sales
- */
- protected $_sales;
- /**
- *
- * sales listings service
- *
- * @var \Ppb\Service\Table\SalesListings
- */
- protected $_salesListings;
- /**
- *
- * get listings service
- *
- * @return \Ppb\Service\Listings
- */
- public function getListings()
- {
- if (!$this->_listings instanceof Listings) {
- $this->setListings(
- new Listings());
- }
- return $this->_listings;
- }
- /**
- *
- * set listings service
- *
- * @param \Ppb\Service\Listings $listings
- *
- * @return $this
- */
- public function setListings(Listings $listings)
- {
- $this->_listings = $listings;
- return $this;
- }
- /**
- *
- * get users service
- *
- * @return \Ppb\Service\Users
- */
- public function getUsers()
- {
- if (!$this->_users instanceof Users) {
- $this->setUsers(
- new Users());
- }
- return $this->_users;
- }
- /**
- *
- * set users service
- *
- * @param \Ppb\Service\Users $users
- *
- * @return $this
- */
- public function setUsers(Users $users)
- {
- $this->_users = $users;
- return $this;
- }
- /**
- *
- * get sales service
- *
- * @return \Ppb\Service\Sales
- */
- public function getSales()
- {
- if (!$this->_sales instanceof Sales) {
- $this->setSales(
- new Sales());
- }
- return $this->_sales;
- }
- /**
- *
- * set sales service
- *
- * @param \Ppb\Service\Sales $sales
- *
- * @return $this
- */
- public function setSales(Sales $sales)
- {
- $this->_sales = $sales;
- return $this;
- }
- /**
- *
- * get sales listings service
- *
- * @return \Ppb\Service\Table\SalesListings
- */
- public function getSalesListings()
- {
- if (!$this->_salesListings instanceof SalesListingsService) {
- $this->setSalesListings(
- new SalesListingsService());
- }
- return $this->_salesListings;
- }
- /**
- *
- * set sales listings service
- *
- * @param \Ppb\Service\Table\SalesListings $salesListings
- *
- * @return $this
- */
- public function setSalesListings(SalesListingsService $salesListings)
- {
- $this->_salesListings = $salesListings;
- return $this;
- }
- /**
- *
- * close expired listings and assign winners
- * limit to 50 per transaction
- * forUpdate means that the rows will be locked until the transaction is complete
- *
- * @return $this
- */
- public function closeExpiredListings()
- {
- $listingsService = $this->getListings();
- $usersService = $this->getUsers();
- srand();
- $rand = mt_rand(1000, 9999);
- usleep($rand);
- $select = $listingsService->getTable()->select()
- ->forUpdate()
- ->where('closed = ?', 0)
- ->where('deleted = ?', 0)
- ->where('draft = ?', 0)
- ->where('start_time < ?', new Expr('now()'))
- ->where('end_time < ?', new Expr('now()'))
- ->where('end_time is not null')
- ->limit(self::SELECT_TRANSACTION_LIMIT);
- $expiredListings = $listingsService->fetchAll($select)
- ->setAutomatic(true)
- ->close();
- $noSale = array();
- $noSaleReserve = array();
- /** @var \Ppb\Db\Table\Row\Listing $listing */
- foreach ($expiredListings as $listing) {
- if ($listing->getClosedFlag() === true) {
- if ($listing->getData('quantity') > 0) {
- $saleId = $listing->assignWinner();
- if ($saleId === false) {
- if ($listing->countDependentRowset('\Ppb\Db\Table\Bids')) {
- $noSaleReserve[$listing['user_id']][] = $listing;
- }
- else {
- $noSale[$listing['user_id']][] = $listing;
- }
- }
- }
- }
- }
- // send email notifications to listings owners
- $mail = new \Listings\Model\Mail\OwnerNotification();
- foreach ($noSale as $userId => $listings) {
- $user = $usersService->findBy('id', $userId);
- $mail->setUser($user)
- ->setListings($listings)
- ->noSale()
- ->send();
- }
- foreach ($noSaleReserve as $userId => $listings) {
- $user = $usersService->findBy('id', $userId);
- $mail->setUser($user)
- ->setListings($listings)
- ->noSaleReserve()
- ->send();
- }
- $expiredListings->relist();
- return $this;
- }
- /**
- *
- * start scheduled listings
- *
- * @return $this
- */
- public function startScheduledListings()
- {
- $listingsService = $this->getListings();
- $adapter = $listingsService->getTable()->getAdapter();
- $where = array(
- $adapter->quoteInto('closed = ?', 1),
- $adapter->quoteInto('deleted = ?', 0),
- $adapter->quoteInto('draft = ?', 0),
- $adapter->quoteInto('start_time < ?', new Expr('now()')),
- 'end_time > ' . new Expr('now()') . ' OR end_time is null',
- );
- $listingsService->getTable()->update(array('closed' => 0, 'updated_at' => new Expr('now()')), $where);
- return $this;
- }
- /**
- *
- * method that purges cache routes and metadata
- * normally is run from the cron daily
- *
- * @return $this
- */
- public function purgeCacheData()
- {
- /** @var \Cube\Cache $cache */
- $cache = Front::getInstance()->getBootstrap()->getResource('cache');
- $cache->getAdapter()->purge(CacheAdapter::ROUTES);
- $cache->getAdapter()->purge(CacheAdapter::METADATA);
- return $this;
- }
- public function purgeCacheQueries()
- {
- /** @var \Cube\Cache $cache */
- $cache = Front::getInstance()->getBootstrap()->getResource('cache');
- $expires = $cache->getAdapter()->getExpires();
- $cache->getAdapter()
- ->setExpires(AbstractTable::QUERIES_CACHE_EXPIRES)
- ->purge(CacheAdapter::QUERIES);
- $cache->getAdapter()
- ->setExpires($expires);
- return $this;
- }
- /**
- *
- * delete expired rows from the sales listings table for which the
- * corresponding sale is marked as pending
- *
- * @return $this
- */
- public function deletePendingSalesListings()
- {
- $settings = $this->getSettings();
- $salesListingsService = $this->getSalesListings();
- $select = $salesListingsService->getTable()->getAdapter()
- ->select()
- ->from(array('sl' => 'sales_listings'), 'sl.id')
- ->joinLeft(array('s' => 'sales'), 's.id = sl.sale_id', '')
- ->where('sl.created_at < ?',
- new Expr('(now() - interval ' . intval($settings['pending_sales_listings_expire_hours']) . ' minute)'))
- ->where('s.pending = ?', 1);
- $rows = $salesListingsService->fetchAll($select);
- $ids = array();
- foreach ($rows as $row) {
- $ids[] = $row['id'];
- }
- $salesListingsService->delete($ids);
- return $this;
- }
- /**
- *
- * suspend users for which the debit balance date has been exceeded
- *
- * @return $this
- */
- public function suspendUsersDebitExceededDate()
- {
- $usersService = $this->getUsers();
- $settings = $this->getSettings();
- if ($settings['user_account_type'] == 'personal' || $settings['payment_mode'] == 'account') {
- $select = $usersService->getTable()->select()
- ->where('active = ?', 1)
- ->where('role NOT IN (?)', array_keys(Users::getAdminRoles()))
- ->where('balance > max_debit')
- ->where('debit_exceeded_date is not null')
- ->where('debit_exceeded_date < ?',
- new Expr('(now() - interval ' . intval($settings['suspension_days']) . ' day)'))
- ->limit(self::SELECT_TRANSACTION_LIMIT);
- if ($settings['user_account_type'] == 'personal') {
- $select->where('account_mode = ?', 'account');
- }
- $users = $usersService->fetchAll($select);
- $mail = new \Members\Model\Mail\User();
- /** @var \Ppb\Db\Table\Row\User $user */
- foreach ($users as $user) {
- $user->updateActive(0);
- $mail->accountBalanceExceeded($user)->send();
- }
- }
- return $this;
- }
- public function sendNewsletters()
- {
- $newslettersRecipientsService = new NewslettersRecipients();
- $newslettersService = new Newsletters();
- $recipients = $newslettersRecipientsService->fetchAll(
- $newslettersRecipientsService->getTable()->getAdapter()->select()
- ->from(array('nr' => 'newsletters_recipients'))
- ->joinLeft(array('n' => 'newsletters'), 'n.id = nr.newsletter_id', array('title', 'content'))
- // ->joinLeft(array('u' => 'users'), 'u.id = nr.user_id', array('username', 'email'))
- ->limit(200));
- $mail = new \Members\Model\Mail\User();
- $ids = array();
- $newslettersIds = array();
- /** @var \Cube\Db\Table\Row $data */
- foreach ($recipients as $data) {
- $ids[] = $data['id'];
- $newslettersIds[] = $data['newsletter_id'];
- $mail->newsletter($data['title'], $data['content'], $data['email'])->send();
- }
- if (count($ids)) {
- $newslettersRecipientsService->delete($ids);
- $adapter = $newslettersService->getTable()->getAdapter();
- $newslettersService->getTable()->update(array(
- 'updated_at' => new Expr('now()')
- ),
- $adapter->quoteInto('id IN (?)', array_unique($newslettersIds)));
- }
- }
- /**
- *
- * remove marked deleted listings from the database
- *
- * @return $this
- */
- public function removeMarkedDeletedListings()
- {
- $listingsService = $this->getListings();
- $select = $listingsService->getTable()->select()
- ->where('deleted = ?', 1)
- ->limit(self::SELECT_TRANSACTION_LIMIT);
- $listingsService->fetchAll($select)->setAdmin(true)->delete();
- return $this;
- }
- /**
- *
- * mark as deleted closed listings
- *
- * @return $this
- */
- public function markDeletedClosedListings()
- {
- $listingsService = $this->getListings();
- $settings = $this->getSettings();
- $adapter = $listingsService->getTable()->getAdapter();
- $where = array(
- 'end_time is not null',
- $adapter->quoteInto('deleted = ?', 0),
- $adapter->quoteInto('closed = ?', 1),
- $adapter->quoteInto('end_time < ?',
- new Expr('(now() - interval ' . intval($settings['closed_listings_deletion_days']) . ' day)'))
- );
- $listingsService->getTable()->update(array(
- 'deleted' => 1,
- ), $where);
- return $this;
- }
- /**
- *
- * notify users on subscriptions that are about to expire
- * only notify users for which the "re-bill if in account mode" setting doesnt apply
- *
- * @param array $subscription
- *
- * @return $this
- */
- public function notifyUsersOnSubscriptionsAboutToExpire(array $subscription)
- {
- $usersService = $this->getUsers();
- $settings = $this->getSettings();
- $select = $usersService->getTable()->select()
- ->where("{$subscription['active']} = ?", 1)
- ->where("{$subscription['expirationDate']} < ?",
- new Expr('(now() + interval ' . self::DEFAULT_EXPIRATION_DAYS . ' day)'))
- ->where("{$subscription['expirationDate']} > ?", 0)
- ->where("{$subscription['emailFlag']} = ?", 0)
- ->limit(self::SELECT_TRANSACTION_LIMIT);
- $runQuery = true;
- if ($settings['rebill_expired_subscriptions']) {
- if ($settings['user_account_type'] == 'personal') {
- $select->where('account_mode = ?', 'live');
- }
- else if ($settings['user_account_type'] == 'global' && $settings['payment_mode'] == 'account') {
- $runQuery = false;
- }
- }
- if ($runQuery) {
- $users = $usersService->fetchAll($select);
- /** @var \Ppb\Db\Table\Row\User $user */
- $mail = new \Members\Model\Mail\User();
- foreach ($users as $user) {
- $mail->subscriptionExpirationNotification($subscription, $user, self::DEFAULT_EXPIRATION_DAYS)->send();
- $user->save(array(
- "{$subscription['emailFlag']}" => 1,
- ));
- }
- }
- return $this;
- }
- /**
- *
- * process expired user subscriptions
- * notify users of the expired subscription
- * re-bill if in account mode, and activate automatically
- *
- * @param array $subscription subscription type
- *
- * @return $this
- */
- public function processExpiredSubscriptions(array $subscription)
- {
- $usersService = $this->getUsers();
- $accountingService = new Accounting();
- $settings = $this->getSettings();
- $select = $usersService->getTable()->select()
- ->where("{$subscription['active']} = ?", 1)
- ->where("{$subscription['expirationDate']} < ?", new Expr('now()'))
- ->where("{$subscription['expirationDate']} > ?", 0)
- ->limit(self::SELECT_TRANSACTION_LIMIT);
- $users = $usersService->fetchAll($select);
- $mail = new \Members\Model\Mail\User();
- /** @var \Ppb\Db\Table\Row\User $user */
- foreach ($users as $user) {
- $user->save(array(
- "{$subscription['active']}" => 0
- ));
- if ($settings['rebill_expired_subscriptions'] && $user->userPaymentMode() == 'account') {
- // bill subscription in account mode
- /** @var \Ppb\Service\Fees $feesService */
- $feesService = new $subscription['feesService']($user);
- $totalAmount = $feesService->getTotalAmount();
- $user->save(array(
- 'balance' => ($user['balance'] + $totalAmount)
- ));
- $accountingService->save(array(
- 'name' => array(
- 'string' => 'Automatic Renewal - %s',
- 'args' => array($subscription['name']),
- ),
- 'amount' => $totalAmount,
- 'user_id' => $user['id'],
- 'currency' => $settings['currency'],
- ));
- // activate subscription
- $user->$subscription['updateMethod'](1);
- $mail->subscriptionRenewed($subscription, $user)->send();
- }
- else {
- $mail->subscriptionExpired($subscription, $user)->send();
- }
- }
- return $this;
- }
- /**
- *
- * delete sales for which the payment due time limit has expired
- * (ref: force payment module)
- *
- * return $this
- */
- public function deleteExpiredSalesForcePayment()
- {
- $salesService = $this->getSales();
- $select = $salesService->getTable()->select()
- ->where('expires_at is not null')
- ->where('expires_at < ?', new Expr('now()'))
- ->limit(self::SELECT_TRANSACTION_LIMIT);
- $sales = $salesService->fetchAll($select);
- /** @var \Ppb\Db\Table\Row\Sale $sale */
- foreach ($sales as $sale) {
- $sale->revert();
- }
- return $this;
- }
- /**
- *
- * count listings that were not counted since their creation / last update
- *
- * return $this
- */
- public function countListings()
- {
- $listingsService = $this->getListings();
- $select = $listingsService->getTable()->select()
- ->where('counted_at is null OR counted_at < IF(updated_at is null, created_at, updated_at)')
- ->limit(100);
- $listings = $listingsService->fetchAll($select);
- /** @var \Ppb\Db\Table\Row\Listing $listing */
- foreach ($listings as $listing) {
- $listing->processCategoryCounter();
- }
- return $this;
- }
- /**
- *
- * remove search phrases that haven't been searched for within the last 6 months
- *
- * @return $this
- */
- public function purgeAutocompleteTags()
- {
- $autocompleteTagsService = new AutocompleteTags();
- $adapter = $autocompleteTagsService->getTable()->getAdapter();
- $where = array(
- $adapter->quoteInto('created_at < ?', new Expr('now() - interval 6 month')),
- $adapter->quoteInto('updated_at < ?', new Expr('now() - interval 6 month')),
- );
- $autocompleteTagsService->getTable()->delete($where);
- return $this;
- }
- /**
- *
- * remove expired rows from the users statistics table
- *
- * @return $this
- */
- public function purgeUsersStatistics()
- {
- $usersStatisticsService = new UsersStatistics();
- $adapter = $usersStatisticsService->getTable()->getAdapter();
- $where = array(
- $adapter->quoteInto('updated_at < ?', new Expr('now() - interval ' . self::ONLINE_USERS_STATS_PURGE . ' minute')),
- );
- $usersStatisticsService->getTable()->delete($where);
- return $this;
- }
- /**
- *
- * remove expired rows from the recently viewed listings table
- *
- * @return $this
- */
- public function purgeRecentlyViewedListings()
- {
- $settings = $this->getSettings();
- $recentlyViewedListingsService = new RecentlyViewedListings();
- $adapter = $recentlyViewedListingsService->getTable()->getAdapter();
- $where = array(
- $adapter->quoteInto('IF(updated_at is null, created_at, updated_at) < ?',
- new Expr('now() - interval ' . intval($settings['enable_recently_viewed_listings_expiration']) . ' hour')),
- );
- $recentlyViewedListingsService->getTable()->delete($where);
- return $this;
- }
- /**
- *
- * method that deletes all unused uploaded files that are older than UNUSED_FILES_REMOVAL_TIME_LIMIT
- * this is to be called by a separate cron call to avoid server load
- * currently it processes 200 images per call
- *
- * @return $this
- */
- public function purgeUnusedUploadedFiles()
- {
- $counter = null;
- $uploadsFolder = \Ppb\Utility::getPath('uploads');
- // we have sorted all files by modified date
- $files = glob($uploadsFolder . '/*.*');
- usort($files, function ($a, $b) {
- return filemtime($a) > filemtime($b);
- });
- $files = array_filter($files);
- $files = array_slice($files, 0, 200);
- $prefix = $this->getListings()->getTable()->getPrefix();
- $adapter = $this->getListings()->getTable()->getAdapter();
- foreach ($files as $filePath) {
- $file = str_replace($uploadsFolder . DIRECTORY_SEPARATOR, '', $filePath);
- $stat = stat($filePath);
- if (($stat['mtime'] + self::UNUSED_FILES_REMOVAL_TIME_LIMIT) < time()) {
- if ($this->_isUsedFile($file, $adapter, $prefix) !== true) {
- @unlink($filePath);
- }
- else {
- @touch($filePath);
- }
- }
- }
- clearstatcache();
- return $this;
- }
- /**
- *
- * gets live currency exchange rates and updates the currencies table
- * always gets based on the site's default currency
- *
- * @return $this
- */
- public function updateCurrencyExchangeRates()
- {
- $settings = $this->getSettings();
- $feed = 'http://www.floatrates.com/daily/' . strtolower($settings['currency']) . '.xml';
- $xml = simplexml_load_file($feed);
- $object = new Config\Xml($xml);
- $currencies = $object->getData('item');
- $data = array();
- foreach ($currencies as $currency) {
- $isoCode = $currency['targetCurrency'];
- $conversionRate = number_format($currency['exchangeRate'], 6, '.', '');
- if ($isoCode && $conversionRate > 0) {
- $data[] = array(
- 'data' => array(
- 'conversion_rate' => $conversionRate,
- ),
- 'where' => array(
- "iso_code = '" . $isoCode . "'",
- )
- );
- }
- }
- $currenciesService = new Table\Currencies();
- foreach ($data as $row) {
- $currenciesService->update($row['data'], $row['where']);
- }
- // reset default currency exchange rate to 1
- $currenciesService->update(array("conversion_rate" => 1), "iso_code = '" . $settings['currency'] . "'");
- return $this;
- }
- /**
- *
- * check if a file from the /uploads/ folder is used by the software
- * the following tables will be checked:
- *
- * listings_media [value]
- * categories [logo_path]
- * advertising [content]
- * settings [value : site_logo_path]
- * users [store_settings : PREG : s:15:"store_logo_path";s:(d+):"FILENAME"]
- *
- * @param string $file
- * @param \Cube\Db\Adapter\AbstractAdapter $adapter
- * @param string $prefix
- *
- * @return bool
- */
- protected function _isUsedFile($file, AbstractAdapter $adapter, $prefix)
- {
- $statement = $adapter->query("SELECT `value` as `file_path` FROM `" . $prefix . "listings_media` WHERE `value` = '" . $file . "'
- UNION
- SELECT `logo_path` as `file_path` FROM `" . $prefix . "categories` WHERE `logo_path` = '" . $file . "'
- UNION
- SELECT `content` as `file_path` FROM `" . $prefix . "advertising` WHERE `content` = '" . $file . "' AND `type` = 'image'
- UNION
- SELECT `value` as `file_path` FROM `" . $prefix . "settings` WHERE `value` = '" . $file . "' AND `name` = 'site_logo_path'
- UNION
- SELECT `store_settings` as `file_path` FROM `" . $prefix . "users` WHERE `store_settings` LIKE '%" . $file . "%'");
- return ($statement->rowCount() > 0) ? true : false;
- }
- /**
- *
- * the method that will run all/specified cron jobs
- *
- * @param string|null $command
- *
- * @return $this
- */
- public function run($command = null)
- {
- $settings = $this->getSettings();
- $usersService = $this->getUsers();
- switch ($command) {
- case 'purge-unused-uploaded-files':
- $this->purgeUnusedUploadedFiles();
- break;
- case 'purge-cache-data':
- $this->purgeCacheData();
- break;
- case 'update-currency-exchange-rates':
- $this->updateCurrencyExchangeRates();
- break;
- default:
- $this->closeExpiredListings();
- $this->startScheduledListings();
- $this->suspendUsersDebitExceededDate();
- if ($settings['pending_sales_listings_expire_hours']) {
- $this->deletePendingSalesListings();
- }
- if ($settings['marked_deleted_listings_removal']) {
- $this->removeMarkedDeletedListings();
- }
- if ($settings['closed_listings_deletion_days'] > 0) {
- $this->markDeletedClosedListings();
- }
- $subscriptionTypes = $usersService->getSubscriptionTypes();
- foreach ($subscriptionTypes as $subscription) {
- $this->notifyUsersOnSubscriptionsAboutToExpire($subscription);
- $this->processExpiredSubscriptions($subscription);
- }
- $this->sendNewsletters();
- $this->deleteExpiredSalesForcePayment();
- $this->countListings();
- $this->purgeAutocompleteTags();
- $this->purgeUsersStatistics();
- $this->purgeRecentlyViewedListings();
- $this->purgeCacheQueries();
- break;
- }
- return $this;
- }
- }
|