function processTransaction(address _contributor, uint256 _amount) internal {
    uint256 newContribution = _amount;
    var (communityTokenAmount, communityEthAmount) = calculateCommunity(_contributor, newContribution);
    
    var (crowdsaleTokenAmount, crowdsaleEthAmount) = calculateCrowdsale(newContribution.sub(communityEthAmount));
    
    uint256 tokenAmount = crowdsaleTokenAmount.add(communityTokenAmount);
    assert(tokenAmount > 0);
    
    token.mintTokens(_contributor, tokenAmount);                              
    
    contributorList[_contributor].tokensIssued = contributorList[_contributor].tokensIssued.add(tokenAmount);                
    
    newContribution = crowdsaleEthAmount.add(communityEthAmount);
    contributorList[_contributor].contributionAmount = contributorList[_contributor].contributionAmount.add(newContribution);
    ethRaisedWithoutCompany = ethRaisedWithoutCompany.add(newContribution);                              
    tokenSold = tokenSold.add(tokenAmount);                                  
    
    uint256 refundAmount = _amount.sub(newContribution);
    if (refundAmount > 0) {
      _contributor.transfer(refundAmount);                                   
    }
    companyAddress.transfer(newContribution);                                
  }