Example #1
0
        public InvoiceItemServiceTest(MockHttpClientFixture mockHttpClientFixture)
            : base(mockHttpClientFixture)
        {
            this.service = new InvoiceItemService();

            this.createOptions = new InvoiceItemCreateOptions
            {
                Amount     = 123,
                Currency   = "usd",
                CustomerId = "cus_123",
            };

            this.updateOptions = new InvoiceItemUpdateOptions
            {
                Metadata = new Dictionary <string, string>
                {
                    { "key", "value" },
                },
            };

            this.listOptions = new InvoiceItemListOptions
            {
                Limit = 1,
            };
        }
        public void CreatePending_ApplyAllPrices_ItemCreatedWithAllPricesApplied()
        {
            var id        = Guid.NewGuid();
            var jobItemId = _jobItemForCreatePendingId;

            var invoiceItemRepositoryMock = MockRepository.GenerateMock <IInvoiceItemRepository>();

            invoiceItemRepositoryMock.Stub(x => x.JobItemHasPendingInvoiceItem(jobItemId)).Return(false);
            invoiceItemRepositoryMock.Expect(x => x.CreatePendingItem(null)).IgnoreArguments();
            _invoiceItemService = InvoiceItemServiceFactory.Create(
                _userContext,
                CompanyDetailsRepositoryTestHelper.GetCompanyDetailsRepository_StubsApplyAllPrices_ReturnsTrue(),
                MockRepository.GenerateStub <IInvoiceRepository>(),
                invoiceItemRepositoryMock,
                JobItemRepositoryTestHelper.GetJobItemRepository_StubsGetById_ReturnsJobItem(_jobItemForCreatePending),
                QuoteItemRepositoryTestHelper.GetQuoteItemRepository_StubsGetQuoteItemForJobItem_ReturnsQuoteItem(jobItemId, _quoteItemForCreatePending),
                MockRepository.GenerateStub <IListItemRepository>());
            CreatePending(id, jobItemId);
            invoiceItemRepositoryMock.VerifyAllExpectations();
            Assert.AreNotEqual(Guid.Empty, _savedPendingItem.Id);
            Assert.IsNotNull(_savedPendingItem.JobItem);
            Assert.AreEqual(_quoteItemForCreatePending.JobItem.Instrument.ToString(), _savedPendingItem.Description);
            Assert.AreEqual(_quoteItemForCreatePending.Quote.OrderNumber, _savedPendingItem.OrderNo);
            Assert.AreEqual(_quoteItemForCreatePending.Calibration, _savedPendingItem.CalibrationPrice);
            Assert.AreEqual(_quoteItemForCreatePending.Labour, _savedPendingItem.RepairPrice);
            Assert.AreEqual(_quoteItemForCreatePending.Parts, _savedPendingItem.PartsPrice);
            Assert.AreEqual(_quoteItemForCreatePending.Carriage, _savedPendingItem.CarriagePrice);
            Assert.AreEqual(_quoteItemForCreatePending.Investigation, _savedPendingItem.InvestigationPrice);
        }
        public void CreatePending_QuoteItemPrepared_DomainValidationExceptionThrown()
        {
            var id        = Guid.NewGuid();
            var jobItemId = _jobItemForCreatePendingId;

            _quoteItemForCreatePending.Status =
                new ListItem
            {
                Id       = Guid.NewGuid(),
                Name     = "Quote Prepared",
                Type     = ListItemType.StatusQuotedPrepared,
                Category = new ListItemCategory {
                    Id = Guid.NewGuid(), Name = "Job Item Status", Type = ListItemCategoryType.JobItemStatus
                }
            };

            _invoiceItemService = InvoiceItemServiceFactory.Create(
                _userContext,
                MockRepository.GenerateStub <ICompanyDetailsRepository>(),
                MockRepository.GenerateStub <IInvoiceRepository>(),
                InvoiceItemRepositoryTestHelper.GetInvoiceItemRepository_StubsJobItemHasPendingInvoiceItem_ReturnsFalse(jobItemId),
                JobItemRepositoryTestHelper.GetJobItemRepository_StubsGetById_ReturnsJobItem(_jobItemForCreatePending),
                QuoteItemRepositoryTestHelper.GetQuoteItemRepository_StubsGetQuoteItemForJobItem_ReturnsQuoteItem(jobItemId, _quoteItemForCreatePending),
                MockRepository.GenerateStub <IListItemRepository>());
            CreatePending(id, jobItemId);
            Assert.IsTrue(_domainValidationException.ResultContainsMessage(Messages.QuoteStatusInvalid));
        }
 public PaymentFunctions(CustomerService customerService,
                         PaymentMethodService paymentMethodService,
                         InvoiceItemService invoiceItemService,
                         InvoiceService invoiceService)
 {
     _customerService      = customerService;
     _paymentMethodService = paymentMethodService;
     _invoiceItemService   = invoiceItemService;
     _invoiceService       = invoiceService;
 }
