<?php
namespace OfficeBrain\Bundle\RequestQuoteBundle\Manager\AbstractManager;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Translation\Translator;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\Flash\FlashBag;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use OfficeBrain\Bundle\CoreBundle\CustomeHandler as FormErrorManager;
use Symfony\Component\HttpFoundation\JsonResponse;
use OfficeBrain\Bundle\CoreBundle\Cache\RedisCacheService;

abstract class RequestQuoteAbstract
{
	protected $entityManager;
	protected $request;
	protected $shippingAddressType;
	protected $billingAddressType;
	protected $twigManager;
	protected $sessionManager;
	protected $productDetailManager;
	protected $paginatorManager;
	protected $commonLibraryManager;
	protected $cmsMediaLib;
	protected $userManager;
	protected $emailManager;
	protected $userContactBookManager;
	protected $projectSetting;
	protected $userId;
	protected $cultureId;
	protected $cultureCode;
	protected $requestQuoteId;
	protected $coreManager;
	protected $totalProduct;
	protected $sessionProductId;
	protected $productIdArray;
	protected $cultureProductIdArray;
	protected $sessionInstanceKey;
	protected $instanceId;
	protected $instanceType;
	protected $requestQuoteProductMaxLimit;
	protected $productApi;
	protected $serviceRuleApi;
	protected $byPass;
	protected $siteOwnerId;
	protected $projectUserSetting;

    /**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - Requestquote
	 * Initialize the required variable on class load
	*/
	public function __construct($entityManager, $request, $twigManager, $sessionManager,$productDetailManager, $userManager,$emailManager,$userContactBookManager, $coreManager,$paginatorManager,$commonLibraryManager,$cmsMediaLib,$productApi, $serviceRuleApi)
	{
		$this->entityManager = $entityManager;
		$this->request = $request;
		$this->shippingAddressType = 2;
		$this->billingAddressType = 1;
		$this->twigManager = $twigManager;
		$this->sessionManager = $sessionManager;
		$this->productDetailManager = $productDetailManager;
		$this->paginatorManager = $paginatorManager;
		$this->cmsMediaLib = $cmsMediaLib;
		$this->commonLibraryManager= $commonLibraryManager;
		$this->userManager = $userManager;
		$this->emailManager = $emailManager;
		$this->userContactBookManager = $userContactBookManager;
		$this->byPass = $this->request->get('by_pass',0);
		$this->projectSetting = $this->request->get('project_setting');
		$this->projectUserSetting = $this->request->get('project_user_setting');
		$this->instanceId = $this->projectSetting['instance_id'];
		$this->userId = $this->projectSetting['user_id'];
		$this->cultureId = $this->projectSetting['culture_id'];
		$this->cultureCode = $this->projectSetting['culture_code'];
		$this->requestQuoteId = $this->request->get('request_quote_id', null);
		$this->coreManager = $coreManager;
		$this->container = $this->coreManager->getServiceContainer();
		$this->print_side_and_variation = $this->container->getParameter("print_side_and_variation");
		$this->totalProduct = null;
		$this->sessionProductId = array();
		$this->cultureProductIdArray = array();
		$this->sessionInstanceKey = $this->instanceId.'-'.$this->cultureId;
		$this->requestQuoteProductMaxLimit = $this->projectSetting['configuration_rule']['transaction']['request_quote']['inline_view']['option']['no_of_product'];
		$this->productApi = $productApi;
		$this->serviceRuleApi = $serviceRuleApi;
		if ($this->sessionManager->has('request_quotes_list')) {
			$this->sessionProductId = unserialize($this->sessionManager->get('request_quotes_list'));
		}

		if (!array_key_exists($this->sessionInstanceKey, $this->sessionProductId)) {
			$this->sessionProductId[$this->sessionInstanceKey] = array();
		}

		$this->preRequestQuoteRepositoryManager = $this->entityManager->getRepository('OfficeBrainRequestQuoteBundle:PreAddToRequestQuote');
		$this->preRequestQuoteRepositoryManager->setProjectSetting($this->projectSetting);

		$this->continueProdDetailFoeQuoteUrlSessionKey = 'request-quote-continue-url-'.$this->projectSetting['culture_code'];
		$this->requestQuoteMasterRepositoryManager = $this->entityManager->getRepository('OfficeBrainRequestQuoteBundle:RequestQuoteMaster');
		$this->requestQuoteMasterRepositoryManager->setProjectSetting($this->projectSetting);
		$this->requestQuoteMasterRepositoryManager->setCoreManager($this->coreManager);
		$this->requestQuoteCommentRepositoryManager = $this->entityManager->getRepository('OfficeBrainRequestQuoteBundle:RequestQuoteComment');
		$this->requestQuoteCommentRepositoryManager->setProjectSetting($this->projectSetting);
		$this->requestQuoteMasterRepositoryManager->setPaginatorService($this->paginatorManager);
		$this->requestQuoteItemLineRepositoryManager = $this->entityManager->getRepository('OfficeBrainRequestQuoteBundle:RequestQuoteItemLine');
		$this->requestQuoteItemLineRepositoryManager->setProjectSetting($this->projectSetting);
		$this->RequestQuoteGuestUserRepositoryManager = $this->entityManager->getRepository('OfficeBrainRequestQuoteBundle:RequestQuoteGuestUser');
		$this->responseArray = array();
		$this->siteOwnerId = $this->projectSetting['site_owner_id'];
		$this->TwigExtension = $this->container->get("web.twig.extension");
		$this->statsh_cache_wrapper=RedisCacheService::create();

	}

	public function __destruct()
	{
		unset( $entityManager );
		unset( $request );
		unset( $shippingAddressType );
		unset( $billingAddressType );
		unset( $twigManager );
		unset( $sessionManager );
		unset( $productDetailManager );
		unset( $paginatorManager );
		unset( $commonLibraryManager);
		unset( $cmsMediaLib);
		unset( $userManager );
		unset( $emailManager );
		unset( $userContactBookManager );
		unset( $projectSetting );
		unset( $userId );
		unset( $cultureId );
		unset( $cultureCode );
		unset( $requestQuoteId );
		unset( $coreManager );
		unset( $totalProduct );
		unset( $sessionProductId );
		unset( $productIdArray );
		unset( $cultureProductIdArray );
		unset( $sessionInstanceKey );
		unset( $instanceId );
		unset( $instanceType );
		unset( $productApi );
		unset($serviceRuleApi);
		unset($this->byPass);
		unset($this->responseArray);
		unset($this->continueProdDetailFoeQuoteUrlSessionKey);
		unset($this->siteOwnerId);
		unset($this->projectUserSetting);
	}

	/**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - Requestquote
	 * To get the product detail By slug
	 * @param srting productSlug
	 * @param srting culture
	 * return productDetailManager array
	 */
	public function getProductDetailBySlug()
	{
		$productSlug = $this->request->get('product_slug');
		return $this->productDetailManager->getProductDetailBySlug($productSlug,$this->cultureCode);
 		//$data['all_distributor']=$distributor=$this->userManager->getDistributors();
 		//$data['all_states']=$distributor=$this->coreManager->getLocateDistributorStateDataAPI();
		//return $data;

	}

	/**
	 * @author Employee Id: 4248
	 * OB eCommerce Product - RequestQuote
	 * To set the request quote product into the session
	 */

	public function setAddToRequestQuote()
	{
		$productId = $this->request->get('product_id');
		$productSlug = $this->request->get('product_slug');
		$cultureProductId = $this->request->get('culture_product_id');
		$productData = $this->request->request->all();

		if($this->sessionManager->has('guest_shipping_address') && count($this->sessionManager->has('guest_shipping_address')) > 0 )
		{
			$productData['guest_shipping_detail'] = $this->sessionManager->get('guest_shipping_address');
		}
		$this->totalProduct = $this->getTotalCount();
		if ($this->totalProduct >= $this->requestQuoteProductMaxLimit) {
			return 'ERROR_MAX_LIMIT_REACHED';
		}
		$productKey = $productId.':'.$cultureProductId;
		if (array_key_exists($productKey, $this->sessionProductId[$this->sessionInstanceKey])) {
			if($this->byPass==1){
				$this->sessionProductId[$this->sessionInstanceKey][$productKey] = array('productId'=>$productId, 'cultureProductId'=>$cultureProductId);
				$this->sessionManager->set('request_quotes_list', serialize($this->sessionProductId));
				$this->sessionProductId = unserialize($this->sessionManager->get('request_quotes_list'));
				$this->setRequestQuoteSession($productId, $productData);
				unset($productId);
				unset($productKey);
				unset($cultureProductId);
				$this->sessionManager->remove('guest_shipping_address');
				return 'SUCCESS';
			}else{
				return 'ERROR_PRODUCT_ALREADY_EXISTS';
			}
		}
		else
		{
			$this->sessionProductId[$this->sessionInstanceKey][$productKey] = array('productId'=>$productId, 'cultureProductId'=>$cultureProductId);
			$this->sessionManager->set('request_quotes_list', serialize($this->sessionProductId));
			$this->sessionProductId = unserialize($this->sessionManager->get('request_quotes_list'));
			$this->setRequestQuoteSession($productId, $productData);
			unset($productId);
			unset($productKey);
			unset($cultureProductId);
			$this->sessionManager->remove('guest_shipping_address');

			return 'SUCCESS';
		}
	}

	/**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - RequestQuote
	 * To edit the request quote product into the session
	 */

	public function setEditToRequestQuote()
	{
		$productId = $this->request->get('product_id');
		$productSlug = $this->request->get('product_slug');
		$cultureProductId = $this->request->get('culture_product_id');
		$productData = $this->request->request->all();
		if($this->sessionManager->has('request_quotes') && count($this->sessionManager->has('request_quotes')) > 0 )
		{
			$inputData=$this->sessionManager->get('request_quotes');
			if(array_key_exists('guest_shipping_detail',$inputData[$productId])){
				$productData['guest_shipping_detail']=$inputData[$productId]['guest_shipping_detail'];
			}
		}
		$this->setRequestQuoteSession($productId, $productData);
		unset($productId);
		unset($productSlug);
		unset($cultureProductId);
		unset($productData);
		return 'SUCCESS';
	}


	/**
	 * @author Employee Id: 4248
	 * OB eCommerce Product - RequestQuote
	 * To get Address From ContactBook/AddressBook By Id
	 */
	public function getShippingAddressDetailById()
	{
		$addressId = $this->request->get('address_id',null);
		$address = $this->userContactBookManager->getSingleContactBook($addressId);
		return array('address_data'=>$address);
	}


	/**
	 * @author Employee Id: 4493
	 * OB eCommerce Product - RequestQuote
	 * To get Address From ContactBook/Billing AddressBook By Id
	 */
	public function getBillingAddressDetailById()
	{
		$addressId = $this->request->get('address_id',null);
		$address = $this->userContactBookManager->getSingleContactBook($addressId);
		return array('address_data'=>$address);
	}



  	public function setRequestQuoteSession($productId, $productData){
  		if ($this->sessionManager->has('request_quotes_list')){
  			$aryRequestQuote = $this->sessionManager->get('request_quotes');
  			$aryRequestQuote[$productId]=$productData;
//   			if($this->sessionManager->get('request_quotes_upload_logo') != ''){
//   				$aryRequestQuoteArtlogGuestUser = $this->sessionManager->get('request_quotes_upload_logo');
//   				$aryRequestQuote['upload_art_logo_guestuser'][$productId]=$aryRequestQuoteArtlogGuestUser;
//   				$this->sessionManager->remove('request_quotes_upload_logo');
//   			}
  			$this->sessionManager->set('request_quotes', $aryRequestQuote);
  		}
  	}



	/**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - Requestquote
	 * To total product count added in session
	 * @param NULL
	 * return totalProduct
	 */
	public function getTotalCount()
	{
		if (!$this->totalProduct) {
            $this->totalProduct = count($this->sessionProductId[$this->sessionInstanceKey]);
        }
        return $this->totalProduct;
	}

