<?php
namespace OfficeBrain\Bundle\OrderBundle\Manager\AbstractManager;
use Symfony\Component\HttpFoundation\Request;
use OfficeBrain\Bundle\CoreBundle\Cache\RedisCacheService;

abstract class OrderAbstract
{
	protected $entityManager;
	protected $request;
	protected $shippingAddressType;
	protected $billingAddressType;
	protected $sessionManager;
	protected $productDetailManager;
	protected $userDetailManager;
	protected $emailManager;
	protected $twigManager;
	protected $projectSetting;
	protected $instanceId;
	protected $instanceType;
	protected $userId;
	protected $cultureId;
	protected $cultureCode;
	protected $inlineViewProductMaxLimit;
	protected $productId;
	protected $productSlug;
	protected $productCultureId;
	protected $userContactBookManager;
	protected $coreManager;
	protected $productApi;
	protected $serviceRuleApi;
	protected $paginatorManager;
	protected $orderStatusDetailApi;
	protected $jmsSerializer;
	protected $siteOwnerId;
		/**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - Order
	 * Initialize the required variable on class load
	 */
	public function __construct($entityManager, $request, $sessionManager,  $productDetailManager, $userDetailManager, $emailManager, $twigManager,$userContactBookManager, $commonLibraryManager, $coreManager,$productApi, $serviceRuleApi,$paginatorManager,$xmlPath,$jmsSerializer, $twigExtension)
	{
		$this->entityManager = $entityManager;
		$this->request = $request;
		$this->shippingAddressType = 2;
		$this->billingAddressType = 1;
		$this->sessionManager = $sessionManager;
		$this->productDetailManager = $productDetailManager;
		$this->twigManager = $twigManager;
		$this->userContactBookManager = $userContactBookManager;
		$this->coreManager = $coreManager;
		$this->container = $this->coreManager->getServiceContainer();
		$this->userManager = $userDetailManager;
		$this->xmlPath = $xmlPath;
		$this->jmsSerializer = $jmsSerializer;
		$this->TwigExtension = $twigExtension;

		$this->productId = $this->request->get('product_id', null);
		$this->productSlug = $this->request->get('product_slug', null);
		$this->productCultureId = $this->request->get('culture_product_id', null);

		$this->projectSetting = $this->request->get('project_setting');
		$this->instanceId = $this->projectSetting['instance_id'];
		$this->instanceType = $this->projectSetting['instance_type'];
		$this->userId = $this->projectSetting['user_id'];
		$this->cultureId = $this->projectSetting['culture_id'];
		$this->cultureCode = $this->projectSetting['culture_code'];
		$this->configurationRule = $this->projectSetting['configuration_rule']['transaction']['shopping_cart'];
		$this->inlineViewProductMaxLimit = $this->configurationRule['inline_view']['option']['no_of_product'];
		$this->createdUid = $this->userId;
		$this->upatedUid = $this->userId;
		$this->commonLibraryManager= $commonLibraryManager;
		$this->viewType = null;
		$this->totalProduct = null;
		$this->sessionProductId = array();
		$this->productIdArray = array();
		$this->cultureProductIdArray = array();
		$this->productApi = $productApi;
		$this->serviceRuleApi = $serviceRuleApi;
		$this->paginatorManager = $paginatorManager;
		//$this->sessionManager->removeSession('cart-id');
		//$this->sessionManager->removeSession('cart-list');
		$this->sessionInstanceKey = $this->instanceId.'-'.$this->cultureId;
		$this->emailManager = $emailManager;
		$this->siteOwnerId = $this->projectSetting['site_owner_id'];

		if ($this->sessionManager->has('cart-id')) {
			$this->sessionProductId = unserialize($this->sessionManager->get('cart-id'));
		}

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

		$this->preCartRepositoryManager = $this->entityManager->getRepository('OfficeBrainOrderBundle:PreAddToCart');
		$this->preCartRepositoryManager->setProjectSetting($this->projectSetting);

		$this->orderMasterRepositoryManager = $this->entityManager->getRepository('OfficeBrainOrderBundle:OrderMaster');
		$this->orderMasterRepositoryManager->setProjectSetting($this->projectSetting);

		$this->orderShippingDetailRepositoryManager = $this->entityManager->getRepository('OfficeBrainOrderBundle:OrderShippingDetail');

		$this->continueShoppingUrlSessionKey = 'cart-list-continue-shopping-url-'.$this->projectSetting['culture_code'];
		$this->orderMasterRepositoryManager->setPaginatorService($this->paginatorManager);

		$this->orderItemLineRepositoryManager = $this->entityManager->getRepository('OfficeBrainOrderBundle:OrderItemLine');
		$this->orderBillingDetailRepositoryManager = $this->entityManager->getRepository('OfficeBrainOrderBundle:OrderBillingDetail');
		$this->orderItemLineRepositoryManager->setProjectSetting($this->projectSetting);
		$this->orderItemLineRepositoryManager->setUserManager($this->userManager);
		$this->orderItemLineRepositoryManager->setCoreManager($this->coreManager);
		$this->orderItemLineRepositoryManager->setPaginatorService($this->paginatorManager);
		// 		$this->orderMasterRepositoryManager->setOrderStatusDetailApi($this->orderStatusDetailApi);
		$this->statsh_cache_wrapper=RedisCacheService::create();
		
	}

