*/ class AbandonedCartSubject implements Subject { const KEY = 'woocommerce:abandoned_cart'; /** @var WooCommerce */ private $woocommerceHelper; public function __construct( WooCommerce $woocommerceHelper ) { $this->woocommerceHelper = $woocommerceHelper; } public function getKey(): string { return self::KEY; } public function getName(): string { // translators: automation subject (entity entering automation) title return __('WooCommerce abandoned cart', 'mailpoet'); } public function getArgsSchema(): ObjectSchema { return Builder::object([ 'user_id' => Builder::integer()->required(), 'last_activity_at' => Builder::string()->required()->default(30), 'product_ids' => Builder::array(Builder::integer())->required(), ]); } public function getPayload(SubjectData $subjectData): Payload { if (!$this->woocommerceHelper->isWooCommerceActive()) { throw InvalidStateException::create()->withMessage('WooCommerce is not active'); } $lastActivityAt = \DateTimeImmutable::createFromFormat(\DateTime::W3C, $subjectData->getArgs()['last_activity_at']); if (!$lastActivityAt) { throw InvalidStateException::create()->withMessage('Invalid abandoned cart time'); } $customer = new \WC_Customer($subjectData->getArgs()['user_id']); return new AbandonedCartPayload($customer, $lastActivityAt, $subjectData->getArgs()['product_ids']); } public function getFields(): array { return [ new Field( 'woocommerce:cart:cart-total', Field::TYPE_NUMBER, __('Cart total', 'mailpoet'), function (AbandonedCartPayload $payload) { return $payload->getTotal(); } ), ]; } }