false,
self::EVOLUTION_GRAPH_PARAMETER => false,
self::ADDITIONAL_EMAILS_PARAMETER => false,
self::DISPLAY_FORMAT_PARAMETER => true,
);
private static $managedReportTypes = array(
self::EMAIL_TYPE => 'plugins/Morpheus/images/email.png'
);
private static $managedReportFormats = array(
ReportRenderer::HTML_FORMAT => 'plugins/Morpheus/images/html_icon.png',
ReportRenderer::PDF_FORMAT => 'plugins/Morpheus/icons/dist/plugins/pdf.png',
ReportRenderer::CSV_FORMAT => 'plugins/Morpheus/images/export.png',
);
const OPTION_KEY_LAST_SENT_DATERANGE = 'report_last_sent_daterange_';
/**
* @see \Piwik\Plugin::registerEvents
*/
public function registerEvents()
{
return array(
'AssetManager.getJavaScriptFiles' => 'getJsFiles',
'AssetManager.getStylesheetFiles' => 'getStylesheetFiles',
'MobileMessaging.deletePhoneNumber' => 'deletePhoneNumber',
'ScheduledReports.getReportParameters' => 'getReportParameters',
'ScheduledReports.validateReportParameters' => 'validateReportParameters',
'ScheduledReports.getReportMetadata' => 'getReportMetadata',
'ScheduledReports.getReportTypes' => 'getReportTypes',
'ScheduledReports.getReportFormats' => 'getReportFormats',
'ScheduledReports.getRendererInstance' => 'getRendererInstance',
'ScheduledReports.getReportRecipients' => 'getReportRecipients',
'ScheduledReports.processReports' => 'processReports',
'ScheduledReports.allowMultipleReports' => 'allowMultipleReports',
'ScheduledReports.sendReport' => 'sendReport',
'Template.reportParametersScheduledReports' => 'template_reportParametersScheduledReports',
'UsersManager.deleteUser' => 'deleteUserReport',
'UsersManager.removeSiteAccess' => 'deleteUserReportForSites',
'SitesManager.deleteSite.end' => 'deleteSiteReport',
'SegmentEditor.deactivate' => 'segmentDeactivation',
'SegmentEditor.update' => 'segmentUpdated',
'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys',
'Request.getRenamedModuleAndAction' => 'renameDeprecatedModuleAndAction',
);
}
public function renameDeprecatedModuleAndAction(&$module, &$action)
{
if($module == 'PDFReports') {
$module = 'ScheduledReports';
}
}
public function getClientSideTranslationKeys(&$translationKeys)
{
$translationKeys[] = "ScheduledReports_ReportSent";
$translationKeys[] = "ScheduledReports_ReportUpdated";
$translationKeys[] = "ScheduledReports_ReportHourWithUTC";
}
/**
* Delete reports for the website
*/
public function deleteSiteReport($idSite)
{
$idReports = API::getInstance()->getReports($idSite);
foreach ($idReports as $report) {
$idReport = $report['idreport'];
API::getInstance()->deleteReport($idReport);
}
}
public function getJsFiles(&$jsFiles)
{
$jsFiles[] = "plugins/ScheduledReports/angularjs/manage-scheduled-report/manage-scheduled-report.controller.js";
$jsFiles[] = "plugins/ScheduledReports/angularjs/manage-scheduled-report/manage-scheduled-report.directive.js";
}
public function getStylesheetFiles(&$stylesheets)
{
$stylesheets[] = 'plugins/ScheduledReports/stylesheets/scheduledreports.less';
}
public function validateReportParameters(&$parameters, $reportType)
{
if (! self::manageEvent($reportType)) {
return;
}
$reportFormat = $parameters[self::DISPLAY_FORMAT_PARAMETER];
$availableDisplayFormats = array_keys(self::getDisplayFormats());
if (!in_array($reportFormat, $availableDisplayFormats)) {
throw new Exception(
Piwik::translate(
// General_ExceptionInvalidAggregateReportsFormat should be named General_ExceptionInvalidDisplayFormat
'General_ExceptionInvalidAggregateReportsFormat',
array($reportFormat, implode(', ', $availableDisplayFormats))
)
);
}
// emailMe is an optional parameter
if (!isset($parameters[self::EMAIL_ME_PARAMETER])) {
$parameters[self::EMAIL_ME_PARAMETER] = self::EMAIL_ME_PARAMETER_DEFAULT_VALUE;
} else {
$parameters[self::EMAIL_ME_PARAMETER] = self::valueIsTrue($parameters[self::EMAIL_ME_PARAMETER]);
}
// evolutionGraph is an optional parameter
if (!isset($parameters[self::EVOLUTION_GRAPH_PARAMETER])) {
$parameters[self::EVOLUTION_GRAPH_PARAMETER] = self::EVOLUTION_GRAPH_PARAMETER_DEFAULT_VALUE;
} else {
$parameters[self::EVOLUTION_GRAPH_PARAMETER] = self::valueIsTrue($parameters[self::EVOLUTION_GRAPH_PARAMETER]);
}
// additionalEmails is an optional parameter
if (isset($parameters[self::ADDITIONAL_EMAILS_PARAMETER])) {
$parameters[self::ADDITIONAL_EMAILS_PARAMETER] = self::checkAdditionalEmails($parameters[self::ADDITIONAL_EMAILS_PARAMETER]);
}
}
// based on http://www.php.net/manual/en/filter.filters.validate.php -> FILTER_VALIDATE_BOOLEAN
private static function valueIsTrue($value)
{
return $value == 'true' || $value == 1 || $value == '1' || $value === true;
}
public function getReportMetadata(&$reportMetadata, $reportType, $idSite)
{
if (! self::manageEvent($reportType)) {
return;
}
$availableReportMetadata = \Piwik\Plugins\API\API::getInstance()->getReportMetadata($idSite);
$filteredReportMetadata = array();
foreach ($availableReportMetadata as $reportMetadata) {
// removing reports from the API category and MultiSites.getOne
if (
$reportMetadata['category'] == 'API' ||
$reportMetadata['category'] == Piwik::translate('General_MultiSitesSummary') && $reportMetadata['name'] == Piwik::translate('General_SingleWebsitesDashboard')
) {
continue;
}
$filteredReportMetadata[] = $reportMetadata;
}
$reportMetadata = $filteredReportMetadata;
}
public function getReportTypes(&$reportTypes)
{
$reportTypes = array_merge($reportTypes, self::$managedReportTypes);
}
public function getReportFormats(&$reportFormats, $reportType)
{
if (self::manageEvent($reportType)) {
$reportFormats = self::$managedReportFormats;
}
}
public function getReportParameters(&$availableParameters, $reportType)
{
if (self::manageEvent($reportType)) {
$availableParameters = self::$availableParameters;
}
}
public function processReports(&$processedReports, $reportType, $outputType, $report)
{
if (! self::manageEvent($reportType)) {
return;
}
$displayFormat = $report['parameters'][self::DISPLAY_FORMAT_PARAMETER];
$evolutionGraph = $report['parameters'][self::EVOLUTION_GRAPH_PARAMETER];
foreach ($processedReports as &$processedReport) {
$metadata = $processedReport['metadata'];
$isAggregateReport = !empty($metadata['dimension']);
$processedReport['displayTable'] = $displayFormat != self::DISPLAY_FORMAT_GRAPHS_ONLY;
$processedReport['displayGraph'] =
($isAggregateReport ?
$displayFormat == self::DISPLAY_FORMAT_GRAPHS_ONLY || $displayFormat == self::DISPLAY_FORMAT_TABLES_AND_GRAPHS
:
$displayFormat != self::DISPLAY_FORMAT_TABLES_ONLY)
&& \Piwik\SettingsServer::isGdExtensionEnabled()
&& \Piwik\Plugin\Manager::getInstance()->isPluginActivated('ImageGraph')
&& !empty($metadata['imageGraphUrl']);
$processedReport['evolutionGraph'] = $evolutionGraph;
// remove evolution metrics from MultiSites.getAll
if ($metadata['module'] == 'MultiSites') {
$columns = $processedReport['columns'];
foreach (\Piwik\Plugins\MultiSites\API::getApiMetrics($enhanced = true) as $metricSettings) {
unset($columns[$metricSettings[\Piwik\Plugins\MultiSites\API::METRIC_EVOLUTION_COL_NAME_KEY]]);
}
$processedReport['metadata'] = $metadata;
$processedReport['columns'] = $columns;
}
}
}
public function getRendererInstance(&$reportRenderer, $reportType, $outputType, $report)
{
if (! self::manageEvent($reportType)) {
return;
}
$reportFormat = $report['format'];
$reportRenderer = ReportRenderer::factory($reportFormat);
if ($reportFormat == ReportRenderer::HTML_FORMAT) {
$reportRenderer->setRenderImageInline($outputType != API::OUTPUT_SAVE_ON_DISK);
}
}
public function allowMultipleReports(&$allowMultipleReports, $reportType)
{
if (self::manageEvent($reportType)) {
$allowMultipleReports = true;
}
}
public function sendReport($reportType, $report, $contents, $filename, $prettyDate, $reportSubject, $reportTitle,
$additionalFiles, Period $period = null, $force)
{
if (! self::manageEvent($reportType)) {
return;
}
// Safeguard against sending the same report twice to the same email (unless $force is true)
if (!$force && $this->reportAlreadySent($report, $period)) {
Log::warning(
'Preventing the same scheduled report from being sent again (report #%s for period "%s")',
$report['idreport'],
$prettyDate
);
return;
}
$generatedReport = new GeneratedReport($report, $reportTitle, $prettyDate, $contents, $additionalFiles);
$reportFormat = $generatedReport->getReportFormat();
$customReplyTo = null;
if (Config::getInstance()->General['scheduled_reports_replyto_is_user_email_and_alias']
|| !isset($reportDetails['login'])
) {
$userModel = new UserModel();
$customReplyTo = $userModel->getUser($report['login']);
}
/** @var ReportEmailGenerator $reportGenerator */
$reportGenerator = StaticContainer::get(ReportEmailGenerator::class . '.' . $reportFormat);
$mail = $reportGenerator->makeEmail($generatedReport, $customReplyTo);
// Get user emails and languages
$reportParameters = $report['parameters'];
$emails = array();
if (isset($reportParameters[self::ADDITIONAL_EMAILS_PARAMETER])) {
$emails = $reportParameters[self::ADDITIONAL_EMAILS_PARAMETER];
}
if ($reportParameters[self::EMAIL_ME_PARAMETER] == 1) {
if (Piwik::getCurrentUserLogin() == $report['login']) {
$emails[] = Piwik::getCurrentUserEmail();
} else {
try {
$user = APIUsersManager::getInstance()->getUser($report['login']);
} catch (Exception $e) {
return;
}
$emails[] = $user['email'];
}
}
if (! $force) {
$this->markReportAsSent($report, $period);
}
$subscriptionModel = new SubscriptionModel();
$subscriptionModel->updateReportSubscriptions($report['idreport'], $emails);
$subscriptions = $subscriptionModel->getReportSubscriptions($report['idreport']);
$tokens = array_column($subscriptions, 'token', 'email');
$textContent = $mail->getBodyText();
$htmlContent = $mail->getBodyHtml();
if ($htmlContent instanceof \Zend_Mime_Part) {
$htmlContent = $htmlContent->getRawContent();
}
foreach ($emails as $email) {
if (empty($email)) {
continue;
}
$mail->addTo($email);
// add unsubscribe links to content
if ($htmlContent) {
$link = SettingsPiwik::getPiwikUrl() . 'index.php?module=ScheduledReports&action=unsubscribe&token=' . $tokens[$email];
$mail->setBodyHtml($htmlContent . '