Exemplo n.º 1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="doc"></param>
        /// <param name="nationalityCode"></param>
        /// <returns>LogID returned by Yakeen validation. Returns 0 if business rules do not require validation at Yakeen to be done.</returns>
        private async Task <int> ValidateAtYakeen(PassengerTravelDocument doc, string nationalityCode, string userName, string password, string chargeCode, string serviceUrl, string timeoutSeconds)
        {
            var reference = ""; // DateTime.UtcNow.ToString("yyyyMMdd_HHmmss");
            var logId     = 0;
            var dobStr    = doc.DOB.ToString("MM-yyyy");
            var client    = YakeenClient.Instance;

            if (!int.TryParse(timeoutSeconds, out int seconds))
            {
                seconds = 5;
            }
            client.InnerChannel.OperationTimeout = new TimeSpan(0, 0, seconds);
            client.Endpoint.Address = new EndpointAddress(serviceUrl);

            doc.DocNumber = doc.DocNumber.Trim();
            if (nationalityCode == "SA")
            {
                if (doc.DocTypeCode == "N")
                {
                    var response = await client.getCitizenInfoByIDAsync(new citizenInfoByIDRequest
                    {
                        userName        = userName,
                        password        = password,
                        chargeCode      = chargeCode,
                        referenceNumber = reference,
                        nin             = doc.DocNumber,
                        dateOfBirth     = dobStr
                    });

                    logId = response.CitizenInfoByIDResult.logId;
                }
                else if (doc.DocTypeCode == "P")
                {
                    var response = await client.getCitizenInfoByPassportAsync(new citizenInfoByPassportRequest
                    {
                        userName        = userName,
                        password        = password,
                        chargeCode      = chargeCode,
                        referenceNumber = reference,
                        passportNumber  = doc.DocNumber,
                        dateOfBirth     = dobStr
                    });

                    logId = response.CitizenInfoByPassportResult.logId;
                }
            }
            else
            {
                if (doc.DocTypeCode == "P")
                {
                    var response = await client.getAlienInfoByPassportAsync(new alienInfoByPassportRequest
                    {
                        userName        = userName,
                        password        = password,
                        chargeCode      = chargeCode,
                        referenceNumber = reference,
                        passportNumber  = doc.DocNumber,
                        nationalityCode = YakeenHelper.GetYakeenCountryCode(doc.IssuedByCode)
                    });

                    logId = response.AlienInfoByPassportResult.logId;
                }
                else if (doc.DocTypeCode == "I")
                {
                    var response = await client.getAlienInfoByIqamaAsync(new alienInfoByIqamaRequest
                    {
                        userName        = userName,
                        password        = password,
                        chargeCode      = chargeCode,
                        referenceNumber = reference,
                        iqamaNumber     = doc.DocNumber,
                        dateOfBirth     = dobStr
                    });

                    logId = response.AlienInfoByIqamaResult.logId;
                }
            }
            return(logId);
        }