Example #5
0
 public static void perform()
 {
     new Thread(() =>
     {
         Thread.CurrentThread.IsBackground = true;
         Console.WriteLine("Thread running......");
         InvoiceService.perform();
         InvoiceItemService.perform();
         PaymentService.perform();
         MemberShipService.perform();
     }).Start();
 }
        public void CreateFromPending_ValidDetailsWhenInvoiceHasOneItem_InvoiceItemSuccessfullyCreated()
        {
            var id                 = Guid.NewGuid();
            var invoiceId          = _invoiceForCreateFromPendingId;
            var description        = "Druck, DPI601IS, Digital Pressure Indicator";
            var calibrationPrice   = 25;
            var repairPrice        = 38;
            var partsPrice         = 200;
            var carriagePrice      = 30;
            var investigationPrice = 0;

            var invoiceRepositoryStub = MockRepository.GenerateStub <IInvoiceRepository>();

            invoiceRepositoryStub.Stub(x => x.GetInvoiceItemCount(invoiceId)).Return(1);
            invoiceRepositoryStub.Stub(x => x.GetById(invoiceId)).Return(_invoiceForCreateFromPending);
            var invoiceItemRepositoryMock = MockRepository.GenerateMock <IInvoiceItemRepository>();

            invoiceItemRepositoryMock.Expect(x => x.Create(null)).IgnoreArguments();
            var jobItemRepositoryMock = MockRepository.GenerateMock <IJobItemRepository>();

            jobItemRepositoryMock.Expect(x => x.EmitItemHistory(
                                             _userContext.GetCurrentUser(), _jobItemForCreateFromPendingId, 0, 0, "Item invoiced on IR2000", ListItemType.StatusInvoiced, ListItemType.WorkTypeAdministration));
            jobItemRepositoryMock.Expect(x => x.Update(_jobItemForCreateFromPending)).IgnoreArguments();
            var listItemRepositoryStub = MockRepository.GenerateStub <IListItemRepository>();

            listItemRepositoryStub.Stub(x => x.GetByType(ListItemType.StatusInvoiced)).Return(new ListItem {
                Id = Guid.NewGuid(), Name = "Invoiced", Type = ListItemType.StatusInvoiced
            });

            _invoiceItemService = InvoiceItemServiceFactory.Create(
                _userContext,
                MockRepository.GenerateStub <ICompanyDetailsRepository>(),
                invoiceRepositoryStub,
                invoiceItemRepositoryMock,
                jobItemRepositoryMock,
                MockRepository.GenerateStub <IQuoteItemRepository>(),
                listItemRepositoryStub);
            CreateFromPending(id, invoiceId, description, calibrationPrice, repairPrice, partsPrice, carriagePrice, investigationPrice, _jobItemForCreateFromPending);
            invoiceItemRepositoryMock.VerifyAllExpectations();
            jobItemRepositoryMock.VerifyAllExpectations();
            Assert.AreNotEqual(Guid.Empty, _savedInvoiceItemFromPending.Id);
            Assert.AreEqual(2, _savedInvoiceItemFromPending.ItemNo);
            Assert.AreEqual(description, _savedInvoiceItemFromPending.Description);
            Assert.AreEqual(calibrationPrice, _savedInvoiceItemFromPending.CalibrationPrice);
            Assert.AreEqual(repairPrice, _savedInvoiceItemFromPending.RepairPrice);
            Assert.AreEqual(partsPrice, _savedInvoiceItemFromPending.PartsPrice);
            Assert.AreEqual(carriagePrice, _savedInvoiceItemFromPending.CarriagePrice);
            Assert.AreEqual(investigationPrice, _savedInvoiceItemFromPending.InvestigationPrice);
            Assert.IsNotNull(_savedInvoiceItemFromPending.Invoice);
            Assert.IsNotNull(_savedInvoiceItemFromPending.JobItem);
            Assert.AreEqual(ListItemType.StatusInvoiced, _jobItemForCreateFromPending.Status.Type);
            Assert.IsTrue(_jobItemForCreateFromPending.IsInvoiced);
        }
 public void GetInvoiceItems_UserHasInsufficientSecurityClearance_DomainValidationExceptionThrown()
 {
     _invoiceItemService = InvoiceItemServiceFactory.Create(
         TestUserContext.Create("*****@*****.**", "Graham Robertson", "Operations Manager", UserRole.Public),
         MockRepository.GenerateStub <ICompanyDetailsRepository>(),
         MockRepository.GenerateStub <IInvoiceRepository>(),
         MockRepository.GenerateStub <IInvoiceItemRepository>(),
         MockRepository.GenerateStub <IJobItemRepository>(),
         MockRepository.GenerateStub <IQuoteItemRepository>(),
         MockRepository.GenerateStub <IListItemRepository>());
     GetInvoiceItems();
     Assert.IsTrue(_domainValidationException.ResultContainsMessage(Messages.InsufficientSecurityClearance));
 }
        public void CreatePending_InvalidJobItemId_ArgumentExceptionThrown()
        {
            var id        = Guid.NewGuid();
            var jobItemId = Guid.NewGuid();

            _invoiceItemService = InvoiceItemServiceFactory.Create(
                _userContext,
                MockRepository.GenerateStub <ICompanyDetailsRepository>(),
                MockRepository.GenerateStub <IInvoiceRepository>(),
                InvoiceItemRepositoryTestHelper.GetInvoiceItemRepository_StubsJobItemHasPendingInvoiceItem_ReturnsFalse(jobItemId),
                JobItemRepositoryTestHelper.GetJobItemRepository_StubsGetById_ReturnsNull(jobItemId),
                QuoteItemRepositoryTestHelper.GetQuoteItemRepository_StubsGetQuoteItemForJobItem_ReturnsQuoteItem(jobItemId, _quoteItemForCreatePending),
                MockRepository.GenerateStub <IListItemRepository>());
            CreatePending(id, jobItemId);
        }
        public void CreatePending_JobItemAlreadyHasPendingItem_DomainValidationExceptionThrown()
        {
            var id        = Guid.NewGuid();
            var jobItemId = _jobItemForCreatePendingId;

            _invoiceItemService = InvoiceItemServiceFactory.Create(
                TestUserContext.Create("*****@*****.**", "Graham Robertson", "Operations Manager", UserRole.Public),
                MockRepository.GenerateStub <ICompanyDetailsRepository>(),
                MockRepository.GenerateStub <IInvoiceRepository>(),
                InvoiceItemRepositoryTestHelper.GetInvoiceItemRepository_StubsJobItemHasPendingInvoiceItem_ReturnsTrue(jobItemId),
                JobItemRepositoryTestHelper.GetJobItemRepository_StubsGetById_ReturnsJobItem(_jobItemForCreatePending),
                QuoteItemRepositoryTestHelper.GetQuoteItemRepository_StubsGetQuoteItemForJobItem_ReturnsQuoteItem(jobItemId, _quoteItemForCreatePending),
                MockRepository.GenerateStub <IListItemRepository>());
            CreatePending(id, jobItemId);
            Assert.IsTrue(_domainValidationException.ResultContainsMessage(Messages.JobItemHasPendingItem));
        }
