Beispiel #1
0
        public async Task CheckoutReserveRoomHB()
        {
            MayFlower db = new MayFlower();
            List <Enumeration.BatchBookResultType> bookResultTask = new List <Enumeration.BatchBookResultType>();

            try
            {
                int bookingid = 1126;
                BookingQuery.HotelBeds hotelbeds = new BookingQuery.HotelBeds();
                var result = await hotelbeds.CheckoutReserveRoom(bookingid, "PPA", "http://localhost:52197", db);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        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 async Task <bool> StartRequery(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();
            List <Task <ProductReserve.BookingRespond> > bookResultTask = new List <Task <ProductReserve.BookingRespond> >();
            List <string> dbChangeLog  = new List <string>();
            List <string> refNoQueried = new List <string>();
            var           bookList     = BookingQuery.DBQuery.GetPendingBooking(db);

            if (sender.GetType().Name == "String" && !string.IsNullOrWhiteSpace(sender.ToString()))
            {
                string[] splitAttr  = sender.ToString().Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                bool     includeEXP = splitAttr.Length == 2;

                bookList = BookingQuery.DBQuery.GetPendingBooking(db, splitAttr[0], includeEXP);
            }

            try
            {
                foreach (var booking in bookList)
                {
                    var    paymentDetail      = booking.SuperPNR.SuperPNROrders;
                    string originalStatus     = booking.BookingStatusCode;
                    bool   paymentSuccess     = false;
                    bool   requeryPaymentFail = false;
                    foreach (var orderRecord in paymentDetail)
                    {
                        List <Task <bool> > taskList = new List <Task <bool> >();

                        foreach (var payment in orderRecord.PaymentOrders)
                        {
                            if (!string.IsNullOrWhiteSpace(payment.PaymentMethodCode) && payment.PaymentMethodCode.ToLower().StartsWith("ipa") &&
                                refNoQueried.Count(x => x == payment.Ipay88RefNo) == 0)
                            {
                                taskList.Add(PaymentQuery.IPAY88.CheckPaymentPAIDAsync(payment, booking.BookingID, booking.SuperPNRID, booking.SuperPNRNo));
                                refNoQueried.Add(payment.Ipay88RefNo);
                            }
                        }

                        try
                        {
                            var requeryResult = await Task.WhenAll(taskList).ConfigureAwait(false);

                            paymentSuccess = requeryResult.Count(x => x == true) >= 1;

                            if (paymentSuccess)
                            {
                                break; // exit looping
                            }
                        }
                        catch (AggregateException ae)
                        {
                            requeryPaymentFail = true;
                            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)
                        {
                            requeryPaymentFail = true;
                            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);
                        }
                    }

                    if (paymentSuccess)
                    {
                        // requery payment true

                        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);
                        }
                    }
                    else if (!paymentSuccess && !requeryPaymentFail)
                    {
                        // requery payment false
                        try
                        {
                            foreach (var item in booking.SuperPNR.SuperPNROrders)
                            {
                                item.BookingStatusCode = "EXP";
                                foreach (var order in item.PaymentOrders)
                                {
                                    order.PaymentStatusCode = "FAIL";
                                }
                            }

                            booking.BookingStatusCode = "EXP";
                            dbChangeLog.Add(string.Format("Updating {0} - {1} [{2}] --> [{3}]", booking.SuperPNRID, booking.SuperPNRNo, originalStatus, booking.BookingStatusCode));
                        }
                        catch (AggregateException ae)
                        {
                            eventLog1.WriteEntry(ae.GetBaseException().ToString(), EventLogEntryType.Warning, 999);
                            logger.Warn(ae, "Hotel Booking Requery Handler" + ae.ToString());
                        }
                        catch (Exception ex)
                        {
                            eventLog1.WriteEntry(ex.GetBaseException().ToString(), EventLogEntryType.Warning, 999);
                            logger.Warn(ex, "Hotel Booking Requery Handler" + ex.ToString());
                        }
                    }
                }

                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.*/
                await db.SaveChangesAsync();
            }

            // 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);
                List <string> PDFItem          = new List <string>();

                try
                {
                    /* 2017/10/26 - Turn off send PDF first, as Hotel Requery doesn't handle full process yet.
                     * 1) Check any other Product
                     * 2) Capture Payment/Void Payment
                     * 3) Update SuperPNROrders Book Status.
                     */
                    //foreach (var item in completedResult.Where(x => x.BatchBookResult == ProductReserve.BookResultType.AllSuccess))
                    //{
                    //    var _book = bookList.FirstOrDefault(x => x.SuperPNRNo == item.SuperPNRNo);
                    //    Alphareds.Module.HotelController.HotelServiceController.sendHotelItineraryEmailAfterSuccess(_book);
                    //}
                }
                catch (Exception ex)
                {
                    eventLog1.WriteEntry("Send PDF Fail on SuperPNRNo: " + string.Join(Environment.NewLine, PDFItem)
                                         + Environment.NewLine + Environment.NewLine + ex.ToString(), EventLogEntryType.Information);
                }

                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
                                                   , bookList.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);
            }

            var grpReport = bookList.GroupBy(x => x.SuperPNRNo).AsEnumerable().Select(x => new
            {
                Counter = x.Count(),
                RefNo   = string.Join(", ", x.Select(y => y.BookingID + " - " + y.SuperPNRNo + " [" + y.OrderID + "]")),
            }).Where(x => x.Counter > 1);

            if (grpReport.Count() > 1)
            {
                string msg = "Potential Problem Record Found (Duplicate SuperPNRNo with different BookingID): " +
                             Environment.NewLine + Environment.NewLine + string.Join(Environment.NewLine, grpReport.Select(x => x.RefNo));
                eventLog1.WriteEntry(msg, EventLogEntryType.Warning, 400);
                logger.Warn(msg);
            }

            return(true);
        }