public function update($element) { $parentId = vtws_getIdComponents($element['parent_id']); $parentId = $parentId[1]; $parentTypeHandler = vtws_getModuleHandlerFromId($element['parent_id'], $this->user); $parentTypeMeta = $parentTypeHandler->getMeta(); $parentType = $parentTypeMeta->getEntityName(); $parentObject = CRMEntity::getInstance($parentType); $parentObject->id = $parentId; $lineItemList = $this->getAllLineItemForParent($parentId); $parent = $this->getParentById($element['parent_id']); $location = $this->getLocationById($lineItemList, $element['id']); if ($location === false) { throw new WebserviceException('UNKOWN_CHILD', 'given line item is not child of parent'); } if (empty($element['listprice'])) { $productId = vtws_getIdComponents($element['productid']); $productId = $productId[1]; $element['listprice'] = $this->getProductPrice($productId); } $lineItemList[$location] = $element; deleteInventoryProductDetails($parentObject); $this->resetInventoryStock($element, $parent); $updatedLineItemList = array(); foreach ($lineItemList as $lineItem) { $id = vtws_getIdComponents($lineItem['id']); $this->newId = $id[1]; $updatedLineItemList[] = $this->_create($elementType, $lineItem); if ($element == $lineItem) { $createdElement = $updatedLineItemList[count($updatedLineItemList) - 1]; } } $this->setCache($parentId, $updatedLineItemList); $this->updateInventoryStock($element, $parent); $this->updateParent($element, $parent); return $createdElement; }
/** Function used to save the Inventory product details for the passed entity * @param object reference $focus - object reference to which we want to save the product details from REQUEST values where as the entity will be Purchase Order, Sales Order, Quotes or Invoice * @param string $module - module name * @param $update_prod_stock - true or false (default), if true we have to update the stock for PO only * @return void */ function saveInventoryProductDetails(&$focus, $module, $update_prod_stock = 'false', $updateDemand = '') { $adb = PearDatabase::getInstance(); $log = vglobal('log'); $id = $focus->id; $log->debug("Entering into function saveInventoryProductDetails({$module})."); //Added to get the convertid if (isset($_REQUEST['convert_from']) && $_REQUEST['convert_from'] != '') { $id = vtlib_purify($_REQUEST['return_id']); } else { if (isset($_REQUEST['duplicate_from']) && $_REQUEST['duplicate_from'] != '') { $id = vtlib_purify($_REQUEST['duplicate_from']); } } $ext_prod_arr = array(); if ($focus->mode == 'edit') { if ($_REQUEST['taxtype'] == 'group') { $all_available_taxes = getAllTaxes('available', '', 'edit', $id); } $return_old_values = ''; if ($module != 'PurchaseOrder') { $return_old_values = 'return_old_values'; } //we will retrieve the existing product details and store it in a array and then delete all the existing product details and save new values, retrieve the old value and update stock only for SO, Quotes and Invoice not for PO //$ext_prod_arr = deleteInventoryProductDetails($focus->id,$return_old_values); deleteInventoryProductDetails($focus); } else { if ($_REQUEST['taxtype'] == 'group') { $all_available_taxes = getAllTaxes('available', '', 'edit', $id); } } $tot_no_prod = $_REQUEST['totalProductCount']; //If the taxtype is group then retrieve all available taxes, else retrive associated taxes for each product inside loop $prod_seq = 1; $total_purchase = 0; $total_margin = 0; for ($i = 1; $i <= $tot_no_prod; $i++) { //if the product is deleted then we should avoid saving the deleted products if ($_REQUEST["deleted" . $i] == 1) { continue; } $prod_id = vtlib_purify($_REQUEST['hdnProductId' . $i]); if (isset($_REQUEST['productDescription' . $i])) { $description = vtlib_purify($_REQUEST['productDescription' . $i]); } /* else{ $desc_duery = "select vtiger_crmentity.description AS product_description from vtiger_crmentity where vtiger_crmentity.crmid=?"; $desc_res = $adb->pquery($desc_duery,array($prod_id)); $description = $adb->query_result($desc_res,0,"product_description"); } */ $qty = vtlib_purify($_REQUEST['qty' . $i]); $listprice = vtlib_purify($_REQUEST['listPrice' . $i]); $comment = vtlib_purify($_REQUEST['comment' . $i]); $purchaseCost = vtlib_purify($_REQUEST['purchaseCost' . $i]); $calculationsid = vtlib_purify($_REQUEST['calculationId' . $i]); $purchase = vtlib_purify($_REQUEST['purchase' . $i]); $margin = vtlib_purify($_REQUEST['margin' . $i]); $marginp = vtlib_purify($_REQUEST['marginp' . $i]); $total_purchase += $purchase * $qty; $total_margin += $margin; //we have to update the Product stock for PurchaseOrder if $update_prod_stock is true if ($module == 'PurchaseOrder' && $update_prod_stock == 'true') { addToProductStock($prod_id, $qty); } if ($module == 'SalesOrder') { if ($updateDemand == '-') { deductFromProductDemand($prod_id, $qty); } elseif ($updateDemand == '+') { addToProductDemand($prod_id, $qty); } } $query = "insert into vtiger_inventoryproductrel(id, productid, sequence_no, quantity, listprice, comment, description, calculationsid, purchase, margin, marginp) values(?,?,?,?,?,?,?,?,?,?,?)"; $qparams = array($focus->id, $prod_id, $prod_seq, $qty, $listprice, $comment, $description, $calculationsid, $purchase, $margin, $marginp); $adb->pquery($query, $qparams); $lineitem_id = $adb->getLastInsertID(); $sub_prod_str = $_REQUEST['subproduct_ids' . $i]; if (!empty($sub_prod_str)) { $sub_prod = explode(":", $sub_prod_str); for ($j = 0; $j < count($sub_prod); $j++) { $query = "insert into vtiger_inventorysubproductrel(id, sequence_no, productid) values(?,?,?)"; $qparams = array($focus->id, $prod_seq, $sub_prod[$j]); $adb->pquery($query, $qparams); } } $prod_seq++; if ($module != 'PurchaseOrder') { //update the stock with existing details updateStk($prod_id, $qty, $focus->mode, $ext_prod_arr, $module); } //we should update discount and tax details $updatequery = "update vtiger_inventoryproductrel set "; $updateparams = array(); //set the discount percentage or discount amount in update query, then set the tax values if ($_REQUEST['discount_type' . $i] == 'percentage') { $updatequery .= " discount_percent=?,"; array_push($updateparams, $_REQUEST['discount_percentage' . $i]); } elseif ($_REQUEST['discount_type' . $i] == 'amount') { $updatequery .= " discount_amount=?,"; $discount_amount = $_REQUEST['discount_amount' . $i]; array_push($updateparams, $discount_amount); } if ($_REQUEST['taxtype'] == 'group') { for ($tax_count = 0; $tax_count < count($all_available_taxes); $tax_count++) { $selected_tax = $_REQUEST['group_tax_option']; $updatequery .= " tax = ?,"; array_push($updateparams, $selected_tax); $tax_name = $all_available_taxes[$tax_count]['taxname']; $request_tax_name = $tax_name . "_group_percentage"; if (isset($_REQUEST[$request_tax_name])) { $tax_val = vtlib_purify($_REQUEST[$request_tax_name]); } $updatequery .= " {$tax_name} = ?,"; array_push($updateparams, $tax_val); } } else { $taxes_for_product = getTaxDetailsForProduct($prod_id, 'all'); $selected_tax = $_REQUEST['tax_option' . $i]; $updatequery .= " tax = ?,"; array_push($updateparams, $selected_tax); for ($tax_count = 0; $tax_count < count($taxes_for_product); $tax_count++) { $tax_name = $taxes_for_product[$tax_count]['taxname']; $request_tax_name = $tax_name . "_percentage" . $i; $updatequery .= " {$tax_name} = ?,"; array_push($updateparams, vtlib_purify($_REQUEST[$request_tax_name])); } } $updatequery = trim($updatequery, ',') . " where id=? and productid=? and lineitem_id = ?"; array_push($updateparams, $focus->id, $prod_id, $lineitem_id); // jens 2006/08/19 - protect against empy update queries if (!preg_match('/set\\s+where/i', $updatequery)) { $adb->pquery($updatequery, $updateparams); } } //we should update the netprice (subtotal), taxtype, group discount, S&H charge, S&H taxes total //netprice, group discount, taxtype, total to entity table $updatequery = " update {$focus->table_name} set "; $updateparams = array(); $subtotal = $_REQUEST['subtotal']; $updatequery .= " subtotal=?,"; array_push($updateparams, $subtotal); $updatequery .= " total_purchase=?,"; array_push($updateparams, $total_purchase); $updatequery .= " total_margin=?,"; array_push($updateparams, $total_margin); $updatequery .= " total_marginp=?,"; $total_marginp = 0; if ($total_purchase != 0) { $total_marginp = $total_margin / $total_purchase * 100; } array_push($updateparams, $total_marginp); $updatequery .= " taxtype=?,"; array_push($updateparams, $_REQUEST['taxtype']); //for discount percentage or discount amount if ($_REQUEST['discount_type_final'] == 'percentage') { $updatequery .= " discount_percent=?,discount_amount=?,"; array_push($updateparams, vtlib_purify($_REQUEST['discount_percentage_final'])); array_push($updateparams, null); } elseif ($_REQUEST['discount_type_final'] == 'amount') { $discount_amount_final = vtlib_purify($_REQUEST['discount_amount_final']); $updatequery .= " discount_amount=?,discount_percent=?,"; array_push($updateparams, $discount_amount_final); array_push($updateparams, null); } elseif ($_REQUEST['discount_type_final'] == 'zero') { $updatequery .= "discount_amount=?,discount_percent=?,"; array_push($updateparams, null); array_push($updateparams, null); } $total = vtlib_purify($_REQUEST['total']); $updatequery .= " total=?"; array_push($updateparams, $total); //$id_array = Array('PurchaseOrder'=>'purchaseorderid','SalesOrder'=>'salesorderid','Quotes'=>'quoteid','Invoice'=>'invoiceid'); //Added where condition to which entity we want to update these values $updatequery .= " where " . $focus->table_index . "=?"; array_push($updateparams, $focus->id); $adb->pquery($updatequery, $updateparams); $log->debug("Exit from function saveInventoryProductDetails({$module})."); }
/** Function used to save the Inventory product details for the passed entity * @param object reference $focus - object reference to which we want to save the product details from REQUEST values where as the entity will be Purchase Order, Sales Order, Quotes or Invoice * @param string $module - module name * @param $update_prod_stock - true or false (default), if true we have to update the stock for PO only * @return void */ function saveInventoryProductDetails(&$focus, $module, $update_prod_stock = 'false', $updateDemand = '') { global $log, $adb; $id = $focus->id; $log->debug("Entering into function saveInventoryProductDetails({$module})."); //Added to get the convertid if (isset($_REQUEST['convert_from']) && $_REQUEST['convert_from'] != '') { $id = vtlib_purify($_REQUEST['return_id']); } else { if (isset($_REQUEST['duplicate_from']) && $_REQUEST['duplicate_from'] != '') { $id = vtlib_purify($_REQUEST['duplicate_from']); } } $ipr_cols = $adb->getColumnNames('vtiger_inventoryproductrel'); $ext_prod_arr = array(); if ($focus->mode == 'edit') { if ($_REQUEST['taxtype'] == 'group') { $all_available_taxes = getAllTaxes('available', '', 'edit', $id); } $return_old_values = ''; if ($module != 'PurchaseOrder') { $return_old_values = 'return_old_values'; } //we will retrieve the existing product details and store it in a array and then delete all the existing product details and save new values, retrieve the old value and update stock only for SO, Quotes and Invoice not for PO //$ext_prod_arr = deleteInventoryProductDetails($focus->id,$return_old_values); deleteInventoryProductDetails($focus); } else { if ($_REQUEST['taxtype'] == 'group') { $all_available_taxes = getAllTaxes('available', '', 'edit', $id); } } $tot_no_prod = $_REQUEST['totalProductCount']; if ($module != 'PurchaseOrder') { if (GlobalVariable::getVariable('B2B', '1') == '1') { $acvid = $focus->column_fields['account_id']; } else { $acvid = $focus->column_fields['contact_id']; } } else { $acvid = $focus->column_fields['vendor_id']; } //If the taxtype is group then retrieve all available taxes, else retrive associated taxes for each product inside loop $prod_seq = 1; for ($i = 1; $i <= $tot_no_prod; $i++) { //if the product is deleted then we should avoid saving the deleted products if ($_REQUEST["deleted" . $i] == 1) { continue; } $prod_id = vtlib_purify($_REQUEST['hdnProductId' . $i]); if (isset($_REQUEST['productDescription' . $i])) { $description = vtlib_purify($_REQUEST['productDescription' . $i]); } /*else{ $desc_duery = "select vtiger_crmentity.description AS product_description from vtiger_crmentity where vtiger_crmentity.crmid=?"; $desc_res = $adb->pquery($desc_duery,array($prod_id)); $description = $adb->query_result($desc_res,0,"product_description"); } */ $qty = vtlib_purify($_REQUEST['qty' . $i]); $listprice = vtlib_purify($_REQUEST['listPrice' . $i]); $comment = vtlib_purify($_REQUEST['comment' . $i]); //we have to update the Product stock for PurchaseOrder if $update_prod_stock is true if ($module == 'PurchaseOrder' && $update_prod_stock == 'true') { addToProductStock($prod_id, $qty); } if ($module == 'SalesOrder') { if ($updateDemand == '-') { deductFromProductDemand($prod_id, $qty); } elseif ($updateDemand == '+') { addToProductDemand($prod_id, $qty); } } $query = "insert into vtiger_inventoryproductrel(id, productid, sequence_no, quantity, listprice, comment, description) values(?,?,?,?,?,?,?)"; $qparams = array($focus->id, $prod_id, $prod_seq, $qty, $listprice, $comment, $description); $adb->pquery($query, $qparams); $lineitem_id = $adb->getLastInsertID(); $sub_prod_str = $_REQUEST['subproduct_ids' . $i]; if (!empty($sub_prod_str)) { $sub_prod = explode(":", $sub_prod_str); for ($j = 0; $j < count($sub_prod); $j++) { $query = "insert into vtiger_inventorysubproductrel(id, sequence_no, productid) values(?,?,?)"; $qparams = array($focus->id, $prod_seq, $sub_prod[$j]); $adb->pquery($query, $qparams); } } $prod_seq++; if ($module != 'PurchaseOrder') { //update the stock with existing details updateStk($prod_id, $qty, $focus->mode, $ext_prod_arr, $module); } //we should update discount and tax details $updatequery = "update vtiger_inventoryproductrel set "; $updateparams = array(); //set the discount percentage or discount amount in update query, then set the tax values if ($_REQUEST['discount_type' . $i] == 'percentage') { $updatequery .= " discount_percent=?,"; array_push($updateparams, $_REQUEST['discount_percentage' . $i]); } elseif ($_REQUEST['discount_type' . $i] == 'amount') { $updatequery .= " discount_amount=?,"; $discount_amount = $_REQUEST['discount_amount' . $i]; array_push($updateparams, $discount_amount); } if ($_REQUEST['taxtype'] == 'group') { for ($tax_count = 0; $tax_count < count($all_available_taxes); $tax_count++) { $tax_name = $all_available_taxes[$tax_count]['taxname']; if (!in_array($tax_name, $ipr_cols)) { continue; } $tax_val = $all_available_taxes[$tax_count]['percentage']; $request_tax_name = $tax_name . "_group_percentage"; if (isset($_REQUEST[$request_tax_name])) { $tax_val = vtlib_purify($_REQUEST[$request_tax_name]); } $updatequery .= " {$tax_name} = ?,"; array_push($updateparams, $tax_val); } $updatequery = trim($updatequery, ',') . " where id=? and productid=? and lineitem_id = ?"; array_push($updateparams, $focus->id, $prod_id, $lineitem_id); } else { $taxes_for_product = getTaxDetailsForProduct($prod_id, 'all', $acvid); for ($tax_count = 0; $tax_count < count($taxes_for_product); $tax_count++) { $tax_name = $taxes_for_product[$tax_count]['taxname']; if (!in_array($tax_name, $ipr_cols)) { continue; } $request_tax_name = $tax_name . "_percentage" . $i; $updatequery .= " {$tax_name} = ?,"; array_push($updateparams, vtlib_purify($_REQUEST[$request_tax_name])); } $updatequery = trim($updatequery, ',') . " where id=? and productid=? and lineitem_id = ?"; array_push($updateparams, $focus->id, $prod_id, $lineitem_id); } // jens 2006/08/19 - protect against empy update queries if (!preg_match('/set\\s+where/i', $updatequery)) { $adb->pquery($updatequery, $updateparams); } } //we should update the netprice (subtotal), taxtype, group discount, S&H charge, S&H taxes, adjustment and total //netprice, group discount, taxtype, S&H amount, adjustment and total to entity table $updatequery = " update {$focus->table_name} set "; $updateparams = array(); $subtotal = $_REQUEST['subtotal']; $updatequery .= " subtotal=?,"; array_push($updateparams, $subtotal); $updatequery .= " taxtype=?,"; array_push($updateparams, $_REQUEST['taxtype']); //for discount percentage or discount amount if ($_REQUEST['discount_type_final'] == 'percentage') { $updatequery .= " discount_percent=?,"; array_push($updateparams, vtlib_purify($_REQUEST['discount_percentage_final'])); } elseif ($_REQUEST['discount_type_final'] == 'amount') { $discount_amount_final = vtlib_purify($_REQUEST['discount_amount_final']); $updatequery .= " discount_amount=?,"; array_push($updateparams, $discount_amount_final); } $shipping_handling_charge = vtlib_purify($_REQUEST['shipping_handling_charge']); $updatequery .= " s_h_amount=?,"; array_push($updateparams, $shipping_handling_charge); //if the user gave - sign in adjustment then add with the value $adjustmentType = ''; if ($_REQUEST['adjustmentType'] == '-') { $adjustmentType = vtlib_purify($_REQUEST['adjustmentType']); } $adjustment = vtlib_purify($_REQUEST['adjustment']); $updatequery .= " adjustment=?,"; array_push($updateparams, $adjustmentType . $adjustment); $total = vtlib_purify($_REQUEST['total']); $updatequery .= " total=?"; array_push($updateparams, $total); //$id_array = Array('PurchaseOrder'=>'purchaseorderid','SalesOrder'=>'salesorderid','Quotes'=>'quoteid','Invoice'=>'invoiceid'); //Added where condition to which entity we want to update these values $updatequery .= " where " . $focus->table_index . "=?"; array_push($updateparams, $focus->id); $adb->pquery($updatequery, $updateparams); //to save the S&H tax details in vtiger_inventoryshippingrel table $isr_cols = $adb->getColumnNames('vtiger_inventoryshippingrel'); $sh_tax_details = getAllTaxes('all', 'sh'); $sh_query_fields = "id,"; $sh_query_values = "?,"; $sh_query_params = array($focus->id); for ($i = 0; $i < count($sh_tax_details); $i++) { $tax_name = $sh_tax_details[$i]['taxname'] . "_sh_percent"; if ($_REQUEST[$tax_name] != '' and in_array($sh_tax_details[$i]['taxname'], $isr_cols)) { $sh_query_fields .= $sh_tax_details[$i]['taxname'] . ","; $sh_query_values .= "?,"; array_push($sh_query_params, vtlib_purify($_REQUEST[$tax_name])); } } $sh_query_fields = trim($sh_query_fields, ','); $sh_query_values = trim($sh_query_values, ','); if ($sh_query_fields != 'id') { $sh_query = "insert into vtiger_inventoryshippingrel({$sh_query_fields}) values({$sh_query_values})"; $adb->pquery($sh_query, $sh_query_params); } $log->debug("Exit from function saveInventoryProductDetails({$module})."); }
/** Function used to save the Inventory product details for the passed entity * @param object reference $this - object reference to which we want to save the product details from REQUEST values where as the entity will be Purchase Order, Sales Order, Quotes or Invoice * @param string $module - module name * @param $update_prod_stock - true or false (default), if true we have to update the stock for PO only * @return void */ function saveInventoryProductDetails() { global $log; $log->debug("Entering into function saveInventoryProductDetails()."); global $app_strings; if ($this->mode == 'edit') { $inventarr = $this->getInventProInfo($this->id); // $update_productsql2 = "update ec_products set num = num +".$inventarr['quantity']." where productid =".$inventarr['productid']; // $this->db->query($update_productsql2); deleteInventoryProductDetails($this->id, ''); } $tot_no_prod = $_REQUEST['totalProductCount']; $prod_seq = 1; for ($i = 1; $i <= $tot_no_prod; $i++) { $prod_id = $_REQUEST['hdnProductId' . $i]; $qty = $_REQUEST['qty' . $i]; $listprice = $_REQUEST['listPrice' . $i]; $listprice = getConvertedPrice($listprice); //convert the listPrice into $ $comment = addslashes($_REQUEST['comment' . $i]); //if the product is deleted then we should avoid saving the deleted products if ($_REQUEST["deleted" . $i] == 1) { continue; } $query = "insert into ec_inventoryproductrel(id, productid, sequence_no, quantity, listprice, comment) values({$this->id}, {$prod_id} , {$prod_seq}, {$qty}, {$listprice}, '{$comment}')"; $prod_seq++; $this->db->query($query); } //we should update the netprice (subtotal), taxtype, group discount, S&H charge, S&H taxes, adjustment and total //netprice, group discount, taxtype, S&H amount, adjustment and total to entity table $updatequery = " update {$this->table_name} set "; $total = getConvertedPrice($_REQUEST['total']); //convert total to $ $updatequery .= " total='" . $total . "'"; $updatequery .= " where salesorderid={$this->id}"; $this->db->query($updatequery); $log->debug("Exit from function saveInventoryProductDetails()."); }