PageRenderTime 62ms CodeModel.GetById 33ms RepoModel.GetById 0ms app.codeStats 0ms

/plugins/ScheduledReports/ScheduledReports.php

https://github.com/CodeYellowBV/piwik
PHP | 605 lines | 472 code | 89 blank | 44 comment | 72 complexity | 0e8dac9cffb12c8ac9ee375e93e69c10 MD5 | raw file
Possible License(s): LGPL-3.0, JSON, MIT, GPL-3.0, LGPL-2.1, GPL-2.0, AGPL-1.0, BSD-2-Clause, BSD-3-Clause
  1. <?php
  2. /**
  3. * Piwik - free/libre analytics platform
  4. *
  5. * @link http://piwik.org
  6. * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
  7. *
  8. */
  9. namespace Piwik\Plugins\ScheduledReports;
  10. use Exception;
  11. use Piwik\Common;
  12. use Piwik\Db;
  13. use Piwik\DbHelper;
  14. use Piwik\Mail;
  15. use Piwik\Piwik;
  16. use Piwik\Plugins\MobileMessaging\MobileMessaging;
  17. use Piwik\Plugins\UsersManager\API as APIUsersManager;
  18. use Piwik\ReportRenderer;
  19. use Piwik\ScheduledTime;
  20. use Piwik\View;
  21. use Zend_Mime;
  22. /**
  23. *
  24. */
  25. class ScheduledReports extends \Piwik\Plugin
  26. {
  27. const DISPLAY_FORMAT_GRAPHS_ONLY_FOR_KEY_METRICS = 1; // Display Tables Only (Graphs only for key metrics)
  28. const DISPLAY_FORMAT_GRAPHS_ONLY = 2; // Display Graphs Only for all reports
  29. const DISPLAY_FORMAT_TABLES_AND_GRAPHS = 3; // Display Tables and Graphs for all reports
  30. const DISPLAY_FORMAT_TABLES_ONLY = 4; // Display only tables for all reports
  31. const DEFAULT_DISPLAY_FORMAT = self::DISPLAY_FORMAT_GRAPHS_ONLY_FOR_KEY_METRICS;
  32. const DEFAULT_REPORT_FORMAT = ReportRenderer::HTML_FORMAT;
  33. const DEFAULT_PERIOD = 'week';
  34. const DEFAULT_HOUR = '0';
  35. const EMAIL_ME_PARAMETER = 'emailMe';
  36. const EVOLUTION_GRAPH_PARAMETER = 'evolutionGraph';
  37. const ADDITIONAL_EMAILS_PARAMETER = 'additionalEmails';
  38. const DISPLAY_FORMAT_PARAMETER = 'displayFormat';
  39. const EMAIL_ME_PARAMETER_DEFAULT_VALUE = true;
  40. const EVOLUTION_GRAPH_PARAMETER_DEFAULT_VALUE = false;
  41. const EMAIL_TYPE = 'email';
  42. static private $availableParameters = array(
  43. self::EMAIL_ME_PARAMETER => false,
  44. self::EVOLUTION_GRAPH_PARAMETER => false,
  45. self::ADDITIONAL_EMAILS_PARAMETER => false,
  46. self::DISPLAY_FORMAT_PARAMETER => true,
  47. );
  48. static private $managedReportTypes = array(
  49. self::EMAIL_TYPE => 'plugins/Morpheus/images/email.png'
  50. );
  51. static private $managedReportFormats = array(
  52. ReportRenderer::HTML_FORMAT => 'plugins/Morpheus/images/html_icon.png',
  53. ReportRenderer::PDF_FORMAT => 'plugins/UserSettings/images/plugins/pdf.gif',
  54. ReportRenderer::CSV_FORMAT => 'plugins/Morpheus/images/export.png',
  55. );
  56. /**
  57. * @see Piwik\Plugin::getListHooksRegistered
  58. */
  59. public function getListHooksRegistered()
  60. {
  61. return array(
  62. 'AssetManager.getJavaScriptFiles' => 'getJsFiles',
  63. 'MobileMessaging.deletePhoneNumber' => 'deletePhoneNumber',
  64. 'ScheduledReports.getReportParameters' => 'getReportParameters',
  65. 'ScheduledReports.validateReportParameters' => 'validateReportParameters',
  66. 'ScheduledReports.getReportMetadata' => 'getReportMetadata',
  67. 'ScheduledReports.getReportTypes' => 'getReportTypes',
  68. 'ScheduledReports.getReportFormats' => 'getReportFormats',
  69. 'ScheduledReports.getRendererInstance' => 'getRendererInstance',
  70. 'ScheduledReports.getReportRecipients' => 'getReportRecipients',
  71. 'ScheduledReports.processReports' => 'processReports',
  72. 'ScheduledReports.allowMultipleReports' => 'allowMultipleReports',
  73. 'ScheduledReports.sendReport' => 'sendReport',
  74. 'Template.reportParametersScheduledReports' => 'template_reportParametersScheduledReports',
  75. 'UsersManager.deleteUser' => 'deleteUserReport',
  76. 'SitesManager.deleteSite.end' => 'deleteSiteReport',
  77. 'SegmentEditor.deactivate' => 'segmentDeactivation',
  78. 'SegmentEditor.update' => 'segmentUpdated',
  79. 'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys',
  80. );
  81. }
  82. public function getClientSideTranslationKeys(&$translationKeys)
  83. {
  84. $translationKeys[] = "ScheduledReports_ReportSent";
  85. $translationKeys[] = "ScheduledReports_ReportUpdated";
  86. }
  87. /**
  88. * Delete reports for the website
  89. */
  90. public function deleteSiteReport($idSite)
  91. {
  92. $idReports = API::getInstance()->getReports($idSite);
  93. foreach ($idReports as $report) {
  94. $idReport = $report['idreport'];
  95. API::getInstance()->deleteReport($idReport);
  96. }
  97. }
  98. public function getJsFiles(&$jsFiles)
  99. {
  100. $jsFiles[] = "plugins/ScheduledReports/javascripts/pdf.js";
  101. }
  102. public function validateReportParameters(&$parameters, $reportType)
  103. {
  104. if (self::manageEvent($reportType)) {
  105. $reportFormat = $parameters[self::DISPLAY_FORMAT_PARAMETER];
  106. $availableDisplayFormats = array_keys(self::getDisplayFormats());
  107. if (!in_array($reportFormat, $availableDisplayFormats)) {
  108. throw new Exception(
  109. Piwik::translate(
  110. // General_ExceptionInvalidAggregateReportsFormat should be named General_ExceptionInvalidDisplayFormat
  111. 'General_ExceptionInvalidAggregateReportsFormat',
  112. array($reportFormat, implode(', ', $availableDisplayFormats))
  113. )
  114. );
  115. }
  116. // emailMe is an optional parameter
  117. if (!isset($parameters[self::EMAIL_ME_PARAMETER])) {
  118. $parameters[self::EMAIL_ME_PARAMETER] = self::EMAIL_ME_PARAMETER_DEFAULT_VALUE;
  119. } else {
  120. $parameters[self::EMAIL_ME_PARAMETER] = self::valueIsTrue($parameters[self::EMAIL_ME_PARAMETER]);
  121. }
  122. // evolutionGraph is an optional parameter
  123. if (!isset($parameters[self::EVOLUTION_GRAPH_PARAMETER])) {
  124. $parameters[self::EVOLUTION_GRAPH_PARAMETER] = self::EVOLUTION_GRAPH_PARAMETER_DEFAULT_VALUE;
  125. } else {
  126. $parameters[self::EVOLUTION_GRAPH_PARAMETER] = self::valueIsTrue($parameters[self::EVOLUTION_GRAPH_PARAMETER]);
  127. }
  128. // additionalEmails is an optional parameter
  129. if (isset($parameters[self::ADDITIONAL_EMAILS_PARAMETER])) {
  130. $parameters[self::ADDITIONAL_EMAILS_PARAMETER] = self::checkAdditionalEmails($parameters[self::ADDITIONAL_EMAILS_PARAMETER]);
  131. }
  132. }
  133. }
  134. // based on http://www.php.net/manual/en/filter.filters.validate.php -> FILTER_VALIDATE_BOOLEAN
  135. static private function valueIsTrue($value)
  136. {
  137. return $value == 'true' || $value == 1 || $value == '1' || $value === true;
  138. }
  139. public function getReportMetadata(&$reportMetadata, $reportType, $idSite)
  140. {
  141. if (self::manageEvent($reportType)) {
  142. $availableReportMetadata = \Piwik\Plugins\API\API::getInstance()->getReportMetadata($idSite);
  143. $filteredReportMetadata = array();
  144. foreach ($availableReportMetadata as $reportMetadata) {
  145. // removing reports from the API category and MultiSites.getOne
  146. if (
  147. $reportMetadata['category'] == 'API' ||
  148. $reportMetadata['category'] == Piwik::translate('General_MultiSitesSummary') && $reportMetadata['name'] == Piwik::translate('General_SingleWebsitesDashboard')
  149. ) continue;
  150. $filteredReportMetadata[] = $reportMetadata;
  151. }
  152. $reportMetadata = $filteredReportMetadata;
  153. }
  154. }
  155. public function getReportTypes(&$reportTypes)
  156. {
  157. $reportTypes = array_merge($reportTypes, self::$managedReportTypes);
  158. }
  159. public function getReportFormats(&$reportFormats, $reportType)
  160. {
  161. if (self::manageEvent($reportType)) {
  162. $reportFormats = self::$managedReportFormats;
  163. }
  164. }
  165. public function getReportParameters(&$availableParameters, $reportType)
  166. {
  167. if (self::manageEvent($reportType)) {
  168. $availableParameters = self::$availableParameters;
  169. }
  170. }
  171. public function processReports(&$processedReports, $reportType, $outputType, $report)
  172. {
  173. if (self::manageEvent($reportType)) {
  174. $displayFormat = $report['parameters'][self::DISPLAY_FORMAT_PARAMETER];
  175. $evolutionGraph = $report['parameters'][self::EVOLUTION_GRAPH_PARAMETER];
  176. foreach ($processedReports as &$processedReport) {
  177. $metadata = $processedReport['metadata'];
  178. $isAggregateReport = !empty($metadata['dimension']);
  179. $processedReport['displayTable'] = $displayFormat != self::DISPLAY_FORMAT_GRAPHS_ONLY;
  180. $processedReport['displayGraph'] =
  181. ($isAggregateReport ?
  182. $displayFormat == self::DISPLAY_FORMAT_GRAPHS_ONLY || $displayFormat == self::DISPLAY_FORMAT_TABLES_AND_GRAPHS
  183. :
  184. $displayFormat != self::DISPLAY_FORMAT_TABLES_ONLY)
  185. && \Piwik\SettingsServer::isGdExtensionEnabled()
  186. && \Piwik\Plugin\Manager::getInstance()->isPluginActivated('ImageGraph')
  187. && !empty($metadata['imageGraphUrl']);
  188. $processedReport['evolutionGraph'] = $evolutionGraph;
  189. // remove evolution metrics from MultiSites.getAll
  190. if ($metadata['module'] == 'MultiSites') {
  191. $columns = $processedReport['columns'];
  192. foreach (\Piwik\Plugins\MultiSites\API::getApiMetrics($enhanced = true) as $metricSettings) {
  193. unset($columns[$metricSettings[\Piwik\Plugins\MultiSites\API::METRIC_EVOLUTION_COL_NAME_KEY]]);
  194. }
  195. $processedReport['metadata'] = $metadata;
  196. $processedReport['columns'] = $columns;
  197. }
  198. }
  199. }
  200. }
  201. public function getRendererInstance(&$reportRenderer, $reportType, $outputType, $report)
  202. {
  203. if (self::manageEvent($reportType)) {
  204. $reportFormat = $report['format'];
  205. $reportRenderer = ReportRenderer::factory($reportFormat);
  206. if ($reportFormat == ReportRenderer::HTML_FORMAT) {
  207. $reportRenderer->setRenderImageInline($outputType != API::OUTPUT_SAVE_ON_DISK);
  208. }
  209. }
  210. }
  211. public function allowMultipleReports(&$allowMultipleReports, $reportType)
  212. {
  213. if (self::manageEvent($reportType)) {
  214. $allowMultipleReports = true;
  215. }
  216. }
  217. public function sendReport($reportType, $report, $contents, $filename, $prettyDate, $reportSubject, $reportTitle,
  218. $additionalFiles)
  219. {
  220. if (self::manageEvent($reportType)) {
  221. $periods = self::getPeriodToFrequencyAsAdjective();
  222. $message = Piwik::translate('ScheduledReports_EmailHello');
  223. $subject = Piwik::translate('General_Report') . ' ' . $reportTitle . " - " . $prettyDate;
  224. $mail = new Mail();
  225. $mail->setDefaultFromPiwik();
  226. $mail->setSubject($subject);
  227. $attachmentName = $subject;
  228. $displaySegmentInfo = false;
  229. $segmentInfo = null;
  230. $segment = API::getSegment($report['idsegment']);
  231. if ($segment != null) {
  232. $displaySegmentInfo = true;
  233. $segmentInfo = Piwik::translate('ScheduledReports_SegmentAppliedToReports', $segment['name']);
  234. }
  235. switch ($report['format']) {
  236. case 'html':
  237. // Needed when using images as attachment with cid
  238. $mail->setType(Zend_Mime::MULTIPART_RELATED);
  239. $message .= "<br/>" . Piwik::translate('ScheduledReports_PleaseFindBelow', array($periods[$report['period']], $reportTitle));
  240. if ($displaySegmentInfo) {
  241. $message .= " " . $segmentInfo;
  242. }
  243. $mail->setBodyHtml($message . "<br/><br/>" . $contents);
  244. break;
  245. case 'csv':
  246. $message .= "\n" . Piwik::translate('ScheduledReports_PleaseFindAttachedFile', array($periods[$report['period']], $reportTitle));
  247. if ($displaySegmentInfo) {
  248. $message .= " " . $segmentInfo;
  249. }
  250. $mail->setBodyText($message);
  251. $mail->createAttachment(
  252. $contents,
  253. 'application/csv',
  254. Zend_Mime::DISPOSITION_INLINE,
  255. Zend_Mime::ENCODING_BASE64,
  256. $attachmentName . '.csv'
  257. );
  258. break;
  259. default:
  260. case 'pdf':
  261. $message .= "\n" . Piwik::translate('ScheduledReports_PleaseFindAttachedFile', array($periods[$report['period']], $reportTitle));
  262. if ($displaySegmentInfo) {
  263. $message .= " " . $segmentInfo;
  264. }
  265. $mail->setBodyText($message);
  266. $mail->createAttachment(
  267. $contents,
  268. 'application/pdf',
  269. Zend_Mime::DISPOSITION_INLINE,
  270. Zend_Mime::ENCODING_BASE64,
  271. $attachmentName . '.pdf'
  272. );
  273. break;
  274. }
  275. foreach ($additionalFiles as $additionalFile) {
  276. $fileContent = $additionalFile['content'];
  277. $at = $mail->createAttachment(
  278. $fileContent,
  279. $additionalFile['mimeType'],
  280. Zend_Mime::DISPOSITION_INLINE,
  281. $additionalFile['encoding'],
  282. $additionalFile['filename']
  283. );
  284. $at->id = $additionalFile['cid'];
  285. unset($fileContent);
  286. }
  287. // Get user emails and languages
  288. $reportParameters = $report['parameters'];
  289. $emails = array();
  290. if (isset($reportParameters[self::ADDITIONAL_EMAILS_PARAMETER])) {
  291. $emails = $reportParameters[self::ADDITIONAL_EMAILS_PARAMETER];
  292. }
  293. if ($reportParameters[self::EMAIL_ME_PARAMETER] == 1) {
  294. if (Piwik::getCurrentUserLogin() == $report['login']) {
  295. $emails[] = Piwik::getCurrentUserEmail();
  296. } else {
  297. try {
  298. $user = APIUsersManager::getInstance()->getUser($report['login']);
  299. } catch (Exception $e) {
  300. return;
  301. }
  302. $emails[] = $user['email'];
  303. }
  304. }
  305. foreach ($emails as $email) {
  306. if (empty($email)) {
  307. continue;
  308. }
  309. $mail->addTo($email);
  310. try {
  311. $mail->send();
  312. } catch (Exception $e) {
  313. // If running from piwik.php with debug, we ignore the 'email not sent' error
  314. if (!isset($GLOBALS['PIWIK_TRACKER_DEBUG']) || !$GLOBALS['PIWIK_TRACKER_DEBUG']) {
  315. throw new Exception("An error occured while sending '$filename' " .
  316. " to " . implode(', ', $mail->getRecipients()) .
  317. ". Error was '" . $e->getMessage() . "'");
  318. }
  319. }
  320. $mail->clearRecipients();
  321. }
  322. }
  323. }
  324. public function deletePhoneNumber($phoneNumber)
  325. {
  326. $api = API::getInstance();
  327. $reports = $api->getReports(
  328. $idSite = false,
  329. $period = false,
  330. $idReport = false,
  331. $ifSuperUserReturnOnlySuperUserReports = false
  332. );
  333. foreach ($reports as $report) {
  334. if ($report['type'] == MobileMessaging::MOBILE_TYPE) {
  335. $reportParameters = $report['parameters'];
  336. $reportPhoneNumbers = $reportParameters[MobileMessaging::PHONE_NUMBERS_PARAMETER];
  337. $updatedPhoneNumbers = array();
  338. foreach ($reportPhoneNumbers as $reportPhoneNumber) {
  339. if ($reportPhoneNumber != $phoneNumber) {
  340. $updatedPhoneNumbers[] = $reportPhoneNumber;
  341. }
  342. }
  343. if (count($updatedPhoneNumbers) != count($reportPhoneNumbers)) {
  344. $reportParameters[MobileMessaging::PHONE_NUMBERS_PARAMETER] = $updatedPhoneNumbers;
  345. // note: reports can end up without any recipients
  346. $api->updateReport(
  347. $report['idreport'],
  348. $report['idsite'],
  349. $report['description'],
  350. $report['period'],
  351. $report['hour'],
  352. $report['type'],
  353. $report['format'],
  354. $report['reports'],
  355. $reportParameters
  356. );
  357. }
  358. }
  359. }
  360. }
  361. public function getReportRecipients(&$recipients, $reportType, $report)
  362. {
  363. if (self::manageEvent($reportType)) {
  364. $parameters = $report['parameters'];
  365. $eMailMe = $parameters[self::EMAIL_ME_PARAMETER];
  366. if ($eMailMe) {
  367. $recipients[] = Piwik::getCurrentUserEmail();
  368. }
  369. if (isset($parameters[self::ADDITIONAL_EMAILS_PARAMETER])) {
  370. $additionalEMails = $parameters[self::ADDITIONAL_EMAILS_PARAMETER];
  371. $recipients = array_merge($recipients, $additionalEMails);
  372. }
  373. $recipients = array_filter($recipients);
  374. }
  375. }
  376. static public function template_reportParametersScheduledReports(&$out)
  377. {
  378. $view = new View('@ScheduledReports/reportParametersScheduledReports');
  379. $view->currentUserEmail = Piwik::getCurrentUserEmail();
  380. $view->reportType = self::EMAIL_TYPE;
  381. $view->defaultDisplayFormat = self::DEFAULT_DISPLAY_FORMAT;
  382. $view->defaultEmailMe = self::EMAIL_ME_PARAMETER_DEFAULT_VALUE ? 'true' : 'false';
  383. $view->defaultEvolutionGraph = self::EVOLUTION_GRAPH_PARAMETER_DEFAULT_VALUE ? 'true' : 'false';
  384. $out .= $view->render();
  385. }
  386. private static function manageEvent($reportType)
  387. {
  388. return in_array($reportType, array_keys(self::$managedReportTypes));
  389. }
  390. public function segmentUpdated($idSegment, $updatedSegment)
  391. {
  392. $reportsUsingSegment = API::getInstance()->getReports(false, false, false, false, $idSegment);
  393. $reportsNeedSegment = array();
  394. if(!$updatedSegment['enable_all_users']) {
  395. // which reports would become invisible to other users?
  396. foreach($reportsUsingSegment as $report) {
  397. if($report['login'] == Piwik::getCurrentUserLogin()) {
  398. continue;
  399. }
  400. $reportsNeedSegment[] = $report;
  401. }
  402. }
  403. if($updatedSegment['enable_only_idsite']) {
  404. // which reports from other websites are set to use this segment restricted to one website?
  405. foreach($reportsUsingSegment as $report) {
  406. if($report['idsite'] == $updatedSegment['enable_only_idsite']) {
  407. continue;
  408. }
  409. $reportsNeedSegment[] = $report;
  410. }
  411. }
  412. if(empty($reportsNeedSegment)) {
  413. return;
  414. }
  415. $this->throwExceptionReportsAreUsingSegment($reportsNeedSegment);
  416. }
  417. public function segmentDeactivation($idSegment)
  418. {
  419. $reportsUsingSegment = API::getInstance()->getReports(false, false, false, false, $idSegment);
  420. if (empty($reportsUsingSegment)) {
  421. return;
  422. }
  423. $this->throwExceptionReportsAreUsingSegment($reportsUsingSegment);
  424. }
  425. /**
  426. * @param $reportsUsingSegment
  427. * @throws \Exception
  428. */
  429. protected function throwExceptionReportsAreUsingSegment($reportsUsingSegment)
  430. {
  431. $reportList = '';
  432. $reportNameJoinText = ' ' . Piwik::translate('General_And') . ' ';
  433. foreach ($reportsUsingSegment as $report) {
  434. $reportList .= '\'' . $report['description'] . '\'' . $reportNameJoinText;
  435. }
  436. $reportList = rtrim($reportList, $reportNameJoinText);
  437. $errorMessage = Piwik::translate('ScheduledReports_Segment_Deletion_Error', $reportList);
  438. throw new Exception($errorMessage);
  439. }
  440. public function deleteUserReport($userLogin)
  441. {
  442. Db::query('DELETE FROM ' . Common::prefixTable('report') . ' WHERE login = ?', $userLogin);
  443. }
  444. public function install()
  445. {
  446. $reportTable = "`idreport` INT(11) NOT NULL AUTO_INCREMENT,
  447. `idsite` INTEGER(11) NOT NULL,
  448. `login` VARCHAR(100) NOT NULL,
  449. `description` VARCHAR(255) NOT NULL,
  450. `idsegment` INT(11),
  451. `period` VARCHAR(10) NOT NULL,
  452. `hour` tinyint NOT NULL default 0,
  453. `type` VARCHAR(10) NOT NULL,
  454. `format` VARCHAR(10) NOT NULL,
  455. `reports` TEXT NOT NULL,
  456. `parameters` TEXT NULL,
  457. `ts_created` TIMESTAMP NULL,
  458. `ts_last_sent` TIMESTAMP NULL,
  459. `deleted` tinyint(4) NOT NULL default 0,
  460. PRIMARY KEY (`idreport`)";
  461. DbHelper::createTable('report', $reportTable);
  462. }
  463. private static function checkAdditionalEmails($additionalEmails)
  464. {
  465. foreach ($additionalEmails as &$email) {
  466. $email = trim($email);
  467. if (empty($email)) {
  468. $email = false;
  469. } elseif (!Piwik::isValidEmailString($email)) {
  470. throw new Exception(Piwik::translate('UsersManager_ExceptionInvalidEmail') . ' (' . $email . ')');
  471. }
  472. }
  473. $additionalEmails = array_filter($additionalEmails);
  474. return $additionalEmails;
  475. }
  476. public static function getDisplayFormats()
  477. {
  478. $displayFormats = array(
  479. // ScheduledReports_AggregateReportsFormat_TablesOnly should be named ScheduledReports_DisplayFormat_GraphsOnlyForKeyMetrics
  480. self::DISPLAY_FORMAT_GRAPHS_ONLY_FOR_KEY_METRICS => Piwik::translate('ScheduledReports_AggregateReportsFormat_TablesOnly'),
  481. // ScheduledReports_AggregateReportsFormat_GraphsOnly should be named ScheduledReports_DisplayFormat_GraphsOnly
  482. self::DISPLAY_FORMAT_GRAPHS_ONLY => Piwik::translate('ScheduledReports_AggregateReportsFormat_GraphsOnly'),
  483. // ScheduledReports_AggregateReportsFormat_TablesAndGraphs should be named ScheduledReports_DisplayFormat_TablesAndGraphs
  484. self::DISPLAY_FORMAT_TABLES_AND_GRAPHS => Piwik::translate('ScheduledReports_AggregateReportsFormat_TablesAndGraphs'),
  485. self::DISPLAY_FORMAT_TABLES_ONLY => Piwik::translate('ScheduledReports_DisplayFormat_TablesOnly'),
  486. );
  487. return $displayFormats;
  488. }
  489. /**
  490. * Used in the Report Listing
  491. * @ignore
  492. */
  493. static public function getPeriodToFrequency()
  494. {
  495. return array(
  496. ScheduledTime::PERIOD_NEVER => Piwik::translate('General_Never'),
  497. ScheduledTime::PERIOD_DAY => Piwik::translate('General_Daily'),
  498. ScheduledTime::PERIOD_WEEK => Piwik::translate('General_Weekly'),
  499. ScheduledTime::PERIOD_MONTH => Piwik::translate('General_Monthly'),
  500. );
  501. }
  502. /**
  503. * Used in the Report's email content, ie "monthly report"
  504. * @ignore
  505. */
  506. static public function getPeriodToFrequencyAsAdjective()
  507. {
  508. return array(
  509. ScheduledTime::PERIOD_DAY => Piwik::translate('General_DailyReport'),
  510. ScheduledTime::PERIOD_WEEK => Piwik::translate('General_WeeklyReport'),
  511. ScheduledTime::PERIOD_MONTH => Piwik::translate('General_MonthlyReport'),
  512. ScheduledTime::PERIOD_YEAR => Piwik::translate('General_YearlyReport'),
  513. ScheduledTime::PERIOD_RANGE => Piwik::translate('General_RangeReports'),
  514. );
  515. }
  516. }