Skip to content
Snippets Groups Projects
VtigerInventoryOperation.php 7.99 KiB
Newer Older
  • Learn to ignore specific revisions
  • Prasad's avatar
    Prasad committed
    <?php
    /*+*******************************************************************************
     *  The contents of this file are subject to the vtiger CRM Public License Version 1.0
     * ("License"); You may not use this file except in compliance with the License
     * The Original Code is:  vtiger CRM Open Source
     * The Initial Developer of the Original Code is vtiger.
     * Portions created by vtiger are Copyright (C) vtiger.
     * All Rights Reserved.
     *
     *********************************************************************************/
    require_once 'include/Webservices/VtigerModuleOperation.php';
    require_once 'include/Webservices/Utils.php';
    
    /**
     * Description of VtigerInventoryOperation
     */
    class VtigerInventoryOperation extends VtigerModuleOperation {
    
    	public function create($elementType, $element) {
    		$element = $this->sanitizeInventoryForInsert($element);
    		$element = $this->sanitizeShippingTaxes($element);
    		$lineItems = $element['LineItems'];
    		if (!empty($lineItems)) {
                $element = parent::create($elementType, $element);
                $handler = vtws_getModuleHandlerFromName('LineItem', $this->user);
    			$handler->setLineItems('LineItem', $lineItems, $element);
                $parent = $handler->getParentById($element['id']);
    			$handler->updateParent($lineItems, $parent);
                $updatedParent = $handler->getParentById($element['id']);
                //since subtotal and grand total is updated in the update parent api 
                $parent['hdnSubTotal'] = $updatedParent['hdnSubTotal'];
                $parent['hdnGrandTotal'] = $updatedParent['hdnGrandTotal'];
                $parent['pre_tax_total'] = $updatedParent['pre_tax_total'];
                $components = vtws_getIdComponents($element['id']);
                $parentId = $components[1]; 
                $parent['LineItems'] = $handler->getAllLineItemForParent($parentId);
                
    		} else {
    			throw new WebServiceException(WebServiceErrorCode::$MANDFIELDSMISSING, "Mandatory Fields Missing..");
    		}
    		return array_merge($element,$parent);
    	}
    
    	public function update($element) {
    		$element = $this->sanitizeInventoryForInsert($element);
    		$element = $this->sanitizeShippingTaxes($element);
    		$lineItemList = $element['LineItems'];
    		$handler = vtws_getModuleHandlerFromName('LineItem', $this->user);
    		if (!empty($lineItemList)) {
    			$updatedElement = parent::update($element);
    			$handler->setLineItems('LineItem', $lineItemList, $updatedElement);
    			$parent = $handler->getParentById($element['id']);
    			$handler->updateParent($lineItemList, $parent);
                $updatedParent = $handler->getParentById($element['id']);
                //since subtotal and grand total is updated in the update parent api 
                $parent['hdnSubTotal'] = $updatedParent['hdnSubTotal'];
                $parent['hdnGrandTotal'] = $updatedParent['hdnGrandTotal'];
                $parent['pre_tax_total'] = $updatedParent['pre_tax_total'];
                $updatedElement = array_merge($updatedElement,$parent);
    		} else {
    			$updatedElement = $this->revise($element);
    		}
    		return $updatedElement;
    	}
    
    	public function revise($element) {
    		$element = $this->sanitizeInventoryForInsert($element);
    		$element = $this->sanitizeShippingTaxes($element);
    		$handler = vtws_getModuleHandlerFromName('LineItem', $this->user);
    		$components = vtws_getIdComponents($element['id']);
    		$parentId = $components[1];
    
    		if (!empty($element['LineItems'])) {
    			$lineItemList = $element['LineItems'];
    			unset($element['LineItems']);
    
    			$updatedElement = parent::revise($element);
    			$handler->setLineItems('LineItem', $lineItemList, $updatedElement);
    			$parent = $handler->getParentById($element['id']);
    			$handler->updateParent($lineItemList, $parent);
    			$updatedParent = $handler->getParentById($element['id']);
    			//since subtotal and grand total is updated in the update parent api
    			$parent['hdnSubTotal'] = $updatedParent['hdnSubTotal'];
    			$parent['hdnGrandTotal'] = $updatedParent['hdnGrandTotal'];
    			$parent['pre_tax_total'] = $updatedParent['pre_tax_total'];
    			$parent['LineItems'] = $handler->getAllLineItemForParent($parentId);
    		} else {
    			$prevAction = $_REQUEST['action'];
    			// This is added as we are passing data in user format, so in the crmentity insertIntoEntity API
    			// should convert to database format, we have added a check based on the action name there. But 
    			// while saving Invoice and Purchase Order we are also depending on the same action file names to
    			// not to update stock if its an ajax save. In this case also we do not want line items to change.
    			$_REQUEST['action'] = 'FROM_WS';
    
    			$parent = parent::revise($element);
    			$_REQUEST['action'] = $prevAction;
    		}
    		return array_merge($element,$parent);
    	}
    
    	public function retrieve($id) {
    		$element = parent::retrieve($id);
    		$skipLineItemFields = getLineItemFields();
    		foreach ($skipLineItemFields as $key => $field) {
    			if (array_key_exists($field, $element)) {
    				unset($element[$field]);
    			}
    		}
    		$handler = vtws_getModuleHandlerFromName('LineItem', $this->user);
    		$idComponents = vtws_getIdComponents($id);
    		$lineItems = $handler->getAllLineItemForParent($idComponents[1]);
    		$element['LineItems'] = $lineItems;
    		return $element;
    	}
    
    	public function delete($id) {
    		$components = vtws_getIdComponents($id);
    		$parentId = $components[1];
    		$handler = vtws_getModuleHandlerFromName('LineItem', $this->user);
    		$handler->cleanLineItemList($id);
    		$result = parent::delete($id);
    		return $result;
    	}
    	/**
    	 * function to display discounts,taxes and adjustments
    	 * @param type $element
    	 * @return type
    	 */
    	protected function sanitizeInventoryForInsert($element) {
    		$meta = $this->getMeta();
    		if (!empty($element['hdnTaxType'])) {
    			$_REQUEST['taxtype'] = $element['hdnTaxType'];
    		}
    		if (!empty($element['hdnSubTotal'])) {
    			$_REQUEST['subtotal'] = $element['hdnSubTotal'];
    		}
    
    		if (($element['hdnDiscountAmount'])) {
    			$_REQUEST['discount_type_final'] = 'amount';
    			$_REQUEST['discount_amount_final'] = $element['hdnDiscountAmount'];
    		} elseif (($element['hdnDiscountPercent'])) {
    			$_REQUEST['discount_type_final'] = 'percentage';
    			$_REQUEST['discount_percentage_final'] = $element['hdnDiscountPercent'];
    		} else {
    			$_REQUEST['discount_type_final'] = '';
    			$_REQUEST['discount_percentage_final'] = '';
    		}
    		
    
    		if (($element['txtAdjustment'])) {
    			$_REQUEST['adjustmentType'] = ((int) $element['txtAdjustment'] < 0) ? '-' : '+';
    			$_REQUEST['adjustment'] = abs($element['txtAdjustment']);
    		}else {
    			$_REQUEST['adjustmentType'] = '';
    			$_REQUEST['adjustment'] = '';
    		}
    		if (!empty($element['hdnGrandTotal'])) {
    			$_REQUEST['total'] = $element['hdnGrandTotal'];
    		}
    		
    		return $element;
    	}
    	
    	public function sanitizeShippingTaxes($element){
    		$_REQUEST['shipping_handling_charge'] = $element['hdnS_H_Amount'];
    		$taxDetails = getAllTaxes('all', 'sh');
    		foreach ($taxDetails as $taxInfo) {
    			//removing previous taxes
    			unset($_REQUEST[$taxInfo['taxname'] . '_sh_percent']);
    			if ($taxInfo['deleted'] == '0' || $taxInfo['deleted'] === 0) {
    				if(isset($element['hdnS_H_Percent']) && $element['hdnS_H_Percent'] != 0){
    					$_REQUEST[$taxInfo['taxname'] . '_sh_percent'] = $element['hdnS_H_Percent'];
    					break;
    				} else {
    					if(isset($element[$taxInfo['taxname'] . '_sh_percent'])){
    						$_REQUEST[$taxInfo['taxname'] . '_sh_percent'] = $element[$taxInfo['taxname'] . '_sh_percent'];
    					}
    					//if there is Shipping Amount and shipping taxes is provided with 0 
    					elseif($element['hdnS_H_Amount'] > 0 && $element['hdnS_H_Percent'] === 0){
    						$_REQUEST[$taxInfo['taxname'] . '_sh_percent'] = 0;
    					}else{
    						$_REQUEST[$taxInfo['taxname'] . '_sh_percent'] = $taxInfo['percentage'];
    					}
    				}
    			}
    		}
    		return $element;		
    	}
        /* NOTE: Special case to pull the default setting of TermsAndCondition */
    
        public function describe($elementType) {
            $describe = parent::describe($elementType);
            $tandc = getTermsAndConditions();
            foreach ($describe['fields'] as $key => $list){
                if($list["name"] == 'terms_conditions'){
                    $describe['fields'][$key]['default'] = $tandc;
                }
            }
            return $describe;
        }
    }
    
    ?>