diff --git a/mailpoet/lib/Automation/Integrations/MailPoet/Analytics/Controller/FreeOrderController.php b/mailpoet/lib/Automation/Integrations/MailPoet/Analytics/Controller/FreeOrderController.php new file mode 100644 index 0000000000..2ec62390b5 --- /dev/null +++ b/mailpoet/lib/Automation/Integrations/MailPoet/Analytics/Controller/FreeOrderController.php @@ -0,0 +1,151 @@ +newslettersRepository = $newsletterRepository; + $this->subscribersRepository = $subscribersRepository; + $this->woocommerce = $woocommerce; + $this->wp = $wp; + } + + public function getOrdersForAutomation(Automation $automation, Query $query): array { + $items = [ + $this->addItem($automation, $query), + $this->addItem($automation, $query), + $this->addItem($automation, $query), + $this->addItem($automation, $query), + ]; + return [ + 'results' => count($items), + 'items' => $items, + ]; + } + + private function addItem(Automation $automation, Query $query): array { + $newsletter = $this->getRandomEmailFromAutomation($automation); + $currentOrder = $this->getRandomOrder(); + + $subscriber = $this->getRandomSubscriber(); + $products = $currentOrder ? array_values(array_filter(array_map( + function(\WC_Order_Item $lineItem): ?array { + if (!$lineItem instanceof \WC_Order_Item_Product) { + return null; + } + return [ + 'id' => $lineItem->get_product_id(), + 'name' => $lineItem->get_name(), + 'quantity' => $lineItem->get_quantity(), + ]; + }, + $currentOrder->get_items() + ))) : []; + + return [ + 'date' => $this->findRandomDateBetween($query->getAfter(), $query->getBefore())->format(\DateTimeImmutable::W3C), + 'customer' => [ + 'id' => $subscriber->getId(), + 'email' => $subscriber->getEmail(), + 'first_name' => $subscriber->getFirstName(), + 'last_name' => $subscriber->getLastName(), + 'avatar' => $this->wp->getAvatarUrl($subscriber->getEmail(), ['size' => 20]), + ], + 'details' => [ + 'id' => $currentOrder ? $currentOrder->get_id() : null, + 'status' => $currentOrder ? [ + 'id' => $currentOrder->get_status(), + 'name' => $this->woocommerce->wcGetOrderStatusName($currentOrder->get_status()), + ] : null, + 'total' => $currentOrder ? (float)$currentOrder->get_total() : null, + 'products' => $products, + ], + 'email' => [ + 'subject' => $newsletter ? $newsletter->getSubject() : '', + 'id' => $newsletter ? $newsletter->getId() : 0, + ], + ]; + } + + private function findRandomDateBetween(\DateTimeImmutable $start, \DateTimeImmutable $end): \DateTime { + $start = new \DateTime($start->format(\DateTime::W3C)); + $start->setTimezone($this->wp->wpTimezone()); + $end = new \DateTime($end->format(\DateTime::W3C)); + $end->setTimezone($this->wp->wpTimezone()); + $randomTimestamp = mt_rand($start->getTimestamp(), $end->getTimestamp()); + $randomDate = new \DateTime(); + $randomDate->setTimestamp($randomTimestamp); + $randomDate->setTimezone($this->wp->wpTimezone()); + return $randomDate; + } + + private function getRandomSubscriber(): SubscriberEntity { + $subscribers = $this->subscribersRepository->findBy([], null, 100); + if (!$subscribers) { + /** @var string $email */ + $email = $this->wp->getOption('admin_email'); + $subscriber = new SubscriberEntity(); + $subscriber->setFirstName('John'); + $subscriber->setLastName('Doe'); + $subscriber->setEmail($email); + return $subscriber; + } + + return $subscribers[array_rand($subscribers)]; + } + + private function getRandomOrder(): ?\WC_Order { + $orders = $this->woocommerce->wcGetOrders([ + 'limit' => 1, + 'type' => 'shop_order', + 'orderby' => 'rand', + ]); + return is_array($orders) && count($orders) ? current($orders) : null; + } + + private function getRandomEmailFromAutomation(Automation $automation): ?NewsletterEntity { + $emails = $this->getEmailsFromAutomation($automation); + return count($emails) ? $emails[array_rand($emails)] : null; + } + + /** + * @param Automation $automation + * @return NewsletterEntity[] + */ + private function getEmailsFromAutomation(Automation $automation): array { + $emails = []; + foreach ($automation->getSteps() as $step) { + if ($step->getKey() === 'mailpoet:send-email') { + $emails[] = $this->newslettersRepository->findOneById($step->getArgs()['email_id']); + } + } + return array_values(array_filter($emails)); + } +} diff --git a/mailpoet/lib/Automation/Integrations/MailPoet/Analytics/Controller/OrderController.php b/mailpoet/lib/Automation/Integrations/MailPoet/Analytics/Controller/OrderController.php new file mode 100644 index 0000000000..e72de8ce98 --- /dev/null +++ b/mailpoet/lib/Automation/Integrations/MailPoet/Analytics/Controller/OrderController.php @@ -0,0 +1,10 @@ +autowire(\MailPoet\Automation\Integrations\MailPoet\Analytics\Analytics::class)->setPublic(true); $container->autowire(\MailPoet\Automation\Integrations\MailPoet\Analytics\Endpoints\OverviewEndpoint::class)->setPublic(true); $container->autowire(\MailPoet\Automation\Integrations\MailPoet\Analytics\Controller\OverviewStatisticsController::class)->setPublic(true); + $container->autowire(\MailPoet\Automation\Integrations\MailPoet\Analytics\Controller\FreeOrderController::class)->setPublic(true); // Config $container->autowire(\MailPoet\Config\AccessControl::class)->setPublic(true); $container->autowire(\MailPoet\Config\Activator::class)->setPublic(true);