Exemplo n.º 1
0
        private DoNotCallInterfaceValidateResult ValidateInsertUpdateCustomerRequest(InsertOrUpdateDoNotCallCustomerRequest request)
        {
            var  result = new DoNotCallInterfaceValidateResult();
            bool valid  = ValidateRequestModel(request, result);

            if (valid) // validate with database
            {
                // check item alreayd exist (get id and update date)
                DoNotCallTransactionInfo info = _doNotCallFacade.GetCustomerTransaction(request.CardNo, request.SubscriptTypeCode);
                bool isExistingTransaction    = info != null && info.TransactionId > 0;
                if (isExistingTransaction && info.UpdateDate > request.UpdateDate)
                {
                    result.ErrorMessage = $"Transaction already exists (transaction ID: {info.TransactionId})";
                }
                else if (isExistingTransaction && info.IsBlockAllInfoProduct && request.InformationBlockInfo.BlockProducts.Count > 0)
                {
                    result.ErrorMessage = $"Cannot add block product to Information block product list. The current setting is block ALL products.";
                }
                else if (isExistingTransaction && info.IsBlockAllSalesProduct && request.SalesBlockInfo.BlockProducts.Count > 0)
                {
                    result.ErrorMessage = $"Cannot add block product to Sales block product list. The current setting is block ALL products.";
                }
                else
                {
                    if (isExistingTransaction) // For Update
                    {
                        result.IsBlockAllInfoProducts  = info.IsBlockAllInfoProduct;
                        result.IsBlockAllSalesProducts = info.IsBlockAllSalesProduct;
                        // remove duplicated email
                        if (request.EmailList != null && request.EmailList.Count > 0 && info.Emails.Count > 0)
                        {
                            var removeItemList = new List <BlockEmail>();
                            foreach (var inputItem in request.EmailList)
                            {
                                var  existingItems     = info.Emails.Where(x => x.Email.Equals(inputItem.Email, StringComparison.InvariantCultureIgnoreCase)).ToList();
                                bool itemAlreadyExists = existingItems != null && existingItems.Count > 0;

                                if (itemAlreadyExists)
                                {
                                    bool inputItemIsActive       = inputItem.IsActive == Constants.FlagY;
                                    var  activeItem              = existingItems.FirstOrDefault(x => !x.IsDeleted);
                                    bool haveExistingActiveItem  = activeItem != null;
                                    bool haveExistingDeletedItem = existingItems.Any(x => x.IsDeleted);

                                    bool itemAlreadyActive  = haveExistingActiveItem && inputItemIsActive;
                                    bool itemAlreadyDeleted = !haveExistingActiveItem && haveExistingDeletedItem && !inputItemIsActive;
                                    if (itemAlreadyActive || itemAlreadyDeleted)
                                    {
                                        removeItemList.Add(inputItem);
                                    }
                                    else if (haveExistingActiveItem && !inputItemIsActive) // have item to delete
                                    {
                                        inputItem.Id = activeItem.Id;
                                    }
                                }
                            }

                            // remove items
                            request.EmailList = request.EmailList.Except(removeItemList).ToList();
                        }
                        // remove duplicated phone no
                        if (request.TelephoneList != null && request.TelephoneList.Count > 0 && info.Telephones.Count > 0)
                        {
                            var removeItemList = new List <BlockPhoneNo>();
                            foreach (var inputItem in request.TelephoneList)
                            {
                                var  existingItems     = info.Telephones.Where(x => x.PhoneNo.Equals(inputItem.PhoneNo, StringComparison.InvariantCultureIgnoreCase)).ToList();
                                bool itemAlreadyExists = existingItems != null && existingItems.Count > 0;

                                if (itemAlreadyExists)
                                {
                                    bool inputItemIsActive       = inputItem.IsActive == Constants.FlagY;
                                    var  activeItem              = existingItems.FirstOrDefault(x => !x.IsDeleted);
                                    bool haveExistingActiveItem  = activeItem != null;
                                    bool haveExistingDeletedItem = existingItems.Any(x => x.IsDeleted);

                                    bool itemAlreadyActive  = haveExistingActiveItem && inputItemIsActive;
                                    bool itemAlreadyDeleted = !haveExistingActiveItem && haveExistingDeletedItem && !inputItemIsActive;
                                    if (itemAlreadyActive || itemAlreadyDeleted)
                                    {
                                        removeItemList.Add(inputItem);
                                    }
                                    else if (haveExistingActiveItem && !inputItemIsActive) // have item to delete
                                    {
                                        inputItem.Id = activeItem.Id;
                                    }
                                }
                            }

                            // remove items
                            request.TelephoneList = request.TelephoneList.Except(removeItemList).ToList();
                        }
                    }

                    result.TransactionId = info?.TransactionId;
                    // check subscription type code exisst
                    _commonFacade = new CommonFacade();
                    string subscriptTypeCode = request.SubscriptTypeCode;
                    int?   subTypeId         = _commonFacade.GetSubscriptTypeByCode(subscriptTypeCode)?.SubscriptTypeId;
                    if (!subTypeId.HasValue)
                    {
                        result.ErrorMessage = $"Subscript type code {subscriptTypeCode} not found";
                    }
                    else
                    {
                        // check product exists
                        result.SubscriptionTypeId = subTypeId.Value;
                        ValidateProductCodes(request, result);
                        if (result.IsValid && isExistingTransaction)
                        {
                            // Sales
                            var removeSalesProductList = new List <DoNotCallActivityProductInput>();
                            foreach (var inputItem in result.ActivityProducts)
                            {
                                var  existingItems     = info.SalesProducts.Where(x => x.ProductId == inputItem.ProductId).ToList();
                                bool itemAlreadyExists = existingItems != null && existingItems.Count > 0;

                                if (itemAlreadyExists)
                                {
                                    bool inputItemIsActive       = inputItem.IsActive == Constants.FlagY;
                                    var  activeItem              = existingItems.FirstOrDefault(x => !x.IsDeleted);
                                    bool haveExistingActiveItem  = activeItem != null;
                                    bool haveExistingDeletedItem = existingItems.Any(x => x.IsDeleted);

                                    bool itemAlreadyActive  = haveExistingActiveItem && inputItemIsActive;
                                    bool itemAlreadyDeleted = !haveExistingActiveItem && haveExistingDeletedItem && !inputItemIsActive;
                                    if (itemAlreadyActive || itemAlreadyDeleted)
                                    {
                                        removeSalesProductList.Add(inputItem);
                                    }
                                    else if (haveExistingActiveItem && !inputItemIsActive) // have item to delete
                                    {
                                        inputItem.ProductId = activeItem.ProductId;
                                    }
                                }
                            }
                            // Info
                            var removeInfoProductList = new List <DoNotCallActivityProductInput>();
                            foreach (var inputItem in result.ActivityProducts)
                            {
                                var  existingItems     = info.InfoProducts.Where(x => x.ProductId == inputItem.ProductId).ToList();
                                bool itemAlreadyExists = existingItems != null && existingItems.Count > 0;

                                if (itemAlreadyExists)
                                {
                                    bool inputItemIsActive       = inputItem.IsActive == Constants.FlagY;
                                    var  activeItem              = existingItems.FirstOrDefault(x => !x.IsDeleted);
                                    bool haveExistingActiveItem  = activeItem != null;
                                    bool haveExistingDeletedItem = existingItems.Any(x => x.IsDeleted);

                                    bool itemAlreadyActive  = haveExistingActiveItem && inputItemIsActive;
                                    bool itemAlreadyDeleted = !haveExistingActiveItem && haveExistingDeletedItem && !inputItemIsActive;
                                    if (itemAlreadyActive || itemAlreadyDeleted)
                                    {
                                        removeInfoProductList.Add(inputItem);
                                    }
                                    else if (haveExistingActiveItem && !inputItemIsActive) // have item to delete
                                    {
                                        inputItem.ProductId = activeItem.ProductId;
                                    }
                                }
                            }
                            // remove items
                            result.ActivityProducts = result.ActivityProducts.Except(removeInfoProductList).ToList();
                        }
                    }
                }
            }

            result.IsValid = string.IsNullOrWhiteSpace(result.ErrorMessage);

            return(result);
        }
