get_coupon_receiver_details_session(); $request_gift_receiver_email = ( isset( $gift_receiver_session['gift_receiver_email'] ) ) ? wc_clean( wp_unslash( $gift_receiver_session['gift_receiver_email'] ) ) : array(); $request_gift_receiver_message = ( isset( $gift_receiver_session['gift_receiver_message'] ) ) ? wc_clean( wp_unslash( $gift_receiver_session['gift_receiver_message'] ) ) : array(); $request_gift_sending_timestamp = ( isset( $gift_receiver_session['gift_sending_timestamp'] ) ) ? wc_clean( wp_unslash( $gift_receiver_session['gift_sending_timestamp'] ) ) : array(); $request_billing_email = ( isset( $gift_receiver_session['billing_email'] ) ) ? wc_clean( wp_unslash( $gift_receiver_session['billing_email'] ) ) : ''; $request_is_gift = ( isset( $gift_receiver_session['is_gift'] ) ) ? wc_clean( wp_unslash( $gift_receiver_session['is_gift'] ) ) : ''; $request_sc_send_to = ( isset( $gift_receiver_session['sc_send_to'] ) ) ? wc_clean( wp_unslash( $gift_receiver_session['sc_send_to'] ) ) : ''; } } if ( in_array( $payment_type, array( 'google_pay', 'apple_pay' ), true ) && ( empty( $request_gift_receiver_email ) || count( $request_gift_receiver_email ) <= 0 ) ) { $product_ids = array(); $cart = ( isset( WC()->cart ) ) ? WC()->cart : ''; if ( $cart instanceof WC_Cart && is_callable( array( $cart, 'get_cart' ) ) ) { $cart_contents = $cart->get_cart(); if ( ! empty( $cart_contents ) && is_array( $cart_contents ) ) { $product_ids = wp_list_pluck( $cart_contents, 'product_id' ); } } if ( ! empty( $product_ids ) ) { foreach ( $product_ids as $product_id ) { $product = wc_get_product( $product_id ); $coupons = $this->get_coupon_titles( array( 'product_object' => $product ) ); if ( ! empty( $coupons ) ) { foreach ( $coupons as $coupon_title ) { $coupon_of_product = new WC_Coupon( $coupon_title ); $discount_type_of_product = ( is_object( $coupon_of_product ) && is_callable( array( $coupon_of_product, 'get_discount_type' ) ) ) ? $coupon_of_product->get_discount_type() : ''; if ( 'smart_coupon' === $discount_type_of_product ) { $id = $coupon_of_product->get_id(); $request_gift_receiver_email[ $id ][] = $request_billing_email; } } } } } } if ( empty( $request_gift_receiver_email ) || count( $request_gift_receiver_email ) <= 0 ) { return; } $order_id = absint( $order_id ); $order = ( ! empty( $order_id ) ) ? wc_get_order( $order_id ) : null; if ( ! empty( $request_gift_receiver_email ) || ( ! empty( $request_billing_email ) && $request_billing_email !== $request_gift_receiver_email ) ) { $is_callable_update_meta_data = $this->is_callable( $order, 'update_meta_data' ); $schedule_store_credit = get_option( 'smart_coupons_schedule_store_credit' ); $schedule_gift_sending = ( 'yes' === $schedule_store_credit && 'yes' === $request_is_gift && ( isset( $_REQUEST['wc_sc_schedule_gift_sending'] ) ) ) ? wc_clean( wp_unslash( $_REQUEST['wc_sc_schedule_gift_sending'] ) ) : ''; // phpcs:ignore if ( 'yes' === $request_is_gift ) { if ( ! empty( $request_sc_send_to ) ) { switch ( $request_sc_send_to ) { case 'one': $email_for_one = ( isset( $request_gift_receiver_email[0][0] ) && ! empty( $request_gift_receiver_email[0][0] ) && is_email( $request_gift_receiver_email[0][0] ) ) ? $request_gift_receiver_email[0][0] : $request_billing_email; $message_for_one = ( isset( $request_gift_receiver_message[0][0] ) && ! empty( $request_gift_receiver_message[0][0] ) ) ? $request_gift_receiver_message[0][0] : ''; $schedule_for_one = ( isset( $request_gift_sending_timestamp[0][0] ) && ! empty( $request_gift_sending_timestamp[0][0] ) ) ? $request_gift_sending_timestamp[0][0] : ''; unset( $request_gift_receiver_email[0][0] ); unset( $request_gift_receiver_message[0][0] ); unset( $request_gift_sending_timestamp[0][0] ); foreach ( $request_gift_receiver_email as $coupon_id => $emails ) { foreach ( $emails as $key => $email ) { $request_gift_receiver_email[ $coupon_id ][ $key ] = $email_for_one; $request_gift_receiver_message[ $coupon_id ][ $key ] = $message_for_one; $request_gift_sending_timestamp[ $coupon_id ][ $key ] = $schedule_for_one; } } if ( ! empty( $request_gift_receiver_message ) && '' !== $request_gift_receiver_message ) { if ( true === $is_callable_update_meta_data ) { $order->update_meta_data( 'gift_receiver_message', $request_gift_receiver_message ); } else { update_post_meta( $order_id, 'gift_receiver_message', $request_gift_receiver_message ); } } if ( ! empty( $request_gift_sending_timestamp ) && '' !== $request_gift_sending_timestamp ) { if ( true === $is_callable_update_meta_data ) { $order->update_meta_data( 'gift_sending_timestamp', $request_gift_sending_timestamp ); } else { update_post_meta( $order_id, 'gift_sending_timestamp', $request_gift_sending_timestamp ); } } break; case 'many': if ( isset( $request_gift_receiver_email[0][0] ) && ! empty( $request_gift_receiver_email[0][0] ) ) { unset( $request_gift_receiver_email[0][0] ); } if ( isset( $request_gift_receiver_message[0][0] ) && ! empty( $request_gift_receiver_message[0][0] ) ) { unset( $request_gift_receiver_message[0][0] ); } if ( isset( $request_gift_sending_timestamp[0][0] ) && ! empty( $request_gift_sending_timestamp[0][0] ) ) { unset( $request_gift_sending_timestamp[0][0] ); } if ( ! empty( $request_gift_receiver_message ) && '' !== $request_gift_receiver_message ) { if ( true === $is_callable_update_meta_data ) { $order->update_meta_data( 'gift_receiver_message', $request_gift_receiver_message ); } else { update_post_meta( $order_id, 'gift_receiver_message', $request_gift_receiver_message ); } } if ( ! empty( $request_gift_sending_timestamp ) && '' !== $request_gift_sending_timestamp ) { if ( true === $is_callable_update_meta_data ) { $order->update_meta_data( 'gift_sending_timestamp', $request_gift_sending_timestamp ); } else { update_post_meta( $order_id, 'gift_sending_timestamp', $request_gift_sending_timestamp ); } } break; } } if ( true === $is_callable_update_meta_data ) { $order->update_meta_data( 'is_gift', 'yes' ); } else { update_post_meta( $order_id, 'is_gift', 'yes' ); } if ( ! empty( $schedule_gift_sending ) ) { if ( true === $is_callable_update_meta_data ) { $order->update_meta_data( 'wc_sc_schedule_gift_sending', $schedule_gift_sending ); } else { update_post_meta( $order_id, 'wc_sc_schedule_gift_sending', $schedule_gift_sending ); } } } else { if ( ! empty( $request_gift_receiver_email[0][0] ) && is_array( $request_gift_receiver_email[0][0] ) ) { unset( $request_gift_receiver_email[0][0] ); foreach ( $request_gift_receiver_email as $coupon_id => $emails ) { foreach ( $emails as $key => $email ) { $request_gift_receiver_email[ $coupon_id ][ $key ] = $request_billing_email; } } } if ( true === $is_callable_update_meta_data ) { $order->update_meta_data( 'is_gift', 'no' ); } else { update_post_meta( $order_id, 'is_gift', 'no' ); } } if ( true === $is_callable_update_meta_data ) { $order->update_meta_data( 'gift_receiver_email', $request_gift_receiver_email ); } else { update_post_meta( $order_id, 'gift_receiver_email', $request_gift_receiver_email ); } if ( $this->is_callable( $order, 'save' ) ) { $order->save(); } } } /** * Function to verify gift certificate form details */ public function verify_gift_certificate_receiver_details() { $post_gift_receiver_email = ( ! empty( $_POST['gift_receiver_email'] ) ) ? wc_clean( wp_unslash( $_POST['gift_receiver_email'] ) ) : array(); // phpcs:ignore $post_billing_email = ( ! empty( $_POST['billing_email'] ) ) ? wc_clean( wp_unslash( $_POST['billing_email'] ) ) : ''; // phpcs:ignore $is_gift = ( ! empty( $_POST['is_gift'] ) ) ? wc_clean( wp_unslash( $_POST['is_gift'] ) ) : ''; // phpcs:ignore $send_to = ( isset( $_POST['sc_send_to'] ) ) ? wc_clean( wp_unslash( $_POST['sc_send_to'] ) ) : ''; // phpcs:ignore if ( 'no' === $is_gift ) { return; } if ( empty( $post_gift_receiver_email ) || ! is_array( $post_gift_receiver_email ) ) { return; } $is_email_required = apply_filters( 'wc_sc_is_email_required_for_sending_coupon', $this->sc_get_option( 'wc_sc_is_email_required_for_sending_coupon', 'no' ), array( 'source' => $this ) ); if ( 'yes' === $is_gift && 'yes' === $is_email_required ) { if ( 'one' === $send_to ) { $gift_receiver_email_to_one = array( $post_gift_receiver_email[0], ); $post_gift_receiver_email = $gift_receiver_email_to_one; } elseif ( 'many' === $send_to ) { unset( $post_gift_receiver_email[0] ); } } foreach ( $post_gift_receiver_email as $key => $emails ) { if ( ! empty( $emails ) ) { foreach ( $emails as $index => $email ) { $placeholder = __( 'Email address', 'woocommerce-smart-coupons' ); $placeholder .= '...'; if ( empty( $email ) || $email === $placeholder ) { if ( 'yes' === $is_gift && 'yes' === $is_email_required ) { $this->sc_add_notice_for_gift_card_receiver_validation(); return; } $post_gift_receiver_email[ $key ][ $index ] = ( ! empty( $post_billing_email ) ) ? $post_billing_email : ''; } elseif ( ! empty( $email ) && ! is_email( $email ) ) { $this->sc_add_notice_for_gift_card_receiver_validation(); return; } } } } $_POST['gift_receiver_email'] = $post_gift_receiver_email; // phpcs:ignore } /** * Function will add notice if gift card receiver details are not verified. * * @return void */ public function sc_add_notice_for_gift_card_receiver_validation() { global $store_credit_label; if ( ! empty( $store_credit_label['singular'] ) ) { /* translators: %s: singular name for store credit */ wc_add_notice( sprintf( __( 'Error: %s Receiver’s E-mail address is invalid.', 'woocommerce-smart-coupons' ), ucwords( $store_credit_label['singular'] ) ), 'error' ); } else { wc_add_notice( __( 'Error: Gift Card Receiver’s E-mail address is invalid.', 'woocommerce-smart-coupons' ), 'error' ); } } /** * Function to save Smart Coupon's contribution in discount * * @param int $order_id The order id. */ public function smart_coupons_contribution( $order_id = 0 ) { $applied_coupons = ( is_object( WC()->cart ) && isset( WC()->cart->applied_coupons ) ) ? WC()->cart->applied_coupons : array(); if ( ! empty( $applied_coupons ) ) { $order_id = absint( $order_id ); $order = ( ! empty( $order_id ) ) ? wc_get_order( $order_id ) : null; foreach ( $applied_coupons as $code ) { $smart_coupon = new WC_Coupon( $code ); if ( $this->is_wc_gte_30() ) { $discount_type = $smart_coupon->get_discount_type(); } else { $discount_type = ( ! empty( $smart_coupon->discount_type ) ) ? $smart_coupon->discount_type : ''; } if ( 'smart_coupon' === $discount_type ) { $this->update_post_meta( $order_id, 'smart_coupons_contribution', WC()->cart->smart_coupon_credit_used, true, $order ); } } } } /** * Function to delete Smart Coupons contribution on removal of coupon */ public function delete_smart_coupons_contribution() { $post_action = ( ! empty( $_POST['action'] ) ) ? wc_clean( wp_unslash( $_POST['action'] ) ) : ''; // phpcs:ignore $post_order_id = ( ! empty( $_POST['order_id'] ) ) ? wc_clean( wp_unslash( $_POST['order_id'] ) ) : 0; // phpcs:ignore $post_coupon = ( ! empty( $_POST['coupon'] ) ) ? wc_clean( wp_unslash( $_POST['coupon'] ) ) : ''; // phpcs:ignore if ( 'woocommerce_remove_order_coupon' === $post_action && ! empty( $post_order_id ) && ! empty( $post_coupon ) ) { $order = wc_get_order( $post_order_id ); $smart_coupons_contribution = $this->get_post_meta( $post_order_id, 'smart_coupons_contribution', true, true ); if ( isset( $smart_coupons_contribution[ $post_coupon ] ) ) { unset( $smart_coupons_contribution[ $post_coupon ] ); $_POST['smart_coupon_removed'] = $post_coupon; if ( empty( $smart_coupons_contribution ) ) { $this->delete_post_meta( $post_order_id, 'smart_coupons_contribution', null, $order ); } else { $this->update_post_meta( $post_order_id, 'smart_coupons_contribution', $smart_coupons_contribution, true, $order ); } } $order_status = $order->get_status(); $pending_statuses = $this->get_pending_statuses(); if ( $order->has_status( $pending_statuses ) ) { $this->sa_restore_smart_coupon_amount( $post_order_id ); } } } /** * Function to update Store Credit / Gift Certificate balance * * @param int $order_id The order id. */ public function update_smart_coupon_balance( $order_id ) { $post_type = ( $this->is_hpos() && ! empty( $order_id ) ) ? $this->get_post_type( $order_id ) : ( ( ! empty( $_POST['post_type'] ) ) ? wc_clean( wp_unslash( $_POST['post_type'] ) ) : '' ); // phpcs:ignore if ( ( 'shop_order' === $post_type && ! empty( $_POST['action'] ) && in_array( wc_clean( wp_unslash( $_POST['action'] ) ), array( 'edit_order', 'editpost' ), true ) && !in_array( $_POST['post_status'] , array( 'draft','trash' ) ) ) // phpcs:ignore || ( ! empty( $_GET['action'] ) && in_array( $_GET['action'], array( 'woocommerce_mark_order_status', 'mark_on-hold', 'mark_processing', 'mark_completed' ), true ) ) // phpcs:ignore ) { return; } $order = wc_get_order( $order_id ); $order_used_coupons = $order->get_coupons(); if ( ! empty( $order_used_coupons ) ) { $smart_coupons_contribution = $this->get_post_meta( $order_id, 'smart_coupons_contribution', true, true ); if ( empty( $smart_coupons_contribution ) || ! is_array( $smart_coupons_contribution ) ) { $this->update_smart_coupon_balance_by_used_coupon( $order_id ); return; } foreach ( $order_used_coupons as $coupon_item ) { if ( $coupon_item->get_meta( 'sc_coupon_deduction_done' ) !== 'yes' ) { $coupon_item->add_meta_data( 'sc_coupon_deduction_done', 'yes', true ); $coupon_item->save(); $code = $coupon_item->get_code(); if ( array_key_exists( $code, $smart_coupons_contribution ) ) { $smart_coupon = new WC_Coupon( $code ); if ( $this->is_wc_gte_30() ) { if ( ! is_object( $smart_coupon ) ) { continue; } $coupon_id = ( is_callable( array( $smart_coupon, 'get_id' ) ) ) ? $smart_coupon->get_id() : 0; if ( empty( $coupon_id ) ) { $coupon_id = function_exists( 'wc_get_coupon_id_by_code' ) ? wc_get_coupon_id_by_code( $code ) : 0; if ( empty( $coupon_id ) ) { continue; } } $discount_type = ( is_callable( array( $smart_coupon, 'get_discount_type' ) ) ) ? $smart_coupon->get_discount_type() : ''; } else { $coupon_id = ( ! empty( $smart_coupon->id ) ) ? $smart_coupon->id : 0; $discount_type = ( ! empty( $smart_coupon->discount_type ) ) ? $smart_coupon->discount_type : ''; } if ( 'smart_coupon' === $discount_type ) { $coupon_amount = $this->get_amount( $smart_coupon, true, $order ); $credit_remaining = round( ( $coupon_amount - $smart_coupons_contribution[ $code ] ), get_option( 'woocommerce_price_num_decimals', 2 ) ); $credit_remaining = max( 0, $credit_remaining ); // Allow 3rd party plugin to modify the remaining balance of the store credit. $credit_remaining = apply_filters( 'wc_sc_credit_remaining', $credit_remaining, array( 'source' => $this, 'order_obj' => $order, 'coupon_obj' => $smart_coupon, ) ); $credit_remaining = ( $credit_remaining < 0 ) ? 0 : $credit_remaining; if ( $credit_remaining <= 0 && get_option( 'woocommerce_delete_smart_coupon_after_usage' ) === 'yes' ) { $this->update_post_meta( $coupon_id, 'coupon_amount', 0, true, $order ); wp_trash_post( $coupon_id ); } else { $this->update_post_meta( $coupon_id, 'coupon_amount', $credit_remaining, true, $order ); } } } } } } } /** * Update smart coupon balance by used coupon. * * @param int $order_id Integer. * @return void */ public function update_smart_coupon_balance_by_used_coupon( $order_id = 0 ) { if ( empty( $order_id ) ) { return; } $order = function_exists( 'wc_get_order' ) ? wc_get_order( $order_id ) : null; if ( ! is_object( $order ) || ! is_a( $order, 'WC_Order' ) ) { return; } $order_items = is_callable( array( $order, 'get_items' ) ) ? $order->get_items( 'coupon' ) : array(); if ( ! empty( $order_items ) ) { $item_titles = array_map( function( $item ) { return ( $this->is_callable( $item, 'get_name' ) ) ? $item->get_name() : ''; }, $order_items ); $posts = $this->get_post_by_title( $item_titles, OBJECT, 'shop_coupon' ); foreach ( $order_items as $item_id => $item ) { $coupon_code = ( $this->is_callable( $item, 'get_name' ) ) ? $item->get_name() : ''; $sanitized_coupon_code = sanitize_title( $coupon_code ); // The generated string will be checked in an array key to locate post object. $coupon_post_obj = ( ! empty( $posts[ $sanitized_coupon_code ] ) ) ? $posts[ $sanitized_coupon_code ] : null; $coupon_id = isset( $coupon_post_obj->ID ) ? $coupon_post_obj->ID : 0; $coupon_code = isset( $coupon_post_obj->post_title ) ? $coupon_post_obj->post_title : ''; $smart_coupon = new WC_Coupon( $coupon_id ); if ( is_a( $smart_coupon, 'WC_Coupon' ) ) { if ( $this->is_wc_gte_30() ) { if ( ! is_object( $smart_coupon ) || ! is_callable( array( $smart_coupon, 'get_id' ) ) ) { continue; } $coupon_id = $smart_coupon->get_id(); if ( empty( $coupon_id ) ) { $coupon_id = wc_get_coupon_id_by_code( $coupon_code ); if ( empty( $coupon_id ) ) { continue; } } $discount_type = is_callable( array( $smart_coupon, 'get_discount_type' ) ) ? $smart_coupon->get_discount_type() : ''; } else { $coupon_id = ( ! empty( $smart_coupon->id ) ) ? $smart_coupon->id : 0; $discount_type = ( ! empty( $smart_coupon->discount_type ) ) ? $smart_coupon->discount_type : ''; } if ( 'smart_coupon' === $discount_type ) { $coupon_amount = $this->get_amount( $smart_coupon ); $order_discount_amount = $this->get_order_item_meta( $item_id, 'discount_amount', true ); $order_discount_tax_amount = $this->get_order_item_meta( $item_id, 'discount_amount_tax', true ); $sc_include_tax = $this->is_store_credit_include_tax(); // Add discount on tax if it has been given on tax. if ( 'yes' === $sc_include_tax && ! empty( $order_discount_tax_amount ) ) { $order_discount_amount += $order_discount_tax_amount; } $credit_remaining = round( ( $coupon_amount - $order_discount_amount ), get_option( 'woocommerce_price_num_decimals', 2 ) ); // Allow 3rd party plugin to modify the remaining balance of the store credit. $credit_remaining = apply_filters( 'wc_sc_credit_remaining', $credit_remaining, array( 'source' => $this, 'order_obj' => $order, 'coupon_obj' => $smart_coupon, ) ); $credit_remaining = ( $credit_remaining < 0 ) ? 0 : $credit_remaining; if ( $credit_remaining <= 0 && get_option( 'woocommerce_delete_smart_coupon_after_usage' ) === 'yes' ) { $this->update_post_meta( $coupon_id, 'coupon_amount', 0 ); wp_trash_post( $coupon_id ); } else { $this->update_post_meta( $coupon_id, 'coupon_amount', $credit_remaining ); } } } } } } /** * Handle Coupon Process on 3rd party order statuses * * @param integer $order_id The order id. * @param string $old_status Old order status. * @param string $new_status New order status. */ public function handle_coupon_process_on_3rd_party_order_statuses( $order_id = 0, $old_status = '', $new_status = '' ) { if ( empty( $order_id ) ) { return; } $hooks_available_for_statuses = array( 'on-hold', 'pending', 'processing', 'completed', 'failed', 'refunded', 'cancelled' ); if ( in_array( $old_status, $hooks_available_for_statuses, true ) || in_array( $new_status, $hooks_available_for_statuses, true ) ) { return; } $paid_statuses = wc_get_is_paid_statuses(); $pending_statuses = wc_get_is_pending_statuses(); $return_statuses = apply_filters( 'wc_sc_return_order_statuses', array() ); if ( in_array( $new_status, $paid_statuses, true ) ) { $this->sa_add_coupons( $order_id ); $this->coupons_used( $order_id ); } if ( in_array( $new_status, $return_statuses, true ) ) { $this->sa_remove_coupons( $order_id ); } if ( in_array( $old_status, $paid_statuses, true ) && in_array( $new_status, $return_statuses, true ) ) { $this->sa_restore_smart_coupon_amount( $order_id ); } if ( in_array( $old_status, $pending_statuses, true ) && in_array( $new_status, $paid_statuses, true ) ) { $this->update_smart_coupon_balance( $order_id ); } if ( in_array( $old_status, $return_statuses, true ) && in_array( $new_status, $paid_statuses, true ) ) { $this->update_smart_coupon_balance( $order_id ); } } /** * Update discount details in PayPal args if store credit is applied * * @param array $args PayPal args. * @param WC_Order $order The order object. * * @return array $args Modified PayPal args */ public function modify_paypal_args( $args = array(), $order = null ) { global $store_credit_label; $apply_before_tax = get_option( 'woocommerce_smart_coupon_apply_before_tax', 'no' ); if ( 'yes' === $apply_before_tax ) { return $args; } $is_order_contains_store_credit = $this->is_order_contains_store_credit( $order ); if ( ! $is_order_contains_store_credit ) { return $args; } $discount_amount_cart = ( ! empty( $args['discount_amount_cart'] ) ) ? $args['discount_amount_cart'] : 0; if ( empty( $discount_amount_cart ) ) { return $args; } $item_total = 0; foreach ( $args as $key => $value ) { if ( strpos( $key, 'amount_' ) === 0 ) { $index = str_replace( 'amount_', '', $key ); $qty = ( ! empty( $args[ 'quantity_' . $index ] ) ) ? $args[ 'quantity_' . $index ] : 1; $item_total += ( $value * $qty ); } } if ( $discount_amount_cart > $item_total ) { $difference = $discount_amount_cart - $item_total; $args['discount_amount_cart'] = $item_total; if ( $this->is_wc_gte_30() ) { $order_id = ( is_object( $order ) && is_callable( array( $order, 'get_id' ) ) ) ? $order->get_id() : 0; } else { $order_id = ( ! empty( $order->id ) ) ? $order->id : 0; } if ( ! empty( $order_id ) && ! is_a( $order, 'WC_Order' ) ) { $order = wc_get_order( $order_id ); } $coupons = $order->get_items( 'coupon' ); $order_total = $order->get_total(); $order_note = array(); foreach ( $coupons as $item_id => $item ) { if ( empty( $difference ) ) { break; } $code = ( is_object( $item ) && is_callable( array( $item, 'get_name' ) ) ) ? $item->get_name() : trim( $item['name'] ); $coupon = new WC_Coupon( $code ); if ( $this->is_wc_gte_30() ) { $discount_type = $coupon->get_discount_type(); } else { $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; } $discount = ( is_object( $item ) && is_callable( array( $item, 'get_discount' ) ) ) ? $item->get_discount() : $item['discount_amount']; if ( 'smart_coupon' === $discount_type && ! empty( $discount ) ) { $new_discount = 0; $item_discount = $discount; $cut_amount = min( $difference, $item_discount ); $new_discount = $item_discount - $cut_amount; $difference -= $cut_amount; $item_args = array( 'discount_amount' => $new_discount, ); if ( $this->is_wc_gte_30() ) { $item = $order->get_item( $item_id ); if ( ! is_object( $item ) || ! is_callable( array( $item, 'get_id' ) ) ) { continue; } if ( ! is_object( $item ) || ! $item->is_type( 'coupon' ) ) { $discount_updated = false; } if ( ! $order->get_id() ) { $order->save(); // Order must exist. } // BW compatibility for old args. if ( isset( $item_args['discount_amount'] ) ) { $item_args['discount'] = $item_args['discount_amount']; } if ( isset( $item_args['discount_amount_tax'] ) ) { $item_args['discount_tax'] = $item_args['discount_amount_tax']; } unset( $item_args['discount_amount'] ); // deprecated offset. unset( $item_args['discount_amount_tax'] ); // deprecated offset. $item->set_order_id( $order->get_id() ); $item->set_props( $item_args ); $item->save(); do_action( 'woocommerce_order_update_coupon', $order->get_id(), $item->get_id(), $item_args ); $discount_updated = true; } else { $discount_updated = $order->update_coupon( $item_id, $item_args ); } if ( $discount_updated ) { $order_total += $cut_amount; $smart_coupons_contribution = $this->get_post_meta( $order_id, 'smart_coupons_contribution', true, true ); if ( empty( $smart_coupons_contribution ) || ! is_array( $smart_coupons_contribution ) ) { $smart_coupons_contribution = array(); } $smart_coupons_contribution[ $code ] = ( $this->is_wc_gte_30() ) ? $item_args['discount'] : $item_args['discount_amount']; $this->update_post_meta( $order_id, 'smart_coupons_contribution', $smart_coupons_contribution, true, $order ); if ( ! empty( $store_credit_label['singular'] ) ) { /* translators: 1. amount of store credit 2. store credit label 3. coupon code */ $order_note[] = sprintf( __( '%1$s worth of %2$s restored to coupon %3$s.', 'woocommerce-smart-coupons' ), '' . wc_price( $cut_amount ) . '', ucwords( $store_credit_label['singular'] ), '' . $code . '' ); } else { /* translators: 1. amount of store credit 2. coupon code */ $order_note[] = sprintf( __( '%1$s worth of Store Credit restored to coupon %2$s.', 'woocommerce-smart-coupons' ), '' . wc_price( $cut_amount ) . '', '' . $code . '' ); } } } } $order->set_total( $order_total, 'total' ); if ( ! empty( $order_note ) ) { /* translators: Order notes */ $note = sprintf( __( '%s Because PayPal doesn\'t accept discount on shipping & tax.', 'woocommerce-smart-coupons' ), implode( ', ', $order_note ) ); $order->add_order_note( $note ); if ( ! wc_has_notice( $note ) ) { wc_add_notice( $note ); } } } return $args; } /** * Function to track whether coupon is used or not * * @param int $order_id The order id. */ public function coupons_used( $order_id ) { $order = wc_get_order( $order_id ); $email = ( $this->is_callable( $order, 'get_meta' ) ) ? $order->get_meta( 'gift_receiver_email' ) : get_post_meta( $order_id, 'gift_receiver_email', true ); $used_coupons = $this->get_coupon_codes( $order ); if ( ! empty( $used_coupons ) ) { $this->update_coupons( $used_coupons, $email, '', 'remove' ); } } /** * Function to update details related to coupons * * @param array $coupon_titles The coupon codes. * @param mixed $email Email addresses. * @param array $product_ids Array of product ids. * @param string $operation Operation to perform. * @param array $order_item The order item. * @param array $gift_certificate_receiver Array of gift receiver emails. * @param array $gift_certificate_receiver_name Array of gift receiver name. * @param string $message_from_sender The message from sender. * @param string $gift_certificate_sender_name Name of the sender. * @param string $gift_certificate_sender_email Email address of the sender. * @param int $order_id The order id. */ public function update_coupons( $coupon_titles = array(), $email = array(), $product_ids = '', $operation = '', $order_item = null, $gift_certificate_receiver = false, $gift_certificate_receiver_name = '', $message_from_sender = '', $gift_certificate_sender_name = '', $gift_certificate_sender_email = '', $order_id = '' ) { global $smart_coupon_codes; $order = null; $temp_gift_card_receivers_emails = array(); if ( ! empty( $order_id ) ) { $order = wc_get_order( $order_id ); if ( $this->is_callable( $order, 'get_meta' ) ) { $receivers_messages = $order->get_meta( 'gift_receiver_message' ); $temp_gift_card_receivers_emails = $order->get_meta( 'temp_gift_card_receivers_emails' ); $schedule_gift_sending = $order->get_meta( 'wc_sc_schedule_gift_sending' ); $sending_timestamps = $order->get_meta( 'gift_sending_timestamp' ); } else { $receivers_messages = get_post_meta( $order_id, 'gift_receiver_message', true ); $temp_gift_card_receivers_emails = get_post_meta( $order_id, 'temp_gift_card_receivers_emails', true ); $schedule_gift_sending = get_post_meta( $order_id, 'wc_sc_schedule_gift_sending', true ); $sending_timestamps = get_post_meta( $order_id, 'gift_sending_timestamp', true ); } } if ( ! is_a( $order, 'WC_Order' ) ) { $order = ( is_object( $order_item ) && is_callable( array( $order_item, 'get_order' ) ) ) ? $order_item->get_order() : null; } $prices_include_tax = ( get_option( 'woocommerce_prices_include_tax' ) === 'yes' ) ? true : false; if ( ! empty( $coupon_titles ) ) { if ( $this->is_wc_gte_30() ) { $item_qty = ( ! empty( $order_item ) && is_callable( array( $order_item, 'get_quantity' ) ) ) ? $order_item->get_quantity() : 1; $item_total = ( ! empty( $order_item ) && is_callable( array( $order_item, 'get_total' ) ) ) ? $order_item->get_total() : 0; $item_tax = ( ! empty( $order_item ) && is_callable( array( $order_item, 'get_total_tax' ) ) ) ? $order_item->get_total_tax() : 0; $item_product = ( ! empty( $order_item ) && is_callable( array( $order_item, 'get_product' ) ) ) ? $order_item->get_product() : null; } else { $item_qty = ( ! empty( $order_item['qty'] ) ) ? $order_item['qty'] : 1; $item_total = ( ! empty( $order_item['line_total'] ) ) ? $order_item['line_total'] : 0; $item_tax = ( ! empty( $order_item['line_tax'] ) ) ? $order_item['line_tax'] : 0; $item_product = null; } $item_sc_called_credit = ( is_a( $order_item, 'WC_Order_Item' ) ) ? $this->get_meta( $order_item, 'sc_called_credit' ) : ''; $qty = ( ! empty( $item_qty ) ) ? $item_qty : 1; foreach ( $coupon_titles as $coupon_title ) { $coupon = new WC_Coupon( $coupon_title ); $is_callable_coupon_get_meta = $this->is_callable( $coupon, 'get_meta' ); if ( $this->is_wc_gte_30() ) { if ( ! is_object( $coupon ) || ! is_callable( array( $coupon, 'get_id' ) ) ) { continue; } $coupon_id = $coupon->get_id(); if ( empty( $coupon_id ) ) { continue; } $is_free_shipping = ( $coupon->get_free_shipping() ) ? 'yes' : 'no'; $discount_type = $coupon->get_discount_type(); $coupon_code = $coupon->get_code(); $coupon_amount = ( $this->is_callable( $coupon, 'get_amount' ) ) ? $coupon->get_amount() : 0; } else { $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; $is_free_shipping = ( ! empty( $coupon->free_shipping ) ) ? $coupon->free_shipping : ''; $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; $coupon_amount = ( ! empty( $coupon->amount ) ) ? $coupon->amount : 0; } $auto_generation_of_code = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_meta( 'auto_generate_coupon' ) : get_post_meta( $coupon_id, 'auto_generate_coupon', true ); if ( ! empty( $item_sc_called_credit ) && 'smart_coupon' === $discount_type ) { continue; // because it is already processed. } $email_id = ( 'yes' === $auto_generation_of_code && 'smart_coupon' !== $discount_type && ! empty( $temp_gift_card_receivers_emails[ $coupon_id ][0] ) ) ? $temp_gift_card_receivers_emails[ $coupon_id ][0] : $gift_certificate_sender_email; if ( ( 'yes' === $auto_generation_of_code || 'smart_coupon' === $discount_type ) && 'add' === $operation ) { $is_pick_price_of_product = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_meta( 'is_pick_price_of_product' ) : get_post_meta( $coupon_id, 'is_pick_price_of_product', true ); if ( 'yes' === $is_pick_price_of_product && 'smart_coupon' === $discount_type ) { $amount = 0; $sell_sc_at_less_price = get_option( 'smart_coupons_sell_store_credit_at_less_price', 'no' ); if ( is_object( $order_item ) && is_a( $order_item, 'WC_Order_Item_Product' ) ) { $subtotal = ( is_callable( array( $order_item, 'get_subtotal' ) ) ) ? $order_item->get_subtotal() : 0; $subtotal_tax = ( is_callable( array( $order_item, 'get_subtotal_tax' ) ) ) ? $order_item->get_subtotal_tax() : 0; $amount = $subtotal + $subtotal_tax; $amount = round( $amount, get_option( 'woocommerce_price_num_decimals', 2 ) ); } if ( 'yes' === $sell_sc_at_less_price ) { $args = array( 'qty' => $qty, 'price' => ( is_object( $item_product ) && is_callable( array( $item_product, 'get_regular_price' ) ) ) ? $item_product->get_regular_price() : '', ); if ( ! $prices_include_tax ) { $products_price = function_exists( 'wc_get_price_excluding_tax' ) ? wc_get_price_excluding_tax( $item_product, $args ) : $item_total; } else { $products_price = function_exists( 'wc_get_price_including_tax' ) ? wc_get_price_including_tax( $item_product, $args ) : $item_total + $item_tax; } } else { $products_price = ( ! $prices_include_tax ) ? $item_total : $item_total + $item_tax; } $amount = ( empty( $products_price ) ) ? $amount : $products_price; $amount = $amount / $qty; $amount = apply_filters( 'wc_sc_auto_generated_coupon_pick_price_of_product', $amount, array( 'calculated_product_price' => $amount, 'order_item' => $order_item, ) ); } else { if ( false === stripos( $discount_type, 'percent' ) ) { $coupon_amount = $this->write_price( $coupon_amount, true, $order ); } $amount = $coupon_amount; } if ( ! empty( $temp_gift_card_receivers_emails ) ) { $email = $temp_gift_card_receivers_emails; } $is_auto_generate = $amount > 0 || 'yes' === $is_free_shipping; $is_auto_generate = apply_filters( 'wc_sc_is_auto_generate', $is_auto_generate, array( 'coupon_id' => $coupon_id, 'auto_generate' => $auto_generation_of_code, 'coupon_obj' => $coupon, 'coupon_amount' => $amount, 'current_receiver' => $email_id, 'receiver_email_ids' => $email, 'receivers_messages' => $receivers_messages, 'order_id' => $order_id, 'order_item' => $order_item, ) ); if ( $is_auto_generate ) { $message_index = ( ! empty( $email[ $coupon_id ] ) && is_array( $email[ $coupon_id ] ) ) ? array_search( $email_id, $email[ $coupon_id ], true ) : false; if ( false !== $message_index && isset( $receivers_messages[ $coupon_id ][ $message_index ] ) && ! empty( $receivers_messages[ $coupon_id ][ $message_index ] ) ) { $message_from_sender = $receivers_messages[ $coupon_id ][ $message_index ]; unset( $email[ $coupon_id ][ $message_index ] ); $this->update_post_meta( $order_id, 'temp_gift_card_receivers_emails', $email, false, $order ); } else { $message_from_sender = ''; } if ( false !== $message_index && isset( $sending_timestamps[ $coupon_id ][ $message_index ] ) && ! empty( $sending_timestamps[ $coupon_id ][ $message_index ] ) ) { $sending_timestamp = $sending_timestamps[ $coupon_id ][ $message_index ]; } else { $sending_timestamp = ''; } for ( $i = 0; $i < $qty; $i++ ) { if ( 'yes' === $auto_generation_of_code || 'smart_coupon' === $discount_type ) { $email_id = ! empty( $temp_gift_card_receivers_emails[ $coupon_id ][ $i ] ) ? $temp_gift_card_receivers_emails[ $coupon_id ][ $i ] : $gift_certificate_sender_email; if ( isset( $receivers_messages[ $coupon_id ][ $i ] ) && ! empty( $receivers_messages[ $coupon_id ][ $i ] ) ) { $message_from_sender = $receivers_messages[ $coupon_id ][ $i ]; unset( $email[ $coupon_id ][ $i ] ); $this->update_post_meta( $order_id, 'temp_gift_card_receivers_emails', $email, false, $order ); } else { $message_from_sender = ''; } if ( isset( $sending_timestamps[ $coupon_id ][ $i ] ) && ! empty( $sending_timestamps[ $coupon_id ][ $i ] ) ) { $sending_timestamp = $sending_timestamps[ $coupon_id ][ $i ]; } else { $sending_timestamp = ''; } $this->generate_smart_coupon( $email_id, $amount, $order_id, $coupon, $discount_type, $gift_certificate_receiver_name, $message_from_sender, $gift_certificate_sender_name, $gift_certificate_sender_email, $sending_timestamp ); $smart_coupon_codes = array(); } } } } else { $coupon_receiver_email = ( ! empty( $temp_gift_card_receivers_emails[ $coupon_id ][0] ) ) ? $temp_gift_card_receivers_emails[ $coupon_id ][0] : $gift_certificate_sender_email; $sc_disable_email_restriction = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_meta( 'sc_disable_email_restriction' ) : get_post_meta( $coupon_id, 'sc_disable_email_restriction', true ); $is_update_email_restrictions = false; if ( ( 'no' === $sc_disable_email_restriction || empty( $sc_disable_email_restriction ) ) ) { $old_customers_email_ids = ( $this->is_callable( $coupon, 'get_email_restrictions' ) ) ? (array) maybe_unserialize( $coupon->get_email_restrictions() ) : (array) maybe_unserialize( get_post_meta( $coupon_id, 'customer_email', true ) ); } if ( 'add' === $operation && 'yes' !== $auto_generation_of_code && 'smart_coupon' !== $discount_type ) { $message_index = ( ! empty( $temp_gift_card_receivers_emails[ $coupon_id ] ) && is_array( $temp_gift_card_receivers_emails[ $coupon_id ] ) ) ? array_search( $email_id, $temp_gift_card_receivers_emails[ $coupon_id ], true ) : false; if ( false !== $message_index && isset( $receivers_messages[ $coupon_id ][ $message_index ] ) && ! empty( $receivers_messages[ $coupon_id ][ $message_index ] ) ) { $message_from_sender = $receivers_messages[ $coupon_id ][ $message_index ]; unset( $temp_gift_card_receivers_emails[ $coupon_id ][ $message_index ] ); $this->update_post_meta( $order_id, 'temp_gift_card_receivers_emails', $temp_gift_card_receivers_emails, false, $order ); } else { $message_from_sender = ''; } if ( false !== $message_index && isset( $sending_timestamps[ $coupon_id ][ $message_index ] ) && ! empty( $sending_timestamps[ $coupon_id ][ $message_index ] ) ) { $sending_timestamp = $sending_timestamps[ $coupon_id ][ $message_index ]; } else { $sending_timestamp = ''; } for ( $i = 0; $i < $qty; $i++ ) { $coupon_receiver_email = ( ! empty( $temp_gift_card_receivers_emails[ $coupon_id ][ $i ] ) ) ? $temp_gift_card_receivers_emails[ $coupon_id ][ $i ] : $coupon_receiver_email; $message_from_sender = ( ! empty( $receivers_messages[ $coupon_id ][ $i ] ) ) ? $receivers_messages[ $coupon_id ][ $i ] : ''; $sending_timestamp = ( ! empty( $sending_timestamps[ $coupon_id ][ $i ] ) ) ? $sending_timestamps[ $coupon_id ][ $i ] : ''; if ( false === stripos( $discount_type, 'percent' ) ) { $coupon_amount = $this->write_price( $coupon_amount, true, $order ); } $coupon_details = array( $coupon_receiver_email => array( 'parent' => $coupon_id, 'code' => $coupon_title, 'amount' => $coupon_amount, ), ); $receiver_name = ''; if ( 'yes' === $schedule_gift_sending && $this->is_valid_timestamp( $sending_timestamp ) ) { $sender_message_index_key = ( ! empty( $receivers_messages[ $coupon_id ][ $i ] ) ) ? $coupon_id . ':' . $i : ''; $action_args = array( 'auto_generate' => 'no', 'coupon_id' => $coupon_id, 'parent_id' => $coupon_id, // Parent coupon id. 'order_id' => $order_id, 'receiver_email' => $coupon_receiver_email, 'message_index_key' => $sender_message_index_key, 'ref_key' => uniqid(), // A unique timestamp key to relate action schedulers with their coupons. ); $is_scheduled = $this->schedule_coupon_email( $action_args, $sending_timestamp ); if ( ! $is_scheduled ) { /* translators: 1. Receiver email 2. Coupon code 3. Order id */ $this->log( 'error', sprintf( __( 'Failed to schedule email to "%1$s" for coupon "%2$s" received from order #%3$s.', 'woocommerce-smart-coupons' ), $coupon_receiver_email, $coupon_title, $order_id ) ); } } else { $this->sa_email_coupon( $coupon_details, $discount_type, $order_id, $receiver_name, $message_from_sender ); } } if ( $qty > 0 && ( 'no' === $sc_disable_email_restriction || empty( $sc_disable_email_restriction ) ) ) { for ( $i = 0; $i < $qty; $i++ ) { $sending_timestamp = ( ! empty( $sending_timestamps[ $coupon_id ][ $i ] ) ) ? $sending_timestamps[ $coupon_id ][ $i ] : ''; // Add receiver email to coupon only if it is not scheduled otherwise it would be added by action scheduler later on. if ( ! ( 'yes' === $schedule_gift_sending && $this->is_valid_timestamp( $sending_timestamp ) ) ) { $old_customers_email_ids[] = $coupon_receiver_email; $is_update_email_restrictions = true; } } } } elseif ( 'remove' === $operation && 'smart_coupon' !== $discount_type && ( 'no' === $sc_disable_email_restriction || empty( $sc_disable_email_restriction ) ) ) { $key = array_search( $coupon_receiver_email, $old_customers_email_ids, true ); if ( false !== $key ) { unset( $old_customers_email_ids[ $key ] ); $is_update_email_restrictions = true; } } if ( ( 'no' === $sc_disable_email_restriction || empty( $sc_disable_email_restriction ) ) && true === $is_update_email_restrictions ) { if ( $this->is_callable( $coupon, 'set_defaults' ) && $this->is_callable( $coupon, 'set_email_restrictions' ) && $this->is_callable( $coupon, 'save' ) ) { $coupon->set_defaults(); // This is to make sure that no other changes done to $coupon will be saved. Because this functionality is only to update 'email_restrictions'. $coupon->set_object_read( true ); $coupon->set_email_restrictions( $old_customers_email_ids ); $coupon->save(); } else { update_post_meta( $coupon_id, 'customer_email', $old_customers_email_ids ); } } } } } } /** * Get receiver's email addresses * * @param array $coupon_details The coupon details. * @param string $gift_certificate_sender_email Sender email address. * @return array $receivers_email Array of receiver's email */ public function get_receivers_detail( $coupon_details = array(), $gift_certificate_sender_email = '' ) { if ( count( $coupon_details ) <= 0 ) { return 0; } $all_discount_types = wc_get_coupon_types(); $receivers_email = array(); foreach ( $coupon_details as $coupon_id => $emails ) { $discount_type = ( ! empty( $coupon_id ) ) ? $this->get_post_meta( $coupon_id, 'discount_type', true ) : 'fixed_cart'; if ( ! empty( $discount_type ) && array_key_exists( $discount_type, $all_discount_types ) ) { $receivers_email = array_merge( $receivers_email, array_diff( $emails, array( $gift_certificate_sender_email ) ) ); } } return $receivers_email; } /** * Function to process coupons based on change in order status * * @param int $order_id The order id. * @param string $operation Operation. */ public function process_coupons( $order_id, $operation ) { global $smart_coupon_codes, $woocommerce_smart_coupon; $smart_coupon_codes = array(); $message_from_sender = ''; $sending_timestamp = ''; $order = wc_get_order( $order_id ); $is_callable_order_get_meta = $this->is_callable( $order, 'get_meta' ); if ( true === $is_callable_order_get_meta ) { $receivers_emails = $order->get_meta( 'gift_receiver_email' ); $receivers_messages = $order->get_meta( 'gift_receiver_message' ); $sending_timestamps = $order->get_meta( 'gift_sending_timestamp' ); $is_coupon_sent = $order->get_meta( 'coupon_sent' ); } else { $receivers_emails = get_post_meta( $order_id, 'gift_receiver_email', true ); $receivers_messages = get_post_meta( $order_id, 'gift_receiver_message', true ); $sending_timestamps = get_post_meta( $order_id, 'gift_sending_timestamp', true ); $is_coupon_sent = get_post_meta( $order_id, 'coupon_sent', true ); } $is_send_email = $this->is_email_template_enabled(); if ( 'yes' === $is_coupon_sent ) { return; } $order_items = ( is_object( $order ) && is_callable( array( $order, 'get_items' ) ) ) ? $order->get_items() : array(); $receivers_data = $receivers_emails; $sc_called_credit_details = $this->get_post_meta( $order_id, 'sc_called_credit_details', true, false, $order ); if ( count( $order_items ) <= 0 ) { return; } if ( $this->is_wc_gte_30() ) { $order_billing_email = ( is_object( $order ) && is_callable( array( $order, 'get_billing_email' ) ) ) ? $order->get_billing_email() : ''; $order_billing_first_name = ( is_object( $order ) && is_callable( array( $order, 'get_billing_first_name' ) ) ) ? $order->get_billing_first_name() : ''; $order_billing_last_name = ( is_object( $order ) && is_callable( array( $order, 'get_billing_last_name' ) ) ) ? $order->get_billing_last_name() : ''; } else { $order_billing_email = ( ! empty( $order->billing_email ) ) ? $order->billing_email : ''; $order_billing_first_name = ( ! empty( $order->billing_first_name ) ) ? $order->billing_first_name : ''; $order_billing_last_name = ( ! empty( $order->billing_last_name ) ) ? $order->billing_last_name : ''; } if ( is_array( $receivers_emails ) && ! empty( $receivers_emails ) ) { foreach ( $receivers_emails as $coupon_id => $emails ) { foreach ( $emails as $key => $email ) { if ( empty( $email ) ) { $email = $order_billing_email; $receivers_emails[ $coupon_id ][ $key ] = $email; } } } if ( count( $receivers_emails ) > 1 && isset( $receivers_emails[0][0] ) ) { unset( $receivers_emails[0] ); // Disable sending to one customer. } $email = $receivers_emails; } else { $email = ''; } $receivers_emails_list = $receivers_emails; if ( ! empty( $email ) ) { $this->update_post_meta( $order_id, 'temp_gift_card_receivers_emails', $email, false, $order ); } $gift_certificate_receiver = true; $gift_certificate_sender_name = $order_billing_first_name . ' ' . $order_billing_last_name; $gift_certificate_sender_email = $order_billing_email; $gift_certificate_receiver_name = ''; $receivers_detail = array(); $email_to_credit = array(); $receiver_count = 0; if ( is_array( $sc_called_credit_details ) && count( $sc_called_credit_details ) > 0 && 'add' === $operation ) { foreach ( $order_items as $item_id => $item ) { $product = ( is_object( $item ) && is_callable( array( $item, 'get_product' ) ) ) ? $item->get_product() : $order->get_product_from_item( $item ); $item_qty = ( is_object( $item ) && is_callable( array( $item, 'get_quantity' ) ) ) ? $item->get_quantity() : $item['qty']; if ( $this->is_wc_gte_30() ) { $product_type = ( is_object( $product ) && is_callable( array( $product, 'get_type' ) ) ) ? $product->get_type() : ''; $product_id = ( in_array( $product_type, array( 'variable', 'variable-subscription', 'variation', 'subscription_variation' ), true ) ) ? ( ( is_object( $product ) && is_callable( array( $product, 'get_parent_id' ) ) ) ? $product->get_parent_id() : 0 ) : ( ( is_object( $product ) && is_callable( array( $product, 'get_id' ) ) ) ? $product->get_id() : 0 ); } else { $product_id = ( ! empty( $product->id ) ) ? $product->id : 0; } $coupon_titles = $this->get_coupon_titles( array( 'product_object' => $product ) ); if ( $coupon_titles ) { foreach ( $coupon_titles as $coupon_title ) { $coupon = new WC_Coupon( $coupon_title ); if ( $this->is_wc_gte_30() ) { if ( ! is_object( $coupon ) || ! is_callable( array( $coupon, 'get_id' ) ) ) { continue; } $coupon_id = $coupon->get_id(); if ( empty( $coupon_id ) ) { continue; } } else { $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; } $coupon_amount = $this->get_amount( $coupon, true, $order ); if ( ! isset( $receivers_emails[ $coupon_id ] ) ) { continue; } for ( $i = 0; $i < $item_qty; $i++ ) { if ( isset( $receivers_emails[ $coupon_id ][0] ) ) { if ( ! isset( $email_to_credit[ $receivers_emails[ $coupon_id ][0] ] ) ) { $email_to_credit[ $receivers_emails[ $coupon_id ][0] ] = array(); } if ( isset( $sc_called_credit_details[ $item_id ] ) && ! empty( $sc_called_credit_details[ $item_id ] ) ) { if ( $this->is_coupon_amount_pick_from_product_price( array( $coupon_title ) ) ) { $credit_price = $sc_called_credit_details[ $item_id ]; // Allow 3rd party plugins to modify the amount before generating credit. $credit_price = apply_filters( 'wc_sc_credit_called_price_order', $credit_price, array( 'source' => $this, 'item_id' => $item_id, 'order_obj' => $order, ) ); $email_to_credit[ $receivers_emails[ $coupon_id ][0] ][] = $coupon_id . ':' . $credit_price; } else { $email_to_credit[ $receivers_emails[ $coupon_id ][0] ][] = $coupon_id . ':' . $coupon_amount; } unset( $receivers_emails[ $coupon_id ][0] ); $receivers_emails[ $coupon_id ] = array_values( $receivers_emails[ $coupon_id ] ); } } } } } if ( $this->is_coupon_amount_pick_from_product_price( $coupon_titles ) && is_object( $product ) && is_callable( array( $product, 'get_price' ) ) && $product->get_price() >= 0 ) { $sc_called_credit = ( ! empty( $sc_called_credit_details[ $item_id ] ) ) ? $sc_called_credit_details[ $item_id ] : ''; $woocommerce_smart_coupon->update_meta_data( $item, 'sc_called_credit', $sc_called_credit ); } } } if ( ! empty( $email_to_credit ) && count( $email_to_credit ) > 0 ) { $update_temp_email = false; $temp_email = $email; foreach ( $email_to_credit as $email_id => $credits ) { $email_to_credit[ $email_id ] = array_count_values( $credits ); foreach ( $email_to_credit[ $email_id ] as $coupon_credit => $qty ) { $coupon_details = explode( ':', $coupon_credit ); $coupon_title = get_the_title( $coupon_details[0] ); $coupon = new WC_Coupon( $coupon_title ); $credit_amount = $coupon_details[1]; if ( $this->is_wc_gte_30() ) { if ( ! is_object( $coupon ) || ! is_callable( array( $coupon, 'get_id' ) ) ) { continue; } $coupon_id = $coupon->get_id(); if ( empty( $coupon_id ) ) { continue; } $discount_type = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_discount_type' ) ) ) ? $coupon->get_discount_type() : ''; } else { $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; } for ( $i = 0; $i < $qty; $i++ ) { if ( 'smart_coupon' !== $discount_type ) { continue; // only process smart_coupon here, rest coupon will be processed by function update_coupon. } $message_index = array_search( $email_id, $temp_email[ $coupon_id ], true ); if ( false !== $message_index ) { $temp_email[ $coupon_id ][ $message_index ] = ''; // Empty value at found index so that we don't get same index in next loop run. } if ( false !== $message_index && isset( $receivers_messages[ $coupon_id ][ $message_index ] ) && ! empty( $receivers_messages[ $coupon_id ][ $message_index ] ) ) { $message_from_sender = $receivers_messages[ $coupon_id ][ $message_index ]; } else { $message_from_sender = ''; } if ( false !== $message_index && isset( $sending_timestamps[ $coupon_id ][ $message_index ] ) && ! empty( $sending_timestamps[ $coupon_id ][ $message_index ] ) ) { $sending_timestamp = $sending_timestamps[ $coupon_id ][ $message_index ]; } else { $sending_timestamp = ''; } $this->generate_smart_coupon( $email_id, $credit_amount, $order_id, $coupon, 'smart_coupon', $gift_certificate_receiver_name, $message_from_sender, $gift_certificate_sender_name, $gift_certificate_sender_email, $sending_timestamp ); $smart_coupon_codes = array(); } } } foreach ( $email_to_credit as $email => $coupon_detail ) { if ( $email === $gift_certificate_sender_email ) { continue; } $receiver_count += count( $coupon_detail ); } } $order = wc_get_order( $order_id ); // Refresh order object to get latest updates in the order object. if ( count( $order_items ) > 0 ) { $flag = false; foreach ( $order_items as $item_id => $item ) { $product = ( is_object( $item ) && is_callable( array( $item, 'get_product' ) ) ) ? $item->get_product() : ( ( is_object( $order ) && is_callable( array( $order, 'get_product_from_item' ) ) ) ? $order->get_product_from_item( $item ) : new stdClass() ); if ( $this->is_wc_gte_30() ) { $product_type = ( is_object( $product ) && is_callable( array( $product, 'get_type' ) ) ) ? $product->get_type() : ''; $product_id = ( in_array( $product_type, array( 'variable', 'variable-subscription', 'variation', 'subscription_variation' ), true ) ) ? ( ( is_object( $product ) && is_callable( array( $product, 'get_parent_id' ) ) ) ? $product->get_parent_id() : 0 ) : ( ( is_object( $product ) && is_callable( array( $product, 'get_id' ) ) ) ? $product->get_id() : 0 ); } else { $product_id = ( ! empty( $product->id ) ) ? $product->id : 0; } $coupon_titles = $this->get_coupon_titles( array( 'product_object' => $product ) ); if ( $coupon_titles ) { $flag = true; if ( $this->is_coupon_amount_pick_from_product_price( $coupon_titles ) && is_object( $product ) && is_callable( array( $product, 'get_price' ) ) && $product->get_price() >= 0 ) { $sc_called_credit = ( ! empty( $sc_called_credit_details[ $item_id ] ) ) ? $sc_called_credit_details[ $item_id ] : ''; $woocommerce_smart_coupon->update_meta_data( $item, 'sc_called_credit', $sc_called_credit ); } $this->update_coupons( $coupon_titles, $email, '', $operation, $item, $gift_certificate_receiver, $gift_certificate_receiver_name, $message_from_sender, $gift_certificate_sender_name, $gift_certificate_sender_email, $order_id ); if ( 'add' === $operation && ! empty( $receivers_emails_list ) ) { $receivers_detail += $this->get_receivers_detail( $receivers_emails_list, $gift_certificate_sender_email ); } } } $order = wc_get_order( $order_id ); // Refresh order object to get latest updates in the order object. if ( $flag && 'add' === $operation ) { $combine_emails = $this->is_email_template_enabled( 'combine' ); if ( 'yes' === $is_send_email && 'yes' === $combine_emails ) { $coupon_receiver_details = ( true === $is_callable_order_get_meta ) ? $order->get_meta( 'sc_coupon_receiver_details' ) : get_post_meta( $order_id, 'sc_coupon_receiver_details', true ); if ( is_array( $coupon_receiver_details ) && ! empty( $coupon_receiver_details ) ) { $combined_coupon_receiver_details = array(); foreach ( $coupon_receiver_details as $receiver_detail ) { $receiver_email = $receiver_detail['email']; if ( ! isset( $combined_coupon_receiver_details[ $receiver_email ] ) || ! is_array( $combined_coupon_receiver_details[ $receiver_email ] ) ) { $combined_coupon_receiver_details[ $receiver_email ] = array(); } $combined_coupon_receiver_details[ $receiver_email ][] = array( 'code' => $receiver_detail['code'], 'message' => $receiver_detail['message'], ); } if ( ! empty( $combined_coupon_receiver_details ) ) { foreach ( $combined_coupon_receiver_details as $combined_receiver_email => $combined_receiver_details ) { $this->send_combined_coupon_email( $combined_receiver_email, $combined_receiver_details, $order_id, $gift_certificate_sender_name, $gift_certificate_sender_email ); } } } } $this->update_post_meta( $order_id, 'coupon_sent', 'yes', false, $order ); // to know whether coupon has sent or not. } } $email_scheduled_details = array(); // Assign scheduled timestamps to each user's email. if ( ! empty( $receivers_data ) && is_array( $receivers_data ) && ! empty( $sending_timestamps ) ) { foreach ( $receivers_data as $coupon_id => $receivers ) { $scheduled_timestamp = ! empty( $sending_timestamps[ $coupon_id ] ) ? $sending_timestamps[ $coupon_id ] : ''; // Get the receivers by coupon codes. if ( ! empty( $scheduled_timestamp ) && is_array( $receivers ) && ! empty( $receivers ) ) { foreach ( $receivers as $key => $receiver_email ) { $before_timestamps = ! empty( $email_scheduled_details[ $receiver_email ] ) ? $email_scheduled_details[ $receiver_email ] : ''; $timestamps = ! empty( $scheduled_timestamp[ $key ] ) ? array( $scheduled_timestamp[ $key ] ) : array(); $email_scheduled_details[ $receiver_email ] = ! empty( $before_timestamps ) && is_array( $before_timestamps ) ? array_merge( $before_timestamps, $timestamps ) : $timestamps; } } } } if ( 'yes' === $is_send_email && ( count( $receivers_detail ) + $receiver_count ) > 0 ) { $current_filter = current_filter(); $order_actions_to_ignore_for_email = $this->order_actions_to_ignore_for_email(); if ( ! in_array( $current_filter, $order_actions_to_ignore_for_email, true ) ) { WC()->mailer(); $contains_core_coupons = false; if ( ! empty( $receivers_emails_list ) ) { $coupon_ids_to_be_sent = array_keys( $receivers_emails_list ); if ( ! empty( $coupon_ids_to_be_sent ) ) { foreach ( $coupon_ids_to_be_sent as $coupon_id ) { $discount_type = ( ! empty( $coupon_id ) ) ? $this->get_post_meta( $coupon_id, 'discount_type', true ) : 'fixed_cart'; if ( ! empty( $discount_type ) && 'smart_coupon' !== $discount_type ) { $contains_core_coupons = true; break; } } } } $action_args = apply_filters( 'wc_sc_acknowledgement_email_notification_args', array( 'email' => $gift_certificate_sender_email, 'order_id' => $order_id, 'receivers_detail' => $receivers_detail, 'receiver_name' => $gift_certificate_receiver_name, 'receiver_count' => count( $receivers_detail ), 'scheduled_email' => array_filter( $email_scheduled_details ), 'contains_core_coupons' => ( true === $contains_core_coupons ) ? 'yes' : 'no', ) ); // Trigger email notification. do_action( 'wc_sc_acknowledgement_email_notification', $action_args ); } } if ( 'add' === $operation ) { $this->delete_post_meta( $order_id, 'temp_gift_card_receivers_emails', null, $order ); } unset( $smart_coupon_codes ); } /** * Whether to auto generate coupon or not * * @param int $order_id The order id. * @return boolean */ public function should_coupon_auto_generate( $order_id = 0 ) { $should_auto_generate = true; $valid_order_statuses = get_option( 'wc_sc_valid_order_statuses_for_coupon_auto_generation', wc_get_is_paid_statuses() ); if ( ! empty( $valid_order_statuses ) ) { $valid_order_statuses = apply_filters( 'wc_sc_valid_order_statuses_for_coupon_auto_generation', $valid_order_statuses, $order_id ); if ( ! empty( $valid_order_statuses ) ) { $order = wc_get_order( $order_id ); $order_status = $order->get_status(); if ( ! in_array( $order_status, $valid_order_statuses, true ) ) { $should_auto_generate = false; } } } return apply_filters( 'wc_sc_should_coupon_auto_generate', $should_auto_generate, array( 'source' => $this, 'order_id' => $order_id, ) ); } /** * Function to add details to coupons * * @param int $order_id The order id. */ public function sa_add_coupons( $order_id ) { if ( ! $this->should_coupon_auto_generate( $order_id ) ) { return; } $this->process_coupons( $order_id, 'add' ); } /** * Function to remove details from coupons * * @param int $order_id The order id. */ public function sa_remove_coupons( $order_id ) { $this->process_coupons( $order_id, 'remove' ); } /** * Function to Restore Smart Coupon Amount back, when an order which was created using this coupon, is refunded or cancelled, * * @param int $order_id The order id. */ public function sa_restore_smart_coupon_amount( $order_id = 0 ) { if ( empty( $order_id ) ) { return; } $order = wc_get_order( $order_id ); $order_id = ( is_object( $order ) && is_callable( array( $order, 'get_id' ) ) ) ? $order->get_id() : 0; if ( empty( $order_id ) ) { return; } $coupons = $order->get_items( 'coupon' ); if ( ! empty( $coupons ) ) { foreach ( $coupons as $item_id => $item ) { $code = ( is_object( $item ) && is_callable( array( $item, 'get_name' ) ) ) ? $item->get_name() : trim( $item['name'] ); if ( empty( $code ) ) { continue; } $coupon = new WC_Coupon( $code ); if ( $this->is_wc_gte_30() ) { if ( ! is_object( $coupon ) || ! is_callable( array( $coupon, 'get_id' ) ) ) { continue; } $coupon_id = $coupon->get_id(); if ( empty( $coupon_id ) ) { continue; } $discount_type = $coupon->get_discount_type(); $usage_count = $coupon->get_usage_count(); } else { $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; $usage_count = ( ! empty( $coupon->usage_count ) ) ? $coupon->usage_count : 0; } $coupon_amount = $this->get_amount( $coupon, true, $order ); if ( empty( $discount_type ) || 'smart_coupon' !== $discount_type ) { continue; } if ( ! empty( $_POST['action'] ) && 'woocommerce_remove_order_coupon' === wc_clean( wp_unslash( $_POST['action'] ) ) && ! empty( $_POST['smart_coupon_removed'] ) && sanitize_text_field( wp_unslash( $_POST['smart_coupon_removed'] ) ) !== $code ) { // phpcs:ignore continue; } $discount = ( is_object( $item ) && is_callable( array( $item, 'get_discount' ) ) ) ? (float) $item->get_discount() : (float) $item['discount_amount']; $discount_tax = ( is_object( $item ) && is_callable( array( $item, 'get_discount_tax' ) ) ) ? (float) $item->get_discount_tax() : (float) $item['discount_amount_tax']; $sc_refunded_discount = (float) $this->get_order_item_meta( $item_id, 'sc_refunded_discount', true ); $sc_refunded_discount_tax = (float) $this->get_order_item_meta( $item_id, 'sc_refunded_discount_tax', true ); $sc_refunded_coupon_id = $this->get_order_item_meta( $item_id, 'sc_refunded_coupon_id', true ); if ( absint( $coupon_id ) === absint( $sc_refunded_coupon_id ) ) { $discount -= $sc_refunded_discount; $discount_tax -= $sc_refunded_discount_tax; } $update = false; if ( floatval( $discount ) > floatval( 0 ) ) { $coupon_amount += $discount; $sc_include_tax = $this->is_store_credit_include_tax(); // Add discount on tax if it has been given on tax. if ( 'yes' === $sc_include_tax && ! empty( $discount_tax ) ) { $coupon_amount += $discount_tax; } $update = true; } if ( $update ) { $user = ( function_exists( 'get_current_user_id' ) ) ? get_current_user_id() : 0; $local_time = ( function_exists( 'current_datetime' ) ) ? current_datetime() : ''; $get_timestamp = ( is_object( $local_time ) && is_callable( array( $local_time, 'getTimestamp' ) ) ) ? $local_time->getTimestamp() : ''; $get_offset = ( is_object( $local_time ) && is_callable( array( $local_time, 'getOffset' ) ) ) ? $local_time->getOffset() : ''; $current_time_stamp = $get_timestamp + $get_offset; $this->update_post_meta( $coupon_id, 'coupon_amount', $coupon_amount, true, $order ); $this->update_order_item_meta( $item_id, 'sc_refunded_discount', ( $sc_refunded_discount + $discount ), true, $order ); $this->update_order_item_meta( $item_id, 'sc_refunded_discount_tax', ( $sc_refunded_discount_tax + $discount_tax ), true, $order ); $this->update_order_item_meta( $item_id, 'sc_refunded_user_id', $user ); $this->update_order_item_meta( $item_id, 'sc_refunded_timestamp', $current_time_stamp ); $this->update_order_item_meta( $item_id, 'sc_refunded_coupon_id', $coupon_id ); } $usage_count = intval( $usage_count ); $usage_count--; if ( $usage_count < 0 ) { $usage_count = 0; } if ( $this->is_callable( $coupon, 'set_usage_count' ) && $this->is_callable( $coupon, 'save' ) ) { $coupon->set_usage_count( $usage_count ); $coupon->save(); } else { update_post_meta( $coupon_id, 'usage_count', $usage_count ); } } } } /** * Allow overriding of Smart Coupon's template for email * * @param string $template The template name. * @return mixed $template */ public function woocommerce_gift_certificates_email_template_path( $template = '' ) { $template_name = 'email.php'; $template = $this->locate_template_for_smart_coupons( $template_name, $template ); return $template; } /** * Allow overriding of Smart Coupon's template for combined emails template * * @param string $template The template name. * @return mixed $template */ public function woocommerce_combined_gift_certificates_email_template_path( $template = '' ) { $template_name = 'combined-email.php'; $template = $this->locate_template_for_smart_coupons( $template_name, $template ); return $template; } /** * Virtual downloadable order item needs update smart coupon balance. * * @param boolean $virtual_downloadable_item true/false. * @param object $_product line item. * @param int $order_id order id. * @return bool|mixed */ public function virtual_downloadable_item_needs_update_smart_coupon_balance( $virtual_downloadable_item = true, $_product = null, $order_id = 0 ) { if ( empty( $order_id ) ) { return $virtual_downloadable_item; } $order = wc_get_order( $order_id ); $hooks_available_for_statuses = array( 'on-hold', 'pending', 'processing', 'completed', 'failed', 'refunded', 'cancelled' ); $order_status = ( is_object( $order ) && is_callable( array( $order, 'get_status' ) ) ) ? $order->get_status() : ''; if ( ! in_array( $order_status, $hooks_available_for_statuses, true ) ) { return $virtual_downloadable_item; } if ( did_action( 'wc_sc_balance_updated_for_virtual_downloadable_item' ) >= 1 ) { return $virtual_downloadable_item; } $order_items = ( is_object( $order ) && is_callable( array( $order, 'get_items' ) ) ) ? $order->get_items() : array(); if ( false === $virtual_downloadable_item ) { $is_included_other_products_in_cart = false; if ( ! empty( $order_items ) ) { foreach ( $order_items as $item ) { if ( $item->is_type( 'line_item' ) ) { $product = ( is_object( $item ) && is_callable( array( $item, 'get_product' ) ) ) ? $item->get_product() : null; if ( ! is_a( $product, 'WC_Product' ) ) { continue; } $is_virtual_downloadable_item = $product->is_downloadable() && $product->is_virtual(); if ( false === $is_virtual_downloadable_item ) { $is_included_other_products_in_cart = true; break; } } } } $order_used_coupons = $this->get_coupon_codes( $order ); if ( ! empty( $order_used_coupons ) ) { foreach ( $order_used_coupons as $code ) { $smart_coupon = new WC_Coupon( $code ); if ( $this->is_wc_gte_30() ) { $discount_type = $smart_coupon->get_discount_type(); } else { $discount_type = ( ! empty( $smart_coupon->discount_type ) ) ? $smart_coupon->discount_type : ''; } if ( 'smart_coupon' === $discount_type ) { if ( false === $is_included_other_products_in_cart ) { remove_action( 'woocommerce_order_status_pending_to_completed', array( $this, 'update_smart_coupon_balance' ) ); remove_action( 'woocommerce_order_status_pending_to_on-hold', array( $this, 'update_smart_coupon_balance' ) ); remove_action( 'woocommerce_order_status_failed_to_on-hold', array( $this, 'update_smart_coupon_balance' ) ); remove_action( 'woocommerce_order_status_failed_to_processing', array( $this, 'update_smart_coupon_balance' ) ); remove_action( 'woocommerce_order_status_failed_to_completed', array( $this, 'update_smart_coupon_balance' ) ); $this->update_smart_coupon_balance( $order_id ); do_action( 'wc_sc_balance_updated_for_virtual_downloadable_item', array( 'order_id' => $order_id, 'product' => $_product, 'source' => $this, ) ); break; } } } } } return $virtual_downloadable_item; } /** * Check if the product is only going to generate/issue coupon, if so, tell the system that this product doesn't needs processing & can proceed with completing the order. * * @param boolean $needs_processing Whether needs processing or not. * @param WC_Product $product The product object. * @param integer $order_id The order id. * @return boolean */ public function coupon_product_dont_need_processing( $needs_processing = true, $product = null, $order_id = 0 ) { $coupon_titles = $this->get_coupon_titles( array( 'product_object' => $product ) ); if ( $product->is_virtual() && ! empty( $coupon_titles ) ) { $needs_processing = apply_filters( 'wc_sc_coupon_product_need_processing', $this->sc_get_option( 'wc_sc_coupon_product_need_processing', 'no' ), array( 'source' => $this, 'original_needs_processing' => $needs_processing, 'product' => $product, 'order_id' => $order_id, ) ); $needs_processing = ( 'yes' !== $needs_processing ) ? 'no' : $needs_processing; return wc_string_to_bool( $needs_processing ); } return $needs_processing; } /** * Additional order actions * * @param array $actions Existing order actions. * @param WC_Order $order The order object. * @return array */ public function order_actions( $actions = array(), $order = null ) { if ( is_null( $order ) || ! $this->is_wc_gte_30() ) { return $actions; } if ( false === $this->would_order_generate_coupons( $order ) ) { return $actions; } $sc_actions = array(); $coupon_receiver_details = ( is_object( $order ) && $this->is_callable( $order, 'get_meta' ) ) ? $order->get_meta( 'sc_coupon_receiver_details' ) : array(); if ( ! empty( $coupon_receiver_details ) ) { $sc_actions['wc_sc_resend_coupons'] = _x( 'Resend coupon emails', 'Order edit admin page', 'woocommerce-smart-coupons' ); } else { $sc_actions['wc_sc_regenerate_coupons'] = _x( 'Regenerate coupons', 'Order edit admin page', 'woocommerce-smart-coupons' ); $sc_actions['wc_sc_regenerate_resend_coupons'] = _x( 'Regenerate & resend coupon emails', 'Order edit admin page', 'woocommerce-smart-coupons' ); } $actions = array_merge( $actions, $sc_actions ); return $actions; } /** * Handle order coupon actions * * @param WC_Order $order The order object. */ public function order_coupon_actions( $order = null ) { if ( $this->is_wc_gte_30() ) { $order_id = $this->is_callable( $order, 'get_id' ) ? $order->get_id() : 0; if ( ! empty( $order_id ) ) { $note = ''; $current_filter = current_filter(); switch ( $current_filter ) { case 'woocommerce_order_action_wc_sc_regenerate_coupons': case 'woocommerce_order_action_wc_sc_regenerate_resend_coupons': if ( $this->is_callable( $order, 'update_meta_data' ) && $this->is_callable( $order, 'save' ) ) { $order = wc_get_order( $order ); $order->update_meta_data( 'coupon_sent', 'no' ); $order->save(); } $this->sa_add_coupons( $order_id ); if ( 'woocommerce_order_action_wc_sc_regenerate_coupons' === $current_filter ) { $note = _x( 'Coupons manually regenerated.', 'Order edit admin page', 'woocommerce-smart-coupons' ); } else { $note = _x( 'Coupons manually regenerated & sent.', 'Order edit admin page', 'woocommerce-smart-coupons' ); } break; case 'woocommerce_order_action_wc_sc_resend_coupons': $this->resend_coupons( $order_id ); $note = _x( 'Coupon details manually sent.', 'Order edit admin page', 'woocommerce-smart-coupons' ); break; } if ( ! empty( $note ) && $this->is_callable( $order, 'add_order_note' ) ) { $order->add_order_note( $note ); } } } } } } WC_SC_Coupon_Process::get_instance();