예제 #1
0
        private async Task <int> SaveInvoice(InvoiceCreationModel model, DateTime creationTime)
        {
            int?billingDataId = null;

            if (!string.IsNullOrEmpty(model.CustomerName) && !string.IsNullOrEmpty(model.CustomerAddress))
            {
                var billingData = DbContext.Add(new BillingData()
                {
                    Name        = model.CustomerName,
                    TaxNumber   = model.CustomerTaxNumber,
                    Address     = model.CustomerAddress,
                    PhoneNumber = model.CustomerPhoneNumber,
                    Email       = model.CustomerEmail
                });
                await DbContext.SaveChangesAsync();

                billingDataId = billingData.Entity.Id;
            }

            var invoice = DbContext.Add(new Invoice()
            {
                OrderSessionId = model.OrderSession.Id,
                CreationTime   = creationTime,
                BillingDataId  = billingDataId,
                PaymentMethod  = model.PaymentMethod
            });

            await DbContext.SaveChangesAsync();

            invoice.Entity.Path = $"invoice{invoice.Entity.Id}.pdf";

            await DbContext.SaveChangesAsync();

            return(invoice.Entity.Id);
        }
예제 #2
0
        public async Task <int> CreateInvoice(InvoiceCreationModel model)
        {
            var creationTime = DateTime.Now;
            var invoiceId    = await SaveInvoice(model, creationTime);

            GeneratePDF(model, creationTime, invoiceId);
            return(invoiceId);
        }
        public async Task <OrderSessionPayResultModel> PayOrders(int id, OrderSessionPayModel model)
        {
            if (!Enum.IsDefined(typeof(PaymentMethod), model.PaymentMethod))
            {
                throw new RestaurantNotFoundException("Nem létező fizetési mód!");
            }

            var orderSession = await DbContext.OrderSessions.Include(os => os.Orders)
                               .ThenInclude(o => o.Items)
                               .ThenInclude(oi => oi.MenuItem)
                               .Where(os => os.Id == id && (os.Status == OrderSessionStatus.Active || os.Status == OrderSessionStatus.Delivering))
                               .SingleOrDefaultAsync();

            if (orderSession == null)
            {
                throw new RestaurantNotFoundException("A rendelési folyamat nem létezik vagy a fizetése nem lehetséges!");
            }

            await StatusService.CheckRightsForStatus(orderSession.Status);

            var summary = await GetPaymentSummary(orderSession, model);

            //Generate invoice
            var invoiceModel = new InvoiceCreationModel()
            {
                FullPrice             = summary.FullPrice,
                FinalPrice            = summary.FinalPrice,
                VoucherCode           = model.VoucherCode,
                VoucherDiscountAmount = summary.VoucherTotalDiscountAmount,
                RedeemedLoyaltyPoints = summary.UsedLoyaltyPoints ?? 0,
                CustomerName          = model.CustomerName,
                CustomerTaxNumber     = model.CustomerTaxNumber,
                CustomerAddress       = model.CustomerAddress,
                CustomerPhoneNumber   = model.CustomerPhoneNumber,
                CustomerEmail         = model.CustomerEmail,
                PaymentMethod         = model.PaymentMethod,
                OrderSession          = orderSession
            };

            var invoiceId = await InvoiceService.CreateInvoice(invoiceModel);

            orderSession.InvoiceId = invoiceId;

            //Close order
            orderSession.Status   = OrderSessionStatus.Paid;
            orderSession.ClosedAt = DateTime.Now;

            await DbContext.SaveChangesAsync();

            return(new OrderSessionPayResultModel()
            {
                InvoiceId = invoiceId
            });                                                                              //Invoice id
        }
