public override IList <Merchant> ImportAmexMidFile(Stream fileStream)
        {
            IList <Merchant> merchants = new List <Merchant>();

            try
            {
                HashSet <string> amexMids    = new HashSet <string>();
                IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(fileStream);
                excelReader.IsFirstRowAsColumnNames = true;

                DataSet   storeDataSet   = excelReader.AsDataSet();
                DataTable storeDataTable = storeDataSet.Tables[0];
                if (storeDataTable != null)
                {
                    Log.Info("Total Rows in AmexMid File is {0}", storeDataTable.Rows.Count);
                    var merchantData = GetDataFromSpecifiedColumns(storeDataTable, AmexImportList);
                    Log.Info("Total Rows read from AmexMid File is {0}", merchantData.Count);

                    foreach (var data in merchantData)
                    {
                        Merchant existingMerchant = null;
                        //Check if we have already seen this merchant in this spreadsheet based on the PartnerMerchantId of the merchant
                        string merchantId = data.ContainsKey(MerchantConstants.Id) ? data[MerchantConstants.Id] : null;
                        if (!string.IsNullOrEmpty(merchantId))
                        {
                            existingMerchant = merchants.FirstOrDefault(m => m.Id == data[MerchantConstants.Id]);
                        }

                        if (existingMerchant == null)
                        {
                            Merchant merchant = new Merchant
                            {
                                Id       = data[MerchantConstants.Id],
                                Name     = data[MerchantConstants.Name],
                                Location = new Location
                                {
                                    Address = data[MerchantConstants.Address],
                                    City    = data[MerchantConstants.City],
                                    State   = data[MerchantConstants.State],
                                    Zip     = data[MerchantConstants.Zip]
                                },
                                PhoneNumber = data.ContainsKey(MerchantConstants.Phone)
                                    ? StringUtility.StripAllButDigits(data[MerchantConstants.Phone]) : string.Empty
                            };

                            // amexMids hashset is passed to validate duplication of SE numbers for different merchants
                            merchant.Payments = CreateAmexPayment(data, amexMids);
                            merchants.Add(merchant);
                        }
                        else
                        {
                            // if MerchantId appears multiple times in the list hence add to the list
                            var payments = CreateAmexPayment(data, amexMids);
                            if (payments != null && payments.Any())
                            {
                                foreach (var payment in payments)
                                {
                                    existingMerchant.Payments.Add(payment);
                                }
                            }
                        }
                    }
                }

                Log.Info("Total unique merchants read from AmexMid file is {0} ", merchants.Count);
                return(merchants);
            }
            catch (Exception e)
            {
                Log.Error("Error in reading merchant data from excel stream " + e.Message);
                throw;
            }
        }
        public override IList <Merchant> ImportMasterCardClearingFile(Stream fileStream)
        {
            IList <Merchant> lstMerchants = new List <Merchant>();

            try
            {
                IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(fileStream);
                excelReader.IsFirstRowAsColumnNames = true;

                DataSet   storeDataSet   = excelReader.AsDataSet();
                DataTable storeDataTable = storeDataSet.Tables[0];
                if (storeDataTable != null)
                {
                    Log.Info("Total Rows in MasterCardClearingFile is {0}", storeDataTable.Rows.Count);
                    var lstMerchantData = GetDataFromSpecifiedColumns(storeDataTable, MCClearingFileImportColumnList);
                    Log.Info("Total Rows read from MasterCardClearingFile is {0}", lstMerchantData.Count);

                    foreach (var merchantData in lstMerchantData)
                    {
                        Merchant existingMerchant = null;

                        //Check if we have already seen this merchant in this spreadsheet based on the siteid of the merchant
                        string siteId = merchantData.ContainsKey(MerchantConstants.MCSiteId) ? merchantData[MerchantConstants.MCSiteId] : string.Empty;
                        if (!string.IsNullOrEmpty(siteId))
                        {
                            existingMerchant = lstMerchants
                                               .FirstOrDefault(m => (m.ExtendedAttributes != null && m.ExtendedAttributes.ContainsKey(MerchantConstants.MCSiteId) &&
                                                                     m.ExtendedAttributes[MerchantConstants.MCSiteId] == merchantData[MerchantConstants.MCSiteId]));
                        }

                        //if we have not seen the merchant, then create one
                        if (existingMerchant == null)
                        {
                            var merchant = CreateMerchant(merchantData);
                            merchant.ExtendedAttributes = new Dictionary <string, string>();
                            merchant.ExtendedAttributes.Add(MerchantConstants.MCSiteId, merchantData[MerchantConstants.MCSiteId]);
                            merchant.Payments = new List <Payment>();
                            Payment payment = new Payment();
                            payment.Processor   = PaymentProcessor.MasterCard;
                            payment.PaymentMids = new Dictionary <string, string>();
                            payment.PaymentMids.Add(MerchantConstants.MCLocationId, merchantData[MerchantConstants.MCLocationId]);
                            merchant.Payments.Add(payment);
                            lstMerchants.Add(merchant);
                        }
                        else
                        {
                            //else, update the payment info to the existing merchant
                            Payment payment = new Payment();
                            payment.Processor   = PaymentProcessor.MasterCard;
                            payment.PaymentMids = new Dictionary <string, string>();
                            payment.PaymentMids.Add(MerchantConstants.MCLocationId, merchantData[MerchantConstants.MCLocationId]);
                            existingMerchant.Payments.Add(payment);
                        }
                    }
                }

                Log.Info("Total unique merchants read from MasterCardClearing file is {0} ", lstMerchants.Count);

                return(lstMerchants);
            }
            catch (Exception e)
            {
                Log.Error("Error in reading merchant data from excel stream " + e.Message);
                throw;
            }
        }
        public override IList <Merchant> ImportVisaMidFile(Stream fileStream)
        {
            IList <Merchant> lstMerchants = new List <Merchant>();

            try
            {
                HashSet <string> visaMids    = new HashSet <string>();
                IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(fileStream);
                excelReader.IsFirstRowAsColumnNames = true;

                DataSet   storeDataSet   = excelReader.AsDataSet();
                DataTable storeDataTable = storeDataSet.Tables[0];
                if (storeDataTable != null)
                {
                    Log.Info("Total Rows in VisaMid File is {0}", storeDataTable.Rows.Count);
                    var lstMerchantData = GetDataFromSpecifiedColumns(storeDataTable, VisaImportList);
                    Log.Info("Total Rows read from VisaMid File is {0}", lstMerchantData.Count);

                    foreach (var merchantData in lstMerchantData)
                    {
                        Merchant existingMerchant = null;

                        //Check if we have already seen this merchant in this spreadsheet based on the PartnerMerchantId of the merchant
                        string partnerMerchantId = merchantData.ContainsKey(MerchantConstants.PartnerMerchantId) ? merchantData[MerchantConstants.PartnerMerchantId] : null;
                        if (!string.IsNullOrEmpty(partnerMerchantId))
                        {
                            existingMerchant = lstMerchants.FirstOrDefault(m => m.PartnerMerchantId == merchantData[MerchantConstants.PartnerMerchantId]);
                        }
                        if (existingMerchant == null)
                        {
                            Merchant merchant = CreateMerchant(merchantData);
                            merchant.PartnerMerchantId = partnerMerchantId;
                            Payment payment = CreateVisaPayment(merchantData, visaMids);
                            merchant.Payments = new List <Payment>();
                            merchant.Payments.Add(payment);

                            merchant.ExtendedAttributes = new Dictionary <string, string>();
                            string visaMidName = merchantData.ContainsKey(MerchantConstants.VisaMidName) ? merchantData[MerchantConstants.VisaMidName] : null;
                            string visaSidName = merchantData.ContainsKey(MerchantConstants.VisaSidName) ? merchantData[MerchantConstants.VisaSidName] : null;
                            if (!string.IsNullOrEmpty(visaMidName))
                            {
                                merchant.ExtendedAttributes.Add(MerchantConstants.VisaMidName, visaMidName);
                            }
                            if (!string.IsNullOrEmpty(visaSidName))
                            {
                                merchant.ExtendedAttributes.Add(MerchantConstants.VisaSidName, visaSidName);
                            }
                            lstMerchants.Add(merchant);
                        }
                        else
                        {
                            Payment payment = CreateVisaPayment(merchantData, visaMids);
                            existingMerchant.Payments.Add(payment);
                        }
                    }
                }

                Log.Info("Total unique merchants read from VisaMid file is {0} ", lstMerchants.Count);

                return(lstMerchants);
            }
            catch (Exception e)
            {
                Log.Error("Error in reading merchant data from excel stream " + e.Message);
                throw;
            }
        }