	/**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - Requestinfo
	 * To get the all request info list in admin panel
	 */
	public function getTotalCountUserWiseAdmin()
	{
	    $adminUser = $this->userManager->findIsAdmin();
        $flag = 'user';
        if ($adminUser) {
            $flag = 'admin';
        }
		return $this->requestQuoteMasterRepositoryManager->getTotalCountUserWise($flag);
	}

	public function getMaxNoOfQuote($maxNo)
	{
		$this->totalProduct = $this->getTotalCount();

		if ($this->totalProduct) {
			$this->getMaxNoOfQuoteId($maxNo);
			$this->processPrepareQuoteDetail();
			return $this->requestQuote;
		} else {
			return null;
		}
	}

	public function getMaxNoOfQuoteId($maxNo)
	{
		$this->productIdArray = array();
		$this->cultureProductIdArray = array();
		if (is_array($this->sessionProductId[$this->sessionInstanceKey]) && count($this->sessionProductId[$this->sessionInstanceKey]) > 0) {
			$productsDetail = array_slice($this->sessionProductId[$this->sessionInstanceKey], 0, $maxNo);
			if (is_array($productsDetail) && count($productsDetail)) {
				foreach ($productsDetail as $idArray) {
					$this->productIdArray[] = $idArray['productId'];
					$this->cultureProductIdArray[] = $idArray['cultureProductId'];
				}
				unset($productsDetail);
			}
		}
	}

	public function getRequestQuote()
	{
		$this->totalProduct = $this->getTotalCount();

		if ($this->totalProduct) {
			$this->processPrepareQuoteId();
			$this->processPrepareQuoteDetail();

			return $this->requestQuote;
		} else {
			return null;
		}
	}

	public function getRequestQuoteListData()
	{
		$this->totalProduct = $this->getTotalCount();
		if ($this->totalProduct)
		{
			$aryQuoteList=array();
			if($this->sessionManager->has('request_quotes')){
				$aryQuoteList = $this->sessionManager->get('request_quotes');

			}
			$requestQuoteListArray = $this->getRequestQuote();
			return $this->prepareQuoteList($aryQuoteList, $requestQuoteListArray);
		}

	}

	//#################################
	public function getInputDataForEdit()
	{
		$productId=$this->request->get('product_id');
		$this->totalProduct = $this->getTotalCount();
		if ($this->totalProduct)
		{
			$aryQuoteList=array();
			if($this->sessionManager->has('request_quotes')){
				$aryQuoteList = $this->sessionManager->get('request_quotes');
				if(array_key_exists($productId,$aryQuoteList)){
					$aryQuoteList[$productId];
				}
			}

			return $aryQuoteList;
		}

	}


	public function getProductDataForEdit()
	{
		$productId=$this->request->get('product_id');
		$this->totalProduct = $this->getTotalCount();
		if ($this->totalProduct)
		{
			$requestQuoteListArray = $this->getRequestQuote();
			return $requestQuoteListArray[$productId];
		}

	}
	//#######################################

	public function processPrepareQuoteDetail()
	{
		if (is_array($this->productIdArray) && count($this->productIdArray)) {
			$productIds = json_encode($this->productIdArray);
			$this->requestQuote = $this->getProductDetailByIds(json_encode($this->productIdArray), $this->cultureCode);
			
			if ( $this->sessionManager->has('request_quotes') )
			{
				$aryRequestQuote = $this->sessionManager->get('request_quotes') ;
				foreach($this->requestQuote as $productId => $requestQuote) {
					if (isset($aryRequestQuote[$productId]['culture'])) {
						$aryRequestQuote[$productId]['culture']= isset($_COOKIE["CUSTOM_SITE_CULTURE"])?$_COOKIE["CUSTOM_SITE_CULTURE"]:$aryRequestQuote[$productId]['culture'];
						$requestQuote= $this->serviceRuleApi->updateCountryByVariation($requestQuote,$aryRequestQuote[$productId]);
						$this->requestQuote[$productId] = $this->updatePriceByCountry($requestQuote, $aryRequestQuote[$productId]['culture']);
					}
				}
			}
		}
		unset($productIds);
	}

	public function processPrepareQuoteId()
	{
		$this->productIdArray = array();
		$this->cultureProductIdArray = array();
		$requestQuoteDetails = $this->prepareQuoteId();
		if (is_array($requestQuoteDetails) && count($requestQuoteDetails)) {
			foreach ($requestQuoteDetails as $ids) {
				$this->productIdArray[] = $ids['productId'];
				$this->cultureProductIdArray[] = $ids['id'];
			}
			unset($requestQuoteDetails);
		}
	}

	public function prepareQuoteId()
	{
		if (is_array($this->sessionProductId[$this->sessionInstanceKey]) && count($this->sessionProductId[$this->sessionInstanceKey]) > 0) {
			foreach ($this->sessionProductId[$this->sessionInstanceKey] as $productInfo) {
				$this->productIdArray[] = $productInfo['productId'];
				$this->cultureProductIdArray[] = $productInfo['cultureProductId'];
			}
			unset($productInfo);
			unset($sessionProductId);
		}
	}

	/**
	 * @author Employee Id: 4248
	 * OB eCommerce Product - RequestQuote
	 * To set the request quote product into the session
	 */

	public function unsetAddToRequestQuote()
	{
		$productId = $this->request->get('product_id');
		$cultureProductId = $this->request->get('culture_product_id');
		return $this->deleteQuoteList($productId, $cultureProductId);
	}


	public function deleteQuoteList($productId, $cultureProductId)
	{
		if (is_array($this->sessionProductId[$this->sessionInstanceKey]) && count($this->sessionProductId[$this->sessionInstanceKey])) {
			$requestQuoteKey = $productId.':'.$cultureProductId;
			if (array_key_exists($requestQuoteKey, $this->sessionProductId[$this->sessionInstanceKey])) {
				unset($this->sessionProductId[$this->sessionInstanceKey][$requestQuoteKey]);
				$this->sessionManager->set('request_quotes_list', serialize($this->sessionProductId));
			}
			if ( $this->sessionManager->has('request_quotes') )
			{
				$aryRequestQuote = $this->sessionManager->get('request_quotes') ;
				unset($aryRequestQuote[$productId]);
				$this->sessionManager->set('request_quotes', $aryRequestQuote);
			}
			return 'SUCCESS';
		}
	}

	public function deleteAllQuoteList()
	{
		if (is_array($this->sessionProductId[$this->sessionInstanceKey]) && count($this->sessionProductId[$this->sessionInstanceKey])) {
			$this->sessionProductId[$this->sessionInstanceKey] = array();
			$this->sessionManager->set('request_quotes_list', serialize($this->sessionProductId));
		}
		if ( $this->sessionManager->has('request_quotes') )
		{
			$this->sessionManager->removeSession('request_quotes');
		}
		return 'SUCCESS';
	}

	/**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - Requestquote
	 * To get the product detail By Id
	 * @param integer productId
	 * @param srting culture
	 * return productDetailManager array
	 */
	public function getProductDetailByIds($productId){
		return $this->productDetailManager->getProductDetailById($productId, $this->cultureCode);
	}

	/**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - Requestquote
	 * To get the product detail By Id
	 * @param integer productId
	 * @param srting culture
	 * return productDetailManager array
	 */
	public function getProductDetailById($productId='')
	{

		if($productId == ''){
			$productId = $this->request->get('product_id');
		}
		//$productId = '317247';
		//echo $productId."====".$this->cultureCode; die; 
		$result = $this->productDetailManager->getProductDetailById($productId, $this->cultureCode);
		if(is_array(json_decode($productId))){
			return $result;
		}else{
			return $result[$productId];
		}
	}

	/**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - Requestquote
	 * To select the product imprint method
	 * @param NULL
	 * return data array
	 */
	public function selectImprintMethod(){
		$data=array();
		$productId=$this->request->get('product_id');
		$imprintId=$this->request->get('imprint_id');
		$methodId=$this->request->get('method_id');
		$product=$this->getProductDetailById($productId);
		$data['maximum_selectable_color']=$product['imprint_information']['imprint_method_information'][$methodId]['maximum_selectable_color'];
		$data['method_name']=$product['imprint_information']['imprint_method_information'][$methodId]['name'];
		$data['product_id']=$productId;
		$data['imprint_location_id']=$imprintId;
		
		$standardImprintColor = $this->getStandardImprintColorInformation($productId);
		$data['standard_imprint_color'] = $standardImprintColor;
		if($product['imprint_information']['imprint_method_information'][$methodId]['is_pms_color_allow'] == 1) {
			$data['pms_color'] = 1;
		}
		
		return $data;
	}

	/**
	 * @author Employee Id: 410175
	 * OB eCommerce Product - Requestquote
	 * To select the product imprint method
	 * @param NULL
	 * return data array
	 */
	public function selectImprintMethodMobileApi(){
		$data=array();
		$productId=$this->request->get('product_id',null);
		$imprintId=$this->request->get('imprint_id',null);
		$methodId=$this->request->get('method_id',null);
		if($methodId == null || $imprintId == null || $productId == null)return false;

		$product=$this->getProductDetailById($productId);
		if($product){

			if(isset($product['imprint_information']['imprint_method_information'][$methodId])){
				$data['maximum_selectable_color']=$product['imprint_information']['imprint_method_information'][$methodId]['maximum_selectable_color'];
				$data['method_name']=$product['imprint_information']['imprint_method_information'][$methodId]['name'];
				$data['product_id']=$productId;
				$data['imprint_location_id']=$imprintId;
				return $data;
			}
		}
		return false;
	}

	/**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - Requestquote
	 * To select the product imprint method
	 * @param NULL
	 * return data array
	 */
	public function editSelectImprintMethod(){
		$data=array();
		$productId=$this->request->get('product_id');
		$imprintId=$this->request->get('imprint_id');
		$methodId=$this->request->get('method_id');
		$imprintInfo=$this->request->get('imprint_info');

		$product=$this->getProductDetailById($productId);
		$data['maximum_selectable_color']=$product['imprint_information']['imprint_method_information'][$methodId]['maximum_selectable_color'];
		$data['method_name']=$product['imprint_information']['imprint_method_information'][$methodId]['name'];
		$data['product_id']=$productId;
		$data['imprint_location_id']=$imprintId;
		$data['imprint_info']=$imprintInfo;

		$standardImprintColor = $this->getStandardImprintColorInformation($productId);
		$data['standard_imprint_color'] = $standardImprintColor;
		if($product['imprint_information']['imprint_method_information'][$methodId]['is_pms_color_allow'] == 1) {
			$data['pms_color'] = 1;
		}
		
		return $data;
	}


	/**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - Requestquote
	 * To get the product attribute By Id
	 * @param integer productId
	 * @param srting culture
	 * return productDetailService array
	 */
	public function getAttributesById(){
		$data=array();
		$productId=$this->request->get('product_id');
		$attributeId=$this->request->get('attribute_id');
		$attributeValueId=$this->request->get('attribute_value_id');
		$product=$this->getProductDetailById($productId);
		$data['attributes'] = $product['attributes'];
		$data['product_id']=$productId;
		$data['attribute_id']=$attributeId;
		$data['attribute_value_id']=$attributeValueId;
		$data['products']=$product;
		return $data;
	}


