_order_saved_text', $subtotal_additional_text, $total_discounted_price, $total_discount,['filter_type'=>'woo_order_line_item','order'=>$order, 'item'=>$item]));
}
}
}
/**
* Hide Zero Coupon Value
* @param $coupon_html
* @param $coupon
* @return mixed
*/
public function hideZeroCouponValue($coupon_html, $coupon)
{
$hide_zero_value_coupon = apply_filters('advanced_woo_discount_rules_hide_zero_value_coupon', true, $coupon);
if ($hide_zero_value_coupon) {
$rule_helper = new Rule();
$original_coupon_html = $coupon_html;
$all_coupon_codes = $rule_helper->getCouponsFromDiscountRules();
$coupon_code = self::$woocommerce_helper->getCouponCode($coupon);
$virtual_coupon = (isset($all_coupon_codes['custom_coupons']) && !empty($all_coupon_codes['custom_coupons'])) ? array_map('strtolower',$all_coupon_codes['custom_coupons']) : [];
$woo_coupons = (isset($all_coupon_codes['woo_coupons'][0]) && !empty($all_coupon_codes['woo_coupons'][0])) ? $all_coupon_codes['woo_coupons'][0] : [];
if (!empty($woo_coupons) && in_array($coupon_code, $woo_coupons)) {
$zero_price_html = '-' . self::$woocommerce_helper->formatPrice(0);
$coupon_html = str_replace($zero_price_html, '', $coupon_html);
} else if (!empty($virtual_coupon) && in_array(strtolower($coupon_code), $virtual_coupon)) {
$zero_price_html = '-' . self::$woocommerce_helper->formatPrice(0);
$coupon_html = str_replace($zero_price_html, '', $coupon_html);
}
$coupon_html = apply_filters('advanced_woo_discount_rules_hide_zero_value_coupon_html', $coupon_html, $original_coupon_html, $coupon);
}
return $coupon_html;
}
/**
* Display promotional messages
* */
public function displayPromotionMessages(){
$cart = Woocommerce::getCart();
$messages = Helper::getPromotionMessages();
$messages = empty($cart) ? '' : $messages;
if(!empty($messages) && is_array($messages)) {
foreach ($messages as $message) {
self::$woocommerce_helper->printNotice($message, "notice");
}
}
}
/**
* Load outer div for displaying promotional message in check out
* */
public function displaySubTotalPromotionMessagesInCheckoutContainer(){
echo "
";
echo "
";
}
/**
* Display promotional message in check out while processing order review
* */
public function displaySubTotalPromotionMessagesInCheckout(){
echo "";
$this->displayPromotionMessages();
echo "
";
echo "";
}
/**
* Export Data via CSV
*/
public function awdrExportCsv(){
if (isset($_POST['wdr-export']) && isset($_POST['security'])) {
if(wp_verify_nonce(sanitize_text_field(wp_unslash($_POST['security'])),'awdr_export_rules')) {
ob_end_clean();
$rule_helper = new Rule();
$rules = $rule_helper->exportRuleByName('all');
$file_name = 'advanced-discount-rules-' . gmdate("Y-m-d-h-i-a") . '.csv';
$file = fopen('php://output', 'w');
header('Content-type: application/csv');
header('Content-Disposition: attachment; filename=' . $file_name);
$export_csv_separator = apply_filters('advanced_woo_discount_rules_csv_import_export_separator', ',');
$enclosure = apply_filters('advanced_woo_discount_rules_csv_import_export_encloser','"');
$escape = apply_filters('advanced_woo_discount_rules_csv_import_export_escape',"\\");
fputcsv($file, array('id', 'enabled', 'deleted', 'exclusive', 'title', 'priority', 'apply_to', 'filters', 'conditions', 'product_adjustments', 'cart_adjustments', 'buy_x_get_x_adjustments', 'buy_x_get_y_adjustments', 'bulk_adjustments', 'set_adjustments', 'other_discounts', 'date_from', 'date_to', 'usage_limits', 'rule_language', 'used_limits', 'additional', 'max_discount_sum', 'advanced_discount_message', 'discount_type', 'used_coupons', 'created_by', 'created_on', 'modified_by', 'modified_on'), $export_csv_separator,$enclosure,$escape);
foreach ($rules as $rule_row) {
$row_data = (array)$rule_row;
fputcsv($file, $row_data, $export_csv_separator, $enclosure, $escape);
}
exit;
}
}
}
/**
* Display total savings in order
* @param $order
*/
public function displayTotalSavingsThroughDiscountInOrder($order){
if (!is_object($order)) {
if (!empty($order) && is_int($order)) {
$order = self::$woocommerce_helper->getOrder($order);
}
}
$items = $order->get_items();
$total_discount = $this->getItemTotalDiscount($items);
$save_text = NULL;
if (!empty($total_discount)) {
$total_discounted_price = self::$woocommerce_helper->formatPrice($total_discount, array('currency' => self::$woocommerce_helper->getOrderCurrency($order)));
$subtotal_additional_text = $this->getYouSavedText($total_discounted_price);
$save_text = apply_filters('advanced_woo_discount_rules_order_saved_text', $subtotal_additional_text, $total_discounted_price, $total_discount,['filter_type'=>'woo_order_total','order'=>$order, 'item'=>$items]);
}
echo wp_kses_post($save_text);
}
/**
* Include tax in fee
* */
public function applyTaxInFee($fee, $cart){
if(Woocommerce::isTaxEnabled() && apply_filters('advanced_woo_discount_rules_is_allow_tax_calculation_for_fee',true,$fee,$cart)){
if(Woocommerce::isEnteredPriceIncludeTax()){
if(class_exists('\WC_Tax')){
$fee_taxs = \WC_Tax::calc_tax( $fee, \WC_Tax::get_rates( '', \WC()->cart->get_customer() ), true );
if(!empty($fee_taxs)){
foreach ($fee_taxs as $key => $val){
$fee = $fee - $val;
}
}
}
}
}
return $fee;
}
/**
* Change the custom taxonomies label
*
* @param $custom_taxonomies
*
* @return array
*/
public static function changeCustomTaxonomyLabel($custom_taxonomies){
if(!empty($custom_taxonomies) && is_array($custom_taxonomies) && method_exists(Woocommerce::class,'changeCustomTaxonomyLabel') ){
return Woocommerce::changeCustomTaxonomyLabel($custom_taxonomies);
}
return $custom_taxonomies;
}
/**
* Add coupon meta data to validate the coupon restrictions
*
* @param $item
* @param $code
* @param $coupon
* @param $order
*/
public static function addCouponMeta($item, $code, $coupon, $order ){
if ( is_a( $coupon, 'WC_Coupon' ) ) {
!empty($coupon->get_product_ids()) ? $item->add_meta_data( 'wdr_apply_coupon_product_ids', $coupon->get_product_ids(), true ) : '';
!empty($coupon->get_excluded_product_ids()) ? $item->add_meta_data( 'wdr_exclude_product_ids', $coupon->get_excluded_product_ids(), true ): '';
!empty($coupon->get_product_categories()) ? $item->add_meta_data( 'wdr_product_categories', $coupon->get_product_categories(), true ): '';
!empty($coupon->get_excluded_product_categories()) ? $item->add_meta_data( 'wdr_exclude_product_categories', $coupon->get_excluded_product_categories(), true ): '';
!empty($coupon->get_exclude_sale_items()) ? $item->add_meta_data( 'wdr_exclude_sale_items', $coupon->get_exclude_sale_items(), true ): '';
!empty($coupon->get_minimum_amount()) ? $item->add_meta_data( 'wdr_minimum_amount', $coupon->get_minimum_amount(), true ): '';
!empty($coupon->get_maximum_amount()) ? $item->add_meta_data( 'wdr_maximum_amount', $coupon->get_maximum_amount(), true ): '';
!empty($coupon->get_email_restrictions()) ? $item->add_meta_data( 'wdr_customer_emails', $coupon->get_email_restrictions(), true ): '';
!empty($coupon->get_usage_limit()) ? $item->add_meta_data( 'wdr_usage_limit', $coupon->get_usage_limit(), true ): '';
!empty($coupon->get_usage_limit_per_user()) ? $item->add_meta_data( 'wdr_usage_limit_per_user', $coupon->get_usage_limit_per_user(), true ): '';
}
}
/**
* validate the coupon restrictions based on product, category, sale items
*
* @param $valid
* @param $product
* @param $coupon
* @param $order_item
*
* @return false
*/
public static function validateCoupon( $valid, $product, $coupon, $order_item ) {
// Only proceed if we are in admin and wc_get_order() exists
if ( ! $order_item || ! is_admin() || ! function_exists( 'wc_get_order' ) ) {
return $valid;
}
//Safely get order ID (works for both array and object)
$order_id = 0;
if ( is_object( $order_item ) && method_exists( $order_item, 'get_order_id' ) ) {
$order_id = $order_item->get_order_id();
} elseif ( is_array( $order_item ) && ! empty( $order_item['order_id'] ) ) {
$order_id = absint( $order_item['order_id'] );
}
if ( ! $order_id ) {
return $valid;
}
// Check if function wc_get_order exists before calling
if ( ! function_exists( 'wc_get_order' ) ) {
return $valid;
}
$order = wc_get_order( $order_id );
if ( ! $order ) {
return $valid;
}
$coupon_code = $coupon->get_code();
$matched_coupon_item = null;
// Loop through coupon items
foreach ( $order->get_items( 'coupon' ) as $order_coupon ) {
if ( strtolower( $order_coupon->get_code() ) === strtolower( $coupon_code ) ) {
$matched_coupon_item = $order_coupon;
break;
}
}
if ( ! $matched_coupon_item ) {
return $valid;
}
// Safely get product data
if ( ! is_object( $product ) || ! method_exists( $product, 'get_id' ) ) {
return $valid;
}
$product_id = $product->get_id();
$product_cats = method_exists( $product, 'get_category_ids' ) ? $product->get_category_ids() : [];
$product_on_sale = method_exists( $product, 'is_on_sale' ) ? $product->is_on_sale() : false;
// Coupon restrictions
$coupon_product_ids = array_filter((array) $matched_coupon_item->get_meta( 'wdr_apply_coupon_product_ids', true ));
if ( ! empty( $coupon_product_ids ) ) {
if ( method_exists( $product, 'is_type' ) && $product->is_type( 'variation' ) ) {
$parent_product_id = $product->get_parent_id();
if ( in_array( $parent_product_id, $coupon_product_ids, true ) ) {
$parent_product = wc_get_product( $parent_product_id );
if ( is_object( $parent_product ) && method_exists( $parent_product, 'get_children' ) ) {
$variable_product_ids = $parent_product->get_children();
if ( is_array( $variable_product_ids ) && ! empty( $variable_product_ids ) ) {
$coupon_product_ids = array_merge( $coupon_product_ids, $variable_product_ids );
}
}
}
}
if ( ! in_array( $product_id, $coupon_product_ids, true ) ) {
return false;
}
}
// Excluded products
$exclude_product_ids = array_filter((array) $matched_coupon_item->get_meta( 'wdr_exclude_product_ids', true ));
if ( ! empty($exclude_product_ids ) && in_array( $product_id, $exclude_product_ids, true ) ) {
return false;
}
// Allowed categories (your logic was reversed)
$allowed_cats = array_filter( (array)$matched_coupon_item->get_meta( 'wdr_product_categories', true ));
if ( ! empty( $allowed_cats ) ) {
$found_allowed_cat = false;
foreach ( $product_cats as $cat_id ) {
if ( in_array( $cat_id, $allowed_cats, true ) ) {
$found_allowed_cat = true;
break;
}
}
if ( ! $found_allowed_cat ) {
return false;
}
}
// Excluded categories
$excluded_cats = array_filter((array) $matched_coupon_item->get_meta( 'wdr_exclude_product_categories', true ));
if ( ! empty( $excluded_cats) ) {
foreach ( $product_cats as $cat_id ) {
if ( in_array( $cat_id, $excluded_cats, true ) ) {
return false;
}
}
}
// Exclude sale items
$exclude_sale_items = (bool) $matched_coupon_item->get_meta( 'wdr_exclude_sale_items', true );
if ( $exclude_sale_items && $product_on_sale ) {
return false;
}
return $valid;
}
}