* @link https://webappick.com
* @license https://opensource.org/licenses/gpl-license.php GNU Public License
* @category Intention
*/
class CartIntent extends Intent {
/**
* Intent constructor.
*
* @param \Disco\App\Utility\Config $campaign Campaign Config.
* @param array $settings Global Settings.
*/
public function __construct( $campaign, $settings ) {
parent::__construct( $campaign, $settings );
$this->campaign = $campaign;
$this->settings = $settings;
}
/**
* Apply Cart intention.
* Cart Discount Configuration.
*
* @param array $items Discount Applicable Cart Items.
* @param \WC_Cart $cart Cart.
* @return float|int
* @throws \Exception If settings not found.
*/
public function get_discounts( $items, $cart ) { // phpcs:ignore
$discount = 0;
if ( empty( $items ) ) {
return $discount;
}
$rules = $this->campaign->get_discount_rules();
if ( ! empty( $rules ) && isset( $rules[0] ) ) {
$rule = $rules[0];
if ( is_object( $rule ) ) {
$rule = (array) $rule;
}
$discount_value = ( $rule['discount_value'] ? abs( $rule['discount_value'] ) : 0 );
$discount_type = $rule['discount_type'];
$campaign_products = $this->campaign->get_product_ids();
// $cost = CalcFactory::get_cart_subtotal( $cart );
//
// if ( $campaign_products !== 'all' ) {
// $cost = $this->get_items_subtotal( $items );
// }
// $cost = $this->get_items_subtotal( $items );
$cost = $this->get_items_subtotal_based_on_settings( $items );
// Discount should be less than item price
if ( $discount_type === 'fixed_per_product' ) {
// TODO: Check there is no free products in the cart before counting the discount
$item_prices = array();
foreach ( $items as $item ) {
$price = CalcFactory::get_price( $item );
$qty = $item['quantity'];
$min_value = min( $discount_value, $price );
$item_prices[] = $min_value * $qty;
}
$discount = array_sum( $item_prices );
} else {
$discount = $this->calculate_discount( $cost, $discount_type, $discount_value );
}
}
// @phpstan-ignore-next-line
return apply_filters( 'disco_final_discounted_amount', $discount, $discount_type );
}
/**
* Get Cart Item Quantities.
*
* @param array $items Discount Applicable Cart Items.
* @return int Cart Item Quantities.
*/
public function get_cart_item_quantities( $items ) {
$quantities = 0;
foreach ( $items as $item ) {
$quantities += $item['quantity'];
}
return $quantities;
}
/**
* Get Cart Items Subtotal.
*
* @param array $items Discount Applicable Cart Items.
* @return int Cart Item Quantities.
*/
public function get_items_subtotal( $items ) {
$subtotal = 0;
foreach ( $items as $item ) {
$subtotal += $item['line_subtotal'];
}
return $subtotal;
}
/**
* Get items subtotal based on settings.
*
* @param array $items Discount Applicable Cart Items.
* @return float
*/
public function get_items_subtotal_based_on_settings( $items ) {
$subtotal = 0;
foreach ( $items as $item ) {
$price = CalcFactory::get_price( $item );
$subtotal += $price * $item['quantity'];
}
return $subtotal;
}
/**
* Get offers for Cart intention.
*
* @param array $items Discount Applicable Cart Items.
* @param \WC_Cart $cart Cart.
* @return array|bool
*/
public function get_offers( $items, $cart ) { //phpcs:ignore
if ( $cart->is_empty() ) {
return false;
}
$offers = array();
$rules = $this->campaign->get_discount_rules();
if ( ! empty( $rules ) && isset( $rules[0] ) ) {
$rule = $rules[0];
$discount_value = abs( $rule->discount_value );
$discount_type = $rule->discount_type;
$conditions = $this->campaign->get_conditions();
$conditions_string = '';
$double_space = ' ';
if ( is_array( $conditions ) && ! empty( $conditions ) ) {
$conditions_string .= 'IF' . "\n";
foreach ( $conditions as $condition_key => $condition ) {
if ( $condition_key > 0 ) {
$conditions_string .= '' . ucfirst( $condition['base_operator'] ) . "\n";
}
if ( empty( $condition['base_filters'] ) ) {
continue;
}
foreach ( $condition['base_filters'] as $filter_key => $filter ) {
$filter = (object) $filter;
if ( $filter_key > 0 ) {
$conditions_string .= $double_space . ' ' . ucfirst( $filter->operator ) . "\n";
}
$compare_with = ucwords( str_replace( '_', ' ', $filter->compare_with ) );
$condition = DropDown::conditions( null, $filter->condition );
$compare = $filter->compare;
$conditions_string .= "$double_space $compare_with $compare \n";
}
}
$conditions_string .= 'END IF' . "\n";
}
if ( 'percent' === $discount_type ) {
$discount = $discount_value . '% off';
} else {
$discount = wc_price( $discount_value ) . ' off';
}
$offers[] = array(
'condition' => $conditions_string,
'discount' => '' . $discount . '',
);
}
return $offers;
}
}