/**
  *
  * @return Pap_Db_UserInCommissionGroup
  */
 protected function getUserCommissionGroup() {
     if($this->userInGroup !== null) {
         return $this->userInGroup;
     }
     try {
         $userInGroup = Pap_Db_Table_UserInCommissionGroup::getInstance()->getUserCommissionGroup(
             $this->getCurrentUserId(), $this->transaction->getCampaignId());
     } catch (Gpf_DbEngine_TooManyRowsException $e) {
         Gpf_Log::error(sprintf('Database not in consistent state. User %s has many commission groups', $userId));
         Pap_Db_Table_UserInCommissionGroup::removeUserFromCampaignGroups($userId, $campaignId);
         $userInGroup = new Pap_Db_UserInCommissionGroup();
         $userInGroup->setStatus(Pap_Features_PerformanceRewards_Condition::STATUS_APPROVED);
         $userInGroup->setUserId($userId);
     }
     return $this->userInGroup = $userInGroup;
 }
    /**
     *
     * @return Pap_Db_UserInCommissionGroup
     */
    public function getUserCommissionGroup($userId, $campaignId) {
        $selectBuilder = new Gpf_SqlBuilder_SelectBuilder();
        $selectBuilder->select->addAll(Pap_Db_Table_UserInCommissionGroup::getInstance(), 'ucg');

        $selectBuilder->from->add(Pap_Db_Table_UserInCommissionGroup::getName(), 'ucg');
        $selectBuilder->from->addInnerJoin(Pap_Db_Table_CommissionGroups::getName(), 'cg',
        'ucg.'.Pap_Db_Table_UserInCommissionGroup::COMMISSION_GROUP_ID .'='. 'cg.'.Pap_Db_Table_CommissionGroups::ID);
        
        $selectBuilder->where->add('ucg.'.Pap_Db_Table_UserInCommissionGroup::USER_ID, '=', $userId);
        $selectBuilder->where->add('cg.'.Pap_Db_Table_CommissionGroups::CAMPAIGN_ID, '=', $campaignId);
                
        $userInGroup = new Pap_Db_UserInCommissionGroup();
        $userInGroup->setStatus(Pap_Features_PerformanceRewards_Condition::STATUS_APPROVED);
        try {
            $record = $selectBuilder->getOneRow();
            $userInGroup->fillFromRecord($record);
            $userInGroup->setPersistent(true);
        } catch (Gpf_DbEngine_NoRowException $e) {
            $userInGroup->setUserId($userId);
            $userInGroup->setCommissionGroupId(Pap_Db_Table_Campaigns::getInstance()->getDefaultCommissionGroup($campaignId)->getId());
        }
        return $userInGroup;
    }
 public function init() {
     $this->setTable(Pap_Db_Table_UserInCommissionGroup::getInstance());
     parent::init();
 }
    /**
     * @param Pap_Db_Transaction $transaction
     * @return Pap_Db_Commission
     */
    protected function getCommissionForTransaction(Pap_Db_Transaction $transaction) {
        $commission = new Pap_Db_Commission();
        $commission->setCommissionTypeId($transaction->getCommissionTypeId());
        $commission->setGroupId($transaction->getCommissionGroupId());
        $commission->setTier($transaction->getTier());
        try {
            $commission->loadFromData(array(Pap_Db_Table_Commissions::TYPE_ID, Pap_Db_Table_Commissions::GROUP_ID));
        } catch (Gpf_Exception $e) {
            $userInGroup = Pap_Db_Table_UserInCommissionGroup::getInstance()->getUserCommissionGroup($transaction->getUserId(), $transaction->getCampaignId());
            $commission->setGroupId($userInGroup->getCommissionGroupId());
            try {
                $commission->loadFromData(array(Pap_Db_Table_Commissions::TYPE_ID, Pap_Db_Table_Commissions::GROUP_ID, Pap_Db_Table_Commissions::TIER));
            } catch (Gpf_Exception $e) {
                throw new Gpf_Exception($this->_('Unable to find commision for transaction id=' . $transaction->getId()));
            }
        }

        return $commission;
    }