public void TestMarketplacePayment()
        {
            var payment = new MarketPayment();
            payment.ParentId = _testParentId;
            payment.Amount = 1000.5M;
            payment.MySitterHubFee = Convert.ToDecimal(1000.5*.1);
            payment.SitterId = _testSitterId;

            MakePaymentResultSM ret = _paymentManager.MakeMarketplaceTransaction(payment);

            Assert.IsTrue(ret.IsSuccess, "error: " + ret.Error);
        }
        public MakePaymentResultSM FinalizePayment(FinalizeJobPaymentSM finalize)
        {
            // STEP - Save Finalize Payment
            Job job = _jobDal.GetById(finalize.JobId);
            job.Duration = finalize.Duration;
            
            //job.Start = finalize.Start; //TODO: set start time.
            ValidateFinalize(job, finalize);
            job.SetFinalPayment(finalize);
            _jobDal.Update(job);

            // STEP - Call payment gateway to make payment
            var sm = new MarketPayment();
            sm.Amount = job.FinalPayment.PaidByParent;
            sm.MySitterHubFee = job.FinalPayment.MySitterHubFee();
            sm.ParentId = job.ParentId;
            sm.SitterId = job.AcceptedSitter().SitterId;
            MakePaymentResultSM ret = _paymentManager.MakeMarketplaceTransaction(sm);
            return ret;
        }
        public MakePaymentResultSM MakeMarketplaceTransaction(MarketPayment sm)
        {
            var result = new MakePaymentResultSM();

            Customer cust = FindCustomer(sm.ParentId.ToString());
            if (cust == null)
            {
                result.IsSuccess = false;
                result.Error = "Customer not found " + sm.ParentId;
                return result;
            }
            if (cust.DefaultPaymentMethod == null || cust.DefaultPaymentMethod.Token == null)
            {
                result.IsSuccess = false;
                result.Error = "Customer default payment method not found ";
                return result;
            }

            var sitter = FindMerchant(sm.SitterId);
            if (sitter == null)
            {
                result.IsSuccess = false;
                result.Error = "Sitter not found " + sm.SitterId;
                return result;
            }
            if (!sitter.IsSubMerchant)
                throw new Exception("sitter is not submerchant");

            var request = new TransactionRequest
            {
                CustomerId = sm.ParentId.ToString(),
                PaymentMethodToken = cust.DefaultPaymentMethod.Token,
                MerchantAccountId = sitter.Id,
                Amount = sm.Amount,
                ServiceFeeAmount = sm.MySitterHubFee,
                Channel = LogicConstants.braintreeChannel,
            };

            Result<Transaction> saleResult = _gateway.Transaction.Sale(request);

            if (saleResult.IsSuccess())
            {
                result.IsSuccess = true;
            }
            else
            {
                if (saleResult.Errors != null && saleResult.Errors.All().Count > 0)
                {
                    result.Error = string.Join("~~", saleResult.Errors.All().Select(m => m.Message));
                }
            }

            return result;
        }