private async Task <bool> StartRequery_New(object sender, System.Timers.ElapsedEventArgs args) { // testing code //PaymentOrder po = new PaymentOrder() { PaymentAmount = 35.05m, CurrencyCode = "MYR", Ipay88RefNo = "304 - ABETPQI" }; //var resT = PaymentQuery.Query.CheckPaymentPAID(po, 304, 786, "ABETPQI"); MayFlower db = new MayFlower(); PaymentQueueHandler.Components.BookingList bookedList = new PaymentQueueHandler.Components.BookingList(db, null); IEnumerable <SuperPNR> bookingProcessed = null; List <string> successProcessed = new List <string>(); List <Task <ProductReserve.BookingRespond> > bookResultTask = new List <Task <ProductReserve.BookingRespond> >(); if (sender.GetType().Name == "String" && !string.IsNullOrWhiteSpace(sender.ToString())) { string[] splitAttr = sender.ToString().Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); bool includeEXP = splitAttr.Length == 2; await bookedList.CheckUpdatePendingPayment(true, false, false, splitAttr[0]); bookingProcessed = bookedList.GetBookingPaid(splitAttr[0], true, false, false); } else { await bookedList.CheckUpdatePendingPayment(true, false, false); bookingProcessed = bookedList.GetAllBookingPaid(true, false, false); } List <string> dbChangeLog = new List <string>(); try { foreach (var booking in bookingProcessed.SelectMany(x => x.BookingHotels)) { string originalStatus = booking.BookingStatusCode; // requery payment true if (originalStatus != "CON") { if (booking.SupplierCode == "EAN") { dbChangeLog.Add(string.Format("Reserving {3} Booking: {0} - {1} [{2}]", booking.SuperPNRID, booking.SuperPNRNo, originalStatus, booking.SupplierCode)); BookingQuery.Expedia expedia = new BookingQuery.Expedia(); bookResultTask.Add(expedia.CheckoutReserveRoom(booking.BookingID, booking.BookingStatusCode, Alphareds.Module.Common.Core.GetAppSettingValueEnhanced("HostURL"), db)); } else if (booking.SupplierCode == "TP") { dbChangeLog.Add(string.Format("Reserving {3} Booking: {0} - {1} [{2}]", booking.SuperPNRID, booking.SuperPNRNo, originalStatus, booking.SupplierCode)); BookingQuery.Tourplan tourplan = new BookingQuery.Tourplan(); bookResultTask.Add(tourplan.CheckoutReserveRoom(booking.BookingID, booking.BookingStatusCode, Alphareds.Module.Common.Core.GetAppSettingValueEnhanced("HostURL"), db)); } else if (booking.SupplierCode == "JAC") { dbChangeLog.Add(string.Format("Reserving {3} Booking: {0} - {1} [{2}]", booking.SuperPNRID, booking.SuperPNRNo, originalStatus, booking.SupplierCode)); BookingQuery.JacTravel jactravel = new BookingQuery.JacTravel(); bookResultTask.Add(jactravel.CheckoutReserveRoom(booking.BookingID, booking.BookingStatusCode, Alphareds.Module.Common.Core.GetAppSettingValueEnhanced("HostURL"), db)); } else if (booking.SupplierCode == "HB") { dbChangeLog.Add(string.Format("Reserving {3} Booking: {0} - {1} [{2}]", booking.SuperPNRID, booking.SuperPNRNo, originalStatus, booking.SupplierCode)); BookingQuery.HotelBeds hotelbeds = new BookingQuery.HotelBeds(); bookResultTask.Add(hotelbeds.CheckoutReserveRoom(booking.BookingID, booking.BookingStatusCode, Alphareds.Module.Common.Core.GetAppSettingValueEnhanced("HostURL"), db)); } else if (booking.SupplierCode == "RAP") { dbChangeLog.Add(string.Format("Reserving {3} Booking: {0} - {1} [{2}]", booking.SuperPNRID, booking.SuperPNRNo, originalStatus, booking.SupplierCode)); BookingQuery.EANRapid _EANRapid = new BookingQuery.EANRapid(); bookResultTask.Add(_EANRapid.CheckoutReserveRoomCheckExist(booking.SuperPNRID, booking.BookingID, booking.BookingStatusCode, Alphareds.Module.Common.Core.GetAppSettingValueEnhanced("HostURL"), db)); } else { // Temp usage string msg = string.Format("Hotel Booking supplier stored doesn't found in code - {0} [{1}]", booking.SuperPNRNo, booking.BookingStatusCode); Logger logger = LogManager.GetCurrentClassLogger(); logger.Error(msg); eventLog1.WriteEntry(msg, EventLogEntryType.FailureAudit, 404); } } } var bookResultList = await Task.WhenAll(bookResultTask); } catch (AggregateException ae) { string msg = "Unexpected error occured. - " + DateTime.Now.ToLoggerDateTime() + Environment.NewLine + ae.ToString() + Environment.NewLine + Environment.NewLine + ae.GetBaseException().ToString(); eventLog1.WriteEntry(msg, EventLogEntryType.Error, 250); logger.Warn(msg); } catch (Exception ex) { string msg = "Unexpected error occured. - " + DateTime.Now.ToLoggerDateTime() + Environment.NewLine + ex.ToString() + Environment.NewLine + Environment.NewLine + ex.GetBaseException().ToString(); eventLog1.WriteEntry(msg, EventLogEntryType.Error, 250); logger.Warn(msg); } finally { /* Save change only at end, prevent open too much connection. * With this method also can shared used between frontend. * Which some content update by SP doesn't reflect to latest context.*/ try { await db.SaveChangesAsync(); } catch (Exception ex) { var changedInfo = db.ChangeTracker.Entries() .Where(t => t.State == System.Data.Entity.EntityState.Modified) .Select(t => new { Original = t.OriginalValues.PropertyNames.ToDictionary(pn => pn, pn => t.OriginalValues[pn]), Current = t.CurrentValues.PropertyNames.ToDictionary(pn => pn, pn => t.CurrentValues[pn]), }); //TODO: Add window service log string msg = Environment.NewLine + Environment.NewLine + JsonConvert.SerializeObject(changedInfo, Formatting.Indented, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); eventLog1.WriteEntry(ex.GetBaseException().Message.ToString() + msg, EventLogEntryType.Error, 250); logger.Error(ex, "Error while attemp to save db change on finally action." + msg); } } // Catch successed record incase any code error caused don't insert log. var completedResult = bookResultTask.Where(x => x.Status == TaskStatus.RanToCompletion).Select(x => x.Result); if (completedResult != null && completedResult.Count() > 0) { int successCount = completedResult.Count(x => x.BatchBookResult == ProductReserve.BookResultType.AllSuccess); int failCount = completedResult.Count(x => x.BatchBookResult == ProductReserve.BookResultType.AllFail); int partialFailCount = completedResult.Count(x => x.BatchBookResult == ProductReserve.BookResultType.PartialSuccess); eventLog1.WriteEntry(string.Format("Stopping requery Hotel Booking - " + DateTime.Now.ToLoggerDateTime() + Environment.NewLine + Environment.NewLine + "Total Booking : {0}" + Environment.NewLine + "All Book Success: {1}" + Environment.NewLine + "All Book Fail: {2}" + Environment.NewLine + "Partial Success: {3}" + Environment.NewLine + Environment.NewLine + Environment.NewLine + "Completed record with status: {4}" + Environment.NewLine , bookingProcessed.Count(), successCount, failCount, partialFailCount , Environment.NewLine + Environment.NewLine + string.Join(Environment.NewLine, completedResult.Select(x => x.SuperPNRNo + " - " + x.BatchBookResult.ToDescription()))) , EventLogEntryType.SuccessAudit, 300); } if (dbChangeLog.Count > 0) { eventLog1.WriteEntry("Total Payment Record Processed: " + dbChangeLog.Count + Environment.NewLine + Environment.NewLine + string.Join(Environment.NewLine, dbChangeLog), EventLogEntryType.Information, 210); } return(true); }
private void OnTimer(object sender, System.Timers.ElapsedEventArgs args) { // TODO: Insert monitoring activities here. //await semaphoreSlim.WaitAsync().ConfigureAwait(false); semaphoreSlim.Wait(); MayFlower dbContext = new MayFlower(); try { PaymentQueueHandler.Components.BookingList bookPaidList = new PaymentQueueHandler.Components.BookingList(dbContext, null); IEnumerable <SuperPNR> bookingProcessed = null; List <string> successProcessed = new List <string>(); Dictionary <string, ProductReserve.BookResultType> reserveStatus = new Dictionary <string, ProductReserve.BookResultType>(); if (sender.GetType().Name == "String" && !string.IsNullOrWhiteSpace(sender.ToString())) { string[] splitAttr = sender.ToString().Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); bool includeEXP = splitAttr.Length == 2; bookingProcessed = bookPaidList.GetBookingPaid(splitAttr[0], true, true, false); } else { bookPaidList.CheckUpdatePendingPayment(true, true, false).ConfigureAwait(false).GetAwaiter().GetResult(); bookingProcessed = bookPaidList.GetAllBookingPaid(true, true, false); } foreach (var item in bookingProcessed) { // Process Add On Here foreach (var record in item.BookingInsurances) { try { if (record.BookingStatusCode == "PPA") { var insService = new InsuranceService(logger); var bookRespond = insService.ConfirmInsuranceQuotation(record, record.SuperPNRNo); bool res = bookRespond?.BatchBookResult == ProductReserve.BookResultType.AllSuccess || bookRespond?.BatchBookResult == ProductReserve.BookResultType.PartialSuccess; reserveStatus.Add(string.Format("Insurance ({0} - {1})", record.SuperPNRID, record.SuperPNRNo), bookRespond?.BatchBookResult ?? ProductReserve.BookResultType.AllFail); if (!res) { break; //any failed exit loop } else { successProcessed.Add(string.Format("Insurance ({0} - {1}): Update from [{2}] --> [{3}]" , item.SuperPNRID, item.SuperPNRNo, record.BookingStatusCode, "CON")); record.BookingStatusCode = res ? "CON" : "EXP"; } } } catch (Exception ex) { logger.Error(ex.GetBaseException(), "Reserve Fail in Insurance Booking - " + DateTime.Now.ToLoggerDateTime()); reserveStatus.Add(string.Format("Insurance ({0} - {1})", record.SuperPNRID, record.SuperPNRNo), ProductReserve.BookResultType.AllFail); break; // exit looping prevent continue book } finally { dbContext.SaveChanges(); } } bool allSuccess = reserveStatus.All(x => x.Value == ProductReserve.BookResultType.AllSuccess); // Check is main last book item success if (allSuccess && item.EventBookings.Count > 0 && item.EventBookings.Any(x => x.BookingStatusCode == "PPA" || x.BookingStatusCode == "RHI")) { // check if status CON then doesn't execute Components.EventBookings eventBookings = new Components.EventBookings(item, "CON", allSuccess); string bookStatus = string.Join(",", item.EventBookings.Select(x => x.BookingStatusCode)); if (eventBookings.InformationCaution == null) { reserveStatus.Add(string.Format("Event ({0} - {1})", item.SuperPNRID, item.SuperPNRNo) , ProductReserve.BookResultType.AllSuccess); successProcessed.Add(string.Format("Event ({0} - {1}): Update from [{2}] --> [{3}]" , item.SuperPNRID, item.SuperPNRNo, bookStatus, "CON")); } else if (eventBookings.InformationCaution != null && eventBookings.InformationCaution.Count > 0) { reserveStatus.Add(string.Format("Event ({0} - {1})", item.SuperPNRID, item.SuperPNRNo) + Environment.NewLine + Environment.NewLine + JsonConvert.SerializeObject(eventBookings.InformationCaution, Formatting.Indented), ProductReserve.BookResultType.AllFail); } } else if (!allSuccess) { string _msg = "Deduct event booking inventory failed." + Environment.NewLine + Environment.NewLine + JsonConvert.SerializeObject(reserveStatus, Formatting.Indented); // throw error and end looping logger.Error(_msg); eventLog1.WriteEntry(_msg, EventLogEntryType.FailureAudit, 401); break; } } if (successProcessed != null && successProcessed.Count > 0) { string msg = "AddOn Scheduler Information" + Environment.NewLine + Environment.NewLine + string.Join(Environment.NewLine, successProcessed); logger.Info(msg); eventLog1.WriteEntry(msg, EventLogEntryType.SuccessAudit, 200); } if (bookPaidList.InformationCaution != null && bookPaidList.InformationCaution.Count > 0) { string msg = "AddOn Scheduler Information" + Environment.NewLine + Environment.NewLine + string.Join(Environment.NewLine, bookPaidList.InformationCaution); logger.Warn(msg); eventLog1.WriteEntry(msg, EventLogEntryType.Warning); } } catch (Exception ex) { string msg = "Error Occured when running async action. " + Environment.NewLine + Environment.NewLine + ex.ToString(); eventLog1.WriteEntry(msg, EventLogEntryType.Warning); logger.Warn(ex, msg); } finally { try { dbContext.SaveChanges(); } catch (Exception ex) { var changedInfo = dbContext.ChangeTracker.Entries() .Where(t => t.State == System.Data.Entity.EntityState.Modified) .Select(t => new { Original = t.OriginalValues.PropertyNames.ToDictionary(pn => pn, pn => t.OriginalValues[pn]), Current = t.CurrentValues.PropertyNames.ToDictionary(pn => pn, pn => t.CurrentValues[pn]), }); logger.Error(ex, "Error while attemp to save db change on finally action." + Environment.NewLine + Environment.NewLine + JsonConvert.SerializeObject(changedInfo, Formatting.Indented, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore })); } semaphoreSlim.Release(); } }