	/**
	 * @author Employee Id: 410175
	 * OB eCommerce Product - Requestquote
	 * To get the Size Attributes By Color Id
	 * @param integer productId
	 * @param srting culture
	 * return productDetailService array
	 */
	public function getSizeAttributeByColor($colorImageUrl=''){
		$returnData = null;
		$productAttributes = $this->getAttributesById(); 
		$aryConfig = array();
		$aryConfig['is_first_element'] = 1;//$this->request->get('is_first_element');
		$aryConfig['size_attribute_id'] = $this->projectSetting['configuration_rule']['transaction']['shopping_cart']['size_attribute_id'];
		$aryConfig['color_attribute_id'] = $this->projectSetting['configuration_rule']['transaction']['shopping_cart']['color_attribute_id'];
		$aryConfig['allow_size'] = false;
		$allowedSize = $this->projectSetting['configuration_rule']['transaction']['shopping_cart']['product_detail_popup']['option']['product_category'];
		$productDetail = $productAttributes['products'];//$this->getProductDetailById($this->request->get('product_id'));
		if($productDetail['is_size']==1){
			$aryConfig['allow_size'] = true;
		}
		$productAttributes['config'] = $aryConfig;
		//$productAttributes['images'] = $productDetail['images'];
		$productAttributes['color_base_url'] = $colorImageUrl;
		foreach ($productAttributes['attributes']  as $attributes){
			$newAttr[$attributes['id']] = $attributes;
		}
		$productAttributes['attributes'] = $newAttr;
		$returnData['data'] = $productAttributes;
		return $productAttributes;
	}


	/**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - Requestquote
	 * To get the product attribute List
	 * @param NULL
	 * return data array
	 */
	public function addAttributes(){
		$data=array();
		$productId=$this->request->get('product_id');
		$attributeId=$this->request->get('attribute_id');
		$attributeValueId=$this->request->get('attribute_value_id');
		$product_qty=json_decode($this->request->get('product_qty'));
		$product_size=json_decode($this->request->get('product_size'));
		$product_style=json_decode($this->request->get('product_style'));
		$colorName=$this->request->get('color_name');
		$totalQuantity=$this->request->get('total_quantity');
		if(isset($product_qty) && count($product_qty)>0){
			$data['product_qty']=$product_qty;
		}
		if(isset($product_size) && count($product_size)>0){
			$data['product_size']=$product_size;
		}
		if(isset($product_style) && count($product_style)>0){
			$data['product_style']=$product_style;
		}
		$product=$this->getProductDetailById($productId);
		$data['attributes'] = $product['attributes'];
		$data['product_id']=$productId;
		$data['attribute_id']=$attributeId;
		$data['total_quantity']=$totalQuantity;
		$data['color_name']=$colorName;
		$data['attribute_value_id']=$attributeValueId;
		return $data;
	}


	/**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - Requestquote
	 * To add the product imprint Location
	 * @param NULL
	 * return data array
	 */

	public function addImprintLocation(){
		$data=array();
		$productId=$this->request->get('product_id');
		$imprintLocationId=$this->request->get('imprint_location_id');
		$product=$this->getProductDetailById($productId);
		$data['imprint_methods'] = $product['imprint_methods'];
		$data['imprint_information'] = $product['imprint_information'];
		$data['imprint_position_and_methods']=$product['imprint_position_and_methods'];
		$data['product_id']=$productId;
		$data['imprint_location_id']=$imprintLocationId;
		return $data;
	}

	/**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - Requestquote
	 * To add the product imprint Location
	 * @param NULL
	 * return data array
	 */

	public function addImprintLocationMobileApi(){
		$data=array();
		$productId=$this->request->get('product_id',null);
		$imprintLocationId=$this->request->get('imprint_location_id',null);
		if($productId==null || $imprintLocationId==null)return false;
		$product=$this->getProductDetailById($productId);
		if($product){
			//$data['imprint_methods'] = $product['imprint_methods'];
			if(isset($product['imprint_position_and_methods'][$imprintLocationId])){
				$imprintData = $product['imprint_position_and_methods'][$imprintLocationId]['imprint_method'];
				foreach ($imprintData as $imprintKey=>$imprintVal ){
					$data['imprint_methods'][] = array('key'=>$imprintKey,'value'=>$imprintVal);
				}
				$data['product_id']=$productId;
				$data['imprint_location_id']=$imprintLocationId;
				return $data;
			}

		}
		return false;
	}


	/**
	 * @author Employee Id: 4217
	 * OB eCommerce Product - RequestQuote
	 * To get the request quote list in admin panel
	 */
	public function getRequestQuoteAdminList($page, $recordsPerPage)
	{
		return $this->requestQuoteMasterRepositoryManager->getRequestQuoteAdminList($page,$recordsPerPage);
	}

	/**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - RequestQuote
	 * To get the user detail
	 */
	public function getUserDetail($userId, $userType)
	{
		if ($userType == "guest") {
			return $this->RequestQuoteGuestUserRepositoryManager->getGuestUserDetailById($userId);
		} else {
			return $this->userManager->getUserById($userId);
		}
	}

	/**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - RequestQuote
	 * To get the request quote comment list
	 */
	public function getCommentRequestQuoteList()
	{
		return $this->requestQuoteMasterRepositoryManager->getRequestQuoteDetailById($this->request->get('request_quote_id'));
	}


	/**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - RequestQuote
	 * To get the request quote list in admin panel
	 */
	public function setRequestQuoteComment($data)
	{
		return $this->requestQuoteCommentRepositoryManager->setRequestQuoteComment($data);
	}

	/**
	 * @author Employee Id: 4248
	 * OB eCommerce Product - RequestQuote
	 * To get the request quote product from session
	 */
	public function getSessionRequestQuoteList()
	{
		if ( $this->sessionManager->has('request_quotes') )
		{
			return $this->sessionManager->get('request_quotes') ;
		}
	}


	/**
	 * @author Employee Id: 4248
	 * OB eCommerce Product - RequestQuote
	 * To get the request quote product from session
	 */
	public function getTotalQuantatiyByProductId()
	{
		$productId = $this->request->get ( 'product_id' );
		$aryRequestQuote = $this->getSessionRequestQuoteList()[$productId]['color'];
    	$quantity = 0;
    	foreach($aryRequestQuote as $imprintDetail)
    	{
    		foreach ($imprintDetail['quantity'] as $quantityVal)
    		{
    			$quantity = $quantity + $quantityVal;
    		}
    	}
    	return $quantity;
	}


	/**
	 * @author Employee Id: 4248
	 * OB eCommerce Product - RequestQuote
	 * To get the array of all charges applied on the product
	 */
	public function getAllChargesById()
	{
		$appliedCharges = array();
		$productId = $this->request->get ( 'product_id' );
		$this->responseArray ['product_detail'] = $this->getProductDetailById ( $productId );
		$aryRequestQuote = $this->getSessionRequestQuoteList()[$productId]['imprint'];
		if( $this->responseArray ['product_detail']['minimum_quantity'] < $this->getTotalQuantatiyByProductId() )
		{
			// #TODO : Need to change the atatic value from $appliedCharges Array
			$appliedCharges['ltm_charge'] = $this->responseArray ['product_detail']['imprint_information']["imprint_method_information"]["9198"]["charges"]["LTM_CHARGE"];
			return $appliedCharges;
		}
	}


	/**
	 * @author Employee Id: 4248
	 * OB eCommerce Product - RequestQuote
	 * To get the array of all size and quantity and
	 */
	public function getProductBoxByAddress()
	{
		$appliedCharges = array();
		$productId = $this->request->get ( 'product_id' );
		$this->responseArray ['product_detail'] = $this->getProductDetailById ( $productId );
		$aryRequestQuote = $this->getSessionRequestQuoteList()[$productId]['imprint'];
		if( $this->responseArray ['product_detail']['minimum_quantity'] > $this->getTotalQuantatiyByProductId() )
		{
			// #TODO : Need to change the atatic value from $appliedCharges Array
			$appliedCharges['ltm_charge'] = $this->responseArray ['product_detail']['imprint_information']["imprint_method_information"]["9198"]["charges"]["LTM_CHARGE"];
			return $appliedCharges;
		}
	}