Example #10
0
        public void CreatePending_QuoteItemNotRaised_DomainValidationExceptionThrown()
        {
            var id        = Guid.NewGuid();
            var jobItemId = _jobItemForCreatePendingId;

            _invoiceItemService = InvoiceItemServiceFactory.Create(
                _userContext,
                MockRepository.GenerateStub <ICompanyDetailsRepository>(),
                MockRepository.GenerateStub <IInvoiceRepository>(),
                InvoiceItemRepositoryTestHelper.GetInvoiceItemRepository_StubsJobItemHasPendingInvoiceItem_ReturnsFalse(jobItemId),
                JobItemRepositoryTestHelper.GetJobItemRepository_StubsGetById_ReturnsJobItem(_jobItemForCreatePending),
                QuoteItemRepositoryTestHelper.GetQuoteItemRepository_StubsGetQuoteItemForJobItem_ReturnsNull(jobItemId),
                MockRepository.GenerateStub <IListItemRepository>());
            CreatePending(id, jobItemId);
            Assert.IsTrue(_domainValidationException.ResultContainsMessage(Messages.QuoteItemNull));
        }
 public StripePaymentGateway(ProductService productService, CustomerService customerService, PlanService planService,
                             CardService cardService, InvoiceService invoiceService, CouponService couponService, IMapper mapper, RefundService refundService,
                             SubscriptionService subscriptionService, InvoiceItemService invoiceItemService,
                             IOptions <AppSettings> appSettings)
 {
     _productService      = productService;
     _mapper              = mapper;
     _planService         = planService;
     _appSettings         = appSettings.Value;
     _cardService         = cardService;
     _invoiceService      = invoiceService;
     _customerSer         = customerService;
     _couponService       = couponService;
     _refundService       = refundService;
     _subscriptionService = subscriptionService;
     _invoiceItemService  = invoiceItemService;
 }