	public function __destruct()
	{
		unset($this->entityManager);
		unset($this->request);
		unset($this->shippingAddressType);
		unset($this->billingAddressType);
		unset($this->projectSetting);
		unset($this->instanceId);
		unset($this->instanceType);
		unset($this->userId);
		unset($this->cultureId);
		unset($this->cultureCode);
		unset($this->quickQuoteConfig);
		unset($this->quoteProductMaxLimit);
		unset($this->createdUid);
		unset($this->upatedUid);
		unset($this->emailServiceManager);
		unset($this->twigManager);
		unset($this->productId);
		unset($this->userManager);
		unset($this->productSlug);
		unset($this->productCultureId);
		unset($this->userContactBookManager);
		unset($this->coreManager);
		unset($this->productApi);
		unset($this->serviceRuleApi);
		unset($this->paginatorManager);
		unset($this->jmsSerializer);
		unset($this->siteOwnerId);
	}

	/**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - Order
	 * To get the product detail By slug
	 * @param srting productSlug
	 * @param srting culture
	 * return productDetailService array
	 */
	public function getProductDetailBySlug(){

		return $this->productDetailManager->getProductDetailBySlug($this->productSlug,$this->cultureCode);

	}
	/**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - Order
	 * To get the product detail By Id
	 * @param integer productId
	 * @param srting culture
	 * return productDetailService array
	 */
	public function getProductDetailById($productId=null, $cultureCode=null){
		if( $productId == null ){  $productId = $this->productId; }
		if( $cultureCode == null ){  $cultureCode = $this->cultureCode; }
		$result =  $this->productDetailManager->getProductDetailById($productId, $cultureCode);
		if(!$result)return null;
		if(is_array(json_decode($productId))){
			return $result;
		}else{
			return $result[$productId];
		}
	}

	/**
	 * @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: 410175
	 * OB eCommerce Product - Order
	 * To get the product attribute By Id
	 * @param integer productId
	 * @param srting culture
	 * return productDetailService array
	 */
	public function getAttributesById(){
		$data=array();
		$data['is_size']=0;
		$productId=$this->productId;
		$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;
		if($product['is_size']){
			foreach($product['attributes'] as $attr){
				if($attr['id']==11){
					if(array_key_exists('values',$attr)){
						$data['is_size']=1;
						$product['is_size']= 1;
					}else{
						$product['is_size']= 0;
					}
				}
			}
		}
		$data['products'] = $product;
		return $data;
	}

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


	/**
	 * @author Employee Id: 410175
	 * OB eCommerce Product - Order
	 * 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;
		$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'];
		//print_r($productDetail); die;
		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: 410175
	 * OB eCommerce Product - Order
	 * To add the product imprint Location
	 * @param NULL
	 * return data array
	 */

