public void GenerateSalesReport(string fileName = DefaultSaleReportFileName)
        {
            XmlDocument report = new XmlDocument();
            XmlDeclaration xmlDeclaration = report.CreateXmlDeclaration("1.0", "UTF-8", null);
            XmlElement root = report.CreateElement("sales");
            report.AppendChild(root);
            report.InsertBefore(xmlDeclaration, root);
            using (var db = new CarPartsDbContext())
            {
                var groupedSales = db.Sales.GroupBy(s => s.Vendor)
                                        .ToList();

                foreach (var group in groupedSales)
                {
                    XmlElement sale = report.CreateElement("sale");
                    sale.SetAttribute("vendor", group.Key.Name);
                    root.AppendChild(sale);
                    foreach (var s in group)
                    {
                        XmlElement summary = report.CreateElement("summary");
                        summary.SetAttribute("date", s.Date.ToString("dd-MMM-yyyy", CultureInfo.InvariantCulture));
                        summary.SetAttribute("total-sum", (s.UnitPrice * s.Quantity).ToString());
                        sale.AppendChild(summary);
                    }
                }
            }

            if (!Directory.Exists(this.reportsDestinationPath))
            {
                Directory.CreateDirectory(this.reportsDestinationPath);
            }

            report.Save(this.reportsDestinationPath + fileName);
        }
        private void WriteSalesToSqlServer(IEnumerable<Sale> sales)
        {
            using (var db = new CarPartsDbContext())
            {
                foreach (var sale in sales)
                {
                    db.Sales.Add(sale);
                }

                db.SaveChanges();
            }
        }
        public void GenerateSalesInfoPdf()
        {
            var doc = new Document(PageSize.A4, 50, 50, 25, 25);
            string resultFileName = DateTime.Now.ToString("yyyy-MM-dd") + "-" + Guid.NewGuid() + ".pdf";

            var output = new FileStream(DefaultFilePath + resultFileName, FileMode.Create, FileAccess.Write);
            PdfWriter.GetInstance(doc, output);

            doc.Open();

            using (var db = new CarPartsDbContext())
            {
                var salesGroups = db.Sales.GroupBy(s => s.Date)
                                    .ToList();
                foreach (var salesGroup in salesGroups)
                {
                    PdfPTable table = new PdfPTable(5);
                    PdfPCell heading = new PdfPCell(new Phrase("Sales Information"));
                    heading.Colspan = 5;
                    heading.HorizontalAlignment = 1; //// 0=Left, 1=Centre, 2=Right
                    string dateHeading = string.Format("Date: {0}", salesGroup.FirstOrDefault().Date.ToShortDateString());
                    PdfPCell date = new PdfPCell(new Phrase(dateHeading));
                    date.Colspan = 5;
                    date.HorizontalAlignment = 1; //// 0=Left, 1=Centre, 2=Right
                    table.AddCell(heading);
                    table.AddCell(date);
                    table.AddCell("Part Name");
                    table.AddCell("Quantity");
                    table.AddCell("Unit Price");
                    table.AddCell("Vendor Name");
                    table.AddCell("Sum");

                    var sales = salesGroup.ToList();

                    foreach (var sale in sales)
                    {
                        table.AddCell(sale.Part.Name);
                        table.AddCell(sale.Quantity.ToString());
                        table.AddCell(sale.UnitPrice.ToString());
                        table.AddCell(sale.Vendor.Name);
                        table.AddCell(sale.Sum.ToString());
                    }

                    string total = string.Format("Total sum for : {0}", salesGroup.FirstOrDefault().Date.ToShortDateString());
                    PdfPCell totalForDate = new PdfPCell(new Phrase(total));
                    totalForDate.Colspan = 4;
                    totalForDate.HorizontalAlignment = 2; //// 0=Left, 1=Centre, 2=Right
                    table.AddCell(totalForDate);

                    string totalSumForDate = sales.Sum(s => s.Sum).ToString();
                    table.AddCell(totalSumForDate);
                    doc.Add(table);
                }

                PdfPTable footerTable = new PdfPTable(5);
                string totalSum = string.Format("Grand total: {0}", db.Sales.ToList().Sum(s => s.Sum));
                PdfPCell footer = new PdfPCell(new Phrase(totalSum));
                footer.Colspan = 5;
                footer.HorizontalAlignment = 2; //// 0=Left, 1=Centre, 2=Right
                footerTable.AddCell(footer);

                doc.Add(footerTable);
                doc.Close();
            }
        }