File: /var/www/shoetique/wp-content/plugins/woocommerce-stock-manager/public/class-stock-manager.php
<?php
/**
 * Stock Manager
 *
 * @package  woocommerce-stock-manager/public/
 * @version  2.8.0
 */
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}
/**
 * Class for Stock Manager.
 */
class Stock_Manager {
	/**
	 * Plugin slug
	 *
	 * @var      string
	 */
	protected $plugin_slug = 'stock-manager';
	/**
	 * Instance of this class.
	 *
	 * @var      object
	 */
	protected static $instance = null;
	/**
	 * Initialize the plugin by setting activation, table, stock updates and loading public scripts and styles.
	 */
	private function __construct() {
		// Activate plugin when new blog is added.
		add_action( 'wpmu_new_blog', array( $this, 'activate_new_site' ) );
		add_action( 'init', array( $this, 'output_buffer' ) );
		add_action( 'init', array( $this, 'create_table' ) );
		add_action( 'woocommerce_product_set_stock', array( $this, 'save_stock' ) );
		add_action( 'woocommerce_variation_set_stock', array( $this, 'save_stock' ) );
	}
	/**
	 * Return the plugin slug.
	 *
	 * @return    Plugin slug variable.
	 */
	public function get_plugin_slug() {
		return $this->plugin_slug;
	}
	/**
	 * Return an instance of this class.
	 *
	 * @return    object    A single instance of this class.
	 */
	public static function get_instance() {
		// If the single instance hasn't been set, set it now.
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}
		return self::$instance;
	}
	/**
	 * Fired when the plugin is activated.
	 *
	 * @param    boolean $network_wide    True if WPMU superadmin uses
	 *                                    "Network Activate" action, false if
	 *                                    WPMU is disabled or plugin is
	 *                                    activated on an individual blog.
	 */
	public static function activate( $network_wide ) {
		if ( function_exists( 'is_multisite' ) && is_multisite() ) {
			if ( $network_wide ) {
				// Get all blog ids.
				$blog_ids = self::get_blog_ids();
				foreach ( $blog_ids as $blog_id ) {
					switch_to_blog( $blog_id );
					self::single_activate();
				}
				restore_current_blog();
			} else {
				self::single_activate();
			}
		} else {
			self::single_activate();
		}
	}
	/**
	 * Fired when the plugin is deactivated.
	 *
	 * @param    boolean $network_wide    True if WPMU superadmin uses
	 *                                    "Network Deactivate" action, false if
	 *                                    WPMU is disabled or plugin is
	 *                                    deactivated on an individual blog.
	 */
	public static function deactivate( $network_wide ) {
		if ( function_exists( 'is_multisite' ) && is_multisite() ) {
			if ( $network_wide ) {
				// Get all blog ids.
				$blog_ids = self::get_blog_ids();
				foreach ( $blog_ids as $blog_id ) {
					switch_to_blog( $blog_id );
					self::single_deactivate();
				}
				restore_current_blog();
			} else {
				self::single_deactivate();
			}
		} else {
			self::single_deactivate();
		}
	}
	/**
	 * Fired when a new site is activated with a WPMU environment.
	 *
	 * @param    int $blog_id    ID of the new blog.
	 */
	public function activate_new_site( $blog_id ) {
		if ( 1 !== did_action( 'wpmu_new_blog' ) ) {
			return;
		}
		switch_to_blog( $blog_id );
		self::single_activate();
		restore_current_blog();
	}
	/**
	 * Get all blog ids of blogs in the current network that are:
	 * - not archived
	 * - not spam
	 * - not deleted
	 *
	 * @return   array|false    The blog ids, false if no matches.
	 */
	private static function get_blog_ids() {
		global $wpdb;
		// get an array of blog ids.
		$result = $wpdb->get_col( // phpcs:ignore
			$wpdb->prepare( // phpcs:ignore
				"SELECT blog_id
									FROM $wpdb->blogs
									WHERE archived = %d AND spam = %d AND deleted = %d",
				0,
				0,
				0
			)
		);
		return $result;
	}
	/**
	 * Fired for each blog when the plugin is activated.
	 */
	private static function single_activate() {
	}
	/**
	 * Fired for each blog when the plugin is deactivated.
	 */
	private static function single_deactivate() {
	}
	/**
	 * Headers allready sent fix
	 */
	public function output_buffer() {
		ob_start();
	}
	/**
	 * Create table if not exists
	 */
	public function create_table() {
		global $wpdb;
		$wpdb->hide_errors();
		$collate = '';
		if ( $wpdb->has_cap( 'collation' ) ) {
			if ( ! empty( $wpdb->charset ) ) {
				$collate .= "DEFAULT CHARACTER SET $wpdb->charset";
			}
			if ( ! empty( $wpdb->collate ) ) {
				$collate .= " COLLATE $wpdb->collate";
			}
		}
		require_once ABSPATH . 'wp-admin/includes/upgrade.php';
		$table = "
            CREATE TABLE {$wpdb->prefix}stock_log (
                ID bigint(255) NOT NULL AUTO_INCREMENT,
                date_created datetime NOT NULL,
                product_id bigint(255) NOT NULL,
                qty int(10) NOT NULL,
                PRIMARY KEY  (`ID`)
            ) $collate;
        ";
		dbDelta( $table );
	}
	/**
	 * Save stock change
	 *
	 * @param WC_Product $product Product Object.
	 */
	public function save_stock( $product ) {
		if ( ! $product instanceof WC_Product ) {
			return;
		}
		global $wpdb;
		$data                 = array();
		$data['date_created'] = gmdate( 'Y-m-d H:i:s', time() );
		$data['product_id']   = $product->get_id();
		$data['qty']          = $product->get_stock_quantity();
		$data['qty']          = ( empty( $data['qty'] ) ) ? 0 : intval( $data['qty'] );
		$wpdb->query( // phpcs:ignore
			$wpdb->prepare( // phpcs:ignore
				"INSERT INTO {$wpdb->prefix}stock_log ( date_created, product_id, qty ) VALUES ( %s, %d, %d ) ",
				$data
			)
		);
	}
}//end class