	public function addImprintLocation(){

		$data = array();

		$imprintLocationId=$this->request->get('imprint_location_id');
		$product = $this->getProductDetailById($this->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']=$this->productId;
		$data['imprint_location_id']=$imprintLocationId;
		return $data;
	}

	public function addImprintLocationMobileApi(){

		$data = null;
		$imprintLocationId = $this->request->get('imprint_location_id',null);

		if($this->productId==null || $imprintLocationId==null)return false;

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

			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']=$this->productId;
				$data['imprint_location_id']=$imprintLocationId;
				return $data;
			}

		}
		return false;
	}

	public function addPreImprintLocation(){

		$data = array();

		$imprintLocationId=$this->request->get('imprint_location_id');
		$imprintMethodId=$this->request->get('imprint_method_id');
		$product = $this->getProductDetailById($this->productId);
		$data['imprint_methods'] = $imprintMethodId;
		$data['imprint_information'] = $product['imprint_information'];
		$data['imprint_position_and_methods']=$product['imprint_position_and_methods'];
		$data['product_id']=$this->productId;
		$data['imprint_location_id']=$imprintLocationId;
		$data['maximum_selectable_color']=$product['imprint_information']['imprint_method_information'][$data['imprint_methods']]['maximum_selectable_color'];

		return $data;
	}

	/**
	 * @author Employee Id: 410175
	 * OB eCommerce Product - Order
	 * To select the product imprint method
	 * @param NULL
	 * return data array
	 */
	public function selectImprintMethod($chargeList=NULL){

		$data=array();
		if($chargeList!=NULL){
			$chargeList = array_keys($chargeList);
		}

		$imprintId=$this->request->get('imprint_id');
		$methodId=$this->request->get('method_id');
		$product=$this->getProductDetailById($this->productId);
		$no_of_color=0;
		if(isset($product['imprint_information']['imprint_method_information'][$methodId]['charges']))
		{
			foreach($product['imprint_information']['imprint_method_information'][$methodId]['charges'] as $charge=>$chargeData){
				if(in_array($charge,$chargeList)){
					
					$no_of_color++;
				}
			}	
		}else{
			$no_of_color=1;
		}
		$data['maximum_selectable_color']=$no_of_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']=$this->productId;
		$data['imprint_location_id']=$imprintId;
		
		$standardImprintColor = $this->getStandardImprintColorInformation($this->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;
	}

	public function selectImprintMethodMobileApi()
	{
		$data = array();

		$imprintId = $this->request->get('imprint_id', null);
		$methodId = $this->request->get('method_id', null);

		if($methodId == null || $imprintId == null || $this->productId == null) return false;

		$product=$this->getProductDetailById($this->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']=$this->productId;
				$data['imprint_location_id']=$imprintId;
				return $data;
			}
		}
		return false;
	}

	/**
	 * @author Employee Id: 4248
	 * OB eCommerce Product - Order
	 * To select the product imprint method
	 * @param NULL
	 * return data array
	 */
	public function selectPreImprintMethod(){
		/***************** HERE_WE_CHANGE_CODE ************************/
		$data=array();
		$imprintId=$this->request->get('imprint_location_id');
		$methodId=$this->request->get('imprint_method_id');
		$product=$this->getProductDetailById($this->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']=$this->productId;
		$data['imprint_location_id']=$imprintId;
		return $data;
		/*****************************************/
	}

	public function prepareCartList($inputProductList, $apiProductArray){
		$dataArray =array();
		$count=0;
		foreach ($apiProductArray as $key=>$data)
		{
			
			$dataArray[$count]['product_id'] =	$data['product_id'];
			$dataArray[$count]['feature_details'] =	$data['feature_details'];			
			$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]['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]['product_description'] = $data['basic_information']['description'];
			$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'] = $data['currency']['currency'];
			$dataArray[$count]['currency_symbol'] = $data['currency']['symbol'];
			$dataArray[$count]['imprint_position_and_methods'] = $data['imprint_position_and_methods'];
			$dataArray[$count]['price_unit'] = $data['price_unit'];
			$dataArray[$count]['is_delay_in_onhand_date'] = 0;
			$dataArray[$count]['blank_pricing'] = $data['blank_pricing'];
			$dataArray[$count]['decorative_pricing'] = $data['decorative_pricing'];
			$dataArray[$count]['special_pricing'] = $data['special_pricing'];
			
			if(array_key_exists($key, $inputProductList) && $inputProductList[$key]!='')
			{
				$attributeIdArray = $this->getattributeIdOrder($inputProductList[$key],$data);
				$dataArray[$count]['order_type'] = $inputProductList[$key]['order_type'];
				$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);
				$dataArray[$count]['unit_price'] = $this->getUnitPriceOfProduct($inputProductList[$key],$data['pricing']);
				$dataArray[$count]['amount'] = $dataArray[$count]['total_qty']*$this->TwigExtension->priceFilter($dataArray[$count]['unit_price']);
				$dataArray[$count]['is_complete']=1;
				$dataArray[$count]['imprint']=$this->prepareImprintArray($inputProductList[$key],$data['imprint_information']['imprint_method_information']);
				//$dataArray[$count]['charges']=$this->getAllAppliedCharges($inputProductList[$key],$data);
				$dataArray[$count]['charges']=$this->getAllAppliedCharges($dataArray[$count]);

				$dataArray[$count]['split']=$this->prepareProductArray($inputProductList[$key],$dataArray[$count],$attributeIdArray);

				//$dataArray[$count]['split']=$this->prepareProductArray($inputProductList[$key],$dataArray[$count]['unit_price'],$attributeIdArray);
				$dataArray[$count]['special_instrution']=$inputProductList[$key]['special_instruction'];
				$dataArray[$count]['productDataArray']= $inputProductList[$key];

				$extraColorArray = array();
				if($inputProductList[$key]['extra_color'] == 'null'){
					if(isset($dataArray[$count]['split'][0]['variation_master']) && count($dataArray[$count]['split'][0]['variation_master'])>0) {
						foreach($dataArray[$count]['split'][0]['variation_master'] as $id=>$attVal) {
							$extraColorArray['mainColor'][] =  $attVal['attribute_value_color'];
						}
					}
				}
				else {
					$extraColorArray = $this->getExtraColorArray($inputProductList[$key]['extra_color'],$data['attributes']);
				}
				$dataArray[$count]['extra_color'] =	$extraColorArray;
			}
			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']="-";
			}

			if($this->configurationRule['order_tax']['status']==1){
				$dataArray [$count] ['tax'] = $this->getCalculateTax($data);
			}
			$dataArray [$count] ['cart_id'] = $key;
			$count++;
		}
		return $dataArray;
	}

	function getCalculateTax ($data)
	{
		$tax = array();
		if($this->configurationRule['order_tax']['status']==1){
			$options=$this->configurationRule['order_tax']['option'];
			if($options['overall_cart']['status']==1){
				$vatUnitOption=$options['overall_cart']['option'];
				if($vatUnitOption['vat_unit']==1){    // vat_unit 1 for "percentage" or 0 for "fixed".
					$tax['vat_unit'] = "percentage";
				}else{
					$tax['vat_unit'] = "fixed";
				}
				$tax['vat'] = $vatUnitOption['vat'];
			}
			if($options['item_wise']['status']==1){
				if (array_key_exists ( 'matrix_vat_details', $data ) && count($data ['matrix_vat_details'])>0){
					$tax['vat'] = $data ['matrix_vat_details']['vat'];
					$tax['vat_unit'] = $data ['matrix_vat_details']['vat_unit'];
				}else{
					$tax['vat'] = 25;
					$tax['vat_unit'] = "percentage";
				}
			}
			return $tax;
		}

	}

	function getattributeIdOrder ($cartDetail,$productDetail)
	{
		$attributeIdArray=array();
		if(array_key_exists('shipping_method', $cartDetail) && isset($cartDetail['shipping_method']['shipping_type']) && $cartDetail['shipping_method']['shipping_type'] != ''){
			$requestQuoteShipping= $cartDetail['shipping_method']['shipping_detail'];
			$attributeIdArray['color']	=	$cartDetail['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))
								{
									//print_r($productAttri['id']);
									$attributeIdArray[$productSelecAttri] = $productAttri['id'];
									$attributeIdArray[$productSelecAttri.'_attr_val'] = $productAttri['values'];
								}
							}
						}
					}
				}
			}
		}
		else {
			$attributeIdArray['color'] = $cartDetail['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 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($cartDetail,$productPrice)
	{
		return $this->commonLibraryManager->getProductPriceByQty($productPrice, $this->getTotalQty($cartDetail));
	}

	public function prepareImprintArray($inputDetail, $productImprint){
		$imprintMethod=array();

		//if(array_key_exists('imprint', $inputDetail)){
		if(isset($inputDetail['imprint']) && is_array($inputDetail['imprint'])){
			//print_r($inputDetail); die;
			$totalQty = $inputDetail['total_qty'];
			$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.

					if(isset($productImprint[$imprintMethod[$i]['imprint_method_id']]['charges']['SETUP_CHARGE'])){
						$imprintMethod[$i]['charges'][0]['charges_type'] = 'Setup charge';//$productImprint[$imprintMethod[$i]['imprint_method_id']]['charges']['SETUP_CHARGE']['label'];
						$imprintMethod[$i]['charges'][0]['charges_amount'] = $productImprint[$imprintMethod[$i]['imprint_method_id']]['charges']['SETUP_CHARGE']['charge'];
					}
					if(isset($productImprint[$imprintMethod[$i]['imprint_method_id']]['charges']['SINGLE_COLOR_SETUP'])){
						$imprintMethod[$i]['charges'][0]['charges_type'] =  'Setup charge'; //$productImprint[$imprintMethod[$i]['imprint_method_id']]['charges']['SINGLE_COLOR_SETUP']['label'];
						$imprintMethod[$i]['charges'][0]['charges_amount'] = $productImprint[$imprintMethod[$i]['imprint_method_id']]['charges']['SINGLE_COLOR_SETUP']['charge'];
					} 
					if($imprintMethod[$i]['no_of_color']>1){
						if(isset($productImprint[$imprintMethod[$i]['imprint_method_id']]['charges']['MULTI_COLOR_SETUP'])){
							$imprintMethod[$i]['charges'][0]['charges_type'] = 'Setup charge';//$productImprint[$imprintMethod[$i]['imprint_method_id']]['charges']['MULTI_COLOR_SETUP']['label'];
							$imprintMethod[$i]['charges'][0]['charges_amount'] = $productImprint[$imprintMethod[$i]['imprint_method_id']]['charges']['MULTI_COLOR_SETUP']['charge'];
						}
					}

					if($imprintMethod[$i]['no_of_color']>0){
						
						if(isset($productImprint[$imprintMethod[$i]['imprint_method_id']]['charges']['RUN_CHARGE_1_'.$imprintMethod[$i]['no_of_color']])){

							$runcharge = $productImprint[$imprintMethod[$i]['imprint_method_id']]['charges']['RUN_CHARGE_1_'.$imprintMethod[$i]['no_of_color']];
							$label = $runcharge['label'];
							$count=0;
							if(count($runcharge['charge'])>0){
								foreach($runcharge['charge'] as $charge){
									if($totalQty>=$charge['from'] && $totalQty<=$charge['to']){
										$imprintMethod[$i]['charges'][1]['charges_amount'] = $charge['rate']*$totalQty;
										$imprintMethod[$i]['charges'][1]['charges_type'] = 'Run charge';
									}
									if($totalQty>=$charge['from'] && $charge['to']==""){
										$imprintMethod[$i]['charges'][1]['charges_amount'] = $charge['rate']*$totalQty;
										$imprintMethod[$i]['charges'][1]['charges_type'] = 'Run charge';
									}
									$count = $count+1;
									if($count==5){
										break;
									}
								}
							}
						}
					}


					$i++;
			}
		}
		return $imprintMethod;
	}

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

		if(isset($inputDetail['imprint']) && $inputDetail['imprint']!=NULL){
			if(count($inputDetail['imprint'])>0){
				foreach($inputDetail['imprint'] as $imprint){
					if(isset($imprint['charges'])){
						$setup_total = $imprint['charges'][0]['charges_amount']+$setup_total;
						$runcharge_total = $imprint['charges'][1]['charges_amount']+$runcharge_total;
					}
				}
				$charges[0]['charges_types'] = 'Setup Charge';
				$charges[0]['charges_amounts'] = $setup_total;
				$charges[0]['charges_amount'] = $setup_total;
				$charges[1]['charges_types'] = 'Run Charge';
				$charges[1]['charges_amounts'] = $runcharge_total;
			}
		}
		return $charges;
	}

	public function prepareProductArray($inputDetail,$unitPrice,$attributeIdArray){
		$splitProduct=array();
		if(array_key_exists('shipping_method', $inputDetail) && isset($inputDetail['shipping_method']['shipping_type']) && $inputDetail['shipping_method']['shipping_type'] != ''){
			$i=0;
			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'];
				$splitProduct[$i]['is_delay_in_onhand_date_itemline'] = 0;
				$splitProduct[$i]['is_delay_in_ship_date_itemline'] = 0;

				if(array_key_exists('selected_address_id',$ShipDetailArray)){
					$splitProduct[$i]['shipping_detail']=$this->prepareShippingDetail($ShipDetailArray);
					$splitProduct[$i]['tax_shipping_wise']=isset($ShipDetailArray['tax_shipping_wise']) ? $ShipDetailArray['tax_shipping_wise'] : 0;
				}else{
					$splitProduct[$i]['shipping_detail']=$this->prepareShippingDetailGuest($ShipDetailArray,$inputDetail['guest_shipping_detail'][$inputDetail['product_id']][$inputDetail['shipping_method']['shipping_type']][$key]);
					$splitProduct[$i]['tax_shipping_wise']=isset($ShipDetailArray['tax_shipping_wise']) ? $ShipDetailArray['tax_shipping_wise'] : 0;
				}
				$splitProduct[$i]['variation_master']=$this->prepareVariation($ShipDetailArray,$unitPrice,$attributeIdArray);
				$i++;
			}
		}
		else {
			$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;
		}
		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'] : '');
		$shipData['service_type']		= 	(isset($ShipDetailArray['shipping_detail']['shipping_method']) ? $ShipDetailArray['shipping_detail']['shipping_method'] : '');
		$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'] : '');
		$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;

		//$requestQuoteShipping['shipping_detail']['shipping_carrier_charge'];
		$shipData['selected_address_id']	=	$shippingDetail->getId();
		$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['countryid']			=	$shippingDetail->getCountryId();
		$shipData['stateid']			=	$shippingDetail->getStateId();
		$shipData['cityid']				=	$shippingDetail->getCityId();
		$shipData['countryname']		=	$shippingDetail->getCountryName();
		$shipData['statename']			=	$shippingDetail->getStateName();
		$shipData['cityname']			=	$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['selected_address_id']		=	isset($inputData['selected_address_id'])?$inputData['selected_address_id']: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;
		$shipData['countryname']		=	isset($inputData['countryId'])? $this->coreManager->getCountryName($inputData['countryId']) :NULL;
		$shipData['statename']			=	isset($inputData['stateId']) ? $this->coreManager->getStateName($inputData['stateId']) : NULL;
		$shipData['cityname']			=	isset($inputData['cityId'])? $this->coreManager->getCityName($inputData['cityId']) : NULL;

		return $shipData;
	}

	function prepareVariation($ShipDetailArray,$productData,$attributeIdArray){
		$saveData=array();
		$unitPrice = $productData['unit_price'];
		//$feature_details = $dataArray['feature_details'];
		//$exchargeData = null;
		$fdetailvalue = null;
		if(isset($productData['feature_details'])){
			foreach($productData['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;	
		}

		$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];
							if($exchargeData!=null){
								if(isset($exchargeData[$saveData[$i]['variation_detail'][$m][$i]['size_attr_val']])){
									$extraSizePrice = $exchargeData[$saveData[$i]['variation_detail'][$m][$i]['size_attr_val']];
									$saveData[$i]['variation_quantity'][$m]['unit_price']	=	$unitPrice+$extraSizePrice;
								}
							}
						}
					}
					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];
							if($exchargeData!=null){
								if(isset($exchargeData[$saveData[$i]['variation_detail'][$m][$i]['size_attr_val']])){
									$extraSizePrice = $exchargeData[$saveData[$i]['variation_detail'][$m][$i]['size_attr_val']];
									$saveData[$i]['variation_quantity'][$m]['unit_price']	=	$unitPrice+$extraSizePrice;
								}
							}
						}
					}
				}
				$k++;
			}
			$i++;
		}
		return $saveData;
	}

	/**
	 * @author Employee Id: 410175
	 * OB eCommerce Product - Order
	 * 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;
		}
		$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: 4248
	 * OB eCommerce Product - OrderBundle
	 * To get the user detail
	 */
	public function getUserDetail($userId, $userType)
	{
		if ($userType == "guest") {
			return $this->orderMasterRepositoryManager->getGuestUser($userId);
		} else {

			return $this->userManager->getUserById($userId);
		}
	}

	public function getContinueShoppingUrl()
	{
		if ($this->sessionManager->has($this->continueShoppingUrlSessionKey)) {
			$redirectUrl = $this->sessionManager->get($this->continueShoppingUrlSessionKey);
			$this->sessionManager->remove($this->continueShoppingUrlSessionKey);
			return $redirectUrl;
		}
		else {
			if($this->userId) {
				return $this->configurationRule['guest_user']['option']['continue_shopping_default_url'];
			}
			else {
				return $this->configurationRule['registered_user']['option']['continue_shopping_default_url'];
			}
		}
	}

	public function setContinueShoppingUrl($refererUrlRouteName, $refererUrl)
	{
		if ($refererUrl != '' && $refererUrlRouteName != 'office_brain_orderbundle_order_cartlist') {
			$this->sessionManager->set($this->continueShoppingUrlSessionKey, $refererUrl);
		} else {
			$this->sessionManager->remove($this->continueShoppingUrlSessionKey);
		}
	}

	/**
	 * @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;
	}

	/**
	 * @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(!empty($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;

	}
	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['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 */
					
					
				}
			}
		}
		return $data;

	}

	public function deleteOrderDetailById($orderId="")
	{
		if ($orderId > 0) {
			$infoId = $orderId;
		} else {
			$infoId = $this->request->get('order_id');
		}
		$isDeleted['data'] = $this->orderMasterRepositoryManager->deleteOrder($infoId);
		if ($isDeleted) {
			$isDeleted['status'] = "SUCCESS";
			return $isDeleted;
		}
		$isDeleted['status']= 'ERROR_NOT_FOUND';
		return $isDeleted;
	}

	public function isOrderExists($id=null)
	{
		if (!$id){ $id = $this->request->get('order_id');}else{$id = $id;}
		return $this->orderMasterRepositoryManager->isAdminOrderExists($id);
	}

	public function processPrepareOrderProductId($orderId)
	{
		$this->productIdArray =array();
		$this->productIsConfig =array();
		$this->productDataArray=array();
		$this->productcartIdArray = array();
		$this->itemLineId =array();
		$recordSet = $this->orderItemLineRepositoryManager->getAllAddedProductInOrder($orderId);
		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'];
				$base64DecodedProductDetailConfiguration= base64_decode($row['productDetailConfiguration']);
				$this->productDataArray[$row['id']]	= unserialize($base64DecodedProductDetailConfiguration);				
				$this->productcartIdArray[$row['id']]['product_id'] = $row['productId'];
			}
			unset($recordSet);
		}
	}

	public function getProductList( $ordId=0)
	{
		if($ordId!=0){
			$orderId=$ordId;
		}else{
			$orderId=$this->request->get('order_id');
		}
		$this->orderProducts =array();
		$this->processPrepareOrderProductId($orderId);
		if (is_array($this->productIdArray) && count($this->productIdArray))
		{
				$productIds = array_unique($this->productIdArray);
				$orderProducts = $this->getProductDetailById(json_encode($this->productIdArray), $this->cultureCode);
				foreach($this->productcartIdArray as $cartId=>$product){
					$orderProducts[$product['product_id']] = $this->serviceRuleApi->updateCountryByVariation($orderProducts[$product['product_id']],$this->productDataArray[$cartId]);
					$orderProducts[$product['product_id']]= $this->serviceRuleApi->updatePriceByCountry($orderProducts[$product['product_id']], $this->productDataArray[$cartId]['culture']);
				}
				
				$this->orderProducts = array();
				$count=0;
				foreach($this->productIdArray as $productId){
					$this->orderProducts[$count] = $orderProducts[$productId];
					$this->orderProducts[$count]['is_config'] = $this->productIsConfig[$count];
					$this->orderProducts[$count]['item_line_id'] = $this->itemLineId[$count];
					$count++;
				}
			}

			unset($this->productIdArray);
			return $this->orderProducts;
	}

	public function getTotalCountUserWiseAdmin()
	{
		$adminUser = $this->userManager->findIsAdmin();
		$flag = 'user';
		if ($adminUser) {
			$flag = 'admin';
		}
		return $this->orderMasterRepositoryManager->getTotalCountUserWise($flag);
	}

	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;
	}

	/**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - Order
	 * 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: 4532
	 * OB eCommerce Product - Order
	 * 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: 4532
	 * OB eCommerce Product - order
	 * To get product input data for oder from database
	 * @param NULL
	 * return data array
	 */
	public function getInputDataForEditFromDB($productId){
		$data = array();
		$inputDataArray = $this->getCartList();
		foreach($inputDataArray as $result){
			if($result['product_id'] == $productId){
				$data = $result;
			}
		}
		return $data;
	}


	public function changeOrderLineStatusAdmin($shippingId,$statusId,$status,$shippingType,$trackingId)
	{
		$getShippingDetail = $this->orderShippingDetailRepositoryManager->getShippingDetailById($shippingId);
		$isUpdated = $this->orderShippingDetailRepositoryManager->changeOrderLineStatus($getShippingDetail,$statusId,$status,$shippingType,$trackingId,$this->userId);
		if ($isUpdated=='SUCCESS') {
			return 'SUCCESS';
		}
		return 'ERROR_NOT_FOUND';
	}

	/**
	 *  @author Employee Id: 4471
	 *  get order inline detail
	 */
	public  function getOrderLineShippingDetailAdmin($shippingId)
	{
		return $this->orderShippingDetailRepositoryManager->getShippingDetailById($shippingId);
	}

	/**
	 *  @author Employee Id: 4532
	 *  get product price information
	 */
	public function getProductPriceInfo($productId,$imprintMethodId){
		$data = array();
		$product = $this->getProductDetailById($productId);
		foreach($product['imprint_information']['imprint_method_information'] as $key=>$val){
			if($key == $imprintMethodId){
				if(isset($val['price']['price_type'])){ $data['price_type'] = $val['price']['price_type']; } else { $data['price_type'] = ''; }
				if(isset($val['price']['pricing'])){$data['pricing'] = $val['price']['pricing']; } else { $data['pricing'] = ''; }
			}
		}
		if($product['blank_imprint_method_id']==$imprintMethodId){
			$data['price_array_type'] = 'blank';
		}else{
			$data['price_array_type'] = 'decorative';
		}
		return $data;
	}

	/**
	 *  @author Employee Id: 4532
	 *  Generate Place Order XML file
	 */
	public function generateXMLOfOrder($id=''){
		if (!$id){ $id = $this->request->get('order_id');}else{$id = $id;}
		$orderData = $this->orderMasterRepositoryManager->getOrderDetailById($id);
		$orderJsonData= $this->jmsSerializer->serialize($orderData, 'json');
		$xml_info = new \SimpleXMLElement("<?xml version=\"1.0\"?><order_info></order_info>");
		$this->convertArrayToXML(json_decode($orderJsonData, true),$xml_info);
		$xml_file_data = $xml_info->asXML();
		$xmlFileName = $this->generateXMLFile($xml_file_data);
		return $xmlFileName;
	}
	/**
	 *  @author Employee Id: 4532
	 *  Convert Array to XML file
	 */
	public function convertArrayToXML($productData,$xml_info){
		foreach($productData as $key => $value) {
			if(is_array($value)) {
				if(!is_numeric($key)){
					$subnode = $xml_info->addChild("$key");
					$this->convertArrayToXML($value, $subnode);
				}else{
					$subnode = $xml_info->addChild("item$key");
					$this->convertArrayToXML($value, $subnode);
				}
			}else {
				$xml_info->addChild("$key",("$value"));
			}
		}
	}
	/**
	 *  @author Employee Id: 4532
	 *  create xml file with given xml info
	 */
	public function generateXMLFile($xml_file_data){
		$fileName = time().'.xml';
		$placeOrderXmlPathFile = $this->xmlPath.'/'.$fileName;
		$myfile = fopen($placeOrderXmlPathFile, "w") or die("Unable to open file!");
		fwrite($myfile, $xml_file_data);
		fclose($myfile);
		return $fileName;
	}

	//HERE_WE_CHANGE_CODE
	public function getImprintLocationByImprintMethodId(){
		$data = array();
		$productId 			= $this->request->get('product_id');
		$imprintMethodId 	= $this->request->get('imprint_method_id');
		$product 			= $this->getProductDetailById($this->productId);
		$data['imprint_position_and_methods']=$product['imprint_position_and_methods'][$imprintMethodId]['position_area'];
		$data['product_id']=$this->productId;
		$data['imprint_method_id']=$imprintMethodId;
		return $data;
	}
	//END HERE_WE_CHANGE_CODE
	
	/**
	 *  @author Employee Id: 4203
	 *  To get itemLine by item_line_id
	 */
	
	public function getItemLineById($itemLineId){
		return $this->orderItemLineRepositoryManager->getProductIdInItemLine($itemLineId);
	}
	
	/**
	 *  @author Employee Id: 4203
	 *  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']['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;
    	}
    	$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 emp id : 4471
	 * to check onhand date verification
	 */
	
	public function checkProductDeliveryDate() {
	
		$cartDataArray = $this->getCartList();
		$dateDelayArr=array();
		$allCartDelayStatus = 0;
		$i=0;
		$is_product_deleted = 0;
		if(count($cartDataArray)>0)
		{
			foreach($cartDataArray as $cartKey=>$cart)
			{
				$checkDelay = 0;
				$checkMethod = 0;
				// get production timing for product
				$minday= 0;
				$imprintData=$cart['imprint'];
				if($cart['is_deleted']=="true"){
					$is_product_deleted = 1;
					break;
				}
				foreach ($imprintData as $imprint)
				{
					$imprintProductionTime= $imprint['imprint_production_time'];
					if(strpos($imprintProductionTime, '-'))
					{
						$minDays = explode('-',$imprintProductionTime);
						$minday= $minDays[0];
					}
					else
					{
						$minday=$imprintProductionTime;
					}
				}
	
				// get user prefer onhand date for each shipping address and check wheather date is achievable or not
				$splitShippingDate=$cart['split'];
				$j=0;
				foreach($splitShippingDate as $splitKey=>$shipdata)
				{
					//flag set for onhand date verification by default set to 0
					$isProductionDateDelay = 0;
					$shipDateDelay = 0;
					$ischeckMethodBlack=0;
					$preferDate = $shipdata['shipping_detail']['on_hand_date'];
					$preferShipDate = $shipdata['shipping_detail']['ship_date'];
					if($preferDate!=null)
					{
						// add number of production days in current day
						$approxDate = Date('m/d/Y', strtotime("+".$minday."day"));
	
						// if prefer onhand date is before approx date then production date will delay
						if($approxDate > $preferDate )
						{
							$isProductionDateDelay = 1;
							$checkDelay = 1;
							$allCartDelayStatus = 1;
						}
					}
					
					if($preferShipDate!=null)
					{
						// add number of production days in current day
						$approxDate = Date('m/d/Y', strtotime("+".$minday."day"));
					
						// if prefer onhand date is before approx date then production date will delay
						if($approxDate > $preferShipDate )
						{
							$shipDateDelay = 1;
							$checkDelay = 1;
							$allCartDelayStatus = 1;
						}
					}
					
					$shipping_service=$shipdata['shipping_detail']['service_type'];
					if($shipping_service=='null'){
						$ischeckMethodBlack=1;
						$checkMethod = 1;
						$allCartDelayStatus = 1;
					}
	
	
					$cartDataArray[$cartKey]['split'][$splitKey]['is_delay_in_onhand_date_itemline']=$isProductionDateDelay;
					$cartDataArray[$cartKey]['split'][$splitKey]['is_delay_in_ship_date_itemline']=$shipDateDelay;
					$cartDataArray[$cartKey]['split'][$splitKey]['is_shipping_method_blank']=$ischeckMethodBlack;
					//$shipdata['is_delay_in_onhand_date_itemline'] = $isProductionDateDelay;
					//$cartDataArray[$i]['split'][$j]['is_delay_in_onhand_date_itemline'] = $isProductionDateDelay;
					$j++;
				}
				//$cart['is_delay_in_onhand_date']=$checkDelay;
				$cartDataArray[$i]['is_delay_in_onhand_date']=$checkDelay;
				$cartDataArray[$i]['is_shipping_method_blank']=$checkMethod;
				$i++;
			}
		}
		$this->response['data']= $cartDataArray;
		if($is_product_deleted == 1)
		{
			$this->response['status']='is_deleted';
		}
		else if($allCartDelayStatus == 1)
		{
			$this->response['status']='delay';
		}
		else
		{
			$this->response['status']='success';
		}
		return $this->response ;
	}
	
	
	/**
	 * OB eCommerce Product - Order
	 * To get
	 */
	public function getShippingTypeList($productCartList)
	{
		$shippingData = $superArryConfig = array();
		$superArryConfig['shipping_type'] = $this->request->get('shipping_type');
		$superArryConfig['shipping_counter'] = $this->request->get('shipping_counter',0);
		$superArryConfig['size_attribute_id'] = $this->projectSetting['configuration_rule']['transaction']['shopping_cart']['size_attribute_id'];
		$superArryConfig['color_attribute_id'] = $this->projectSetting['configuration_rule']['transaction']['shopping_cart']['color_attribute_id'];
		
		foreach($productCartList as $k=>$cartData) {
			$productData = $this->getProductDetailById($cartData['product_id']);
			
			$aryConfig = array();
			$aryConfig['product_id'] = $cartData['product_id'];
			$aryConfig['allow_size'] = false;
			if($productData['is_size']==1){
				$superArryConfig['allow_size'] = true;
			}
			
			$productAttributes = array();
			foreach ($productData['attributes']  as $attributes){
				$productAttributes[$attributes['id']] = $attributes;
			}
			
			$shippingData[$cartData['cart_id']]['color_qty']= $cartData['productDataArray']['color'];
			$shippingData[$cartData['cart_id']]['extra_color_qty']= $cartData['productDataArray']['extra_color'];
			$shippingData[$cartData['cart_id']]['product_attributes']= $productAttributes;
			$shippingData[$cartData['cart_id']]['config']= $aryConfig;
			$shippingData[$cartData['cart_id']]['color_images']= $productData['images'];
			$shippingData[$cartData['cart_id']]['product_name']= $productData['basic_information']['title'];
			if(!empty($this->request->get('color_quantity'))) {
				$colorQuantity = $this->request->get('color_quantity');
				$shippingData[$cartData['cart_id']]['color_qty']= $colorQuantity[$cartData['cart_id']];
			}
		}
		$shippingData['config']= $superArryConfig;
		
		unset($superArryConfig);
		unset($aryConfig);
		
		return $shippingData;
	}
	
	public function removeCheckoutShippingCounterById($productCartList){
		$shippingData = array();
		//Reformat cart data
		$cartData = array();
		foreach($productCartList as $index => $pCartData)
		{
			$cartData[$pCartData['cart_id']] = $pCartData;
		}//dump($cartData);
		
		$shippingId = $this->request->get('shipping_box_id');
		$shippingData['shipping_type'] = $this->request->get('shipping_type');
		$data = $this->request->get('shipping_method');
		unset($data[$shippingId]);
		//dump($data);
		
		
		$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['shipping_type'] = $shippingData['shipping_type'];
		$aryConfig['allow_size'] = false;
		
		if($data[0]['product_id'] != '' && (!(empty($data[0]['product_id']))))
		{
			$productIds = explode(',',$data[0]['product_id']);
		}
		if($data[0]['cart_id'] != '' && (!(empty($data[0]['cart_id']))))
		{			
			$cartIds = explode(',',$data[0]['cart_id']);
		}
		foreach($productIds as $key => $productId) {
			$productData = $this->getProductDetailById($productId);
			
			$shippingData['shipping_array'][$cartIds[$key]]['allow_size'] = false;
			if($productData['is_size']==1){
				$shippingData['shipping_array'][$cartIds[$key]]['allow_size'] = true;
			}
			$shippingData['shipping_array'][$cartIds[$key]]['product_id'] = $productId;
			
			$productAttributes = array();
			foreach ($productData['attributes']  as $attributes){
				$productAttributes[$attributes['id']] = $attributes;
			}
			
			$shippingData['shipping_array'][$cartIds[$key]]['product_attributes'] = $productAttributes;
			$shippingData['shipping_array'][$cartIds[$key]]['color_images'] = $productData['images'];
			$shippingData['shipping_array'][$cartIds[$key]]['product_name'] = $productData['basic_information']['title'];
		}
				
		//$shippingData['data'] = array_values($data);
		$shippingData['data'] = $data;
		
		$tempClrQnty = array();
		foreach($data as $in=>$val) {
			//echo "=>in: ".$in."=>";
			if($data[0]['product_id'] != '' && (!(empty($data[0]['product_id']))))
			{
				$productIds = explode(',',$data[0]['product_id']);
			}
			if($data[0]['cart_id'] != '' && (!(empty($data[0]['cart_id']))))
			{
				$cartIds = explode(',',$data[0]['cart_id']);
			}
			foreach($productIds as $key => $pid) {
				//echo "=>key: ".$key."=>";
				$tempClrQnty[$in]['color_quantity'][$cartIds[$key]] = $val['color_quantity'][$cartIds[$key]];
				$tempClrQnty[$in]['productId'][$cartIds[$key]] = $pid;
				
				$tempClrQnty[$in]['extra_color_quantity'][$cartIds[$key]] = $cartData[$cartIds[$key]]['productDataArray']['extra_color'];
				
			}

				$shippingData['data'][$in]['color_quantity'] = $tempClrQnty[$in]['color_quantity'];
				$shippingData['data'][$in]['productId'] = $tempClrQnty[$in]['productId'];
				$shippingData['data'][$in]['extra_color_quantity'] = $tempClrQnty[$in]['extra_color_quantity'];

		}
		unset($tempClrQnty);

		$shippingData['configure'] = $aryConfig;
		
		// change the keys
		$shippingData['data'] = array_values($shippingData['data']);
		
		return $shippingData;
	}

	public function mergeAttributeArray($colrInfo,$attribute){
    	$result = array();
		$fullColorArray = array();
		$inkColorArray = array();
		$trimColorArray = array();
		$barrelColorArray = array();
		
		foreach($attribute as $key=>$val){
			if($val['id'] == $colrInfo['trim_color_id']){
				$trimColorArray = $val['values'];
			}
			if($val['id'] == $colrInfo['ink_color_id']){
				$inkColorArray = $val['values'];
			}
			if($val['id'] == $colrInfo['barrel_color_id']){
				$barrelColorArray = $val['values'];
			}
			if($val['id'] == 10){
				$fullColorArray = $val['values'];
			}
		}
		foreach ($fullColorArray as $k=>$v){
			$v2 = preg_quote($v, '/');
			if(preg_grep( "/^".$v2."$/i" , $trimColorArray )) {	
				$result['trim_color_val'][$k] = $v;  
			}
			if(preg_grep( "/^".$v2."$/i" , $inkColorArray )) {
				$result['ink_color_val'][$k] = $v;  
			}
			if(preg_grep( "/^".$v2."$/i" , $barrelColorArray )) {	
				$result['barrel_color_val'][$k] = $v;  
			}
		}
		
		return $result;
		
    }

    public function getBillingDetailsBYOrderId($id){
    	return $this->orderBillingDetailRepositoryManager->getBillingDetailsBYOrderId($id);
    }
}
