Example #1
0
        private void ExportSalesData()
        {
            var fileName = AskFileName(Resources.ExportSalesData + "_" + String.Format("{0:yyyy-MM-dd_hh-mm-ss}.txt", DateTime.Now), ".csv");

            if (string.IsNullOrEmpty(fileName))
            {
                return;
            }

            var lines = ReportContext.Tickets.SelectMany(x => x.TicketItems, (t, ti) => new { Ticket = t, TicketItem = ti });
            var data  = lines.Select(x =>
                                     new
            {
                DateTime = x.TicketItem.CreatedDateTime,
                Date     = x.TicketItem.CreatedDateTime.ToShortDateString(),
                Time     = x.TicketItem.CreatedDateTime.ToShortTimeString(),
                x.Ticket.TicketNumber,
                UserName = ReportContext.GetUserName(x.TicketItem.CreatingUserId),
                Account  = x.Ticket.CustomerName,
                Location = x.Ticket.LocationName,
                x.TicketItem.DepartmentId,
                x.TicketItem.OrderNumber,
                x.TicketItem.Voided,
                x.TicketItem.Gifted,
                Name    = x.TicketItem.MenuItemName,
                Portion = x.TicketItem.PortionName,
                x.TicketItem.Quantity,
                Price    = x.TicketItem.GetItemPrice(),
                Value    = x.TicketItem.GetItemValue(),
                Discount = x.Ticket.GetPlainSum() > 0 ? x.Ticket.GetDiscountTotal() / x.Ticket.GetPlainSum() : 0,
                Rounding = x.Ticket.GetRoundingTotal(),
                Total    = MenuGroupBuilder.CalculateTicketItemTotal(x.Ticket, x.TicketItem),
            }
                                     );
            var csv = data.AsCsv();

            File.WriteAllText(fileName, csv);
        }
