Beispiel #1
0
        public async Task Able_to_generate_invoice()
        {
            var product     = ProductMockBuilder.Build();
            var productRepo = Substitute.For <IProductRepository>();

            productRepo.Get(Arg.Any <Guid>()).Returns(product);

            var supplier     = SupplierMockBuilder.Build();
            var supplierRepo = Substitute.For <ISupplierRepository>();

            supplierRepo.Get(Arg.Any <Guid>()).Returns(supplier);

            var customer     = CustomerMockBuilder.Build();
            var customerRepo = Substitute.For <ICustomerRepository>();

            customerRepo.Get(Arg.Any <Guid>()).Returns(customer);

            var sut    = new InvoiceGenerator(productRepo, supplierRepo, customerRepo);
            var actual = await sut.Generate(OrderMockBuilder.Build());

            actual.Customer.Should().Be(customer);
            actual.Supplier.Should().Be(supplier);
            actual.Product.Should().Be(product);
            actual.Amount.Should().Be(new InvoiceAmount(30, 0.19));
        }
Beispiel #2
0
        public async Task InvoiceContainsTotalBonus(
            [Frozen] Mock <IStockRepository> stockRepositoryMock,
            [Frozen] Mock <IOrderItemPriceCalculator> orderItemPriceCalculatorMock,
            [Frozen] Mock <IOrderItemBonusCalculator> orderItemBonusCalculatorMock,
            InvoiceGenerator sut, Order order, List <OrderItem> orderItems)
        {
            orderItems.ForEach(order.AddItem);

            stockRepositoryMock.Setup(m => m.GetById(It.IsAny <int>()))
            .Returns <int>(id => Task.FromResult(new StockItem()));

            // mock price = 0
            orderItemPriceCalculatorMock.Setup(m => m.Calculate(It.IsAny <OrderItem>()))
            .ReturnsAsync(0);

            // mock bonus = {StockItemId} x {DurationDays}
            orderItemBonusCalculatorMock.Setup(m => m.Calculate(It.IsAny <OrderItem>()))
            .Returns <OrderItem>(i => Task.FromResult((int?)(i.StockItemId * i.DurationDays)));

            var invoice = await sut.Generate(order);

            var expectedTotalBonus = orderItems.Sum(i => i.StockItemId * i.DurationDays);

            Assert.Contains($"\nBONUS\t\t{expectedTotalBonus}pt.", invoice);
        }
Beispiel #3
0
        public async Task InvoiceContainsItems(
            [Frozen] Mock <IStockRepository> stockRepositoryMock,
            [Frozen] Mock <IOrderItemPriceCalculator> orderItemPriceCalculatorMock,
            [Frozen] Mock <IOrderItemBonusCalculator> orderItemBonusCalculatorMock,
            InvoiceGenerator sut, Order order, List <OrderItem> orderItems)
        {
            orderItems.ForEach(order.AddItem);

            // mock name = "stock-item-{Id}"
            stockRepositoryMock.Setup(m => m.GetById(It.IsAny <int>()))
            .Returns <int>(id => Task.FromResult(new StockItem {
                Name = $"stock-item-{id}"
            }));

            // mock price = {StockItemId} x {DurationDays}
            orderItemPriceCalculatorMock.Setup(m => m.Calculate(It.IsAny <OrderItem>()))
            .Returns <OrderItem>(i => Task.FromResult((decimal?)(i.StockItemId * i.DurationDays)));

            // mock bonus = 0
            orderItemBonusCalculatorMock.Setup(m => m.Calculate(It.IsAny <OrderItem>()))
            .ReturnsAsync(0);

            var invoice = await sut.Generate(order);

            orderItems.ForEach(i =>
                               Assert.Contains($"\nstock-item-{i.StockItemId}\t\t{i.StockItemId * i.DurationDays}€\n", invoice));
        }
        public void ShouldGenerateInvoiceDiscounting6Percent()
        {
            var action  = new Mock <IActionAfterGenerateInvoice>();
            var actions = new List <IActionAfterGenerateInvoice>();

            invoiceGenerator = new InvoiceGenerator(actions);
            order            = new Order("Gus Herzog", 1000, 1);
            invoice          = invoiceGenerator.Generate(order);
            Assert.AreEqual(1000 * 0.94, invoice.Value);
        }
