} cw_load('product', 'warehouse', 'cart'); $product_info = cw_func_call('cw_product_get', array('id' => $product_id, 'user_account' => $user_account)); $smarty->assign('product', $product_info); //include $app_main_dir.'/addons/product_options/customer/product.php'; cw_include('addons/product_options/customer/product.php'); if ($REQUEST_METHOD == "POST" && $action == "update") { $poptions = $_POST['product_options']; if (!cw_check_product_options($product_id, $poptions)) { cw_header_location("index.php?target=popup_poptions&target={$target}&id={$id}&err=exception"); } if ($mode == 'wishlist') { db_query("UPDATE {$tables['wishlist']} SET options = '" . addslashes(serialize($poptions)) . "' WHERE wishlist_id = '{$id}' AND event_id = '{$eventid}'"); } else { $variant_id = cw_get_variant_id($product_options, $product_id); $amount = cw_warehouse_get_warehouse_avail($cart['products'][$cartindex]['warehouse'], $product_id, null, $variant_id); // $amount = cw_get_options_amount($poptions, $cart['products'][$cartindex]['product_id']); if ($amount >= $cart['products'][$cartindex]['amount']) { $cart['products'][$cartindex]['options'] = $poptions; cw_unset($cart['products'][$cartindex], 'variant_id'); } else { cw_header_location("index.php?target=popup_poptions&target={$target}&id={$id}&err=avail"); } # Recalculate cart totals after updating $products = cw_call('cw_products_in_cart', array($cart, $user_account)); $cart = cw_func_call('cw_cart_calc', array('cart' => $cart, 'products' => $products, 'userinfo' => $user_account)); } ?> <script type="text/javascript"> <!-- if (window.opener) window.opener.location.reload();
function cw_update_quantity_in_cart(&$cart, $productindexes, $warehouse_selection = array()) { global $addons, $config, $app_main_dir, $tables; if (empty($cart['products'])) { return; } $action = "update"; foreach ($productindexes as $_cartid => $new_quantity) { foreach ($cart['products'] as $k => $v) { if ($v['cartid'] == $_cartid) { $productindexes_tmp[$k] = $new_quantity; break; } } } $productindexes = $productindexes_tmp; unset($productindexes_tmp); $min_amount_warns = array(); foreach ($cart['products'] as $k => $v) { $tot = 0; $tot_amount = 0; $min_amount = cw_query_first_cell("SELECT min_amount FROM {$tables['products']} WHERE product_id = '{$v['product_id']}'"); foreach ($productindexes as $productindex => $new_quantity) { if (!is_numeric($new_quantity)) { continue; } if ($cart['products'][$productindex]['product_id'] == $v['product_id'] && $cart['products'][$productindex]['variant_id'] == $v['variant_id'] && $cart['products'][$productindex]['warehouse'] == $v['warehouse']) { if ($new_quantity < $min_amount && $new_quantity > 0) { $productindexes[$productindex] = $new_quantity = $v['amount']; $min_amount_warns[$v['cartid']] = $min_amount; } $tot += floor($new_quantity); } } foreach ($cart['products'] as $k2 => $v2) { if ($v['product_id'] == $v2['product_id'] && $v2['variant_id'] == $v['variant_id'] && $v['warehouse'] == $v2['warehouse']) { $tot_amount += $v2['amount']; } } $updates_array[$k] = array("quantity" => $v['amount'], "total_quantity" => $tot, "total_amount" => $tot_amount); } cw_load('warehouse'); $hash = array(); # kornev, TOFIX if (!empty($addons['product_options'])) { foreach ($productindexes as $productindex => $new_quantity) { if (!empty($cart['products'][$productindex]['options'])) { $variant_id = $cart['products'][$productindex]['variant_id']; if ($variant_id) { if (!isset($hash[$variant_id])) { $hash[$variant_id]['avail'] = cw_warehouse_get_warehouse_avail($cart['products'][$productindex]['warehouse'], $cart['products'][$productindex]['product_id'], null, $variant_id); //cw_get_options_amount($cart['products'][$productindex]['options'], $cart['products'][$productindex]['product_id']); } $hash[$variant_id]['old'] += $cart['products'][$productindex]['amount']; $hash[$variant_id]['new'] += $new_quantity; $hash[$variant_id]['ids'][] = $cart['products'][$productindex]['product_id']; $cart['products'][$productindex]['variant_id'] = $variant_id; } } } } foreach ($productindexes as $productindex => $new_quantity) { if (!is_numeric($new_quantity) || empty($cart['products'][$productindex])) { continue; } $new_quantity = floor($new_quantity); $product_id = $cart['products'][$productindex]['product_id']; $total_quantity = $updates_array[$productindex]['total_quantity']; $total_amount = $updates_array[$productindex]['total_amount']; /* kornev - the amount is checking during the calculation if ($config['General']['unlimited_products'] == "N") { if (!empty($cart['products'][$productindex]['variant_id'])) { $amount_max = $hash[$cart['products'][$productindex]['variant_id']]['avail']; $total_quantity = $hash[$cart['products'][$productindex]['variant_id']]['old']; } else { $amount_max = cw_warehouse_get_warehouse_avail($cart['products'][$productindex]['warehouse_customer_id'], $product_id, null); } } else { */ $amount_max = $total_quantity + 1; /* } */ $amount_min = cw_query_first_cell("SELECT min_amount FROM {$tables['products']} WHERE product_id='{$product_id}'"); /* the amoutn is checking during the calculation if ($config['General']['unlimited_products'] == "Y") { $cart['products'][$productindex]['amount'] = $new_quantity; continue; } */ $cart['products'][$productindex]['amount'] = $new_quantity; continue; if ($new_quantity >= $amount_min && $cart['products'][$productindex]['distribution']) { $cart['products'][$productindex]['amount'] = 1; } elseif ($new_quantity >= $amount_min && $new_quantity <= $amount_max - $total_amount + $cart['products'][$productindex]['amount']) { $cart['products'][$productindex]['amount'] = $new_quantity; if (!empty($cart['products'][$productindex]['variant_id'])) { $hash[$cart['products'][$productindex]['variant_id']]['old'] += $new_quantity - $cart['products'][$productindex]['amount']; } else { $updates_array[$productindex]['total_amount'] += $new_quantity - $cart['products'][$productindex]['amount']; } } elseif ($new_quantity >= $amount_min) { $old_amount = $cart['products'][$productindex]['amount']; $cart['products'][$productindex]['amount'] = $amount_max - $total_amount + $cart['products'][$productindex]['amount']; if (!empty($cart['products'][$productindex]['variant_id'])) { $hash[$cart['products'][$productindex]['variant_id']]['old'] += $amount_max - $total_amount + $cart['products'][$productindex]['amount'] - $old_amount; } else { $updates_array[$productindex]['total_amount'] += $amount_max - $total_amount + $cart['products'][$productindex]['amount'] - $old_amount; } } else { $cart['products'][$productindex]['amount'] = 0; } if ($cart['products'][$productindex]['amount'] < 0) { $cart['products'][$productindex]['amount'] = 0; } } $products = array(); foreach ($cart['products'] as $product) { if ($product['amount'] > 0) { $product['destination_warehouse'] = $warehouse_selection[$product['cartid']]; $products[] = $product; } } $cart['products'] = $products; return $min_amount_warns; }
function cw_aom_add_new_products(&$doc, $products, $variants = array(), $amounts = array(), $discounts = array(), $prices = array()) { global $tables, $config, $customer_id, $current_area, $addons; $saved_data = compact('customer_id', 'current_area'); $customer_id = $doc['userinfo']['customer_id']; # kornev # pos, warehouse movement, supplier order or usual sale if (in_array($doc['type'], array('G', 'D'))) { $current_area = 'G'; } elseif (in_array($doc['type'], array('P', 'Q', 'R'))) { $current_area = 'S'; } else { $current_area = 'C'; } $customer_membership_id = $doc['userinfo']['membership_id']; $out_of_stock_products = array(); if (is_array($products)) { foreach ($products as $index => $newproduct_id) { if (empty($newproduct_id)) { continue; } if ($prd = cw_func_call('cw_product_get', array('id' => $newproduct_id, 'user_account' => $doc['userinfo'], 'info_type' => 9))) { if ($prices[$index]) { $prd['price'] = $prices[$index]; } #kornev, salesman can create the doc with any warehouses, because it's only cart (customer will place the real doc later) if (AREA_TYPE != 'B') { $_cart_warehouse = $doc['info']['warehouse_customer_id']; if (!$_cart_warehouse) { $_cart_warehouse = cw_warehouse_get_max_amount_warehouse($newproduct_id, $variants[$index]); $doc['info']['warehouse_customer_id'] = $_cart_warehouse; } $_avail = cw_warehouse_get_warehouse_avail($_cart_warehouse, $newproduct_id, null, $variants[$index]); if (!$_avail && !$config['unlimited_products']) { $out_of_stock_products[] = array(1, $prd['product']); continue; } $prd['avail'] = $_avail; $prd['warehouse_customer_id'] = $_cart_warehouse; } # kornev, TOFIX if ($addons['product_options']) { $prd['extra_data']['product_options'] = cw_get_default_options($newproduct_id, 1, $customer_membership_id, $variants[$index]); list($variant, $product_options_result) = cw_get_product_options_data($newproduct_id, $prd['extra_data']['product_options'], $customer_membership_id); $surcharge = 0; $prd['product_options'] = $product_options_result; if ($product_options_result) { foreach ($product_options_result as $key => $o) { $surcharge += $o['modifier_type'] == '%' ? $prd['price'] * $o['price_modifier'] / 100 : $o['price_modifier']; } } $prd['price'] = price_format($prd['price'] + $surcharge); } if ($discounts[$index]) { list($discount, $is_persent) = cw_core_parse_discount($discounts[$index]); if ($discount) { if ($is_persent == '%') { $prd['price'] = $prd['price'] * (100 - $discount) / 100; } else { $prd['price'] = $prd['price'] - $discount; } if ($prd['price'] < 0) { $prd['price'] = 0; } } } $prd['amount'] = intval($amounts[$index]) ? intval($amounts[$index]) : 1; $prd['new'] = true; if (empty($doc['max_cartid'])) { $doc['max_cartid'] = 0; } $doc['max_cartid']++; $prd['cartid'] = $doc['max_cartid']; if (in_array($doc['type'], array('P', 'Q', 'R'))) { $prd['is_auto_calc'] = $config['docs']['is_auto_calc'] == 'Y'; # kornev, if we are modify the supplier order, we should get the supplier price instead of the usual one (get latest) /* cw_load('supplier'); $supplier_net_price = cw_supplier_get_price($doc['userinfo']['customer_id'], $prd['product_id']); /* if (!$supplier_net_price) $out_of_stock_products[] = array(3, $newproduct_id); else { */ $prd['net_price'] = $supplier_net_price; // $prd['is_net_price'] = $supplier_net_price; $prd['discount_formula'] = cw_query_first_cell("select discount from {$tables['products_supplied_amount']} where product_id='{$prd['product_id']}' and supplier_customer_id='" . $doc['userinfo']['customer_id'] . "' order by date asc"); if (!$prd['discount_formula']) { $prd['discount_formula'] = cw_user_get_discount_formula($doc['userinfo']['customer_id']); } $prd['price'] = cw_user_apply_discount_by_formula($prd['discount_formula'], $supplier_net_price); $spl = cw_supplier_get_product_info($doc['userinfo']['customer_id'], $prd['product_id']); $prd['productcode'] = $spl['productcode']; $doc['products'][] = $prd; // } } else { $doc['products'][] = $prd; } unset($prd); } else { $out_of_stock_products[] = array(2, $newproduct_id); } } } cw_load('cart_process'); $doc['products'] = cw_call('cw_products_in_cart', array($doc, $doc['userinfo'], true)); cw_cart_normalize($doc); extract($saved_data); return $out_of_stock_products; }
function cw_product_get($params, $return = null) { extract($params); global $customer_id, $customer_id_type, $current_area, $cart, $current_location; global $current_language, $tables, $config, $addons; cw_load('files', 'taxes', 'tags'); $lang = $lang ? $lang : $current_language; $variant_id = $variant_id ? $variant_id : 0; $amount = intval($amount > 0 ? $amount : 1); $fields = $from_tbls = $query_joins = $where = array(); # kornev, merge standart and additional variables if ($return) { foreach ($return as $saname => $sadata) { if (isset(${$saname}) && is_array(${$saname}) && empty(${$saname})) { ${$saname} = $sadata; } } } $from_tbls[] = 'products'; $where[] = "{$tables['products']}.product_id='{$id}'"; # kornev # customer area - all of the checkings # pos area - not check for membership, just available for sale property if (in_array($current_area, array('C'))) { $memberships = array(0); if ($user_account['membership_id'] > 0) { $memberships[] = intval($user_account['membership_id']); } $where[] = "{$tables['products_memberships']}.membership_id IN (" . join(',', $memberships) . ")"; $where[] = "{$tables['products_prices']}.quantity <= {$amount} and {$tables['products_prices']}.membership_id in (" . join(',', $memberships) . ")"; if ($config['Appearance']['categories_in_products'] == '1') { $where[] = "{$tables['categories_memberships']}.membership_id IN (" . join(',', $memberships) . ")"; $query_joins['products_categories'] = array('on' => "{$tables['products_categories']}.product_id = {$tables['products']}.product_id", 'pos' => '0', 'is_straight' => 1); $query_joins['categories'] = array('on' => "{$tables['products_categories']}.category_id = {$tables['categories']}.category_id", 'parent' => 'products_categories'); $query_joins['categories_memberships'] = array('on' => "{$tables['categories_memberships']}.category_id = {$tables['categories']}.category_id", 'parent' => 'categories', 'is_straight' => 1); } $where[] = "{$tables['products']}.status in ('" . implode("', '", cw_core_get_required_status($current_area)) . "')"; } elseif (in_array($current_area, array('G'))) { $where[] = "{$tables['products']}.product_id = {$tables['products_prices']}.product_id AND {$tables['products_prices']}.quantity <= {$amount} and {$tables['products_prices']}.membership_id in (" . join(',', $memberships) . ")"; } $fields[] = "{$tables['products']}.*"; $query_joins['products_warehouses_amount'] = array('on' => "{$tables['products']}.product_id = {$tables['products_warehouses_amount']}.product_id and {$tables['products_warehouses_amount']}.warehouse_customer_id=0 and {$tables['products_warehouses_amount']}.variant_id='{$variant_id}'"); $in_cart = 0; if ($current_area == 'C' && !empty($cart) && !empty($cart['products'])) { foreach ($cart['products'] as $cart_item) { if ($cart_item['product_id'] == $id) { $in_cart += $cart_item['amount']; } } } $fields[] = "{$tables['products_warehouses_amount']}.avail-{$in_cart} AS avail"; # kornev, TOFIX if ($addons['product_options'] && in_array($current_area, array('A', 'P'))) { $query_joins['product_variants'] = array('on' => "{$tables['products']}.product_id = {$tables['product_variants']}.product_id"); $fields[] = "IF({$tables['product_variants']}.product_id IS NULL, '', 'Y') as is_variants"; } /* if ($addons['manufacturers']) { $query_joins['manufacturers'] = array( 'on' => "$tables[manufacturers].manufacturer_id = $tables[products].manufacturer_id", ); $fields[] = "$tables[manufacturers].manufacturer"; } */ // statistic $fields[] = "{$tables['products_stats']}.views_stats"; $fields[] = "{$tables['products_stats']}.sales_stats"; $fields[] = "{$tables['products_stats']}.del_stats"; $fields[] = "{$tables['products_stats']}.add_to_cart"; $query_joins['products_stats'] = array('on' => "{$tables['products_stats']}.product_id = {$tables['products']}.product_id"); if ($current_area == 'A' || $current_area == 'P') { $fields[] = "{$tables['products_prices']}.price"; $fields[] = "{$tables['products_prices']}.list_price"; $query_joins['products_prices'] = array('on' => "{$tables['products_prices']}.product_id={$tables['products']}.product_id AND {$tables['products_prices']}.variant_id = '{$variant_id}' and {$tables['products_prices']}.quantity <= {$amount}"); } else { $query_joins['products_prices'] = array('on' => "{$tables['products_prices']}.product_id={$tables['products']}.product_id", 'is_inner' => 1); # kornev, find the min price and select only this record. $fields[] = "min({$tables['products_prices']}.price) as price"; $fields[] = "{$tables['products_prices']}.variant_id"; $fields[] = "min({$tables['products_prices']}.list_price) as list_price"; } $fields[] = "IF({$tables['products_lng']}.product_id != '', {$tables['products_lng']}.product, {$tables['products']}.product) as product"; $fields[] = "IF({$tables['products_lng']}.product_id != '', {$tables['products_lng']}.descr, {$tables['products']}.descr) as descr"; $fields[] = "IF({$tables['products_lng']}.product_id != '', {$tables['products_lng']}.fulldescr, {$tables['products']}.fulldescr) as fulldescr"; $fields[] = "IF({$tables['products_lng']}.product_id != '', {$tables['products_lng']}.features_text, {$tables['products']}.features_text) as features_text"; $fields[] = "IF({$tables['products_lng']}.product_id != '', {$tables['products_lng']}.specifications, {$tables['products']}.specifications) as specifications"; $query_joins['products_lng'] = array('on' => "{$tables['products_lng']}.code='{$lang}' AND {$tables['products_lng']}.product_id = {$tables['products']}.product_id"); if (in_array($current_area, array('C', 'G', 'S'))) { $fields[] = "{$tables['products_flat']}.*"; $query_joins['products_flat'] = array('on' => "{$tables['products']}.product_id = {$tables['products_flat']}.product_id"); if ($current_area == 'C') { $query_joins['products_memberships'] = array('on' => "{$tables['products_memberships']}.product_id = {$tables['products']}.product_id", 'is_inner' => 1); } } if ($config['Appearance']['categories_in_products'] == '1') { $fields[] = "{$tables['products_categories']}.category_id"; $query_joins['categories'] = array('parent' => 'products_categories', 'on' => "{$tables['categories']}.category_id = {$tables['products_categories']}.category_id"); $query_joins['products_categories'] = array('on' => "{$tables['products_categories']}.product_id = {$tables['products']}.product_id and {$tables['products_categories']}.main=1", 'pos' => '0', 'is_straight' => 1); } $fields[] = "{$tables['products']}.product_id"; $query = cw_db_generate_query($fields, $from_tbls, $query_joins, $where, array("{$tables['products']}.product_id"), array(), array()); $product = cw_query_first($query); # Error handling if (!$product || $current_area == 'C' && !$product['category_id'] && $config['Appearance']['categories_in_products'] == '1') { return false; } $product['system'] = cw_call('cw_product_get_system_info', array($product['product_id'])); $product['attribute_class_ids'] = cw_func_call('cw_items_attribute_classes_get', array('item_id' => $product['product_id'], 'item_type' => 'P', 'for_product_modify' => $for_product_modify)); if ($info_type & 1) { $product['membership_ids'] = cw_query_key("select membership_id from {$tables['products_memberships']} where product_id = '{$product['product_id']}'"); } # kornev, TOFIX if ($info_type & 64 && $product['variant_id'] && $addons['product_options']) { $tmp = cw_query_first("SELECT * FROM {$tables['product_variants']} WHERE variant_id = '{$product['variant_id']}'"); if (!empty($tmp)) { cw_unset($tmp, "def"); $product = cw_array_merge($product, $tmp); } else { cw_unset($product, 'variant_id'); } } if ($info_type & 128) { cw_load('image'); $product['image_thumb'] = cw_image_get('products_images_thumb', $id); } if ($info_type & 512) { $product['image_det'] = cw_image_get('products_images_det', $id); # kornev, TOFIX if (in_array($current_area, array('C', 'B')) && $product['variant_id'] && $addons['product_options']) { $var_image = cw_image_get('products_images_var', $id); if (!$var_image['is_default']) { $product['image_det'] = $var_image; } } } # TOFIX if (in_array($current_area, array('C', 'B', 'G'))) { if (!$addons['egoods']) { $product['distribution'] = ''; } $product['display_price'] = $product['price']; if ($current_area == 'C' && $info_type & 8) { $_tmp_price = $product['price']; $product['price'] = $product['list_price']; cw_get_products_taxes($product, $user_account); $product['list_price_net'] = $product['list_price']; $product['list_price'] = $product['taxed_price']; $product['price'] = $_tmp_price; } $product['taxes'] = cw_get_products_taxes($product, $user_account, false, '', $current_area == 'G' && $user_account['usertype'] != 'R'); } if (in_array($current_area, array('C', 'B'))) { $product['descr'] = cw_eol2br($product['descr']); $product['fulldescr'] = cw_eol2br($product['fulldescr']); } $product['uns_shippings'] = unserialize($product['shippings']); $product['tags'] = cw_tags_get_product_tags($id); if ($info_type & 4096 && $product['warranty_id']) { $wr = cw_get_warranty($product['warranty_id'], $lang); $product['warranties'] = $wr['body']; } // TODO: move to addon as on_product_get handler if ($info_type & 8192) { cw_load('warehouse'); if ($addons['warehouse']) { if (AREA_TYPE == 'A') { $product['avail_ordered'] = cw_warehouse_get_avail($id, 0, 'avail_ordered'); $product['avail_sold'] = cw_warehouse_get_avail($id, 0, 'avail_sold'); $product['avail_reserved'] = cw_warehouse_get_avail($id, 0, 'avail_reserved'); } elseif (AREA_TYPE == 'P') { $product['avail'] = cw_warehouse_get_warehouse_avail($customer_id, $id); $product['avail_ordered'] = cw_warehouse_get_warehouse_avail($customer_id, $id, 'avail_ordered'); } else { // TOFIX: $product['avail'] becomes different meanings when info_type & 8192 flag is raised or not // without flag - avail of all variants without products already in cart // with flag - total avail as set in admin per variant // $product['avail'] = cw_warehouse_get_avail_for_customer($id, $product['variant_id']); // $product['avails']= cw_warehouse_get_avails_customer($id); $product['avail'] = cw_warehouse_get_avail_for_customer($id, $product['variant_id']); } } else { $product['avails'] = cw_warehouse_get_avails_customer($id, $product['avail'] + $product['avail_ordered']); } } return $product; }
$result['product_info'] = $product_info; $product_id = $product_info['product_id']; if ($addons['sn']) { $result['auto_generated'] = cw_serials_is_auto_generated($product_id); if ($result['auto_generated']) { $result['numbers'] = implode(" ", cw_serials_check_product($product_id)); } elseif ($ean['serial'] && $ean['serial'] != $default_number) { $res = cw_serials_add($user_account['warehouse_customer_id'], $product_id, $ean['serial']); $result['numbers'] = $ean['serial']; if (!$res) { $result['error'] = 2; } } } if (!$result['error']) { $current_avail = cw_warehouse_get_warehouse_avail($user_account['warehouse_customer_id'], $product_info['product_id'], null, $product_info['variant_id']); $insert = array(); $insert['avail'] = intval($current_avail) + 1; $insert['warehouse_customer_id'] = $user_account['warehouse_customer_id']; $insert['variant_id'] = $product_info['variant_id']; $insert['product_id'] = $product_info['product_id']; cw_warehouse_insert_avail($insert, true); } } else { $result['error'] = 1; } $ean_products[] = $result; } if (count($ean_products)) { $mode = 'result'; } else {