public void ProcessSalesOrderEvents() { int noErrors = 0; int idleDelay = Convert.ToInt32(ConfigurationManager.AppSettings["idleDelay"] ?? "60"); int errorsDelay = Convert.ToInt32(ConfigurationManager.AppSettings["errorsDelay"] ?? "300"); int maxErrors = Convert.ToInt32(ConfigurationManager.AppSettings["errorsCount"] ?? "10"); bool idle = false; while (true) { try { using (TrackerEntitiesContainer tec = TrackerEntitiesManager.GetNewTrackerObjectContext()) { //Open connection before any operation on context in order to ensure that all operations will run under same local transaction!! tec.Connection.Open(); GetCurrentSalesOrdersQueue(tec); if (SalesOrderId.HasValue && SalesOrderId != Guid.Empty) { SalesOrderSnapshot newSnapshot = TrackerEntitiesManager.Instance.CreateNewSalesOrderSnapshot(SalesOrderId.Value); if (newSnapshot == null) { throw new ApplicationException("Nie odnaleziono obiektu o id = " + SalesOrderId); } SalesOrderSnapshot oldSnapshot = TrackerEntitiesManager.Instance.GetSalesOrderSnapshot(SalesOrderId.Value, tec); var previousEvents = TrackerEntitiesManager.Instance.CreateEventsList(oldSnapshot); var currentEvents = TrackerEntitiesManager.Instance.CreateEventsList(newSnapshot); var newEvents = GetNewEvents(previousEvents, currentEvents); newEvents = newEvents.Where(ev => ev.EventDate >= TemplatesCache.StartDate).ToList(); List <Message> newMessages = GenerateMessages(newSnapshot, newEvents); MarkSalesOrdersQueueAsCompleted(); SaveEntities(newSnapshot, oldSnapshot, newMessages, tec); } else { idle = true; } } if (idle == true) { Thread.Sleep(TimeSpan.FromSeconds(idleDelay)); idle = false; } } catch (Exception ex) { noErrors++; Utils.LogException(ex, typeof(MessagingLogic), ConfigurationManager.AppSettings["LogFolder"]); if (noErrors == maxErrors) { Thread.Sleep(TimeSpan.FromSeconds(errorsDelay)); noErrors = 0; } } } }
private void SaveEntities(SalesOrderSnapshot salesOrderSnapshot, SalesOrderSnapshot oldSnapshot , List <Message> messages, TrackerEntitiesContainer tec) { using (TransactionScope ts = new TransactionScope()) { TrackerEntitiesManager.Instance.InsertMessages(messages, tec); TrackerEntitiesManager.Instance.PersistSalesOrderSnapshot(salesOrderSnapshot, oldSnapshot, messages, tec); TrackerEntitiesManager.Instance.UpdateSOTQEntries(SalesOrdersCurrentFullQueue, tec); ts.Complete(); } }
private List <Message> GenerateMessages(SalesOrderSnapshot salesOrderSnapshot, List <Event> events) { Contractor contractor = salesOrderSnapshot.Contractor; events = events.OrderBy(ev => ev.EventDate).ThenBy(ev => ev.Name).ToList(); List <Message> result = new List <Message>(); bool emailEnabled = contractor.HasEmailAddress; bool smsEnabled = !contractor.HasEmailAddress && contractor.HasPhoneNumber && !contractor.IsAps; if (emailEnabled || smsEnabled) { MessageType defaultMessageType = smsEnabled ? MessageType.Sms : MessageType.Email; foreach (Event newEvent in events) { //Nie generujemy powiadomienia o wystawieniu FSR dla zamówień towarowych if (newEvent.Name == EventName.DocumentSettled && salesOrderSnapshot.SalesTypeName == SalesTypeName.Items) { continue; } MessageType usedType = newEvent.Name == EventName.MarkedAsPlanned && emailEnabled ? MessageType.Email : defaultMessageType; string recipient = usedType == MessageType.Email ? contractor.Email : contractor.Phone; string sender = usedType == MessageType.Email ? TemplatesCache.EmailSender : TemplatesCache.SmsSender; SOTMessage message = new SOTMessage(newEvent.Name, usedType, sender, recipient, newEvent.Parameters); if (message != null && message.InnerMessage != null) { result.Add(message.InnerMessage); } } } return(result); }