public MpContactDonor CreateDonor(CheckScannerCheck checkDetails) { MpContactDonor mpContactDonorById = null; // If scanned check has a donor id, try to use it to lookup the donor if (checkDetails.DonorId != null && checkDetails.DonorId > 0) { mpContactDonorById = _donorService.GetContactDonorForDonorId(checkDetails.DonorId.Value); } // Get the MpContactDonor and info based off of the account and routing number to see if we need to create a new one var contactDonorByAccount = _donorService.GetContactDonorForDonorAccount(checkDetails.AccountNumber, checkDetails.RoutingNumber) ?? new MpContactDonor(); // if find by mpContact donor id is used then mpContact donor found by id matches mpContact donor // found by account and account has stripe token if (mpContactDonorById != null && mpContactDonorById.ContactId == contactDonorByAccount.ContactId && contactDonorByAccount.Account.HasPaymentProcessorInfo()) { return(contactDonorByAccount); } // if find by mpContact donor id is not used then mpContact donor // found by account has stripe token else if (mpContactDonorById == null && contactDonorByAccount.Account != null && contactDonorByAccount.Account.HasPaymentProcessorInfo()) { return(contactDonorByAccount); } var contactDonor = mpContactDonorById ?? contactDonorByAccount; var account = _mpDonorService.DecryptCheckValue(checkDetails.AccountNumber); var routing = _mpDonorService.DecryptCheckValue(checkDetails.RoutingNumber); var token = _paymentService.CreateToken(account, routing, checkDetails.Name1); var encryptedKey = _mpDonorService.CreateHashedAccountAndRoutingNumber(account, routing); contactDonor.Details = new MpContactDetails { DisplayName = checkDetails.Name1, Address = new MpPostalAddress { Line1 = checkDetails.Address.Line1, Line2 = checkDetails.Address.Line2, City = checkDetails.Address.City, State = checkDetails.Address.State, PostalCode = checkDetails.Address.PostalCode } }; var newDonor = _donorService.CreateOrUpdateContactDonor(contactDonor, string.Empty, string.Empty, string.Empty, string.Empty, null, DateTime.Now); newDonor.Account = new MpDonorAccount { AccountNumber = account, RoutingNumber = routing, Type = AccountType.Checking, EncryptedAccount = encryptedKey, Token = token.Id }; return(newDonor); }