public CardDeliveryRegRespObj AddCardDelivery(RegCardDeliveryObj regObj)
        {
            var response = new CardDeliveryRegRespObj
            {
                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 associatedCard = GetCardInfo(regObj.CardId);
                if (associatedCard == null)
                {
                    response.Status.Message.FriendlyMessage  = "Error Occurred! No Card  Information Found";
                    response.Status.Message.TechnicalMessage = "Error Occurred! No Card  Information Found";
                    return(response);
                }

                var associatedCardItem = GetCardItemInfo(regObj.CardItemId);
                if (associatedCardItem == null)
                {
                    response.Status.Message.FriendlyMessage  = "Error Occurred! No Card Item  Information Found";
                    response.Status.Message.TechnicalMessage = "Error Occurred! No Card Item Information Found";
                    return(response);
                }

                if (associatedCard.Status != CardStatus.Registered)
                {
                    response.Status.Message.FriendlyMessage  = "Error Occurred! This Card Item Is Not Available For Delivery";
                    response.Status.Message.TechnicalMessage = "Error Occurred! This Card Item Is Not Available For Delivery";
                    return(response);
                }

                //check validity of start/stop batch number

                if ((int.Parse(regObj.StopBatchNumber) - int.Parse(regObj.StartBatchNumber) + 1) !=
                    associatedCard.QuantityPerBatch)
                {
                    response.Status.Message.FriendlyMessage  = "Error Occurred! Incorrect StopBatchNumber/StartBatchNumber Data";
                    response.Status.Message.TechnicalMessage = "Error Occurred! Incorrect StopBatchNumber/StartBatchNumber Data";
                    return(response);
                }

                if (regObj.BatchId != associatedCardItem.BatchId)
                {
                    response.Status.Message.FriendlyMessage  = "Error Occurred! Incorrect BatchId";
                    response.Status.Message.TechnicalMessage = "Error Occurred! Incorrect BatchId";
                    return(response);
                }
                if (regObj.DeliveredQuantity < 1)
                {
                    response.Status.Message.FriendlyMessage  = "Error Occurred! You Cannot Register An empty delivery ";
                    response.Status.Message.TechnicalMessage = "Error Occurred! Incorrect quantity Delivered Data";
                    return(response);
                }

                if (regObj.DeliveredQuantity + associatedCardItem.DeliveredQuantity > associatedCardItem.BatchQuantity)
                {
                    if (associatedCardItem.BatchQuantity - (associatedCardItem.DeliveredQuantity) > 0)
                    {
                        response.Status.Message.FriendlyMessage = $"Incorrect Quantity Delivered,{associatedCardItem.BatchQuantity - (associatedCardItem.DeliveredQuantity)} is only available for delivery";
                    }
                    else if (associatedCardItem.BatchQuantity - (associatedCardItem.DeliveredQuantity) == 0)
                    {
                        response.Status.Message.FriendlyMessage = $"This Delivery is Complete";
                    }

                    response.Status.Message.TechnicalMessage = "Error Occurred! Incorrect Quantity Delivered";
                    return(response);
                }

                if (DateTime.Parse(regObj.TimeStampDelivered) > DateTime.Now)
                {
                    response.Status.Message.FriendlyMessage  = "Error Occurred! You Cannot Register A delivery before DeliveryDate";
                    response.Status.Message.TechnicalMessage = "Error Occurred! Incorrect Delivery Date Data";
                    return(response);
                }

                using (var db = _uoWork.BeginTransaction())
                {
                    var newCardDelivery = new CardDelivery
                    {
                        CardId             = regObj.CardId,
                        CardItemId         = regObj.CardItemId,
                        CardTypeId         = regObj.CardTypeId,
                        BatchId            = associatedCardItem.BatchId,
                        Status             = CardStatus.Registered,
                        ApprovedBy         = 0,
                        ApproverComment    = regObj.ApproverComment,
                        TimeStampApproved  = "",
                        DefectiveQuantity  = regObj.DefectiveQuantity,
                        TimeStampDelivered = regObj.TimeStampDelivered,
                        MissingQuantity    = regObj.MissingQuantity,
                        DeliveredQuantity  = regObj.DeliveredQuantity,
                        StartBatchNumber   = associatedCardItem.BatchId + "" + "000",
                        StopBatchNumber    = associatedCardItem.BatchId + "" + "999",
                        ReceivedBy         = regObj.AdminUserId,
                        TimeStampRegisered = DateMap.CurrentTimeStamp(),
                    };

                    var deliveryAdded = _repository.Add(newCardDelivery);
                    _uoWork.SaveChanges();
                    if (deliveryAdded.CardDeliveryId < 1)
                    {
                        db.Rollback();
                        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);
                    }
                    associatedCardItem.MissingQuantity     += regObj.MissingQuantity;
                    associatedCardItem.DefectiveQuantity   += regObj.DefectiveQuantity;
                    associatedCardItem.DeliveredQuantity   += regObj.DeliveredQuantity;
                    associatedCardItem.AvailableQuantity   += regObj.DeliveredQuantity - (regObj.MissingQuantity + regObj.DefectiveQuantity);
                    associatedCardItem.TimeStampDelivered   = deliveryAdded.TimeStampRegisered;
                    associatedCardItem.DefectiveBatchNumber = regObj.DefectiveBatchNumber;
                    associatedCardItem.Status = CardStatus.Registered;

                    var updateCardItem = _cardItemRepository.Update(associatedCardItem);
                    _uoWork.SaveChanges();
                    if (updateCardItem.CardItemId < 1)
                    {
                        db.Rollback();
                        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);
                    }


                    associatedCard.Status = CardStatus.Registered;
                    var updateCard = _cardRepository.Update(associatedCard);
                    _uoWork.SaveChanges();
                    if (updateCard.CardId < 1)
                    {
                        db.Rollback();
                        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);
                    }
                    db.Commit();

                    response.Status.IsSuccessful            = true;
                    response.CardDeliveryId                 = deliveryAdded.CardDeliveryId;
                    response.Status.Message.FriendlyMessage = "Card Delivery Added Successfully";
                }
            }
            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 CardDeliveryRegRespObj ApproveCardDelivery(ApproveCardDeliveryObj regObj)
        {
            var response = new CardDeliveryRegRespObj
            {
                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.getMgtExecutiveRoles(), ref response.Status.Message))
                {
                    return(response);
                }
                var thisCardDelivery = GetCardDeliveryInfo(regObj.CardDeliveryId);
                if (thisCardDelivery == null)
                {
                    response.Status.Message.FriendlyMessage  = "Error Occurred! No Card  Information Found";
                    response.Status.Message.TechnicalMessage = "Error Occurred! No Card  Information Found";
                    return(response);
                }
                var associatedCard = GetCardInfo(thisCardDelivery.CardId);
                if (associatedCard == null)
                {
                    response.Status.Message.FriendlyMessage  = "Error Occurred! No Card  Information Found";
                    response.Status.Message.TechnicalMessage = "Error Occurred! No Card  Information Found";
                    return(response);
                }

                var associatedCardItem = GetCardItemInfo(thisCardDelivery.CardItemId);
                if (associatedCardItem == null)
                {
                    response.Status.Message.FriendlyMessage  = "Error Occurred! No Card Item  Information Found";
                    response.Status.Message.TechnicalMessage = "Error Occurred! No Card Item Information Found";
                    return(response);
                }

                if (regObj.IsApproved && regObj.IsDenied || regObj.IsApproved && regObj.IsDenied)
                {
                    response.Status.Message.FriendlyMessage  = "Sorry This CardDelivery Cannot be  Approved/Defected! Please Try Again Later";
                    response.Status.Message.TechnicalMessage = " IsApproved and IsDefected is both true/false";
                    return(response);
                }

                if (regObj.IsApproved)
                {
                    using (var db = _uoWork.BeginTransaction())
                    {
                        thisCardDelivery.ApprovedBy        = regObj.AdminUserId;
                        thisCardDelivery.TimeStampApproved = regObj.TimeStampApproved;
                        thisCardDelivery.ApproverComment   = regObj.ApproverComment;
                        thisCardDelivery.Status            = CardStatus.Available;

                        var updateDelivery = _repository.Update(thisCardDelivery);
                        _uoWork.SaveChanges();
                        if (updateDelivery.CardDeliveryId < 1)
                        {
                            db.Rollback();
                            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);
                        }

                        associatedCardItem.Status = CardStatus.Available;

                        var updateCardItem = _cardItemRepository.Update(associatedCardItem);
                        _uoWork.SaveChanges();
                        if (updateDelivery.CardItemId < 1)
                        {
                            db.Rollback();
                            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);
                        }

                        associatedCard.Status = CardStatus.Available;

                        var updateCard = _cardRepository.Update(associatedCard);
                        _uoWork.SaveChanges();
                        if (updateDelivery.CardId < 1)
                        {
                            db.Rollback();
                            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);
                        }
                        db.Commit();
                        response.Status.IsSuccessful            = true;
                        response.CardDeliveryId                 = updateDelivery.CardDeliveryId;
                        response.Status.Message.FriendlyMessage = "Card Delivery Approved Successfully";
                    }

                    if (regObj.IsDenied)
                    {
                        using (var db = _uoWork.BeginTransaction())
                        {
                            thisCardDelivery.ApprovedBy        = regObj.AdminUserId;
                            thisCardDelivery.TimeStampApproved = regObj.TimeStampApproved;
                            thisCardDelivery.ApproverComment   = regObj.ApproverComment;
                            thisCardDelivery.Status            = CardStatus.Unavalable;

                            var updateDelivery = _repository.Update(thisCardDelivery);
                            _uoWork.SaveChanges();
                            if (updateDelivery.CardDeliveryId < 1)
                            {
                                db.Rollback();
                                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);
                            }

                            associatedCardItem.Status            = CardStatus.Unavalable;
                            associatedCardItem.AvailableQuantity = 0;

                            var updateCardItem = _cardItemRepository.Update(associatedCardItem);
                            _uoWork.SaveChanges();
                            if (updateDelivery.CardItemId < 1)
                            {
                                db.Rollback();
                                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);
                            }

                            db.Commit();
                            response.Status.IsSuccessful            = true;
                            response.CardDeliveryId                 = updateDelivery.CardDeliveryId;
                            response.Status.Message.FriendlyMessage = "Defected Successfully";
                        }
                    }
                }
            }
            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 CardDeliveryRegRespObj UpdateCardDelivery(EditCardDeliveryObj regObj)
        {
            var response = new CardDeliveryRegRespObj
            {
                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 thisCardDelivery = GetCardDeliveryInfo(regObj.CardDeliveryId);
                if (thisCardDelivery == null)
                {
                    response.Status.Message.FriendlyMessage  = "Error Occurred! No Card  Information Found";
                    response.Status.Message.TechnicalMessage = "Error Occurred! No Card  Information Found";
                    return(response);
                }
                var associatedCard = GetCardInfo(regObj.CardId);
                if (associatedCard == null)
                {
                    response.Status.Message.FriendlyMessage  = "Error Occurred! No Card  Information Found";
                    response.Status.Message.TechnicalMessage = "Error Occurred! No Card  Information Found";
                    return(response);
                }

                var associatedCardItem = GetCardItemInfo(regObj.CardItemId);
                if (associatedCardItem == null)
                {
                    response.Status.Message.FriendlyMessage  = "Error Occurred! No Card Item  Information Found";
                    response.Status.Message.TechnicalMessage = "Error Occurred! No Card Item Information Found";
                    return(response);
                }

                if (associatedCard.Status != CardStatus.Registered)
                {
                    response.Status.Message.FriendlyMessage  = "Error Occurred! This Card Item Is Not Available For Delivery";
                    response.Status.Message.TechnicalMessage = "Error Occurred! This Card Item Is Not Available For Delivery";
                    return(response);
                }

                //check validity of start/stop batch number

                if (regObj.DeliveredQuantity < 1)
                {
                    response.Status.Message.FriendlyMessage  = "Error Occurred! You Cannot Register An empty delivery ";
                    response.Status.Message.TechnicalMessage = "Error Occurred! Incorrect quantity Delivered Data";
                    return(response);
                }

                if (DateTime.Parse(regObj.DeliveryDate) > DateTime.Now)
                {
                    response.Status.Message.FriendlyMessage  = "Error Occurred! You Cannot Register A delivery before DeliveryDate";
                    response.Status.Message.TechnicalMessage = "Error Occurred! Incorrect Delivery Date Data";
                    return(response);
                }

                using (var db = _uoWork.BeginTransaction())
                {
                    thisCardDelivery.DefectiveQuantity  = regObj.DefectiveQuantity > 0 ? regObj.DefectiveQuantity : thisCardDelivery.DefectiveQuantity;
                    thisCardDelivery.MissingQuantity    = regObj.MissingQuantity > 0 ? regObj.MissingQuantity : thisCardDelivery.MissingQuantity;
                    thisCardDelivery.DeliveredQuantity  = regObj.DeliveredQuantity > 0 ? regObj.DeliveredQuantity : thisCardDelivery.DeliveredQuantity;
                    thisCardDelivery.TimeStampDelivered = !string.IsNullOrWhiteSpace(regObj.DeliveryDate) ? regObj.DeliveryDate : thisCardDelivery.TimeStampDelivered;

                    var updateCardDelivery = _repository.Update(thisCardDelivery);
                    _uoWork.SaveChanges();
                    if (updateCardDelivery.CardDeliveryId < 1)
                    {
                        db.Rollback();
                        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);
                    }
                    associatedCardItem.MissingQuantity   = regObj.MissingQuantity;
                    associatedCardItem.DefectiveQuantity = regObj.DefectiveQuantity;
                    associatedCardItem.DeliveredQuantity = regObj.DeliveredQuantity;
                    associatedCardItem.AvailableQuantity = regObj.DeliveredQuantity - (regObj.MissingQuantity + regObj.DefectiveQuantity);
                    associatedCardItem.DefectiveQuantity = regObj.DefectiveQuantity;

                    var updateCardItem = _cardItemRepository.Update(associatedCardItem);
                    _uoWork.SaveChanges();
                    if (updateCardItem.CardItemId < 1)
                    {
                        db.Rollback();
                        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);
                    }

                    db.Commit();

                    response.Status.IsSuccessful            = true;
                    response.CardDeliveryId                 = updateCardDelivery.CardDeliveryId;
                    response.Status.Message.FriendlyMessage = "Card delivery Update Successfully";
                }
            }
            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);
        }