	/**
	 * @author Employee Id: 4248
	 * OB eCommerce Product - RequestQuote
	 * To add all the product into request quote related table
	 */
	public function addRequestQuoteSession($userId, $userType = 'registered_user')
	{
		$status=array();
		$aryRequestQuote = null;
		$saveData = array();
		if($userId>0){
			if($userType == 'guest_user')
			{
				$this->projectSetting['user_type']='guest';
				$saveData['request_quote']['guest_id'] = $userId;
				$this->projectSetting['user_id'] = 0;
			}
			else {
				$this->projectSetting['user_type']='registered';
				$saveData['request_quote']['guest_id'] = 0;
				$this->projectSetting['user_id']=$userId;
				//$this->projectUserSetting['user_data']->getUserType();
			}
		}else{
			// If System dosen't allow guest user to create a request quote
			$status['status']='loginError';
			return $status;
			// If System allow guest user to create a request quote
			//$saveData['request_quote']['guest_id'] = $userId;
		}

		if ( $this->sessionManager->has('request_quotes') )
		{
			$aryRequestQuote = $this->sessionManager->get('request_quotes') ;
		}
		if($userType == 'registered_user')
		{
			$billingDetail 	= 	$this->userContactBookManager->getAllAddressBook($this->projectSetting['user_id'],1);
			if(count($billingDetail) <=  0)
			{
				$result['status']='error';
				$result['error']='billing_address_missing';
				return $result;
			}
		}
		$productIds	= array_keys($aryRequestQuote);
		foreach($productIds as $productId)
		{
			$distId = (isset($aryRequestQuote[$productId]['pref_dist']) and $aryRequestQuote[$productId]['pref_dist']!=0) ? $aryRequestQuote[$productId]['pref_dist']: $this->siteOwnerId;
			break;
		}
		$saveData['request_quote']['user_id']		= $this->projectSetting['user_id'];
		$saveData['request_quote']['user_type']		= $this->projectSetting['user_type'];
		$saveData['request_quote']['created_uid']	= $this->projectSetting['user_id'];
		$saveData['request_quote']['instance_type']	= $this->projectSetting['instance_type'];
		$saveData['request_quote']['created_uid']	= $this->projectSetting['user_id'];
		$saveData['request_quote']['instance_type']	= $this->projectSetting['instance_type'];
		$saveData['request_quote']['instance_id']	= $this->projectSetting['instance_id'];
		$saveData['request_quote']['note'] = NULL;
        $saveData['request_quote']['culture'] = $this->projectSetting['culture_code'];
		$saveData['request_quote']['preffered_state'] = NULL;
		$saveData['request_quote']['preffered_distributor_id'] = $distId;
		$saveData['request_quote']['zip_code'] = NULL;
		//$saveData['request_quote']['on_hand_date'] = '2015-08-31 13:22:13';
		$saveData['request_quote']['coupon_id'] = '0';
		$saveData['request_quote']['is_mail_sent'] = '0';
		$saveData['request_quote']['secret_key'] = NULL;
		$saveData['request_quote']['quote_id'] = '0';
		$count=0;
		foreach($productIds as $productId)
		{
			$productDetail  = $this->getProductDetailById($productId, $this->projectSetting['culture_code']);
			$requestQuoteDetail=$aryRequestQuote[$productId];

			$productDetail= $this->serviceRuleApi->updateCountryByVariation($productDetail,$requestQuoteDetail);
			$productDetail= $this->updatePriceByCountry($productDetail, $requestQuoteDetail['culture']);
			
			$unitPrice = $this->getUnitPriceOfProduct($requestQuoteDetail,$productDetail['pricing']);
			$attributeIdArray = $this->getattributeIdRequestQuote($requestQuoteDetail,$productDetail);
			// To set Item line product array
			$saveData['request_quote_item_line'][$count]['product_id']			=	$productDetail['product_id'];
			$saveData['request_quote_item_line'][$count]['culture_product_id']	=	$productDetail['culture_product_id'];
			$saveData['request_quote_item_line'][$count]['supplier_id']			=	$productDetail['supplier']['supplier_id'];
			$saveData['request_quote_item_line'][$count]['catalog_year']		=	$productDetail['basic_information']['catalog_year'];
			$saveData['request_quote_item_line'][$count]['currency_id']			=	$productDetail['currency']['id'];
			$saveData['request_quote_item_line'][$count]['currency_name']		=	$productDetail['currency']['name'];
			$saveData['request_quote_item_line'][$count]['currency']			=	$productDetail['currency']['currency'];
			$saveData['request_quote_item_line'][$count]['currency_symbol']		=	$productDetail['currency']['symbol'];
			$saveData['request_quote_item_line'][$count]['product_name']		=	$productDetail['basic_information']['title'];
			$saveData['request_quote_item_line'][$count]['product_sku']			=	$productDetail['basic_information']['sku_number'];
			$saveData['request_quote_item_line'][$count]['product_slug']		=	$productDetail['basic_information']['slug'];
			$saveData['request_quote_item_line'][$count]['product_thumb_image']	=	$productDetail['basic_information']['default_image_url'];
			$saveData['request_quote_item_line'][$count]['product_image']		=	$productDetail['basic_information']['default_image_url'];
			$saveData['request_quote_item_line'][$count]['product_note']		=	$aryRequestQuote[$productId]['special_instruction'];

			$saveData['request_quote_item_line'][$count]['line_id']				=	$productDetail['brand']['id'];
			$saveData['request_quote_item_line'][$count]['line_name']			=	$productDetail['brand']['name'];
			$saveData['request_quote_item_line'][$count]['is_send_review_link']	=	'';
			$saveData['request_quote_item_line'][$count]['is_feedback_posted']	=	'0';
			$saveData['request_quote_item_line'][$count]['isComplete']			=	'1';
			$saveData['request_quote_item_line'][$count]['order_type']			=	'';
			$saveData['request_quote_item_line'][$count]['price_unit']			=	$unitPrice;

			// To set the item line supplier data array
			$saveData['request_quote_item_line'][$count]['supplier']['supplier_id']=$productDetail['supplier']['supplier_id'];
			$saveData['request_quote_item_line'][$count]['supplier']['supplier_name']=$productDetail['supplier']['name'];
			$saveData['request_quote_item_line'][$count]['supplier']['code']=(isset($productDetail['supplier']['code'])  && $productDetail['supplier']['code']!='') ? $productDetail['supplier']['code']: NULL;
			$saveData['request_quote_item_line'][$count]['supplier']['email_address']=(isset($productDetail['supplier']['email_address'])  && $productDetail['supplier']['email_address']!='') ? $productDetail['supplier']['email_address']: NULL;
			$saveData['request_quote_item_line'][$count]['supplier']['website']=(isset($productDetail['supplier']['website'])  && $productDetail['supplier']['website']!='') ? $productDetail['supplier']['website']: NULL;
			$saveData['request_quote_item_line'][$count]['supplier']['image']=(isset($productDetail['supplier']['image'])  && $productDetail['supplier']['image']!='') ? $productDetail['supplier']['image']: NULL;
			$saveData['request_quote_item_line'][$count]['supplier']['fax']=(isset($productDetail['supplier']['contact_information']['fax'])  && $productDetail['supplier']['contact_information']['fax']!='') ? $productDetail['supplier']['contact_information']['fax']: NULL;
			$saveData['request_quote_item_line'][$count]['supplier']['mobile']=(isset($productDetail['supplier']['contact_information']['mobile'])  && $productDetail['supplier']['contact_information']['mobile']!='') ? $productDetail['supplier']['contact_information']['mobile']: NULL;
			$saveData['request_quote_item_line'][$count]['supplier']['telephone']=(isset($productDetail['supplier']['contact_information']['telephone'])  && $productDetail['supplier']['contact_information']['telephone']!='') ? $productDetail['supplier']['contact_information']['telephone']: NULL;

			// To set the charges applies on this
			$saveData['request_quote_item_line'][$count]['charges']=$this->getAllAppliedCharges($requestQuoteDetail,$productDetail);

			// To set the imprint area and artwork and text and selected color applies on this
			$saveData['request_quote_item_line'][$count]['imprint_area']=$this->prepareImprintArray($requestQuoteDetail);

			// To set the all split item line product at variation wise and shipping detail of each line.
			$saveData['request_quote_item_line'][$count]['product']=$this->prepareProductArray($requestQuoteDetail,$unitPrice,$attributeIdArray);
			
			$extraColorArray = array();
			if($requestQuoteDetail['extra_color']== 'null'){
				if(isset($saveData['request_quote_item_line'][$count]['product'][0]['variation_master']) && count($saveData['request_quote_item_line'][$count]['product'][0]['variation_master'])>0) {
					foreach($saveData['request_quote_item_line'][$count]['product'][0]['variation_master'] as $id=>$attVal) {
						$extraColorArray['mainColor'][] =  $attVal['attribute_value_color'];
						$extraColorArray['mainColorQty'][] =  $attVal['variation_quantity'][0]['quantity'];
					}
				}
			}else{
				$extraColorArray['mixColor'] = $this->getExtraColorArray($requestQuoteDetail['extra_color'],$productDetail['attributes']);
			}
			$saveData['request_quote_item_line'][$count]['extra_color']			=	$extraColorArray;

			// To set Billing information

			if($userType == 'registered_user')
			{
				$saveData['request_quote_billing_detail']['contactbook_id'] = $billingDetail[0]['id'];
				$saveData['request_quote_billing_detail']['name']			= $billingDetail[0]['name'];
				$saveData['request_quote_billing_detail']['email']			= $billingDetail[0]['email'];
				$saveData['request_quote_billing_detail']['street1']		= $billingDetail[0]['street1'];
				$saveData['request_quote_billing_detail']['street2']		= $billingDetail[0]['street2'];
				$saveData['request_quote_billing_detail']['country_id']		= $billingDetail[0]['countryId'];
				$saveData['request_quote_billing_detail']['country_name']	= $billingDetail[0]['countryName'];
				$saveData['request_quote_billing_detail']['state_id']		= $billingDetail[0]['stateId'];
				$saveData['request_quote_billing_detail']['state_name']		= $billingDetail[0]['stateName'];
				$saveData['request_quote_billing_detail']['city_id']		= $billingDetail[0]['cityId'];
				$saveData['request_quote_billing_detail']['city_name']		= $billingDetail[0]['cityName'];
				$saveData['request_quote_billing_detail']['zip_code']		= $billingDetail[0]['zipcode'];
				$saveData['request_quote_billing_detail']['extension']		= $billingDetail[0]['extension'];
				$saveData['request_quote_billing_detail']['phone']			= $billingDetail[0]['phone'];
				$saveData['request_quote_billing_detail']['fax']			= $billingDetail[0]['fax'];
				$saveData['request_quote_billing_detail']['website']		= $billingDetail[0]['website'];
				$saveData['request_quote_billing_detail']['company_name']	= $billingDetail[0]['companyName'];
				$saveData['request_quote_billing_detail']['company_number']	= $billingDetail[0]['companyNumber'];
			}
			$count++;
		} 
		//dump($saveData);exit;
			$status = $this->entityManager->getRepository('OfficeBrainRequestQuoteBundle:RequestQuoteMaster')->setRequestQuoteSingleRecord($saveData, $this->projectSetting['user_id']);
			$requestQuoteObj = $status['data'];
			$this->sendMailForRequestQuote($requestQuoteObj);
			$this->deleteAllQuoteList();
		return $status;
	}

	private function getExtraColorAttr($extraColor){
		$result = array();
		foreach($extraColor as $key=>$val){
			if($val['color'] != ''){
				$colorId = str_replace('id:','',$key);
				$result[$colorId] = $val['color']; 
			}
		}
		$serRes = '';
		if(!empty($result)){
			$serRes = serialize($result);
		}
		return $serRes;
	}
	

	/**
	 * @author Employee Id: 4273
	 * OB eCommerce Product - getAllChargesForDetailPage
	 * To get All Charges For product Detail Page
	 */
	public function getAllChargesForDetailPage(){
		$requestInfo = $this->request->get ( 'requestinfo' );
		$productId = $requestInfo['product_id'];
		$productDetail  = $this->getProductDetailById($productId, $this->projectSetting['culture_code']);
		$requestQuoteDetail = $this->request->request->all();
		//print_r($productDetail); die;
		$aryRequestQuote = $this->sessionManager->get('request_quotes') ;

		$productDetail= $this->serviceRuleApi->updateCountryByVariation($productDetail,$aryRequestQuote[$this->request->get('product_id')]);
		if (isset($aryRequestQuote[$this->request->get('product_id')]['culture'])) {
			$productDetail = $this->updatePriceByCountry($productDetail, $aryRequestQuote[$this->request->get('product_id')]['culture']);
			$requestQuoteDetail['culture'] = $aryRequestQuote[$this->request->get('product_id')]['culture'];
		}
		
		// To set the charges applied on this product
		return $this->getAppliedCharges($requestQuoteDetail,$productDetail);
		//print_r($chargesList); die;
		//return $this->getAllAppliedCharges($requestQuoteDetail,$productDetail);
	}

	public function getAppliedCharges($requestQuoteDetail,$productDetail){
		//$setupCharge = array('SINGLE_COLOR_SETUP','MULTI_COLOR_SETUP');
		$charges = array();
		if(isset($requestQuoteDetail['imprint'])){
			$productImprint = $productDetail['imprint_information']['imprint_method_information'];
			foreach($requestQuoteDetail['imprint'] as $imprintData){
				$imprint_method_id = $imprintData['imprint_method_id'];
				$no_of_color = $imprintData['no_of_color'];
				$selectedColorCount = 0;
				if(isset($imprintData['selected_colors'])){
					if(count($imprintData['selected_colors'])>0){
						foreach($imprintData['selected_colors']  as $selectedColor){
							if($selectedColor['is_pms']==1 && $selectedColor['pms_color']['pms_color_code']!="" && $selectedColor['pms_color']['pms_color_hashkey']!=""){
								$selectedColorCount++;
							}
						}
					}
				}
				if(isset($productImprint[$imprint_method_id]['charges']['SETUP_CHARGE'])){
					$charges['setup_charge'] = $productImprint[$imprint_method_id]['charges']['SETUP_CHARGE'];
				}
				if(isset($productImprint[$imprint_method_id]['charges']['SINGLE_COLOR_SETUP'])){
					$charges['setup_charge'] = $productImprint[$imprint_method_id]['charges']['SINGLE_COLOR_SETUP'];
				} 
				if($no_of_color>1){
					if(isset($productImprint[$imprint_method_id]['charges']['MULTI_COLOR_SETUP'])){
						$charges['setup_charge'] = $productImprint[$imprint_method_id]['charges']['MULTI_COLOR_SETUP'];
					}
				}

				if($selectedColorCount>0){
					$totalQty = $requestQuoteDetail['total_qty'];
					if(isset($productImprint[$imprint_method_id]['charges']['RUN_CHARGE_1_'.$selectedColorCount])){

						$runcharge = $productImprint[$imprint_method_id]['charges']['RUN_CHARGE_1_'.$selectedColorCount];
						$label = $runcharge['label'];
						$count=0;
						if(count($runcharge['charge'])>0){
							foreach($runcharge['charge'] as $charge){
								if($totalQty>=$charge['from'] && $totalQty<=$charge['to']){
									$charges['extra_charge']['charge'] = $charge['rate']*$totalQty;
									$charges['extra_charge']['label'] = $label;
									$charges['extra_charge']['code'] = $charge['code'];
								}
								if($totalQty>=$charge['from'] && $charge['to']==""){
									$charges['extra_charge']['charge'] = $charge['rate']*$totalQty;
									$charges['extra_charge']['label'] = $label;
									$charges['extra_charge']['code'] = $charge['code'];
								}
								$count = $count+1;
								if($count==5){
									break;
								}
							}
						}
					}
				}
			}
		}
		return $charges;
	}

