public function filterRow(Gpf_Data_Row $row) {
        $row->add('commissionsexist', Gpf::NO);
        if ($this->commissionsTable->findCampaignInCommExistsRecords($row->get("id"), $this->commissions)) {
            $row->set('commissionsexist', Gpf::YES);
        }

        $row->add('commissionsdetails', $this->commissionsTable->getCommissionsDescription($row->get("id"),
        $this->commissions, $this->getCommissionGroupId($row)));

        $row->set('name', $this->_localize($row->get('name')));

        return parent::filterRow($row);
    }
    public function run() {
    	$time1 = microtime();
    	Pap3Compatibility_Migration_OutputWriter::logOnce("Deleting migrated data from existing PAP4 tables<br/>");

    	try {
    		$this->deleteTable(Pap_Db_Table_Campaigns::getName());
    		$this->deleteTable(Pap_Db_Table_CommissionGroups::getName());
    		$this->deleteTable(Pap_Db_Table_CommissionTypes::getName());
    		$this->deleteTable(Pap_Db_Table_Commissions::getName());
    		$this->deleteTable(Pap_Db_Table_UserInCommissionGroup::getName());
    		
    		$this->deleteTable(Gpf_Db_Table_FormFields::getName());
    		$this->deleteTable(Gpf_Db_Table_FieldGroups::getName());
    		
    		$this->deleteTable(Pap_Db_Table_Transactions::getName());
    		$this->deleteTable(Pap_Db_Table_Clicks::getName());
    		$this->deleteTable(Pap_Db_Table_RawClicks::getName());
    		$this->deleteTable(Pap_Db_Table_Impressions::getName());

    		$this->deleteTable(Pap_Db_Table_Banners::getName());
    		
    		$this->deleteTable(Gpf_Db_Table_FieldGroups::getName());
    		$this->deleteTable(Pap_Db_Table_PayoutsHistory::getName());
    		$this->deleteTable(Pap_Db_Table_Payouts::getName());
    		
    		$this->deleteTable(Gpf_Db_Table_Currencies::getName());
    		$this->deleteTable(Gpf_Db_Table_MailAccounts::getName());
    		
    	} catch(Exception $e) {
    		Pap3Compatibility_Migration_OutputWriter::log("&nbsp;&nbsp;Errror: ".$e->getMessage()."<br/>");
    	}

    	$time2 = microtime();
		Pap3Compatibility_Migration_OutputWriter::logDone($time1, $time2);
    }
	private function setCommissionGroupId(Gpf_Data_Row $row) {
		if (!is_null(($commissionGroupId = $this->commissionsGroupTable->getUserCommissionGroup($row->get(Pap_Db_Table_Campaigns::ID), $this->getUserID())))) {
			$row->set('commissiongroupid', $commissionGroupId);
			return;
		}
		try {
			$row->set('commissiongroupid', $this->commissionsTable->getDefaultCommissionGroup($row->get(Pap_Db_Table_Campaigns::ID)));
		} catch (Gpf_DbEngine_NoRowException $e) {
		}
	}
	/**
	 * returns all commission types for a campaign
	 *
	 * @service commission read
	 * @param $fields
	 */
	public function loadAllCommissionSettings(Gpf_Rpc_Params $params) {
		$commissionGroupId = $params->get("commissiongroupid");
		$campaignId = $params->get("campaignid");
		$rtype = $params->get("rtype");
		if($campaignId != '') {
			if($commissionGroupId == '') {
				$commissionGroupId = $this->getDefaultCommissionGroupId($campaignId);
			}
			return Pap_Db_Table_Commissions::getInstance()->getAllCommissions('', $commissionGroupId);
		}
		if($rtype != '') {
			return Pap_Db_Table_Commissions::getInstance()->getAllCommissions('', $commissionGroupId);
		}
		throw new Exception($this->_("Campaign ID cannot be empty!"));
	}
	private function addCommissions(Gpf_Data_RecordSet $rs ) {
	    $cTable = Pap_Db_Table_Commissions::getInstance();
        $rsCommissions = $cTable->getAllCommissionsInCampaign('', '');
        $rs->addColumn('commissions', 'N');
        
        $newRs = new Gpf_Data_RecordSet();
        $newRs->setHeader($rs->getHeader());
        
        foreach ($rs as $record) {
        	if($cTable->findCampaignInCommExistsRecords($record->get("id"), $rsCommissions)) {
        		$record->set('commissions', $this->getCommissionsDescription($record->get("id"), $rsCommissions));
        		$newRs->addRecord($record);
        	}
        }

        return $newRs;		
	}
    /**
     *
     * @param Gpf_Data_RecordSet $inputResult
     * @return Gpf_Data_RecordSet
     */
    protected function afterExecute(Gpf_Data_RecordSet $inputResult) {
    	$inputResult->addColumn('commissionOverview', 'N');
    	
        $cTable = Pap_Db_Table_Commissions::getInstance();
        $rsCommissions = $cTable->getAllCommissionsInCampaign();

        foreach ($inputResult as $record) {
        	
            if($cTable->findCampaignInCommExistsRecords($record->get(Pap_Db_Table_Campaigns::ID),
                $rsCommissions)) {
                $record->set('commissionOverview', $cTable->getCommissionsDescription($record->get(Pap_Db_Table_Campaigns::ID),
                    $rsCommissions, $record->get('id')));
            }
        }

        return $inputResult;
    }
	/**
	 * @return Gpf_Data_RecordSet
	 */
	public function getAffiliateCampaigns() {
		$cTable = Pap_Db_Table_Commissions::getInstance();
		$rsCommissions = $cTable->getAllCommissionsInCampaign('', '');

		foreach ($this->campaigns as $campaign) {
			$status = $campaign->get(Pap_Db_Table_Campaigns::STATUS);
			if(!in_array($status, Pap_Affiliates_Promo_Campaigns::getCampaignAllowedStatuses())) {
				continue;
			}

			if ($cTable->findCampaignInCommExistsRecords($campaign->get($this->campaignIDColumnName), $rsCommissions)) {
				if ($this->isAffiliateInCampaign($campaign)) {
					$this->affiliateCampaigns->addRecord($campaign);
				}
			}
		}

		return $this->affiliateCampaigns;
	}
    /**
     * function checks if for this campaigns some commission types are set
     * and if they have some commissions defined.
     * If not, it returns N, if yes it returns Y.
     *
     */
    public function getCommissionStatus() {
        $cTable = Pap_Db_Table_Commissions::getInstance();

        $commissionsExist = $cTable->checkCommissionsExistInCampaign($this->getId());
        if($commissionsExist) {
            return self::CAMPAIGN_COMMISSION_STATUS_DEFINED;
        }

        return self::CAMPAIGN_COMMISSION_STATUS_NOTDEFINED;
    }
    /**
     * @service user_comm_group add
     *
     * @param Gpf_Rpc_Params $params
     * @return Gpf_Rpc_Action
     */
    public function addUser(Gpf_Rpc_Params $params) {
        $action = new Gpf_Rpc_Action($params);
        $action->setInfoMessage($this->_('%s successfully add', $this->getRowName()));
        $campaignId = $action->getParam('campaignId');

        $cTable = Pap_Db_Table_Commissions::getInstance();
        $commissionGroup = $cTable->getDefaultCommissionGroup($campaignId);

        $this->addUserNoRpc($action, $campaignId, Gpf_Session::getAuthUser()->getPapUserId(), $commissionGroup, 'P', $action->getParam('sendNotification') == Gpf::YES);

        return $action;
    }
   /**
     * @return Gpf_Data_RecordSet
     */
    public function getReferralCommissions() {
        $select = new Gpf_SqlBuilder_SelectBuilder();
        $select->select->add('c.'.Pap_Db_Table_Commissions::ID, Pap_Db_Table_Commissions::ID);
        $select->select->add('c.'.Pap_Db_Table_Commissions::TIER, Pap_Db_Table_Commissions::TIER);
        $select->select->add('c.'.Pap_Db_Table_Commissions::SUBTYPE, Pap_Db_Table_Commissions::SUBTYPE);
        $select->select->add('c.'.Pap_Db_Table_Commissions::TYPE, 'commissiontype');
        $select->select->add('c.'.Pap_Db_Table_Commissions::VALUE, 'commissionvalue');
        $select->select->add('c.'.Pap_Db_Table_Commissions::TYPE_ID, 'commtypeid');
        $select->from->add(Pap_Db_Table_Commissions::getName(), 'c');
        $select->from->addInnerJoin(Pap_Db_Table_CommissionTypes::getName(), 'ct',
            'c.'.Pap_Db_Table_Commissions::TYPE_ID.'=ct.'.Pap_Db_Table_CommissionTypes::ID);
        $select->where->add(Pap_Db_Table_CommissionTypes::TYPE, '=', Pap_Db_Transaction::TYPE_REFERRAL);
        $select->orderBy->add(Pap_Db_Table_Commissions::TIER);

        return $select->getAllRows();
    }
    protected function addReferralCommissions(Pap_Affiliates_User $affiliate) {
        try {
            $commissionType = Pap_Db_Table_CommissionTypes::getReferralCommissionType();
        } catch (Gpf_Exception $e) {
            return;
        }
        $referralCommissions = Pap_Db_Table_Commissions::getReferralCommissions();
        if ($commissionType->getStatus() == 'D' || $referralCommissions->getSize() < 1) {
            return;
        }
        if ($commissionType->getApproval() == Pap_Db_CommissionType::APPROVAL_MANUAL) {
            $status = 'P';
        } else {
            $status = $affiliate->getStatus();
        }

        $saveZeroCommissions = $commissionType->getSaveZeroCommissions();

        $iterator = $referralCommissions->getIterator();

        while (($affiliate = $affiliate->getParentUser()) !== null) {
            if ($iterator->valid()) {
                $commission = $iterator->current();
                $this->addTransaction($affiliate->getId(), Pap_Db_Transaction::TYPE_REFERRAL, $commission->get(Pap_Db_Table_Commissions::VALUE), $status, $commission,$saveZeroCommissions);
                $iterator->next();
            } else {
                break;
            }
        }
    }
	private function getAffiliateCommissionGroupId($campaignID) {
		$campaign = new Pap_Db_Campaign();
		$campaign->setId($campaignID);
		$commissionGroupId = $campaign->checkUserIsInCampaign(Gpf_Session::getAuthUser()->getPapUserId());

		if ($commissionGroupId != false) {
			return $commissionGroupId;
		}
		return Pap_Db_Table_Commissions::getInstance()->getDefaultCommissionGroup($campaignID);
	}
 protected function initTransactionSql(Gpf_SqlBuilder_SelectBuilder $transactionsSql) {
     $transactionsSql->from->add(Pap_Db_Table_Transactions::getName(), 't');
     $transactionsSql->from->addInnerJoin(Pap_Db_Table_Commissions::getName(), 'c', 'c.'.Pap_Db_Table_Commissions::TYPE_ID.'=t.'.
         Pap_Db_Table_Transactions::COMMISSIONTYPEID.' AND c.'.Pap_Db_Table_Commissions::TIER.'=t.'.Pap_Db_Table_Transactions::TIER);
     $transactionsSql->where->add('c.'.Pap_Db_Table_Commissions::GROUP_ID, '=',$this->rule->getCommissionGroupId());
     $transactionsSql->where->add('t.'.Pap_Db_Table_Transactions::R_STATUS, '!=', Pap_Common_Constants::STATUS_DECLINED);
     $transactionsSql->where->add('t.'.Pap_Db_Table_Transactions::COMMISSIONTYPEID, '!=', null);
     $transactionsSql->where->add('t.'.Pap_Db_Table_Transactions::PAYOUT_STATUS, '=', Pap_Common_Constants::PSTATUS_UNPAID);
     $transactionsSql->where->add('t.'.Pap_Db_Table_Transactions::R_TYPE, 'NOT IN', array(Pap_Db_Transaction::TYPE_REFUND, Pap_Db_Transaction::TYPE_CHARGE_BACK));
 }
    /**
     * deletes tier commission
     * if deleteType == exact, it will delete only given tier
     * if deleteType == above, it will delete given tier and all above
     *
     * @param unknown_type $fromTier
     * @param unknown_type $subType
     * @param unknown_type $commGroupId
     * @param unknown_type $commTypeId
     * @param unknown_type $deleteType
     */
    public function deleteUnusedCommissions($fromTier, $subType, $commGroupId, $commTypeId, $deleteType = 'extact') {
    	$deleteBuilder = new Gpf_SqlBuilder_DeleteBuilder();
    	$deleteBuilder->from->add(Pap_Db_Table_Commissions::getName());
    	$deleteBuilder->where->add('subtype', '=', $subType);
    	if($deleteType == 'above') {
    		$deleteBuilder->where->add('tier', '>', $fromTier);
    	} else {
    		$deleteBuilder->where->add('tier', '=', $fromTier);
    	}
	    $deleteBuilder->where->add('commtypeid', '=', $commTypeId);
    	$deleteBuilder->where->add('commissiongroupid', '=', $commGroupId);
    	
    	$deleteBuilder->delete();
	}
    private function getCommission() {
        $selectBuilder = new Gpf_SqlBuilder_SelectBuilder();
        $selectBuilder->select->add(Pap_Db_Table_Commissions::ID, Pap_Db_Table_Commissions::ID);
        $selectBuilder->select->add(Pap_Db_Table_Commissions::TIER, Pap_Db_Table_Commissions::TIER);
        $selectBuilder->select->add(Pap_Db_Table_Commissions::SUBTYPE, Pap_Db_Table_Commissions::SUBTYPE);
        $selectBuilder->select->add(Pap_Db_Table_Commissions::TYPE, Pap_Db_Table_Commissions::TYPE);
        $selectBuilder->select->add(Pap_Db_Table_Commissions::VALUE, Pap_Db_Table_Commissions::VALUE);
        $selectBuilder->select->add(Pap_Db_Table_Commissions::TYPE_ID, Pap_Db_Table_Commissions::TYPE_ID);
        $selectBuilder->select->add(Pap_Db_Table_Commissions::GROUP_ID, Pap_Db_Table_Commissions::GROUP_ID);
        $selectBuilder->from->add(Pap_Db_Table_Commissions::getName());

        return $selectBuilder;
    }
    /**
     * @service commission_group read
     *
     * @param Gpf_Rpc_Params $params
     * @return Gpf_Rpc_Form
     */
    public function getAllCommissionGroupsForCampaign(Gpf_Rpc_Params $params) {
        $form = new Gpf_Rpc_Form($params);

        $select = $this->getCommissionGroupsSelect($params->get('campaignid'));
        try {
            $commissionGroupsData = $select->getAllRows();
        } catch (Gpf_DbEngine_NoRowException $e) {
            return $form;
        }

        $cTable = Pap_Db_Table_Commissions::getInstance();
        $rsCommissions = $cTable->getAllCommissionsInCampaign();

        $commissionGroups = new Gpf_Data_RecordSet();
        $commissionGroups->setHeader(array('id', 'name', 'commissiongroupvalue'));

        foreach ($commissionGroupsData as $commissionGroupData) {
            $commissionGroups->add(array($commissionGroupData->get(Pap_Db_Table_CommissionGroups::ID),
            Pap_Db_Table_CommissionGroups::NAME,
            $commissionGroupData->set('commissiongroupvalue', $cTable->getCommissionsDescription($commissionGroupData->get(Pap_Db_Table_Campaigns::ID),
            $rsCommissions, $commissionGroupData->get(Pap_Db_Table_CommissionGroups::ID)))));
        }

        $form->setField('commissionGroups', '', $commissionGroupsData->toObject());

        return $form;
    }
    private function addCampaignDetails(Gpf_Data_RecordSet $inputResult) {
        $inputResult->addColumn('campaigndetails');

        $commissionsTable = Pap_Db_Table_Commissions::getInstance();
        $allCommissions = $commissionsTable->getAllCommissionsInCampaign();
        $campaignCommissions = array();

        foreach ($inputResult as $record) {
            $campaignId = $record->get('campaignid');
            if (!array_key_exists($campaignId, $campaignCommissions)) {
                $campaign = new Pap_Db_Campaign();
                $campaign->setId($campaignId);
                $commissionGroupId = $campaign->checkUserIsInCampaign(Gpf_Session::getAuthUser()->getPapUserId());
                if ($commissionGroupId == false) {
                    $commissionGroupId = null;
                }
                $campaignCommissions[$campaignId] =  $commissionsTable->getCommissionsDescription($campaignId,$allCommissions,$commissionGroupId);
            }
            $record->set('campaigndetails', $campaignCommissions[$campaignId]);
        }
        return $inputResult;
    }
    /**
     * @service campaign read
     *
     * @param Gpf_Rpc_Params $params
     */
    public function getPrivateAndManualCampaigns(Gpf_Rpc_Params $params) {
        $selectBuilder = $this->getCampaignsSelect();
        $selectBuilder->select->add(self::TYPE, 'type');
        $selectBuilder->where->add(self::TYPE, 'IN', array(Pap_Db_Campaign::CAMPAIGN_TYPE_ON_INVITATION, Pap_Db_Campaign::CAMPAIGN_TYPE_PUBLIC_MANUAL));
        $selectBuilder->orderBy->add(self::NAME);
        $campaigns = $selectBuilder->getAllRows();
         
        $cTable = Pap_Db_Table_Commissions::getInstance();
        $rsCommissions = $cTable->getAllCommissionsInCampaign();
        $campaigns->addColumn('commissions', '');

        foreach ($campaigns as $campaign) {
            $campaign->set('type', Pap_Common_Constants::getCampaignTypeAsText($campaign->get('type')));
            if ($cTable->findCampaignInCommExistsRecords($campaign->get('id'), $rsCommissions)) {
                $campaign->set('commissions', $cTable->getCommissionsDescription($campaign->get('id'), $rsCommissions));
            }
        }

        return $campaigns;
    }
 private function disableRecurringCommissionInCampaigns() {
     Pap_Db_Table_Commissions::getInstance()->deleteAllSubtypeCommissions(Pap_Db_Table_Commissions::SUBTYPE_RECURRING);
 }