예제 #1
0
        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);
        }