Example #12
0
        public ProjectInvoiceService(
            IServiceProvider serviceProvider,
            StripeInvoiceService invoiceService,
            InvoiceItemService invoiceItemService,
            ILogger <ProjectInvoiceService> logger,
            InvoicesEventHandlers events,
            IProjectService projectService,
            IBuyerAccountService buyerAccountService) : base(serviceProvider)
        {
            _invoiceService      = invoiceService;
            _invoiceItemService  = invoiceItemService;
            _logger              = logger;
            _projectService      = projectService;
            _buyerAccountService = buyerAccountService;
            _invoices            = UnitOfWork.RepositoryAsync <StripeInvoice>();
            _timeEntries         = UnitOfWork.RepositoryAsync <TimeEntry>();
            _items     = UnitOfWork.RepositoryAsync <StripeInvoiceItem>();
            _contracts = UnitOfWork.RepositoryAsync <Contract>();

            AddEventHandler(events);
        }
Example #13
0
        public InvoiceItemServiceTest()
        {
            this.service = new InvoiceItemService();

            this.createOptions = new InvoiceItemCreateOptions()
            {
                Amount     = 123,
                Currency   = "usd",
                CustomerId = "cus_123",
            };

            this.updateOptions = new InvoiceItemUpdateOptions()
            {
                Metadata = new Dictionary <string, string>()
                {
                    { "key", "value" },
                },
            };

            this.listOptions = new InvoiceItemListOptions()
            {
                Limit = 1,
            };
        }
Example #14
0
        public void CreateFromPending_InvalidInvoiceId_ArgumentExceptionThrown()
        {
            var id                 = Guid.NewGuid();
            var invoiceId          = Guid.NewGuid();
            var description        = "Druck, DPI601IS, Digital Pressure Indicator";
            var calibrationPrice   = 25;
            var repairPrice        = 38;
            var partsPrice         = 200;
            var carriagePrice      = 30;
            var investigationPrice = 0;

            var invoiceItemRepositoryMock = MockRepository.GenerateMock <IInvoiceItemRepository>();

            invoiceItemRepositoryMock.Expect(x => x.Create(null)).IgnoreArguments();
            _invoiceItemService = InvoiceItemServiceFactory.Create(
                _userContext,
                MockRepository.GenerateStub <ICompanyDetailsRepository>(),
                InvoiceRepositoryTestHelper.GetInvoiceRepository_StubsGetById_ReturnsNull(invoiceId),
                invoiceItemRepositoryMock,
                MockRepository.GenerateStub <IJobItemRepository>(),
                MockRepository.GenerateStub <IQuoteItemRepository>(),
                MockRepository.GenerateStub <IListItemRepository>());
            CreateFromPending(id, invoiceId, description, calibrationPrice, repairPrice, partsPrice, carriagePrice, investigationPrice, _jobItemForCreateFromPending);
        }