Exemplo n.º 2
0
        private async Task ValidateTravelDoc(PassengerTravelDocument doc, Booking booking, string nationalityCode, List <string> comments,
                                             ISessionBagService sessionBag, Dictionary <string, string> settings, IMemoryCache cache)
        {
            if (comments != null && comments.Count > 0)
            {
                var existingComment = comments.Find(
                    c => c.StartsWith(_commentPrefix) && c.Contains("DocNum=" + doc.DocNumber));
                if (!string.IsNullOrEmpty(existingComment))
                {
                    return;
                }
            }
            if (booking.BookingComments != null && booking.BookingComments.Length > 0)
            {
                var existingComment = booking.BookingComments.ToList().Find(
                    c => c.CommentText.StartsWith(_commentPrefix) && c.CommentText.Contains("DocNum=" + doc.DocNumber));
                if (existingComment != null)
                {
                    return;
                }
            }
            var isRestingFromYakeenChecks = cache.Get <bool>("Yakeen_RestingFromChecks");

            if (isRestingFromYakeenChecks)
            {
                // dont do yakeen check
                var newComment = string.Format("NotPerformed. Tries=0, DocNum={0}, DocType={1}, Reason={2}", doc.DocNumber, doc.DocTypeCode, "Excessive service timeouts");
                await StoreBookingComment(newComment, sessionBag, comments);

                return;
            }

            var yakeenCountSessionKey = string.Format("yakeenCountSession_{0}_{1}", doc.DocNumber, doc.DocTypeCode);
            var sessionStr            = await sessionBag.GetCustomSessionValue(yakeenCountSessionKey) ?? "0";

            int.TryParse(sessionStr, out int validationFailureCount);
            if (!int.TryParse(settings["YakeenMaxFailures"], out int yakeenMaxFailures))
            {
                yakeenMaxFailures = 2;
            }
            if (validationFailureCount >= yakeenMaxFailures)
            {
                return;
            }
            try
            {
                var logId = await ValidateAtYakeen(doc, nationalityCode, settings["YakeenUsername"], settings["YakeenPassword"],
                                                   settings["YakeenChargeCode"], settings["YakeenServiceUrl"], settings["YakeenTimeoutSeconds"]);

                if (logId == 0) // 0 means no validation was required at yakeen therefore not performed
                {
                    return;
                }
                var newComment = string.Format("Success. LogId={0}, DocNum={1}, DocType={2}", logId, doc.DocNumber, doc.DocTypeCode);
                await StoreBookingComment(newComment, sessionBag, comments);
            }
            catch (Exception e)
            {
                validationFailureCount++;
                Logger logger = LogManager.GetCurrentClassLogger();
                logger.Warn(string.Format("[{0}] Tries={1}, DocNum={2}, DocType={3} Reason={4}",
                                          ResponseErrorCode.TravelDocumentValidationFailure.ToString(), validationFailureCount, doc.DocNumber, doc.DocTypeCode, e.Message));
                sessionBag.SetCustomSessionValue(yakeenCountSessionKey, validationFailureCount.ToString()).GetAwaiter().GetResult();
                var isTimeout = e is TimeoutException || (e.InnerException != null && e.InnerException is TimeoutException);
                if (validationFailureCount >= yakeenMaxFailures)
                {
                    var reason     = isTimeout ? "Query timeout" : e.Message;
                    var newComment = string.Format("Failed. Tries={0}, DocNum={1}, DocType={2}, Reason={3}", validationFailureCount, doc.DocNumber, doc.DocTypeCode, reason);
                    await StoreBookingComment(newComment, sessionBag, comments);

                    return;
                }

                if (isTimeout)
                {
                    if (!int.TryParse(settings["YakeenExcessiveTimeoutCount"], out int excessiveTimeoutCountSetting))
                    {
                        excessiveTimeoutCountSetting = 20;
                    }
                    if (!int.TryParse(settings["YakeenExcessiveTimeoutRestSeconds"], out int excessiveTimeoutRestSecondsSetting))
                    {
                        excessiveTimeoutRestSecondsSetting = 3600;
                    }
                    if (!int.TryParse(settings["YakeenExcessiveTimeoutPeriodSeconds"], out int excessiveTimeoutPeriodSecondsSetting))
                    {
                        excessiveTimeoutPeriodSecondsSetting = 300;
                    }

                    lock (_syncRoot)
                    {
                        var timePeriodIsRunning = cache.Get <bool>("Yakeen_PeriodIsRunning");
                        var globalTimeoutCount  = timePeriodIsRunning ? cache.Get <int>("Yakeen_GlobalTimeoutCount") + 1 : 1;
                        cache.Set("Yakeen_GlobalTimeoutCount", globalTimeoutCount);
                        if (timePeriodIsRunning)
                        {
                            if (globalTimeoutCount >= excessiveTimeoutCountSetting)
                            {
                                cache.Set("Yakeen_RestingFromChecks", true, new TimeSpan(0, 0, excessiveTimeoutRestSecondsSetting));
                                cache.Remove("Yakeen_GlobalTimeoutCount");
                                cache.Remove("Yakeen_PeriodIsRunning");
                            }
                        }
                        else
                        {
                            cache.Set("Yakeen_PeriodIsRunning", true, new TimeSpan(0, 0, excessiveTimeoutPeriodSecondsSetting));
                        }
                    }
                }

                throw;
            }
        }