first commit

This commit is contained in:
2024-07-15 11:28:08 +02:00
commit f52d538ea5
21891 changed files with 6161164 additions and 0 deletions

View File

@@ -0,0 +1,207 @@
<?php
if (!defined('ABSPATH')) exit; // Exit if accessed directly
/**
* Class FlycartWooDiscountRulesAdvancedHelper
*/
if (!class_exists('FlycartWooDiscountRulesAdvancedHelper')) {
class FlycartWooDiscountRulesAdvancedHelper
{
/**
* Get all hierarchical taxonomy terms
*
* @access public
* @param string $taxonomy
* @param array $ids
* @param string $query
* @return array
*/
public static function get_all_hierarchical_taxonomy_terms($taxonomy, $ids = array(), $query = '')
{
$items = array();
// Get terms
$terms = get_terms(array($taxonomy), array('hide_empty' => 0));
if(!empty($terms)){
// Iterate over terms
foreach ($terms as $term_key => $term) {
if(isset($term->name)){
$term_count = count($terms);
// Get term name
$term_name = $term->name;
$term_slug = $term->slug;
// Term has parent
if ($term->parent) {
$parent_id = $term->parent;
$has_parent = true;
// Make sure we don't have an infinite loop here (happens with some kind of "ghost" terms)
$found = false;
$i = 0;
while ($has_parent && ($i < $term_count || $found)) {
// Reset each time
$found = false;
$i = 0;
// Iterate over terms again
foreach ($terms as $parent_term_key => $parent_term) {
$i++;
if ($parent_term->term_id == $parent_id) {
$term_name = $parent_term->name . ' → ' . $term_name;
$found = true;
if ($parent_term->parent) {
$parent_id = $parent_term->parent;
}
else {
$has_parent = false;
}
break;
}
}
}
}
// Get term id
$term_id = (string) $term->term_id;
// Skip this item if we don't need it
if (!empty($ids) && !in_array($term_id, $ids, true)) {
continue;
}
// Add item
$items[] = array(
'id' => $term_id,
'text' => $term_name,
'slug' => $term_slug
);
}
}
}
return $items;
}
/**
* Get all product attributes based on criteria
*
* @access public
* @param array $ids
* @param string $query
* @return array
*/
public static function get_all_product_attributes($ids = array(), $query = '')
{
global $wc_product_attributes;
$items = array();
// Iterate over product attributes
foreach ($wc_product_attributes as $attribute_key => $attribute) {
// Get attribute name
$attribute_name = !empty($attribute->attribute_label) ? $attribute->attribute_label : $attribute->attribute_name;
// Get terms for this attribute
$terms = self::get_all_hierarchical_taxonomy_terms($attribute_key, $ids, $query);
// Iterate over subitems and make a list of item/subitem pairs
foreach ($terms as $term) {
$items[] = array(
'id' => $term['id'],
'text' => $attribute_name . ': ' . $term['text'],
);
}
}
return $items;
}
/**
* Validate the cart item has the attributes selected
*
* @param array $variations
* @param array $selectedAttributes
* @return array
* */
public static function validateCartItemInSelectedAttributes($variations, $selectedAttributes, $all_attr = false){
$attributeMatches = 0;
if(!empty($variations)){
if($all_attr){
$available_attributes = array();
foreach ($variations as $key => $variation) {
$name = substr($key, 10);//Remove attribute_
$terms = self::get_all_hierarchical_taxonomy_terms($name);
if(!empty($terms)){
foreach ($terms as $term) {
if(strtolower($term['slug']) === strtolower($variation)){
$available_attributes[] = $term['id'];
}
}
}
}
if(!empty($available_attributes)){
foreach ($selectedAttributes as $attribute_list_item){
if(!in_array($attribute_list_item, $available_attributes)){
$attributeMatches = 0;
break;
}
$attributeMatches = 1;
}
}
} else {
foreach ($variations as $key => $variation) {
$name = substr($key, 10);//Remove attribute_
$terms = self::get_all_hierarchical_taxonomy_terms($name);
if(!empty($terms)){
foreach ($terms as $term) {
if(strtolower($term['slug']) === strtolower($variation)){
if(in_array($term['id'], $selectedAttributes)){
$attributeMatches = 1;
break;
}
}
}
if($attributeMatches){
break;
}
}
}
}
}
return $attributeMatches;
}
/**
* Subtotals are costs before discounts.
*
* To prevent rounding issues we need to work with the inclusive price where possible.
* otherwise we'll see errors such as when working with a 9.99 inc price, 20% VAT which would.
* be 8.325 leading to totals being 1p off.
*
* Pre tax coupons come off the price the customer thinks they are paying - tax is calculated.
* afterwards.
*
* e.g. $100 bike with $10 coupon = customer pays $90 and tax worked backwards from that.
*
* @since 3.2.0
*/
public static function get_calculated_item_subtotal() {
$cart_total = new FlycartWooDiscountRulesCartTotals();
$total = $cart_total->calculate_item_subtotals();
return $total;
}
}
}

View File

