*/
class StatisticsWooCommercePurchasesRepository extends Repository {
/** @var Helper */
private $wooCommerceHelper;
public function __construct(
EntityManager $entityManager,
Helper $wooCommerceHelper
) {
parent::__construct($entityManager);
$this->wooCommerceHelper = $wooCommerceHelper;
}
protected function getEntityClassName() {
return StatisticsWooCommercePurchaseEntity::class;
}
public function createOrUpdateByClickDataAndOrder(StatisticsClickEntity $click, \WC_Order $order) {
// search by subscriber and newsletter IDs (instead of click itself) to avoid duplicities
// when a new click from the subscriber appeared since last tracking for given newsletter
// (this will keep the originally tracked click - likely the click that led to the order)
$statistics = $this->findOneBy([
'orderId' => $order->get_id(),
'subscriber' => $click->getSubscriber(),
'newsletter' => $click->getNewsletter(),
]);
if (!$statistics instanceof StatisticsWooCommercePurchaseEntity) {
$newsletter = $click->getNewsletter();
$queue = $click->getQueue();
if ((!$newsletter instanceof NewsletterEntity) || (!$queue instanceof SendingQueueEntity)) return;
$statistics = new StatisticsWooCommercePurchaseEntity(
$newsletter,
$queue,
$click,
$order->get_id(),
$order->get_currency(),
(float)$order->get_remaining_refund_amount(),
$order->get_status()
);
$this->persist($statistics);
} else {
$statistics->setOrderCurrency($order->get_currency());
$statistics->setOrderPriceTotal((float)$order->get_remaining_refund_amount());
$statistics->setStatus($order->get_status());
}
$statistics->setSubscriber($click->getSubscriber());
$this->flush();
}
public function getRevenuesByCampaigns(string $currency): array {
$revenueStatus = $this->wooCommerceHelper->getPurchaseStates();
$revenueStatsTable = $this->entityManager->getClassMetadata(StatisticsWooCommercePurchaseEntity::class)->getTableName();
$newsletterTable = $this->entityManager->getClassMetadata(NewsletterEntity::class)->getTableName();
// The "SELECT MIN(click_id)..." sub-query is used to count each purchase only once.
// In the data we track a purchase to multiple newsletters if clicks from multiple newsletters occurred.
/** @var array