<?php /** * Created by Vextras. * * Name: Pedro Germani * Email: pedro.germani@gmail.com * Date: 04/07/2020 */ if ( ! class_exists( 'MailChimp_WooCommerce_Process_Full_Sync_Manager' ) ) { class MailChimp_WooCommerce_Process_Full_Sync_Manager { /** * @var string */ private $plugin_name = 'mailchimp-woocommerce'; /** * @throws MailChimp_WooCommerce_Error * @throws MailChimp_WooCommerce_RateLimitError * @throws MailChimp_WooCommerce_ServerError */ public function start_sync() { $this->flag_start_sync(); $coupons_sync = new MailChimp_WooCommerce_Process_Coupons(); // start sync processes creation $coupons_sync->createSyncManagers(); } /** * @return $this */ public function flag_start_sync() { $job = new MailChimp_Service(); $job->removeSyncPointers(); update_option("{$this->plugin_name}-sync.config.resync", false); update_option("{$this->plugin_name}-sync.orders.current_page", 1); update_option("{$this->plugin_name}-sync.products.current_page", 1); update_option("{$this->plugin_name}-sync.coupons.current_page", 1); update_option("{$this->plugin_name}-sync.syncing", true); update_option("{$this->plugin_name}-sync.started_at", time()); if (! get_option("{$this->plugin_name}-sync.completed_at")) { update_option("{$this->plugin_name}-sync.initial_sync", 1); } else delete_option("{$this->plugin_name}-sync.initial_sync"); global $wpdb; try { $wpdb->show_errors(false); mailchimp_delete_as_jobs(); mailchimp_flush_sync_job_tables(); $wpdb->show_errors(); } catch (Exception $e) {} mailchimp_log("{$this->plugin_name}-sync.started", "Starting Sync :: ".date('D, M j, Y g:i A')); // flag the store as syncing mailchimp_get_api()->flagStoreSync(mailchimp_get_store_id(), true); return $this; } /** * @throws MailChimp_WooCommerce_Error * @throws MailChimp_WooCommerce_RateLimitError * @throws MailChimp_WooCommerce_ServerError */ function flag_stop_sync() { // this is the last thing we're doing so it's complete as of now. mailchimp_set_data('sync.syncing', false); mailchimp_set_data('sync.completed_at', time()); // set the current sync pages back to 1 if the user hits resync. mailchimp_set_data('sync.orders.current_page', 1); mailchimp_set_data('sync.products.current_page', 1); mailchimp_set_data('sync.coupons.current_page', 1); $sync_started_at = get_option('mailchimp-woocommerce-sync.started_at'); $sync_completed_at = get_option('mailchimp-woocommerce-sync.completed_at'); $sync_total_time = $sync_completed_at - $sync_started_at; $time = gmdate("H:i:s",$sync_total_time); mailchimp_log('sync.completed', "Finished Sync :: ".date('D, M j, Y g:i A'). " (total time: ".$time.")"); // flag the store as sync_finished mailchimp_get_api()->flagStoreSync(mailchimp_get_store_id(), false); // send the sync finished email. MailChimp_WooCommerce_Admin::instance()->mailchimp_send_sync_finished_email(); mailchimp_update_communication_status(); } /** * @throws MailChimp_WooCommerce_Error * @throws MailChimp_WooCommerce_RateLimitError * @throws MailChimp_WooCommerce_ServerError */ public function handle(){ // Trigger respawn $this->recreate(); // get started queueing processes $started = array( 'coupons' => get_option('mailchimp-woocommerce-sync.coupons.started_at'), 'products' => get_option('mailchimp-woocommerce-sync.products.started_at'), 'orders' => get_option('mailchimp-woocommerce-sync.orders.started_at') ); // get completed queueing processes $completed = array( 'coupons' => get_option('mailchimp-woocommerce-sync.coupons.completed_at'), 'products' => get_option('mailchimp-woocommerce-sync.products.completed_at'), 'orders' => get_option('mailchimp-woocommerce-sync.orders.completed_at') ); // allow products and coupons to be synced simultaneously if ($started['coupons'] && !$started['products']) { mailchimp_log('sync.full_sync_manager.queue', 'Starting PRODUCTS queueing.'); //create Product Sync object $product_sync = new MailChimp_WooCommerce_Process_Products(); // queue first job //mailchimp_handle_or_queue($product_sync); //trigger subsequent jobs creation $product_sync->createSyncManagers(); } // Only start orders when product jobs are all finished if ($completed['products'] && !$started['orders'] ) { // check if we have products still to be synced if (mailchimp_get_remaining_jobs_count('MailChimp_WooCommerce_Single_Product') == 0 && mailchimp_get_remaining_jobs_count('MailChimp_WooCommerce_Process_Products') <= 0) { $prevent_order_sync = get_option('mailchimp-woocommerce-sync.orders.prevent', false); // only do this if we're not strictly syncing products ( which is the default ). if (!$prevent_order_sync) { // since the products are all good, let's sync up the orders now. $order_sync = new MailChimp_WooCommerce_Process_Orders(); // // queue first job //mailchimp_handle_or_queue($order_sync); // //trigger subsequent jobs creation $order_sync->createSyncManagers(); } // since we skipped the orders feed we can delete this option. delete_option('mailchimp-woocommerce-sync.orders.prevent'); } } if ($completed['orders']) { if (mailchimp_get_remaining_jobs_count('MailChimp_WooCommerce_Single_Order') <= 0 && mailchimp_get_remaining_jobs_count('MailChimp_WooCommerce_Process_Orders') <= 0) { $this->flag_stop_sync(); try { as_unschedule_action('MailChimp_WooCommerce_Process_Full_Sync_Manager', array(), 'mc-woocommerce' ); } catch (Exception $e) {} } } } /** * */ protected function recreate() { as_schedule_single_action(strtotime( '+10 seconds' ), 'MailChimp_WooCommerce_Process_Full_Sync_Manager', array(), 'mc-woocommerce' ); } } }