Example #15
0
 public override void OnActionExecuting()
 {
     _invoiceItemService = CreateService <InvoiceItemService>();
 }
 public InvoiceItemController(InvoiceItemService _InvoiceItemService)
 {
     InvoiceItemService = _InvoiceItemService;
 }
Example #17
0
        public ActionResult Pay(Payment item)
        {
            var me = (User)Session["me"];

            if (me == null)
            {
                return(RedirectToAction("Index"));
            }
            var stripeToken = Request.Form["stripeToken"];

            if (String.IsNullOrEmpty(stripeToken))
            {
                TempData["result_code"] = -1;
                TempData["message"]     = "Stripe set an error with your informations";
                TempData.Keep();
                return(RedirectToAction("Index"));
            }
            var Email               = Request.Form["stripeEmail"];
            var stripeTokenType     = Request.Form["stripeTokenType"];
            var productService      = new ProductService();
            var priceService        = new PriceService();
            var invoiceItemService  = new InvoiceItemService();
            var invoiceServices     = new InvoiceService();
            var customerService     = new CustomerService();
            var planService         = new PlanService();
            var subscriptionService = new SubscriptionService();

            var original_amount = 500;
            var amount          = Convert.ToInt32(me.reduction > 0 ? original_amount * me.reduction : original_amount);

            var product = productService.Create(new ProductCreateOptions
            {
                Name = "Name of Service",
            });

            var price = priceService.Create(new PriceCreateOptions
            {
                Product    = product.Id,
                UnitAmount = amount,
                Currency   = "usd",
                Recurring  = new PriceRecurringOptions
                {
                    Interval = "month",
                },
            });

            var customer = customerService.Create(new CustomerCreateOptions
            {
                Email  = Email,
                Source = stripeToken,
            });



            var plan = planService.Create(new PlanCreateOptions
            {
                Amount        = amount,
                Currency      = "usd",
                Interval      = "month",
                IntervalCount = 1,
                Product       = product.Id, // "prod_IinH4BV2oyao8L",
            });
            var subscription = subscriptionService.Create(new SubscriptionCreateOptions
            {
                Customer = customer.Id,
                Items    = new List <SubscriptionItemOptions>
                {
                    new SubscriptionItemOptions
                    {
                        Plan = plan.Id,
                    },
                },
            });

            if (subscription.Status == "active")
            {
                item.original_amount = 500;
                item.amount          = amount;
                item.code            = QRCodeModel.GenerateRandomString();
                item.payer_id        = me.id;
                db1.Payment.Add(item);
                db1.SaveChanges();
                TempData["result_code"] = 1;
                TempData["message"]     = "Subscription done successfully";
                TempData.Keep();
                return(RedirectToAction("Payments"));
            }
            TempData["result_code"] = -1;
            TempData["message"]     = "An error occured during the payment";
            TempData.Keep();
            return(RedirectToAction("Index"));
        }
