function get_ip()
{
if (!empty($_SERVER['HTTP_CLIENT_IP'])){
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
function object_to_array($data) {
if (is_object($data)) {
$data = get_object_vars($data);
}
if (is_array($data)) {
return array_map('object_to_array', $data);
}
return $data;
}
function verify_key($word, $time, $key)
{
if($word && $key) {
return ($key == public_key($word, $time));
}
return false;
}
function public_key($word, $time)
{
$key = sha1('tCb-'.$word.$time.'-secure');
$key = substr($key, 0, 16);
return $key;
}
function get_otp()
{
return random_int(100000, 999999);
}
function get_domain_id($domain = ''){
$domains = array('authentic-brand' => '1', 'authenticblanks' => '2', 'shopbroadlawns' => '3', 'shopuniband' => '5');
$domainId = isset($domains[$domain]) && $domains[$domain] ? $domains[$domain] : 0;
return $domainId;
}
//SECRET
// function stripe_key()
// {
// return stripe_live_key();
// }
// function stripe_demo_key()
// {
// return "sk_test_51POIv2Jt6Fy2IDIeT1vZxZQRthu1sX9YUE7pB0KNs17eK17bnoMj3abywqrJple7ArKYiQkMcq8dAsM2Z8VASZ1300feUa2CzR";
// }
function stripe_live_secret_key()
{
return "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";
}
//PUBLISHABLE KEY
// function stripe_pkey()
// {
// return stripe_plive_key();
// }
// function stripe_pdemo_key()
// {
// return "pk_test_51POIv2Jt6Fy2IDIeKwj48RLs0LlwrdO5N22Ob2sthy2pcbCeJM26uwALwYgHXi3tKfZNW096q8l9d8RKQdSYucA100FqOglSvm";
// }
function stripe_live_publish_key()
{
return "pk_live_51POIv2Jt6Fy2IDIeARvYemRqu7HkKpLL0ikJwE8oiAo1sLtaLOZ7BneC2c1bbkVizGGb8akdGjjpZdtOJGNn1EvU000NhkwYci";
}
function taxable_customer_groups()
{
$groups = array('retail');
return $groups;
}
function square_key()
{
return square_demo_key();
}
function square_demo_key()
{
return "sk_test_51POIv2Jt6Fy2IDIeT1vZxZQRthu1sX9YUE7pB0KNs17eK17bnoMj3abywqrJple7ArKYiQkMcq8dAsM2Z8VASZ1300feUa2CzR";
}
function square_live_key()
{
return "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";
}
function items_per_page()
{
$items = 30;
return $items;
}
function estimatedTax($subTotal = 0.00)
{
return set_2decimalnumber((6/100) * $subTotal);
}
function set_2decimalnumber($number = 0)
{
return number_format((float)$number, 2, '.', '');
}
function set_3decimalnumber($number = 0)
{
return number_format((float)$number, 3, '.', '');
}
function formatNonNegative($value) {
// return number_format($value < 0 ? 0 : $value, 2);
return number_format($value < 0 ? 0 : $value, 2, '.', '');
}
function clean_searchkeyword($searchwords)
{
$clean_keywords = array();
$keywords = explode(',', $searchwords);
foreach ($keywords as $keyword){
array_push($clean_keywords, trim(strtolower($keyword)));
}
return $clean_keywords;
}
function get_color_fullname($colors = array(), $colorCode = '')
{
$colorCodeArray = explode(',', $colorCode);
$colorNames = array();
if($colorCodeArray){
foreach($colorCodeArray as $cca){
$colorArray = array('color_code' => $cca);
$colorCodes = array_column($colors, "color_code");
$matching = array_values(array_values(array_intersect_key($colors, array_intersect($colorCodes, [$colorArray['color_code']]))));
$matching = json_decode(json_encode($matching), true);
$colorName = isset($matching[0]['color_name']) && $matching[0]['color_name'] ? strtolower($matching[0]['color_name']) : '';
array_push($colorNames, $colorName);
}
}
return implode(', ', $colorNames);
}
function sentenceCase($string)
{
$cap = true;
$restring = '';
for ($x = 0; $x < strlen($string); $x++){
$letter = substr($string, $x, 1);
if ($letter == "." || $letter == "!" || $letter == "?"){
$cap = true;
} elseif ($letter != " " && $cap == true){
$letter = strtoupper($letter);
$cap = false;
}
$restring .= $letter;
}
return $restring;
}
function url_encode($string)
{
$entities = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%25', '%23', '%5B', '%5D');
$replacements = array('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]");
return str_replace($entities, $replacements, urlencode($string));
}
function url_decode($string)
{
$entities = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%25', '%23', '%5B', '%5D');
$replacements = array('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]");
return str_replace($replacements, $entities, urlencode($string));
}
function stringSanitize($str)
{
$str = str_replace("'", "'", $str);
$str = str_replace('"', '"', $str);
return $str;
}
function stringUnSanitize($str)
{
$str = str_replace("'", "'", $str);
$str = str_replace('"', '"', $str);
return $str;
}
function clean_selected_categorypage_filters($filterValues = array())
{
// $cleanValues = array_values(array_filter($filterValues));
// $cleanValues = array_filter($cleanValues);
$cleanValues = array_diff($filterValues, array(''));
return $cleanValues;
}
function generateFilterUrl($urlWithQueryString, $section, $filterOptionId, $selected_fl_categories, $selected_fl_sub_categories, $selected_fl_styles, $selected_fl_teams, $selected_fl_size_range, $selected_fl_sizes, $selected_fl_colors, $selected_fl_fabrics, $selected_fl_collections, $selected_fl_availability)
{
$newUrl = '';
switch ($section){
case 'categories':
if($selected_fl_categories){
if (($key = array_search($filterOptionId, $selected_fl_categories)) !== false){
unset($selected_fl_categories[$key]);
}
$newUrl = $newUrl.'&categories='.implode(',', $selected_fl_categories);
}
break;
case 'sub_categories':
if($selected_fl_sub_categories){
if (($key = array_search($filterOptionId, $selected_fl_sub_categories)) !== false){
unset($selected_fl_sub_categories[$key]);
}
$newUrl = $newUrl.'&sub_categories='.implode(',', $selected_fl_sub_categories);
}
break;
case 'styles':
if($selected_fl_styles){
if (($key = array_search($filterOptionId, $selected_fl_styles)) !== false){
unset($selected_fl_styles[$key]);
}
$newUrl = $newUrl.'&styles='.implode(',', $selected_fl_styles);
}
break;
case 'teams':
if($selected_fl_teams){
if (($key = array_search($filterOptionId, $selected_fl_teams)) !== false){
unset($selected_fl_teams[$key]);
}
$newUrl = $newUrl.'&teams='.implode(',', $selected_fl_teams);
}
break;
case 'size_range':
if($selected_fl_size_range){
if (($key = array_search($filterOptionId, $selected_fl_size_range)) !== false){
unset($selected_fl_size_range[$key]);
}
$newUrl = $newUrl.'&size_range='.implode(',', $selected_fl_size_range);
}
break;
case 'sizes':
if($selected_fl_sizes){
if (($key = array_search($filterOptionId, $selected_fl_sizes)) !== false){
unset($selected_fl_sizes[$key]);
}
$newUrl = $newUrl.'&sizes='.implode(',', $selected_fl_sizes);
}
break;
case 'colors':
if($selected_fl_colors){
if (($key = array_search($filterOptionId, $selected_fl_colors)) !== false){
unset($selected_fl_colors[$key]);
}
$newUrl = $newUrl.'&colors='.implode(',', $selected_fl_colors);
}
break;
case 'fabrics':
if($selected_fl_fabrics){
if (($key = array_search($filterOptionId, $selected_fl_fabrics)) !== false){
unset($selected_fl_fabrics[$key]);
}
$newUrl = $newUrl.'&fabrics='.implode(',', $selected_fl_fabrics);
}
break;
case 'collections':
if($selected_fl_collections){
if (($key = array_search($filterOptionId, $selected_fl_collections)) !== false){
unset($selected_fl_collections[$key]);
}
$newUrl = $newUrl.'&collections='.implode(',', $selected_fl_collections);
}
break;
case 'availability':
if($selected_fl_availability){
if (($key = array_search($filterOptionId, $selected_fl_availability)) !== false){
unset($selected_fl_availability[$key]);
}
$newUrl = $newUrl.'&availability='.implode(',', $selected_fl_availability);
}
break;
}
return $newUrl;
}
function generate_address_display_with_line_breaks($addressData)
{
$cleanAddress = '';
if(isset($addressData) && $addressData){
$cleanAddress .= isset($addressData->address_line_1) && $addressData->address_line_1 ? strtoupper($addressData->address_line_1).'
' : '';
$cleanAddress .= isset($addressData->address_line_2) && $addressData->address_line_2 ? strtoupper($addressData->address_line_2).'
' : '';
$cleanAddress .= isset($addressData->city) && $addressData->city ? strtoupper($addressData->city).', ' : '';
$cleanAddress .= isset($addressData->state) && $addressData->state ? strtoupper($addressData->state).'
' : '';
$cleanAddress .= isset($addressData->country) && $addressData->country ? strtoupper($addressData->country).' - ' : '';
$cleanAddress .= isset($addressData->zip_code) && $addressData->zip_code ? $addressData->zip_code : '';
}
return $cleanAddress;
}
function generate_companyname_from_address($addressData)
{
$cleanName = '';
if(isset($addressData) && $addressData){
$cleanName .= isset($addressData->company) && $addressData->company ? strtoupper($addressData->company) : '';
}
return $cleanName;
}
function generate_name_from_address($addressData)
{
$cleanName = '';
if(isset($addressData) && $addressData){
$cleanName .= isset($addressData->first_name) && $addressData->first_name ? strtoupper($addressData->first_name) : '';
$cleanName .= isset($addressData->last_name) && $addressData->last_name ? ' '. strtoupper($addressData->last_name) : '';
}
return $cleanName;
}
function generate_company_from_address($addressData)
{
$cleanCompany = '';
if(isset($addressData) && $addressData){
$cleanCompany .= isset($addressData->company) && $addressData->company ? strtoupper($addressData->company) : '';
}
return $cleanCompany;
}
function generate_address_display_without_line_breaks($addressData)
{
$cleanAddress = array();
if(isset($addressData) && $addressData){
isset($addressData->address_line_1) && $addressData->address_line_1 ? array_push($cleanAddress, strtoupper($addressData->address_line_1)) : '';
isset($addressData->address_line_2) && $addressData->address_line_2 ? array_push($cleanAddress, strtoupper($addressData->address_line_2)) : '';
isset($addressData->city) && $addressData->city ? array_push($cleanAddress, strtoupper($addressData->city)) : '';
isset($addressData->state) && $addressData->state ? array_push($cleanAddress, strtoupper($addressData->state)) : '';
isset($addressData->country) && $addressData->country ? array_push($cleanAddress, strtoupper($addressData->country)) : '';
isset($addressData->zip_code) && $addressData->zip_code ? array_push($cleanAddress, $addressData->zip_code) : '';
}
return implode(', ', $cleanAddress);
}
function generate_google_address_display_without_line_breaks($addressData)
{
$cleanAddress = array();
if(isset($addressData) && $addressData){
isset($addressData->address_line_1) && $addressData->address_line_1 ? array_push($cleanAddress, strtoupper($addressData->address_line_1)) : '';
isset($addressData->address_line_2) && $addressData->address_line_2 ? array_push($cleanAddress, strtoupper($addressData->address_line_2)) : '';
isset($addressData->city) && $addressData->city ? array_push($cleanAddress, strtoupper($addressData->city)) : '';
isset($addressData->state) && $addressData->state ? array_push($cleanAddress, strtoupper($addressData->state)) : '';
isset($addressData->country) && $addressData->country ? array_push($cleanAddress, strtoupper($addressData->country)) : '';
isset($addressData->zip_code) && $addressData->zip_code ? array_push($cleanAddress, $addressData->zip_code) : '';
}
return implode(', ', $cleanAddress);
}
function clean_single_array_fields($f1)
{
$cleanf = array();
if ($f1){
foreach ($f1 as $fkey => $f){
if ($f){
array_push($cleanf, stringSanitize($f));
}
}
}
return json_encode($cleanf);
}
function stdClassObjToArray($stdClassObj)
{
return json_decode(json_encode($stdClassObj), true);
}
function generate_address_for_ddoption($address_array)
{
$address = array();
if($address_array){
// if($address_array->first_name){
// array_push($address, strtoupper($address_array->first_name . ' '. $address_array->last_name));
// }
if($address_array->address_line_1){
array_push($address, strtoupper($address_array->address_line_1));
}
if($address_array->address_line_2){
array_push($address, strtoupper($address_array->address_line_2));
}
if($address_array->city){
array_push($address, strtoupper($address_array->city));
}
if($address_array->state){
array_push($address, strtoupper($address_array->state));
}
if($address_array->country){
array_push($address, strtoupper($address_array->country));
}
if($address_array->zip_code){
array_push($address, strtoupper($address_array->zip_code));
}
return (ucwords($address_array->first_name . ' '. $address_array->last_name) . ' - ' .implode(', ', $address));
}
}
function generate_payment_gateway_itemslist_for_salestax($cartitems = array())
{
$lineItems = array();
$lineItem = array();
foreach($cartitems as $ckey => $cartitem){
$lineItem = array("reference" => $cartitem->cart_item_id,
"quantity" => $cartitem->skuqty,
"amount" => preg_replace('/[^\d.]|[.,]/', '', set_2decimalnumber($cartitem->skuqty * $cartitem->skuprice)),
);
array_push($lineItems, $lineItem);
}
return $lineItems;
}
function generate_payment_gateway_itemslist_for_payment($cartitems = array())
{
$lineItems = $lineItem = array();
foreach($cartitems as $ckey => $cartitem){
$lineItem = array(
"quantity" => $cartitem->skuqty,
"price_data" => array(
"currency" => "usd",
"unit_amount" => preg_replace('/[.,]/', '', $cartitem->skuprice),
"product_data" => array(
"name" => $cartitem->v_name,
)
)
);
array_push($lineItems, $lineItem);
}
return $lineItems;
}
function generate_paymentintent_shippingaddress($cartinfo)
{
// $cartinfo = stdClassObjToArray($cartinfo);
$addressInfo = $addressDetails = array();
$address = isset($cartinfo) && $cartinfo->shipping_address ? json_decode($cartinfo->shipping_address) : array();
$addressDetails['line1'] = (isset($address) && $address && $address->address_line_1) ? $address->address_line_1 : '';
$addressDetails['line2'] = (isset($address) && $address && $address->address_line_2) ? $address->address_line_2 : '';
$addressDetails['city'] = (isset($address) && $address && $address->city) ? $address->city : '';
$addressDetails['state'] = (isset($address) && $address && $address->state) ? $address->state : '';
$addressDetails['postal_code'] = (isset($address) && $address && $address->zip_code) ? $address->zip_code : '';
$addressDetails['country'] = (isset($address) && $address && $address->country) ? $address->country : '';
$addressInfo['address'] = $addressDetails;
$addressInfo['name'] = isset($address->first_name) && $address->first_name ? $address->first_name .' '. $address->last_name : '';
$addressInfo['phone'] = isset($address->phone) && $address->phone ? $address->phone : '';
return $addressInfo;
}
function generate_payment_gateway_address($address = array())
{
$addressInfo['line1'] = (isset($address) && $address && $address['address_line_1']) ? $address['address_line_1'] : '';
$addressInfo['line2'] = (isset($address) && $address && $address['address_line_2']) ? $address['address_line_2'] : '';
$addressInfo['city'] = (isset($address) && $address && $address['city']) ? $address['city'] : '';
$addressInfo['state'] = (isset($address) && $address && $address['state']) ? $address['state'] : '';
$addressInfo['postal_code'] = (isset($address) && $address && $address['zip_code']) ? $address['zip_code'] : '';
$addressInfo['country'] = (isset($address) && $address && $address['country']) ? $address['country'] : '';
// array_push($addressData, $addressInfo);
return $addressInfo;
}
function generate_paymentintent_productslist($cartitems = array())
{
$cartitems_metadata = array();
if(isset($cartitems) && $cartitems){
foreach($cartitems as $cit_key => $cartitem){
if($cit_key < 49){
$metaName = isset($cartitem->sku) && $cartitem->sku ? $cartitem->sku : (isset($cartitem->v_name) && $cartitem->v_name ? $cartitem->v_name : 'eCommerce Item');
$cartitems_metadata[stringUnSanitize(substr($metaName, 0, 40))] = $cartitem->skuqty .' x $'.$cartitem->skuprice;
}
}
}
return $cartitems_metadata;
}
function generate_paymentintent_total_with_tax($cartinfo, $cartitems, $customer_group)
{
$grandTotal = 0.00;
if(isset($cartitems) && $cartitems){
foreach($cartitems as $cit_key => $cartitem){
$grandTotal = $grandTotal + ($cartitem->skuqty * $cartitem->skuprice);
}
}
if(in_array($customer_group, array('', 'retail'))){
$salesTax = ((isset($cartinfo) && $cartinfo && $cartinfo->sales_tax) ? $cartinfo->sales_tax : 0.00);
$grandTotal = $grandTotal + $salesTax;
}
return $grandTotal * 100;
}
//DISCOUNTS START
function generate_category_level_discounts($discountsArray = array())
{
// $discount = array('type' => '', 'stacked' => '', 'value' => 0);
$discount = array();
$percentageDiscount = $dollarDiscount = $fixedDiscount = array();
$percentageStacked = $percentageNonStacked = $dollarStacked = $dollarNonStacked = $fixedStacked = $fixedNonStacked = array();
$maxPercentageStacked = $maxPercentageNonStacked = $maxDollarStacked = $maxDollarNonStacked = $maxFixedStacked = $maxFixedNonStacked = 0;
if($discountsArray){
foreach($discountsArray as $dKey => $discountItem){
if(isset($discountItem) && $discountItem){
if($discountItem->stacked == 'yes'){//Stacked - MAX
switch ($discountItem->discount_by){
case 'percentage':
array_push($percentageStacked, $discountItem->discount_value);
break;
case 'dollar':
array_push($dollarStacked, $discountItem->discount_value);
break;
case 'fixed':
array_push($fixedStacked, $discountItem->discount_value);
break;
}
}
else if($discountItem->stacked == 'no'){//Non Stacked - SUM
switch ($discountItem->discount_by){
case 'percentage':
array_push($percentageNonStacked, $discountItem->discount_value);
break;
case 'dollar':
array_push($dollarNonStacked, $discountItem->discount_value);
break;
case 'fixed':
array_push($fixedNonStacked, $discountItem->discount_value);
break;
}
}
}
}
}
if($percentageStacked){
// array_push($percentageDiscount, max($percentageStacked));
$maxPercentageStacked = array_sum($percentageStacked);
}
if($percentageNonStacked){
// array_push($percentageDiscount, array_sum($percentageNonStacked));
$maxPercentageNonStacked = max($percentageNonStacked);
}
if($dollarStacked){
// array_push($dollarDiscount, max($dollarStacked));
$maxDollarStacked = array_sum($dollarStacked);
}
if($dollarNonStacked){
// array_push($dollarDiscount, array_sum($dollarNonStacked));
$maxDollarNonStacked = max($percentageNonStacked);
}
if($fixedStacked){
// array_push($fixedDiscount, max($fixedStacked));
$maxFixedStacked = array_sum($fixedStacked);
}
if($fixedNonStacked){
// array_push($fixedDiscount, array_sum($fixedNonStacked));
$maxFixedNonStacked = max($fixedNonStacked);
}
//PERCENTAGE
if($maxPercentageStacked > $maxPercentageNonStacked){
$discount = array('type' => 'percentage', 'stacked' => 'yes', 'value' => $maxPercentageStacked);
}
else if($maxPercentageStacked < $maxPercentageNonStacked){
$discount = array('type' => 'percentage', 'stacked' => 'no', 'value' => $maxPercentageNonStacked);
}
//DOLLAR
if($maxDollarStacked > $maxDollarNonStacked){
$discount = array('type' => 'dollar', 'stacked' => 'yes', 'value' => $maxDollarStacked);
}
else if($maxDollarStacked < $maxDollarNonStacked){
$discount = array('type' => 'dollar', 'stacked' => 'no', 'value' => $maxDollarNonStacked);
}
//FIXED
if($maxFixedStacked > $maxFixedNonStacked){
$discount = array('type' => 'fixed', 'stacked' => 'yes', 'value' => $maxFixedStacked);
}
else if($maxFixedStacked < $maxFixedNonStacked){
$discount = array('type' => 'fixed', 'stacked' => 'no', 'value' => $maxFixedNonStacked);
}
return $discount;
}
function generate_store_level_discounts($discountsArray = array())
{
$discount = array('type' => '', 'stacked' => '', 'value' => 0);
$percentageDiscount = $dollarDiscount = $fixedDiscount = array();
$percentageStacked = $percentageNonStacked = $dollarStacked = $dollarNonStacked = $fixedStacked = $fixedNonStacked = array();
$maxPercentageStacked = $maxPercentageNonStacked = $maxDollarStacked = $maxDollarNonStacked = $maxFixedStacked = $maxFixedNonStacked = 0;
if(isset($discountsArray) && $discountsArray){
foreach($discountsArray as $dKey => $discountItem){
if($discountItem->stacked == 'yes'){//Stacked - MAX
switch ($discountItem->discount_by){
case 'percentage':
array_push($percentageStacked, $discountItem->discount_value);
break;
case 'dollar':
array_push($dollarStacked, $discountItem->discount_value);
break;
case 'fixed':
array_push($fixedStacked, $discountItem->discount_value);
break;
}
}
else if($discountItem->stacked == 'no'){//Non Stacked - SUM
switch ($discountItem->discount_by){
case 'percentage':
array_push($percentageNonStacked, $discountItem->discount_value);
break;
case 'dollar':
array_push($dollarNonStacked, $discountItem->discount_value);
break;
case 'fixed':
array_push($fixedNonStacked, $discountItem->discount_value);
break;
}
}
}
}
if($percentageStacked){
// array_push($percentageDiscount, max($percentageStacked));
$maxPercentageStacked = max($percentageStacked);
}
if($percentageNonStacked){
// array_push($percentageDiscount, array_sum($percentageNonStacked));
$maxPercentageNonStacked = array_sum($percentageNonStacked);
}
if($dollarStacked){
// array_push($dollarDiscount, max($dollarStacked));
$maxDollarStacked = max($dollarStacked);
}
if($dollarNonStacked){
// array_push($dollarDiscount, array_sum($dollarNonStacked));
$maxDollarNonStacked = array_sum($dollarNonStacked);
}
if($fixedStacked){
// array_push($fixedDiscount, max($fixedStacked));
$maxFixedStacked = max($fixedStacked);
}
if($fixedNonStacked){
// array_push($fixedDiscount, array_sum($fixedNonStacked));
$maxFixedNonStacked = array_sum($fixedNonStacked);
}
//PERCENTAGE
if($maxPercentageStacked > $maxPercentageNonStacked){
$discount = array('type' => 'percentage', 'stacked' => 'yes', 'value' => $maxPercentageStacked);
}
else if($maxPercentageStacked < $maxPercentageNonStacked){
$discount = array('type' => 'percentage', 'stacked' => 'no', 'value' => $maxPercentageNonStacked);
}
//DOLLAR
if($maxDollarStacked > $maxDollarNonStacked){
$discount = array('type' => 'dollar', 'stacked' => 'yes', 'value' => $maxDollarStacked);
}
else if($maxDollarStacked < $maxDollarNonStacked){
$discount = array('type' => 'dollar', 'stacked' => 'no', 'value' => $maxDollarNonStacked);
}
//FIXED
if($maxFixedStacked > $maxFixedNonStacked){
$discount = array('type' => 'fixed', 'stacked' => 'yes', 'value' => $maxFixedStacked);
}
else if($maxFixedStacked < $maxFixedNonStacked){
$discount = array('type' => 'fixed', 'stacked' => 'no', 'value' => $maxFixedNonStacked);
}
// if($percentageDiscount){
// $discount = array('type' => 'percentage', 'value' => max($percentageDiscount));
// }
// if($dollarStacked){
// $discount = array('type' => 'dollar', 'value' => max($dollarStacked));
// }
// if($fixedDiscount){
// $discount = array('type' => 'fixed', 'value' => max($fixedDiscount));
// }
// $percentageDiscount =
// $dollarDiscount =
// $fixedDiscount =
// $percentageStacked = $percentageNonStacked = $dollarStacked = $dollarNonStacked = $fixedStacked = $fixedNonStacked
// echo '
';
// print_r ($discountsArray);
// echo '
';
// print_r ($percentageStacked);
// echo '
';
// print_r ($percentageNonStacked);
return $discount;
}
function generate_product_level_discounts($discountsArray = array())
{
$discount = array('type' => '', 'stacked' => '', 'value' => 0);
$percentageDiscount = $dollarDiscount = $fixedDiscount = array();
$percentageStacked = $percentageNonStacked = $dollarStacked = $dollarNonStacked = $fixedStacked = $fixedNonStacked = array();
$maxPercentageStacked = $maxPercentageNonStacked = $maxDollarStacked = $maxDollarNonStacked = $maxFixedStacked = $maxFixedNonStacked = 0;
if(isset($discountsArray) && $discountsArray){
foreach($discountsArray as $dKey => $discountItem){
if($discountItem->stacked == 'yes'){//Stacked - MAX
$discountValue = isset($discountItem->discount_value) && $discountItem->discount_value ? $discountItem->discount_value : 0;
switch ($discountItem->discount_by){
case 'percentage':
array_push($percentageStacked, $discountValue);
break;
case 'dollar':
array_push($dollarStacked, $discountValue);
break;
case 'fixed':
array_push($fixedStacked, $discountValue);
break;
}
}
else if($discountItem->stacked == 'no'){//Non Stacked - SUM
switch ($discountItem->discount_by){
case 'percentage':
array_push($percentageNonStacked, $discountValue);
break;
case 'dollar':
array_push($dollarNonStacked, $discountValue);
break;
case 'fixed':
array_push($fixedNonStacked, $discountValue);
break;
}
}
}
}
if($percentageStacked){
// array_push($percentageDiscount, max($percentageStacked));
$maxPercentageStacked = max($percentageStacked);
}
if($percentageNonStacked){
// array_push($percentageDiscount, array_sum($percentageNonStacked));
$maxPercentageNonStacked = array_sum($percentageNonStacked);
}
if($dollarStacked){
// array_push($dollarDiscount, max($dollarStacked));
$maxDollarStacked = max($dollarStacked);
}
if($dollarNonStacked){
// array_push($dollarDiscount, array_sum($dollarNonStacked));
$maxDollarNonStacked = array_sum($dollarNonStacked);
}
if($fixedStacked){
// array_push($fixedDiscount, max($fixedStacked));
$maxFixedStacked = max($fixedStacked);
}
if($fixedNonStacked){
// array_push($fixedDiscount, array_sum($fixedNonStacked));
$maxFixedNonStacked = array_sum($fixedNonStacked);
}
//PERCENTAGE
if($maxPercentageStacked > $maxPercentageNonStacked){
$discount = array('type' => 'percentage', 'stacked' => 'yes', 'value' => $maxPercentageStacked);
}
else if($maxPercentageStacked < $maxPercentageNonStacked){
$discount = array('type' => 'percentage', 'stacked' => 'no', 'value' => $maxPercentageNonStacked);
}
//DOLLAR
if($maxDollarStacked > $maxDollarNonStacked){
$discount = array('type' => 'dollar', 'stacked' => 'yes', 'value' => $maxDollarStacked);
}
else if($maxDollarStacked < $maxDollarNonStacked){
$discount = array('type' => 'dollar', 'stacked' => 'no', 'value' => $maxDollarNonStacked);
}
//FIXED
if($maxFixedStacked > $maxFixedNonStacked){
$discount = array('type' => 'fixed', 'stacked' => 'yes', 'value' => $maxFixedStacked);
}
else if($maxFixedStacked < $maxFixedNonStacked){
$discount = array('type' => 'fixed', 'stacked' => 'no', 'value' => $maxFixedNonStacked);
}
return $discount;
}
function generate_discount($store = array(), $category = array(), $pdArray = array(), $msrp = 0, $v_ids = array(), $v_id)
{
$finalPrice = 0.00;
// print_r ($category);
if(isset($pdArray) && $pdArray){
$finalPrice = calculateStoreCategoryProductMergedDiscount($store, $category, $pdArray, $msrp, $v_ids, $v_id);
}
else if($store && $category){
$finalPrice = calculateStoreCategoryMergedDiscount($store, $category, $msrp);
}
else if($store){
$finalPrice = calculateStoreDiscount($store, $msrp);
}
else if($category){
$finalPrice = calculateCategoryDiscount($category, $msrp);
}
else{
$finalPrice = $msrp;
}
return $finalPrice;
}
function calculateStoreDiscount($store, $msrp)
{
$discountedPrice = $msrp;
if(isset($store['type'])){
switch ($store['type']){
case 'percentage':
$discountedPrice = $msrp - ($msrp * ($store['value']/100)) > 0 ? set_2decimalnumber($msrp - ($msrp * ($store['value']/100))) : 0.00;
break;
case 'dollar':
$discountedPrice = $msrp - $store['value'] > 0 ? set_2decimalnumber($msrp - $store['value']): 0.00;
break;
case 'fixed':
$discountedPrice = set_2decimalnumber($store['value']);
break;
}
}
return set_2decimalnumber($discountedPrice);
}
function calculateCategoryDiscount($category, $msrp)
{
$discountedPrice = 0.00;
switch ($category['type']){
case 'percentage':
$discountedPrice = $msrp - ($msrp * ($category['value']/100)) > 0 ? set_2decimalnumber($msrp - ($msrp * ($category['value']/100))) : 0.00;
break;
case 'dollar':
$discountedPrice = $msrp - $category['value'] > 0 ? set_2decimalnumber($msrp - $category['value']): 0.00;
break;
case 'fixed':
$discountedPrice = set_2decimalnumber($category['value']);
break;
default:
$discountedPrice = $msrp;
break;
}
return set_2decimalnumber($discountedPrice);
}
function calculateProductDiscount($store, $category, $product, $msrp)
{
$discountedPrice = 0.00;
$updatedMsrp = $msrp;
if((isset($store['stacked']) && isset($category['stacked']) && isset($product['stacked'])) && $store['stacked'] == 'yes' && $category['stacked'] == 'yes' && $product['stacked'] == 'yes'){
$updatedMsrp = calculateStoreDiscount($store, $msrp);
$updatedMsrp = calculateStoreCategoryMergedDiscount($store, $category, $updatedMsrp);
}
else if((isset($store['stacked']) && isset($product['stacked'])) && $store['stacked'] == 'yes' && $product['stacked'] == 'yes'){
$updatedMsrp = calculateStoreDiscount($store, $updatedMsrp);
}
else if((isset($category['stacked']) && isset($product['stacked'])) && $category['stacked'] == 'yes' && $product['stacked'] == 'yes'){
$updatedMsrp = calculateStoreCategoryMergedDiscount($store, $category, $updatedMsrp);
}
switch ($product['type']){
case 'percentage':
$discountedPrice = $updatedMsrp - ($updatedMsrp * ($product['value']/100)) > 0 ? set_2decimalnumber($updatedMsrp - ($updatedMsrp * ($product['value']/100))) : 0.00;
break;
case 'dollar':
$discountedPrice = $updatedMsrp - $product['value'] > 0 ? set_2decimalnumber($updatedMsrp - $product['value']): 0.00;
break;
case 'fixed':
$discountedPrice = set_2decimalnumber($product['value']);
break;
default:
$discountedPrice = $updatedMsrp;
break;
}
// $discountedPrice = ($updatedMsrp > $discountedPrice) ? $discountedPrice : $updatedMsrp;
return set_2decimalnumber($discountedPrice);
}
function calculateStoreCategoryMergedDiscount($store, $category, $msrp)
{
$discountedPrice = 0.00;
$storePrice = calculateStoreDiscount($store, $msrp);
if(isset($store['stacked']) && isset($category['stacked'])){
if($store['stacked'] == 'yes' && $category['stacked'] == 'yes'){
$discountedPrice = calculateStoreDiscount($category, $storePrice);
}
else{
$categoryPrice = calculateStoreDiscount($category, $msrp);
$discountedPrice = ($storePrice > $categoryPrice) ? $categoryPrice : $storePrice;
}
}
else{
$categoryPrice = calculateStoreDiscount($category, $msrp);
$discountedPrice = ($storePrice > $categoryPrice) ? $categoryPrice : $storePrice;
}
return set_2decimalnumber($discountedPrice);
}
function calculateStoreCategoryProductMergedDiscount($store, $category, $pdArray, $msrp, $v_ids, $v_id)
{
$discountedPrice = 0.00;
$storePrice = calculateStoreDiscount($store, $msrp);
$categoryPrice = calculateStoreCategoryMergedDiscount($store, $category, $msrp);
$inProductDiscount = array();
if($pdArray){
foreach($pdArray as $pdKey => $pd){
$pds = explode(',', $pd->products);
if(in_array($v_id, $pds)){
array_push($inProductDiscount, $pd);
}
}
if($inProductDiscount){
$product = generate_product_level_discounts($inProductDiscount);
$productPrice = calculateProductDiscount($store, $category, $product, $msrp);
$discountedPrice = ($storePrice > $categoryPrice) ? $categoryPrice : $storePrice;
$discountedPrice = ($productPrice > $discountedPrice) ? $discountedPrice : $productPrice;
}
else{
if(isset($store['stacked']) && isset($category['stacked'])){
if($store['stacked'] == 'yes' && $category['stacked'] == 'yes'){
$discountedPrice = calculateStoreDiscount($category, $storePrice);
}
else{
$categoryPrice = calculateStoreDiscount($category, $msrp);
$discountedPrice = ($storePrice > $categoryPrice) ? $categoryPrice : $storePrice;
}
}
else{
$categoryPrice = calculateStoreDiscount($category, $msrp);
$discountedPrice = ($storePrice > $categoryPrice) ? $categoryPrice : $storePrice;
}
}
}
else{
if(isset($store['stacked']) && isset($category['stacked'])){
if($store['stacked'] == 'yes' && $category['stacked'] == 'yes'){
$discountedPrice = calculateStoreDiscount($category, $storePrice);
}
else{
$categoryPrice = calculateStoreDiscount($category, $msrp);
$discountedPrice = ($storePrice > $categoryPrice) ? $categoryPrice : $storePrice;
}
}
else{
$categoryPrice = calculateStoreDiscount($category, $msrp);
$discountedPrice = ($storePrice > $categoryPrice) ? $categoryPrice : $storePrice;
}
}
return set_2decimalnumber($discountedPrice);
}
function get_discount_with_symbol($msrp = 0, $type = '', $value = 0)
{
$withsymbol = '';
if(isset($type) && $type){
switch ($type){
case 'percentage':
$withsymbol = $value.'% Off';
break;
case 'dollar':
$withsymbol = '$'.set_2decimalnumber($value).' Off';
break;
case 'fixed':
$withsymbol = '$'.set_2decimalnumber((float)$msrp - (float)$value).' Off';
break;
}
}
return $withsymbol;
}
//DISCOUNTS END
//NEW DISCOUNTS START
function generate_store_discounts($discountsArray = array())
{
$stackedStoreDiscount = $nonStackedStoreDiscount = array();
if(isset($discountsArray) && $discountsArray){
foreach($discountsArray as $dKey => $discountItem){
$mandatorySeasons = isset($discountItem->ff_seasons) && $discountItem->ff_seasons ? array_filter(explode(',', $discountItem->ff_seasons)) : array();
$mandatoryFilters = isset($discountItem->mandatory_filters) && $discountItem->mandatory_filters ? array_filter(explode(',', $discountItem->mandatory_filters)) : array();
$optionalFilters = isset($discountItem->optional_filters) && $discountItem->optional_filters ? array_filter(explode(',', $discountItem->optional_filters)) : array();
$cartMinimum = isset($discountItem->cart_minimum) && $discountItem->cart_minimum ? $discountItem->cart_minimum : '0.00';
if($discountItem->stacked == 'yes'){//Stacked
array_push($stackedStoreDiscount, array('type' => $discountItem->discount_by, 'value' => $discountItem->discount_value, 'mandatoryFilters' => $mandatoryFilters, 'optionalFilters' => $optionalFilters, 'mandatorySeasons' => $mandatorySeasons, 'cart_minimum' => $cartMinimum));
}
else if($discountItem->stacked == 'no'){//Non Stacked
array_push($nonStackedStoreDiscount, array('type' => $discountItem->discount_by, 'value' => $discountItem->discount_value, 'mandatoryFilters' => $mandatoryFilters, 'optionalFilters' => $optionalFilters, 'mandatorySeasons' => $mandatorySeasons, 'cart_minimum' => $cartMinimum));
}
}
}
return array('stackedStoreDiscount' => $stackedStoreDiscount, 'nonStackedStoreDiscount' => $nonStackedStoreDiscount);
}
function generate_category_discounts($discountsArray = array())
{
$stackedCategoryDiscount = $nonStackedCategoryDiscount = array();
if(isset($discountsArray) && $discountsArray){
foreach($discountsArray as $dKey => $discountItem){
$mandatorySeasons = isset($discountItem->ff_seasons) && $discountItem->ff_seasons ? array_filter(explode(',', $discountItem->ff_seasons)) : array();
$mandatoryFilters = isset($discountItem->mandatory_filters) && $discountItem->mandatory_filters ? array_filter(explode(',', $discountItem->mandatory_filters)) : array();
$optionalFilters = isset($discountItem->optional_filters) && $discountItem->optional_filters ? array_filter(explode(',', $discountItem->optional_filters)) : array();
$cartMinimum = isset($discountItem->cart_minimum) && $discountItem->cart_minimum ? array_filter(explode(',', $discountItem->cart_minimum)) : '0.00';
if($discountItem->stacked == 'yes'){//Stacked
array_push($stackedCategoryDiscount, array('type' => $discountItem->discount_by, 'value' => $discountItem->discount_value, 'mandatoryFilters' => $mandatoryFilters, 'optionalFilters' => $optionalFilters, 'mandatorySeasons' => $mandatorySeasons, 'cart_minimum' => $cartMinimum));
}
else if($discountItem->stacked == 'no'){//Non Stacked
array_push($nonStackedCategoryDiscount, array('type' => $discountItem->discount_by, 'value' => $discountItem->discount_value, 'mandatoryFilters' => $mandatoryFilters, 'optionalFilters' => $optionalFilters, 'mandatorySeasons' => $mandatorySeasons, 'cart_minimum' => $cartMinimum));
}
}
}
return array('stackedCategoryDiscount' => $stackedCategoryDiscount, 'nonStackedCategoryDiscount' => $nonStackedCategoryDiscount);
}
function generate_product_discounts($discountsArray = array(), $v_ids, $v_id)
{
$inProductDiscount = $stackedProductDiscount = $nonStackedProductDiscount = array();
if(isset($discountsArray) && $discountsArray){
foreach($discountsArray as $pdKey => $pd){
$pds = explode(',', $pd->products);
if(in_array($v_id, $pds)){
array_push($inProductDiscount, $pd);
}
}
}
if(isset($inProductDiscount) && $inProductDiscount){
foreach($inProductDiscount as $dKey => $discountItem){
$mandatorySeasons = isset($discountItem->ff_seasons) && $discountItem->ff_seasons ? array_filter(explode(',', $discountItem->ff_seasons)) : array();
$mandatoryFilters = isset($discountItem->mandatory_filters) && $discountItem->mandatory_filters ? array_filter(explode(',', $discountItem->mandatory_filters)) : array();
$optionalFilters = isset($discountItem->optional_filters) && $discountItem->optional_filters ? array_filter(explode(',', $discountItem->optional_filters)) : array();
$cartMinimum = isset($discountItem->cart_minimum) && $discountItem->cart_minimum ? array_filter(explode(',', $discountItem->cart_minimum)) : '0.00';
if($discountItem->stacked == 'yes'){//Stacked
array_push($stackedProductDiscount, array('type' => $discountItem->discount_by, 'value' => $discountItem->discount_value, 'mandatoryFilters' => $mandatoryFilters, 'optionalFilters' => $optionalFilters, 'mandatorySeasons' => $mandatorySeasons, 'cart_minimum' => $cartMinimum));
}
else if($discountItem->stacked == 'no'){//Non Stacked
array_push($nonStackedProductDiscount, array('type' => $discountItem->discount_by, 'value' => $discountItem->discount_value, 'mandatoryFilters' => $mandatoryFilters, 'optionalFilters' => $optionalFilters, 'mandatorySeasons' => $mandatorySeasons, 'cart_minimum' => $cartMinimum));
}
}
}
return array('stackedProductDiscount' => $stackedProductDiscount, 'nonStackedProductDiscount' => $nonStackedProductDiscount);
}
function generate_best_discount($store = array(), $category = array(), $pdArray = array(), $productFilters = array(), $msrp = 0, $v_ids = array(), $v_id, $productSeason = '')
{
$finalPrice = 0.00;
$product = array();
$storeStacked = $categoryStacked = $productStacked = array();
$storeNonStacked = $categoryNonStacked = $productNonStacked = array();
$storeStacked = isset($store['stackedStoreDiscount']) && $store['stackedStoreDiscount'] ? $store['stackedStoreDiscount'] : array();
$storeNonStacked = isset($store['nonStackedStoreDiscount']) && $store['nonStackedStoreDiscount'] ? $store['nonStackedStoreDiscount'] : array();
$categoryStacked = isset($category['stackedCategoryDiscount']) && $category['stackedCategoryDiscount'] ? $category['stackedCategoryDiscount'] : array();
$categoryNonStacked = isset($category['nonStackedCategoryDiscount']) && $category['nonStackedCategoryDiscount'] ? $category['nonStackedCategoryDiscount'] : array();
if($pdArray){
$product = generate_product_discounts($pdArray, $v_ids, $v_id);
$productStacked = isset($product['stackedProductDiscount']) && $product['stackedProductDiscount'] ? $product['stackedProductDiscount'] : array();
$productNonStacked = isset($product['nonStackedProductDiscount']) && $product['nonStackedProductDiscount'] ? $product['nonStackedProductDiscount'] : array();
}
$stackedDiscounts = $nonStackedDiscounts = array();
$stackedDiscounts = array_merge($storeStacked, $categoryStacked, $productStacked);
$nonStackedDiscounts = array_merge($storeNonStacked, $categoryNonStacked, $productNonStacked);
$finalStackedPrice = generate_stacked_final_msrp($stackedDiscounts, $msrp, $productFilters, $productSeason);
$finalNonStackedPrice = generate_non_stacked_final_msrp($nonStackedDiscounts, $msrp, $productFilters, $productSeason);
$finalPrice = min(array($finalStackedPrice, $finalNonStackedPrice));
return $finalPrice;
}
// function generate_stacked_final_msrp($stackedDiscounts, $msrp, $productFilters, $productSeason = '')
// {
// $calculatedMsrp = $msrp;
// if(isset($stackedDiscounts) && $stackedDiscounts){
// foreach($stackedDiscounts as $sd_key => $sd){
// if(isset($sd['type'])){
// if((count($sd['mandatoryFilters']) == 0 && $sd['optionalFilters']) || (empty(array_diff($sd['mandatoryFilters'], $productFilters)) && count($sd['optionalFilters']) == 0) || (empty(array_diff($sd['mandatoryFilters'], $productFilters)) && array_intersect($productFilters, $sd['optionalFilters'])) || (count($sd['mandatoryFilters']) == 0 && array_intersect($productFilters, $sd['optionalFilters']))){
// switch ($sd['type']){
// case 'percentage':
// $calculatedMsrp = $calculatedMsrp - ($calculatedMsrp * ($sd['value']/100)) > 0 ? set_2decimalnumber($calculatedMsrp - ($calculatedMsrp * ($sd['value']/100))) : 0.00;
// break;
// case 'dollar':
// $calculatedMsrp = $calculatedMsrp - $sd['value'] > 0 ? set_2decimalnumber($calculatedMsrp - $sd['value']): 0.00;
// break;
// case 'fixed':
// $calculatedMsrp = set_2decimalnumber($sd['value']);
// break;
// }
// }
// }
// // echo $calculatedMsrp;
// // echo '
';
// }
// }
// return set_2decimalnumber($calculatedMsrp);
// }
// function generate_non_stacked_final_msrp($nonStackedDiscounts, $msrp, $productFilters, $productSeason = '')
// {
// if(session()->get('customer_id') == '10056'){
// print_r ($nonStackedDiscounts);
// echo '
';
// echo $productSeason;
// }
// $nonStackedDiscountPrices = array();
// if(isset($nonStackedDiscounts) && $nonStackedDiscounts){
// foreach($nonStackedDiscounts as $nsd_key => $nsd){
// $calculatedMsrp = $msrp;
// if(isset($nsd['type'])){
// if((count($nsd['mandatoryFilters']) == 0 && $nsd['optionalFilters']) || (empty(array_diff($nsd['mandatoryFilters'], $productFilters)) && count($nsd['optionalFilters']) == 0) || (empty(array_diff($nsd['mandatoryFilters'], $productFilters)) && array_intersect($productFilters, $nsd['optionalFilters'])) || (count($nsd['mandatoryFilters']) == 0 && array_intersect($productFilters, $nsd['optionalFilters']))){
// switch ($nsd['type']){
// case 'percentage':
// $calculatedMsrp = $calculatedMsrp - ($calculatedMsrp * ($nsd['value']/100)) > 0 ? set_2decimalnumber($calculatedMsrp - ($calculatedMsrp * ($nsd['value']/100))) : 0.00;
// array_push($nonStackedDiscountPrices, $calculatedMsrp);
// break;
// case 'dollar':
// $calculatedMsrp = $calculatedMsrp - $nsd['value'] > 0 ? set_2decimalnumber($calculatedMsrp - $nsd['value']): 0.00;
// array_push($nonStackedDiscountPrices, $calculatedMsrp);
// break;
// case 'fixed':
// $calculatedMsrp = set_2decimalnumber($nsd['value']);
// array_push($nonStackedDiscountPrices, $calculatedMsrp);
// break;
// }
// }
// }
// }
// }
// $threshold = 0.1;
// $nonStackedDiscountPrices = (array_filter($nonStackedDiscountPrices, function ($nsdp) use ($threshold) { return $nsdp > $threshold; }));
// $calculatedMsrp = isset($nonStackedDiscountPrices) && $nonStackedDiscountPrices ? min($nonStackedDiscountPrices) : $msrp;
// return set_2decimalnumber($calculatedMsrp);
// }
function generate_stacked_final_msrp($stackedDiscounts, $msrp, $productFilters, $productSeason = '')
{
$calculatedMsrp = $msrp;
if (isset($stackedDiscounts) && $stackedDiscounts) {
foreach ($stackedDiscounts as $sd_key => $sd) {
if (isset($sd['type'])) {
// --- NEW: Season check logic ---
$seasonAllowed = true;
if (isset($sd['mandatorySeasons']) && is_array($sd['mandatorySeasons']) && count($sd['mandatorySeasons']) > 0) {
// If mandatorySeasons is not empty:
// - If $productSeason matches one of them => allowed
// - If $productSeason is empty or not in the list => skip this discount
if (!$productSeason || !in_array($productSeason, $sd['mandatorySeasons'])) {
$seasonAllowed = false;
}
}
if (!$seasonAllowed) {
continue; // skip this stacked discount
}
// --- END NEW ---
if (
(count($sd['mandatoryFilters']) == 0 && $sd['optionalFilters']) ||
(empty(array_diff($sd['mandatoryFilters'], $productFilters)) && count($sd['optionalFilters']) == 0) ||
(empty(array_diff($sd['mandatoryFilters'], $productFilters)) && array_intersect($productFilters, $sd['optionalFilters'])) ||
(count($sd['mandatoryFilters']) == 0 && array_intersect($productFilters, $sd['optionalFilters']))
) {
switch ($sd['type']) {
case 'percentage':
$calculatedMsrp = $calculatedMsrp - ($calculatedMsrp * ($sd['value'] / 100)) > 0
? set_2decimalnumber($calculatedMsrp - ($calculatedMsrp * ($sd['value'] / 100)))
: 0.00;
break;
case 'dollar':
$calculatedMsrp = $calculatedMsrp - $sd['value'] > 0
? set_2decimalnumber($calculatedMsrp - $sd['value'])
: 0.00;
break;
case 'fixed':
$calculatedMsrp = set_2decimalnumber($sd['value']);
break;
}
}
}
// echo $calculatedMsrp;
// echo '
';
}
}
return set_2decimalnumber($calculatedMsrp);
}
function generate_non_stacked_final_msrp($nonStackedDiscounts, $msrp, $productFilters, $productSeason = '')
{
$nonStackedDiscountPrices = array();
if (isset($nonStackedDiscounts) && $nonStackedDiscounts) {
foreach ($nonStackedDiscounts as $nsd_key => $nsd) {
$calculatedMsrp = $msrp;
if (isset($nsd['type'])) {
// --- NEW: Season check logic ---
$seasonAllowed = true;
if (isset($nsd['mandatorySeasons']) && is_array($nsd['mandatorySeasons']) && count($nsd['mandatorySeasons']) > 0) {
// 1) If mandatorySeasons is not empty AND productSeason is in that array => allowed
// 2) If mandatorySeasons is not empty AND productSeason not in array => do NOT calculate
if (!$productSeason || !in_array($productSeason, $nsd['mandatorySeasons'])) {
$seasonAllowed = false;
}
}
// If seasons don't match, skip this discount
if (!$seasonAllowed) {
continue;
}
// --- END NEW ---
if (
(count($nsd['mandatoryFilters']) == 0 && $nsd['optionalFilters']) ||
(empty(array_diff($nsd['mandatoryFilters'], $productFilters)) && count($nsd['optionalFilters']) == 0) ||
(empty(array_diff($nsd['mandatoryFilters'], $productFilters)) && array_intersect($productFilters, $nsd['optionalFilters'])) ||
(count($nsd['mandatoryFilters']) == 0 && array_intersect($productFilters, $nsd['optionalFilters']))
) {
switch ($nsd['type']) {
case 'percentage':
$calculatedMsrp = $calculatedMsrp - ($calculatedMsrp * ($nsd['value'] / 100)) > 0
? set_2decimalnumber($calculatedMsrp - ($calculatedMsrp * ($nsd['value'] / 100)))
: 0.00;
array_push($nonStackedDiscountPrices, $calculatedMsrp);
break;
case 'dollar':
$calculatedMsrp = $calculatedMsrp - $nsd['value'] > 0
? set_2decimalnumber($calculatedMsrp - $nsd['value'])
: 0.00;
array_push($nonStackedDiscountPrices, $calculatedMsrp);
break;
case 'fixed':
$calculatedMsrp = set_2decimalnumber($nsd['value']);
array_push($nonStackedDiscountPrices, $calculatedMsrp);
break;
}
}
}
}
}
$threshold = 0.1;
$nonStackedDiscountPrices = (array_filter($nonStackedDiscountPrices, function ($nsdp) use ($threshold) {
return $nsdp > $threshold;
}));
$calculatedMsrp = isset($nonStackedDiscountPrices) && $nonStackedDiscountPrices ? min($nonStackedDiscountPrices) : $msrp;
return set_2decimalnumber($calculatedMsrp);
}
function bulk_price_per_peice($msrp = 0, $type = '', $value = 0)
{
$discountedPrice = $msrp;
if(isset($type) && $type){
switch ($type){
case 'percentage':
$discountedPrice = $msrp - ($msrp * ($value/100)) > 0 ? set_2decimalnumber($msrp - ($msrp * ($value/100))) : $msrp;
break;
case 'dollar':
$discountedPrice = $msrp - $value > 0 ? set_2decimalnumber($msrp - $value): 0.00;
break;
case 'fixed':
$discountedPrice = set_2decimalnumber($value);
break;
}
}
return $discountedPrice;
}
function generate_bulk_price($bulkDiscounts = array(), $skuQty = 0, $msrp)
{
$discountedPrice = $msrp;
$bulkDiscounts = json_decode($bulkDiscounts->bulk_discount);
foreach($bulkDiscounts as $bdKey => $bd){
if($skuQty >= $bd->start && ($skuQty <= $bd->end || $bd->end == '')){
switch ($bd->type){
case 'percentage':
$discountedPrice = $msrp - ($msrp * ($bd->value/100)) > 0 ? set_2decimalnumber($msrp - ($msrp * ($bd->value/100))) : $msrp;
break;
case 'dollar':
$discountedPrice = $msrp - $bd->value > 0 ? set_2decimalnumber($msrp - $bd->value): 0.00;
break;
case 'fixed':
$discountedPrice = set_2decimalnumber($bd->value);
break;
}
}
}
return $discountedPrice;
}
function get_bulk_discount_base_rate($msrp = 0, $bulkDiscounts = array())
{
$discountRate = 0.00;
if(isset($bulkDiscounts) && $bulkDiscounts){
$bulkDiscounts = json_decode($bulkDiscounts);
$bulkDiscount = isset($bulkDiscounts[0]) && $bulkDiscounts[0] ? $bulkDiscounts[0] : array();
if($bulkDiscount){
switch ($bulkDiscount->type) {
case 'percentage':
$discountRate = formatNonNegative($msrp - (($bulkDiscount->value/100) * $msrp));
$discountRate = set_2decimalnumber($discountRate);
break;
case 'dollar':
$discountRate = formatNonNegative(set_2decimalnumber($msrp - $bulkDiscount->value));
break;
case 'fixed':
$discountRate = $bulkDiscount->value;
break;
}
}
else{
$discountRate = 0.00;
}
}
return $discountRate;
}
//NEW DISCOUNTS END
//SUBTOTAL DISOCUNTS START
function generate_store_subtotal_discount($subTotal = 0, $storeDiscounts = array())
{
$subTotalDiscount = 0;
if($storeDiscounts){
foreach($storeDiscounts as $sdkey => $sdiscount){
$subTotalsList = isset($sdiscount->subtotal) && $sdiscount->subtotal ? json_decode($sdiscount->subtotal) : array();
if($subTotalsList){
foreach($subTotalsList as $stkey => $st){
if($subTotal >= $st->start && ($subTotal <= $st->end || $st->end == '')){
switch ($st->discount_by){
case 'percentage':
$subTotalDiscount = $subTotalDiscount + set_2decimalnumber($subTotal * ($st->value/100));
break;
case 'dollar':
$subTotalDiscount = $subTotalDiscount + set_2decimalnumber($st->value);
break;
}
}
}
}
}
}
return $subTotalDiscount;
}
// function generate_category_subtotal_discount($skuPrice, $categoryDiscounts = array(), $cart_item = array())
// {
// $subTotalDiscount = 0;
// if($cart_item){
// $categoryIds = isset($cart_item->url_ids) && $cart_item->url_ids ? explode(',', $cart_item->url_ids) : array();
// $itemTotal = ($skuPrice * $cart_item->skuqty);
// if($categoryDiscounts){
// foreach($categoryDiscounts as $cdkey => $cdiscount){
// $subTotalsList = isset($cdiscount->subtotal) && $cdiscount->subtotal ? json_decode($cdiscount->subtotal) : array();
// if($subTotalsList && array_intersect($categoryIds, explode(',', $cdiscount->categories))){
// foreach($subTotalsList as $stkey => $st){
// if($itemTotal >= $st->start && ($itemTotal <= $st->end || $st->end == '')){
// // print_r ($itemTotal);
// // echo '
';
// switch ($st->discount_by){
// case 'percentage':
// $subTotalDiscount = $subTotalDiscount + set_2decimalnumber($itemTotal * ($st->value/100));
// break;
// case 'dollar':
// $subTotalDiscount = $subTotalDiscount + set_2decimalnumber($st->value);
// break;
// }
// }
// }
// }
// }
// }
// }
// return $subTotalDiscount;
// }
function generate_new_category_subtotal_discount($subTotalCategoryDiscounts = array(), $cartItems = array())
{
$subTotalDiscount = 0;
if($subTotalCategoryDiscounts){
foreach($subTotalCategoryDiscounts as $stcd_key => $stcd){
$sameCategorySubTotal = 0;
if($cartItems){
foreach($cartItems as $ci_key => $cartItem){
if(array_intersect(explode(',', $cartItem['urlids']), explode(',', $stcd->categories))){
$sameCategorySubTotal = $sameCategorySubTotal + $cartItem['itemsubtotal'];
}
}
}
if($sameCategorySubTotal > 0){
$subTotalsList = isset($stcd->subtotal) && $stcd->subtotal ? json_decode($stcd->subtotal) : array();
foreach($subTotalsList as $stkey => $st){
// print_r ($sameCategorySubTotal);
// echo '
';
if($sameCategorySubTotal >= $st->start && ($sameCategorySubTotal <= $st->end || $st->end == '')){
switch ($st->discount_by){
case 'percentage':
$subTotalDiscount = $subTotalDiscount + set_2decimalnumber($sameCategorySubTotal * ($st->value/100));
break;
case 'dollar':
$subTotalDiscount = $subTotalDiscount + set_2decimalnumber($st->value);
print_r ('dollar');
break;
}
}
}
}
}
}
return $subTotalDiscount;
}
function generate_product_subtotal_discount($skuPrice, $productDiscounts = array(), $cart_item = array())
{
$subTotalDiscount = 0;
if($cart_item){
$itemTotal = ($skuPrice * $cart_item->skuqty);
if($productDiscounts){
foreach($productDiscounts as $cdkey => $pdiscount){
$subTotalsList = isset($pdiscount->subtotal) && $pdiscount->subtotal ? json_decode($pdiscount->subtotal) : array();
if($subTotalsList && array_intersect(explode(',', $pdiscount->products), array($cart_item->vid))){
foreach($subTotalsList as $stkey => $st){
// if($itemTotal >= $st->start && $itemTotal <= $st->end){
if($itemTotal >= $st->start && ($itemTotal <= $st->end || $st->end == '')){
switch ($st->discount_by){
case 'percentage':
$subTotalDiscount = $subTotalDiscount + set_2decimalnumber($itemTotal * ($st->value/100));
break;
case 'dollar':
$subTotalDiscount = $subTotalDiscount + set_2decimalnumber($st->value);
break;
}
}
}
}
}
}
}
return $subTotalDiscount;
}
function generate_coupon_store_subtotal_discount($subTotal = 0, $coupon = array())
{
$subTotalDiscount = 0;
if($coupon){
// foreach($storeDiscounts as $sdkey => $sdiscount){
$subTotalsList = isset($coupon->subtotal) && $coupon->subtotal ? json_decode($coupon->subtotal) : array();
if($subTotalsList){
foreach($subTotalsList as $stkey => $st){
if($subTotal >= $st->start && ($subTotal <= $st->end || $st->end == '')){
switch ($st->discount_by){
case 'percentage':
$subTotalDiscount = $subTotalDiscount + set_2decimalnumber($subTotal * ($st->value/100));
break;
case 'dollar':
$subTotalDiscount = $subTotalDiscount + set_2decimalnumber($st->value);
break;
}
}
}
}
// }
}
return $subTotalDiscount;
}
function generate_coupon_category_subtotal_discount($skuPrice, $coupon = array(), $cart_item = array())
{
$subTotalDiscount = 0;
if($cart_item){
$categoryIds = isset($cart_item->url_ids) && $cart_item->url_ids ? explode(',', $cart_item->url_ids) : array();
$itemTotal = ($skuPrice * $cart_item->skuqty);
if($coupon){
// foreach($categoryDiscounts as $cdkey => $cdiscount){
// print_r ($cdiscount);
// echo '
';
$subTotalsList = isset($coupon->subtotal) && $coupon->subtotal ? json_decode($coupon->subtotal) : array();
if($subTotalsList && array_intersect($categoryIds, explode(',', $coupon->categories))){
foreach($subTotalsList as $stkey => $st){
// if($itemTotal >= $st->start && $itemTotal <= $st->end){
if($itemTotal >= $st->start && ($itemTotal <= $st->end || $st->end == '')){
switch ($st->discount_by){
case 'percentage':
$subTotalDiscount = $subTotalDiscount + set_2decimalnumber($itemTotal * ($st->value/100));
break;
case 'dollar':
$subTotalDiscount = $subTotalDiscount + set_2decimalnumber($st->value);
break;
}
}
}
}
// }
}
}
return $subTotalDiscount;
}
function generate_coupon_product_subtotal_discount($skuPrice, $coupon = array(), $cart_item = array())
{
$subTotalDiscount = 0;
if($cart_item){
$itemTotal = ($skuPrice * $cart_item->skuqty);
if($coupon){
// foreach($productDiscounts as $cdkey => $pdiscount){
$subTotalsList = isset($coupon->subtotal) && $coupon->subtotal ? json_decode($coupon->subtotal) : array();
if($subTotalsList && array_intersect(explode(',', $coupon->products), array($cart_item->vid))){
foreach($subTotalsList as $stkey => $st){
// if($itemTotal >= $st->start && $itemTotal <= $st->end){
if($itemTotal >= $st->start && ($itemTotal <= $st->end || $st->end == '')){
switch ($st->discount_by){
case 'percentage':
$subTotalDiscount = $subTotalDiscount + set_2decimalnumber($itemTotal * ($st->value/100));
break;
case 'dollar':
$subTotalDiscount = $subTotalDiscount + set_2decimalnumber($st->value);
break;
}
}
}
}
// }
}
}
return $subTotalDiscount;
}
function generate_coupon_multiproduct_discount($skuprice, $finalPrice, $coupon, $cart_item)
{
$multiple_products_discount_data = isset($coupon->multiple_products_discount_data) && $coupon->multiple_products_discount_data ? json_decode(json_encode(json_decode($coupon->multiple_products_discount_data)), true) : array();
$couponDiscount = array_values(array_filter($multiple_products_discount_data, fn($item) => in_array($cart_item->vid, $item['d_prods'])));
$couponDiscount = isset($couponDiscount[0]) && $couponDiscount[0] ? $couponDiscount[0] : array();
$discountPrices = array($finalPrice, $skuprice);
if($couponDiscount){
switch ($couponDiscount['d_by']) {
case 'percentage':
$dprice = set_2decimalnumber($skuprice * ($couponDiscount['d_val']/100));
array_push($discountPrices, $dprice);
break;
case 'dollar':
$dprice = ($skuprice - $couponDiscount['d_val']) > 0 ? ($skuprice - $couponDiscount['d_val']) : $skuprice;
array_push($discountPrices, $dprice);
break;
case 'fixed':
array_push($discountPrices, $couponDiscount['d_val']);
break;
}
}
return min($discountPrices);
}
function generate_coupon_multiproduct_moq_discount($msrp, $finalPrice, $coupon, $cart_item, $cart_items, $moqVids = [])
{
$basePrice = (float) ($finalPrice ?? 0.0);
$skuprice = $basePrice; // if you have a separate per-SKU price, plug it here
$vid = isset($cart_item->vid) ? (string) $cart_item->vid : null;
// If no current vid or no coupon, bail early
if ($vid === null || !$coupon) {
return function_exists('set_2decimalnumber') ? set_2decimalnumber($basePrice) : round($basePrice, 2);
}
// ---- 1) Verify ALL $moqVids are present in $cart_items ----
$required = array_values(array_unique(array_map('strval', (array) $moqVids)));
if ($required) {
$present = [];
foreach ((array) $cart_items as $ci) {
if (isset($ci->vid)) {
$present[(string) $ci->vid] = true;
}
}
// if any required vid is missing -> return base price
if (array_diff($required, array_keys($present))) {
return function_exists('set_2decimalnumber') ? set_2decimalnumber($basePrice) : round($basePrice, 2);
}
} else {
// If caller passed no moqVids, treat as not qualified
return function_exists('set_2decimalnumber') ? set_2decimalnumber($basePrice) : round($basePrice, 2);
}
// Current item must also be one of the required moqVids
if (!in_array($vid, $required, true)) {
return function_exists('set_2decimalnumber') ? set_2decimalnumber($basePrice) : round($basePrice, 2);
}
// ---- 2) Read eligible coupon groups (d_moq > 0 and includes this vid) ----
$raw = $coupon->multiple_products_discount_data ?? '[]';
$groups = is_array($raw) ? $raw : (json_decode((string) $raw, true) ?: []);
$candidates = [$basePrice];
foreach ($groups as $g) {
// Defensive parse
$d_moq = isset($g['d_moq']) ? (int) $g['d_moq'] : 0;
if ($d_moq <= 0) continue;
$prods = array_map('strval', (array) ($g['d_prods'] ?? []));
if (!in_array($vid, $prods, true)) continue; // group must include this item
$d_by = strtolower((string) ($g['d_by'] ?? ''));
$d_val = (float) ($g['d_val'] ?? 0);
switch ($d_by) {
case 'percentage':
// price * (1 - %/100)
$price = max(0, $skuprice * (1 - ($d_val / 100)));
break;
case 'dollar':
// price - amount, not below zero
$price = max(0, $skuprice - $d_val);
break;
case 'fixed':
// force fixed final price
$price = max(0, $d_val);
break;
default:
// unknown method -> skip
continue 2;
}
$candidates[] = function_exists('set_2decimalnumber') ? set_2decimalnumber($price) : round($price, 2);
}
// If no eligible groups produced a candidate, return base
if (count($candidates) === 1) {
return function_exists('set_2decimalnumber') ? set_2decimalnumber($basePrice) : round($basePrice, 2);
}
// Return the best (lowest) price
$best = min($candidates);
return function_exists('set_2decimalnumber') ? set_2decimalnumber($best) : round($best, 2);
}
function check_coupon_moq(array $data)
{
foreach ($data as $item) {
// Handle both stdClass objects and associative arrays
$d_moq = is_object($item) ? ($item->d_moq ?? null) : ($item['d_moq'] ?? null);
if (!empty($d_moq) && $d_moq > 0) {
return 'moq';
}
}
return 'nomoq';
}
//SUBTOTAL DISCOUNTS END
//DOWNLOAD HELPER DIRECTORY DELETE START
function deleteDirectory($dir)
{
if (!file_exists($dir)){
return true;
}
if (!is_dir($dir)){
return unlink($dir);
}
foreach (scandir($dir) as $item){
if ($item == '.' || $item == '..'){
continue;
}
if (!deleteDirectory($dir . DIRECTORY_SEPARATOR . $item)){
return false;
}
}
return rmdir($dir);
}
//DOWNLOAD HELPER DIRECTORY DELETE END
//PACKSIZING START
function generate_pack_stock_level($category = '', $sizeFor = '', $packBreakdown = array(), $skus = array())
{
$packStockLevel = 0;
switch ($category){
case 'garment tops':
$packStockLevel = packStockLevelForGT($sizeFor = '', $packBreakdown, $skus);
break;
case 'garment bottoms':
$packStockLevel = packStockLevelForGB($sizeFor = '', $packBreakdown, $skus);
break;
}
return $packStockLevel;
}
function packStockLevelForGT($sizeFor = '', $packBreakdown = array(), $skus = array())
{
$packStockLevel = 0;
$stockBreakdown = array();
foreach($skus as $skey => $skuData){
if(!str_contains($skuData->sku_size, ' PACK') && isset($packBreakdown[$skuData->sku_size]))
{
$packStockLevelPerSize = isset($skuData->usa_whs_on_hand) ? floor($skuData->usa_whs_on_hand/$packBreakdown[$skuData->sku_size]) : 0;
array_push($stockBreakdown, $packStockLevelPerSize);
}
}
$packStockLevel = isset($stockBreakdown) && $stockBreakdown ? min($stockBreakdown) : 0;
return max($packStockLevel, 0);
}
function packStockLevelForGB($sizeFor = '', $packBreakdown = array(), $skus = array())
{
$packStockLevel = 0;
$stockBreakdown = array();
foreach($skus as $skey => $skuData){
if(!str_contains($skuData->sku_size, ' PACK') && isset($packBreakdown[$skuData->sku_size]))
{
$packStockLevelPerSize = isset($skuData->usa_whs_on_hand) ? floor($skuData->usa_whs_on_hand/$packBreakdown[$skuData->sku_size]) : 0;
array_push($stockBreakdown, $packStockLevelPerSize);
}
}
$packStockLevel = isset($stockBreakdown) && $stockBreakdown ? min($stockBreakdown) : 0;
return max($packStockLevel, 0);
}
function get_pack_breakdown_with_skus($category = '', $sizeFor = '', $packBreakdown = array(), $skus = array())
{
$pack_breakdown_with_skus = array();
foreach($skus as $skey => $skuData){
if(!str_contains($skuData->sku_size, ' PACK') && isset($packBreakdown[$skuData->sku_size]))
{
$pack_breakdown_with_sku = array();
$pack_breakdown_with_sku['skuid'] = $skuData->sku_id;
$pack_breakdown_with_sku['size'] = $skuData->sku_size;
$pack_breakdown_with_sku['packqty'] = $packBreakdown[$skuData->sku_size];
array_push($pack_breakdown_with_skus, $pack_breakdown_with_sku);
}
}
return json_encode($pack_breakdown_with_skus);
}
// function generate_kit_stock_level($kitComponents = array(), $kitSkus = array())
// {
// $kitStockLevel = 0;
// $stockBreakdown = array();
// foreach($kitSkus as $skey => $skuData){
// $kitComponent = isset($kitComponents[$skey]) && $kitComponents[$skey] ? $kitComponents[$skey] : array('qty' => 0);
// $usaCMT = isset($skuData->usa_whs_committed) ? $skuData->usa_whs_committed : 0;
// $vnCMT = isset($skuData->vn_whs_committed) ? $skuData->vn_whs_committed : 0;
// $usaPOH = isset($skuData->usa_whs_in_hand) ? $skuData->usa_whs_in_hand : 0;
// $vnPOH = isset($skuData->vn_whs_in_hand) ? $skuData->vn_whs_in_hand : 0;
// $usaAOH = max(0, ($usaPOH - $usaCMT));
// $vnAOH = max(0, ($vnPOH - $vnCMT));
// $kitStockLevelPerSku = floor(($usaAOH+$vnAOH)/$kitComponent->qty);
// array_push($stockBreakdown, $kitStockLevelPerSku);
// }
// $kitStockLevel = isset($stockBreakdown) && $stockBreakdown ? min($stockBreakdown) : 0;
// return max($kitStockLevel, 0);
// }
function generate_kit_stock_level(array $kitComponents = [], array $kitSkus = []): int
{
if (empty($kitSkus)) {
return 0;
}
$minBuildable = PHP_INT_MAX;
foreach ($kitSkus as $i => $sku) {
// Match the i-th component; if missing, treat as qty=0 (skip)
$comp = $kitComponents[$i] ?? null;
$qty = 0;
if (is_object($comp) && isset($comp->qty)) {
$qty = (int) $comp->qty;
} elseif (is_array($comp) && isset($comp['qty'])) {
$qty = (int) $comp['qty'];
}
// If no qty (<=0), this component doesn't constrain the kit; skip it
// (keeps behavior sane and avoids divide-by-zero)
if ($qty <= 0) {
continue;
}
// Read stock numbers (objects or arrays), defaulting to 0
$usaPOH = (int) (is_array($sku) ? ($sku['usa_whs_in_hand'] ?? 0) : ($sku->usa_whs_in_hand ?? 0));
$vnPOH = (int) (is_array($sku) ? ($sku['vn_whs_in_hand'] ?? 0) : ($sku->vn_whs_in_hand ?? 0));
$usaCMT = (int) (is_array($sku) ? ($sku['usa_whs_committed'] ?? 0) : ($sku->usa_whs_committed ?? 0));
$vnCMT = (int) (is_array($sku) ? ($sku['vn_whs_committed'] ?? 0) : ($sku->vn_whs_committed ?? 0));
$usaAOH = max(0, $usaPOH - $usaCMT);
$vnAOH = max(0, $vnPOH - $vnCMT);
// Buildable kits from this component
$buildable = intdiv($usaAOH + $vnAOH, $qty);
// Track running minimum
if ($buildable < $minBuildable) {
$minBuildable = $buildable;
if ($minBuildable === 0) {
// Can't build any kits if any component is 0
return 0;
}
}
}
// If every component was qty<=0 or no constraining components, return 0
if ($minBuildable === PHP_INT_MAX) {
return 0;
}
return max(0, $minBuildable);
}
//PACK SIZING END
//GIFT CARD NUMBER START
function generate_giftcard_code(int $length = 16, bool $noLeadingZero = true): string{
if ($length < 1) {
throw new InvalidArgumentException('Length must be >= 1.');
}
$code = '';
if ($noLeadingZero) {
$code .= (string) random_int(1, 9);
$length--;
}
for ($i = 0; $i < $length; $i++) {
$code .= (string) random_int(0, 9);
}
return $code;
}
function usd(int|string|null $cents, bool $withSymbol = true): string{
if ($cents === null || $cents === '') return $withSymbol ? '$0.00' : '0.00';
$cents = (int)$cents;
$sign = $cents < 0 ? '-' : '';
$abs = abs($cents);
$dollars = intdiv($abs, 100);
$remainder = $abs % 100;
$base = number_format($dollars, 0, '.', ',') . '.' . str_pad((string)$remainder, 2, '0', STR_PAD_LEFT);
return $sign . ($withSymbol ? '$' : '') . $base;
}
function usd_to_cents(string|int|float|null $amount): int {
if ($amount === null || $amount === '') return 0;
$s = trim((string)$amount);
$s = str_replace([',', '$', ' '], '', $s); // strip formatting
$neg = str_starts_with($s, '-');
if ($neg) $s = ltrim($s, '-');
// split dollars.cents
if (strpos($s, '.') !== false) {
[$d, $c] = explode('.', $s, 2);
$d = preg_replace('/\D/', '', $d) ?: '0';
$c = preg_replace('/\D/', '', $c);
$c = substr($c, 0, 2); // max 2 decimals
$c = str_pad($c, 2, '0', STR_PAD_RIGHT); // "5" -> "50"
} else {
$d = preg_replace('/\D/', '', $s) ?: '0';
$c = '00';
}
$cents = (int)$d * 100 + (int)$c;
return $neg ? -$cents : $cents;
}
//GIFT CARD NUMBER END
//SEPT-18-2025
function ab_normalize_image_url(?string $raw): ?string
{
if (!$raw) return null;
$u = trim($raw);
// absolute -> force https
if (preg_match('#^https?://#i', $u)) {
return preg_replace('#^http://#i', 'https://', $u);
}
// Dropbox share/content paths
if (strpos($u, '/scl/') === 0 || strpos($u, '/s/') === 0) {
return 'https://dl.dropboxusercontent.com' . $u;
}
// site-relative
if (strpos($u, '/') === 0) {
return rtrim(base_url(), '/') . $u;
}
// plain relative
return rtrim(base_url(), '/') . '/' . ltrim($u, '/');
}
function gmc_plain_text_desc(?string $html, int $maxLen = 5000): string {
if (!$html) return '';
// Preserve structure → newlines before stripping
$html = preg_replace('/<(br|BR)\s*\/?>/u', "\n", $html);
$html = preg_replace('/<\/(p|div|li|ul|ol|h[1-6])>/iu', "\n", $html);
$html = preg_replace('/