예제 #4
0
        private void GeneratePDF(InvoiceCreationModel model, DateTime CreationDate, int invoiceId)
        {
            doc            = new PdfDocument($"{InvoicePath}/invoice{invoiceId}.pdf");
            doc.Info.Title = "Számla";

            AddPage();

            XFont titleFont = new XFont(InvoiceConfig.FontFamily, InvoiceConfig.FontSize + 4, XFontStyle.Bold, fontOptions);
            XFont smallFont = new XFont(InvoiceConfig.FontFamily, InvoiceConfig.FontSize - 2, XFontStyle.Regular, fontOptions);
            XFont boldFont  = new XFont(InvoiceConfig.FontFamily, InvoiceConfig.FontSize, XFontStyle.Bold, fontOptions);

            int x = InvoiceConfig.Margin;

            //Title
            WriteText(x, 20, "Számla", titleFont);

            DrawLine(x, 30, page.Width - InvoiceConfig.Margin, 30);

            WriteText(page.Width - 140, 20, $"Azonosító: R/{invoiceId}", smallFont);

            //Restaurant data
            WriteText(x, 45, "Kibocsátó:", smallFont);

            WriteText(x, 70, InvoiceConfig.Restaurant.Name, titleFont);

            WriteText(x, 90, InvoiceConfig.Restaurant.Address);

            WriteText(x, 110, $"Adószám: {InvoiceConfig.Restaurant.TaxNumber}");

            WriteText(x, 130, $"Tel.: {InvoiceConfig.Restaurant.PhoneNumber}");

            WriteText(x, 150, $"E-mail: {InvoiceConfig.Restaurant.Email}");

            //Customer data
            int y = 45;

            if (!string.IsNullOrEmpty(model.CustomerName) && !string.IsNullOrEmpty(model.CustomerAddress))
            {
                int x2 = (int)Math.Round(page.Width / 2) + InvoiceConfig.Margin;
                WriteText(x2, y, "Vevő:", smallFont);
                y = 70;
                WriteText(x2, y, model.CustomerName, titleFont);
                y = 90;
                WriteText(x2, y, model.CustomerAddress);
                y = 110;
                if (!string.IsNullOrEmpty(model.CustomerTaxNumber))
                {
                    WriteText(x2, y, $"Adószám: {model.CustomerTaxNumber}");
                    y += 20;
                }
                if (!string.IsNullOrEmpty(model.CustomerPhoneNumber))
                {
                    WriteText(x2, y, $"Tel.: {model.CustomerPhoneNumber}");
                    y += 20;
                }
                if (!string.IsNullOrEmpty(model.CustomerEmail))
                {
                    WriteText(x2, y, $"E-mail: {model.CustomerEmail}");
                    y += 20;
                }

                DrawLine(x2 - InvoiceConfig.Margin, 30, x2 - InvoiceConfig.Margin, 170);
            }
            DrawLine(x, 170, page.Width - InvoiceConfig.Margin, 170);

            //Header end

            WriteText(x, 190, $"Fizetési mód: {EnumHelper.GetDescription(model.PaymentMethod)}");

            //Table header
            int tablePageUnitX = (int)Math.Floor((page.Width - InvoiceConfig.Margin * 2) / 12);

            WriteText(InvoiceConfig.Margin, 220, "Tétel", boldFont);
            WriteText(InvoiceConfig.Margin + 6 * tablePageUnitX, 220, "Mennyiség", boldFont);
            WriteText(InvoiceConfig.Margin + 8 * tablePageUnitX, 220, "Egységár", boldFont);
            WriteText(InvoiceConfig.Margin + 10 * tablePageUnitX, 220, "Összeg", boldFont);
            DrawLine(x, 230, page.Width - InvoiceConfig.Margin, 230);
            y = 250;
            //Order items (table content)
            model.OrderSession.Orders.ForEach(order =>
            {
                order.Items.ForEach(oi =>
                {
                    WriteText(InvoiceConfig.Margin, y, oi.MenuItem.Name, maxWidth: 6 * tablePageUnitX);
                    WriteText(InvoiceConfig.Margin + 6 * tablePageUnitX, y, oi.Quantity.ToString(), maxWidth: 2 * tablePageUnitX);
                    WriteText(InvoiceConfig.Margin + 8 * tablePageUnitX, y, $"{oi.MenuItem.Price} Ft", maxWidth: 2 * tablePageUnitX);
                    WriteText(InvoiceConfig.Margin + 10 * tablePageUnitX, y, $"{oi.MenuItem.Price * oi.Quantity} Ft", maxWidth: 2 * tablePageUnitX);
                    y += 20;
                    if (y > page.Height)
                    {
                        AddPage();
                        y = 20;
                    }
                });
            });

            if (model.FullPrice != model.FinalPrice)
            {
                DrawLine(x, y, page.Width - InvoiceConfig.Margin, y);
                y += 20;
                WriteText(InvoiceConfig.Margin + 10 * tablePageUnitX, y, $"{model.FullPrice} Ft", boldFont);
                y += 20;
                DrawLine(x, y, page.Width - InvoiceConfig.Margin, y);
                y += 20;

                //Voucher
                if (!string.IsNullOrEmpty(model.VoucherCode) && model.VoucherDiscountAmount != null)
                {
                    WriteText(InvoiceConfig.Margin, y, model.VoucherCode, maxWidth: 6 * tablePageUnitX);
                    WriteText(InvoiceConfig.Margin + 10 * tablePageUnitX, y, $"-{model.VoucherDiscountAmount} Ft", maxWidth: 2 * tablePageUnitX);
                    y += 20;
                }

                //Loyalty points
                if (model.RedeemedLoyaltyPoints > 0)
                {
                    WriteText(InvoiceConfig.Margin, y, "Hűségpontok", maxWidth: 6 * tablePageUnitX);
                    WriteText(InvoiceConfig.Margin + 6 * tablePageUnitX, y, model.RedeemedLoyaltyPoints.ToString(), maxWidth: 2 * tablePageUnitX);
                    WriteText(InvoiceConfig.Margin + 10 * tablePageUnitX, y, $"-{model.RedeemedLoyaltyPoints} Ft", maxWidth: 2 * tablePageUnitX);
                    y += 20;
                }
            }

            //Sum
            DrawLine(x, y, page.Width - InvoiceConfig.Margin, y);
            y += 20;
            WriteText(InvoiceConfig.Margin + 9 * tablePageUnitX, y, $"Összesen: {model.FinalPrice} Ft", boldFont);
            y += 40;
            WriteText(x, y, $"AP: {InvoiceConfig.Restaurant.APNumber}");
            y += 20;
            WriteText(x, y, $"Kelt: {CreationDate:yyyy. MM. dd. HH:mm:ss}");

            doc.Close();
        }