Example #18
0
        public async Task <bool> PreviewUpcomingInvoiceAndPayAsync(ISubscriber subscriber, string planId,
                                                                   List <InvoiceSubscriptionItemOptions> subItemOptions, int prorateThreshold = 500)
        {
            var invoiceService     = new InvoiceService();
            var invoiceItemService = new InvoiceItemService();

            var pendingInvoiceItems = invoiceItemService.ListAutoPaging(new InvoiceItemListOptions
            {
                CustomerId = subscriber.GatewayCustomerId
            }).ToList().Where(i => i.InvoiceId == null);
            var pendingInvoiceItemsDict = pendingInvoiceItems.ToDictionary(pii => pii.Id);

            var upcomingPreview = await invoiceService.UpcomingAsync(new UpcomingInvoiceOptions
            {
                CustomerId        = subscriber.GatewayCustomerId,
                SubscriptionId    = subscriber.GatewaySubscriptionId,
                SubscriptionItems = subItemOptions
            });

            var itemsForInvoice = upcomingPreview.Lines?.Data?
                                  .Where(i => pendingInvoiceItemsDict.ContainsKey(i.Id) || (i.Plan.Id == planId && i.Proration));
            var invoiceAmount = itemsForInvoice?.Sum(i => i.Amount) ?? 0;
            var invoiceNow    = invoiceAmount >= prorateThreshold;

            if (invoiceNow)
            {
                // Owes more than prorateThreshold on next invoice.
                // Invoice them and pay now instead of waiting until next billing cycle.

                Invoice invoice             = null;
                var     createdInvoiceItems = new List <InvoiceItem>();
                Braintree.Transaction braintreeTransaction = null;
                try
                {
                    foreach (var ii in itemsForInvoice)
                    {
                        if (pendingInvoiceItemsDict.ContainsKey(ii.Id))
                        {
                            continue;
                        }
                        var invoiceItem = await invoiceItemService.CreateAsync(new InvoiceItemCreateOptions
                        {
                            Currency       = ii.Currency,
                            Description    = ii.Description,
                            CustomerId     = subscriber.GatewayCustomerId,
                            SubscriptionId = ii.SubscriptionId,
                            Discountable   = ii.Discountable,
                            Amount         = ii.Amount
                        });

                        createdInvoiceItems.Add(invoiceItem);
                    }

                    invoice = await invoiceService.CreateAsync(new InvoiceCreateOptions
                    {
                        Billing        = Billing.SendInvoice,
                        DaysUntilDue   = 1,
                        CustomerId     = subscriber.GatewayCustomerId,
                        SubscriptionId = subscriber.GatewaySubscriptionId
                    });

                    var invoicePayOptions = new InvoicePayOptions();
                    var customerService   = new CustomerService();
                    var customer          = await customerService.GetAsync(subscriber.GatewayCustomerId);

                    if (customer != null)
                    {
                        if (customer.Metadata.ContainsKey("btCustomerId"))
                        {
                            invoicePayOptions.PaidOutOfBand = true;
                            var btInvoiceAmount   = (invoiceAmount / 100M);
                            var transactionResult = await _btGateway.Transaction.SaleAsync(
                                new Braintree.TransactionRequest
                            {
                                Amount     = btInvoiceAmount,
                                CustomerId = customer.Metadata["btCustomerId"],
                                Options    = new Braintree.TransactionOptionsRequest
                                {
                                    SubmitForSettlement = true,
                                    PayPal = new Braintree.TransactionOptionsPayPalRequest
                                    {
                                        CustomField = $"{subscriber.BraintreeIdField()}:{subscriber.Id}"
                                    }
                                },
                                CustomFields = new Dictionary <string, string>
                                {
                                    [subscriber.BraintreeIdField()] = subscriber.Id.ToString()
                                }
                            });

                            if (!transactionResult.IsSuccess())
                            {
                                throw new GatewayException("Failed to charge PayPal customer.");
                            }

                            braintreeTransaction = transactionResult.Target;
                            await invoiceService.UpdateAsync(invoice.Id, new InvoiceUpdateOptions
                            {
                                Metadata = new Dictionary <string, string>
                                {
                                    ["btTransactionId"]       = braintreeTransaction.Id,
                                    ["btPayPalTransactionId"] =
                                        braintreeTransaction.PayPalDetails.AuthorizationId
                                }
                            });
                        }
                    }

                    await invoiceService.PayAsync(invoice.Id, invoicePayOptions);
                }
                catch (Exception e)
                {
                    if (braintreeTransaction != null)
                    {
                        await _btGateway.Transaction.RefundAsync(braintreeTransaction.Id);
                    }
                    if (invoice != null)
                    {
                        await invoiceService.DeleteAsync(invoice.Id);

                        // Restore invoice items that were brought in
                        foreach (var item in pendingInvoiceItems)
                        {
                            var i = new InvoiceItemCreateOptions
                            {
                                Currency       = item.Currency,
                                Description    = item.Description,
                                CustomerId     = item.CustomerId,
                                SubscriptionId = item.SubscriptionId,
                                Discountable   = item.Discountable,
                                Metadata       = item.Metadata,
                                Quantity       = item.Quantity,
                                UnitAmount     = item.UnitAmount
                            };
                            await invoiceItemService.CreateAsync(i);
                        }
                    }
                    else
                    {
                        foreach (var ii in createdInvoiceItems)
                        {
                            await invoiceItemService.DeleteAsync(ii.Id);
                        }
                    }
                    throw e;
                }
            }
            return(invoiceNow);
        }
        public string SendInvoice(
            string customerEmail,
            decimal amountToPay,
            string currency,
            string description = "",
            bool sendInvoice   = true)
        {
            try
            {
                CustomerCreateOptions customerInfo = new CustomerCreateOptions
                {
                    Email = customerEmail,
                    //PaymentMethod = "card",
                };
                var customerService = new CustomerService();
                var customer        = customerService.Create(customerInfo);

                var invoiceItemOption = new InvoiceItemCreateOptions
                {
                    Customer = customer.Id,
                    Amount   = Convert.ToInt32(amountToPay * 100),
                    Currency = currency,
                };
                var invoiceItemService = new InvoiceItemService();
                var invoiceItem        = invoiceItemService.Create(invoiceItemOption);

                var invoiceOptions = new InvoiceCreateOptions
                {
                    Customer         = customer.Id,
                    CollectionMethod = "send_invoice",
                    DaysUntilDue     = 30,
                    Description      = description,
                    AutoAdvance      = true
                };

                var service = new InvoiceService();
                var invoice = service.Create(invoiceOptions);
                invoice = service.FinalizeInvoice(invoice.Id);

                try
                {
                    var paymentIntentService = new PaymentIntentService();

                    var paymentIntent = paymentIntentService.Get(invoice.PaymentIntentId);
                    var paymentIntentUpdateOptions = new PaymentIntentUpdateOptions
                    {
                        Description = description
                    };
                    paymentIntentService.Update(paymentIntent.Id, paymentIntentUpdateOptions);
                }
                catch (Exception)
                {
                    //continue
                }

                if (sendInvoice)
                {
                    invoice = service.SendInvoice(invoice.Id);
                }

                return(invoice.Id);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                return(null);
            }
        }