@@ -0,0 +1,216 @@
<?php
if (!defined('ABSPATH')) exit; // Exit if accessed directly
/**
* Class FlycartWooDiscountRulesCartTotals
*/
if (!class_exists('FlycartWooDiscountRulesCartTotals')) {
class FlycartWooDiscountRulesCartTotals
{
protected $items = array();
protected $calculate_tax = true;
/**
* Subtotals are costs before discounts.
*
* To prevent rounding issues we need to work with the inclusive price where possible.
* otherwise we'll see errors such as when working with a 9.99 inc price, 20% VAT which would.
* be 8.325 leading to totals being 1p off.
*
* Pre tax coupons come off the price the customer thinks they are paying - tax is calculated.
* afterwards.
*
* e.g. $100 bike with $10 coupon = customer pays $90 and tax worked backwards from that.
*
* @since 3.2.0
*/
public function calculate_item_subtotals() {
$this->cart = WC()->cart;
if(method_exists($this->cart, 'get_customer')){
$customer = $this->cart->get_customer();
} else {
$customer = WC()->customer;
}
$this->calculate_tax = wc_tax_enabled() && ! $customer->get_is_vat_exempt();
$this->get_items_from_cart();
foreach ( $this->items as $item_key => $item ) {
if ( $item->price_includes_tax ) {
if ( $customer->get_is_vat_exempt() ) {
$item = $this->remove_item_base_taxes( $item );
} elseif ( apply_filters( 'woocommerce_adjust_non_base_location_prices', true ) ) {
$item = $this->adjust_non_base_location_price( $item );
}
}
$item->subtotal = $item->price;
$subtotal_taxes = array();
if ($this->calculate_tax && $item->product->is_taxable() ) {
$subtotal_taxes = WC_Tax::calc_tax( $item->subtotal, $item->tax_rates, $item->price_includes_tax );
$item->subtotal_tax = array_sum( array_map( array( $this, 'round_line_tax' ), $subtotal_taxes ) );
if ( $item->price_includes_tax ) {
// Use unrounded taxes so we can re-calculate from the orders screen accurately later.
$item->subtotal = $item->subtotal - array_sum( $subtotal_taxes );
}
}
}
$item_subtotal = array_sum( array_map( 'round', array_values( wp_list_pluck( $this->items, 'subtotal' ) ) ) );
$items_subtotal_tax = array_sum( array_values( wp_list_pluck( $this->items, 'subtotal_tax' ) ) );
$subtotal = $item_subtotal;
if(get_option('woocommerce_tax_display_cart', 'incl') == 'incl'){
$subtotal = $item_subtotal + $items_subtotal_tax;
}
if(function_exists('wc_remove_number_precision_deep')){
return wc_remove_number_precision_deep( $subtotal );
} else {
return $subtotal;
}
}
/**
* Ran to remove all base taxes from an item. Used when prices include tax, and the customer is tax exempt.
*
* @since 3.2.2
* @param object $item Item to adjust the prices of.
* @return object
*/
protected function remove_item_base_taxes( $item ) {
if ( $item->price_includes_tax && $item->taxable ) {
$base_tax_rates = WC_Tax::get_base_tax_rates( $item->product->get_tax_class( 'unfiltered' ) );
// Work out a new base price without the shop's base tax.
$taxes = WC_Tax::calc_tax( $item->price, $base_tax_rates, true );
// Now we have a new item price (excluding TAX).
$item->price = round( $item->price - array_sum( $taxes ) );
$item->price_includes_tax = false;
}
return $item;
}
/**
* Only ran if woocommerce_adjust_non_base_location_prices is true.
*
* If the customer is outside of the base location, this removes the base
* taxes. This is off by default unless the filter is used.
*
* Uses edit context so unfiltered tax class is returned.
*
* @since 3.2.0
* @param object $item Item to adjust the prices of.
* @return object
*/
protected function adjust_non_base_location_price( $item ) {
if ( $item->price_includes_tax && $item->taxable ) {
$base_tax_rates = WC_Tax::get_base_tax_rates( $item->product->get_tax_class( 'unfiltered' ) );
if ( $item->tax_rates !== $base_tax_rates ) {
// Work out a new base price without the shop's base tax.
$taxes = WC_Tax::calc_tax( $item->price, $base_tax_rates, true );
$new_taxes = WC_Tax::calc_tax( $item->price - array_sum( $taxes ), $item->tax_rates, false );
// Now we have a new item price.
$item->price = round( $item->price - array_sum( $taxes ) + array_sum( $new_taxes ) );
}
}
return $item;
}
/**
* Should we round at subtotal level only?
*
* @return bool
*/
protected function round_at_subtotal() {
return 'yes' === get_option( 'woocommerce_tax_round_at_subtotal' );
}
/**
* Apply rounding to an array of taxes before summing. Rounds to store DP setting, ignoring precision.
*
* @since 3.2.6
* @param float $value Tax value.
* @return float
*/
protected function round_line_tax( $value ) {
if ( ! $this->round_at_subtotal() ) {
$value = wc_round_tax_total( $value, 0 );
}
return $value;
}
/**
* Handles a cart or order object passed in for calculation. Normalises data
* into the same format for use by this class.
*
* Each item is made up of the following props, in addition to those returned by get_default_item_props() for totals.
* - key: An identifier for the item (cart item key or line item ID).
* - cart_item: For carts, the cart item from the cart which may include custom data.
* - quantity: The qty for this line.
* - price: The line price in cents.
* - product: The product object this cart item is for.
*
* @since 3.2.0
*/
protected function get_items_from_cart() {
$this->items = array();
foreach ( WC()->cart->cart_contents as $cart_item_key => $cart_item ) {
if(function_exists('wc_add_number_precision_deep')){
$price = wc_add_number_precision_deep( $cart_item['data']->get_price() * $cart_item['quantity'] );
} else {
$price = $cart_item['data']->get_price() * $cart_item['quantity'];
}
$item = $this->get_default_item_props();
$item->key = $cart_item_key;
$item->object = $cart_item;
$item->tax_class = $cart_item['data']->get_tax_class();
$item->taxable = 'taxable' === $cart_item['data']->get_tax_status();
$item->price_includes_tax = wc_prices_include_tax();
$item->quantity = $cart_item['quantity'];
$item->price = $price;
$item->product = $cart_item['data'];
$item->tax_rates = $this->get_item_tax_rates( $item );
$this->items[ $cart_item_key ] = $item;
}
}
/**
* Get default blank set of props used per item.
*
* @since 3.2.0
* @return array
*/
protected function get_default_item_props() {
return (object) array(
'object' => null,
'tax_class' => '',
'taxable' => false,
'quantity' => 0,
'product' => false,
'price_includes_tax' => false,
'subtotal' => 0,
'subtotal_tax' => 0,
'total' => 0,
'total_tax' => 0,
'taxes' => array(),
);
}
/**
* Get tax rates for an item. Caches rates in class to avoid multiple look ups.
*
* @param object $item Item to get tax rates for.
* @return array of taxes
*/
protected function get_item_tax_rates( $item ) {
$tax_class = $item->product->get_tax_class();
if(method_exists($this->cart, 'get_customer')){
return isset( $this->item_tax_rates[ $tax_class ] ) ? $this->item_tax_rates[ $tax_class ] : $this->item_tax_rates[ $tax_class ] = WC_Tax::get_rates( $item->product->get_tax_class(), $this->cart->get_customer() );
} else {
return isset( $this->item_tax_rates[ $tax_class ] ) ? $this->item_tax_rates[ $tax_class ] : $this->item_tax_rates[ $tax_class ] = WC_Tax::get_rates( $item->product->get_tax_class(), WC()->customer );
}
}
}
}

View File