	/**
	 * @author Employee Id: 4273
	 * OB eCommerce Product - getTotalPriceChargesForDetailPage
	 * To get total of product price and all charges For product Detail Page
	 */
	public function getTotalPriceChargesForDetailPage($allCharges=array()){
	    $requestInfo = $this->request->get ( 'requestinfo' );
	    $productId = $requestInfo['product_id']; 
	    $productDetail  = $this->getProductDetailById($productId, $this->projectSetting['culture_code']);
	    $sizeAttr = null;
	    $fdetailvalue = null;
	    $exchargeData = array();
	    if(count($productDetail['attributes'])>0){
			foreach($productDetail['attributes'] as $attrData){
				if($attrData['id']==11){
					$sizeAttr = $attrData['values'];
				}
			}
		}

		/*$extraCharge = $this->productDetailManager->getExtraChargeByProductId($productDetail['product_id']);
    	$exchargeData = array();
    	if($extraCharge!=null){
			$exchargeData = json_decode($extraCharge->getExtraCharge(),true);
		}*/
		if(isset($productDetail['feature_details'])){
			foreach($productDetail['feature_details'] as $feature){
				if($feature['label']=="Additional Size Charge"){
					$fdetailvalue =$feature['value'];
				}
			}
			if($fdetailvalue!=null){
				$value = array();
				$sizedata = explode('#',$fdetailvalue);
				foreach($sizedata as $val){
					$valData = explode(':',$val);
					$value[$valData[0]] = $valData[1]; 
				}
				$exchargeData = $value;
			}
		}

	    $requestQuoteDetail = $this->request->request->all();
	    $noOfSelectedLocation = 0;
	    if (isset($requestQuoteDetail['imprint']) && is_array($requestQuoteDetail['imprint'])) {
	    	$noOfSelectedLocation = count($requestQuoteDetail['imprint']);
	    }
	    
	    $extraSizeCharges = array();
	    if(count($requestQuoteDetail['color'])>0){
			foreach($requestQuoteDetail['color'] as $qtySizeArray){
				$size = $qtySizeArray['size'];
				$quantity = $qtySizeArray['quantity'];
				foreach($quantity as $key => $qty){
					if($qty>0){
						if($exchargeData[$sizeAttr[$size[$key]]]>0){
							$exchargeData[$sizeAttr[$size[$key]]].'*'.$qty;
							$extraSizeCharges[] = $exchargeData[$sizeAttr[$size[$key]]]*$qty;
						}
					}
				}
			}
		}
	    
		
	    /*$aryRequestQuote = $this->sessionManager->get('request_quotes') ;
	    
	    $productDetail= $this->serviceRuleApi->updateCountryByVariation($productDetail,$aryRequestQuote[$this->request->get('product_id')]);
	    if (isset($aryRequestQuote[$this->request->get('product_id')]['culture'])) {
	    	$productDetail = $this->updatePriceByCountry($productDetail, $aryRequestQuote[$this->request->get('product_id')]['culture']);
	    	$requestQuoteDetail['culture'] = $aryRequestQuote[$this->request->get('product_id')]['culture'];
	    }*/
	    
	    /*if(isset($productDetail['price_type']) && $productDetail['price_type'] != '' && $productDetail['price_type'] == 'variations')
	    {
	    	$productDetail = $this->updatePriceByCountryVariation($productDetail, $aryRequestQuote[$this->request->get('product_id')]['culture'],$this->print_side_and_variation,$noOfSelectedLocation);
	    }*/

	    // To set the total of charges and product price<?php
	    $charges = $this->serviceRuleApi->getAllAppliedChargesAndPriceTotal($requestQuoteDetail,$productDetail,$allCharges);
	    $charges['saving_price'] = 0;
	    if($charges['product_price_js']!=0){
			$reqQty = $requestQuoteDetail['total_qty'];
			$basePrice = $productDetail['pricing']['decorative'][0]['rate'];
			$baseAmount = $basePrice*$reqQty ; 
			//$charges['base_amount'] = $baseAmount;
			$charges['saving_price'] = number_format(($baseAmount - $charges['product_price_js']),2);
			$extraSizeChargesTotal = array_sum($extraSizeCharges);
			//$charges['product_price_charge_total'] = $this->TwigExtension->currencyFilter($charges['product_price_charge_total_js']+$extraSizeChargesTotal);
			$charges['product_price_charge_total'] = $charges['product_price_charge_total_js']+$extraSizeChargesTotal;
			$charges['product_price_charge_total_js'] = $charges['product_price_charge_total_js']+$extraSizeChargesTotal;
			$charges['extra_size_charges'] = number_format($extraSizeChargesTotal,2);
		}
	    return $charges; 
	}

	/**
	 * @author Employee Id: 410175
	 * OB eCommerce Product - RequestQuote
	 * To get
	 */
	public function getShippingType()
	{
		$colorQtyDetail = $this->request->get('color_quantity');
		$shippingType = $this->request->get('shipping_type');
		$shippingCounter = $this->request->get('shipping_counter',0);
		
		$productId = $this->request->get('product_id');

		$productData = $this->getProductDetailById();

		$aryConfig = array();
		$aryConfig['size_attribute_id'] = $this->projectSetting['configuration_rule']['transaction']['shopping_cart']['size_attribute_id'];
		$aryConfig['color_attribute_id'] = $this->projectSetting['configuration_rule']['transaction']['shopping_cart']['color_attribute_id'];
		$allowedSize = $this->projectSetting['configuration_rule']['transaction']['shopping_cart']['product_detail_popup']['option']['product_category'];

		$aryConfig['allow_size'] = false;
		if($productData['is_size']==1){
			$aryConfig['allow_size'] = true;
		}
		/*if(key_exists($allowedSize,$productData['category'])){
			$aryConfig['allow_size'] = true;
		}*/
		
		$aryConfig['shipping_type'] = $shippingType;
		$aryConfig['shipping_counter'] = $shippingCounter;
		$aryConfig['product_id'] = $productId;

		$productAttributes = array();
		foreach ($productData['attributes']  as $attributes){
			$productAttributes[$attributes['id']] = $attributes;
		}
		return array('color_qty' => $colorQtyDetail, 'product_attributes' => $productAttributes, 'config' => $aryConfig, 'color_images'=>$productData['images']);

	}

	/**
	 * @author Employee Id: 410175
	 * OB eCommerce Product - RequestQuote
	 * To get
	 */
	public function getShippingTypeGuest()
	{
		$colorQtyDetail = $this->request->get('color_quantity');
		$shippingType = $this->request->get('shipping_type');
		$shippingCounter = $this->request->get('shipping_counter',0);
		$productId = $this->request->get('product_id');

		$productData = $this->getProductDetailById();

		$aryConfig = array();
		$aryConfig['size_attribute_id'] = $this->projectSetting['configuration_rule']['transaction']['shopping_cart']['size_attribute_id'];
		$aryConfig['color_attribute_id'] = $this->projectSetting['configuration_rule']['transaction']['shopping_cart']['color_attribute_id'];
		$allowedSize = $this->projectSetting['configuration_rule']['transaction']['shopping_cart']['product_detail_popup']['option']['product_category'];

		$aryConfig['allow_size'] = false;
		if(key_exists($allowedSize,$productData['category'])){
			$aryConfig['allow_size'] = true;
		}
		$aryConfig['shipping_type'] = $shippingType;
		$aryConfig['shipping_counter'] = $shippingCounter;
		$aryConfig['product_id'] = $productId;

		$productAttributes = array();
		foreach ($productData['attributes']  as $attributes){
			$productAttributes[$attributes['id']] = $attributes;
		}
		return array('color_qty' => $colorQtyDetail, 'product_attributes' => $productAttributes, 'config' => $aryConfig, 'color_images'=>$productData['images']);

	}


	public function prepareQuoteList($inputProductList, $apiProductArray){
		$dataArray =array();
		$count=0;
		foreach ($apiProductArray as $key=>$data)
		{
			$dataArray[$count]['product_id'] =	$data['product_id'];			
			$dataArray[$count]['free_shipping'] =	$data['free_shipping'];
			$dataArray[$count]['is_deleted'] =	$data['is_deleted'];
			$dataArray[$count]['culture_product_id'] = $data['culture_product_id'];
			$dataArray[$count]['product_slug'] = $data['basic_information']['slug'];
			$dataArray[$count]['active'] = $data['basic_information']['active'];
			$dataArray[$count]['description'] = $data['basic_information']['description'];
			$dataArray[$count]['product_image'] = $data['basic_information']['default_image_url'];
			$dataArray[$count]['product_image_thumb'] = $data['basic_information']['default_image_thumb_url'];
			$dataArray[$count]['sku_code'] = $data['basic_information']['sku_number'];
			$dataArray[$count]['product_name'] = $data['basic_information']['title'];
			$dataArray[$count]['price_type'] = $data['price_type'];
			$dataArray[$count]['pricing'] = $data['pricing'];
			$dataArray[$count]['variation_pricing'] = $data['variation_pricing'];
			$dataArray[$count]['variation_pricing_for_other_country'] = $data['variation_pricing_for_other_country'];
			$dataArray[$count]['country_available'] = $data['country_available'];
			$dataArray[$count]['variation_pricing_country_available'] = $data['variation_pricing_country_available'];
			$dataArray[$count]['currency_symbol'] = $data['currency']['symbol'];
			$dataArray[$count]['imprint_position_and_methods'] = $data['imprint_position_and_methods'];

			if(array_key_exists($key, $inputProductList))
			{
				$attributeIdArray = $this->getattributeIdRequestQuote($inputProductList[$key],$data);
				$dataArray[$count]['order_type'] = 'Decorative';
				$dataArray[$count]['shipping_type'] = (isset($inputProductList[$key]['shipping_method']['shipping_type'])  && $inputProductList[$key]['shipping_method']['shipping_type']!='') ? $inputProductList[$key]['shipping_method']['shipping_type']: '';
				$dataArray[$count]['total_qty'] =  $this->getTotalQty($inputProductList[$key],$data);

				$data= $this->serviceRuleApi->updateCountryByVariation($data,$inputProductList[$key]);
				if (isset($inputProductList[$key]['culture'])) {
					
					$culture= isset($_COOKIE["CUSTOM_SITE_CULTURE"])?$_COOKIE["CUSTOM_SITE_CULTURE"]:$inputProductList[$key]['culture'];
					
					$data = $this->updatePriceByCountry($data, $culture);
				}

				$dataArray[$count]['unit_price'] = $this->getUnitPriceOfProduct($inputProductList[$key],$data['pricing']);
				$dataArray[$count]['amount'] = $dataArray[$count]['total_qty']*$dataArray[$count]['unit_price'];
				$dataArray[$count]['is_complete']=1;
				$dataArray[$count]['imprint']=$this->prepareImprintArray($inputProductList[$key]);
				$dataArray[$count]['charges']=$this->getAllAppliedCharges($inputProductList[$key],$data);
				$dataArray[$count]['split']=$this->prepareProductArray($inputProductList[$key],$dataArray[$count]['unit_price'],$attributeIdArray);
				$dataArray[$count]['special_instrution']=$inputProductList[$key]['special_instruction'];
				if( $inputProductList[$key]['extra_color'] == 'null'){
					$dataArray[$count]['extra_color']=array();
				}else{
					$dataArray[$count]['extra_color'] = $this->getExtraColorArray($inputProductList[$key]['extra_color'],$data['attributes']);
				}
				//$dataArray[$count]['extra_color'] = $inputProductList[$key]['extra_color'];
			}
			else
			{
				$dataArray[$count]['order_type'] = '-';
				$dataArray[$count]['shipping_type'] = '-';
				$dataArray[$count]['total_qty'] =  '-';
				$dataArray[$count]['unit_price'] = '-';
				$dataArray[$count]['amount'] = '-';
				$dataArray[$count]['is_complete']=0;
				$dataArray[$count]['imprint']=array();
				$dataArray[$count]['charges']=array();
				$dataArray[$count]['split']=array();
				$dataArray[$count]['special_instrution']="-";
				$dataArray[$count]['extra_color']=array();
			}
			$count++;
		}
		return $dataArray;
	}
	
