'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('/]*>/iu', "- ", $html); // Decode entities then strip tags $t = html_entity_decode($html, ENT_QUOTES | ENT_HTML5, 'UTF-8'); $t = strip_tags($t); // Normalize whitespace $t = str_replace("\xC2\xA0", ' ', $t); // nbsp → space $t = preg_replace("/\r\n|\r/u", "\n", $t); // CRLF → LF $t = preg_replace("/[ \t]+\n/u", "\n", $t); // trim line ends $t = preg_replace("/\n{3,}/u", "\n\n", $t); // max 1 blank line $t = preg_replace('/\p{C}+/u', '', $t); // control chars $t = trim($t); // Cap to Google’s limit return mb_substr($t, 0, $maxLen, 'UTF-8'); } //IMAGES START if (!function_exists('gmc_pick_image_source')) { /** * Decide which image URL to use. Accepts absolute URLs or Dropbox paths. * Returns an absolute URL suitable for downloading. */ function gmc_pick_image_source($primary, $secondary, string $fallback = ''): string { $candidates = [trim((string)$primary), trim((string)$secondary)]; foreach ($candidates as $p) { if ($p === '') continue; // Already absolute? if (preg_match('#^https?://#i', $p)) return $p; // Dropbox PATH like "/scl/fi/.../file.jpg?dl=0" or "/s/.../file.jpg" if ($p[0] === '/') return 'https://dl.dropboxusercontent.com' . $p; } return $fallback; } } if (!function_exists('gmc_cache_image')) { function gmc_cache_image(string $srcUrl): ?string { if (!$srcUrl) { log_message('error', 'GMC: empty srcUrl'); return null; } // Normalize Dropbox only to ensure raw bytes, but DO NOT strip queries for dl.dropboxusercontent.com $host = parse_url($srcUrl, PHP_URL_HOST) ?? ''; if (preg_match('#(^|\.)dropbox\.com$#i', $host)) { if (preg_match('#^www\.dropbox\.com$#i', $host)) { // preserve existing query and add raw=1 (keep tokens) $parts = parse_url($srcUrl); $qs = []; if (!empty($parts['query'])) { parse_str($parts['query'], $qs); } $qs['raw'] = '1'; $built = ($parts['scheme'] ?? 'https') . '://' . $parts['host'] . ($parts['path'] ?? ''); $srcUrl = $built . '?' . http_build_query($qs); } // For dl.dropboxusercontent.com: DO NOTHING. Keep the full query intact. } $storeDir = WRITEPATH . 'googleshopping'; if (!is_dir($storeDir) && !@mkdir($storeDir, 0755, true)) { log_message('error', 'GMC: mkdir failed ' . $storeDir); return null; } if (!is_writable($storeDir)) { log_message('error', 'GMC: dir not writable ' . $storeDir); return null; } // Extension from PATH (query ignored here) $extFromUrl = ''; $path = parse_url($srcUrl, PHP_URL_PATH) ?: ''; if ($path && preg_match('/\.(jpe?g|png|webp|gif|bmp|tiff?)$/i', $path, $m)) { $e = strtolower($m[1]); $extFromUrl = ($e === 'jpeg') ? 'jpg' : $e; } // Hash MUST include the query string so tokenized URLs are distinct $hash = sha1($srcUrl); $filename = $hash . ($extFromUrl ? '.' . $extFromUrl : ''); $local = $storeDir . DIRECTORY_SEPARATOR . $filename; // Cache hit if (is_file($local) && filesize($local) > 0) { return base_url('googleshopping/' . $filename); } // Lock to avoid concurrent downloads $lock = $local . '.lock'; $lockFp = @fopen($lock, 'c'); $locked = $lockFp && @flock($lockFp, LOCK_EX); try { // Re-check after lock if (is_file($local) && filesize($local) > 0) { return base_url('googleshopping/' . $filename); } // Fetch (keep full URL including query) $bytes = gmc_http_get($srcUrl); if ($bytes === null || strlen($bytes) === 0) { log_message('error', 'GMC image fetch failed: ' . $srcUrl); return null; } // Validate image if (!@getimagesizefromstring($bytes)) { log_message('error', 'GMC: not an image ' . $srcUrl); return null; } // Guess extension if missing if (!$extFromUrl) { $finfo = new \finfo(FILEINFO_MIME_TYPE); $mime = $finfo->buffer($bytes) ?: 'image/jpeg'; $map = [ 'image/jpeg' => 'jpg', 'image/png' => 'png', 'image/webp' => 'webp', 'image/gif' => 'gif', 'image/bmp' => 'bmp', 'image/tiff' => 'tiff', ]; $ext = $map[$mime] ?? 'jpg'; $filename = $hash . '.' . $ext; $local = $storeDir . DIRECTORY_SEPARATOR . $filename; } // Save atomically $tmp = $local . '.part'; if (@file_put_contents($tmp, $bytes) === false) { @unlink($tmp); log_message('error', 'GMC: write tmp failed ' . $tmp); return null; } if (!@rename($tmp, $local)) { @unlink($tmp); log_message('error', 'GMC: rename failed ' . $tmp . ' -> ' . $local); return null; } log_message('info', 'GMC: cached ' . $local); return base_url('googleshopping/' . $filename); } finally { if (isset($tmp) && is_file($tmp)) @unlink($tmp); if ($locked) { @flock($lockFp, LOCK_UN); } if ($lockFp) { @fclose($lockFp); } @unlink($lock); } } } if (!function_exists('gmc_http_get')) { function gmc_http_get(string $url, int $timeout = 15): ?string { $headers = [ 'Accept: image/avif,image/webp,image/apng,image/*,*/*;q=0.8', 'Accept-Language: en-US,en;q=0.9', 'Connection: close', ]; if (function_exists('curl_init')) { $ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_MAXREDIRS => 5, CURLOPT_CONNECTTIMEOUT => $timeout, CURLOPT_TIMEOUT => $timeout, CURLOPT_USERAGENT => 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120 Safari/537.36', CURLOPT_SSL_VERIFYPEER => true, CURLOPT_SSL_VERIFYHOST => 2, CURLOPT_HTTPHEADER => $headers, ]); $data = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); $err = curl_error($ch); curl_close($ch); if ($data === false || $code < 200 || $code >= 300) { log_message('error', 'GMC curl fetch failed: ' . $url . ' code=' . $code . ' err=' . $err); return null; } return $data; } $ctx = stream_context_create([ 'http' => [ 'method' => 'GET', 'timeout' => $timeout, 'header' => implode("\r\n", array_merge($headers, [ 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120 Safari/537.36', ])) . "\r\n", ] ]); $data = @file_get_contents($url, false, $ctx); if ($data === false) { log_message('error', 'GMC stream fetch failed: ' . $url); return null; } return $data; } } //IMAGES END function gmc_selected_base_colors(array $allMeta, string $selectedIds): string { // Normalize: split, trim, drop empties, preserve order, dedupe $ids = array_map('trim', explode(',', $selectedIds)); $ids = array_values(array_unique(array_filter($ids, fn($v) => $v !== ''))); if (empty($ids) || empty($allMeta)) return ''; // Build quick lookup: id(string) => name(string) $lookup = []; foreach ($allMeta as $obj) { if (!isset($obj->filter_meta_id) || !isset($obj->filter_meta_name)) continue; $lookup[(string)$obj->filter_meta_id] = (string)$obj->filter_meta_name; } $mb_ucfirst = function (string $s): string { if ($s === '') return ''; $first = mb_substr($s, 0, 1, 'UTF-8'); $rest = mb_substr($s, 1, null, 'UTF-8'); return mb_strtoupper($first, 'UTF-8') . $rest; }; // Map in the same order as $ids; skip missing $names = []; foreach ($ids as $id) { if (isset($lookup[$id])) { $name = trim($lookup[$id]); $names[] = $mb_ucfirst($name); } } return implode(', ', $names); } function gmc_size_range(string $raw): string { $v = strtolower(trim($raw)); // direct canonical values already correct if ($v === 'male' || $v === 'female' || $v === 'unisex') { return $v; } // aliases -> canonical gender $mapToMale = ['men', 'mens', "men's", 'man', 'male', 'm']; $mapToFemale = ['women', 'womens', "women's", 'woman', 'female', 'f']; if (in_array($v, $mapToMale, true)) return 'Male'; if (in_array($v, $mapToFemale, true)) return 'Female'; // everything else (kids, youth, adult, etc.) -> unisex return 'Unisex'; } function gmc_age_group(string $size_range = 'Adult'): string { $v = strtolower(trim($size_range)); if ($v === '') $v = 'adult'; // explicit empty guard // Infant if (in_array($v, ['infant','baby','0-12m','newborn','nb'], true)) { return 'Infant'; } // Toddler if (in_array($v, ['toddler','2t','3t','4t','5t'], true)) { return 'toddler'; } // Youth -> kids if (in_array($v, ['youth','kid','kids','child','children','jr','junior'], true)) { return 'kids'; } // Mens / Women (aliases) -> Adult if (in_array($v, ['men','mens',"men's",'man','male','women','womens',"women's",'woman','female'], true)) { return 'Adult'; } // Explicit adult/unisex/one-size -> Adult if (in_array($v, ['adult','unisex','one size','onesize','osfm','osfa'], true)) { return 'Adult'; } // Default return 'Adult'; } function getRedirectUrl(string $url): string { $parts = parse_url($url); if (empty($parts['query'])) { return ''; } parse_str($parts['query'], $query); if (empty($query['redirect_uri'])) { return ''; } $decoded = base64_decode($query['redirect_uri'], true); return ($decoded !== false) ? $decoded : ''; } function billing_to_name($billingAddress, string $fallback = 'Customer'): string { // Normalize to array $arr = []; if (is_string($billingAddress)) { $decoded = json_decode($billingAddress, true); $arr = is_array($decoded) ? $decoded : []; } elseif (is_object($billingAddress)) { $arr = (array) $billingAddress; } elseif (is_array($billingAddress)) { $arr = $billingAddress; } // helper to safely fetch string $get = function(string $key) use ($arr): string { if (!array_key_exists($key, $arr)) return ''; $v = $arr[$key]; if (is_array($v) || is_object($v)) return ''; return trim((string)$v); }; // 1) first + last $first = $get('first_name'); $last = $get('last_name'); $name = trim($first . ' ' . $last); // 2) common name keys if ($name === '') { foreach (['name', 'full_name', 'contact_name', 'billing_name'] as $k) { $v = $get($k); if ($v !== '') { $name = $v; break; } } } // 3) company fallback if ($name === '') { foreach (['company', 'company_name', 'billing_company'] as $k) { $v = $get($k); if ($v !== '') { $name = $v; break; } } } // 4) final fallback if ($name === '') $name = $fallback; return strtoupper($name); } function get_excel_columns() { $excel_cols = array( 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV', 'AW', 'AX', 'AY', 'AZ', 'BA', 'BB', 'BC', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BK', 'BL', 'BM', 'BN', 'BO', 'BP', 'BQ', 'BR', 'BS', 'BT', 'BU', 'BV', 'BW', 'BX', 'BY', 'BZ', 'CA', 'CB', 'CC', 'CD', 'CE', 'CF', 'CG', 'CH', 'CI', 'CJ', 'CK', 'CL', 'CM', 'CN', 'CO', 'CP', 'CQ', 'CR', 'CS', 'CT', 'CU', 'CV', 'CW', 'CX', 'CY', 'CZ' ); return $excel_cols; } function getPxrById(array $rows, $pxrId, bool $asArray=false, bool $decodeRule=true) { $want = (int)$pxrId; foreach ($rows as $r) { $id = is_object($r) ? (int)($r->pxr_id ?? -1) : (int)($r['pxr_id'] ?? -1); if ($id !== $want) continue; if ($asArray) { $a = is_object($r) ? get_object_vars($r) : $r; if ($decodeRule && isset($a['pxr_rule']) && is_string($a['pxr_rule'])) { $dec = json_decode($a['pxr_rule'], true); if (json_last_error() === JSON_ERROR_NONE) $a['pxr_rule'] = $dec; } return $a; } else { if ($decodeRule && isset($r->pxr_rule) && is_string($r->pxr_rule)) { $dec = json_decode($r->pxr_rule, true); if (json_last_error() === JSON_ERROR_NONE) $r->pxr_rule = $dec; } return $r; } } return null; } ?>