geno/wp-content/plugins/mailpoet/lib/WooCommerce/MultichannelMarketing/MPMarketingChannelDataController.php
2024-02-01 11:54:18 +00:00

227 lines
6.7 KiB
PHP

<?php declare(strict_types = 1);
namespace MailPoet\WooCommerce\MultichannelMarketing;
if (!defined('ABSPATH')) exit;
use MailPoet\Automation\Engine\Data\Automation;
use MailPoet\Automation\Engine\Storage\AutomationStorage;
use MailPoet\Automation\Integrations\MailPoet\Analytics\Controller\OverviewStatisticsController;
use MailPoet\Automation\Integrations\MailPoet\Analytics\Entities\QueryWithCompare;
use MailPoet\Config\Menu;
use MailPoet\Newsletter\NewslettersRepository;
use MailPoet\Newsletter\Statistics\NewsletterStatisticsRepository;
use MailPoet\Newsletter\Statistics\WooCommerceRevenue;
use MailPoet\Services\AuthorizedEmailsController;
use MailPoet\Services\Bridge;
use MailPoet\Settings\SettingsController;
use MailPoet\Util\CdnAssetUrl;
use MailPoet\WooCommerce\Helper;
use MailPoetVendor\Carbon\Carbon;
/**
* Created to pass data to the `MPMarketingChannel`.
*
* We create an instance of this class with the MailPoet DI ContainerInterface
*
* This provides the class access to other MailPoet services,
* preventing us from overloading the `MPMarketingChannelController` class with imports and duplicating efforts
*/
class MPMarketingChannelDataController {
/** @var CdnAssetUrl */
private $cdnAssetUrl;
/**
* @var SettingsController
*/
private $settings;
/**
* @var Bridge
*/
private $bridge;
/**
* @var NewslettersRepository
*/
private $newsletterRepository;
/**
* @var Helper
*/
private $woocommerceHelper;
/**
* @var AutomationStorage
*/
private $automationStorage;
/**
* @var NewsletterStatisticsRepository
*/
private $newsletterStatisticsRepository;
/**
* @var OverviewStatisticsController
*/
private $overviewStatisticsController;
public function __construct(
CdnAssetUrl $cdnAssetUrl,
SettingsController $settings,
Bridge $bridge,
NewslettersRepository $newsletterRepository,
Helper $woocommerceHelper,
AutomationStorage $automationStorage,
NewsletterStatisticsRepository $newsletterStatisticsRepository,
OverviewStatisticsController $overviewStatisticsController
) {
$this->cdnAssetUrl = $cdnAssetUrl;
$this->settings = $settings;
$this->bridge = $bridge;
$this->newsletterRepository = $newsletterRepository;
$this->automationStorage = $automationStorage;
$this->woocommerceHelper = $woocommerceHelper;
$this->newsletterStatisticsRepository = $newsletterStatisticsRepository;
$this->overviewStatisticsController = $overviewStatisticsController;
}
public function getIconUrl(): string {
return $this->cdnAssetUrl->generateCdnUrl('icon-white-123x128.png');
}
/**
* Whether the task is completed.
* If the setting 'version' is not null it means the welcome wizard
* was already completed so we mark this task as completed as well.
*/
public function isMPSetupComplete(): bool {
$version = $this->settings->get('version');
return $version !== null;
}
/**
* Is MSS Enabled?
* @return bool
*/
public function isMailPoetSendingServiceEnabled(): bool {
return $this->bridge->isMailpoetSendingServiceEnabled();
}
/**
* Check for error status. It's null by default when there isn't an error
* @return mixed
*/
public function getMailPoetSendingStatus() {
return $this->settings->get('mta_log.status');
}
/**
* Get the number of errors available
* Mostly likely sending errors
* @return int
*/
public function getErrorCount(): int {
$error = $this->settings->get('mta_log.error');
$count = 0;
if (!empty($error)) {
$count++;
}
$validationError = $this->settings->get(AuthorizedEmailsController::AUTHORIZED_EMAIL_ADDRESSES_ERROR_SETTING);
if ($validationError && isset($validationError['invalid_sender_address'])) {
$count++;
}
return $count;
}
public function getStandardNewsletterList($campaignType): array {
return $this->getNewsletterTypeLists(
// fetch the most recently sent post-notification history newsletters limited to ten
$this->newsletterRepository->getStandardNewsletterListWithMultipleStatuses(10),
$campaignType
);
}
public function getPostNotificationNewsletters($campaignType): array {
return $this->getNewsletterTypeLists(
// fetch the most recently sent post-notification history newsletters limited to ten
$this->newsletterRepository->getNotificationHistoryItems(10),
$campaignType
);
}
public function getAutomations($campaignType): array {
$result = [];
// Fetch Automation stats within the last 90 days
$primaryAfter = new \DateTimeImmutable((string)Carbon::now()->subDays(90)->toISOString());
$primaryBefore = new \DateTimeImmutable((string)Carbon::now()->toISOString());
$now = new \DateTimeImmutable('');
$query = new QueryWithCompare($primaryAfter, $primaryBefore, $now, $now);
$userCurrency = $this->woocommerceHelper->getWoocommerceCurrency();
foreach ($this->automationStorage->getAutomations([Automation::STATUS_ACTIVE]) as $automation) {
$automationId = (string)$automation->getId();
$automationStatistics = $this->overviewStatisticsController->getStatisticsForAutomation($automation, $query);
$result[] = [
'id' => $automationId,
'name' => $automation->getName(),
'campaignType' => $campaignType,
'url' => admin_url('admin.php?page=' . Menu::AUTOMATION_ANALYTICS_PAGE_SLUG . '&id=' . $automationId),
'price' => [
'amount' => isset($automationStatistics['revenue']['current']) ? $this->formatPrice($automationStatistics['revenue']['current']) : 0,
'currency' => $userCurrency,
],
];
}
return $result;
}
private function getNewsletterTypeLists($allNewsletters, $campaignType): array {
$result = [];
$userCurrency = $this->woocommerceHelper->getWoocommerceCurrency();
// fetch the most recent newsletters limited to ten
foreach ($allNewsletters as $newsletter) {
$newsLetterId = (string)$newsletter->getId();
/** @var ?WooCommerceRevenue $wooRevenue */
$wooRevenue = $this->newsletterStatisticsRepository->getWooCommerceRevenue($newsletter);
$result[] = [
'id' => $newsLetterId,
'name' => $newsletter->getSubject(),
'campaignType' => $campaignType,
'url' => admin_url('admin.php?page=' . Menu::EMAILS_PAGE_SLUG . '/#/stats/' . $newsLetterId),
'price' => [
'amount' => $wooRevenue ? $this->formatPrice($wooRevenue->getValue()) : 0,
'currency' => $userCurrency,
],
];
}
return $result;
}
/**
* Format amount to 2 dp
* @param string|int|float $amount
* @return string
*/
private function formatPrice($amount): string {
return number_format((float)$amount, 2, '.', '');
}
}