declareReminderFilter($conditions); $this->declarePurchaseFilter($conditions); $this->declareSubscriptionFilter($conditions); } public function onAcymDeclareConditionsScenario(array &$conditions): void { $this->onAcymDeclareConditions($conditions); } private function declarePurchaseFilter(&$conditions) { $conditions['user']['woopurchased'] = new stdClass(); $conditions['user']['woopurchased']->name = acym_translationSprintf('ACYM_COMBINED_TRANSLATIONS', 'WooCommerce', acym_translation('ACYM_PURCHASED')); $conditions['user']['woopurchased']->option = '
'; $conditions['user']['woopurchased']->option .= '
'.acym_translation('ACYM_BOUGHT').'
'; $conditions['user']['woopurchased']->option .= '
'; $conditions['user']['woopurchased']->option .= acym_selectMultiple( [], 'acym_condition[conditions][__numor__][__numand__][woopurchased][product]', [], [ 'class' => 'acym__select acym_select2_ajax', 'data-placeholder' => acym_translation('ACYM_PRODUCT'), 'data-params' => [ 'plugin' => 'plgAcymWoocommerce', 'trigger' => 'searchProduct', 'variations' => true, ], ] ); $conditions['user']['woopurchased']->option .= '
'; $conditions['user']['woopurchased']->option .= '
'; $conditions['user']['woopurchased']->option .= acym_selectMultiple( [], 'acym_condition[conditions][__numor__][__numand__][woopurchased][category]', [], [ 'class' => 'acym__select acym_select2_ajax', 'data-placeholder' => acym_translation('ACYM_CATEGORY'), 'data-params' => [ 'plugin' => 'plgAcymWoocommerce', 'trigger' => 'searchCat', ], ] ); $conditions['user']['woopurchased']->option .= '
'; $conditions['user']['woopurchased']->option .= '
'; $conditions['user']['woopurchased']->option .= '
'; $conditions['user']['woopurchased']->option .= acym_dateField('acym_condition[conditions][__numor__][__numand__][woopurchased][datemin]', '', 'cell shrink'); $conditions['user']['woopurchased']->option .= '<'; $conditions['user']['woopurchased']->option .= ''.acym_translation('ACYM_DATE_CREATED').''; $conditions['user']['woopurchased']->option .= '<'; $conditions['user']['woopurchased']->option .= acym_dateField('acym_condition[conditions][__numor__][__numand__][woopurchased][datemax]', '', 'cell shrink'); $conditions['user']['woopurchased']->option .= '
'; if ($this->wcsInstalled) { $conditions['user']['woopurchased']->option .= '
'; $conditions['user']['woopurchased']->option .= '
'.acym_translation('ACYM_ORDER_TYPE').'
'; $conditions['user']['woopurchased']->option .= ''.acym_select( $this->orderTypes, 'acym_condition[conditions][__numor__][__numand__][woopurchased][order_type]', '', ['class' => 'acym__select'] ).''; $conditions['user']['woopurchased']->option .= '
'; } } private function declareReminderFilter(&$conditions) { $paymentMethods = ['any' => acym_translation('ACYM_ANY_PAYMENT_METHOD')]; if (function_exists('WC')) { $payments = WC()->payment_gateways()->payment_gateways; foreach ($payments as $oneMethod) { $paymentMethods[$oneMethod->id] = $oneMethod->title; } } $conditions['user']['wooreminder'] = new stdClass(); $conditions['user']['wooreminder']->name = acym_translationSprintf('ACYM_COMBINED_TRANSLATIONS', 'WooCommerce', acym_translation('ACYM_REMINDER')); $conditions['user']['wooreminder']->option = '
'; $conditions['user']['wooreminder']->option .= acym_translationSprintf( 'ACYM_ORDER_WITH_STATUS', '', '
'.acym_select( $this->getOrderStatuses(), 'acym_condition[conditions][__numor__][__numand__][wooreminder][status]', 'wc-pending', ['class' => 'acym__select'] ).'
' ); $conditions['user']['wooreminder']->option .= '
'; $conditions['user']['wooreminder']->option .= acym_select( $paymentMethods, 'acym_condition[conditions][__numor__][__numand__][wooreminder][payment]', 'any', ['class' => 'acym__select'] ); $conditions['user']['wooreminder']->option .= '
'; $conditions['user']['wooreminder']->option .= '
'; } private function declareSubscriptionFilter(&$conditions) { if (!$this->wcsInstalled) { return; } $conditions['user']['woosubscription'] = new stdClass(); // phpcs:ignore WordPress.WP.I18n.TextDomainMismatch $conditions['user']['woosubscription']->name = acym_translationSprintf('ACYM_COMBINED_TRANSLATIONS', 'WooCommerce', __('Subscription', 'woocommerce-subscriptions')); $conditions['user']['woosubscription']->option = '
'; $conditions['user']['woosubscription']->option .= '
'; $conditions['user']['woosubscription']->option .= acym_translation('ACYM_HAS_SUBSCRIPTION'); $conditions['user']['woosubscription']->option .= '
'; $conditions['user']['woosubscription']->option .= '
'; $conditions['user']['woosubscription']->option .= acym_selectMultiple( [], 'acym_condition[conditions][__numor__][__numand__][woosubscription][product]', [], [ 'class' => 'acym__select acym_select2_ajax', 'data-placeholder' => acym_translation('ACYM_PRODUCT'), 'data-params' => [ 'plugin' => 'plgAcymWoocommerce', 'trigger' => 'searchProduct', 'variations' => true, 'onlySubscriptions' => true, ], ] ); $conditions['user']['woosubscription']->option .= '
'; $conditions['user']['woosubscription']->option .= '
'; $conditions['user']['woosubscription']->option .= acym_selectMultiple( [], 'acym_condition[conditions][__numor__][__numand__][woosubscription][category]', [], [ 'class' => 'acym__select acym_select2_ajax', 'data-placeholder' => acym_translation('ACYM_CATEGORY'), 'data-params' => [ 'plugin' => 'plgAcymWoocommerce', 'trigger' => 'searchCat', ], ] ); $conditions['user']['woosubscription']->option .= '
'; $subscriptionStatuses = []; $statuses = wcs_get_subscription_statuses(); foreach ($statuses as $status => $statusName) { $subscriptionStatuses[$status] = $statusName; } $conditions['user']['woosubscription']->option .= '
'; $conditions['user']['woosubscription']->option .= acym_selectMultiple( $subscriptionStatuses, 'acym_condition[conditions][__numor__][__numand__][woosubscription][status]', [], [ 'class' => 'acym__select', 'data-placeholder' => acym_translation('ACYM_STATUS'), ] ); $conditions['user']['woosubscription']->option .= '
'; $conditions['user']['woosubscription']->option .= '
'; $conditions['user']['woosubscription']->option .= acym_select( [ 'any' => acym_translation('ACYM_RENEWAL_TYPE'), 'automatic' => acym_translation('ACYM_AUTO'), 'manual' => acym_translation('ACYM_MANUAL'), ], 'acym_condition[conditions][__numor__][__numand__][woosubscription][renewal_type]', 'any', ['class' => 'acym__select'] ); $conditions['user']['woosubscription']->option .= '
'; $conditions['user']['woosubscription']->option .= '
'; $conditions['user']['woosubscription']->option .= '
'; $conditions['user']['woosubscription']->option .= acym_dateField('acym_condition[conditions][__numor__][__numand__][woosubscription][datemin]', '', 'cell shrink'); $conditions['user']['woosubscription']->option .= '<'; $conditions['user']['woosubscription']->option .= ''.acym_translation('ACYM_START_DATE').''; $conditions['user']['woosubscription']->option .= '<'; $conditions['user']['woosubscription']->option .= acym_dateField('acym_condition[conditions][__numor__][__numand__][woosubscription][datemax]', '', 'cell shrink'); $conditions['user']['woosubscription']->option .= '
'; $conditions['user']['woosubscription']->option .= '
'; $conditions['user']['woosubscription']->option .= acym_dateField('acym_condition[conditions][__numor__][__numand__][woosubscription][nextdatemin]', '', 'cell shrink'); $conditions['user']['woosubscription']->option .= '<'; // phpcs:ignore WordPress.WP.I18n.TextDomainMismatch $conditions['user']['woosubscription']->option .= ''.__('Next Payment', 'woocommerce-subscriptions').''; $conditions['user']['woosubscription']->option .= '<'; $conditions['user']['woosubscription']->option .= acym_dateField('acym_condition[conditions][__numor__][__numand__][woosubscription][nextdatemax]', '', 'cell shrink'); $conditions['user']['woosubscription']->option .= '
'; $conditions['user']['woosubscription']->option .= '
'; $conditions['user']['woosubscription']->option .= acym_dateField('acym_condition[conditions][__numor__][__numand__][woosubscription][enddatemin]', '', 'cell shrink'); $conditions['user']['woosubscription']->option .= '<'; $conditions['user']['woosubscription']->option .= ''.acym_translation('ACYM_END_DATE').''; $conditions['user']['woosubscription']->option .= '<'; $conditions['user']['woosubscription']->option .= acym_dateField('acym_condition[conditions][__numor__][__numand__][woosubscription][enddatemax]', '', 'cell shrink'); $conditions['user']['woosubscription']->option .= '
'; } private function getWooCategories($ids = [], $nameSearch = '') { $query = 'SELECT term.`term_id`, term.`name` FROM #__terms AS term JOIN #__term_taxonomy AS tax ON term.`term_id` = tax.`term_id` WHERE tax.`taxonomy` = "product_cat" '; if (!empty($ids)) { acym_arrayToInteger($ids); $query .= ' AND term.`term_id` IN ("'.implode('","', $ids).'")'; } if (!empty($nameSearch)) { $query .= ' AND term.`name` LIKE '.acym_escapeDB('%'.$nameSearch.'%'); } $query .= ' ORDER BY term.`name`'; return acym_loadObjectList($query, 'term_id'); } public function searchProduct() { $ids = $this->getIdsSelectAjax(); if (!empty($ids)) { $args = [ 'post__in' => $ids, 'post_type' => ['product', 'product_variation'], ]; $posts = new WP_Query($args); $value = []; if ($posts->have_posts()) { foreach ($posts->get_posts() as $post) { $value[] = [ 'text' => $post->post_title, 'value' => $post->ID, ]; } } echo wp_json_encode($value); exit; } $return = []; $search = acym_getVar('string', 'search', ''); if (empty($search)) { echo wp_json_encode([]); exit; } $variations = acym_getVar('boolean', 'variations', false); $productType = ['product']; if ($variations) { $productType[] = 'product_variation'; } $onlySubscriptions = acym_getVar('boolean', 'onlySubscriptions', false); $search_results = new WP_Query([ 's' => $search, 'post_status' => 'publish', 'ignore_sticky_posts' => 1, 'post_type' => $productType, 'posts_per_page' => 20, ]); if ($search_results->have_posts()) { while ($search_results->have_posts()) { $search_results->the_post(); if (!$onlySubscriptions || !empty(get_post_meta($search_results->post->ID, '_subscription_price'))) { $return[] = [$search_results->post->ID, $search_results->post->post_title]; } } } echo wp_json_encode($return); exit; } private function processConditionFilter_woopurchased(&$query, $options, $num) { $this->prepareOptions($options); if ($this->isHposActive()) { $query->join['woopurchased_order'.$num] = '#__wc_orders AS order'.$num.' ON order'.$num.'.billing_email COLLATE utf8mb4_unicode_ci = user.email COLLATE utf8mb4_unicode_ci AND order'.$num.'.billing_email != ""'; $query->where[] = 'order'.$num.'.type = "shop_order"'; $query->where[] = 'order'.$num.'.status = "wc-completed"'; if (!empty($options['datemin'])) { $options['datemin'] = acym_replaceDate($options['datemin']); if (!is_numeric($options['datemin'])) $options['datemin'] = strtotime($options['datemin']); if (!empty($options['datemin'])) { $query->where[] = 'order'.$num.'.date_created_gmt > '.acym_escapeDB(acym_date($options['datemin'], 'Y-m-d H:i:s', false)); } } if (!empty($options['datemax'])) { $options['datemax'] = acym_replaceDate($options['datemax']); if (!is_numeric($options['datemax'])) $options['datemax'] = strtotime($options['datemax']); if (!empty($options['datemax'])) { $query->where[] = 'order'.$num.'.date_created_gmt < '.acym_escapeDB(acym_date($options['datemax'], 'Y-m-d H:i:s', false)); } } if (!empty($options['product'])) { $query->join['woopurchased_order_items'.$num] = '#__woocommerce_order_items AS woooi'.$num.' ON order'.$num.'.id = woooi'.$num.'.order_id AND woooi'.$num.'.order_item_type = "line_item"'; $query->join['woopurchased_order_itemmeta'.$num] = '#__woocommerce_order_itemmeta AS woooim'.$num.' ON woooi'.$num.'.order_item_id = woooim'.$num.'.order_item_id AND woooim'.$num.'.meta_key IN ("_product_id", "_variation_id") AND woooim'.$num.'.meta_value IN ('.implode(',', $options['product']).')'; } elseif (!empty($options['category'])) { $query->join['woopurchased_order_items'.$num] = '#__woocommerce_order_items AS woooi'.$num.' ON order'.$num.'.id = woooi'.$num.'.order_id AND woooi'.$num.'.order_item_type = "line_item"'; $query->join['woopurchased_order_itemmeta'.$num] = '#__woocommerce_order_itemmeta AS woooim'.$num.' ON woooi'.$num.'.order_item_id = woooim'.$num.'.order_item_id AND woooim'.$num.'.meta_key = "_product_id"'; $query->join['woopurchased_cat_map'.$num] = '#__term_relationships AS termrel'.$num.' ON termrel'.$num.'.object_id = woooim'.$num.'.meta_value'; $query->join['woopurchased_cat'.$num] = '#__term_taxonomy AS termtax'.$num.' ON termtax'.$num.'.term_taxonomy_id = termrel'.$num.'.term_taxonomy_id AND termtax'.$num.'.term_id IN ('.implode(',', $options['category']).')'; } if (!empty($options['order_type'])) { if (in_array($options['order_type'], ['original', 'regular'])) { $query->leftjoin['woopurchased_meta_order_type'.$num] = '#__wc_orders_meta AS wooom'.$num.' ON wooom'.$num.'.order_id = order'.$num.'.id AND wooom'.$num.'.meta_key IN ("_subscription_renewal", "_subscription_switch")'; $query->where[] = 'wooom'.$num.'.id IS NULL'; if ($options['order_type'] === 'regular') { $query->where[] = 'order'.$num.'.parent_order_id = 0 OR order'.$num.'.parent_order_id IS NULL'; } } elseif ($options['order_type'] === 'parent') { $query->where[] = 'order'.$num.'.parent_order_id = 0 OR order'.$num.'.parent_order_id IS NULL'; } else { if ($options['order_type'] === 'renewal') { $metaKey = '_subscription_renewal'; } elseif ($options['order_type'] === 'resubscribe') { $metaKey = '_subscription_resubscribe'; } else { $metaKey = '_subscription_switch'; } $metaKey = apply_filters('woocommerce_subscriptions_admin_order_type_filter_meta_key', $metaKey, $options['order_type']); $query->join['woopurchased_meta_order_type'.$num] = '#__wc_orders_meta AS wooom'.$num.' ON wooom'.$num.'.order_id = order'.$num.'.id AND wooom'.$num.'.meta_key = '.acym_escapeDB($metaKey).' AND wooom'.$num.'.meta_value != 0'; } } } else { $conditions = []; $conditions[] = 'post'.$num.'.post_type = "shop_order"'; $conditions[] = 'post'.$num.'.post_status = "wc-completed"'; if (!empty($options['datemin'])) { $options['datemin'] = acym_replaceDate($options['datemin']); if (!is_numeric($options['datemin'])) $options['datemin'] = strtotime($options['datemin']); if (!empty($options['datemin'])) { $conditions[] = 'post'.$num.'.post_date > '.acym_escapeDB(acym_date($options['datemin'], 'Y-m-d H:i:s')); } } if (!empty($options['datemax'])) { $options['datemax'] = acym_replaceDate($options['datemax']); if (!is_numeric($options['datemax'])) $options['datemax'] = strtotime($options['datemax']); if (!empty($options['datemax'])) { $conditions[] = 'post'.$num.'.post_date < '.acym_escapeDB(acym_date($options['datemax'], 'Y-m-d H:i:s')); } } $query->join['woopurchased_post'.$num] = '#__posts AS post'.$num.' ON '.implode(' AND ', $conditions); $query->join['woopurchased_postmeta'.$num] = '#__postmeta AS postmeta'.$num.' ON postmeta'.$num.'.post_id = post'.$num.'.ID AND postmeta'.$num.'.meta_value = user.email AND postmeta'.$num.'.meta_value != "" AND postmeta'.$num.'.meta_key = "_billing_email"'; $query->where[] = 'user.email != ""'; if (!empty($options['product'])) { $query->join['woopurchased_order_items'.$num] = '#__woocommerce_order_items AS woooi'.$num.' ON post'.$num.'.ID = woooi'.$num.'.order_id AND woooi'.$num.'.order_item_type = "line_item"'; $query->join['woopurchased_order_itemmeta'.$num] = '#__woocommerce_order_itemmeta AS woooim'.$num.' ON woooi'.$num.'.order_item_id = woooim'.$num.'.order_item_id AND woooim'.$num.'.meta_key IN ("_product_id", "_variation_id") AND woooim'.$num.'.meta_value IN ('.implode(',', $options['product']).')'; } elseif (!empty($options['category'])) { $query->join['woopurchased_order_items'.$num] = '#__woocommerce_order_items AS woooi'.$num.' ON post'.$num.'.ID = woooi'.$num.'.order_id AND woooi'.$num.'.order_item_type = "line_item"'; $query->join['woopurchased_order_itemmeta'.$num] = '#__woocommerce_order_itemmeta AS woooim'.$num.' ON woooi'.$num.'.order_item_id = woooim'.$num.'.order_item_id AND woooim'.$num.'.meta_key = "_product_id"'; $query->join['woopurchased_cat_map'.$num] = '#__term_relationships AS termrel'.$num.' ON termrel'.$num.'.object_id = woooim'.$num.'.meta_value'; $query->join['woopurchased_cat'.$num] = '#__term_taxonomy AS termtax'.$num.' ON termtax'.$num.'.term_taxonomy_id = termrel'.$num.'.term_taxonomy_id AND termtax'.$num.'.term_id IN ('.implode(',', $options['category']).')'; } if (!empty($options['order_type'])) { if (in_array($options['order_type'], ['original', 'regular'])) { $query->leftjoin['woopurchased_meta_order_type'.$num] = '#__postmeta AS metatype'.$num.' ON metatype'.$num.'.post_id = post'.$num.'.ID AND metatype'.$num.'.meta_key IN ("_subscription_renewal", "_subscription_switch")'; $query->where[] = 'metatype'.$num.'.meta_id IS NULL'; if ($options['order_type'] === 'regular') { $query->where[] = 'post'.$num.'.post_parent = 0'; } } elseif ($options['order_type'] === 'parent') { $query->where[] = 'post'.$num.'.post_parent = 0'; } else { if ($options['order_type'] === 'renewal') { $metaKey = '_subscription_renewal'; } elseif ($options['order_type'] === 'resubscribe') { $metaKey = '_subscription_resubscribe'; } else { $metaKey = '_subscription_switch'; } $metaKey = apply_filters('woocommerce_subscriptions_admin_order_type_filter_meta_key', $metaKey, $options['order_type']); $query->join['woopurchased_meta_order_type'.$num] = '#__wc_orders_meta AS metatype'.$num.' ON metatype'.$num.'.post_id = post'.$num.'.ID AND metatype'.$num.'.meta_key = '.acym_escapeDB($metaKey).' AND metatype'.$num.'.meta_value != 0'; } } } } public function onAcymProcessCondition_woopurchased(&$query, $options, $num, &$conditionNotValid) { $this->processConditionFilter_woopurchased($query, $options, $num); $affectedRows = $query->count(); if (empty($affectedRows)) $conditionNotValid++; } private function processConditionFilter_wooreminder(&$query, $options, $num) { $options['days'] = intval($options['days']); if ($this->isHposActive()) { $query->join['wooreminder_order'.$num] = '#__wc_orders AS order'.$num.' ON order'.$num.'.customer_id = user.cms_id'; $query->where[] = 'order'.$num.'.type = "shop_order"'; $query->where[] = 'user.cms_id != 0'; $query->where[] = 'SUBSTRING(order'.$num.'.date_created_gmt, 1, 10) = '.acym_escapeDB(acym_date(time() - ($options['days'] * 86400), 'Y-m-d', false)); $query->where[] = 'order'.$num.'.status = '.acym_escapeDB($options['status']); if (!empty($options['payment']) && $options['payment'] !== 'any') { $query->where[] = 'order'.$num.'.payment_method = '.acym_escapeDB($options['payment']); } } else { $query->join['wooreminder_post'.$num] = '#__posts AS post'.$num.' ON post'.$num.'.post_type = "shop_order"'; $query->join['wooreminder_postmeta'.$num] = '#__postmeta AS postmeta'.$num.' ON postmeta'.$num.'.post_id = post'.$num.'.ID AND postmeta'.$num.'.meta_value = user.cms_id AND postmeta'.$num.'.meta_key = "_customer_user"'; $query->where[] = 'user.cms_id != 0'; $query->where[] = 'SUBSTRING(post'.$num.'.post_date, 1, 10) = '.acym_escapeDB(gmdate('Y-m-d', time() - ($options['days'] * 86400))); $query->where[] = 'post'.$num.'.post_status = '.acym_escapeDB($options['status']); if (!empty($options['payment']) && $options['payment'] !== 'any') { $query->join['wooreminder_postmeta'.$num] = '#__postmeta AS postmeta'.$num.' ON postmeta'.$num.'.post_id = post'.$num.'.ID'; $query->where[] = 'postmeta'.$num.'.meta_key = "_payment_method"'; $query->where[] = 'postmeta'.$num.'.meta_value = '.acym_escapeDB($options['payment']); } } } public function onAcymProcessCondition_wooreminder(&$query, $options, $num, &$conditionNotValid) { $this->processConditionFilter_wooreminder($query, $options, $num); $affectedRows = $query->count(); if (empty($affectedRows)) $conditionNotValid++; } private function processConditionFilter_woosubscription(&$query, $options, $num) { $this->prepareOptions($options); if ($this->isHposActive()) { $query->join['woosubscription_order'.$num] = '#__wc_orders AS order'.$num.' ON order'.$num.'.customer_id = user.cms_id'; $query->where[] = 'order'.$num.'.type = "shop_subscription"'; $query->where[] = 'user.cms_id != 0'; if (!empty($options['status'])) { $query->where[] = 'order'.$num.'.status IN ('.implode(',', $options['status']).')'; } // Apply condition on product / category linked to the subscription if (!empty($options['product'])) { $query->join['woosubscription_order_items'.$num] = '#__woocommerce_order_items AS woooi'.$num.' ON order'.$num.'.id = woooi'.$num.'.order_id AND woooi'.$num.'.order_item_type = "line_item"'; $query->join['woosubscription_order_itemmeta'.$num] = '#__woocommerce_order_itemmeta AS woooim'.$num.' ON woooi'.$num.'.order_item_id = woooim'.$num.'.order_item_id AND woooim'.$num.'.meta_key IN ("_product_id", "_variation_id") AND woooim'.$num.'.meta_value IN ('.implode(',', $options['product']).')'; } elseif (!empty($options['category']) && $options['category'] != 'any') { $query->join['woosubscription_order_items'.$num] = '#__woocommerce_order_items AS woooi'.$num.' ON order'.$num.'.id = woooi'.$num.'.order_id AND woooi'.$num.'.order_item_type = "line_item"'; $query->join['woosubscription_order_itemmeta'.$num] = '#__woocommerce_order_itemmeta AS woooim'.$num.' ON woooi'.$num.'.order_item_id = woooim'.$num.'.order_item_id AND woooim'.$num.'.meta_key = "_product_id"'; $query->join['woosubscription_cat_map'.$num] = '#__term_relationships AS termrel'.$num.' ON termrel'.$num.'.object_id = woooim'.$num.'.meta_value'; $query->join['woosubscription_cat'.$num] = '#__term_taxonomy AS termtax'.$num.' ON termtax'.$num.'.term_taxonomy_id = termrel'.$num.'.term_taxonomy_id AND termtax'.$num.'.term_id IN ('.implode(',', $options['category']).')'; } if (!empty($options['renewal_type']) && in_array($options['renewal_type'], ['automatic', 'manual'])) { $query->join['woosubscription_meta_renewal_type'.$num] = '#__wc_orders_meta AS wcs_renewal_type'.$num.' ON wcs_renewal_type'.$num.'.order_id = order'.$num.'.id AND wcs_renewal_type'.$num.'.meta_key = "_requires_manual_renewal" AND wcs_renewal_type'.$num.'.meta_value = "'.($options['renewal_type'] === 'manual' ? 'true' : 'false').'"'; } // Prepare date fields values $dateOptions = ['datemin', 'datemax', 'nextdatemin', 'nextdatemax', 'enddatemin', 'enddatemax']; foreach ($dateOptions as $oneDateOption) { if (empty($options[$oneDateOption])) continue; $options[$oneDateOption] = acym_replaceDate($options[$oneDateOption]); if (!is_numeric($options[$oneDateOption])) $options[$oneDateOption] = strtotime($options[$oneDateOption]); if (!empty($options[$oneDateOption])) { $options[$oneDateOption] = acym_date($options[$oneDateOption], 'Y-m-d H:i:s', false); } } // Apply date conditions $dateOptions = [ 'date' => '_schedule_start', 'nextdate' => '_schedule_next_payment', 'enddate' => '_schedule_end', ]; foreach ($dateOptions as $oneDateType => $metaKey) { if (!empty($options[$oneDateType.'min']) || !empty($options[$oneDateType.'max'])) { $query->join['woosubscription_meta'.$oneDateType.$num] = '#__wc_orders_meta AS wcs_'.$oneDateType.$num.' ON wcs_'.$oneDateType.$num.'.order_id = order'.$num.'.id AND wcs_'.$oneDateType.$num.'.meta_value != 0 AND wcs_'.$oneDateType.$num.'.meta_key = '.acym_escapeDB($metaKey); if (!empty($options[$oneDateType.'min'])) { $query->join['woosubscription_meta'.$oneDateType.$num] .= ' AND wcs_'.$oneDateType.$num.'.meta_value > '.acym_escapeDB($options[$oneDateType.'min']); } if (!empty($options[$oneDateType.'max'])) { $query->join['woosubscription_meta'.$oneDateType.$num] .= ' AND wcs_'.$oneDateType.$num.'.meta_value < '.acym_escapeDB($options[$oneDateType.'max']); } } } } else { // Retrieve the Acy users with subscriptions $conditions = []; $conditions[] = 'post'.$num.'.post_type = "shop_subscription"'; if (!empty($options['status'])) { $conditions[] = 'post'.$num.'.post_status IN ('.implode(',', $options['status']).')'; } $query->join['woosubscription_post'.$num] = '#__posts AS post'.$num.' ON '.implode(' AND ', $conditions); $query->join['woosubscription_user'.$num] = '#__postmeta AS wcsuser'.$num.' ON wcsuser'.$num.'.post_id = post'.$num.'.ID AND wcsuser'.$num.'.meta_value = user.cms_id AND wcsuser'.$num.'.meta_value != 0 AND wcsuser'.$num.'.meta_key = "_customer_user"'; // Apply condition on product / category linked to the subscription if (!empty($options['product'])) { $query->join['woosubscription_order_items'.$num] = '#__woocommerce_order_items AS woooi'.$num.' ON post'.$num.'.ID = woooi'.$num.'.order_id AND woooi'.$num.'.order_item_type = "line_item"'; $query->join['woosubscription_order_itemmeta'.$num] = '#__woocommerce_order_itemmeta AS woooim'.$num.' ON woooi'.$num.'.order_item_id = woooim'.$num.'.order_item_id AND woooim'.$num.'.meta_key IN ("_product_id", "_variation_id") AND woooim'.$num.'.meta_value IN ('.implode(',', $options['product']).')'; } elseif (!empty($options['category']) && $options['category'] != 'any') { $query->join['woosubscription_order_items'.$num] = '#__woocommerce_order_items AS woooi'.$num.' ON post'.$num.'.ID = woooi'.$num.'.order_id AND woooi'.$num.'.order_item_type = "line_item"'; $query->join['woosubscription_order_itemmeta'.$num] = '#__woocommerce_order_itemmeta AS woooim'.$num.' ON woooi'.$num.'.order_item_id = woooim'.$num.'.order_item_id AND woooim'.$num.'.meta_key = "_product_id"'; $query->join['woosubscription_cat_map'.$num] = '#__term_relationships AS termrel'.$num.' ON termrel'.$num.'.object_id = woooim'.$num.'.meta_value'; $query->join['woosubscription_cat'.$num] = '#__term_taxonomy AS termtax'.$num.' ON termtax'.$num.'.term_taxonomy_id = termrel'.$num.'.term_taxonomy_id AND termtax'.$num.'.term_id IN ('.implode(',', $options['category']).')'; } if (!empty($options['renewal_type']) && in_array($options['renewal_type'], ['automatic', 'manual'])) { $query->join['woosubscription_meta_renewal_type'.$num] = '#__postmeta AS wcs_renewal_type'.$num.' ON wcs_renewal_type'.$num.'.post_id = post'.$num.'.ID AND wcs_renewal_type'.$num.'.meta_key = "_requires_manual_renewal" AND wcs_renewal_type'.$num.'.meta_value = "'.($options['renewal_type'] === 'manual' ? 'true' : 'false').'"'; } // Prepare date fields values $dateOptions = ['datemin', 'datemax', 'nextdatemin', 'nextdatemax', 'enddatemin', 'enddatemax']; foreach ($dateOptions as $oneDateOption) { if (empty($options[$oneDateOption])) continue; $options[$oneDateOption] = acym_replaceDate($options[$oneDateOption]); if (!is_numeric($options[$oneDateOption])) $options[$oneDateOption] = strtotime($options[$oneDateOption]); if (!empty($options[$oneDateOption])) { $options[$oneDateOption] = acym_date($options[$oneDateOption], 'Y-m-d H:i:s', false); } } // Apply date conditions $dateOptions = [ 'date' => '_schedule_start', 'nextdate' => '_schedule_next_payment', 'enddate' => '_schedule_end', ]; foreach ($dateOptions as $oneDateType => $metaKey) { if (!empty($options[$oneDateType.'min']) || !empty($options[$oneDateType.'max'])) { $query->join['woosubscription_meta'.$oneDateType.$num] = '#__postmeta AS wcs_'.$oneDateType.$num.' ON wcs_'.$oneDateType.$num.'.post_id = post'.$num.'.ID AND wcs_'.$oneDateType.$num.'.meta_value != 0 AND wcs_'.$oneDateType.$num.'.meta_key = '.acym_escapeDB($metaKey); if (!empty($options[$oneDateType.'min'])) { $query->join['woosubscription_meta'.$oneDateType.$num] .= ' AND wcs_'.$oneDateType.$num.'.meta_value > '.acym_escapeDB($options[$oneDateType.'min']); } if (!empty($options[$oneDateType.'max'])) { $query->join['woosubscription_meta'.$oneDateType.$num] .= ' AND wcs_'.$oneDateType.$num.'.meta_value < '.acym_escapeDB($options[$oneDateType.'max']); } } } } } public function onAcymProcessCondition_woosubscription(&$query, $options, $num, &$conditionNotValid) { $this->processConditionFilter_woosubscription($query, $options, $num); $affectedRows = $query->count(); if (empty($affectedRows)) $conditionNotValid++; } public function onAcymDeclareSummary_conditions(&$automationCondition) { $this->summaryConditionFilters($automationCondition); } private function summaryConditionFilters(&$automationCondition) { $this->handleReminderSummary($automationCondition); $this->handlePurchaseSummary($automationCondition); $this->handleSubscriptionSummary($automationCondition); } private function handleReminderSummary(&$automationCondition) { if (empty($automationCondition['wooreminder'])) { return; } $paymentMethods = ['any' => acym_translation('ACYM_ANY_PAYMENT_METHOD')]; if (function_exists('WC')) { $payments = WC()->payment_gateways()->payment_gateways; foreach ($payments as $oneMethod) { $paymentMethods[$oneMethod->id] = $oneMethod->title; } } $orderStatus = $this->getOrderStatuses(); $automationCondition = acym_translationSprintf( 'ACYM_CONDITION_ECOMMERCE_REMINDER', $paymentMethods[$automationCondition['wooreminder']['payment']], intval($automationCondition['wooreminder']['days']), $orderStatus[$automationCondition['wooreminder']['status']] ); } private function handlePurchaseSummary(&$automationCondition) { if (empty($automationCondition['woopurchased'])) { return; } if (empty($automationCondition['woopurchased']['product'])) { $products = acym_translation('ACYM_AT_LEAST_ONE_PRODUCT'); } else { if (!is_array($automationCondition['woopurchased']['product'])) { $automationCondition['woopurchased']['product'] = [$automationCondition['woopurchased']['product']]; } $products = []; foreach ($automationCondition['woopurchased']['product'] as $productId) { $product = get_post($productId); $products[] = empty($product->post_title) ? acym_translation('ACYM_UNKNOWN') : $product->post_title; } $products = implode(', ', $products); } if (empty($automationCondition['woopurchased']['category']) || $automationCondition['woopurchased']['category'] === 'any') { $categories = acym_translation('ACYM_ANY_CATEGORY'); } else { $cats = $this->getWooCategories(); if (!is_array($automationCondition['woopurchased']['category'])) { $automationCondition['woopurchased']['category'] = [$automationCondition['woopurchased']['category']]; } $categories = []; foreach ($automationCondition['woopurchased']['category'] as $categoryId) { $categories[] = empty($cats[$categoryId]->name) ? acym_translation('ACYM_UNKNOWN') : $cats[$categoryId]->name; } $categories = implode(', ', $categories); } $finalText = acym_translationSprintf('ACYM_CONDITION_PURCHASED', $products, $categories); $dates = []; if (!empty($automationCondition['woopurchased']['datemin'])) { $dates[] = acym_translation('ACYM_AFTER').' '.acym_replaceDate($automationCondition['woopurchased']['datemin'], true); } if (!empty($automationCondition['woopurchased']['datemax'])) { $dates[] = acym_translation('ACYM_BEFORE').' '.acym_replaceDate($automationCondition['woopurchased']['datemax'], true); } if (!empty($dates)) { $finalText .= ' '.implode(' '.acym_translation('ACYM_AND').' ', $dates); } if ($this->wcsInstalled && !empty($automationCondition['woopurchased']['order_type']) && !empty($this->orderTypes[$automationCondition['woopurchased']['order_type']])) { $finalText .= '
'.acym_translation('ACYM_ORDER_TYPE').': '.$this->orderTypes[$automationCondition['woopurchased']['order_type']]; } $automationCondition = $finalText; } private function handleSubscriptionSummary(&$automationCondition) { if (empty($automationCondition['woosubscription'])) { return; } if (empty($automationCondition['woosubscription']['product'])) { $products = acym_translation('ACYM_AT_LEAST_ONE_PRODUCT'); } else { if (!is_array($automationCondition['woosubscription']['product'])) { $automationCondition['woosubscription']['product'] = [$automationCondition['woosubscription']['product']]; } $products = []; foreach ($automationCondition['woosubscription']['product'] as $productId) { $product = get_post($productId); $products[] = empty($product->post_title) ? acym_translation('ACYM_UNKNOWN') : $product->post_title; } $products = implode(', ', $products); } if (empty($automationCondition['woosubscription']['category']) || $automationCondition['woosubscription']['category'] === 'any') { $categories = acym_translation('ACYM_ANY_CATEGORY'); } else { $cats = $this->getWooCategories(); if (!is_array($automationCondition['woosubscription']['category'])) { $automationCondition['woosubscription']['category'] = [$automationCondition['woosubscription']['category']]; } $categories = []; foreach ($automationCondition['woosubscription']['category'] as $categoryId) { $categories[] = empty($cats[$categoryId]->name) ? acym_translation('ACYM_UNKNOWN') : $cats[$categoryId]->name; } $categories = implode(', ', $categories); } $finalText = acym_translationSprintf('ACYM_HAS_SUBSCRIPTION_SUMMARY', $products, $categories); if (!empty($automationCondition['woosubscription']['status']) && $automationCondition['woosubscription']['status'] !== 'any') { $allStatuses = wcs_get_subscription_statuses(); if (!is_array($automationCondition['woosubscription']['status'])) { $automationCondition['woosubscription']['status'] = [$automationCondition['woosubscription']['status']]; } $statuses = []; foreach ($automationCondition['woosubscription']['status'] as $statusId) { $statuses[] = $allStatuses[$statusId] ?? acym_translation('ACYM_UNKNOWN'); } $finalText .= '
'.acym_translation('ACYM_SUBSCRIPTION_STATUS').' : '.implode(', ', $statuses); } $dateOptions = [ 'date' => acym_translation('ACYM_START_DATE'), // phpcs:ignore WordPress.WP.I18n.TextDomainMismatch 'nextdate' => __('Next Payment', 'woocommerce-subscriptions'), 'enddate' => acym_translation('ACYM_END_DATE'), ]; foreach ($dateOptions as $oneDateOption => $dateLabel) { $dates = []; if (!empty($automationCondition['woosubscription'][$oneDateOption.'min'])) { $dates[] = acym_translation('ACYM_AFTER').' '.acym_replaceDate($automationCondition['woosubscription'][$oneDateOption.'min'], true); } if (!empty($automationCondition['woosubscription'][$oneDateOption.'max'])) { $dates[] = acym_translation('ACYM_BEFORE').' '.acym_replaceDate($automationCondition['woosubscription'][$oneDateOption.'max'], true); } if (!empty($dates)) { $finalText .= '
'.$dateLabel.' : '.implode(' '.acym_translation('ACYM_AND').' ', $dates); } } $automationCondition = $finalText; } private function getOrderStatuses(bool $withDefaultStatus = false): array { if (!function_exists('wc_get_order_statuses')) { return []; } $orderStatuses = []; if ($withDefaultStatus) { $orderStatuses[0] = acym_translation('ACYM_ANY_STATUS'); } // Get all order statuses from WooCommerce (natives and from other plugins) $allWooCommerceOrderStatuses = wc_get_order_statuses(); return array_merge($orderStatuses, $allWooCommerceOrderStatuses); } private function prepareOptions(array &$options) { // The product option was previously a select, and is now a multiselect if (!empty($options['product'])) { if (!is_array($options['product'])) { $options['product'] = [$options['product']]; } acym_arrayToInteger($options['product']); } // The category option was previously a select, and is now a multiselect if (!empty($options['category'])) { if (!is_array($options['category'])) { $options['category'] = $options['category'] === 'any' ? [] : [$options['category']]; } acym_arrayToInteger($options['category']); } // The status option was previously a select, and is now a multiselect if (!empty($options['status'])) { if (!is_array($options['status'])) { $options['status'] = $options['status'] === 'any' ? [] : [$options['status']]; } $options['status'] = array_map('acym_escapeDB', $options['status']); } } }