public function checkCompatibility($visitorId, Pap_Tracking_Visit_VisitorAffiliateCache $cache) {
        $rows = $cache->getVisitorAffiliateAllRows($visitorId);

        if ($this->isVisitorAffiliatesCollectionValid($rows)) {
            return;
        }

        if ($rows->getSize() == 1) {
            $rows->get(0)->setActual();
            return;
        }

        Pap_Tracking_Visit_VisitorAffiliateCache::sortVisitorAffiliatesByDateVisit($rows);

        $rows->correctIndexes();

        for ($i=1, $size = $rows->getSize();$i<$size-1;$i++) {
            $cache->removeVisitorAffiliate($rows->get($i)->getId());
            $rows->remove($i);
        }

        $rows->correctIndexes();

        $campaign = $this->getCampaignById($rows->get(1)->getCampaignId());
        $user = $this->getUserById($rows->get(1)->getUserId());

        if ($this->cookieObject->isOverwriteEnabled($campaign, $user)) {
            $rows->get(1)->setActual();
        } else {
            $rows->get(0)->setActual();
        }
    }
    private function checkIfFirstVisitorAffiliateClickIsThereTwoTimes(Pap_Tracking_Common_VisitorAffiliateCollection $rows) {
		Pap_Tracking_Visit_VisitorAffiliateCache::sortVisitorAffiliatesByDateVisit($rows);
				
		$usersIndexes= array();
		$hasFirstTwoTimes = false;
		$firstClickVisitorAffiliate = $rows->getValid(0);		
		
        for ($i = 1; $i < $rows->getValidSize(); $i++) {		
            if ($rows->getValid($i)->getUserId() === $firstClickVisitorAffiliate->getUserId() && !$hasFirstTwoTimes) {
                $hasFirstTwoTimes = true;                
                continue;
            }     
            if (isset($usersIndexes[$rows->getValid($i)->getUserId()])) {
            	$usersIndexes[$rows->getValid($i)->getUserId()][] = $i;
            	continue;
            }
            $usersIndexes[$rows->getValid($i)->getUserId()] = array($i); 
        }
        
        $this->removeUserDuplicates($rows, $usersIndexes);
        
        if (!$hasFirstTwoTimes) {        	
        	$this->cloneVisitorAffiliate($firstClickVisitorAffiliate, $rows);
        }
    }
    public function saveCommissions(Pap_Common_ActionProcessorCompoundContext $actionProcessorCompoundContext) {
        $context = $actionProcessorCompoundContext->getContext();
        $cache = $actionProcessorCompoundContext->getActionProcessor()->getVisitorAffiliatesCache();

        $context->debug('SplitCommissions save started');

        $commType = $this->getCommissionType($context);

        if ($context->getTrackingMethod() == Pap_Common_Transaction::TRACKING_METHOD_DEFAULT_AFFILIATE) {
            $context->debug('SplitCommissions - default affiliate. STOPPED');
            return;
        }

        if ($context->getTrackingMethod() == Pap_Common_Transaction::TRACKING_METHOD_FORCED_PARAMETER) {
            $context->debug('SplitCommissions - forced parameter. STOPPED');
            return;
        }

        if ($context->getTrackingMethod() == Pap_Common_Transaction::TRACKING_METHOD_COUPON) {
            $context->debug('SplitCommissions - coupon. STOPPED');
            return;
        }

        $this->saleId = Gpf_Common_String::generateId();

        $firstAffBonus = $this->loadCommissionTypeAttributeValue($commType->getId(), Pap_Features_SplitCommissions_SplitCommissionsForm::FIRST_AFF_BONUS);
        $lastAffBonus = $this->loadCommissionTypeAttributeValue($commType->getId(), Pap_Features_SplitCommissions_SplitCommissionsForm::LAST_AFF_BONUS);
        $this->minCommission = $this->loadCommissionTypeAttributeValue($commType->getId(), Pap_Features_SplitCommissions_SplitCommissionsForm::MIN_COMMISSION);

        Pap_Features_SplitCommissions_VisitorAffiliateCheckCompatibility::getHandlerInstance()->checkCompatibility($context->getVisitorId(), $cache);

        $visitorAffiliates = $cache->getVisitorAffiliateAllRows($context->getVisitorId());

        Pap_Tracking_Visit_VisitorAffiliateCache::sortVisitorAffiliatesByDateVisit($visitorAffiliates);

        $this->setSplitCommissions($this->getSplitCommissions($firstAffBonus, $lastAffBonus, $visitorAffiliates));

        $this->visitorAffiliateCollection = $visitorAffiliates;

        $this->processVisitorAffiliates($visitorAffiliates, $actionProcessorCompoundContext);

        $context->debug('SplitCommissions save finished');
        $actionProcessorCompoundContext->setCommissionsAlreadySaved(true);
    }