Example #20
0
        public void CreateInvoicesFromPendingItems_ValidPendingInvoiceItems_InvoicesCreated()
        {
            var dispatcher     = MockRepository.GenerateMock <IQueueDispatcher <IMessage> >();
            var userRepository = new UserAccountRepository();
            var user           = userRepository.GetByEmail("*****@*****.**", false);
            var userContext    = new TestUserContext(user);

            var companyDetailsRepository = new CompanyDetailsRepository();
            var quoteRepository          = new QuoteRepository();
            var quoteItemRepository      = new QuoteItemRepository();
            var customerRepository       = new CustomerRepository();
            var jobRepository            = new JobRepository();
            var jobItemRepository        = new JobItemRepository();
            var listItemRepository       = new ListItemRepository();
            var currencyRepository       = new CurrencyRepository();
            var entityIdProvider         = new DirectEntityIdProvider();
            var instrumentRepository     = new InstrumentRepository();
            var deliveryRepository       = new DeliveryRepository();
            var deliveryItemRepository   = new DeliveryItemRepository();
            var invoiceRepository        = new InvoiceRepository();
            var invoiceItemRepository    = new InvoiceItemRepository();

            var customerId1 = Guid.NewGuid();
            var customerId2 = Guid.NewGuid();
            var job1Id      = Guid.NewGuid();
            var job2Id      = Guid.NewGuid();
            var job3Id      = Guid.NewGuid();
            var jobItem1Id  = Guid.NewGuid();
            var jobItem2Id  = Guid.NewGuid();
            var jobItem3Id  = Guid.NewGuid();
            var jobItem4Id  = Guid.NewGuid();
            var jobItem5Id  = Guid.NewGuid();
            var jobItem6Id  = Guid.NewGuid();
            var jobItem7Id  = Guid.NewGuid();
            var jobItem8Id  = Guid.NewGuid();
            var jobItem9Id  = Guid.NewGuid();

            CreateInvoicesFromPendingItemsHelper.CreateContextForPendingItemTests(
                customerId1, customerId2, job1Id, job2Id, job3Id, jobItem1Id, jobItem2Id, jobItem3Id, jobItem4Id, jobItem5Id, jobItem6Id, jobItem7Id, jobItem8Id, jobItem9Id);
            var invoiceItemService = new InvoiceItemService(userContext, companyDetailsRepository, invoiceRepository, invoiceItemRepository, jobItemRepository, quoteItemRepository, listItemRepository, dispatcher);

            invoiceItemService.CreatePending(Guid.NewGuid(), jobItem1Id);
            invoiceItemService.CreatePending(Guid.NewGuid(), jobItem2Id);
            invoiceItemService.CreatePending(Guid.NewGuid(), jobItem3Id);
            invoiceItemService.CreatePending(Guid.NewGuid(), jobItem4Id);
            invoiceItemService.CreatePending(Guid.NewGuid(), jobItem5Id);
            invoiceItemService.CreatePending(Guid.NewGuid(), jobItem6Id);
            invoiceItemService.CreatePending(Guid.NewGuid(), jobItem7Id);
            invoiceItemService.CreatePending(Guid.NewGuid(), jobItem8Id);
            invoiceItemService.CreatePending(Guid.NewGuid(), jobItem9Id);

            var invoiceService = new InvoiceService(
                userContext, invoiceItemService, invoiceRepository, new DirectEntityIdProvider(), listItemRepository, customerRepository, new BankDetailsRepository(), new TaxCodeRepository(), companyDetailsRepository, currencyRepository, dispatcher);

            invoiceService.CreateInvoicesFromPendingItems();
            var invoices = invoiceService.GetInvoices().ToList();

            Assert.AreEqual(4, invoices.Count);
            var invoiceItems = invoiceItemService.GetInvoiceItems(invoices[0].Id).ToList();

            Assert.AreEqual(2, invoiceItems.Count);
            invoiceItems = invoiceItemService.GetInvoiceItems(invoices[1].Id).ToList();
            Assert.AreEqual(2, invoiceItems.Count);
            invoiceItems = invoiceItemService.GetInvoiceItems(invoices[2].Id).ToList();
            Assert.AreEqual(3, invoiceItems.Count);
            invoiceItems = invoiceItemService.GetInvoiceItems(invoices[3].Id).ToList();
            Assert.AreEqual(2, invoiceItems.Count);
            var pendingItems = invoiceItemService.GetPendingInvoiceItems().ToList();

            Assert.AreEqual(0, pendingItems.Count);
        }
