Files
medicalalert-web-reloaded/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwoodatasync.php
2024-09-25 09:25:31 -04:00

379 lines
10 KiB
PHP

<?php
/**
* Handling data for sync.
*
* @link https://makewebbetter.com/
* @since 1.0.0
*
* @package makewebbetter-hubspot-for-woocommerce
* @subpackage makewebbetter-hubspot-for-woocommerce/includes
*/
/**
* Handling Data for Syncing Prodcess
*
* All the Data required for handling Users and
* Order Data required by the plugin.
*
* @package makewebbetter-hubspot-for-woocommerce
* @subpackage makewebbetter-hubspot-for-woocommerce/includes
*/
class HubwooDataSync {
/**
* Retreive all of the
* required user Data and Count
*
* @param int $count count of users to be get.
* @param string $response_type sync type.
* @param int $limit offset for users.
*/
public function hubwoo_get_all_unique_user( $count = false, $response_type = 'customer', $limit = 20 ) {
$limit = $count ? -1 : $limit;
$unique_users = 0;
$args = array();
$date_range = false;
if ( 'yes' == get_option( 'hubwoo_customers_manual_sync', 'no' ) ) {
$date_range = true;
$from_date = get_option( 'hubwoo_users_from_date', gmdate( 'd-m-Y' ) );
$upto_date = get_option( 'hubwoo_users_upto_date', gmdate( 'd-m-Y' ) );
}
// checking for guest users in the array.
$roles = get_option( 'hubwoo_customers_role_settings', array() );
if ( empty( $roles ) ) {
global $hubwoo;
$roles = array_keys( $hubwoo->hubwoo_get_user_roles() );
$key = array_search( 'guest_user', $roles );
if ( false !== $key ) {
unset( $roles[ $key ] );
}
}
if ( in_array( 'guest_user', $roles ) ) {
$key = array_search( 'guest_user', $roles );
$order_statuses = get_option( 'hubwoo-selected-order-status', array() );
if ( empty( $order_statuses ) || ( ! is_array( $order_statuses ) && count( $order_statuses ) < 1 ) ) {
$order_statuses = array_keys( wc_get_order_statuses() );
}
if ( false !== $key ) {
unset( $roles[ $key ] );
}
$order_args = array(
'return' => 'ids',
'limit' => $limit,
'type' => wc_get_order_types(),
'status' => $order_statuses,
'customer' => 0,
'hubwoo_pro_guest_order' => 'synced',
);
if ( $date_range ) {
$order_args['date_modified'] = gmdate( 'Y-m-d', strtotime( $from_date ) ) . '...' . gmdate( 'Y-m-d', strtotime( $upto_date . ' +1 day' ) );
}
$guest_orders = wc_get_orders( $order_args );
$guest_emails = array_unique( self::get_guest_sync_data( $guest_orders, true ) );
if ( 'guestOrder' == $response_type ) {
return $guest_orders;
}
if ( is_array( $guest_orders ) ) {
$unique_users += count( $guest_emails );
}
} else {
if ( 'guestOrder' == $response_type ) {
return false;
}
}
if ( $date_range ) {
$args['date_query'] = array(
array(
'after' => gmdate( 'd-m-Y', strtotime( $from_date ) ),
'before' => gmdate( 'd-m-Y', strtotime( $upto_date . ' +1 day' ) ),
'inclusive' => true,
),
);
}
// creating args for registered users.
$args['meta_query'] = array(
'relation' => 'OR',
array(
'key' => 'hubwoo_pro_user_data_change',
'compare' => 'NOT EXISTS',
),
array(
'key' => 'hubwoo_pro_user_data_change',
'value' => 'synced',
'compare' => '!=',
),
);
$args['role__in'] = $roles;
$args['number'] = $limit;
$args['fields'] = 'ID';
$registered_users = get_users( $args );
if ( $count ) {
$unique_users += count( $registered_users );
return $unique_users;
}
return $registered_users;
}
/**
* Retrieve User Data
* for Guest Users
*
* @param array $hubwoo_orders array of order to be synced.
* @param bool $only_email true/false.
*/
public static function get_guest_sync_data( $hubwoo_orders, $only_email = false ) {
global $hubwoo;
$guest_user_emails = array();
$guest_contacts = array();
$guest_user_properties = array();
if ( ! empty( $hubwoo_orders ) && count( $hubwoo_orders ) ) {
foreach ( $hubwoo_orders as $order_id ) {
$hubwoo_guest_order = wc_get_order( $order_id );
if ( $hubwoo_guest_order instanceof WC_Order ) {
$guest_email = $hubwoo_guest_order->get_billing_email();
if ( ! empty( $guest_email ) && $only_email ) {
$guest_user_emails[] = $guest_email;
continue;
}
if ( empty( $guest_email ) ) {
$hubwoo_guest_order->delete_meta_data('hubwoo_pro_guest_order');
continue;
}
$guest_order_callback = new HubwooGuestOrdersManager( $order_id );
$guest_user_properties = $guest_order_callback->get_order_related_properties( $order_id, $guest_email );
$guest_user_properties = $hubwoo->hubwoo_filter_contact_properties( $guest_user_properties );
$fname = $hubwoo_guest_order->get_billing_first_name();
if ( ! empty( $fname ) ) {
$guest_user_properties[] = array(
'property' => 'firstname',
'value' => $fname,
);
}
$lname = $hubwoo_guest_order->get_billing_last_name();
if ( ! empty( $lname ) ) {
$guest_user_properties[] = array(
'property' => 'lastname',
'value' => $lname,
);
}
$cname = $hubwoo_guest_order->get_billing_company();
if ( ! empty( $cname ) ) {
$guest_user_properties[] = array(
'property' => 'company',
'value' => $cname,
);
}
$city = $hubwoo_guest_order->get_billing_city();
if ( ! empty( $city ) ) {
$guest_user_properties[] = array(
'property' => 'city',
'value' => $city,
);
}
$state = $hubwoo_guest_order->get_billing_state();
if ( ! empty( $state ) ) {
$guest_user_properties[] = array(
'property' => 'state',
'value' => $state,
);
}
$country = $hubwoo_guest_order->get_billing_country();
if ( ! empty( $country ) ) {
$guest_user_properties[] = array(
'property' => 'country',
'value' => Hubwoo::map_country_by_abbr( $country ),
);
}
$address1 = $hubwoo_guest_order->get_billing_address_1();
$address2 = $hubwoo_guest_order->get_billing_address_2();
if ( ! empty( $address1 ) || ! empty( $address2 ) ) {
$address = $address1 . ' ' . $address2;
$guest_user_properties[] = array(
'property' => 'address',
'value' => $address,
);
}
$zip = $hubwoo_guest_order->get_billing_postcode();
if ( ! empty( $zip ) ) {
$guest_user_properties[] = array(
'property' => 'zip',
'value' => $zip,
);
}
$guest_phone = $hubwoo_guest_order->get_billing_phone();
if ( ! empty( $guest_phone ) ) {
$guest_user_properties[] = array(
'property' => 'mobilephone',
'value' => $guest_phone,
);
$guest_user_properties[] = array(
'property' => 'phone',
'value' => $guest_phone,
);
}
$customer_new_order_flag = 'no';
$prop_index = array_search( 'customer_new_order', array_column( $guest_user_properties, 'property' ) );
if ( Hubwoo_Admin::hubwoo_check_for_properties( 'order_recency_rating', 5, $guest_user_properties ) ) {
if ( Hubwoo_Admin::hubwoo_check_for_properties( 'last_order_status', get_option( 'hubwoo_no_status', 'wc-completed' ), $guest_user_properties ) ) {
$customer_new_order_flag = 'yes';
}
}
if ( $prop_index ) {
$guest_user_properties[ $prop_index ]['value'] = $customer_new_order_flag;
} else {
$guest_user_properties[] = array(
'property' => 'customer_new_order',
'value' => $customer_new_order_flag,
);
}
$guest_user_properties = apply_filters( 'hubwoo_map_ecomm_guest_CONTACT_properties', $guest_user_properties, $order_id );
$guest_user_properties_data = array(
'email' => $guest_email,
'properties' => $guest_user_properties,
);
$guest_contacts[] = $guest_user_properties_data;
$hubwoo_guest_order->delete_meta_data('hubwoo_pro_guest_order');
}
}
}
$response = $only_email ? $guest_user_emails : $guest_contacts;
return $response;
}
/**
* Scheduling Background Tasks
*/
public function schedule_background_task() {
delete_option( 'hubwoo_ocs_data_synced' );
delete_option( 'hubwoo_ocs_contacts_synced' );
update_option( 'hubwoo_background_process_running', true );
if ( ! as_next_scheduled_action( 'hubwoo_contacts_sync_background' ) ) {
as_schedule_recurring_action( time(), 300, 'hubwoo_contacts_sync_background' );
}
}
/**
* Starts Scheduling once
* the data has been retrieved
*/
public function hubwoo_start_schedule() {
$hubwoo_unique_users = $this->hubwoo_get_all_unique_user( true );
if ( $hubwoo_unique_users ) {
$this->schedule_background_task();
}
}
/**
* Retrieving Data For Registered
* Users
*
* @param array $hubwoo_unique_users array of users to sync.
* @return User Data
*/
public static function get_sync_data( $hubwoo_unique_users ) {
// basic data function for user ids.
$contacts = array();
$role__in = get_option( 'hubwoo-selected-user-roles', array() );
$user_role_in = get_option( 'hubwoo_customers_role_settings', array() );
if ( ! empty( $hubwoo_unique_users ) && count( $hubwoo_unique_users ) ) {
foreach ( $hubwoo_unique_users as $key => $id ) {
$hubwoo_customer = new HubWooCustomer( $id );
$email = $hubwoo_customer->get_email();
$user_data = get_user_by( 'email', $email );
if( ! empty( $user_data ) ) {
if( ! empty( $user_data->roles[0] ) ) {
$role = $user_data->roles[0];
if ( in_array( $role, $role__in ) || in_array( $role, $user_role_in ) ) {
if ( empty( $email ) ) {
delete_user_meta( $id, 'hubwoo_pro_user_data_change' );
continue;
}
$properties = $hubwoo_customer->get_contact_properties();
$user_properties = $hubwoo_customer->get_user_data_properties( $properties );
$properties_data = array(
'email' => $email,
'properties' => $user_properties,
);
$contacts[] = $properties_data;
}
}
}
}
}
return $contacts;
}
}