/// <summary> /// Schreibt den aktuellen Rechnungslaufstatus in die Datenbank /// </summary> /// <param name="currIndex">Auftragsindex</param> /// <param name="pil">RechnungslaufDatensatz</param> private void WritePilotStatus( int currIndex, InvoiceRunReport pil) { int lastIndexState = 0; try { var invoiceRunReport = dbContext.InvoiceRunReport.FirstOrDefault(q => q.Id == pil.Id); if (lastIndexState < 100) { double myValue = elementsToDoCount; lastIndexState = Convert.ToInt32(100/myValue * currIndex); if (invoiceRunReport != null) { invoiceRunReport.InvoiceRunProgress = lastIndexState; } } else { lastIndexState = 100; invoiceRunReport.InvoiceRunProgress = lastIndexState; invoiceRunReport.FinishedDate = DateTime.Now; } dbContext.SubmitChanges(); } catch (Exception ex) { log.Error("Fehler beim Rechnungslauf in WritePilotStatus: " + ex.Message); dbContext.WriteLogItem("Fehler beim Rechnungslauf in WritePilotStatus: " + ex.Message, LogTypes.ERROR); } }
/// <summary> /// Erstellt einen neuen Rechnungslauf Datensatz /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void GenerateInvoiceRunButton_Click(object sender, EventArgs e) { InvoiceRunError.Text = ""; using (DataClasses1DataContext dbContext = new DataClasses1DataContext()) { try { int? customerId = null; int? invoiceType = null; if (CustomerDropDownList.SelectedValue != string.Empty) customerId = Int32.Parse(CustomerDropDownList.SelectedValue); if (RechnungsTypComboBox.SelectedValue != string.Empty && RechnungsTypComboBox.Enabled == true) invoiceType = Int32.Parse(RechnungsTypComboBox.SelectedValue); InvoiceRunReport run = new InvoiceRunReport() { CustomerId = customerId, InvoiceTypeId = invoiceType, CreateDate = DateTime.Now }; dbContext.InvoiceRunReport.InsertOnSubmit(run); dbContext.SubmitChanges(); RadGridInvoiceRun.MasterTableView.ClearChildEditItems(); RadGridInvoiceRun.MasterTableView.ClearEditItems(); RadGridInvoiceRun.Rebind(); } catch (Exception ex) { InvoiceRunError.Visible = true; InvoiceRunError.Text = "Rechnungslauf Fehler " + ex.Message; dbContext.WriteLogItem("Rechnungslauf Error " + ex.Message, LogTypes.ERROR, "Rechnungslauf"); } } }
/// <summary> /// Gibt alle fuer den Rechnungslauf relevanten Auftraege zurueck /// </summary> /// <param name="currentReport"></param> /// <returns></returns> private IQueryable<VirtualOrder> getOrders(InvoiceRunReport currentReport) { IQueryable<VirtualOrder> v_orders = null; try { log.Info("Lese aufträge für den Rechnungslauf:" + currentReport.Id); v_orders = from cust in dbContext.Customer join ord in dbContext.Order on cust.Id equals ord.CustomerId join lrcust in dbContext.LargeCustomer on cust.Id equals lrcust.CustomerId where (ord.Status == 600 || ord.Status == 700) orderby ord.Ordernumber descending select new VirtualOrder { OrderId = ord.Id, Location = ord.Location.Name, OrderNumber = ord.Ordernumber, ExecutionDate = ord.ExecutionDate, OrderLocation = ord.LocationId, OrderDate = ord.ExecutionDate, CustomerId = cust.Id, IvoiceTypeId = lrcust.InvoiceTypesID, LocationName = ord.Location.Name, LocationId = ord.LocationId, ReportId = currentReport.Id }; if (currentReport.CustomerId != null) { v_orders= v_orders.Where(q => q.CustomerId == currentReport.CustomerId); } if (currentReport.InvoiceTypeId != null) { v_orders= v_orders.Where(q => q.IvoiceTypeId == currentReport.InvoiceTypeId); } log.Info("Auslesen erfolgreich:" + currentReport.Id); } catch (Exception ex) { v_orders = null; log.AddcompanyMessages("Fehler beim Rechnungslauf, bitte kontaktieren Sie den Administrator, dieser hat eine Einsicht in die Detaillogs"); log.Error("Fehler beim Rechnungslauf in getOrders: " + ex.Message); dbContext.WriteLogItem("Fehler beim Rechnungslauf in getOrders: " + ex.Message, LogTypes.ERROR); } return v_orders; }
/// <summary> /// Rechnungen drucken /// </summary> /// <param name="rep"></param> private void PrintInvoices(InvoiceRunReport rep) { try { TransactionScope ts=null; List<_Accounts> acc = null; invoices.AddRange(getInvoices(rep).ToList()); log.Info("Erstelle Rechnungen für den Rechnungslauf:" + rep.Id); log.AddcompanyMessages("Abgeschlossene Aufträge werden nun verrechnet, insgesamt: " + invoices.Count); foreach (var inv in invoices) { WritePilotStatus(currOrderIndex, rep); currOrderIndex++; log.Info("Erstelle Buchungskosten für die Rechnung mit der ID:" + inv.Id); try { if (inv.InvoiceItem.Count <= 0) { throw new Exception("Die Rechnung konnte nicht gebucht werden, da für diese Rechnung keine Rechnungspositionen verbucht wurden. Rechnungsid: " + inv.Id); } acc = Accounts.generateAccountNumber(dbContext, inv.Id).ToList(); using (ts = new TransactionScope()) { if (acc != null && acc.Count() == inv.InvoiceItem.Count) { foreach (var thisItems in acc) { var myAccount = new InvoiceItemAccountItem { IIACCID = Guid.NewGuid(), InvoiceItemId = thisItems.InvoiceItemId, RevenueAccountText = thisItems.AccountNumber }; log.AddcompanyMessages("Erlöskonto mit der Nummer:" + myAccount.RevenueAccountText + " wird in die Rechnung übernommen"); log.Info("Erstellt Erlöskonto mit der ID:" + myAccount.IIACCID); var contains = dbContext.InvoiceItemAccountItem.FirstOrDefault(q => q.InvoiceItemId == thisItems.InvoiceItemId && q.RevenueAccountText == thisItems.AccountNumber.Trim()); if (contains != null) { log.Error("Fehler, für diese Rechnungspostion mit der id:" + thisItems.InvoiceItemId + " wurde bereits ein Erlöskonto angelegt! Die Rechnung mit der ID:" + inv.Id + " kann nicht erstellt werden."); contains.RevenueAccountText = thisItems.AccountNumber.Trim(); } else { dbContext.InvoiceItemAccountItem.InsertOnSubmit(myAccount); } dbContext.SubmitChanges(); } using (MemoryStream memS = new MemoryStream()) { inv.LogDBContext = dbContext; inv.Print(dbContext, memS, ""); dbContext.SubmitChanges(); } Guid? locationId = null; locationId = (from inv_ in dbContext.Invoice join oi in dbContext.OrderInvoice on inv_.Id equals oi.InvoiceId join myorder in dbContext.Order on oi.OrderId equals myorder.Id where inv_.Id == inv.Id select myorder).First().LocationId; //inv.OrderInvoice.First().Order.LocationId; if (inv.Customer.LargeCustomer.SendInvoiceByEmail) { var emails = inv.Customer.LargeCustomer.GetMailinglistAdresses(dbContext, locationId, "Rechnung"); foreach (var mails in emails) { log.AddcompanyMessages("Rechnung: " + inv.InvoiceNumber.Number + " wird per Email an: " + mails + " versendet"); } Invoice.SendByMail(dbContext, inv.Id, ConfigurationManager.AppSettings["smtpHost"], ConfigurationManager.AppSettings["FromEmail"], emails); } else { log.AddcompanyMessages("Rechnung: " + inv.InvoiceNumber.Number + " wurde erstellt und ist im CASE System zu finden, da der Kunde:"+inv.Customer.CustomerNumber+" kein Mailversand als Rechnungsversand definiert hat."); } ts.Complete(); log.Info("Rechnung: " + inv.InvoiceNumber.Number + " wurde gedruckt und abgeschlossen."); log.AddcompanyMessages("Rechnung: " + inv.InvoiceNumber.Number + " wurde gedruckt und abgeschlossen."); } else { throw new Exception("Die Rechnung enthält keine Erlöskontent. Rechnungsid: " + inv.Id); } } } catch (Exception ex) { if(ts!=null) ts.Dispose(); log.Error("Fehler beim Rechnungslauf in PrintInvoices:"+ex.Message); log.AddcompanyMessages("Fehler beim Rechnungslauf:" + ex.Message); log.AddcompanyMessages("Bitte korrigieren Sie wenn möglich den Fehler und starten einen neuen Rechnungslauf, da die Änderungen verworfen wurden."); dbContext.WriteLogItem("Fehler beim Rechnungslauf in PrintInvoices:"+ex.Message, LogTypes.ERROR); continue; } } var invoiceRunReport = dbContext.InvoiceRunReport.FirstOrDefault(q => q.Id == rep.Id); invoiceRunReport.LogDBContext = dbContext; invoiceRunReport.InvoiceRunProgress = 100; invoiceRunReport.FinishedDate = DateTime.Now; dbContext.SubmitChanges(); log.AddcompanyMessages("Rechnungslauf abgeschlossen"); } catch (Exception ex) { log.AddcompanyMessages("Fehler beim Rechnungslauf/Rechnungsdruck, bitte kontaktieren Sie den Administrator, dieser hat die Einsicht in die Detaillogs."); log.Error("Fehler beim Rechnungslauf in PrintInvoices: " + ex.Message); dbContext.WriteLogItem("Fehler beim Rechnungslauf in PrintInvoices: " + ex.Message, LogTypes.ERROR); } }
/// <summary> /// Gibt alle Rechnungen zurueck, die zum Fertigstellen sind /// </summary> /// <param name="currentReport"></param> /// <returns></returns> private List<Invoice> getInvoices(InvoiceRunReport currentReport) { List<Invoice> v_invoices = null; try { log.Info("Zähle Rechnungen für den Rechnungslauf:" + currentReport.Id); v_invoices = (from inv in dbContext.Invoice where (inv.canceled == null || inv.canceled == false) && inv.IsPrinted == false && !invoices.Contains(inv) orderby inv.CreateDate descending select inv).ToList(); if (currentReport.CustomerId != null) { v_invoices = v_invoices.Where(q => q.CustomerId == currentReport.CustomerId).ToList(); } if (currentReport.InvoiceTypeId != null) { v_invoices = v_invoices.Where(q => q.Customer.LargeCustomer.InvoiceTypesID == currentReport.InvoiceTypeId).ToList(); } log.Info("Abzählen getInvoices erfolgreich:" + currentReport.Id); } catch (Exception ex) { v_invoices = null; log.Error("Fehler beim Rechnungslauf in getOrders: " + ex.Message); dbContext.WriteLogItem("Fehler beim Rechnungslauf in getOrders: " + ex.Message, LogTypes.ERROR); } return v_invoices; }
/// <summary> /// Addiert Rechnungen und Auftraege zusammen damit bekannt ist, wie viele Postiionen zu erledigen sind /// </summary> /// <param name="currentReport"></param> /// <param name="orders"></param> /// <returns></returns> private int elementsToDo(InvoiceRunReport currentReport, IQueryable<VirtualOrder> orders) { try { var invoices = getInvoices(currentReport).ToList(); return invoices.Count + orders.ToList().Count(); } catch (Exception ex) { log.Error("Fehler beim Rechnungslauf in elementsToDo: " + ex.Message); dbContext.WriteLogItem("Fehler beim Rechnungslauf in elementsToDo: " + ex.Message, LogTypes.ERROR); } return 0; }
partial void DeleteInvoiceRunReport(InvoiceRunReport instance);
partial void UpdateInvoiceRunReport(InvoiceRunReport instance);
partial void InsertInvoiceRunReport(InvoiceRunReport instance);