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);
        }
Exemple #2
0
        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();
            }
        }