	public function getExtraColorArray($extraColor,$apiAttribute){
		$attrIds = $this->productDetailManager->getAttributeIds();
		$trimColorId = $attrIds['trim_color_id'];
		$barrelColorId = $attrIds['barrel_color_id'];
		$inkColorId = $attrIds['ink_color_id'];
		$colorId = $attrIds['color_attr_id'];
		$result = array();
		$cnt = 0;
		foreach($extraColor as $key=>$val){
			if($val['color'] != ''){
				$extraColorId = str_replace('id:','',$key);
				foreach($apiAttribute as $k=>$v){
					if($v['id'] == $colorId){
						if($extraColorId == $barrelColorId){
							$result[$cnt]['color_type'] = 'Barrel';
						}else if($extraColorId == $trimColorId){
							$result[$cnt]['color_type'] = 'Trim';
						}else if($extraColorId == $inkColorId){
							$result[$cnt]['color_type'] = 'Ink';
						}
						$result[$cnt]['name'] = $v['values'][$val['color']];
						$cnt++;
					}
				}
			}
		}
		return $result;
	}


	public function getTotalQty ($inputDetail)
	{
		$totalQty = 0;
		if(count($inputDetail['color'])>0)
		{
			foreach ($inputDetail['color'] as $index => $colorAttrDetail)
			{
				if(array_key_exists('quantity', $colorAttrDetail)){
					foreach($colorAttrDetail['quantity'] as $qty){
						$totalQty= $totalQty + $qty;
					}
				}
			}
		}
		return $totalQty;
	}

	function getUnitPriceOfProduct($requestQuoteDetail,$productPrice)
	{
		return $this->TwigExtension->priceFilter($this->commonLibraryManager->getProductPriceByQty($productPrice, $this->getTotalQty($requestQuoteDetail)));
	}

	public function prepareImprintArray($inputDetail){
	
		$imprintMethod=array();
		if(array_key_exists('imprint', $inputDetail) && $inputDetail['imprint']!= 'null'){
			$i=0;
			foreach($inputDetail['imprint'] as $key=>$locationIdArray){
					$idArray=explode(':', $key);
					$imprintMethod[$i]['imprint_area_id']=$idArray[1];

					$imprintMethod[$i]['imprint_method_id']=isset($locationIdArray['imprint_method_id'])?$locationIdArray['imprint_method_id']:NULL;
					$imprintMethod[$i]['no_of_color']= isset($locationIdArray['no_of_color'])?$locationIdArray['no_of_color']:NULL;
					$imprintMethod[$i]['imprint_color']=isset($locationIdArray['selected_colors'])?$locationIdArray['selected_colors']:NULL;
					$imprintMethod[$i]['imprint_art_work_detail'][0]=isset($locationIdArray['art_work_text'])?$locationIdArray['art_work_text']:NULL;  // To remove 0 index.
					$i++;
			}
		}
		return $imprintMethod;
	}

	/**
	 * @author Employee Id: 4273
	 * OB eCommerce Product - Charges
	 * Get all applied charges for ordered product
	 */
	public function getAllAppliedCharges($inputDetail,$productDetail)
	{
		$ruleBaseCharges = array();
		$ruleBaseCharges = $this->serviceRuleApi->applyRuleCharges($inputDetail,$productDetail);

		return $ruleBaseCharges;
	}

	public function prepareProductArray($inputDetail,$unitPrice,$attributeIdArray){
		$splitProduct=array();
		$i=0;
		if(array_key_exists('shipping_method', $inputDetail) && $inputDetail['shipping_method']!='null' && isset($inputDetail['shipping_method']['shipping_type']) && $inputDetail['shipping_method']['shipping_type'] != '')
		{
			foreach($inputDetail['shipping_method']['shipping_detail'] as $key=>$ShipDetailArray)
			{
				$splitProduct[$i]['order_master_id']=0;
				$splitProduct[$i]['product_id']=$inputDetail['product_id'];
				$splitProduct[$i]['culture_product_id']=$inputDetail['culture_product_id'];
				if(array_key_exists('selected_address_id',$ShipDetailArray)){
					$splitProduct[$i]['shipping_detail']=$this->prepareShippingDetail($ShipDetailArray);
				}
				else{
					if($this->projectSetting['user_type'] != 'registered'){
						$splitProduct[$i]['shipping_detail']=$this->prepareShippingDetailGuest($ShipDetailArray,$inputDetail['guest_shipping_detail'][$inputDetail['product_id']][$inputDetail['shipping_method']['shipping_type']][$key]);
					}
				}
				$splitProduct[$i]['variation_master']=$this->prepareVariation($ShipDetailArray,$unitPrice,$attributeIdArray);
				$i++;
			}
		}
		else
		{
			//PREPARING DUMMY ARRAY FOR SHIPPING WHEN SHIPPING IS DISABLED
			$dummyShippingArray = array();
			$dummyShippingArray['order_master_id'] = 0;
			$dummyShippingArray['product_id']=$inputDetail['product_id'];
			$dummyShippingArray['culture_product_id']=$inputDetail['culture_product_id'];
			$dummyShippingArray['shipping_detail'] = array();			
			$ShipDetailArray = array('color_quantity'=>$inputDetail['color']);			
			$dummyShippingArray['variation_master'] = $this->prepareVariation($ShipDetailArray,$unitPrice,$attributeIdArray);			
			$splitProduct[] = $dummyShippingArray; 
		}
		/* else{ // Rest to do implement
			$splitProduct[$i]['order_master_id']=0;
			$splitProduct[$i]['product_id']=$inputDetail['product_id'];
			$splitProduct[$i]['culture_product_id']=$inputDetail['culture_product_id'];
			//$splitProduct[$i]['variation_master']=$this->prepareVariation($ShipDetailArray,$unitPrice,$attributeIdArray);
			//$splitProduct[$i]['variation_master']=$this->prepareVariation(array(),$unitPrice,$attributeIdArray);
		} */

		return $splitProduct;
	}


	function prepareShippingDetail($ShipDetailArray){
		$shipData=array();
			$shippingDetail = $this->userContactBookManager->getSingleContactBook($ShipDetailArray['selected_address_id']);
			if(count($shippingDetail)>0){
			$shipData['shipping_type']		=   isset($ShipDetailArray['shipping_detail']['shipping_carrier'])?$ShipDetailArray['shipping_detail']['shipping_carrier']:NULL;
			$shipData['service_type']		=	isset($ShipDetailArray['shipping_detail']['shipping_method'])?$ShipDetailArray['shipping_detail']['shipping_method']:NULL;
			$shipData['shipper_account']	=	(isset($ShipDetailArray['shipping_detail']['shipper_account']) ? $ShipDetailArray['shipping_detail']['shipper_account'] : '');
			$shipData['shipping_charge']	=	isset($ShipDetailArray['shipping_detail']['shipping_charge'])?$ShipDetailArray['shipping_detail']['shipping_charge']:0;
			$shipData['ship_date']			=	isset($ShipDetailArray['shipping_detail']['ship_date'])?$ShipDetailArray['shipping_detail']['ship_date']:NULL;
			$shipData['on_hand_date']		=	isset($ShipDetailArray['ship_handdate'])?$ShipDetailArray['ship_handdate']:NULL;
			$shipData['name']				=	$shippingDetail->getName();
			$shipData['email']				=	$shippingDetail->getEmail();
			$shipData['street1']			=	$shippingDetail->getStreet1();
			$shipData['street2']			=	$shippingDetail->getStreet2();

// 			$shipData['country_id']		=	$this->coreManager->getCountryName($shippingDetail->getCountryId());
// 			$shipData['state_id']			=	$this->coreManager->getStateName($shippingDetail->getStateId());
// 			$shipData['city_id']			=	$this->coreManager->getCityName($shippingDetail->getCityId());

			$shipData['country_id']			=	$shippingDetail->getCountryId();
			$shipData['country_name']		=	$shippingDetail->getCountryName();
			$shipData['state_id']			=	$shippingDetail->getStateId();
			$shipData['state_name']			=	$shippingDetail->getStateName();
			$shipData['city_id']			=	$shippingDetail->getCityId();
			
			$shipData['city_name']			=	$shippingDetail->getCityName();

			$shipData['zip_code']			=	$shippingDetail->getZipcode();
			$shipData['extension']			=	$shippingDetail->getExtension();
			$shipData['phone']				=	$shippingDetail->getPhone();
			$shipData['mobile']			  	=	$shippingDetail->getMobile();
			$shipData['fax']				=	$shippingDetail->getFax();
			$shipData['website']			=	$shippingDetail->getWebsite();
			$shipData['company_name']		=	$shippingDetail->getCompanyName();
			$shipData['company_number']		=	$shippingDetail->getCompanyNumber();
			}
		return $shipData;
	}

	function prepareShippingDetailGuest($ShipDetailArray, $inputData){
		$shipData=array();
			$shipData['shipping_type']		=   isset($ShipDetailArray['shipping_detail']['shipping_carrier'])?$ShipDetailArray['shipping_detail']['shipping_carrier']:NULL;
			$shipData['service_type']		=	isset($ShipDetailArray['shipping_detail']['shipping_method'])?$ShipDetailArray['shipping_detail']['shipping_method']:NULL;
			$shipData['shipper_account']	=	isset($ShipDetailArray['shipping_detail']['shipper_account']) ? $ShipDetailArray['shipping_detail']['shipper_account'] : '';
			$shipData['shipping_charge']	=	isset($ShipDetailArray['shipping_detail']['shipping_charge'])?$ShipDetailArray['shipping_detail']['shipping_charge']:0;
			$shipData['ship_date']			=	isset($ShipDetailArray['shipping_detail']['ship_date'])?$ShipDetailArray['shipping_detail']['ship_date']:NULL;
			$shipData['on_hand_date']		=	isset($ShipDetailArray['shipping_detail']['on_hand_date'])?$ShipDetailArray['shipping_detail']['on_hand_date']:NULL;

			$shipData['name']				=	isset($inputData['name'])?$inputData['name']:NULL;
			$shipData['email']				=	isset($inputData['email'])?$inputData['email']:NULL;
			$shipData['street1']			=	isset($inputData['address1'])?$inputData['address1']:NULL;
			$shipData['street2']			=	isset($inputData['address2'])?$inputData['address2']:NULL;
			$shipData['country_id']			=	isset($inputData['countryId'])?$inputData['countryId']:NULL;
			$shipData['state_id']			=	isset($inputData['stateId'])?$inputData['stateId']:NULL;
			$shipData['city_id']			=	isset($inputData['cityId'])?$inputData['cityId']:NULL;
			$shipData['zip_code']			=	isset($inputData['zipcode'])?$inputData['zipcode']:NULL;
			$shipData['extension']			=	isset($inputData['extension'])?$inputData['extension']:NULL;
			$shipData['phone']				=	isset($inputData['phone'])?$inputData['phone']:NULL;
			$shipData['mobile']			  	=	isset($inputData['mobile'])?$inputData['mobile']:NULL;
			$shipData['fax']				=	isset($inputData['fax'])?$inputData['fax']:NULL;
			$shipData['website']			=	isset($inputData['website'])?$inputData['website']:NULL;
			$shipData['company_name']		=	NULL;
			$shipData['company_number']		=	NULL;

		return $shipData;
	}

