Inheritance: extends Gpf_Object, implements IteratorAggregate
	private function getPaidData(Gpf_Rpc_FilterCollection $filters) {
		$select = new Gpf_SqlBuilder_SelectBuilder();
		$select->select->add("SUM(amount)", "paid");
		$select->from->add(Pap_Db_Table_Payouts::getName(), "p");
		$select->from->addInnerJoin(Pap_Db_Table_PayoutsHistory::getName(), "ph", "p.payouthistoryid = ph.payouthistoryid");
		$filters->addTo($select->where);		
		
		Gpf_Plugins_Engine::extensionPoint('AffiliateNetwork.modifyWhere', 
        new Gpf_Common_SelectBuilderCompoundRecord($select, new Gpf_Data_Record(array('columnPrefix'), array('ph'))));
		
		$row = $select->getOneRow();

		return $this->checkNullValue($row->get("paid"));
	}
    /**
     *
     * @param $message
     * @param $simulation
     * @return Gpf_Rpc_Form
     */
    private function action(Gpf_Rpc_Params $params, $message = '', $simulation = false) {
        $data = new Gpf_Rpc_Data($params);

        $filters = new Gpf_Rpc_FilterCollection($params);
        if ($filters->getFilterValue('reachedCondition') == Gpf::YES) {
            $data->setValue('message', $message);
            return $data;
        }

        $compressedCommissionProcesor = new Pap_Features_CompressedCommissionPlacementModel_Processor();
        $output = $compressedCommissionProcesor->recalculate($params->get('filters'), $simulation);

        $data->setValue('message', $output);
        return $data;
    }
    private function getSubaffiliatesCounts($ids) {
        $results = array();
        $condition = '';

        $rs = new Gpf_Data_RecordSet();
        $selectBuilder = new Gpf_SqlBuilder_SelectBuilder();
        $selectBuilder->select->add('count(u.'.Pap_Db_Table_Users::ID.')', 'count');
        $selectBuilder->select->add('u.'.Pap_Db_Table_Users::PARENTUSERID, Pap_Db_Table_Users::PARENTUSERID);

        $selectBuilder->from->add(Pap_Db_Table_Users::getName(), 'u');
        $selectBuilder->from->addInnerJoin(Gpf_Db_Table_Users::getName(), 'gu', 'u.'.Pap_Db_Table_Users::ACCOUNTUSERID.' = gu.'.Gpf_Db_Table_Users::ID);
        $selectBuilder->from->addInnerJoin(Gpf_Db_Table_AuthUsers::getName(), 'au', 'gu.'.Gpf_Db_Table_Users::AUTHID .' = au.'.Gpf_Db_Table_AuthUsers::ID);

        $selectBuilder->where->add('u.'.Pap_Db_Table_Users::PARENTUSERID, 'in', $ids);
        $selectBuilder->where->add('u.'.Pap_Db_Table_Users::DELETED, '=', Gpf::NO);
		$selectBuilder->where->add('gu.'.Gpf_Db_Table_Users::STATUS, 'in', array(Gpf_Db_User::APPROVED, Gpf_Db_User::PENDING));
        $this->filterCollection->addTo($selectBuilder->where);

        $selectBuilder->groupBy->add('u.'.Pap_Db_Table_Users::PARENTUSERID);
        
        $rs->load($selectBuilder);

        foreach($rs as $record) {
            $results[$record->get(Pap_Db_Table_Users::PARENTUSERID)] = $record->get('count');
        }

        return $results;
    }
    /**
     * @return Gpf_SqlBuilder_SelectBuilder
     */
    protected function createSelectBuilder() {
        $filters = new Gpf_Rpc_FilterCollection($this->params);
        
        $selectBuilder = new Gpf_SqlBuilder_SelectBuilder();
        $selectBuilder->select->add('v.'.Gpf_Db_Table_Views::ID, self::ID);
        $selectBuilder->select->add('v.'.Gpf_Db_Table_Views::NAME, self::VALUE);
        $selectBuilder->from->add(Gpf_Db_Table_Views::getName(), 'v');

        $whereCond = new Gpf_SqlBuilder_CompoundWhereCondition();
        $whereCond->add('v.' . Gpf_Db_Table_Views::ACCOUNTUSERID, '=', Gpf_Session::getAuthUser()->getUserData()->get(Gpf_Db_Table_Users::ID));
        $whereCond->add('v.' . Gpf_Db_Table_Views::ACCOUNTUSERID, '=', '', 'OR');
        
        $selectBuilder->where->addCondition($whereCond);
        if ($filters->isFilter('viewtype')) {
            $selectBuilder->where->add('v.' . Gpf_Db_Table_Views::VIEWTYPE, '=', $filters->getFilterValue('viewtype'));
        }
        return $selectBuilder;
    }
    /**
     * @param Gpf_SqlBuilder_SelectBuilder $select
     * @param Gpf_Rpc_FilterCollection $allFilters
     */
    private function addOrderIdFilterToSelect(Gpf_SqlBuilder_SelectBuilder $select, Gpf_Rpc_FilterCollection $allFilters) {
        $filter = $this->getFirstElement($allFilters->getFilter('orderid'));
        if ($filter === null) {
            return;
        }

        $orderIds = preg_split("/[,;(\n)]/", $filter->getValue());
        $condition = new Gpf_SqlBuilder_CompoundWhereCondition();

        for ($i = 0; $i < count($orderIds); $i++) {
            if(trim($orderIds[$i]) != '') {
                $condition->add('orderid', 'LIKE', '%'.trim($orderIds[$i]).'%', 'OR');
            }
        }

        $select->where->addCondition($condition);
    }
	private function setActionAndCommissionId(Gpf_Rpc_FilterCollection $filters) {
	    $this->action = $filters->getFilterValue('action');
	    $this->commTypeId = $filters->getFilterValue('commtypeid');
	}
    /**
     * @param Gpf_Rpc_Params $params
     * @return Pap_Stats_Params
     */
    private function init(Gpf_Rpc_Params $params) {
        $filterCollection = new Gpf_Rpc_FilterCollection($params);

        $this->chartType = $filterCollection->getFilterValue("chartType");
        $this->timeGroupBy = $filterCollection->getFilterValue("groupBy");

        try {
            $this->dataType1 = $this->getDataType($filterCollection->getFilterValue("dataType1"));
        } catch (Gpf_Exception $e) {
            $this->dataType1 = $this->getDataType($this->getDefaultDataType());
        }

        try {
            $this->dataType2 = $this->getDataType($filterCollection->getFilterValue("dataType2"));
        } catch (Gpf_Exception $e) {
            $this->dataType2 = null;
        }
        
        $this->initStatParams($filterCollection);
    }
    /**
     * @service pay_affiliate read
     */
    public function markTransactionsAsPaymentPending(Gpf_Rpc_Params $params) {
        $this->clearPaymentPendingMark();

        $action = new Gpf_Rpc_Action($params);

        $userIds = $this->getUserIdsFromFilter($action);

        $filters = new Gpf_Rpc_FilterCollection($params);

        $filterIterator = $filters->getIterator();

        while($filterIterator->valid()) {
            $filter = $filterIterator->current();
            if(!substr_compare($filter->getCode(), Pap_Merchants_Payout_PayAffiliatesGrid::TANSACTIONS_TABLE_ALIAS.'.data', 0, strlen($filter->getCode())-1)) {
                $suffix = substr($filter->getCode(), strlen($filter->getCode())-1);
                $filter->setCode('data'.$suffix);
            }
            $filterIterator->next();
        }

        $numRows = $this->updateSelectedRows($filters, $userIds);

        if ($numRows == 0) {
            $action->setErrorMessage($this->_('Nobody from selected affiliates have approved commissions. No commissions will be paid.'));
            $action->addError();
            return $action;
        }

        $nonZeroUsersCount = $this->getNumberOfNonZeroPaidAffiliates($userIds);
        if ((count($userIds) - $nonZeroUsersCount) > 0) {
            $action->setErrorMessage($this->_('%s of selected affiliates have no approved or zero commissions. No commissions will be paid to them.', (count($userIds) - $nonZeroUsersCount)));
            $action->addError();
            return $action;
        }

        $action->addOk();

        return $action;
    }
    /**
     * @param array $filtersArray
     * @return array
     */
    private function getOrderIdsFromFilters($filtersArray = null) {
        if (is_null($filtersArray)) {
            return array();
        }
        $filterCollection = new Gpf_Rpc_FilterCollection();
        foreach ($filtersArray as $filter) {
            $filterCollection->add($filter);
        }

        $filters = $filterCollection->getFilter('orderid');
        if (count($filters) == 0) {
            return array();
        }
        $filter = $filters[0];

        return array_map('trim', preg_split("/[,;(\n)]/", $filter->getValue()));
    }
 private function removeAffiliateFilter() {
     $tempFilterCollection = new Gpf_Rpc_FilterCollection();
     foreach ($this->filterCollection as $filter) {
         if ($filter->getCode() == 'affiliate' || $filter->getCode() == 'onlyTopAffiliates') {
             continue;
         }
         $tempFilterCollection->add(array($filter->getCode(), $filter->getRawOperator()->getCode(), $filter->getValue()));
     }
     $this->filterCollection = $tempFilterCollection;
 }