Exemplo n.º 2
0
        // Insert or Update
        public InsertOrUpdateDoNotCallCustomerResponse InsertOrUpdateDoNotCallCustomer(InsertOrUpdateDoNotCallCustomerRequest request)
        {
            string methodName = $"{nameof(DoNotCallInterfaceService)}.{nameof(InsertOrUpdateDoNotCallCustomer)}";
            var    response   = new InsertOrUpdateDoNotCallCustomerResponse();
            bool   success    = false;
            string detail     = string.Empty;

            try
            {
                _doNotCallFacade = new DoNotCallFacade();
                // Validate input data
                DoNotCallInterfaceValidateResult validateResult = ValidateInsertUpdateCustomerRequest(request);
                if (!validateResult.IsValid)
                {
                    response.ResponseStatusInfo = GetInvalidInputResponse <InsertResponseStatusInfo>(validateResult.ErrorMessage);
                    _logger.DebugFormat("-- XMLResponse --\n{0}", response.SerializeObject());
                    detail = validateResult.ErrorMessage;
                    return(response);
                }

                response.Header = GetResponseHeader(request.Header, methodName);

                // Authenticate user
                if (!ValidateServiceRequest(request.Header))
                {
                    response.ResponseStatusInfo = GetInvalidLoginResponse <InsertResponseStatusInfo>();
                    detail = "Invalid login";
                    return(response);
                }
                _logger.DebugFormat("-- XMLRequest --\n{0}", request.SerializeObject());

                // Map model to insert
                DoNotCallByCustomerEntity entity = MapCustomerEntity(request, validateResult);
                // Insert data

                int transactionId = _doNotCallFacade.SaveCustomerFromInterface(entity);
                if (transactionId > 0)
                {
                    response.ResponseStatusInfo = GetSuccessResponseStatusInfo <InsertResponseStatusInfo>();
                    response.ResponseStatusInfo.TransactionId = transactionId;
                    success = true;
                }

                return(response);
            }
            catch (Exception ex)
            {
                response.ResponseStatusInfo = GetErrorResponse <InsertResponseStatusInfo>(ex);
                detail = ex.Message;
                return(response);
            }
            finally
            {
                InsertAuditLog(methodName, success, detail ?? response.ResponseStatusInfo.ResponseMessage);
            }
        }