	function prepareVariation($ShipDetailArray,$unitPrice,$attributeIdArray){
		$saveData=array();
		$ShipAttriDetailArray = $ShipDetailArray['color_quantity'];
		$i=0;
		foreach ($ShipAttriDetailArray as $indexcolor => $shipAttriDetail)
		{
			$indexcolor=explode(':', $indexcolor);
			$selectColorId=$indexcolor[1];
			$saveData[$i]['attribute_id']			=	$attributeIdArray['color'];
			$saveData[$i]['attribute_value_id']	=	$selectColorId;
			$saveData[$i]['attribute_value_color']	  =	 $attributeIdArray['color_attr_val'][$selectColorId];
			$numberOfSelectionInColor = count($shipAttriDetail['quantity']);
			for($j=0 ; $j<$numberOfSelectionInColor ;$j++)
			{
				$saveData[$i]['variation_quantity'][$j]['quantity']				=	$shipAttriDetail['quantity'][$j];
				$saveData[$i]['variation_quantity'][$j]['unit_price']				=	$unitPrice;
			}

			foreach ($shipAttriDetail as $indexAttri=>$selectedAttriDetail)
			{
				$attributeId = '';
				$k=0;
				 if($indexAttri!='quantity' && $indexAttri!='actual_quantity')
				{
					$productSelecAttri=$indexAttri;
					foreach($attributeIdArray as $inderxattri=> $productAttri)
					{
						if(strtolower($inderxattri) == strtolower($productSelecAttri))
						{
							$attributeId= $productAttri;
						}
					}
					if($attributeId!='')
					{
						for($m=0 ; $m<count($selectedAttriDetail) ;$m++)
						{

							$saveData[$i]['variation_detail'][$m][$i]['attribute_id']	=	$attributeId;
							$saveData[$i]['variation_detail'][$m][$i]['attribute_value_id']	=	$selectedAttriDetail[$m];
							$saveData[$i]['variation_detail'][$m][$i]['size_attr_val']	=	isset($attributeIdArray['size_attr_val'][$selectedAttriDetail[$m]]) ? $attributeIdArray['size_attr_val'][$selectedAttriDetail[$m]] : '';
							$saveData[$i]['variation_detail'][$m][$i]['quantity']	=	$shipAttriDetail['quantity'][$m];
						}
					}
					else {
						for($m=0 ; $m<count($selectedAttriDetail) ;$m++)
						{

							$saveData[$i]['variation_detail'][$m][$i]['attribute_id']	=	0;
							$saveData[$i]['variation_detail'][$m][$i]['attribute_value_id']	=	0;
							$saveData[$i]['variation_detail'][$m][$i]['size_attr_val']	=	isset($attributeIdArray['size_attr_val'][$selectedAttriDetail[$m]]) ? $attributeIdArray['size_attr_val'][$selectedAttriDetail[$m]] : '';
							$saveData[$i]['variation_detail'][$m][$i]['quantity']	=	$shipAttriDetail['quantity'][$m];
						}
					}
				}
				$k++;
			}
			$i++;
		}
		return $saveData;
	}

	function getattributeIdRequestQuote ($requestQuoteDetail,$productDetail)
	{
		$attributeIdArray=array();
		if(array_key_exists('shipping_method', $requestQuoteDetail) && $requestQuoteDetail['shipping_method']!='null' && isset($requestQuoteDetail['shipping_method']['shipping_type']) && $requestQuoteDetail['shipping_method']['shipping_type'] != ''){
			$requestQuoteShipping= $requestQuoteDetail['shipping_method']['shipping_detail'];
			$attributeIdArray['color']	=	$requestQuoteDetail['color_attr_id'];
			foreach ($requestQuoteShipping as $indexship=>$requestQuoteShippingArray)
			{
				$colorAttriDetail = $requestQuoteShippingArray['color_quantity'];
				foreach ($colorAttriDetail as $indexcolor => $colorAttriDetail)
				{
					// $attributeIdArray['color_val'][] = $colorAttriDetail[0]['values'];
					// get attribute id from product detail
					$noOfAtrriSelected= count($colorAttriDetail);
					foreach($colorAttriDetail as $indexAttri=>$selectedAttriDetail)
					{
						if($indexAttri!='quantity')
						{
							$productSelecAttri=$indexAttri;

							foreach($productDetail['attributes'] as $productAttri)
							{
								if($productAttri['id'] == $attributeIdArray['color']){
									$attributeIdArray['color_attr_val'] = $productAttri['values'];
								}
								if(strtolower($productAttri['label']) == strtolower($productSelecAttri))
								{
									$attributeIdArray[$productSelecAttri] = $productAttri['id'];
									$attributeIdArray[$productSelecAttri.'_attr_val'] = $productAttri['values'];
								}
							}
						}
					}
				}
			}
		} else {//PREPARING DUMMY ARRAY FOR SHIPPING WHEN SHIPPING IS DISABLED
			$attributeIdArray['color']	=	$requestQuoteDetail['color_attr_id'];
			
			foreach($productDetail['attributes'] as $productAttri)
			{
				if($productAttri['id'] == $attributeIdArray['color']){
					$attributeIdArray['color_attr_val'] = $productAttri['values'];
				}else{
					$productSelecAttri = strtolower($productAttri['label']);
					$attributeIdArray[$productSelecAttri] = $productAttri['id'];
					$attributeIdArray[$productSelecAttri.'_attr_val'] = $productAttri['values'];
				}
			}
		}
		return $attributeIdArray;
	}

	public function getContinueProdDetailURL()
	{
		if ($this->sessionManager->has($this->continueProdDetailUrlSessionKey)) {
			$redirectUrl = $this->sessionManager->get($this->continueProdDetailUrlSessionKey);
			$this->sessionManager->remove($this->continueProdDetailUrlSessionKey);
			return $redirectUrl;
		} else {
			return $this->requestQuoteSetting['default_countinue_url'];
		}
	}

	public function setContinueProdDetailURL($refererUrlRouteName, $refererUrl)
	{
		if ($refererUrl != '' && $refererUrlRouteName != 'office_brain_requestquotebundle_requestquote_thankyoupage') {
			$this->sessionManager->set($this->continueProdDetailFoeQuoteUrlSessionKey, $refererUrl);
		} else {
			$this->sessionManager->remove($this->continueProdDetailFoeQuoteUrlSessionKey);
		}
	}

	/**
	 * @author Employee Id: 4203
	 * To get the all size of the product
	 * @param integer productId
	 */
	public function getSizeAttributeHeader(){
		$data=array();
		$data['is_size']=false;
		$productId=$this->request->get('product_id');
		$product=$this->getProductDetailById($productId);
		if($product['is_size']==1){
			$data['type']=$product['attributes'];
			$data['category']=$product['category'];
			$data['is_size']=true;
		}
		return $data;
	}


	public function deleteRequestQuoteDetailById($requestQuoteId="")
	{
		$isDeleted = array();
		if ($requestQuoteId > 0) {
			$infoId = $requestQuoteId;
		} else {
			$infoId = $this->request->get('request_quote_id');
		}
		$isDeleted['data'] = $this->requestQuoteMasterRepositoryManager->deleteRequestQuote($infoId);
		if ($isDeleted) {
			$isDeleted['status'] = "SUCCESS";
			return $isDeleted;
		}
		$isDeleted['status']= 'ERROR_NOT_FOUND';
		return $isDeleted;
	}

	/**
	 * @author Employee Id: 4532
	 * To get the value of standard imprint color information
	 * @param integer productId
	 */
	public function getStandardImprintColorInformation($productId = 0){
		$data=array();
		if($productId <= 0)
		{
			$productId=$this->request->get('product_id');
		}
		$product=$this->getProductDetailById($productId);
		if(array_key_exists('imprint_information',$product)){
			$standardImprintColor = $product['imprint_information'];
			if(array_key_exists('standard_imprint_color_information',$standardImprintColor)){
				$stdImprintColor = $standardImprintColor['standard_imprint_color_information'];
				if(is_array($stdImprintColor)){
					$stdImprintColor = array_values($stdImprintColor);
					$stdImprintColorJsonEncode = json_encode($stdImprintColor);
					$stdImprintEncode = base64_encode($stdImprintColorJsonEncode);
					
					/* Redis cache processing started */
					$locale=$this->request->getLocale();
					$cacheSiteKey = array('pmsu'.$stdImprintEncode,$locale,$this->projectSetting['instance_id'],$this->container->getParameter('kernel.environment'));
					//categorylistunique11052018023597f2d8d003460418a2ca7e6e34a9b17f
					//print_r($cacheSiteKey);exit;
					
					$this->moduleCachePrefix='__SiteModuleHomePage__:';
					$this->statsh_cache_wrapper=RedisCacheService::create();//print_r($cacheSiteKey);exit;
					//dump($this->statsh_cache_wrapper);exit;
					$cacheKey = $this->moduleCachePrefix.RedisCacheService::generateKey($this->statsh_cache_wrapper,$cacheSiteKey);
					
					//echo $cacheKey;exit;
					$cacheData = RedisCacheService::getCacheData($this->statsh_cache_wrapper,$cacheKey);
					if($cacheData){
						return $cacheData;
					}
					else
					{
						$this->productApi->init('pms_hex_code');
						$this->productApi->setCallParameters(array('hex_color'=>$stdImprintEncode));
						$this->productApi->doProcess();
						if ($this->productApi->isSuccess()) {
							$data['status'] = 'SUCCESS';
							$data['data'] = $this->productApi->getResultArray();
							if(!empty($cacheKey))
							{
								RedisCacheService::saveCacheData($this->statsh_cache_wrapper,$cacheKey,$data['data']['pmshexcolor']);
							}
							return $data['data']['pmshexcolor'];
						}
					}
					/* Redis cache processing ended */
					
					
					$data['status'] = 'ERROR';
				}
			}
		}
		return $data;
	}
	/**
	 * @author Employee Id: 410175
	 * To get the value of standard imprint color information
	 * @param integer productId
	 */
	public function getStandardImprintColorInformationMobileApi(){
		$data = null;
		$productId = $this->request->get('product_id',null);
		if( $productId == null ) return false;

		$product = $this->getProductDetailById($productId);

		if($product && array_key_exists('imprint_information',$product)) {
			$standardImprintColor = $product['imprint_information'];

			if(array_key_exists('standard_imprint_color_information',$standardImprintColor)) {
				$stdImprintColor = $standardImprintColor['standard_imprint_color_information'];

				if(is_array($stdImprintColor)) {
					$stdImprintColor = array_values($stdImprintColor);
					$stdImprintColorJsonEncode = json_encode($stdImprintColor);
					$stdImprintEncode = base64_encode($stdImprintColorJsonEncode);
					
					/* Redis cache processing started */
					$locale=$this->request->getLocale();
					$cacheSiteKey = array('pmsu'.$stdImprintEncode,$locale,$this->projectSetting['instance_id'],$this->container->getParameter('kernel.environment'));
					//categorylistunique11052018023597f2d8d003460418a2ca7e6e34a9b17f
					//print_r($cacheSiteKey);exit;
					
					$this->moduleCachePrefix='__SiteModuleHomePage__:';
					$this->statsh_cache_wrapper=RedisCacheService::create();//print_r($cacheSiteKey);exit;
					//dump($this->statsh_cache_wrapper);exit;
					$cacheKey = $this->moduleCachePrefix.RedisCacheService::generateKey($this->statsh_cache_wrapper,$cacheSiteKey);
					
					//echo $cacheKey;exit;
					$cacheData = RedisCacheService::getCacheData($this->statsh_cache_wrapper,$cacheKey);
					if($cacheData){
						return $cacheData;
					}
					else
					{
						$this->productApi->init('pms_hex_code');
						$this->productApi->setCallParameters(array('hex_color'=>$stdImprintEncode));
						$this->productApi->doProcess();
						
						if ($this->productApi->isSuccess()) {
							$data['data'] = $this->productApi->getResultArray();
							if(!empty($cacheKey))
							{
								RedisCacheService::saveCacheData($this->statsh_cache_wrapper,$cacheKey,$data['data']['pmshexcolor']);
							}
							return $data['data']['pmshexcolor'];
						}
					}
					/* Redis cache processing ended */
					
					
				}
			}
		}
		return $data;
	}

