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

570 lines
19 KiB
PHP

<?php
/**
* All api GET/POST functionalities.
*
* @link https://makewebbetter.com/
* @since 1.0.0
*
* @package makewebbetter-hubspot-for-woocommerce
* @subpackage makewebbetter-hubspot-for-woocommerce/includes
*/
/**
* Handles all hubspot api reqests/response related functionalities of the plugin.
*
* Provide a list of functions to manage all the requests
* that needs in our integration to get/fetch data
* from/to hubspot.
*
* @package makewebbetter-hubspot-for-woocommerce
* @subpackage makewebbetter-hubspot-for-woocommerce/includes
*/
class HubwooObjectProperties {
/**
* The single instance of the class.
*
* @since 1.0.0
* @var HubwooObjectProperties The single instance of the HubwooObjectProperties
*/
protected static $instance = null;
/**
* Main HubwooObjectProperties Instance.
*
* Ensures only one instance of HubwooObjectProperties is loaded or can be loaded.
*
* @since 1.0.0
* @static
* @return HubwooObjectProperties - Main instance.
*/
public static function get_instance() {
if ( is_null( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Create/update contact and associate with a deal.
*
* @since 1.0.0
* @param int $user_id - User Id of the contact.
* @static
* @return void.
*/
public static function hubwoo_ecomm_contacts_with_id( $user_id ) {
$object_type = 'CONTACT';
$contact = array();
$user_info = json_decode( json_encode( get_userdata( $user_id ) ), true );
$user_email = $user_info['data']['user_email'];
$hubwoo_ecomm_customer = new HubwooEcommObject( $user_id, $object_type );
$contact_properties = $hubwoo_ecomm_customer->get_object_properties();
$contact_properties = apply_filters( 'hubwoo_map_ecomm_' . $object_type . '_properties', $contact_properties, $user_id );
$user_vid = get_user_meta( $user_id, 'hubwoo_user_vid', true );
$contact = $contact_properties;
$contact['email'] = $user_email;
$contact = array(
'properties' => $contact,
);
if ( count( $contact ) ) {
$flag = true;
if ( Hubwoo::is_access_token_expired() ) {
$hapikey = HUBWOO_CLIENT_ID;
$hseckey = HUBWOO_SECRET_ID;
$status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey );
if ( ! $status ) {
$flag = false;
}
}
if ( $flag ) {
if ( ! empty( $user_vid ) ) {
$response = HubWooConnectionMananager::get_instance()->update_object_record( 'contacts', $user_vid, $contact );
} else {
$response = HubWooConnectionMananager::get_instance()->create_object_record( 'contacts', $contact );
if ( 201 == $response['status_code'] ) {
$contact_vid = json_decode( $response['body'] );
update_user_meta( $user_id, 'hubwoo_user_vid', $contact_vid->id );
update_user_meta( $user_id, 'hubwoo_pro_user_data_change', 'synced' );
} else if ( 409 == $response['status_code'] ) {
$contact_vid = json_decode( $response['body'] );
$hs_id = explode( 'ID: ', $contact_vid->message );
$response = HubWooConnectionMananager::get_instance()->update_object_record( 'contacts', $hs_id[1], $contact );
update_user_meta( $user_id, 'hubwoo_user_vid', $hs_id[1] );
update_user_meta( $user_id, 'hubwoo_pro_user_data_change', 'synced' );
} else if ( 400 == $response['status_code'] ) {
update_user_meta( $user_id, 'hubwoo_invalid_contact', 'yes' );
update_user_meta( $user_id, 'hubwoo_pro_user_data_change', 'synced' );
}
}
do_action( 'hubwoo_ecomm_contact_synced', $user_email );
}
}
}
/**
* Create/update a guest user and associate with a deal.
*
* @since 1.0.0
* @param int $order_id - order id of the contact.
* @static
* @return void.
*/
public static function hubwoo_ecomm_guest_user( $order_id ) {
global $hubwoo;
$order = wc_get_order($order_id);
$guest_email = $order->get_billing_email();
$contact = array();
if ( ! empty( $guest_email ) ) {
$object_type = 'CONTACT';
$guest_user_info = array();
$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 );
foreach ( $guest_user_properties as $key => $value ) {
$guest_user_info[ $value['property'] ] = $value['value'];
}
$guest_user_info['email'] = $guest_email;
$guest_user_info['firstname'] = $order->get_billing_first_name();
$guest_user_info['lastname'] = $order->get_billing_last_name();
$guest_user_info['phone'] = $order->get_billing_phone();
$guest_user_info['billing_address_line_1'] = $order->get_billing_address_1();
$guest_user_info['billing_address_line_2'] = $order->get_billing_address_2();
$guest_user_info['billing_city'] = $order->get_billing_city();
$guest_user_info['billing_state'] = $order->get_billing_state();
$guest_user_info['billing_country'] = $order->get_billing_country();
$guest_user_info['billing_postal_code'] = $order->get_billing_postcode();
$guest_user_info['lifecyclestage'] = 'customer';
$guest_user_info['customer_source_store'] = get_bloginfo( 'name' );
$guest_user_info['hs_language'] = $order->get_meta('hubwoo_preferred_language', true);
$guest_contact_properties = apply_filters( 'hubwoo_map_ecomm_guest_' . $object_type . '_properties', $guest_user_info, $order_id );
$user_vid = $order->get_meta('hubwoo_user_vid', true);
$contact = array(
'properties' => $guest_contact_properties,
);
}
if ( count( $contact ) ) {
$flag = true;
if ( Hubwoo::is_access_token_expired() ) {
$hapikey = HUBWOO_CLIENT_ID;
$hseckey = HUBWOO_SECRET_ID;
$status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey );
if ( ! $status ) {
$flag = false;
}
}
if ( $flag ) {
if ( ! empty( $user_vid ) ) {
$response = HubWooConnectionMananager::get_instance()->update_object_record( 'contacts', $user_vid, $contact );
} else {
$response = HubWooConnectionMananager::get_instance()->create_object_record( 'contacts', $contact );
if ( 201 == $response['status_code'] ) {
$contact_vid = json_decode( $response['body'] );
$order->update_meta_data('hubwoo_user_vid', $contact_vid->id);
$order->update_meta_data('hubwoo_pro_guest_order', 'synced');
$order->save();
} else if ( 409 == $response['status_code'] ) {
$contact_vid = json_decode( $response['body'] );
$hs_id = explode( 'ID: ', $contact_vid->message );
$response = HubWooConnectionMananager::get_instance()->update_object_record( 'contacts', $hs_id[1], $contact );
$order->update_meta_data('hubwoo_user_vid', $hs_id[1]);
$order->update_meta_data('hubwoo_pro_guest_order', 'synced');
$order->save();
} else if ( 400 == $response['status_code'] ) {
$order->update_meta_data('hubwoo_invalid_contact', 'yes');
$order->update_meta_data('hubwoo_pro_guest_order', 'synced');
$order->update_meta_data('hubwoo_pro_user_data_change', 'synced');
$order->save();
}
}
do_action( 'hubwoo_ecomm_contact_synced', $guest_email );
}
}
}
/**
* Create/update an ecommerce deal.
*
* @since 1.0.0
* @param int $order_id - order id.
* @param int $source - register or guest.
* @param int $customer_id - user id.
* @static
* @return array sync response from HubSpot.
*/
public static function hubwoo_ecomm_sync_deal( $order_id, $source, $customer_id ) {
$object_type = 'DEAL';
$deal_updates = array();
$assc_deal_cmpy = get_option( 'hubwoo_assoc_deal_cmpy_enable', 'yes' );
$pipeline_id = get_option( 'hubwoo_ecomm_pipeline_id', false );
$hubwoo_ecomm_deal = new HubwooEcommObject( $order_id, $object_type );
$deal_properties = $hubwoo_ecomm_deal->get_object_properties();
$deal_properties = apply_filters( 'hubwoo_map_ecomm_' . $object_type . '_properties', $deal_properties, $order_id );
$order = wc_get_order($order_id);
if ( 'yes' == get_option( 'hubwoo_deal_multi_currency_enable', 'no' ) ) {
$currency = $order->get_currency();
if ( ! empty( $currency ) ) {
$deal_properties['deal_currency_code'] = $currency;
}
}
if ( empty( $pipeline_id ) ) {
Hubwoo::get_all_deal_stages();
$pipeline_id = get_option( 'hubwoo_ecomm_pipeline_id', false );
}
$deal_properties['pipeline'] = $pipeline_id;
$deal_updates = array(
'properties' => $deal_properties,
);
$response = '';
if ( 'user' == $source ) {
$user_info = json_decode( wp_json_encode( get_userdata( $customer_id ) ), true );
$user_email = $user_info['data']['user_email'];
$contact = $user_email;
if ( empty( $contact ) ) {
$contact = $customer_id;
}
$contact_vid = get_user_meta( $customer_id, 'hubwoo_user_vid', true );
$invalid_contact = get_user_meta( $customer_id, 'hubwoo_invalid_contact', true );
} else {
$contact_vid = $order->get_meta('hubwoo_user_vid', true);
$contact = $order->get_billing_email();
$invalid_contact = $order->get_meta('hubwoo_invalid_contact', true);
}
if ( count( $deal_updates ) ) {
$flag = true;
if ( Hubwoo::is_access_token_expired() ) {
$hapikey = HUBWOO_CLIENT_ID;
$hseckey = HUBWOO_SECRET_ID;
$status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey );
if ( ! $status ) {
$flag = false;
}
}
if ( $flag ) {
$deal_name = '#' . $order->get_order_number();
$user_detail['first_name'] = $order->get_billing_first_name();
$user_detail['last_name'] = $order->get_billing_last_name();
foreach ( $user_detail as $value ) {
if ( ! empty( $value ) ) {
$deal_name .= ' ' . $value;
}
}
$filtergps = array(
'filterGroups' => array(
array(
'filters' => array(
array(
'value' => $deal_name,
'propertyName' => 'dealname',
'operator' => 'EQ',
),
),
),
),
);
$response = HubWooConnectionMananager::get_instance()->search_object_record( 'deals', $filtergps );
if ( 200 == $response['status_code'] ) {
$responce_body = json_decode( $response['body'] );
$result = $responce_body->results;
if ( ! empty( $result ) ) {
foreach ( $result as $key => $value ) {
$order->update_meta_data('hubwoo_ecomm_deal_id', $value->id);
$order->update_meta_data('hubwoo_order_line_item_created', 'yes');
$order->save();
}
}
}
$hubwoo_ecomm_deal_id =$order->get_meta('hubwoo_ecomm_deal_id', true);
if ( empty( $hubwoo_ecomm_deal_id ) ) {
$response = HubWooConnectionMananager::get_instance()->create_object_record( 'deals', $deal_updates );
if ( 201 == $response['status_code'] ) {
$response_body = json_decode( $response['body'] );
$hubwoo_ecomm_deal_id = $response_body->id;
$order->update_meta_data('hubwoo_ecomm_deal_id', $hubwoo_ecomm_deal_id);
$order->save();
}
} else {
$response = HubWooConnectionMananager::get_instance()->update_object_record( 'deals', $hubwoo_ecomm_deal_id, $deal_updates );
}
HubWooConnectionMananager::get_instance()->associate_object( 'deal', $hubwoo_ecomm_deal_id, 'contact', $contact_vid, 3 );
do_action( 'hubwoo_ecomm_deal_created', $order_id );
if ( 'yes' == $assc_deal_cmpy ) {
if ( ! empty( $contact ) && empty( $invalid_contact ) ) {
Hubwoo::hubwoo_associate_deal_company( $contact, $hubwoo_ecomm_deal_id );
}
}
$order->update_meta_data('hubwoo_ecomm_deal_upsert', 'no');
$order->delete_meta_data('hubwoo_ecomm_deal_upsert');
$order->save();
$response = self::hubwoo_ecomm_sync_line_items( $order_id );
return $response;
}
}
}
/**
* Create and Associate Line Items for an order.
*
* @since 1.0.0
* @param int $order_id - order id.
* @static
* @return array sync response from HubSpot.
*/
public static function hubwoo_ecomm_sync_line_items( $order_id ) {
if ( ! empty( $order_id ) ) {
$order = wc_get_order( $order_id );
$line_updates = array();
$order_items = $order->get_items();
$object_ids = array();
$response = array( 'status_code' => 206 );
$no_products_found = false;
if ( is_array( $order_items ) && count( $order_items ) ) {
foreach ( $order_items as $item_key => $single_item ) :
$product_id = $single_item->get_variation_id();
if ( 0 === $product_id ) {
$product_id = $single_item->get_product_id();
if ( 0 === $product_id ) {
$no_products_found = true;
}
}
if ( get_post_status( $product_id ) == 'trash' || get_post_status( $product_id ) == false ) {
continue;
}
$item_sku = get_post_meta( $product_id, '_sku', true );
if ( empty( $item_sku ) ) {
$item_sku = $product_id;
}
$line_item_hs_id = wc_get_order_item_meta( $item_key, 'hubwoo_ecomm_line_item_id', true );
if ( ! empty( $line_item_hs_id ) || 'yes' == $order->get_meta('hubwoo_order_line_item_created', 'no') ) {
continue;
}
$quantity = ! empty( $single_item->get_quantity() ) ? $single_item->get_quantity() : 0;
$item_total = ! empty( $single_item->get_total() ) ? $single_item->get_total() : 0;
$item_sub_total = ! empty( $single_item->get_subtotal() ) ? $single_item->get_subtotal() : 0;
$product = $single_item->get_product();
$name = self::hubwoo_ecomm_product_name( $product );
$discount_amount = abs( $item_total - $item_sub_total );
$discount_amount = $discount_amount / $quantity;
$item_sub_total = $item_sub_total / $quantity;
$hs_product_id = get_post_meta( $product_id, 'hubwoo_ecomm_pro_id', true );
$object_ids[] = $item_key;
$properties = array(
'quantity' => $quantity,
'price' => $item_sub_total,
'amount' => $item_total,
'name' => $name,
'discount_amount' => $discount_amount,
'sku' => $item_sku,
'tax_amount' => $single_item->get_total_tax(),
);
if ( 'yes' != get_option( 'hubwoo_product_scope_needed', 'no' ) ) {
$properties['hs_product_id'] = $hs_product_id;
}
$properties = apply_filters( 'hubwoo_line_item_properties', $properties, $product_id, $order_id );
$line_updates[] = array(
'properties' => $properties,
);
endforeach;
}
$line_updates = apply_filters( 'hubwoo_custom_line_item', $line_updates, $order_id );
if ( count( $line_updates ) ) {
$line_updates = array(
'inputs' => $line_updates,
);
$flag = true;
if ( Hubwoo::is_access_token_expired() ) {
$hapikey = HUBWOO_CLIENT_ID;
$hseckey = HUBWOO_SECRET_ID;
$status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey );
if ( ! $status ) {
$flag = false;
}
}
if ( $flag ) {
$response = HubWooConnectionMananager::get_instance()->create_batch_object_record( 'line_items', $line_updates );
}
}
if ( 201 == $response['status_code'] || 206 == $response['status_code'] || empty( $object_ids ) ) {
$order->update_meta_data('hubwoo_ecomm_deal_created', 'yes');
$order->save();
$deal_id = $order->get_meta('hubwoo_ecomm_deal_id', true);
if ( isset( $response['body'] ) && ! empty( $response['body'] ) ) {
$created_line_items = json_decode( $response['body'] )->results;
$inputs = array();
foreach($created_line_items as $line_item){
$input = array(
'types' => array(
array(
'associationCategory' => "HUBSPOT_DEFINED",
'associationTypeId' => 19
)
),
'from' => array(
'id' => $deal_id
),
'to' => array(
'id' => $line_item->id
)
);
$inputs[] = $input;
}
$inputs = array('inputs'=>$inputs);
$response = HubWooConnectionMananager::get_instance()->associate_batch_object( 'deal', 'line_item', $inputs);
if($response['status_code'] == 201){
$order->update_meta_data('hubwoo_order_line_item_created', 'yes');
$order->save();
}
if ( 1 == get_option( 'hubwoo_deals_sync_running', 0 ) ) {
$current_count = get_option( 'hubwoo_deals_current_sync_count', 0 );
update_option( 'hubwoo_deals_current_sync_count', ++$current_count );
}
}
}
return $response;
}
}
/**
* Start syncing an ecommerce deal
*
* @since 1.0.0
* @param int $order_id - order id.
* @return array sync response from HubSpot.
*/
public function hubwoo_ecomm_deals_sync( $order_id ) {
if ( ! empty( $order_id ) ) {
$hubwoo_ecomm_order = wc_get_order( $order_id );
if ( $hubwoo_ecomm_order instanceof WC_Order ) {
$customer_id = $hubwoo_ecomm_order->get_customer_id();
if ( ! empty( $customer_id ) ) {
$source = 'user';
self::hubwoo_ecomm_contacts_with_id( $customer_id );
} else {
$source = 'guest';
self::hubwoo_ecomm_guest_user( $order_id );
}
$response = self::hubwoo_ecomm_sync_deal( $order_id, $source, $customer_id );
update_option( 'hubwoo_last_sync_date', time() );
return $response;
}
}
}
/**
* Create a formatted name of the product.
*
* @since 1.0.0
* @param int $product product object.
* @return string formatted name of the product.
*/
public static function hubwoo_ecomm_product_name( $product ) {
if ( $product->get_sku() ) {
$identifier = $product->get_sku();
} else {
$identifier = '#' . $product->get_id();
}
return sprintf( '%2$s (%1$s)', $identifier, $product->get_name() );
}
/**
* Return formatted time for HubSpot
*
* @param int $unix_timestamp current timestamp.
* @return string formatted time.
* @since 1.0.0
*/
public static function hubwoo_set_utc_midnight( $unix_timestamp ) {
$string = gmdate( 'Y-m-d H:i:s', $unix_timestamp );
$date = new DateTime( $string );
$wp_time_zone = get_option( 'timezone_string', '' );
if ( empty( $wp_time_zone ) ) {
$wp_time_zone = 'UTC';
}
$time_zone = new DateTimeZone( $wp_time_zone );
$date->setTimezone( $time_zone );
return $date->getTimestamp() * 1000; // in miliseconds.
}
}