From 2d2abcc9576079a8496ad8bd4a038ba07cf1fb2b Mon Sep 17 00:00:00 2001 From: diosmosis Date: Thu, 20 Sep 2018 15:53:37 -0700 Subject: Send email if no tracked data within N days. (#13363) * Remember user who created a site. * Send email if no tracked data within N days. * Add test and get to pass. * Fixes after manual tests of emails * Bump version & change column name to creator_login. * Email tweaks. * Rename Site::getCreationUserFor * Modify Site:: access methiod name * Applying PR feedback. * Move email HTML content generation logic to separate class in DI. * tweak translations * Apply PR review feedback. * Couple more tweaks. * Make tracking code check a one time task + and save timetable when removing inactive tasks. * Update save call. * Apply more PR feedback. * small performance tweak and put the site name in quotes * Fixing tests. * Update expected file. --- plugins/CoreAdminHome/Tasks.php | 79 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) (limited to 'plugins/CoreAdminHome/Tasks.php') diff --git a/plugins/CoreAdminHome/Tasks.php b/plugins/CoreAdminHome/Tasks.php index b4542d23a7..719aa6b40d 100644 --- a/plugins/CoreAdminHome/Tasks.php +++ b/plugins/CoreAdminHome/Tasks.php @@ -8,20 +8,30 @@ */ namespace Piwik\Plugins\CoreAdminHome; +use Piwik\API\Request; use Piwik\ArchiveProcessor\Rules; use Piwik\Archive\ArchivePurger; +use Piwik\Config; use Piwik\DataAccess\ArchiveTableCreator; use Piwik\Date; use Piwik\Db; use Piwik\Http; use Piwik\Option; +use Piwik\Plugins\CoreAdminHome\Emails\JsTrackingCodeMissingEmail; use Piwik\Plugins\CoreAdminHome\Tasks\ArchivesToPurgeDistributedList; +use Piwik\Plugins\SitesManager\SitesManager; +use Piwik\Scheduler\Schedule\Daily; +use Piwik\Scheduler\Schedule\Monthly; +use Piwik\Scheduler\Schedule\SpecificTime; +use Piwik\Settings\Storage\Backend\MeasurableSettingsTable; +use Piwik\Tests\Framework\Mock\Site; use Piwik\Tracker\Visit\ReferrerSpamFilter; use Psr\Log\LoggerInterface; use Piwik\SettingsPiwik; class Tasks extends \Piwik\Plugin\Tasks { + const TRACKING_CODE_CHECK_FLAG = 'trackingCodeExistsCheck'; /** * @var ArchivePurger */ @@ -52,6 +62,75 @@ class Tasks extends \Piwik\Plugin\Tasks if(SettingsPiwik::isInternetEnabled() === true){ $this->weekly('updateSpammerBlacklist'); } + + $this->scheduleTrackingCodeReminderChecks(); + } + + private function scheduleTrackingCodeReminderChecks() + { + $daysToTrackedVisitsCheck = (int) Config::getInstance()->General['num_days_before_tracking_code_reminder']; + if ($daysToTrackedVisitsCheck <= 0) { + return; + } + + // add check for a site's tracked visits + $sites = Request::processRequest('SitesManager.getAllSites'); + + foreach ($sites as $site) { + $createdTime = Date::factory($site['ts_created']); + $scheduledTime = $createdTime->addDay($daysToTrackedVisitsCheck)->setTime('02:00:00'); + + // we don't want to run this check for every site in an install when this code is introduced, + // so if the site is over 2 * $daysToTrackedVisitsCheck days old, assume the check has run. + $isSiteOld = $createdTime->isEarlier(Date::today()->subDay($daysToTrackedVisitsCheck * 2)); + + if ($isSiteOld || $this->hasTrackingCodeReminderRun($site['idsite'])) { + continue; + } + + $schedule = new SpecificTime($scheduledTime->getTimestamp()); + $this->custom($this, 'checkSiteHasTrackedVisits', $site['idsite'], $schedule); + } + } + + public function checkSiteHasTrackedVisits($idSite) + { + $this->rememberTrackingCodeReminderRan($idSite); + + if (!SitesManager::hasTrackedAnyTraffic($idSite)) { + return; + } + + // site is still empty after N days, so send an email to the user that created the site + $creatingUser = Site::getCreatorLoginFor($idSite); + if (empty($creatingUser)) { + return; + } + + $user = Request::processRequest('UsersManager.getUser', [ + 'userLogin' => $creatingUser, + ]); + if (empty($user['email'])) { + return; + } + + $email = new JsTrackingCodeMissingEmail($user['login'], $user['email'], $idSite); + $email->send(); + } + + private function hasTrackingCodeReminderRun($idSite) + { + $table = new MeasurableSettingsTable($idSite, 'CoreAdminHome'); + $settings = $table->load(); + return !empty($settings[self::TRACKING_CODE_CHECK_FLAG]); + } + + private function rememberTrackingCodeReminderRan($idSite) + { + $table = new MeasurableSettingsTable($idSite, 'CoreAdminHome'); + $settings = $table->load(); + $settings[self::TRACKING_CODE_CHECK_FLAG] = 1; + $table->save($settings); } /** -- cgit v1.2.3