@@ -0,0 +1,155 @@
<?php
if (!defined('ABSPATH')) exit; // Exit if accessed directly
/*
* Check if WooCommerce is active
*/
if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
function woodiscountfree_shipping_method() {
if ( ! class_exists( 'WooDiscountFree_Shipping_Method' ) ) {
class WooDiscountFree_Shipping_Method extends WC_Shipping_Method {
/**
* Constructor for your shipping class
*/
public function __construct() {
$this->id = 'woodiscountfree';
$this->method_title = __( 'WooDiscount Free Shipping', 'woo-discount-rules' );
$this->method_description = __( 'Custom Shipping Method for Woocommerce Discount Rules', 'woo-discount-rules' );
$this->init();
$this->enabled = isset( $this->settings['enabled'] ) ? $this->settings['enabled'] : 'yes';
global $flycart_woo_discount_rules;
//$this->title = isset( $this->settings['title'] ) ? $this->settings['title'] : __( 'Free Shipping', 'woo-discount-rules' );
$title = $flycart_woo_discount_rules->discountBase->getConfigData('free_shipping_text', 'Free Shipping');
if(empty($title)) $title = 'Free Shipping';
$this->title = __( $title, 'woo-discount-rules' );
}
/**
* Init your settings
*
* @access public
* @return void
*/
function init() {
// Load the settings API
$this->init_form_fields();
$this->init_settings();
// Save settings in admin if you have any defined
add_action( 'woocommerce_update_options_shipping_' . $this->id, array( $this, 'process_admin_options' ) );
add_filter( 'woocommerce_shipping_'.$this->id.'_is_available', array($this, 'woodiscount_hide_shipping_when_is_available'), 100 );
}
function woodiscount_hide_shipping_when_is_available(){
$discountBase = new FlycartWooDiscountBase();
$discountBase->handleCartDiscount(1);
if($discountBase->has_free_shipping){
return true;
} else {
return false;
}
}
/**
* Does this method have a settings page?
* @return bool
*/
public function has_settings() {
return false; //$this->instance_id ? $this->supports( 'instance-settings' ) : $this->supports( 'settings' );
}
/**
* Define settings field for this shipping
* @return void
*/
function init_form_fields() {
global $flycart_woo_discount_rules;
$title = $flycart_woo_discount_rules->discountBase->getConfigData('free_shipping_text', __( 'Free Shipping', 'woo-discount-rules' ));
if(empty($title)) $title = 'Free Shipping';
$this->form_fields = array(
'enabled' => array(
'title' => __( 'Enable', 'woo-discount-rules' ),
'type' => 'checkbox',
'description' => __( 'Enable this shipping.', 'woo-discount-rules' ),
'default' => 'yes'
),
'title' => array(
'title' => __( 'Title', 'woo-discount-rules' ),
'type' => 'text',
'description' => __( 'Title to be display on site', 'woo-discount-rules' ),
'default' => __( $title, 'woo-discount-rules' ),
)
);
}
/**
* This function is used to calculate the shipping cost. Within this function we can check for weights, dimensions and other parameters.
*
* @access public
* @param mixed $package
* @return void
*/
public function calculate_shipping( $package = array() ) {
$rate = array(
'id' => $this->id,
'label' => $this->title,
'cost' => 0,
'taxes' => false,
'package' => $package
);
$this->add_rate( $rate );
}
}
}
}
$enable_free_shipping = $flycart_woo_discount_rules->discountBase->getConfigData('enable_free_shipping', "none");
if($enable_free_shipping == "woodiscountfree"){
add_action( 'woocommerce_shipping_init', 'woodiscountfree_shipping_method' );
function add_woodiscountfree_shipping_method( $methods ) {
$methods[] = 'WooDiscountFree_Shipping_Method';
return $methods;
}
add_filter( 'woocommerce_shipping_methods', 'add_woodiscountfree_shipping_method' );
} else if($enable_free_shipping == "free_shipping"){
function woodiscount_hide_free_shipping_when_is_available(){
$discountBase = new FlycartWooDiscountBase();
$discountBase->handleCartDiscount(1);
if($discountBase->has_free_shipping){
return true;
} else {
return false;
}
}
add_filter( 'woocommerce_shipping_free_shipping_is_available', 'woodiscount_hide_free_shipping_when_is_available');
}
if($enable_free_shipping != "none"){
function reset_default_shipping_method_woo_discount( $method, $available_methods ) {
if(!empty($available_methods) && is_array($available_methods)) {
$shipping_methods = array_keys($available_methods);
if(!empty($shipping_methods)){
foreach ($shipping_methods as $key => $shipping_method) {
if (strpos($shipping_method, 'free_shipping') === 0) {
$method = $shipping_method;
}
}
if(in_array('woodiscountfree', $shipping_methods)) $method = 'woodiscountfree';
}
}
return $method;
}
add_filter('woocommerce_shipping_chosen_method', 'reset_default_shipping_method_woo_discount', 100, 2);
}
}

View File