	/**
	 * @author Employee Id: 4532
	 * To get pms color values from given hash key
	 * @param string colorHashkey
	 */
	public function getPMSColorInfo(){
		$data=array();
		$colorHashKey = $this->request->get('pms_hashkey');
		$this->productApi->init('pms_color');
		$this->productApi->setCallParameters(array('hex_color'=>$colorHashKey));
		$this->productApi->doProcess();
		if ($this->productApi->isSuccess()) {
			$result['status'] = 'SUCCESS';
			$result['data'] = $this->productApi->getResultArray();
			return $result;
		}
		$result['status'] = 'ERROR';

		return $result;
	}

	public function sendMailForRequestQuote($requestQuoteObj)
	{
		$saveData=array();
		$saveData['requestQuote'] = $requestQuoteObj;
		$saveData['data'] = $this->getProductList($requestQuoteObj->getId());
		$saveData['sizeAllowed']= $this->checkSizeAllow($saveData['data'][0]['category']);		
		$saveData['user_type'] = $requestQuoteObj->getUserType();
		if($requestQuoteObj->getUserType()=="guest"){
			$saveData['userDetail'] = $this->getGuestUserDetailById($requestQuoteObj->getGuestId());
			$toEmail = '';
		}else{
			$saveData['userDetail'] = $this->getUserDetail($requestQuoteObj->getUserId(), $requestQuoteObj->getUserType());
			$toEmail = '';
		}
		//$fromEmail = 'info@officebrain.com' ;
		$response = $this->twigManager->render('OfficeBrainRequestQuoteBundle:RequestQuote:sendRequestQuoteEmail.html.twig', $saveData);
		$templateParameterArray = array(
				'request_quote' => $response
		);
    	$eventKey = 'session_request_quote_list';
		return $message = $this->emailManager->sendMail($eventKey, $toEmail, $templateParameterArray,$culture=null);

	}

	public function checkSizeAllow($productCategory){
		
		$allow_size = false;
		$allowedSizeCategory = $this->projectSetting['configuration_rule']['transaction']['shopping_cart']['product_detail_popup']['option']['product_category'];
		if(key_exists($allowedSizeCategory,$productCategory)){
			$allow_size = true;
		}
		return $allow_size;
	}

	public function setRequestQuoteGuestInfo($data){
	}


	public function getRequestQuoteDetailById($requestQuoteId)
	{
		return $this->requestQuoteMasterRepositoryManager->getRequestQuoteDetailById($requestQuoteId);
	}


	public function processPrepareRequestQuoteProductId($reqQuoteId)
	{
		$this->productIdArray =array();
		$this->productIsConfig =array();
		$this->itemLineId =array();
		$recordSet = $this->requestQuoteItemLineRepositoryManager->getAllAddedProductInOrder($reqQuoteId);
		if (is_array($recordSet) && count($recordSet))
		{
			foreach ($recordSet as $row) {
				$this->productIdArray[] = $row['productId'];
				$this->productIsConfig[] = ($row['isComplete']) ? $row['isComplete'] : '0';
				$this->itemLineId[] = $row['id'];
			}
			unset($recordSet);
		}
	}

	public function getProductList( $reqQtId )
	{
		$reqQuoteId = $reqQtId;
		$this->requestQuoteProducts =array();
		$this->processPrepareRequestQuoteProductId($reqQuoteId);
		if (is_array($this->productIdArray) && count($this->productIdArray))
		{
			$productIds = array_unique($this->productIdArray);
			$requestQuoteProducts = $this->getProductDetailById(json_encode($this->productIdArray), $this->cultureCode);
			$this->requestQuoteProducts = array();
			$count=0;
			foreach($this->productIdArray as $productId){
				$this->requestQuoteProducts[$count] = $requestQuoteProducts[$productId];
				$this->requestQuoteProducts[$count]['is_config'] = $this->productIsConfig[$count];
				$this->requestQuoteProducts[$count]['item_line_id'] = $this->itemLineId[$count];
				$count++;
			}
		}
		unset($this->productIdArray);
		return $this->requestQuoteProducts;
	}

	public function getGuestUserDetailById( $guestId )
	{
		return $this->RequestQuoteGuestUserRepositoryManager->getGuestUserDetailById($guestId);

	}
	
	/**
	 *  @author Employee Id: 5540
	 *  To remove the data from array
	 */	
	public function removeShippingCounterById()
	{
		$shippingId = $this->request->get('shipping_box_id');
		$shippingType = $this->request->get('shipping_type');
		$data = $this->request->get('shipping_method');
		unset($data[$shippingId]);
		//return array('data'=>array_values($data),'shipping_type'=>$shippingType, 'product_attributes' => $productAttributes, 'config' => $aryConfig, 'color_images'=>$productData['images']);
		 
		$productData = $this->getProductDetailById($data[0]['product_id']);
			
		$aryConfig = array();
		$aryConfig['size_attribute_id'] = $this->projectSetting['configuration_rule']['transaction']['request_quote']['size_attribute_id'];
		$aryConfig['color_attribute_id'] = $this->projectSetting['configuration_rule']['transaction']['request_quote']['color_attribute_id'];
		$allowedSize = $this->projectSetting['configuration_rule']['transaction']['shopping_cart']['product_detail_popup']['option']['product_category'];
		 
		$aryConfig['allow_size'] = false;
		if($productData['is_size']==1){
			$aryConfig['allow_size'] = true;
		}
		$aryConfig['shipping_type'] = $shippingType;
		$aryConfig['shipping_counter'] = $shippingCounter;
		$aryConfig['product_id'] = $productId;
		 
		$productAttributes = array();
		foreach ($productData['attributes']  as $attributes){
			$productAttributes[$attributes['id']] = $attributes;
		}
		//echo "<pre>";
		//print_r(array('data'=>array_values($data),'shipping_type'=>$shippingType, 'product_attributes' => $productAttributes, 'config' => $aryConfig, 'color_images'=>$productData['images'])); die;
		return array('data'=>array_values($data),'shipping_type'=>$shippingType, 'product_attributes' => $productAttributes, 'configure' => $aryConfig, 'color_images'=>$productData['images']);
	}
	
	/**
	 * @author Employee Id: 410175
	 * OB eCommerce Product - RequestQuote
	 * To get
	 */
	public function getBlankColorQuantityValue($productAttributes)
	{
		$productAttributes['config']['shipping_type'] = $this->request->get('shipping_type');
		$colorId = $productAttributes['attribute_value_id'];
		$qty = array();
		if($productAttributes['config']['allow_size'] && isset($productAttributes['attributes'][$productAttributes['config']['size_attribute_id']])){
			foreach ( $productAttributes['attributes'][$productAttributes['config']['size_attribute_id']]['values'] as $sizeId=>$size){
				$qty['quantity'][] = 0;
				$qty['size'][] = $sizeId;
			}
		}else{
			$qty['quantity'][] = 0;
		}
	
		return array('config'=>$productAttributes['config'],'Qty'=> $qty, 'colorId' => $colorId,'product_attributes'=>$productAttributes['attributes']);
	
	}
	
	public function updatePriceByCountry($productDetailArray, $culture)
	{
		
		$country_code = explode('_', $culture);
		$productArray = array();
			
		if (isset($productDetailArray['product_id'])) {
			$productArray[] = $productDetailArray;
		} elseif (isset($productDetailArray['products'])) {
			$productArray = (array)$productDetailArray['products'];
		} else {
			$productArray = (array)$productDetailArray;
		}
			
		foreach ($productArray as $main_index=>$productDetail) {
			if (isset($country_code[1]) && isset($productArray[$main_index]['variation_pricing_for_other_country'][$country_code[1]])) {
				$productArray[$main_index]['variation_pricing'] = $productArray[$main_index]['variation_pricing_for_other_country'][$country_code[1]];
			}
			if (isset($country_code[1]) && isset($productArray[$main_index]['pricing_for_other_country'][$country_code[1]])) {
				$productArray[$main_index]['pricing'] = $productArray[$main_index]['pricing_for_other_country'][$country_code[1]];

				$priceType = 'decorative';
				$index = 0;

				if (isset($productArray[$main_index]['pricing'][$priceType][$index])) {
					$productArray[$main_index]['unit_price'] = $productArray[$main_index]['pricing'][$priceType][$index]['rate'];
					$productArray[$main_index]['regular_price'] = $productArray[$main_index]['pricing'][$priceType][$index]['rate'];
					$productArray[$main_index]['minimum_quantity'] = $productArray[$main_index]['pricing'][$priceType][$index]['from'];
					$productArray[$main_index]['minimum_quantity_range'] = $productArray[$main_index]['pricing'][$priceType][$index]['from']. "-" . $productArray[$main_index]['pricing'][$priceType][$index]['to'];
					$productArray[$main_index]['min_price'] = $productArray[$main_index]['pricing'][$priceType][count($productArray[$main_index]['pricing'][$priceType])-1]['rate'];
					$productArray[$main_index]['code'] = $productArray[$main_index]['pricing'][$priceType][count($productArray[$main_index]['pricing'][$priceType])-1]['code'];
				}
			}
		}
			
		if (isset($productDetailArray['product_id'])) {
			$productDetailArray = reset($productArray);
		} elseif (isset($productDetailArray['products'])) {
			$productDetailArray['products'] = $productArray;
		} else {
			$productDetailArray = $productArray;
		}
	
		unset($country_code);
		unset($productArray);
	
		return $productDetailArray;
	}
	
	public function updatePriceByCountryVariation($productDetailArray, $culture,$printSideAndVariation,$noOfSelectedLocation)
	{
		$country_code = explode('_', $culture);
		$productArray = array();
		
		if (isset($productDetailArray['product_id'])) {
			$productArray[] = $productDetailArray;
		} elseif (isset($productDetailArray['products'])) {
			$productArray = (array)$productDetailArray['products'];
		} else {
			$productArray = (array)$productDetailArray;
		}
		
		foreach ($productArray as $main_index=>$productDetail) {
			$variationPricingString = $printSideAndVariation[$noOfSelectedLocation];
			if(isset($productArray[$main_index]['variation_matrix_for_other_country'][$country_code[1]][$variationPricingString]))
			{
				$variationPricingId = $productArray[$main_index]['variation_matrix_for_other_country'][$country_code[1]][$variationPricingString];
			}
			if (isset($productArray[$main_index]['variation_pricing_for_other_country'][$country_code[1]][$variationPricingId]['pricing'])) {
				$productArray[$main_index]['pricing'] =	$productArray[$main_index]['variation_pricing_for_other_country'][$country_code[1]][$variationPricingId]['pricing'];
				
				$priceType = 'decorative';
				$index = 0;
				
				if (isset($productArray[$main_index]['pricing'][$priceType][$index])) {
					$productArray[$main_index]['unit_price'] = $productArray[$main_index]['pricing'][$priceType][$index]['rate'];
					$productArray[$main_index]['regular_price'] = $productArray[$main_index]['pricing'][$priceType][$index]['rate'];
					$productArray[$main_index]['minimum_quantity'] = $productArray[$main_index]['pricing'][$priceType][$index]['from'];
					$productArray[$main_index]['minimum_quantity_range'] = $productArray[$main_index]['pricing'][$priceType][$index]['from']. "-" . $productArray[$main_index]['pricing'][$priceType][$index]['to'];
					$productArray[$main_index]['min_price'] = $productArray[$main_index]['pricing'][$priceType][count($productArray[$main_index]['pricing'][$priceType])-1]['rate'];
					$productArray[$main_index]['code'] = $productArray[$main_index]['pricing'][$priceType][count($productArray[$main_index]['pricing'][$priceType])-1]['code'];
				}
			}
		}
		
		if (isset($productDetailArray['product_id'])) {
			$productDetailArray = reset($productArray);
		} elseif (isset($productDetailArray['products'])) {
			$productDetailArray['products'] = $productArray;
		} else {
			$productDetailArray = $productArray;
		}
		
		unset($country_code);
		unset($productArray);
		
		return $productDetailArray;
	}
}
