Files
roi-theme/wp-content/plugins/wp-marketing-automations/woofunnels/contact/woofunnels-customer-functions.php
root a22573bf0b Commit inicial - WordPress Análisis de Precios Unitarios
- WordPress core y plugins
- Tema Twenty Twenty-Four configurado
- Plugin allow-unfiltered-html.php simplificado
- .gitignore configurado para excluir wp-config.php y uploads

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03 21:04:30 -06:00

409 lines
14 KiB
PHP
Executable File

<?php
/**
* Customer functions
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Providing a new customer object
*
* @param $contact
*
* @return WooFunnels_Customer
*/
function bwf_get_customer( $contact ) {
return new WooFunnels_Customer( $contact );
}
/**
* @param $bwf_contact
* @param $order WC_Order
* @param $order_id
* @param $products - only in case of upstroke upsell orders
* @param $total
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
if ( ! function_exists( 'bwf_create_update_customer' ) ) {
function bwf_create_update_customer( $bwf_contact, $order, $order_id, $products, $total ) {
if ( ! $order instanceof WC_Order ) {
return;
}
/** Registering customer as child entities to contact for using its object */
$bwf_contact->set_customer_child();
$indexed = BWF_WC_Compatibility::get_order_meta( $order, '_woofunnel_custid' );
if ( ! $indexed && ( ! is_array( $products ) || ( is_array( $products ) && count( $products ) < 1 ) ) ) { //Non-batching un-indexed order
$bwf_contact->set_customer_total_order_count( $bwf_contact->get_customer_total_order_count() + 1 );
}
$total_change = false;
$new_total = 0;
if ( ( $total > 0 && $indexed ) ) {
/** Offer accepted and parent order already indexed and batching is on */
$new_total = $total - $order->get_total_refunded();
$total_change = true;
} elseif ( ! $indexed ) {
/** new order checkout, payment status paid */
$new_total = $order->get_total() - $order->get_total_refunded();
$total_change = true;
}
if ( $total_change && $new_total >= 0 ) {
/** Convert to base currency */
$fixed_order_spent = BWF_Plugin_Compatibilities::get_fixed_currency_price_reverse( $new_total, BWF_WC_Compatibility::get_order_currency( $order ) );
$db_total_order_spent = $bwf_contact->get_customer_total_order_value();
$fixed_order_spent = $fixed_order_spent + $db_total_order_spent;
$bwf_contact->set_customer_total_order_value( $fixed_order_spent );
}
/**BWF_Logger::get_instance()->log( "Order id: $order_id, Indexed: $indexed, New Total: $new_total, TotalChange: $total_change, Total: $total, OrderTotal: {$order->get_total()}, DatePaid: {$order->get_date_paid()}", "customer_batch" );*/
$product_ids = $cat_ids = $tag_ids = array();
$subscription_renewal = BWF_WC_Compatibility::get_order_meta( $order, '_subscription_renewal' );
if ( empty( $subscription_renewal ) ) { //Don't scan a subscription renewal order for products, cats and tags
$is_batching = false;
$db_products = $bwf_contact->get_customer_purchased_products();
$db_cats = $bwf_contact->get_customer_purchased_products_cats();
$db_tags = $bwf_contact->get_customer_purchased_products_tags();
$cat_ids = $db_cats;
$tag_ids = $db_tags;
if ( is_array( $products ) && count( $products ) > 0 ) { //batching on current offer package products and parent order is already been indexed
$is_batching = true;
foreach ( $products as $product_id ) {
if ( ! in_array( $product_id, $db_products, true ) && ! in_array( $product_id, $product_ids, true ) && $product_id > 0 ) {
array_push( $product_ids, $product_id );
}
$product = wc_get_product( $product_id );
if ( $product->is_type( 'variation' ) ) {
$product_id = $product->get_parent_id();
if ( ! in_array( $product_id, $product_ids, true ) && ! in_array( $product_id, $db_products, true ) && $product_id > 0 ) {
array_push( $product_ids, $product_id );
}
}
$updated_tags_cats = bwf_update_cats_and_tags( $product_id, $cat_ids, $tag_ids );
$cat_ids = $updated_tags_cats['cats'];
$tag_ids = $updated_tags_cats['tags'];
}
}
if ( false === $is_batching ) {
foreach ( $order->get_items() as $item ) {
$product = $item->get_product();
if ( $product instanceof WC_Product ) {
$product_id = $product->get_id();
if ( ! in_array( $product_id, $product_ids, true ) && ! in_array( $product_id, $db_products, true ) && $product_id > 0 ) {
array_push( $product_ids, $product_id );
}
if ( $product->is_type( 'variation' ) ) {
$product_id = $product->get_parent_id();
if ( ! in_array( $product_id, $product_ids, true ) && ! in_array( $product_id, $db_products, true ) && $product_id > 0 ) {
array_push( $product_ids, $product_id );
}
}
$updated_tags_cats = bwf_update_cats_and_tags( $product_id, $cat_ids, $tag_ids );
$cat_ids = $updated_tags_cats['cats'];
$tag_ids = $updated_tags_cats['tags'];
}
}
$db_used_coupons = $bwf_contact->get_customer_used_coupons();
$order_coupons = BWF_WC_Compatibility::get_used_coupons( $order );
if ( count( $order_coupons ) > 0 && ( count( array_diff( $order_coupons, $db_used_coupons ) ) > 0 || count( $db_used_coupons ) < 1 ) ) {
$final_coupons = array_unique( array_merge( $db_used_coupons, $order_coupons ) );
sort( $final_coupons );
$bwf_contact->set_customer_used_coupons( $final_coupons );
}
}
if ( is_array( $product_ids ) && count( $product_ids ) > 0 && ( count( array_diff( $product_ids, $db_products ) ) > 0 || count( $db_products ) < 1 ) ) {
$final_products = bwf_get_array_unique_integers( $db_products, $product_ids );
$bwf_contact->set_customer_purchased_products( $final_products );
}
if ( count( $cat_ids ) > 0 && ( count( array_diff( $cat_ids, $db_cats ) ) > 0 || count( $db_cats ) < 1 ) ) {
$final_cats = bwf_get_array_unique_integers( $db_cats, $cat_ids );
$bwf_contact->set_customer_purchased_products_cats( $final_cats );
}
if ( count( $tag_ids ) > 0 && ( count( array_diff( $tag_ids, $db_tags ) ) > 0 || count( $db_tags ) < 1 ) ) {
$final_tags = bwf_get_array_unique_integers( $db_tags, $tag_ids );
$bwf_contact->set_customer_purchased_products_tags( $final_tags );
}
}
$bwf_l_order_date = $bwf_contact->get_customer_l_order_date();
$bwf_f_order_date = $bwf_contact->get_customer_f_order_date();
$order_created_date = $order->get_date_created()->date( 'Y-m-d H:i:s' );
if ( empty( $bwf_l_order_date ) || $bwf_l_order_date < $order_created_date ) {
$bwf_contact->set_customer_l_order_date( $order_created_date );
}
if ( empty( $bwf_f_order_date ) || $bwf_f_order_date === '0000-00-00' || $bwf_f_order_date === '0000-00-00 00:00:00' || $bwf_f_order_date > $order_created_date ) {
$bwf_contact->set_customer_f_order_date( $order_created_date );
}
$cid = $bwf_contact->get_id();
$bwf_contact->set_customer_cid( $cid );
$order->update_meta_data( '_woofunnel_custid', $cid );
$order->save_meta_data();
}
}
/**
* Setting category ids and tag ids
*
* @param $product_ids
* @param $product_id
*/
if ( ! function_exists( 'bwf_update_cats_and_tags' ) ) {
function bwf_update_cats_and_tags( $product_id, $cat_ids, $tag_ids ) {
$product_obj = wc_get_product( $product_id );
if ( ! $product_obj instanceof WC_Product ) {
return array(
'cats' => [],
'tags' => [],
);
}
/** Terms */
$product_cats = $product_obj->get_category_ids();
$product_tags = $product_obj->get_tag_ids();
$cat_ids = ( is_array( $product_cats ) ) ? array_merge( $cat_ids, $product_cats ) : [];
$tag_ids = ( is_array( $product_tags ) ) ? array_merge( $tag_ids, $product_tags ) : [];
$cat_ids = ( is_array( $cat_ids ) ) ? array_unique( $cat_ids ) : [];
$tag_ids = ( is_array( $tag_ids ) ) ? array_unique( $tag_ids ) : [];
return array(
'cats' => $cat_ids,
'tags' => $tag_ids,
);
}
}
/**
* Updating refunded amount in customer meta
*
* @param $order_id
* @param $amount
*/
if ( ! function_exists( 'bwf_update_customer_refunded' ) ) {
function bwf_update_customer_refunded( $order_id, $refund_amount ) {
$order = wc_get_order( $order_id );
$custid = BWF_WC_Compatibility::get_order_meta( $order, '_woofunnel_custid' );
if ( empty( $custid ) || 0 === $custid ) {
return;
}
$cid = BWF_WC_Compatibility::get_order_meta( $order, '_woofunnel_cid' );
$meta_key = '_bwf_customer_refunded';
$bwf_refunded = BWF_WC_Compatibility::get_order_meta( $order, $meta_key );
$bwf_refunded = empty( $bwf_refunded ) ? 0 : $bwf_refunded;
$bwf_contacts = BWF_Contacts::get_instance();
$bwf_contact = $bwf_contacts->get_contact_by( 'id', $cid );
$bwf_contact->set_customer_child();
$customer_total = $bwf_contact->get_customer_total_order_value();
$order_total = $order->get_total();
BWF_Logger::get_instance()->log( "Processing a refund for amount $refund_amount and order id: $order_id Order Total: $order_total, cid: $cid BWF Refunded: $bwf_refunded", 'woofunnels_indexing' );
if ( $refund_amount <= ( $order_total - $bwf_refunded ) ) {
/** Convert to base currency */
$refund_amount = BWF_Plugin_Compatibilities::get_fixed_currency_price_reverse( $refund_amount, BWF_WC_Compatibility::get_order_currency( $order ) );
$customer_total -= $refund_amount;
if ( $customer_total < 0 ) {
$customer_total = 0;
}
$bwf_contact->set_customer_total_order_value( $customer_total );
bwf_contact_maybe_update_creation_date( $bwf_contact, $order );
$bwf_contact->save();
$bwf_refunded += $refund_amount;
BWF_Logger::get_instance()->log( "Refund amount $refund_amount is reduced from customer meta 'total_value' for contact id: $cid Reduced total is: $customer_total ", 'woofunnels_indexing' );
}
$order->update_meta_data( $meta_key, $bwf_refunded );
$order->save_meta_data();
}
}
/**
* Reducing customer total spent on order cancelled
*
* @param $order_id
*/
if ( ! function_exists( 'bwf_reduce_customer_total_on_cancel' ) ) {
function bwf_reduce_customer_total_on_cancel( $order_id ) {
$order = wc_get_order( $order_id );
$custid = BWF_WC_Compatibility::get_order_meta( $order, '_woofunnel_custid' );
if ( empty( $custid ) ) {
return;
}
$cid = BWF_WC_Compatibility::get_order_meta( $order, '_woofunnel_cid' );
$meta_key = '_bwf_customer_refunded';
$bwf_refunded = BWF_WC_Compatibility::get_order_meta( $order, $meta_key );
$bwf_refunded = empty( $bwf_refunded ) ? 0 : $bwf_refunded;
$bwf_contacts = BWF_Contacts::get_instance();
$bwf_contact = $bwf_contacts->get_contact_by( 'id', $cid );
$order_total = $order->get_total();
$bwf_contact->set_customer_child();
$customer_total = $bwf_contact->get_customer_total_order_value();
$remaining_total = $order_total - $bwf_refunded;
BWF_Logger::get_instance()->log( "Processing a cancellation for order_id: $order_id, BWF Refunded: $bwf_refunded, Order Total: $order_total, Remaining order total: $remaining_total, Customer total: $customer_total", 'woofunnels_indexing' );
/** Convert to base currency */
$remaining_total = BWF_Plugin_Compatibilities::get_fixed_currency_price_reverse( $remaining_total, BWF_WC_Compatibility::get_order_currency( $order ) );
$customer_total -= $remaining_total;
if ( $customer_total < 0 ) {
$customer_total = 0;
}
$bwf_contact->set_customer_total_order_value( $customer_total );
bwf_contact_maybe_update_creation_date( $bwf_contact, $order );
$bwf_contact->save();
$order->update_meta_data( $meta_key, $order_total );
$order->save_meta_data();
BWF_Logger::get_instance()->log( "Order $order_id is cancelled for contact id: $cid. Reduced total is: $customer_total ", 'woofunnels_indexing' );
}
}
/**
* Return the total order amount
*
* @param $order WC_Order
*
* @return int
*/
if ( ! function_exists( 'bwf_get_order_total' ) ) {
function bwf_get_order_total( $order ) {
$total = 0;
if ( ! $order instanceof WC_Order ) {
return $total;
}
$total = $order->get_total() - $order->get_total_refunded();
$total = BWF_Plugin_Compatibilities::get_fixed_currency_price_reverse( $total, BWF_WC_Compatibility::get_order_currency( $order ) );
return $total;
}
}
/**
* Return the Order product items ids
*
* @param $order WC_Order
*
* @return array
*/
if ( ! function_exists( 'bwf_get_order_product_ids' ) ) {
function bwf_get_order_product_ids( $order ) {
$product_ids = [];
if ( ! $order instanceof WC_Order ) {
return $product_ids;
}
$products = $order->get_items();
if ( ! is_array( $products ) || count( $products ) === 0 ) {
return $product_ids;
}
$product_arr = [];
foreach ( $products as $val ) {
if ( ! $val instanceof WC_Order_Item_Product ) {
continue;
}
$product_id = $val->get_product_id();
$variation_id = $val->get_variation_id();
if ( $variation_id > 0 ) {
$product_id = $variation_id;
}
$product_arr[] = $product_id;
}
return $product_arr;
}
}
/**
* Return the Order product items categories and terms ids
*
* @param $order WC_Order
*
* @return array
*/
if ( ! function_exists( 'bwf_get_order_product_terms' ) ) {
function bwf_get_order_product_terms( $order ) {
$product_ids = [];
if ( ! $order instanceof WC_Order ) {
return $product_ids;
}
$products = $order->get_items();
if ( ! is_array( $products ) || ( is_array( $products ) && count( $products ) === 0 ) ) {
return $product_ids;
}
$order_cats = $order_tags = [];
$product_cats = false;
$product_tags = false;
foreach ( $products as $val ) {
if ( ! $val instanceof WC_Order_Item_Product ) {
continue;
}
/** @todo we can save this product obj as object cache so that can be used */
$product_obj = $val->get_product();
if ( ! $product_obj instanceof WC_Product ) {
continue;
}
/** Terms */
$product_cats = $product_obj->get_category_ids();
$product_tags = $product_obj->get_tag_ids();
$order_cats = ( is_array( $product_cats ) ) ? array_merge( $order_cats, $product_cats ) : [];
$order_tags = ( is_array( $product_tags ) ) ? array_merge( $order_tags, $product_tags ) : [];
}
$order_cats = ( is_array( $product_cats ) ) ? array_unique( $order_cats ) : [];
$order_tags = ( is_array( $product_tags ) ) ? array_unique( $order_tags ) : [];
return array(
'cats' => $order_cats,
'tags' => $order_tags,
);
}
}
/**
* Combine 2 arrays and return unique integer array values
*
* @param $arr
*
* @return mixed
*/
if ( ! function_exists( 'bwf_get_array_unique_integers' ) ) {
function bwf_get_array_unique_integers( $array1 = [], $array2 = [] ) {
$arr = array_unique( array_merge( $array1, $array2 ) );
sort( $arr );
$arr = array_map( 'intval', $arr );
return $arr;
}
}