@@ -0,0 +1,124 @@
<?php
if (!defined('ABSPATH')) exit; // Exit if accessed directly
/**
* Class FlycartWooDiscountRulesPriceProductDependent
*/
if (!class_exists('FlycartWooDiscountRulesPriceProductDependent')) {
class FlycartWooDiscountRulesPriceProductDependent
{
/**
* Get discount in each products
* */
public static function getDiscountInEachProducts($item, $rule, $checkRuleMatches, $productPage = 0, $for_product_id = 0){
$discounts = array();
$product_to_apply_count_option = isset($rule['product_based_condition']['product_to_apply_count_option'])? $rule['product_based_condition']['product_to_apply_count_option']: 'all';
$product_to_apply_count = isset($rule['product_based_condition']['product_to_apply_count'])? $rule['product_based_condition']['product_to_apply_count']: '';
$product_to_apply = isset($rule['product_based_condition']['product_to_apply'])? $rule['product_based_condition']['product_to_apply']: array();
$discount_type = isset($rule['product_based_discount']['discount_type'])? $rule['product_based_discount']['discount_type']: 'percentage_discount';
$discount_value = isset($rule['product_based_discount']['discount_value'])? $rule['product_based_discount']['discount_value']: 0;
$product_discount_details = array();
$product_discount_details['discount_type'] = $discount_type;
$product_discount_details['discount_value'] = $discount_value;
$product_discount_details['discount_quantity'] = 0;
$product_discount_details['discount_price'] = '';
if($discount_type == 'percentage_discount')
$originalDiscount = array('percentage_discount' => $discount_value);
else
$originalDiscount = array('price_discount' => $discount_value);
if($product_to_apply_count_option == 'all'){
foreach ($product_to_apply as $product_id){
$discounts[$product_id] = $originalDiscount;
}
} else if($product_to_apply_count_option == 'skip_first'){
$product_to_apply_count_to_apply = $product_to_apply_count;
$cart = FlycartWoocommerceCart::get_cart();
foreach ($cart as $cart_item_key => $values) {
$_product = $values['data'];
$quantity = $values['quantity'];
if($product_to_apply_count_to_apply > 0){
$product_id = FlycartWoocommerceProduct::get_id($_product);
if($productPage && $product_id == $for_product_id){
$quantity++;
}
if (in_array($product_id, $product_to_apply)){
if($product_to_apply_count_to_apply >= $quantity){
$discounts[$product_id] = array('percentage_discount' => 0);
$product_to_apply_count_to_apply -= $quantity;
} else if($product_to_apply_count_to_apply < $quantity){
$apply_for_only_quantity = $quantity - $product_to_apply_count_to_apply;
$price_discount = self::getDiscountForLimitedProductCount($_product, $discount_type, $discount_value, $quantity, $apply_for_only_quantity);
$price_discount_details = $product_discount_details;
$price_discount_details['discount_price'] = $price_discount['single_product_discount'];
$price_discount_details['discount_quantity'] = $apply_for_only_quantity;
$price_discount = $price_discount['discount'];
$discounts[$product_id] = array('price_discount' => $price_discount, 'product_discount_details' => $price_discount_details);
$product_to_apply_count_to_apply -= $quantity;
}
}
}
}
foreach ($product_to_apply as $product_id){
if(!isset($discounts[$product_id]))
$discounts[$product_id] = $originalDiscount;
}
} else {
$product_to_apply_count_to_apply = $product_to_apply_count;
$cart = FlycartWoocommerceCart::get_cart();
foreach ($cart as $cart_item_key => $values) {
$_product = $values['data'];
$quantity = $values['quantity'];
if($product_to_apply_count_to_apply > 0){
$product_id = FlycartWoocommerceProduct::get_id($_product);
if (in_array($product_id, $product_to_apply)){
if($product_to_apply_count_to_apply > 0){
if($product_to_apply_count_to_apply >= $quantity){
$discounts[$product_id] = $originalDiscount;
$product_to_apply_count_to_apply -= $quantity;
} elseif ($product_to_apply_count_to_apply < $quantity){
$apply_for_only_quantity = $product_to_apply_count_to_apply;
$price_discount = self::getDiscountForLimitedProductCount($_product, $discount_type, $discount_value, $quantity, $apply_for_only_quantity);
$price_discount_details = $product_discount_details;
$price_discount_details['discount_price'] = $price_discount['single_product_discount'];
$price_discount_details['discount_quantity'] = $apply_for_only_quantity;
$price_discount = $price_discount['discount'];
$discounts[$product_id] = array('price_discount' => $price_discount, 'product_discount_details' => $price_discount_details);
$product_to_apply_count_to_apply = 0;
}
}
}
}
}
foreach ($product_to_apply as $product_id){
if(!isset($discounts[$product_id])){
if($product_to_apply_count_to_apply > 0)
$discounts[$product_id] = $originalDiscount;
else
$discounts[$product_id] = array('percentage_discount' => 0);
}
}
}
return $discounts;
}
/**
* Get cheapest product
* */
public static function getDiscountForLimitedProductCount($_product, $discount_type, $discount_value, $quantity, $discount_quantity = 1){
$productPrice = FlycartWoocommerceProduct::get_price($_product);
if($discount_type == 'percentage_discount')
$discountPrice = $productPrice * ($discount_value / 100);
else
$discountPrice = $discount_value;
if($discount_quantity > $quantity)
$discount_price = $discountPrice - (($discountPrice/($quantity)) * ($quantity-$quantity));
else
$discount_price = $discountPrice - (($discountPrice/($quantity)) * ($quantity-$discount_quantity));
return array('discount' => $discount_price, 'single_product_discount' => $discountPrice);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,924 @@
<?php
if (!defined('ABSPATH')) exit; // Exit if accessed directly
global $woocommerce;
/**
* Class FlycartWooDiscountBase
*/
if (!class_exists('FlycartWooDiscountBase')) {
class FlycartWooDiscountBase
{
/**
* @var string
*/
public $default_page = 'pricing-rules';
/**
* @var string
*/
public $default_option = 'woo-discount-config';
/**
* @var array
*/
private $instance = array();
public $has_free_shipping = 0;
/**
* FlycartWooDiscountBase constructor.
*/
public function __construct() {}
/**
* Singleton Instance maker.
*
* @param $name
* @return bool
*/
public function getInstance($name)
{
if (!isset($this->instance[$name])) {
if (class_exists($name)) {
$this->instance[$name] = new $name;
$instance = $this->instance[$name];
} else {
$instance = false;
}
} else {
$instance = $this->instance[$name];
}
return $instance;
}
/**
* Managing discount of Price and Cart.
*/
public function handleDiscount()
{
global $woocommerce;
$price_discount = $this->getInstance('FlycartWooDiscountRulesPricingRules');
$cart_discount = $this->getInstance('FlycartWooDiscountRulesCartRules');
$price_discount->analyse($woocommerce);
$cart_discount->analyse($woocommerce);
}
/**
* Managing discount of Cart.
*/
public function handleCartDiscount($free_shipping_check = 0)
{
global $woocommerce;
$cart_discount = $this->getInstance('FlycartWooDiscountRulesCartRules');
$cart_discount->analyse($woocommerce, $free_shipping_check);
if($free_shipping_check){
$this->has_free_shipping = $cart_discount->has_free_shipping;
}
}
/**
* Managing discount of Price.
*/
public function handlePriceDiscount()
{
global $woocommerce;
$price_discount = $this->getInstance('FlycartWooDiscountRulesPricingRules');
$price_discount->analyse($woocommerce);
}
/**
* For adding script in checkout page
* */
public function addScriptInCheckoutPage(){
$script = '<script type="text/javascript">
jQuery( function( $ ) {
$(document).ready(function() {
$( document.body ).on( "blur", "input#billing_email", function() {
$("select#billing_country").trigger("change");
});
});
});
</script>';
echo $script;
}
/**
* WooCommerce hook to change the name of a product.
*
* @param $title
* @return mixed
*/
public function modifyName($title)
{
//
return $title;
}
/**
* Finally, on triggering the "Thank You" hook by WooCommerce,
* Overall session data's are stored to the order's meta as "woo_discount_log".
*
* @param integer $order_id Order ID.
*/
public function storeLog($order_id)
{
$log['price_discount'] = WC()->session->get('woo_price_discount', array());
$log['cart_discount'] = WC()->session->get('woo_cart_discount', array());
add_post_meta($order_id, 'woo_discount_log', json_encode($log), 1);
// Reset the Coupon Status.
WC()->session->set('woo_coupon_removed', '');
}
/**
* Create New Menu On WooCommerce.
*/
public function adminMenu()
{
if (!is_admin()) return;
global $submenu;
if (isset($submenu['woocommerce'])) {
add_submenu_page(
'woocommerce',
'Woo Discount Rules',
'Woo Discount Rules',
'edit_posts',
'woo_discount_rules',
array($this, 'viewManager')
);
}
}
/**
* Update the Status of the Rule Set.
*/
public function updateStatus()
{
$postData = \FlycartInput\FInput::getInstance();
$id = $postData->get('id', false);
if ($id) {
$status = get_post_meta($id, 'status', false);
if (isset($status[0])) {
$state = ($status[0] == 'publish') ? 'disable' : 'publish';
update_post_meta($id, 'status', $state);
} else {
add_post_meta($id, 'status', 'disable');
$state = 'disable';
}
echo ucfirst($state);
}
die();
}
/**
* Remove the Rule Set.
*/
public function removeRule()
{
$postData = \FlycartInput\FInput::getInstance();
$id = $postData->get('id', false);
if ($id) {
try {
$id = intval($id);
if (!$id) return false;
wp_delete_post($id);
} catch (Exception $e) {
//
}
}
die();
}
// -------------------------------------- PRICE RULES ---------------------------------------------------------------
/**
* Saving the Price Rule.
*
* @return bool
*/
public function savePriceRule()
{
$postData = \FlycartInput\FInput::getInstance();
$request = $postData->getArray();
$params = array();
if (!isset($request['data'])) return false;
parse_str($request['data'], $params);
$pricing_rule = $this->getInstance('FlycartWooDiscountRulesPricingRules');
$pricing_rule->save($params);
die();
}
// -------------------------------------- CART RULES ----------------------------------------------------------------
/**
* Saving the Cart Rule.
*
* @return bool
*/
public function saveCartRule()
{
$postData = \FlycartInput\FInput::getInstance();
$request = $postData->getArray();
$params = array();
if (!isset($request['data'])) return false;
parse_str($request['data'], $params);
$this->parseFormWithRules($params, true);
$pricing_rule = $this->getInstance('FlycartWooDiscountRulesCartRules');
$pricing_rule->save($params);
die();
}
/**
* load product select box
*
* @return bool
*/
public function loadProductSelectBox() {
$postData = \FlycartInput\FInput::getInstance();
$request = $postData->getArray();
if (!isset($request['name'])) return false;
echo FlycartWoocommerceProduct::getProductAjaxSelectBox(array(), $request['name']);
die();
}
/**
* Making the reliable end data to store.
*
* @param $cart_rules
* @param bool $isCartRules
*/
public function parseFormWithRules(&$cart_rules, $isCartRules = false)
{
$cart_rules['discount_rule'] = $this->generateFormData($cart_rules, $isCartRules);
}
/**
* @param $cart_rules
* @param bool $isCartRules
* @return array
*/
public function generateFormData($cart_rules, $isCartRules = false)
{
$link = $this->fieldLink();
$discount_list = array();
// Here, Eliminating the Cart's rule with duplicates.
$discount_rule = (isset($cart_rules['discount_rule']) ? $cart_rules['discount_rule'] : array());
if ($isCartRules) {
foreach ($discount_rule as $index => $value) {
// The Type of Option should get value from it's native index.
// $link[$value['type']] will gives the native index of the "type"
if (isset($link[$value['type']])) {
if(is_array($link[$value['type']])){
foreach ($link[$value['type']] as $fields){
$discount_list[$index][$value['type']][$fields] = $value[$fields];
}
} else if (isset($value[$link[$value['type']]])) {
$discount_list[$index][$value['type']] = $value[$link[$value['type']]];
}
} else {
$discount_list[$index][$value['type']] = $value['option_value'];
}
}
}
return $discount_list;
}
/**
* @return array
*/
public function fieldLink()
{
// TODO: Check Subtotal Link
return array(
'products_atleast_one' => 'product_to_apply',
'products_not_in' => 'product_to_apply',
'categories_atleast_one' => 'category_to_apply',
'categories_not_in' => 'category_to_apply',
'categories_in' => 'category_to_apply',
'in_each_category' => 'category_to_apply',
'atleast_one_including_sub_categories' => 'category_to_apply',
'users_in' => 'users_to_apply',
'roles_in' => 'user_roles_to_apply',
'shipping_countries_in' => 'countries_to_apply',
'customer_based_on_purchase_history' => array('purchase_history_order_status', 'purchased_history_amount', 'purchased_history_type'),
'customer_based_on_purchase_history_order_count' => array('purchase_history_order_status', 'purchased_history_amount', 'purchased_history_type'),
'customer_based_on_purchase_history_product_order_count' => array('purchase_history_order_status', 'purchased_history_amount', 'purchased_history_type', 'purchase_history_products'),
);
}
// ----------------------------------------- CART RULES END --------------------------------------------------------
// -------------------------------------------SETTINGS--------------------------------------------------------------
/**
*
*/
public function saveConfig($licenceValidate = 0)
{
$postData = \FlycartInput\FInput::getInstance();
$request = $postData->getArray();
$params = array();
if (isset($request['data'])) {
parse_str($request['data'], $params);
}
if (is_array($request)) {
if(isset($params['show_draft']) && $params['show_draft']){
$params['show_draft'] = 1;
} else {
$params['show_draft'] = 0;
}
foreach ($params as $index => $item) {
// $params[$index] = FlycartWooDiscountRulesGeneralHelper::makeString($item);
$params[$index] = $item;
}
$params = json_encode($params);
}
// else {
// $params = FlycartWooDiscountRulesGeneralHelper::makeString($params);
// }
if (get_option($this->default_option)) {
update_option($this->default_option, $params);
} else {
add_option($this->default_option, $params);
}
if(!$licenceValidate)
die();
}
public function resetWDRCache(){
$price_discount = $this->getInstance('FlycartWooDiscountRulesPricingRules');
$result = $price_discount->updateLastUpdateTimeOfRule();
if($result){
esc_html_e('Cache cleared successfully', 'woo-discount-rules');
} else {
esc_html_e('Failed to clear cache', 'woo-discount-rules');
}
die();
}
/**
* @return array
*/
public function getBaseConfig()
{
$option = get_option($this->default_option);
if (!$option || is_null($option)) {
return array();
} else {
return $option;
}
}
/**
* Get Config data
*
* @param String $key
* @param mixed $default
* @return mixed
* */
public function getConfigData($key, $default = ''){
$config = $this->getBaseConfig();
if (is_string($config)) $config = json_decode($config, true);
return isset($config[$key])? $config[$key] : $default;
}
// -------------------------------------------SETTINGS END----------------------------------------------------------
/**
* @param $request
* @return bool
*/
public function checkSubmission($request)
{
if (isset($request['form']) && !empty($request['form'])) {
$form = sanitize_text_field($request['form']);
if (strpos($form, '_save') === false) return false;
// For Saving Form
$form = str_replace('_save', '', $form);
// To Verify, the submitted form is in the Registered List or Not
if (in_array($form, $this->formList())) {
if (isset($request['page'])) {
switch ($form) {
case 'pricing_rules':
die(123);
$pricing_rule = $this->getInstance('FlycartWooDiscountRulesPricingRules');
$pricing_rule->save($request);
break;
case 'cart_rules':
$cart_rules = $this->getInstance('FlycartWooDiscountRulesCartRules');
$cart_rules->save($request);
break;
case 'settings':
$this->save($request);
break;
default:
// Invalid Submission.
break;
}
}
}
}
}
/**
* @param $option
*/
public function checkAccess(&$option)
{
$postData = \FlycartInput\FInput::getInstance();
// Handling View
if ($postData->get('view', false)) {
$option = $option . '-view';
// Type : Price or Cart Discounts.
} elseif ($postData->get('type', false)) {
if ($postData->get('tab', false)) {
if ($postData->get('tab', '') == 'cart-rules') {
$option = 'cart-rules-new';
if ($postData->get('type', '') == 'view') $option = 'cart-rules-view';
}
} else {
$option = $option . '-' . $postData->get('type', '');
}
}
}
/**
* @param $request
*/
public function save($request)
{
// Save General Settings of the Plugin.
}
/**
* Do bulk action
* */
public function doBulkAction(){
$postData = \FlycartInput\FInput::getInstance();
$request = $postData->getArray();
if(empty($request['bulk_action'])){
echo esc_html__('Failed to do action', 'woo-discount-rules');exit;
}
$result = array();
$had_action = 0;
if(!empty($request['post'])){
foreach ($request['post'] as $key => $id){
$had_action = 1;
$result[$key] = 0;
if($id){
switch ($request['bulk_action']){
case 'unpublish':
$status = get_post_meta($id, 'status', true);
if (!empty($status)) {
$result[$key] = update_post_meta($id, 'status', 'disable');
}
break;
case 'delete':
try {
$id = intval($id);
if ($id) $result[$key] = wp_delete_post($id);
} catch (Exception $e) {
}
break;
default:
$status = get_post_meta($id, 'status', true);
if (!empty($status)) {
$result[$key] = update_post_meta($id, 'status', 'publish');
}
break;
}
}
}
}
if(!$had_action){
echo esc_html__('Failed to do action', 'woo-discount-rules');
} else{
switch ($request['bulk_action']){
case 'unpublish':
echo esc_html__('Disabled successfully', 'woo-discount-rules');
break;
case 'delete':
echo esc_html__('Deleted successfully', 'woo-discount-rules');
break;
default:
echo esc_html__('Enabled successfully', 'woo-discount-rules');
break;
}
}
die();
}
/**
* Create a duplicate rule
* */
public function createDuplicateRule(){
$purchase = new FlycartWooDiscountRulesPurchase();
$isPro = $purchase->isPro();
if(!$isPro) return false;
$postData = \FlycartInput\FInput::getInstance();
$request = $postData->getArray();
if(!empty($request['id']) && (int)$request['id'] && !empty($request['type'])){
$post = get_post( (int)$request['id'] );
if(!empty($post)){
$post_new = array(
'post_title' => $post->post_title.' - '.esc_html__('copy', 'woo-discount-rules'),
'post_name' => $post->post_title.' - '.esc_html__('copy', 'woo-discount-rules'),
'post_content' => 'New Rule',
'post_type' => $post->post_type,
'post_status' => 'publish'
);
$id = wp_insert_post($post_new);
if($id){
/*
* duplicate all post meta just in two SQL queries
*/
global $wpdb;
$post_meta_infos = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id=$post->ID");
if (count($post_meta_infos)!=0) {
$sql_query = "INSERT INTO $wpdb->postmeta (post_id, meta_key, meta_value) ";
foreach ($post_meta_infos as $meta_info) {
$meta_key = $meta_info->meta_key;
if( $meta_key == 'rule_order' ) $meta_info->meta_value = FlycartWooDiscountRulesGeneralHelper::reOrderRuleIfExists($id, 1, $post->post_type);
if( $meta_key == 'rule_name' ) $meta_info->meta_value = $meta_info->meta_value.' - '.esc_html__('copy', 'woo-discount-rules');
if( $meta_key == 'status' ) $meta_info->meta_value = 'disable';
$meta_value = addslashes($meta_info->meta_value);
$sql_query_sel[]= "SELECT $id, '$meta_key', '$meta_value'";
}
$sql_query.= implode(" UNION ALL ", $sql_query_sel);
$wpdb->query($sql_query);
}
echo esc_html__('Duplicate rule created successfully', 'woo-discount-rules'); die();
}
}
}
echo esc_html__('Failed to create duplicate rule', 'woo-discount-rules'); die();
}
/**
* @return array
*/
public function formList()
{
return array(
'pricing_rules',
'cart_rules',
'settings'
);
}
/**
*
*/
public function viewManager()
{
$postData = \FlycartInput\FInput::getInstance();
$request = $postData->getArray();
$this->checkSubmission($request);
// Adding Plugin Page Script
//$this->woo_discount_adminPageScript();
// Loading Instance.
$generalHelper = $this->getInstance('FlycartWooDiscountRulesGeneralHelper');
// Sanity Check.
if (!$generalHelper) return;
// Getting Active Tab.
$tab = $generalHelper->getCurrentTab();
$path = $this->getPath($tab);
// Manage Tab.
$tab = (isset($tab) ? $tab : $this->default_page);
$html = '';
// File Check.
if (file_exists($path)) {
$data = array();
$this->fetchData($tab, $data);
// Processing View.
$html = $generalHelper->processBaseView($path, $data);
}
echo $html;
}
/**
* @param $tab
* @return mixed
*/
public function getPath(&$tab)
{
$this->checkAccess($tab);
$pages = $this->adminPages();
// Default tab.
$path = $pages[$this->default_page];
// Comparing Available Tab with Active Tab.
if (isset($pages[$tab])) {
$path = $pages[$tab];
}
return $path;
}
/**
* @param $type
* @param $data
*/
public function fetchData($type, &$data)
{
$postData = \FlycartInput\FInput::getInstance();
$request = $postData->getArray();
$helper = new FlycartWooDiscountRulesGeneralHelper();
$isPro = $helper->checkPluginState();
switch ($type) {
// Managing Price Rules View.
case 'pricing-rules':
$pricing_rule = $this->getInstance('FlycartWooDiscountRulesPricingRules');
$data = $pricing_rule->getRules();
break;
// Managing Cart Rules View.
case 'cart-rules':
$cart_rule = $this->getInstance('FlycartWooDiscountRulesCartRules');
$data = $cart_rule->getRules();
break;
// Managing View of Settings.
case 'settings':
$data = $this->getBaseConfig();
break;
case 'documentation':
break;
// Managing View of Pricing Rules.
case 'pricing-rules-new':
$data = new stdClass();
$data->form = 'pricing_rules_save';
if (!$isPro) {
$pricing_rule = $this->getInstance('FlycartWooDiscountRulesPricingRules');
$data = $pricing_rule->getRules();
if (count($data) >= 3) die('You are restricted to process this action.');
}
break;
// Managing View of Pricing Rules.
case 'pricing-rules-view':
$view = false;
// Handling View
if (isset($request['view'])) {
$view = $request['view'];
}
$html = $this->getInstance('FlycartWooDiscountRulesPricingRules');
$out = $html->view($type, $view);
if (isset($out) && !empty($out)) {
$data = $out;
}
$data->form = 'pricing_rules_save';
break;
// Managing View of Cart Rules.
case 'cart-rules-view':
$view = false;
// Handling View
if (isset($request['view'])) {
$view = $request['view'];
} else {
if (!$isPro) {
$cart_rule = $this->getInstance('FlycartWooDiscountRulesCartRules');
$total_record = $cart_rule->getRules(true);
if ($total_record >= 3) wp_die('You are restricted to process this action.');
}
}
$html = $this->getInstance('FlycartWooDiscountRulesCartRules');
$out = $html->view($type, $view);
if (isset($out) && !empty($out)) {
$data[] = $out;
}
break;
// Managing View of Cart Rules.
case 'cart-rules-new':
if (!$isPro) {
$cart_rule = $this->getInstance('FlycartWooDiscountRulesCartRules');
$total_record = $cart_rule->getRules(true);
if ($total_record >= 3) wp_die('You are restricted to process this action.');
}
break;
default:
$data = array();
break;
}
}
/**
* @return array
*/
public function adminPages()
{
return array(
$this->default_page => WOO_DISCOUNT_DIR . '/view/pricing-rules.php',
'cart-rules' => WOO_DISCOUNT_DIR . '/view/cart-rules.php',
'settings' => WOO_DISCOUNT_DIR . '/view/settings.php',
'documentation' => WOO_DISCOUNT_DIR . '/view/documentation.php',
// New Rule also access the same "View" to process
'pricing-rules-new' => WOO_DISCOUNT_DIR . '/view/view-pricing-rules.php',
'cart-rules-new' => WOO_DISCOUNT_DIR . '/view/view-cart-rules.php',
// Edit Rules
'pricing-rules-view' => WOO_DISCOUNT_DIR . '/view/view-pricing-rules.php',
'cart-rules-view' => WOO_DISCOUNT_DIR . '/view/view-cart-rules.php'
);
}
/**
*
*/
public function getOption()
{
}
/**
* Adding Admin Page Script.
*/
function woo_discount_adminPageScript()
{
$status = false;
$postData = \FlycartInput\FInput::getInstance();
// Plugin scripts should run only in plugin page.
if (is_admin()) {
if ($postData->get('page', false) == 'woo_discount_rules') {
$status = true;
}
// By Default, the landing page also can use this script.
} elseif (!is_admin()) {
// $status = true;
}
if ($status) {
$config = $this->getBaseConfig();
if (is_string($config)) $config = json_decode($config, true);
$enable_bootstrap = isset($config['enable_bootstrap'])? $config['enable_bootstrap']: 1;
wp_register_style('woo_discount_style', WOO_DISCOUNT_URI . '/assets/css/style.css', array(), WOO_DISCOUNT_VERSION);
wp_enqueue_style('woo_discount_style');
wp_register_style('woo_discount_style_custom', WOO_DISCOUNT_URI . '/assets/css/custom.css', array(), WOO_DISCOUNT_VERSION);
wp_enqueue_style('woo_discount_style_custom');
wp_register_style('woo_discount_style_tab', WOO_DISCOUNT_URI . '/assets/css/tabbablePanel.css', array(), WOO_DISCOUNT_VERSION);
wp_enqueue_style('woo_discount_style_tab');
// For Implementing Select Picker Library.
wp_register_style('woo_discount_style_select', WOO_DISCOUNT_URI . '/assets/css/bootstrap.select.min.css', array(), WOO_DISCOUNT_VERSION);
wp_enqueue_style('woo_discount_style_select');
wp_enqueue_script('woo_discount_script_select', WOO_DISCOUNT_URI . '/assets/js/bootstrap.select.min.js', array(), WOO_DISCOUNT_VERSION);
wp_register_style('woo_discount_bootstrap', WOO_DISCOUNT_URI . '/assets/css/bootstrap.min.css', array(), WOO_DISCOUNT_VERSION);
wp_enqueue_style('woo_discount_bootstrap');
if($enable_bootstrap){
wp_register_script('woo_discount_jquery_ui_js_2', WOO_DISCOUNT_URI . '/assets/js/bootstrap.min.js', array(), WOO_DISCOUNT_VERSION);
wp_enqueue_script('woo_discount_jquery_ui_js_2');
}
wp_register_style('woo_discount_jquery_ui_css', WOO_DISCOUNT_URI . '/assets/css/jquery-ui.css', array(), WOO_DISCOUNT_VERSION);
wp_enqueue_style('woo_discount_jquery_ui_css');
wp_register_style('woo_discount_datetimepicker_css', WOO_DISCOUNT_URI . '/assets/css/bootstrap-datetimepicker.min.css', array(), WOO_DISCOUNT_VERSION);
wp_enqueue_style('woo_discount_datetimepicker_css');
wp_enqueue_script('jquery');
wp_enqueue_script('jquery-ui-core');
wp_enqueue_script('jquery-ui-datepicker');
wp_enqueue_script( 'woocommerce_admin' );
wp_enqueue_script( 'wc-enhanced-select' );
wp_enqueue_script('woo_discount_datetimepicker_js', WOO_DISCOUNT_URI . '/assets/js/bootstrap-datetimepicker.min.js', array('woocommerce_admin', 'wc-enhanced-select'), WOO_DISCOUNT_VERSION, true);
wp_enqueue_script('woo_discount_script', WOO_DISCOUNT_URI . '/assets/js/app.js', array(), WOO_DISCOUNT_VERSION);
$localization_data = $this->getLocalizationData();
wp_localize_script( 'woo_discount_script', 'woo_discount_localization', $localization_data);
//To load woocommerce product select
wp_enqueue_style( 'woocommerce_admin_styles' );
}
}
/**
* Get localisation script
* */
protected function getLocalizationData(){
return array(
'please_fill_this_field' => esc_html__('Please fill this field', 'woo-discount-rules'),
'please_enter_the_rule_name' => esc_html__('Please Enter the Rule Name to Create / Save.', 'woo-discount-rules'),
'saving' => esc_html__('Saving...', 'woo-discount-rules'),
'save_rule' => esc_html__('Save Rule', 'woo-discount-rules'),
'please_enter_a_key' => esc_html__('Please enter a Key', 'woo-discount-rules'),
'min_quantity' => esc_html__('Min Quantity', 'woo-discount-rules'),
'max_quantity' => esc_html__('Max Quantity', 'woo-discount-rules'),
'place_holder_ex_1' => esc_html__('ex. 1', 'woo-discount-rules'),
'place_holder_ex_10' => esc_html__('ex. 10', 'woo-discount-rules'),
'place_holder_ex_50' => esc_html__('ex. 50', 'woo-discount-rules'),
'place_holder_search_for_a_user' => esc_html__('Search for a user', 'woo-discount-rules'),
'adjustment_type' => esc_html__('Adjustment Type', 'woo-discount-rules'),
'percentage_discount' => esc_html__('Percentage Discount', 'woo-discount-rules'),
'price_discount' => esc_html__('Price Discount', 'woo-discount-rules'),
'product_discount' => esc_html__('Product Discount', 'woo-discount-rules'),
'product_discount_not_work_on_subtotal_based' => esc_html__('Product Discount - Not support for subtotal based rule', 'woo-discount-rules'),
'value_text' => esc_html__('Value', 'woo-discount-rules'),
'apply_for' => esc_html__('Apply for', 'woo-discount-rules'),
'all_selected' => esc_html__('All selected', 'woo-discount-rules'),
'same_product' => esc_html__('Same product', 'woo-discount-rules'),
'any_one_cheapest_from_selected' => esc_html__('Any one cheapest from selected', 'woo-discount-rules'),
'any_one_cheapest_from_all_products' => esc_html__('Any one cheapest from all products', 'woo-discount-rules'),
'more_than_one_cheapest_from_selected_category' => esc_html__('More than one cheapest from selected category', 'woo-discount-rules'),
'more_than_one_cheapest_from_selected' => esc_html__('More than one cheapest from selected', 'woo-discount-rules'),
'more_than_one_cheapest_from_all' => esc_html__('More than one cheapest from all', 'woo-discount-rules'),
'free_quantity' => esc_html__('Free quantity', 'woo-discount-rules'),
'number_of_quantities_in_each_products' => esc_html__('Number of quantity(ies) in each selected product(s)', 'woo-discount-rules'),
'fixed_item_count' => esc_html__('Fixed item count', 'woo-discount-rules'),
'dynamic_item_count' => esc_html__('Dynamic item count', 'woo-discount-rules'),
'fixed_item_count_tooltip' => esc_html__('Fixed item count - You need to provide item count manually. Dynamic item count - System will choose dynamically based on cart', 'woo-discount-rules'),
'item_count' => esc_html__('Item count', 'woo-discount-rules'),
'discount_number_of_item_tooltip' => esc_html__('Discount for number of item(s) in cart', 'woo-discount-rules'),
'discount_number_of_each_item_tooltip' => esc_html__('Discount for number of quantity(ies) in each item', 'woo-discount-rules'),
'item_quantity' => esc_html__('Item quantity', 'woo-discount-rules'),
'place_holder_search_for_products' => esc_html__('Search for a products', 'woo-discount-rules'),
'and_text' => esc_html__('and', 'woo-discount-rules'),
'percent_100' => esc_html__('100% percent', 'woo-discount-rules'),
'limited_percent' => esc_html__('Limited percent', 'woo-discount-rules'),
'percentage_tooltip' => esc_html__('Percentage', 'woo-discount-rules'),
'as_discount' => esc_html__('as discount', 'woo-discount-rules'),
'remove_text' => esc_html__('Remove', 'woo-discount-rules'),
'none_text' => esc_html__('none', 'woo-discount-rules'),
'are_you_sure_to_remove_this' => esc_html__('Are you sure to remove this ?', 'woo-discount-rules'),
'enable_text' => esc_html__('Enable', 'woo-discount-rules'),
'disable_text' => esc_html__('Disable', 'woo-discount-rules'),
'are_you_sure_to_remove' => esc_html__('Are you sure to remove ?', 'woo-discount-rules'),
'type_text' => esc_html__('Type', 'woo-discount-rules'),
'cart_subtotal' => esc_html__('Cart Subtotal', 'woo-discount-rules'),
'subtotal_at_least' => esc_html__('Subtotal at least', 'woo-discount-rules'),
'subtotal_less_than' => esc_html__('Subtotal less than', 'woo-discount-rules'),
'cart_item_count' => esc_html__('Cart Item Count', 'woo-discount-rules'),
'number_of_line_items_in_cart_at_least' => esc_html__('Number of line items in the cart (not quantity) at least', 'woo-discount-rules'),
'number_of_line_items_in_cart_less_than' => esc_html__('Number of line items in the cart (not quantity) less than', 'woo-discount-rules'),
'quantity_sum' => esc_html__('Quantity Sum', 'woo-discount-rules'),
'total_number_of_quantities_in_cart_at_least' => esc_html__('Total number of quantities in the cart at least', 'woo-discount-rules'),
'total_number_of_quantities_in_cart_less_than' => esc_html__('Total number of quantities in the cart less than', 'woo-discount-rules'),
'categories_in_cart' => esc_html__('Categories in cart', 'woo-discount-rules'),
'atleast_one_including_sub_categories' => esc_html__('Including sub-categories in cart', 'woo-discount-rules'),
'customer_details_must_be_logged_in' => esc_html__('Customer Details (must be logged in)', 'woo-discount-rules'),
'user_in_list' => esc_html__('User in list', 'woo-discount-rules'),
'user_role_in_list' => esc_html__('User role in list', 'woo-discount-rules'),
'shipping_country_list' => esc_html__('Shipping country in list', 'woo-discount-rules'),
'customer_email' => esc_html__('Customer Email', 'woo-discount-rules'),
'customer_email_tld' => esc_html__('Email with TLD (Ege: edu)', 'woo-discount-rules'),
'customer_email_domain' => esc_html__('Email with Domain (Eg: gmail.com)', 'woo-discount-rules'),
'customer_billing_details' => esc_html__('Customer Billing Details', 'woo-discount-rules'),
'customer_billing_city' => esc_html__('Billing city', 'woo-discount-rules'),
'customer_shipping_details' => esc_html__('Customer Shipping Details', 'woo-discount-rules'),
'customer_shipping_state' => esc_html__('Shipping state', 'woo-discount-rules'),
'customer_shipping_city' => esc_html__('Shipping city', 'woo-discount-rules'),
'customer_shipping_zip_code' => esc_html__('Shipping zip code', 'woo-discount-rules'),
'purchase_history' => esc_html__('Purchase History', 'woo-discount-rules'),
'purchased_amount' => esc_html__('Purchased amount', 'woo-discount-rules'),
'number_of_order_purchased' => esc_html__('Number of order purchased', 'woo-discount-rules'),
'number_of_order_purchased_in_product' => esc_html__('Number of order purchased in products', 'woo-discount-rules'),
'coupon_applied' => esc_html__('Coupon applied', 'woo-discount-rules'),
'atleast_any_one' => esc_html__('Atleast any one', 'woo-discount-rules'),
'greater_than_or_equal_to' => esc_html__('Greater than or equal to', 'woo-discount-rules'),
'less_than_or_equal_to' => esc_html__('Less than or equal to', 'woo-discount-rules'),
'in_order_status' => esc_html__('In Order status', 'woo-discount-rules'),
'action_text' => esc_html__('Action', 'woo-discount-rules'),
'save_text' => esc_html__('Save', 'woo-discount-rules'),
'saved_successfully' => esc_html__('Saved Successfully!', 'woo-discount-rules'),
'none_selected' => esc_html__('None selected', 'woo-discount-rules'),
'in_each_category_cart' => esc_html__('In each category', 'woo-discount-rules'),
'show_text' => esc_html__('Show', 'woo-discount-rules'),
'hide_text' => esc_html__('Hide', 'woo-discount-rules'),
'please_select_at_least_one_checkbox' => esc_html__('Please select at least one rule', 'woo-discount-rules'),
'please_select_bulk_action' => esc_html__('Please select an action to apply', 'woo-discount-rules'),
'are_you_sure_to_delete' => esc_html__('Are you sure to remove the selected rules', 'woo-discount-rules'),
);
}
}
}

View File

@@ -0,0 +1,85 @@
<?php
if (!defined('ABSPATH')) exit; // Exit if accessed directly
/**
* Class FlycartWooDiscountRulesPriceProductBased
*/
if (!class_exists('FlycartWooDiscountRulesPriceProductBased')) {
class FlycartWooDiscountRulesPriceProductBased
{
/**
* Verify Quantity
* */
public static function verifyQuantity($quantity_rule, $quantity, $quantity_from, $quantity_to, $buy_type){
$quantityMatched = array();
switch ($quantity_rule) {
case 'less':
foreach($quantity as $quantityValue){
$quantityMatched[] = ($quantityValue <= $quantity_from) ? 1: 0;
}
break;
case 'equal':
foreach($quantity as $quantityValue){
$quantityMatched[] = ($quantityValue == $quantity_from) ? 1: 0;
}
break;
case 'from':
foreach($quantity as $quantityValue){
$quantityMatched[] = (($quantityValue >= $quantity_from) && ($quantityValue <= $quantity_to)) ? 1: 0;
}
break;
case 'more':
default:
foreach($quantity as $quantityValue){
$quantityMatched[] = ($quantityValue >= $quantity_from) ? 1: 0;
}
break;
}
return FlycartWooDiscountRulesPriceProductBased::verifyBuyTypeWithQuantityMatched($buy_type, $quantityMatched);
}
/**
* Verify Buy type with Quantity matched
* */
public static function verifyBuyTypeWithQuantityMatched($buy_type, $quantityMatched){
$result = 0;
if(!empty($quantityMatched)){
switch ($buy_type) {
case 'combine':
case 'any':
if(in_array(1, $quantityMatched)){
$result = 1;
}
break;
case 'each':
default:
$result = (in_array(0, $quantityMatched)) ? 0 : 1;
break;
}
}
return $result;
}
/**
* Adjust Quantity
* */
public static function adjustQuantity($buy_type, $quantity_by_products){
switch ($buy_type) {
case 'combine':
$quantityCount = 0;
foreach($quantity_by_products as $quantity_by_product){
$quantityCount += $quantity_by_product;
}
$quantity = array($quantityCount);
break;
case 'any':
case 'each':
default:
$quantity = $quantity_by_products;
break;
}
return $quantity;
}
}
}

File diff suppressed because it is too large Load Diff