Beispiel #5
0
        protected void OnGenerateFilesClick(object sender, EventArgs e)
        {
            m_folderBrowserDialog.SelectedPath = Configuration.Instance.MiscellaneousConfiguration.DefaultSaveFolder;
            m_folderBrowserDialog.Description  = "Save Generated Files To...";
            if (m_folderBrowserDialog.ShowDialog() == DialogResult.OK)
            {
                MonthlyTimesheets monthlyTimesheets = m_monthlyTimesheets;

                string outputFolder = m_folderBrowserDialog.SelectedPath;

                FileGenerateConfirmationDialog fileGenerateConfirmationDialog =
                    new FileGenerateConfirmationDialog(monthlyTimesheets, outputFolder);
                if (fileGenerateConfirmationDialog.ShowDialog(this) == DialogResult.Cancel)
                {
                    return;
                }
                else
                {
                    InvoiceNumberComfirmationDialog invoiceNumberComfirmationDialog =
                        new InvoiceNumberComfirmationDialog(monthlyTimesheets, false /* Handle the save below*/);
                    if (invoiceNumberComfirmationDialog.ShowDialog(this) == DialogResult.Cancel)
                    {
                        return;
                    }

                    this.Enabled = false;

                    // Save whatever changes were made first.
                    MonthlyTimesheetSaveProcessing();

                    // Generate any unsent Timesheets...
                    foreach (Timesheet timesheet in monthlyTimesheets.UnSentTimesheets)
                    {
                        TimesheetGenerator timesheetGenerator = new TimesheetGenerator(timesheet, outputFolder);
                        if (timesheetGenerator.Generate(false))
                        {
                        }
                        timesheetGenerator.Save();
                    }

                    // Generate our invoice...
                    InvoiceGenerator invoiceGenerator = new InvoiceGenerator(monthlyTimesheets, outputFolder);
                    if (invoiceGenerator.Generate(false))
                    {
                    }
                    invoiceGenerator.Save();

                    TimesheetGenerator.QuitExcel();

                    this.Enabled = true;
                }
            }
        }
        public void ShouldExecuteActionsAfterGenerateInvoice()
        {
            var action1 = new Mock <IActionAfterGenerateInvoice>();
            var action2 = new Mock <IActionAfterGenerateInvoice>();
            var action3 = new Mock <IActionAfterGenerateInvoice>();

            var actions = new List <IActionAfterGenerateInvoice>
            {
                action1.Object, action2.Object, action3.Object
            };

            invoiceGenerator = new InvoiceGenerator(actions);
            order            = new Order("Gus Herzog", 1000, 1);
            invoice          = invoiceGenerator.Generate(order);

            action1.Verify(x => x.Execute(invoice), Times.Once);
            action2.Verify(x => x.Execute(invoice), Times.Once);
            action3.Verify(x => x.Execute(invoice), Times.Once);
        }
        public static void Run(
            [QueueTrigger("invoice-generation-request")] InvoiceGenerationRequest request,
            [Table("billingItems")] CloudTable billingItems,
            [CosmosDB("crm", "invoices", ConnectionStringSetting = "cosmosDb")] out dynamic generatedInvoice,
            [Queue("invoice-print-request")] out InvoicePrintRequest printRequest,
            [Queue("invoice-notification-request")] out InvoiceNotificationRequest notificationRequest,
            ILogger log)
        {
            log.LogInformation($"[GenerateInvoiceFunc] Queue trigger. Function processed: {request.CustomerCode} {request.Year} {request.Month}");

            var generator = new InvoiceGenerator();
            var items     = GetBillingItemsFromTable(billingItems, request);
            var invoice   = generator.Generate(request, items);

            generatedInvoice = invoice;

            printRequest = new InvoicePrintRequest {
                InvoiceToPrint = invoice
            };
            notificationRequest = new InvoiceNotificationRequest {
                InvoiceForNotification = invoice
            };
        }