Initial commit
This commit is contained in:
+508
@@ -0,0 +1,508 @@
|
||||
<?php
|
||||
|
||||
namespace FluentCrm\App\Services\ExternalIntegrations\FluentCart;
|
||||
|
||||
use FluentCart\Api\ModuleSettings;
|
||||
use FluentCart\App\Helpers\Helper;
|
||||
use FluentCart\App\Models\Customer;
|
||||
use FluentCart\App\Models\Order;
|
||||
use FluentCrm\App\Models\Subscriber;
|
||||
|
||||
use FluentCrm\App\Services\ExternalIntegrations\FluentCart\Benchmarks\OrderSuccessBenchmark;
|
||||
use FluentCrm\App\Services\ExternalIntegrations\FluentCart\SmartCode\SmartCodeParser;
|
||||
use FluentCrm\App\Services\ExternalIntegrations\FluentCart\SmartCode\SmartCodeRegister;
|
||||
|
||||
use FluentCrm\App\Services\ExternalIntegrations\FluentCart\Triggers\OrderCanceledTrigger;
|
||||
use FluentCrm\App\Services\ExternalIntegrations\FluentCart\Triggers\OrderPaidTrigger;
|
||||
use FluentCrm\App\Services\ExternalIntegrations\FluentCart\Triggers\OrderDeliveredTrigger;
|
||||
use FluentCrm\App\Services\ExternalIntegrations\FluentCart\Triggers\OrderRefundedTrigger;
|
||||
use FluentCrm\App\Services\ExternalIntegrations\FluentCart\Triggers\OrderShippedTrigger;
|
||||
use FluentCrm\App\Services\ExternalIntegrations\FluentCart\Triggers\OrderStatusChangedTrigger;
|
||||
|
||||
use FluentCrm\App\Services\ExternalIntegrations\FluentCart\Triggers\SubscriptionActivatedTrigger;
|
||||
use FluentCrm\App\Services\ExternalIntegrations\FluentCart\Triggers\SubscriptionCancelledTrigger;
|
||||
use FluentCrm\App\Services\ExternalIntegrations\FluentCart\Triggers\SubscriptionEndOfTermTrigger;
|
||||
use FluentCrm\App\Services\ExternalIntegrations\FluentCart\Triggers\SubscriptionExpiredTrigger;
|
||||
use FluentCrm\App\Services\ExternalIntegrations\FluentCart\Triggers\SubscriptionRenewedTrigger;
|
||||
|
||||
|
||||
class FluentCart
|
||||
{
|
||||
public function init()
|
||||
{
|
||||
$this->addAutomations();
|
||||
$this->addHooks();
|
||||
|
||||
SmartCodeRegister::push();
|
||||
|
||||
(new RevenueTracker())->init();
|
||||
}
|
||||
|
||||
public function addAutomations()
|
||||
{
|
||||
new OrderPaidTrigger();
|
||||
new OrderShippedTrigger();
|
||||
new OrderDeliveredTrigger();
|
||||
new OrderRefundedTrigger();
|
||||
new OrderCanceledTrigger();
|
||||
|
||||
// new OrderStatusChangedTrigger();
|
||||
new SubscriptionExpiredTrigger();
|
||||
|
||||
//subscription activated
|
||||
new SubscriptionActivatedTrigger();
|
||||
|
||||
//subscription cancelled
|
||||
new SubscriptionCancelledTrigger();
|
||||
|
||||
//subscription renewed
|
||||
new SubscriptionRenewedTrigger();
|
||||
|
||||
//subscription end of term(completed)
|
||||
new SubscriptionEndOfTermTrigger();
|
||||
|
||||
|
||||
// Goals
|
||||
new OrderSuccessBenchmark();
|
||||
}
|
||||
|
||||
public function addHooks()
|
||||
{
|
||||
|
||||
add_filter('fluent_crm/get_import_driver_fluent_cart', [CartImporter::class, 'processUserDriver'], 10, 2);
|
||||
add_filter('fluent_crm/post_import_driver_fluent_cart', [CartImporter::class, 'importData'], 10, 3);
|
||||
|
||||
add_filter('fluentcrm_ajax_options_fluent_cart_products', [$this, 'getProducts'], 10, 3);
|
||||
add_filter('fluentcrm_ajax_options_fluent_cart_product_categories', [$this, 'getProductCategories'], 10, 3);
|
||||
add_filter('fluentcrm_ajax_options_fluent_cart_subscription_products', [$this, 'getSubscriptionProducts'], 10, 3);
|
||||
|
||||
add_filter('fluent_crm/funnel_icons', [$this, 'addCartIcon'], 10 , 1);
|
||||
add_filter('fluent_crm/purchase_history_fluent_cart', [$this, 'purchaseHistory'], 10, 2);
|
||||
|
||||
add_filter('fluent_crm/smartcode_group_callback_cart_order', [SmartCodeParser::class, 'parseCartOrder'], 10, 4);
|
||||
add_filter('fluent_crm/smartcode_group_callback_cart_customer', [SmartCodeParser::class, 'parseCartCustomer'], 10, 4);
|
||||
// add_filter('fluent_crm/smartcode_group_callback_cart_transaction', [SmartCodeParser::class, 'parseCartTransaction'], 10, 4);
|
||||
add_filter('fluent_crm/smartcode_group_callback_cart_receipt', [SmartCodeParser::class, 'parseCartReceipt'], 10, 4);
|
||||
|
||||
|
||||
add_filter('fluentcrm_automation_condition_groups', array($this, 'addAutomationConditions'), 10, 2);
|
||||
add_filter('fluentcrm_automation_conditions_assess_fluent_cart', array($this, 'assessAutomationConditions'), 10, 3);
|
||||
// add_filter('fluentcrm_automation_conditions_assess_woo_order', array($this, 'assessAutomationOrderConditions'), 10, 5);
|
||||
}
|
||||
|
||||
public function getProducts($items, $search, $ids)
|
||||
{
|
||||
return CartHelper::getFluentCartProducts($items, $search, $ids);
|
||||
}
|
||||
|
||||
public function getProductCategories($items, $search, $ids)
|
||||
{
|
||||
return CartHelper::getFluentCartProductCategories($items, $search, $ids);
|
||||
}
|
||||
|
||||
public function getSubscriptionProducts($items, $search, $ids)
|
||||
{
|
||||
return CartHelper::getFluentCartSubscriptionProducts($items, $search, $ids);
|
||||
}
|
||||
|
||||
public function addCartIcon($icons)
|
||||
{
|
||||
$icons['fluentcart'] = [
|
||||
'svg' => '<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="1" y="1" width="18" height="18" rx="1.8" fill="#00009F"/><path d="M9.19408 13.3557H3.82861L4.67063 11.4086C4.91784 10.8369 5.48112 10.4668 6.10395 10.4668H12.4955L12.0607 11.4722C11.5663 12.6155 10.4397 13.3557 9.19408 13.3557Z" fill="white"/><path d="M13.6389 9.54518H6.0918L6.52656 8.5398C7.02098 7.39646 8.14753 6.65625 9.39319 6.65625H15.9142L15.0722 8.60341C14.825 9.17507 14.2617 9.54518 13.6389 9.54518Z" fill="white"/></svg>',
|
||||
];
|
||||
return $icons;
|
||||
}
|
||||
|
||||
public function purchaseHistory($data, $subscriber)
|
||||
{
|
||||
$customer = Customer::where('email', $subscriber->email)->first();
|
||||
if (!$customer) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$ordersQuery = Order::with('appliedCoupons')->where('customer_id', $customer->id);
|
||||
$totalCount = $ordersQuery->count();
|
||||
|
||||
if (!$totalCount) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Pagination params (using super global to avoid dependency on request wrapper here)
|
||||
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
|
||||
if ($page < 1) { $page = 1; }
|
||||
$perPage = isset($_GET['per_page']) ? (int)$_GET['per_page'] : 10;
|
||||
if ($perPage < 1) { $perPage = 10; }
|
||||
|
||||
$orders = $ordersQuery
|
||||
->orderBy('id', 'DESC')
|
||||
->limit($perPage)
|
||||
->offset(($page - 1) * $perPage)
|
||||
->get();
|
||||
|
||||
// Use a helper method for formatting
|
||||
$formattedOrders = $this->formatOrders($orders);
|
||||
|
||||
return [
|
||||
'data' => $formattedOrders,
|
||||
'total' => $totalCount,
|
||||
'sidebar_html' => $this->getSidebarHtml($subscriber),
|
||||
'after_html' => '',
|
||||
'has_recount' => false,
|
||||
'columns_config' => [
|
||||
'order' => ['label' => __('Order', 'fluent-crm'), 'width' => '100px', 'sortable' => true, 'key' => 'id'],
|
||||
'date' => ['label' => __('Date', 'fluent-crm'), 'sortable' => true, 'key' => 'created_at'],
|
||||
// 'coupon' => ['label' => __('Coupon', 'fluent-crm'), 'sortable' => true, 'key' => 'created_at'],
|
||||
'status' => ['label' => __('Status', 'fluent-crm'), 'width' => '140px', 'sortable' => false],
|
||||
// 'payment' => ['label' => __('Payment', 'fluent-crm'), 'width' => '140px', 'sortable' => false, 'key' => 'payment_status'],
|
||||
'total' => ['label' => __('Total', 'fluent-crm'), 'width' => '120px', 'sortable' => true, 'key' => 'total'],
|
||||
'action' => ['label' => __('', 'fluent-crm'), 'width' => '100px', 'sortable' => false],
|
||||
],
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
private function formatOrders($orders)
|
||||
{
|
||||
$formattedOrders = [];
|
||||
|
||||
foreach ($orders as $order) {
|
||||
$orderActionHtml = '<a target="_blank" href="' . admin_url('admin.php?page=fluent-cart#/orders/' . $order->id . '/view') . '">
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M8.5 5.5V7H4.75V15.25H13V11.5H14.5V16C14.5 16.1989 14.421 16.3897 14.2803 16.5303C14.1397 16.671 13.9489 16.75 13.75 16.75H4C3.80109 16.75 3.61032 16.671 3.46967 16.5303C3.32902 16.3897 3.25 16.1989 3.25 16V6.25C3.25 6.05109 3.32902 5.86032 3.46967 5.71967C3.61032 5.57902 3.80109 5.5 4 5.5H8.5ZM16.75 3.25V9.25H15.25V5.80975L9.40525 11.6553L8.34475 10.5948L14.1888 4.75H10.75V3.25H16.75Z" fill="#525866"/>
|
||||
</svg>
|
||||
</a>';
|
||||
$coupons = implode(', ', array_column($order['appliedCoupons']->toArray(), 'code'));
|
||||
|
||||
$date = '<span class="order_id">#' . $order->id .'</span><span class="order_date">'.date_i18n(get_option('date_format'), strtotime($order->created_at)).'</span>';
|
||||
$status = '<span class="fcrm_badge fcrm_badge_'.esc_attr($order->status).'">'. \FluentCrm\App\Services\Helper::getStatusText($order->status) .'</span>';
|
||||
|
||||
$formattedOrders[] = [
|
||||
'date' => $date,
|
||||
'status' => $status,
|
||||
// 'payment' => $order->payment_status,
|
||||
// 'coupons' => $coupons,
|
||||
'total' => Helper::toDecimal($order->total_amount), // Adjust if using a different helper
|
||||
'action' => $orderActionHtml,
|
||||
];
|
||||
}
|
||||
|
||||
return $formattedOrders;
|
||||
}
|
||||
|
||||
private function getSidebarHtml($subscriber = null)
|
||||
{
|
||||
// We will build a similar widget like WooCommerce's purchase sidebar
|
||||
// Show a quick customer summary + recently purchased products (flat list of items)
|
||||
$customer = null;
|
||||
if ($subscriber && !empty($subscriber->email)) {
|
||||
$customer = Customer::where('email', $subscriber->email)->first();
|
||||
}
|
||||
|
||||
if (!$customer) {
|
||||
// Fallback: Just return the static block as before
|
||||
return '<div class="fluent-crm-sidebar-content">'
|
||||
. '<h3>' . __('Product History', 'fluent-crm') . '</h3>'
|
||||
. '<p>' . __('View your purchase history from FluentCart.', 'fluent-crm') . '</p>'
|
||||
. '</div>';
|
||||
}
|
||||
|
||||
// Aggregate order stats
|
||||
$ordersQuery = Order::where('customer_id', $customer->id);
|
||||
$orderCount = (clone $ordersQuery)->count();
|
||||
|
||||
if (!$orderCount) {
|
||||
return '<div class="fluent-crm-sidebar-content">'
|
||||
. '<h3>' . __('Product History', 'fluent-crm') . '</h3>'
|
||||
. '<p>' . __('No purchases found for this contact in FluentCart.', 'fluent-crm') . '</p>'
|
||||
. '</div>';
|
||||
}
|
||||
|
||||
$totalSpent = (clone $ordersQuery)->sum('total_amount');
|
||||
$firstOrder = (clone $ordersQuery)->orderBy('id', 'ASC')->value('created_at');
|
||||
$lastOrder = (clone $ordersQuery)->orderBy('id', 'DESC')->value('created_at');
|
||||
|
||||
// Fetch recent purchased items (latest 15 order items across latest orders)
|
||||
// We'll eager load order_items for performance
|
||||
$recentOrders = (clone $ordersQuery)
|
||||
->with(['order_items' => function($q){
|
||||
$q->orderBy('id', 'DESC');
|
||||
}])
|
||||
->orderBy('id', 'DESC')
|
||||
->limit(200)
|
||||
->get();
|
||||
|
||||
$items = [];
|
||||
foreach ($recentOrders as $order) {
|
||||
foreach ($order->order_items as $orderItem) {
|
||||
|
||||
$itemDisplayName = $orderItem->post_title;
|
||||
|
||||
if($orderItem->post_title != $orderItem->title) {
|
||||
$itemDisplayName = $orderItem->post_title . ' - ' . $orderItem->title;
|
||||
}
|
||||
|
||||
$items[] = [
|
||||
'name' => $itemDisplayName,
|
||||
'price' => isset($orderItem->line_total) ? Helper::toDecimal($orderItem->line_total) : 0,
|
||||
'created_at' => $order->created_at,
|
||||
'order_id' => $order->id,
|
||||
];
|
||||
if (count($items) >= 15) {
|
||||
break 2; // Exit both loops once we have enough
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$html = '<div class="fluent-crm-sidebar-content fc_payment_summary">';
|
||||
$html .= '<h3 class="history_title">' . __('Order Summary', 'fluent-crm') . '</h3>';
|
||||
$html .= '<div class="fc_history_widget"><ul class="fc_full_listed">';
|
||||
$html .= '<li><span class="fc_list_sub">' . __('Total Orders', 'fluent-crm') . '</span><span class="fc_list_value">' . intval($orderCount) . '</span></li>';
|
||||
$html .= '<li><span class="fc_list_sub">' . __('Total Spent', 'fluent-crm') . '</span><span class="fc_list_value">' . esc_html(Helper::toDecimal($totalSpent)) . '</span></li>';
|
||||
if ($firstOrder) {
|
||||
$html .= '<li><span class="fc_list_sub">' . __('First Order', 'fluent-crm') . '</span><span class="fc_list_value">' . date_i18n(get_option('date_format'), strtotime($firstOrder)) . '</span></li>';
|
||||
}
|
||||
if ($lastOrder) {
|
||||
$html .= '<li><span class="fc_list_sub">' . __('Last Order', 'fluent-crm') . '</span><span class="fc_list_value">' . date_i18n(get_option('date_format'), strtotime($lastOrder)) . '</span></li>';
|
||||
}
|
||||
$html .= '</ul></div>';
|
||||
|
||||
$html .= '<h3 class="history_title">' . __('Purchased Products', 'fluent-crm') . '</h3>';
|
||||
$html .= '<div class="fc_history_widget"><ul class="fc_full_listed max_height_550">';
|
||||
foreach ($items as $item) {
|
||||
$orderUrl = admin_url('admin.php?page=fluent-cart#/orders/' . $item['order_id'] . '/view');
|
||||
$badges = '<span class="el-tag el-tag--primary">' . esc_html(Helper::toDecimal($item['price'])) . '</span>';
|
||||
$badges .= '<span class="el-tag el-tag--primary"><a target="_blank" rel="noopener" href="' . esc_url($orderUrl) . '">' . date_i18n(get_option('date_format'), strtotime($item['created_at'])) . '</a></span>';
|
||||
$html .= '<li class="fc_product_name">' . esc_html($item['name']) . ' ' . $badges . '</li>';
|
||||
}
|
||||
if (!$items) {
|
||||
$html .= '<li>' . __('No purchased products found.', 'fluent-crm') . '</li>';
|
||||
}
|
||||
$html .= '</ul></div>';
|
||||
|
||||
$html .= '</div>';
|
||||
|
||||
return $html;
|
||||
}
|
||||
|
||||
|
||||
public function addAutomationConditions($groups)
|
||||
{
|
||||
$conditionItems = [
|
||||
[
|
||||
'value' => 'commerce_exist',
|
||||
'label' => __('Is a customer?', 'fluent-crm'),
|
||||
'type' => 'selections',
|
||||
'is_multiple' => false,
|
||||
'disable_values' => true,
|
||||
'value_description' => __('This filter will check if a contact has at least one shop order or not', 'fluent-crm'),
|
||||
'custom_operators' => [
|
||||
'exist' => __('Yes', 'fluent-crm'),
|
||||
'not_exist' => __('No', 'fluent-crm'),
|
||||
]
|
||||
],
|
||||
[
|
||||
'value' => 'ltv',
|
||||
'label' => __('Lifetime Value', 'fluent-crm'),
|
||||
'type' => 'numeric'
|
||||
],
|
||||
[
|
||||
'value' => 'aov',
|
||||
'label' => __('Average Order Value', 'fluent-crm'),
|
||||
'type' => 'numeric',
|
||||
],
|
||||
[
|
||||
'value' => 'first_purchase_date',
|
||||
'label' => __('First Order Date', 'fluent-crm'),
|
||||
'type' => 'dates'
|
||||
],
|
||||
[
|
||||
'value' => 'last_purchase_date',
|
||||
'label' => __('Last Order Date', 'fluent-crm'),
|
||||
'type' => 'dates'
|
||||
],
|
||||
[
|
||||
'value' => 'purchased_items',
|
||||
'label' => __('Products', 'fluent-crm'),
|
||||
'type' => 'selections',
|
||||
'component' => 'product_selector',
|
||||
'is_multiple' => true,
|
||||
'custom_operators' => [
|
||||
'exist' => __('purchased', 'fluent-crm'),
|
||||
'not_exist' => __('not purchased', 'fluent-crm'),
|
||||
],
|
||||
'help' => __('Will filter the contacts who have at least one order', 'fluent-crm')
|
||||
],
|
||||
[
|
||||
'value' => 'variation_purchased',
|
||||
'label' => __('Product Variations', 'fluent-crm'),
|
||||
'type' => 'cascade_selections',
|
||||
'provider' => 'fct_variations',
|
||||
'is_multiple' => true,
|
||||
'value_description' => __('This filter will check if a contact has purchased at least one specific product variation or not', 'fluent-crm'),
|
||||
'custom_operators' => [
|
||||
'exist' => __('purchased', 'fluent-crm'),
|
||||
'not_exist' => __('not purchased', 'fluent-crm'),
|
||||
]
|
||||
],
|
||||
[
|
||||
'value' => 'purchased_categories',
|
||||
'label' => __('Product Categories', 'fluent-crm'),
|
||||
'type' => 'selections',
|
||||
'component' => 'tax_selector',
|
||||
'taxonomy' => 'product-categories',
|
||||
'is_multiple' => true,
|
||||
'disabled' => true,
|
||||
'help' => __('Will filter the contacts who have at least one order', 'fluent-crm'),
|
||||
'custom_operators' => [
|
||||
'exist' => __('purchased', 'fluent-crm'),
|
||||
'not_exist' => __('not purchased', 'fluent-crm'),
|
||||
]
|
||||
],
|
||||
[
|
||||
'value' => 'commerce_coupons',
|
||||
'label' => __('Used Coupons', 'fluent-crm'),
|
||||
'type' => 'selections',
|
||||
'component' => 'ajax_selector',
|
||||
'option_key' => 'fct_coupons',
|
||||
'is_multiple' => true,
|
||||
'disabled' => true,
|
||||
'custom_operators' => [
|
||||
'exist' => __('in', 'fluent-crm'),
|
||||
'not_exist' => __('not in', 'fluent-crm'),
|
||||
],
|
||||
'help' => __('Will filter the contacts who have at least one order', 'fluent-crm')
|
||||
]
|
||||
];
|
||||
|
||||
if (ModuleSettings::isActive('license')) {
|
||||
$conditionItems[] = [
|
||||
'value' => 'active_licenses',
|
||||
'label' => __('Active Licenses', 'fluent-crm'),
|
||||
'type' => 'selections',
|
||||
'component' => 'product_selector',
|
||||
'is_multiple' => true,
|
||||
'custom_operators' => [
|
||||
'exist' => __('have', 'fluent-crm'),
|
||||
'not_exist' => __('do not have', 'fluent-crm'),
|
||||
],
|
||||
'help' => __('Will filter the contacts who have at least one active licenses or not', 'fluent-crm')
|
||||
];
|
||||
$conditionItems[] = [
|
||||
'value' => 'active_variation_licenses',
|
||||
'label' => __('Active Variation Licenses', 'fluent-crm'),
|
||||
'type' => 'cascade_selections',
|
||||
'provider' => 'fct_variations',
|
||||
'is_multiple' => true,
|
||||
'value_description' => __('This filter will check if a contact has at least one specific variation license or not', 'fluent-crm'),
|
||||
'custom_operators' => [
|
||||
'exist' => __('have', 'fluent-crm'),
|
||||
'not_exist' => __('do not have', 'fluent-crm'),
|
||||
]
|
||||
];
|
||||
$conditionItems[] = [
|
||||
'value' => 'expired_licenses',
|
||||
'label' => __('Expired Licenses', 'fluent-crm'),
|
||||
'type' => 'selections',
|
||||
'component' => 'product_selector',
|
||||
'is_multiple' => true,
|
||||
'custom_operators' => [
|
||||
'exist' => __('have', 'fluent-crm'),
|
||||
'not_exist' => __('do not have', 'fluent-crm'),
|
||||
],
|
||||
'help' => __('Will filter the contacts who have at least one expired licenses or not', 'fluent-crm')
|
||||
];
|
||||
$conditionItems[] = [
|
||||
'value' => 'expired_variation_licenses',
|
||||
'label' => __('Expired Variation Licenses', 'fluent-crm'),
|
||||
'type' => 'cascade_selections',
|
||||
'provider' => 'fct_variations',
|
||||
'is_multiple' => true,
|
||||
'value_description' => __('This filter will check if a contact has at least one specific variation expired license or not', 'fluent-crm'),
|
||||
'custom_operators' => [
|
||||
'exist' => __('have', 'fluent-crm'),
|
||||
'not_exist' => __('do not have', 'fluent-crm'),
|
||||
]
|
||||
];
|
||||
$conditionItems[] = [
|
||||
'value' => 'license_exist',
|
||||
'label' => __('Has any active license?', 'fluent-crm'),
|
||||
'type' => 'selections',
|
||||
'is_multiple' => false,
|
||||
'disable_values' => true,
|
||||
'value_description' => __('Check if contacts has any active license from any products', 'fluent-crm'),
|
||||
'custom_operators' => [
|
||||
'exist' => __('Yes', 'fluent-crm'),
|
||||
'not_exist' => __('No', 'fluent-crm'),
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
$groups['fluent_cart'] = [
|
||||
'label' => __('FluentCart', 'fluent-crm'),
|
||||
'value' => 'fluent_cart',
|
||||
'children' => $conditionItems
|
||||
];
|
||||
|
||||
return $groups;
|
||||
}
|
||||
|
||||
public function assessAutomationConditions($result, $conditions, $subscriber)
|
||||
{
|
||||
$legacyConditions = [];
|
||||
// if (Commerce::isEnabled('woo')) {
|
||||
$formattedConditions = [];
|
||||
|
||||
$commerceProps = [
|
||||
'commerce_exist',
|
||||
'ltv', // lifetime value
|
||||
'aov', // average order value
|
||||
'first_purchase_date',
|
||||
'last_purchase_date',
|
||||
'purchased_items', // products purchased
|
||||
'variation_purchased', // product variations purchased
|
||||
'purchased_categories', // product categories
|
||||
'commerce_coupons', // used coupons
|
||||
];
|
||||
|
||||
foreach ($conditions as $condition) {
|
||||
$prop = $condition['data_key'];
|
||||
$operator = $condition['operator'];
|
||||
if (in_array($prop, $commerceProps)) {
|
||||
$formattedConditions[] = [
|
||||
'operator' => $operator,
|
||||
'value' => $condition['data_value'],
|
||||
'property' => $prop,
|
||||
];
|
||||
} else {
|
||||
$legacyConditions[] = $condition;
|
||||
}
|
||||
}
|
||||
|
||||
if ($formattedConditions) {
|
||||
$hasSubscriber = Subscriber::where('id', $subscriber->id)->where(function ($q) use ($formattedConditions) {
|
||||
do_action_ref_array('fluentcrm_contacts_filter_fluent_cart', [&$q, $formattedConditions]);
|
||||
})->first();
|
||||
if (!$hasSubscriber) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// } else {
|
||||
// $legacyConditions = $conditions;
|
||||
// }
|
||||
|
||||
if ($legacyConditions) {
|
||||
$cartCustomer = Customer::query()
|
||||
->where('email', $subscriber->email)
|
||||
->when($subscriber->user_id, function ($q) use ($subscriber) {
|
||||
return $q->orWhere('user_id', $subscriber->user_id);
|
||||
})
|
||||
->first();
|
||||
|
||||
if (!$cartCustomer) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user