Example #21
0
 public InvoiceController(InvoiceItemService invoiceItemService, InvoiceService invoiceService)
 {
     _invoiceItemService = invoiceItemService;
     _invoiceService     = invoiceService;
 }
 public InvoiceItemsController(InvoiceItemService service)
 {
     _service = service;
 }
        public InvoiceInfo GeneratePayNowLink(
            string customerEmail,
            decimal amountToPay,
            string currency,
            string description = "")
        {
            try
            {
                CustomerCreateOptions customerInfo = new CustomerCreateOptions
                {
                    Email = customerEmail,
                    //PaymentMethod = "card",
                };
                var customerService = new CustomerService();
                var customer        = customerService.Create(customerInfo);

                var invoiceItemOption = new InvoiceItemCreateOptions
                {
                    Customer = customer.Id,
                    Amount   = Convert.ToInt32(amountToPay * 100),
                    Currency = currency,
                };
                var invoiceItemService = new InvoiceItemService();
                var invoiceItem        = invoiceItemService.Create(invoiceItemOption);

                var invoiceOptions = new InvoiceCreateOptions
                {
                    Customer         = customer.Id,
                    CollectionMethod = "send_invoice",
                    DaysUntilDue     = 30,
                    Description      = description
                };

                var service = new InvoiceService();
                var invoice = service.Create(invoiceOptions);

                invoice = service.FinalizeInvoice(invoice.Id);

                try
                {
                    var paymentIntentService = new PaymentIntentService();

                    var paymentIntent = paymentIntentService.Get(invoice.PaymentIntentId);
                    var paymentIntentUpdateOptions = new PaymentIntentUpdateOptions
                    {
                        Description = description
                    };
                    paymentIntentService.Update(paymentIntent.Id, paymentIntentUpdateOptions);
                }
                catch (Exception)
                {
                    //continue
                }

                var result = new InvoiceInfo
                {
                    Url = invoice.HostedInvoiceUrl,
                    Id  = invoice.Id
                };
                return(result);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                return(null);
            }
        }