internal static string GetEntityConnection(RkeeperLoaderSettings settings) { EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder { Provider = settings.ProviderName, ProviderConnectionString = settings.ConnectionString, Metadata = "res://*/Database.RKeeperDB.csdl|res://*/Database.RKeeperDB.ssdl|res://*/Database.RKeeperDB.msl" }; // Set the provider name. //entityBuilder.ConnectionString = settings.ConnectionString; // Set the provider-specific connection string. // Set the Metadata location. return(entityBuilder.ConnectionString); }
public static IEnumerable <RKReport> GetReports(RkeeperLoaderSettings settings) { using (var db = new RKeeperEntities(GetEntityConnection(settings))) { db.Database.CommandTimeout = 1800; var startDateTime = settings.UploadLastDays > 0 ? DateTime.Now.AddDays(-settings.UploadLastDays) : settings.ReportStartDateTime; var endDateTime = settings.UploadLastDays > 0 ? DateTime.Now : settings.ReportEndDateTime; startDateTime = startDateTime.AbsoluteStart(); endDateTime = endDateTime.AbsoluteEnd(); var menuItemCode = settings.menuItemCode; var classificationGroupSIFR = settings.ClassificationGroupSIFR; var restaurantCode = settings.restaurantCode; var shiftNum = settings.shiftNum; var reports = (from PAYBINDING in db.PAYBINDINGS join CURRLINE in db.CURRLINES on new { visit = PAYBINDING.VISIT, midServer = PAYBINDING.MIDSERVER, currUNI = PAYBINDING.CURRUNI ?? -1 } equals new { visit = CURRLINE.VISIT, midServer = CURRLINE.MIDSERVER, currUNI = CURRLINE.UNI } join PRINTCHECK in db.PRINTCHECKS on new { visit = CURRLINE.VISIT, midServer = CURRLINE.MIDSERVER, currUNI = CURRLINE.CHECKUNI ?? -1 } equals new { visit = PRINTCHECK.VISIT, midServer = PRINTCHECK.MIDSERVER, currUNI = PRINTCHECK.UNI } join CURRENCYTYPE in db.CURRENCYTYPES on CURRLINE.IHIGHLEVELTYPE equals CURRENCYTYPE.SIFR join CURRENCY in db.CURRENCIES on CURRLINE.SIFR equals CURRENCY.SIFR join CASHGROUP in db.CASHGROUPS on PAYBINDING.MIDSERVER equals CASHGROUP.SIFR join RESTAURANT in db.RESTAURANTS on CASHGROUP.RESTAURANT equals RESTAURANT.SIFR join VISIT in db.VISITS on new { visit = CURRLINE.VISIT, midServer = PAYBINDING.MIDSERVER } equals new { visit = VISIT.SIFR, midServer = VISIT.MIDSERVER } join ORDER in db.ORDERS on new { visit = PAYBINDING.VISIT, identInVisit = PAYBINDING.ORDERIDENT ?? -1, midServer = PAYBINDING.MIDSERVER } equals new { visit = ORDER.VISIT, identInVisit = ORDER.IDENTINVISIT, midServer = ORDER.MIDSERVER } join SALEOBJECT in db.SALEOBJECTSSet on new { visit = PAYBINDING.VISIT, midServer = PAYBINDING.MIDSERVER, dishUNI = PAYBINDING.DISHUNI ?? -1, chargeUNI = PAYBINDING.CHARGEUNI ?? -1 } equals new { visit = SALEOBJECT.VISIT, midServer = SALEOBJECT.MIDSERVER, dishUNI = SALEOBJECT.DISHUNI, chargeUNI = SALEOBJECT.CHARGEUNI ?? -1 } join GLOBALSHIFT in db.GLOBALSHIFTS on new { shift = ORDER.ICOMMONSHIFT ?? -1, midServer = ORDER.MIDSERVER } equals new { shift = GLOBALSHIFT.SHIFTNUM, midServer = GLOBALSHIFT.MIDSERVER } join SESSIONDISH in db.SESSIONDISHES on new { visit = PAYBINDING.VISIT, midServer = PAYBINDING.MIDSERVER, dishUNI = SALEOBJECT.DISHUNI } equals new { visit = SESSIONDISH.VISIT, midServer = SESSIONDISH.MIDSERVER, dishUNI = SESSIONDISH.UNI } join MENUITEM in db.MENUITEMS on SESSIONDISH.SIFR equals MENUITEM.SIFR join DISHGROUP in db.DISHGROUPS on MENUITEM.SIFR equals DISHGROUP.CHILD join CLASSIFICATORGROUP in db.CLASSIFICATORGROUPS on new { classoficatorId = DISHGROUP.PARENT ?? -1, ClassificationGroupSIFR = classificationGroupSIFR } equals new { classoficatorId = CLASSIFICATORGROUP.SIFR * 256 + CLASSIFICATORGROUP.NUMINGROUP, ClassificationGroupSIFR = classificationGroupSIFR == 0 ? (short)0 : CLASSIFICATORGROUP.SIFR } join DISCPART in db.DISCPARTS on new { visit = SALEOBJECT.VISIT, MidServer = SALEOBJECT.MIDSERVER, bindingUNI = PAYBINDING.UNI } equals new { visit = DISCPART.VISIT, MidServer = DISCPART.MIDSERVER, bindingUNI = DISCPART.BINDINGUNI } into LEFTJOINDISCPARTS join TABLE in db.TABLES on ORDER.TABLEID equals TABLE.SIFR into TABLES where (shiftNum == -1 || GLOBALSHIFT.SHIFTNUM == shiftNum) && (shiftNum != -1 || (GLOBALSHIFT.SHIFTDATE.Value >= startDateTime && GLOBALSHIFT.SHIFTDATE.Value <= endDateTime)) && (restaurantCode == 0 || RESTAURANT.CODE == restaurantCode) && (PRINTCHECK.STATE == 6) && (menuItemCode <= 0 || MENUITEM.CODE == menuItemCode) select new { CLASSIFICATORGROUP, RESTAURANT, CURRENCYTYPE, CURRENCY, PAYBINDING, VISIT, GLOBALSHIFT, LEFTJOINDISCPARTS, MENUITEM, SALEOBJECT, TABLES }) .ToList(); var groups = from report in reports group report by new { ClassficatorGroup = report.CLASSIFICATORGROUP, Restaurant = report.RESTAURANT, CurrencyType = report.CURRENCYTYPE, Currency = report.CURRENCY, DiscountType = new { code = 1, name = "Без скидки" }, MenuItem = report.MENUITEM, Visit = report.VISIT, GlobalShiftStartTime = report.GLOBALSHIFT.SHIFTDATE.Value.AbsoluteStart(), SaleObject = report.SALEOBJECT, Table = report.TABLES.DefaultIfEmpty(null).First(), Shift = report.GLOBALSHIFT, } into groupedReports select new RKReport { ClassficatorGroup = new Element { Code = groupedReports.Key.ClassficatorGroup.CODE ?? -1, Name = RemoveInvalidXmlChars(groupedReports.Key.ClassficatorGroup.NAME) }, Restaurant = new Element { Code = AddPrefix(groupedReports.Key.Restaurant.CODE ?? -1, settings.databasePrefix), Name = RemoveInvalidXmlChars(groupedReports.Key.Restaurant.NAME) }, CurrencyType = new Element { Code = groupedReports.Key.CurrencyType.CODE ?? -1, Name = RemoveInvalidXmlChars(groupedReports.Key.CurrencyType.NAME) }, Currency = new Element { Code = groupedReports.Key.Currency.CODE ?? -1, Name = RemoveInvalidXmlChars(groupedReports.Key.Currency.NAME) }, DiscountType = new Element { Code = groupedReports.Key.DiscountType.code, Name = RemoveInvalidXmlChars(groupedReports.Key.DiscountType.name) }, Visit = new Element { Code = groupedReports.Key.Visit.SIFR, Name = groupedReports.Key.Visit.STARTTIME.ToString() }, MenuItem = new Element { Code = groupedReports.Key.MenuItem.CODE ?? 0, Name = RemoveInvalidXmlChars(groupedReports.Key.MenuItem.NAME) }, Sum = groupedReports.Sum(x => x.PAYBINDING.PAYSUM ?? 0), PaySum = groupedReports.Sum(x => x.PAYBINDING.PRICESUM ?? 0), DiscountSum = 0, Quntity = groupedReports.Sum(x => x.SALEOBJECT.QUANTITY ?? 0), VisitQuitTime = groupedReports.Key.GlobalShiftStartTime, Table = new TableRepresent { Code = groupedReports.Key.Table?.CODE ?? -1, Name = RemoveInvalidXmlChars(groupedReports.Key.Table?.NAME ?? "Без стола"), Hall = groupedReports.Key.Table?.HALL ?? -1 }, Shift = new Element { Code = groupedReports.Key.Shift.SHIFTNUM, Name = RemoveInvalidXmlChars($"{groupedReports.Key.Shift.STARTTIME}") } }; var discountSIFR = new List <int>(); foreach (var report in reports) { foreach (var discount in report.LEFTJOINDISCPARTS) { discountSIFR.Add(discount.SIFR ?? -1); } } var discountObjects = (from DISCOUNT in db.DISCOUNTS where discountSIFR.Contains(DISCOUNT.SIFR) select DISCOUNT).ToList(); var discounts = new List <RKReport>(); foreach (var report in reports) { foreach (var discpart in report.LEFTJOINDISCPARTS) { var discount = discountObjects.FirstOrDefault(discountLambda => discountLambda.SIFR == discpart.SIFR); var currentTable = report.TABLES.DefaultIfEmpty(null).First(); var table = currentTable == null ? new { code = -1, name = "Без стола", hall = -1 } : new { code = currentTable?.CODE ?? -1, name = currentTable?.NAME ?? "Без стола", hall = currentTable?.HALL ?? -1 }; var currentRKReport = new RKReport { ClassficatorGroup = new Element { Code = report.CLASSIFICATORGROUP.CODE ?? -1, Name = RemoveInvalidXmlChars(report.CLASSIFICATORGROUP.NAME) }, Restaurant = new Element { Code = AddPrefix(report.RESTAURANT.CODE ?? -1, settings.databasePrefix), Name = RemoveInvalidXmlChars(report.RESTAURANT.NAME) }, CurrencyType = new Element { Code = report.CURRENCYTYPE.CODE ?? -1, Name = RemoveInvalidXmlChars(report.CURRENCYTYPE.NAME) }, Currency = new Element { Code = report.CURRENCY.CODE ?? -1, Name = RemoveInvalidXmlChars(report.CURRENCY.NAME) }, DiscountType = new Element { Code = discount.SIFR, Name = RemoveInvalidXmlChars(discount.NAME) }, Visit = new Element { Code = report.VISIT.SIFR, Name = report.VISIT.STARTTIME.ToString() }, MenuItem = new Element { Code = report.MENUITEM.CODE ?? 0, Name = RemoveInvalidXmlChars(report.MENUITEM.NAME) }, Sum = 0, PaySum = 0, DiscountSum = -discpart.SUM ?? 0, Quntity = 0, VisitQuitTime = report.GLOBALSHIFT.SHIFTDATE.Value.AbsoluteStart(), Table = new TableRepresent { Code = table.code, Name = RemoveInvalidXmlChars(table.name), Hall = table.hall } }; discounts.Add(currentRKReport); } } var result = groups.Union(discounts); return(result.OrderBy(x => x.Restaurant.Code).ThenBy(x => x.VisitQuitTime)); } }