public bool IsCardCommissionDuplicate(decimal lowerAmount, decimal upperAmount, decimal commissionRate,
                                              int cardTypeId, int callType, ref SettingsRegResponseObj response)
        {
            try
            {
                var sql =
                    $"Select * FROM \"NewVPlusSales\".\"CardCommission\" WHERE \"CardTypeId\" = '{cardTypeId}' AND  \"Status\" != {-100})";
                var check = _repository.RepositoryContext().Database.SqlQuery <CardCommission>(sql).ToList();

                if (check.Count == 0)
                {
                    return(false);
                }

                if (check.FindAll(m => m.LowerAmount <= lowerAmount && m.UpperAmount >= lowerAmount).Count > 0)
                {
                    if (callType != 2)
                    {
                        response.Status.Message.FriendlyMessage  = "Duplicate Error Check Lower Amount! The selected range is already covered Range already exist";
                        response.Status.Message.TechnicalMessage = "Duplicate Error Check Lower Amount!The selected range is already covered Range already exist";
                        return(true);
                    }
                }

                if (check.FindAll(amt => amt.LowerAmount <= upperAmount && amt.UpperAmount >= upperAmount).Count > 0)
                {
                    if (callType != 2)
                    {
                        response.Status.Message.FriendlyMessage  = "Duplicate Error Check Upper Amount!The selected range is already covered";
                        response.Status.Message.TechnicalMessage = "Duplicate Error Check Upper Amount!The selected range is already covered";
                        return(true);
                    }
                }

                if (check.FindAll(rate => rate.CommissionRatee == commissionRate).Count > 0)
                {
                    if (callType != 2)
                    {
                        response.Status.Message.FriendlyMessage  = "Duplicate Error! Commission Rate already exist";
                        response.Status.Message.TechnicalMessage = "Duplicate Error! Commission Rate already exist";
                        return(true);
                    }
                }
                return(false);
            }
            catch (Exception ex)
            {
                response.Status.Message.FriendlyMessage =
                    "Unable to complete your request due to validation error. Please try again later";
                response.Status.Message.TechnicalMessage = "Duplicate Check Error: " + ex.Message;
                ErrorManager.LogApplicationError(ex.StackTrace, ex.Source, ex.Message);
                return(true);
            }
        }
        public bool IsCardTypeDuplicate(string name, int callType, ref SettingsRegResponseObj response)
        {
            try
            {
                var sql =
                    $"Select coalesce(Count(\"CardTypeId\"),0) FROM \"NewVPlusSales\".\"CardType\" WHERE lower(\"Name\")= lower('{name.Replace("'", "''")}')";
                var check = _repository.RepositoryContext().Database.SqlQuery <long>(sql).ToList();

                if (check.IsNullOrEmpty())
                {
                    response.Status.Message.FriendlyMessage =
                        "Unable to complete your request due to validation error. Please try again later";
                    response.Status.Message.TechnicalMessage = "Unable to chech for duplicate";
                    return(true);
                }

                if (check.Count != 1)
                {
                    response.Status.Message.FriendlyMessage =
                        "Unable to complete your request due to validation error. Please try again later";
                    response.Status.Message.TechnicalMessage = "Unable to chech for duplicate";
                    return(true);
                }

                if (check[0] < 1)
                {
                    return(false);
                }

                if (check[0] > 0)
                {
                    if (callType != 2 || check[0] > 1)
                    {
                        response.Status.Message.FriendlyMessage  = "Duplicate Error! Card Type name already exist ";
                        response.Status.Message.TechnicalMessage = "Duplicate Error! Card Type name already exist";
                        return(true);
                    }
                }
                return(false);
            }
            catch (Exception ex)
            {
                response.Status.Message.FriendlyMessage =
                    "Unable to complete your request due to Validation Error:Please try  again later";
                response.Status.Message.TechnicalMessage = "Duplicate check error:" + ex.Message;
                ErrorManager.LogApplicationError(ex.StackTrace, ex.Source, ex.Message);
                return(true);
            }
        }
        public SettingsRegResponseObj AddCardCommission(RegCardCommissionObj regObj)
        {
            var response = new SettingsRegResponseObj
            {
                Status = new APIResponseStatus
                {
                    IsSuccessful = false,
                    Message      = new APIResponseMessage()
                }
            };

            try
            {
                if (regObj.Equals(null))
                {
                    response.Status.Message.FriendlyMessage  = "Error occure!Unable to proceed to your Request";
                    response.Status.Message.TechnicalMessage = "Registration Object is empty/Invaild";
                    return(response);
                }

                if (regObj.LowerAmount == 0 || regObj.UpperAmount == 0)
                {
                    response.Status.Message.FriendlyMessage  = "Error occure!Lower/Upper Amount cannot be zero";
                    response.Status.Message.TechnicalMessage = "Registration Object is empty/Invaild";
                    return(response);
                }

                if (regObj.LowerAmount > regObj.UpperAmount)
                {
                    response.Status.Message.FriendlyMessage  = "Error occure!LowerAmount cannot be greater than UpperAmount";
                    response.Status.Message.TechnicalMessage = "Registration Object is empty/Invaild";
                    return(response);
                }

                var associatedCardType = GetCardTypeInfo(regObj.CardTypeId);

                if (associatedCardType == null)
                {
                    response.Status.Message.FriendlyMessage  = "Specified Card Type Info not available";
                    response.Status.Message.TechnicalMessage = "Specified Card Type Info not available";
                    return(response);
                }

                if (regObj.LowerAmount != associatedCardType.FaceValue)
                {
                    response.Status.Message.FriendlyMessage  = "Error occure!LowerAmount must be equal to face value";
                    response.Status.Message.TechnicalMessage = "Registration Object is empty/Invaild";
                    return(response);
                }

                #region Lower Modulo

                if (regObj.LowerAmount % 2 == 0)
                {
                    if (regObj.LowerAmount % associatedCardType.FaceValue != 0)
                    {
                        response.Status.Message.FriendlyMessage  = $"Lower Amount must be a multiple of {associatedCardType.FaceValue}";
                        response.Status.Message.TechnicalMessage = $"Lower Amount must be a multiple of {associatedCardType.FaceValue}";
                        return(response);
                    }
                }
                else
                {
                    var lowerAmountCheck = regObj.LowerAmount + 1;

                    if (lowerAmountCheck % associatedCardType.FaceValue != 0)
                    {
                        response.Status.Message.FriendlyMessage  = $"Lower Amount must be a multiple of {associatedCardType.FaceValue}";
                        response.Status.Message.TechnicalMessage = $"Lower Amount must be a multiple of {associatedCardType.FaceValue}";
                        return(response);
                    }
                }
                #endregion

                #region Upper Modulo
                if (regObj.UpperAmount % 2 == 0)
                {
                    if (regObj.UpperAmount % associatedCardType.FaceValue != 0)
                    {
                        response.Status.Message.FriendlyMessage  = $"Upper Amount must be a multiple of {associatedCardType.FaceValue}";
                        response.Status.Message.TechnicalMessage = $"Upper Amount must be a multiple of {associatedCardType.FaceValue}";
                        return(response);
                    }
                }
                else
                {
                    var upperAmountCheck = regObj.UpperAmount + 1;

                    if (upperAmountCheck % associatedCardType.FaceValue != 0)
                    {
                        response.Status.Message.FriendlyMessage  = $"Upper Amount must be a multiple of {associatedCardType.FaceValue}";
                        response.Status.Message.TechnicalMessage = $"Upper Amount must be a multiple of {associatedCardType.FaceValue}";
                        return(response);
                    }
                }
                #endregion


                if (!EntityValidatorHelper.Validate(regObj, out var valResults))
                {
                    var errorDetail = new StringBuilder();
                    if (!valResults.IsNullOrEmpty())
                    {
                        errorDetail.AppendLine("Following error occurred:");
                        valResults.ForEachx(m => errorDetail.AppendLine(m.ErrorMessage));
                    }
                    else
                    {
                        errorDetail.AppendLine("Validation error occurred! Please check all supplied parameters and try again");
                    }
                    response.Status.Message.FriendlyMessage  = errorDetail.ToString();
                    response.Status.Message.TechnicalMessage = errorDetail.ToString();
                    response.Status.IsSuccessful             = false;
                    return(response);
                }

                if (!HelperMethods.IsUserValid(regObj.AdminUserId, regObj.SysPathCode, HelperMethods.getRequesterRoles(), ref response.Status.Message))
                {
                    return(response);
                }

                if (IsCardCommissionDuplicate(regObj.LowerAmount, regObj.UpperAmount, regObj.CommissionRatee,
                                              regObj.CardTypeId, 1, ref response))
                {
                    return(response);
                }

                var cardCommission = new CardCommission
                {
                    CommissionRatee = regObj.CommissionRatee,
                    CardTypeId      = regObj.CardTypeId,
                    LowerAmount     = regObj.LowerAmount,
                    UpperAmount     = regObj.UpperAmount,
                    Status          = (Status)regObj.Status
                };

                var added = _repository.Add(cardCommission);
                _uoWork.SaveChanges();
                if (added.CardCommissionId < 1)
                {
                    response.Status.Message.FriendlyMessage  = "Error Occurred! Unable to complete your request. Please try again later";
                    response.Status.Message.TechnicalMessage = "Unable to save to database";
                    return(response);
                }

                ResetCache();
                response.Status.IsSuccessful = true;
                response.SettingId           = added.CardCommissionId;
            }

            catch (DbEntityValidationException ex)
            {
                ErrorManager.LogApplicationError(ex.StackTrace, ex.Source, ex.Message);
                response.Status.Message.FriendlyMessage  = "Error Occurred! Please try again later";
                response.Status.Message.TechnicalMessage = "Error: " + ex.GetBaseException().Message;
                response.Status.IsSuccessful             = false;
                return(response);
            }
            catch (Exception ex)
            {
                ErrorManager.LogApplicationError(ex.StackTrace, ex.Source, ex.Message);
                response.Status.Message.FriendlyMessage  = "Error Occurred! Please try again later";
                response.Status.Message.TechnicalMessage = "Error: " + ex.GetBaseException().Message;
                response.Status.IsSuccessful             = false;
                return(response);
            }

            return(response);
        }
        public SettingsRegResponseObj DeleteCardCommission(DeleteCardCommission regObj)
        {
            var response = new SettingsRegResponseObj
            {
                Status = new APIResponseStatus
                {
                    IsSuccessful = false,
                    Message      = new APIResponseMessage()
                }
            };

            try
            {
                if (regObj.Equals(null))
                {
                    response.Status.Message.FriendlyMessage  = "Error Occurred! Unable to proceed with your request";
                    response.Status.Message.TechnicalMessage = "Registration Object is empty / invalid";
                    return(response);
                }

                if (!EntityValidatorHelper.Validate(regObj, out var valResults))
                {
                    var errorDetail = new StringBuilder();
                    if (!valResults.IsNullOrEmpty())
                    {
                        errorDetail.AppendLine("Following error occurred:");
                        valResults.ForEachx(m => errorDetail.AppendLine(m.ErrorMessage));
                    }
                    else
                    {
                        errorDetail.AppendLine("Validation error occurred! Please check all supplied parameters and try again");
                    }
                    response.Status.Message.FriendlyMessage  = errorDetail.ToString();
                    response.Status.Message.TechnicalMessage = errorDetail.ToString();
                    response.Status.IsSuccessful             = false;
                    return(response);
                }

                if (!HelperMethods.IsUserValid(regObj.AdminUserId, regObj.SysPathCode, new[] { "PortalAdmin", "CRMAdmin", "CRMManager" }, ref response.Status.Message))
                {
                    return(response);
                }

                var thisCardCommission = GetCardCommissionInfo(regObj.CardCommissionId);
                if (thisCardCommission == null)
                {
                    response.Status.Message.FriendlyMessage  = "No CardCommission Information found for the specified CardCommission Id";
                    response.Status.Message.TechnicalMessage = "No CardCommission Information found!";
                    return(response);
                }

                thisCardCommission.Status = Status.Deleted;

                var added = _repository.Update(thisCardCommission);
                _uoWork.SaveChanges();
                if (added.CardCommissionId < 1)
                {
                    response.Status.Message.FriendlyMessage  = "Error Occurred! Unable to complete your request. Please try again later";
                    response.Status.Message.TechnicalMessage = "Unable to save to database";
                    return(response);
                }

                ResetCache();
                response.Status.IsSuccessful = true;
                response.SettingId           = added.CardCommissionId;
            }
            catch (DbEntityValidationException ex)
            {
                ErrorManager.LogApplicationError(ex.StackTrace, ex.Source, ex.Message);
                response.Status.Message.FriendlyMessage  = "Error Occurred! Please try again later";
                response.Status.Message.TechnicalMessage = "Error: " + ex.GetBaseException().Message;
                response.Status.IsSuccessful             = false;
                return(response);
            }
            catch (Exception ex)
            {
                ErrorManager.LogApplicationError(ex.StackTrace, ex.Source, ex.Message);
                response.Status.Message.FriendlyMessage  = "Error Occurred! Please try again later";
                response.Status.Message.TechnicalMessage = "Error: " + ex.GetBaseException().Message;
                response.Status.IsSuccessful             = false;
                return(response);
            }

            return(response);
        }
        public SettingsRegResponseObj AddCardType(RegCardTypeObj regObj)
        {
            var response = new SettingsRegResponseObj
            {
                Status = new APIResponseStatus
                {
                    IsSuccessful = false,
                    Message      = new APIResponseMessage()
                }
            };

            try
            {
                if (regObj.Equals(null))
                {
                    response.Status.Message.FriendlyMessage  = "Error Occurred! Unable to proceed with your request";
                    response.Status.Message.TechnicalMessage = "Registration Object is empty / invalid";
                    return(response);
                }

                if (regObj.FaceValue == 0)
                {
                    response.Status.Message.FriendlyMessage  = "Error Occurred! Face Value cannot be Zero";
                    response.Status.Message.TechnicalMessage = "Registration Object is empty / invalid";
                    return(response);
                }

                if (!EntityValidatorHelper.Validate(regObj, out var valResult))
                {
                    var errorDetails = new StringBuilder();
                    if (!valResult.IsNullOrEmpty())
                    {
                        errorDetails.Append("The following error occured:");
                        valResult.ForEachx(m => errorDetails.Append(m.ErrorMessage));
                    }
                    else
                    {
                        errorDetails.Append(
                            "Validation Error Occured! Please check all supplied parameter and try again");
                    }

                    response.Status.Message.FriendlyMessage = errorDetails.ToString();
                    response.Status.Message.FriendlyMessage = errorDetails.ToString();
                    response.Status.IsSuccessful            = false;
                    return(response);
                }

                if (!HelperMethods.IsUserValid(regObj.AdminUserId, regObj.SysPathCode, HelperMethods.getRequesterRoles(), ref response.Status.Message))
                {
                    return(response);
                }

                if (IsCardTypeDuplicate(regObj.Name, 1, ref response))
                {
                    return(response);
                }

                var card = new CardType
                {
                    Name      = regObj.Name,
                    FaceValue = regObj.FaceValue,
                    Status    = (Status)regObj.Status
                };

                var added = _repository.Add(card);
                _uoWork.SaveChanges();
                if (added.CardTypeId < 1)
                {
                    response.Status.Message.FriendlyMessage  = "Error Occurred! Unable to complete your request. Please try again later";
                    response.Status.Message.TechnicalMessage = "Unable to save to database";
                    return(response);
                }

                ResetCache();
                response.Status.IsSuccessful = true;
                response.SettingId           = added.CardTypeId;
            }
            catch (DbEntityValidationException ex)
            {
                ErrorManager.LogApplicationError(ex.StackTrace, ex.Source, ex.Message);
                response.Status.Message.FriendlyMessage  = "Error Occurred! Please try again later";
                response.Status.Message.TechnicalMessage = "Error: " + ex.GetBaseException().Message;
                response.Status.IsSuccessful             = false;
                return(response);
            }
            catch (Exception ex)
            {
                ErrorManager.LogApplicationError(ex.StackTrace, ex.Source, ex.Message);
                response.Status.Message.FriendlyMessage  = "Error Occurred! Please try again later";
                response.Status.Message.TechnicalMessage = "Error: " + ex.GetBaseException().Message;
                response.Status.IsSuccessful             = false;
                return(response);
            }
            return(response);
        }
        public SettingsRegResponseObj DeleteCard(DeleteCardObj regObj)
        {
            var response = new SettingsRegResponseObj()
            {
                Status = new APIResponseStatus
                {
                    IsSuccessful = false,
                    Message      = new APIResponseMessage()
                }
            };

            try
            {
                if (regObj.Equals(null))
                {
                    response.Status.Message.FriendlyMessage  = "Error Occurred! Unable to proceed with your request";
                    response.Status.Message.TechnicalMessage = "Registration Object is empty / invalid";
                    return(response);
                }

                if (!EntityValidatorHelper.Validate(regObj, out var valResults))
                {
                    var errorDetail = new StringBuilder();
                    if (!valResults.IsNullOrEmpty())
                    {
                        errorDetail.AppendLine("Following error occurred:");
                        valResults.ForEachx(m => errorDetail.AppendLine(m.ErrorMessage));
                    }
                    else
                    {
                        errorDetail.AppendLine("Validation error occurred! Please check all supplied parameters and try again");
                    }
                    response.Status.Message.FriendlyMessage  = errorDetail.ToString();
                    response.Status.Message.TechnicalMessage = errorDetail.ToString();
                    response.Status.IsSuccessful             = false;
                    return(response);
                }

                if (!HelperMethods.IsUserValid(regObj.AdminUserId, regObj.SysPathCode, HelperMethods.getRequesterRoles(), ref response.Status.Message))
                {
                    return(response);
                }

                var thisCard = GetCardInfo(regObj.CardId);
                if (thisCard == null)
                {
                    response.Status.Message.FriendlyMessage  = "No Card Production Information found for the specified Card Id";
                    response.Status.Message.TechnicalMessage = "No Card Production Information found!";
                    return(response);
                }

                if (thisCard.Status != CardStatus.Registered)
                {
                    response.Status.Message.FriendlyMessage  = "Sorry This Card Production Is Not Valid For Delete! Please Try Again Later";
                    response.Status.Message.TechnicalMessage = " Supply Requisition Status is either already Active/Issued/Retired!";
                    return(response);
                }

                thisCard.CardTitle =
                    thisCard.CardTitle + "_Deleted_" + DateTime.Now.ToString("yyyy_MM_dd_hh_mm_ss");
                thisCard.Status = CardStatus.Defective;

                var added = _repository.Update(thisCard);
                _uoWork.SaveChanges();
                if (added.CardId < 1)
                {
                    response.Status.Message.FriendlyMessage  = "Error Occurred! Unable to complete your request. Please try again later";
                    response.Status.Message.TechnicalMessage = "Unable to save to database";
                    return(response);
                }


                response.Status.IsSuccessful = true;
                response.SettingId           = added.CardId;
            }
            catch (DbEntityValidationException ex)
            {
                ErrorManager.LogApplicationError(ex.StackTrace, ex.Source, ex.Message);
                response.Status.Message.FriendlyMessage  = "Error Occurred! Please try again later";
                response.Status.Message.TechnicalMessage = "Error: " + ex.GetBaseException().Message;
                response.Status.IsSuccessful             = false;
                return(response);
            }
            catch (Exception ex)
            {
                ErrorManager.LogApplicationError(ex.StackTrace, ex.Source, ex.Message);
                response.Status.Message.FriendlyMessage  = "Error Occurred! Please try again later";
                response.Status.Message.TechnicalMessage = "Error: " + ex.GetBaseException().Message;
                response.Status.IsSuccessful             = false;
                return(response);
            }
            return(response);
        }