Example #2
0
        protected override FlowDocument GetReport()
        {
            var currentPeriod = ReportContext.CurrentWorkPeriod;

            var report = new SimpleReport("8cm");

            AddDefaultReportHeader(report, currentPeriod, Resources.WorkPeriodReport);

            //---------------

            report.AddColumTextAlignment("Departman", TextAlignment.Left, TextAlignment.Right);
            report.AddTable("Departman", Resources.Sales, "");

            var ticketGropus = ReportContext.Tickets
                               .GroupBy(x => new { x.DepartmentId })
                               .Select(x => new DepartmentInfo
            {
                DepartmentId = x.Key.DepartmentId,
                TicketCount  = x.Count(),
                Amount       = x.Sum(y => y.GetSumWithoutTax()),
                Vat          = x.Sum(y => y.CalculateTax()),
                TaxServices  = x.Sum(y => y.GetTaxServicesTotal())
            });

            report.AddRow("Departman", Resources.TotalSales.ToUpper(), ticketGropus.Sum(x => x.Amount).ToString(ReportContext.CurrencyFormat));

            var vatSum     = ticketGropus.Sum(x => x.Vat);
            var serviceSum = ticketGropus.Sum(x => x.TaxServices);

            if (vatSum > 0 || serviceSum > 0)
            {
                if (vatSum > 0)
                {
                    report.AddRow("Departman", Resources.VatTotal.ToUpper(), vatSum.ToString(ReportContext.CurrencyFormat));
                }

                if (serviceSum > 0)
                {
                    ReportContext.Tickets.SelectMany(x => x.TaxServices).GroupBy(x => x.TaxServiceId).ForEach(
                        x =>
                    {
                        var template = ReportContext.TaxServiceTemplates.SingleOrDefault(y => y.Id == x.Key);
                        var title    = template != null ? template.Name : Resources.UndefinedWithBrackets;
                        report.AddRow("Departman", title, x.Sum(y => y.CalculationAmount).ToString(ReportContext.CurrencyFormat));
                    });
                }

                report.AddRow("Departman", Resources.GrandTotal.ToUpper(), ticketGropus.Sum(x => x.Amount + x.Vat + x.TaxServices).ToString(ReportContext.CurrencyFormat));
            }

            //---------------

            if (ReportContext.Departments.Count() > 1)
            {
                var showDepartmentTotals = false;
                report.AddColumnLength("CrossSales", "65*", "40*");
                report.AddColumTextAlignment("CrossSales", TextAlignment.Left, TextAlignment.Right);
                report.AddTable("CrossSales", Resources.DepartmentSales, "");

                foreach (var departmentInfo in ticketGropus)
                {
                    var info = departmentInfo;

                    var crossSales = ReportContext.Tickets.Where(x => x.DepartmentId == info.DepartmentId)
                                     .SelectMany(ticket => ticket.TicketItems.Select(ticketItem => new { Ticket = ticket, TicketItem = ticketItem }))
                                     .Where(x => x.TicketItem.DepartmentId != x.Ticket.DepartmentId)
                                     .GroupBy(x => new { x.TicketItem.DepartmentId })
                                     .Select(x => new DepartmentInfo {
                        DepartmentId = x.Key.DepartmentId, Amount = x.Sum(y => MenuGroupBuilder.CalculateTicketItemTotal(y.Ticket, y.TicketItem))
                    });

                    report.AddRow("CrossSales", string.Format("{0} {1}", departmentInfo.DepartmentName, Resources.Sales), (departmentInfo.Amount).ToString(ReportContext.CurrencyFormat));

                    if (crossSales.Count() > 0)
                    {
                        showDepartmentTotals = true;
                        report.AddRow("CrossSales", "   -" + departmentInfo.DepartmentName, (departmentInfo.Amount - crossSales.Sum(x => x.Amount)).ToString(ReportContext.CurrencyFormat));
                        foreach (var crossSale in crossSales)
                        {
                            var cs = crossSale;
                            report.AddRow("CrossSales", "   -" + cs.DepartmentName, cs.Amount.ToString(ReportContext.CurrencyFormat));
                        }
                    }
                }

                if (showDepartmentTotals)
                {
                    report.AddBoldRow("CrossSales", Resources.Department + " " + Resources.Totals, "");
                    var salesByOrder = ReportContext.Tickets.SelectMany(ticket => ticket.TicketItems.Select(ticketItem => new { Ticket = ticket, TicketItem = ticketItem }))
                                       .GroupBy(x => new { x.TicketItem.DepartmentId })
                                       .Select(x => new DepartmentInfo {
                        DepartmentId = x.Key.DepartmentId, Amount = x.Sum(y => MenuGroupBuilder.CalculateTicketItemTotal(y.Ticket, y.TicketItem))
                    });

                    foreach (var sale in salesByOrder)
                    {
                        var cs = sale;
                        report.AddRow("CrossSales", cs.DepartmentName, cs.Amount.ToString(ReportContext.CurrencyFormat));
                    }
                }
            }

            //---------------

            var ac = ReportContext.GetOperationalAmountCalculator();

            report.AddColumnLength("GelirlerTablosu", "45*", "Auto", "35*");
            report.AddColumTextAlignment("GelirlerTablosu", TextAlignment.Left, TextAlignment.Right, TextAlignment.Right);
            report.AddTable("GelirlerTablosu", Resources.Incomes, "", "");
            report.AddRow("GelirlerTablosu", Resources.Cash, ac.CashPercent, ac.CashTotal.ToString(ReportContext.CurrencyFormat));
            report.AddRow("GelirlerTablosu", Resources.CreditCard, ac.CreditCardPercent, ac.CreditCardTotal.ToString(ReportContext.CurrencyFormat));
            report.AddRow("GelirlerTablosu", Resources.Voucher, ac.TicketPercent, ac.TicketTotal.ToString(ReportContext.CurrencyFormat));
            report.AddRow("GelirlerTablosu", Resources.AccountBalance, ac.AccountPercent, ac.AccountTotal.ToString(ReportContext.CurrencyFormat));
            report.AddRow("GelirlerTablosu", Resources.TotalIncome.ToUpper(), "", ac.TotalAmount.ToString(ReportContext.CurrencyFormat));

            //---------------

            //Kasa raporu eklendiği için kasa özeti bu rapordan kaldırıldı. Başka bir rapora taşınabilir şimdilik bıraktım.

            //var cashTransactionTotal = ReportContext.GetCashTotalAmount();
            //var creditCardTransactionTotal = ReportContext.GetCreditCardTotalAmount();
            //var ticketTransactionTotal = ReportContext.GetTicketTotalAmount();

            //report.AddColumnLength("Kasa", "25*", "18*", "18*", "18*", "21*");
            //report.AddColumTextAlignment("Kasa", TextAlignment.Left, TextAlignment.Right, TextAlignment.Right, TextAlignment.Right, TextAlignment.Right);
            //report.AddTable("Kasa", "Kasa", "Nakit", "K.Kartı", "Y.Çeki", "Toplam");
            //report.AddRow("Kasa", "Gün Başı",
            //    currentPeriod.CashAmount.ToString(ReportContext.CurrencyFormat),
            //    currentPeriod.CreditCardAmount.ToString(ReportContext.CurrencyFormat),
            //    currentPeriod.TicketAmount.ToString(ReportContext.CurrencyFormat),
            //    (currentPeriod.CashAmount + currentPeriod.CreditCardAmount + currentPeriod.TicketAmount).ToString(ReportContext.CurrencyFormat));

            //report.AddRow("Kasa", "Faaliyet",
            //                ac.CashTotal.ToString(ReportContext.CurrencyFormat),
            //                ac.CreditCardTotal.ToString(ReportContext.CurrencyFormat),
            //                ac.TicketTotal.ToString(ReportContext.CurrencyFormat),
            //                ac.GrandTotal.ToString(ReportContext.CurrencyFormat));

            //report.AddRow("Kasa", "Hareketler",
            //                cashTransactionTotal.ToString(ReportContext.CurrencyFormat),
            //                creditCardTransactionTotal.ToString(ReportContext.CurrencyFormat),
            //                ticketTransactionTotal.ToString(ReportContext.CurrencyFormat),
            //                (cashTransactionTotal + creditCardTransactionTotal + ticketTransactionTotal).ToString(ReportContext.CurrencyFormat));

            //var totalCash = currentPeriod.CashAmount + ac.CashTotal + cashTransactionTotal;
            //var totalCreditCard = currentPeriod.CreditCardAmount + ac.CreditCardTotal + creditCardTransactionTotal;
            //var totalTicket = currentPeriod.TicketAmount + ac.TicketTotal + ticketTransactionTotal;

            //report.AddRow("Kasa", "TOPLAM",
            //    totalCash.ToString(ReportContext.CurrencyFormat),
            //    totalCreditCard.ToString(ReportContext.CurrencyFormat),
            //    totalTicket.ToString(ReportContext.CurrencyFormat),
            //    (totalCash + totalCreditCard + totalTicket).ToString(ReportContext.CurrencyFormat));


            //---------------

            var propertySum = ReportContext.Tickets
                              .SelectMany(x => x.TicketItems)
                              .Sum(x => x.GetPropertyPrice() * x.Quantity);

            var voids = ReportContext.Tickets
                        .SelectMany(x => x.TicketItems)
                        .Where(x => x.Voided)
                        .Sum(x => x.GetItemValue());

            var discounts = ReportContext.Tickets
                            .SelectMany(x => x.Discounts)
                            .Sum(x => x.DiscountAmount);

            var gifts = ReportContext.Tickets
                        .SelectMany(x => x.TicketItems)
                        .Where(x => x.Gifted)
                        .Sum(x => x.GetItemValue());

            report.AddColumTextAlignment("Bilgi", TextAlignment.Left, TextAlignment.Right);
            report.AddColumnLength("Bilgi", "65*", "35*");
            report.AddTable("Bilgi", Resources.GeneralInformation, "");
            report.AddRow("Bilgi", Resources.ItemProperties, propertySum.ToString(ReportContext.CurrencyFormat));
            report.AddRow("Bilgi", Resources.VoidsTotal, voids.ToString(ReportContext.CurrencyFormat));
            report.AddRow("Bilgi", Resources.DiscountsTotal, discounts.ToString(ReportContext.CurrencyFormat));
            report.AddRow("Bilgi", Resources.GiftsTotal, gifts.ToString(ReportContext.CurrencyFormat));

            if (ticketGropus.Count() > 1)
            {
                foreach (var departmentInfo in ticketGropus)
                {
                    report.AddRow("Bilgi", departmentInfo.DepartmentName, departmentInfo.TicketCount);
                }
            }

            var ticketCount = ticketGropus.Sum(x => x.TicketCount);

            report.AddRow("Bilgi", Resources.TicketCount, ticketCount);

            report.AddRow("Bilgi", Resources.SalesDivTicket, ticketCount > 0
                ? (ticketGropus.Sum(x => x.Amount) / ticketGropus.Sum(x => x.TicketCount)).ToString(ReportContext.CurrencyFormat)
                : "0");

            if (ticketGropus.Count() > 1)
            {
                foreach (var departmentInfo in ticketGropus)
                {
                    var dPayments = ReportContext.Tickets
                                    .SelectMany(x => x.Payments)
                                    .Where(x => x.DepartmentId == departmentInfo.DepartmentId)
                                    .GroupBy(x => new { x.PaymentType })
                                    .Select(x => new TenderedAmount {
                        PaymentType = x.Key.PaymentType, Amount = x.Sum(y => y.Amount)
                    });

                    report.AddColumnLength(departmentInfo.DepartmentName + Resources.Incomes, "40*", "Auto", "35*");
                    report.AddColumTextAlignment(departmentInfo.DepartmentName + Resources.Incomes, TextAlignment.Left, TextAlignment.Right, TextAlignment.Right);
                    report.AddTable(departmentInfo.DepartmentName + Resources.Incomes, string.Format(Resources.Incomes_f, departmentInfo.DepartmentName), "", "");
                    report.AddRow(departmentInfo.DepartmentName + Resources.Incomes, Resources.Cash, GetPercent(0, dPayments), GetAmount(0, dPayments).ToString(ReportContext.CurrencyFormat));
                    report.AddRow(departmentInfo.DepartmentName + Resources.Incomes, Resources.CreditCard, GetPercent(1, dPayments), GetAmount(1, dPayments).ToString(ReportContext.CurrencyFormat));
                    report.AddRow(departmentInfo.DepartmentName + Resources.Incomes, Resources.Voucher, GetPercent(2, dPayments), GetAmount(2, dPayments).ToString(ReportContext.CurrencyFormat));
                    report.AddRow(departmentInfo.DepartmentName + Resources.Incomes, Resources.AccountBalance, GetPercent(3, dPayments), GetAmount(3, dPayments).ToString(ReportContext.CurrencyFormat));
                    report.AddRow(departmentInfo.DepartmentName + Resources.Incomes, Resources.TotalIncome, "", dPayments.Sum(x => x.Amount).ToString(ReportContext.CurrencyFormat));

                    var dvoids = ReportContext.Tickets
                                 .SelectMany(x => x.TicketItems)
                                 .Where(x => x.Voided && x.DepartmentId == departmentInfo.DepartmentId)
                                 .Sum(x => x.GetItemValue());

                    var ddiscounts = ReportContext.Tickets
                                     .Where(x => x.DepartmentId == departmentInfo.DepartmentId)
                                     .SelectMany(x => x.Discounts)
                                     .Sum(x => x.DiscountAmount);

                    var dgifts = ReportContext.Tickets
                                 .SelectMany(x => x.TicketItems)
                                 .Where(x => x.Gifted && x.DepartmentId == departmentInfo.DepartmentId)
                                 .Sum(x => x.GetItemValue());

                    report.AddRow(departmentInfo.DepartmentName + Resources.Incomes, Resources.VoidsTotal, "", dvoids.ToString(ReportContext.CurrencyFormat));
                    report.AddRow(departmentInfo.DepartmentName + Resources.Incomes, Resources.DiscountsTotal, "", ddiscounts.ToString(ReportContext.CurrencyFormat));
                    report.AddRow(departmentInfo.DepartmentName + Resources.Incomes, Resources.GiftsTotal, "", dgifts.ToString(ReportContext.CurrencyFormat));
                }
            }

            //--

            if (ReportContext.Tickets.Select(x => x.GetTagData()).Where(x => !string.IsNullOrEmpty(x)).Distinct().Count() > 0)
            {
                var dict = new Dictionary <string, List <Ticket> >();

                foreach (var ticket in ReportContext.Tickets.Where(x => !string.IsNullOrEmpty(x.Tag)))
                {
                    var tags = ticket.Tag.Split(new[] { '\r' }, StringSplitOptions.RemoveEmptyEntries);
                    foreach (var tag in tags)
                    {
                        if (!dict.ContainsKey(tag))
                        {
                            dict.Add(tag, new List <Ticket>());
                        }
                        dict[tag].Add(ticket);
                    }
                }

                var tagGroups = dict.Select(x => new TicketTagInfo {
                    Amount = x.Value.Sum(y => y.GetSumWithoutTax()), TicketCount = x.Value.Count, TagName = x.Key
                }).OrderBy(x => x.TagName);

                var tagGrp = tagGroups.GroupBy(x => x.TagName.Split(':')[0])
                             .Where(x => ReportContext.TicketTagGroups.SingleOrDefault(y => y.Name == x.Key) != null);

                if (tagGrp.Count() > 0)
                {
                    report.AddColumTextAlignment("Etiket", TextAlignment.Left, TextAlignment.Right, TextAlignment.Right);
                    report.AddColumnLength("Etiket", "45*", "Auto", "35*");
                    report.AddTable("Etiket", Resources.TicketTags, "", "");
                }

                foreach (var grp in tagGrp)
                {
                    var tag = ReportContext.TicketTagGroups.SingleOrDefault(x => x.Name == grp.Key);
                    if (tag == null || tag.ExcludeInReports)
                    {
                        continue;
                    }

                    report.AddBoldRow("Etiket", grp.Key, "", "");

                    if (tag.PriceTags)
                    {
                        var tCount = grp.Sum(x => x.TicketCount);
                        var tSum   = grp.Sum(x => Convert.ToDecimal(x.TagName.Split(':')[1]) * x.TicketCount);
                        var amnt   = grp.Sum(x => x.Amount);
                        var rate   = tSum / amnt;
                        report.AddRow("Etiket", string.Format(Resources.TotalAmount_f, tag.Name), "", tSum.ToString(ReportContext.CurrencyFormat));
                        report.AddRow("Etiket", Resources.TicketCount, "", tCount);
                        report.AddRow("Etiket", Resources.TicketTotal, "", amnt.ToString(ReportContext.CurrencyFormat));
                        report.AddRow("Etiket", Resources.Rate, "", rate.ToString("%#0.##"));
                        continue;
                    }

                    foreach (var ticketTagInfo in grp)
                    {
                        report.AddRow("Etiket",
                                      ticketTagInfo.TagName.Split(':')[1],
                                      ticketTagInfo.TicketCount,
                                      ticketTagInfo.Amount.ToString(ReportContext.CurrencyFormat));
                    }

                    var totalAmount = grp.Sum(x => x.Amount);
                    report.AddRow("Etiket", string.Format(Resources.TotalAmount_f, tag.Name), "", totalAmount.ToString(ReportContext.CurrencyFormat));

                    var sum = 0m;

                    if (tag.NumericTags)
                    {
                        try
                        {
                            sum = grp.Sum(x => Convert.ToDecimal(x.TagName.Split(':')[1]) * x.TicketCount);
                            report.AddRow("Etiket", string.Format(Resources.TicketTotal_f, tag.Name), "", sum.ToString("#,##.##"));
                        }
                        catch (FormatException)
                        {
                            report.AddRow("Etiket", string.Format(Resources.TicketTotal_f, tag.Name), "", "#Hata!");
                        }
                    }
                    else
                    {
                        sum = grp.Sum(x => x.TicketCount);
                    }
                    if (sum > 0)
                    {
                        var average = totalAmount / sum;
                        report.AddRow("Etiket", string.Format(Resources.TotalAmountDivTag_f, tag.Name), "", average.ToString(ReportContext.CurrencyFormat));
                    }
                }
            }

            //----

            var owners = ReportContext.Tickets.SelectMany(ticket => ticket.TicketItems.Select(ticketItem => new { Ticket = ticket, TicketItem = ticketItem }))
                         .GroupBy(x => new { x.TicketItem.CreatingUserId })
                         .Select(x => new UserInfo {
                UserId = x.Key.CreatingUserId, Amount = x.Sum(y => MenuGroupBuilder.CalculateTicketItemTotal(y.Ticket, y.TicketItem))
            });

            report.AddColumTextAlignment("Garson", TextAlignment.Left, TextAlignment.Right);
            report.AddColumnLength("Garson", "65*", "35*");
            report.AddTable("Garson", Resources.UserSales, "");

            foreach (var ownerInfo in owners)
            {
                report.AddRow("Garson", ownerInfo.UserName, ownerInfo.Amount.ToString(ReportContext.CurrencyFormat));
            }
            //---

            var uInfo = ReportContext.Tickets.SelectMany(x => x.Payments).Select(x => x.UserId).Distinct().Select(
                x => new UserInfo {
                UserId = x
            });

            if (uInfo.Count() > 1)
            {
                foreach (var userInfo in uInfo)
                {
                    var info      = userInfo;
                    var uPayments = ReportContext.Tickets
                                    .SelectMany(x => x.Payments)
                                    .Where(x => x.UserId == info.UserId)
                                    .GroupBy(x => new { x.PaymentType })
                                    .Select(x => new TenderedAmount {
                        PaymentType = x.Key.PaymentType, Amount = x.Sum(y => y.Amount)
                    });

                    report.AddColumnLength(userInfo.UserName + Resources.Incomes, "40*", "Auto", "35*");
                    report.AddColumTextAlignment(userInfo.UserName + Resources.Incomes, TextAlignment.Left, TextAlignment.Right, TextAlignment.Right);
                    report.AddTable(userInfo.UserName + Resources.Incomes, string.Format(Resources.ReceivedBy_f, userInfo.UserName), "", "");
                    report.AddRow(userInfo.UserName + Resources.Incomes, Resources.Cash, GetPercent(0, uPayments), GetAmount(0, uPayments).ToString(ReportContext.CurrencyFormat));
                    report.AddRow(userInfo.UserName + Resources.Incomes, Resources.CreditCard, GetPercent(1, uPayments), GetAmount(1, uPayments).ToString(ReportContext.CurrencyFormat));
                    report.AddRow(userInfo.UserName + Resources.Incomes, Resources.Voucher, GetPercent(2, uPayments), GetAmount(2, uPayments).ToString(ReportContext.CurrencyFormat));
                    report.AddRow(userInfo.UserName + Resources.Incomes, Resources.AccountBalance, GetPercent(3, uPayments), GetAmount(3, uPayments).ToString(ReportContext.CurrencyFormat));
                    report.AddRow(userInfo.UserName + Resources.Incomes, Resources.Total, "", uPayments.Sum(x => x.Amount).ToString(ReportContext.CurrencyFormat));
                }
            }

            //---

            var menuGroups = MenuGroupBuilder.CalculateMenuGroups(ReportContext.Tickets, ReportContext.MenuItems);

            report.AddColumTextAlignment("Gıda", TextAlignment.Left, TextAlignment.Right, TextAlignment.Right);
            report.AddColumnLength("Gıda", "45*", "Auto", "35*");
            report.AddTable("Gıda", Resources.ItemSales, "", "");

            foreach (var menuItemInfo in menuGroups)
            {
                report.AddRow("Gıda", menuItemInfo.GroupName,
                              string.Format("%{0:0.00}", menuItemInfo.Rate),
                              menuItemInfo.Amount.ToString(ReportContext.CurrencyFormat));
            }

            report.AddRow("Gıda", Resources.Total.ToUpper(), "", menuGroups.Sum(x => x.Amount).ToString(ReportContext.CurrencyFormat));
            return(report.Document);
        }