public async Task ExecuteAsync(ScheduledJobInfo scheduledJobInfo)
        {
            await ValidatePayload(scheduledJobInfo).ConfigureAwait(false);

            IDictionary <string, string> payload = scheduledJobInfo.JobPayload;
            string merchantFileName = payload[JobConstants.BlobName];
            string blobContainer    = payload[JobConstants.ContainerName];
            string providerId       = payload[JobConstants.ProviderId];

            MemoryStream ms = await GetMerchantsFromBlobAsync(merchantFileName, blobContainer).ConfigureAwait(false);

            MerchantFileProcessor             merchantFileProcessor = MerchantProcessorFactory.GetMerchantFileProcessor(merchantFileName);
            Tuple <string, IList <Merchant> > provisioningData      = merchantFileProcessor.ImportMasterCardProvisioningFile(ms);

            if (provisioningData == null)
            {
                throw new Exception("Error in processing the mastercard provisioning file. Unable to provision merchants");
            }

            string           masterCardMerchantsProvisioningDate = provisioningData.Item1;
            IList <Merchant> lstProvisionedMerchants             = provisioningData.Item2;

            if (lstProvisionedMerchants.Any())
            {
                //Update the provider with the MasterCard merchant provisioning file date info. This is needed
                //at the time of exporting the file back to MasterCard.
                if (provider.ExtendedAttributes == null)
                {
                    provider.ExtendedAttributes = new Dictionary <string, string>();
                }
                if (!provider.ExtendedAttributes.ContainsKey(MerchantConstants.MCProvisioningDate))
                {
                    provider.ExtendedAttributes.Add(MerchantConstants.MCProvisioningDate, masterCardMerchantsProvisioningDate);
                }
                else
                {
                    provider.ExtendedAttributes[MerchantConstants.MCProvisioningDate] = masterCardMerchantsProvisioningDate;
                }
                await EarnRepository.Instance.UpdateAsync <Provider>(new List <Provider> {
                    provider
                });

                Log.Info($"Updated the provider {providerId} with the MasterCard provisioning date");

                //Add the new merchants to db.
                //TODO: As of now, the code can handle only new merchant additions from the MC file.
                //Need to add support to handle updates and deletes

                foreach (Merchant merchant in lstProvisionedMerchants)
                {
                    merchant.Id         = Guid.NewGuid().ToString();
                    merchant.ProviderId = provider.Id;
                    GeoCodeMerchantLocation(merchant);
                    if (merchant.ExtendedAttributes == null)
                    {
                        merchant.ExtendedAttributes = new Dictionary <string, string>();
                    }
                    string masterCardId = MasterCardIdGenerator.GetUniqueId(provider, merchant, "P");
                    Log.Info($"Generated mastercardid {masterCardId} for merchant {merchant.Name}");
                    merchant.ExtendedAttributes.Add(MerchantConstants.MCID, masterCardId);
                }

                Log.Info($"Total Merchants to add to db {lstProvisionedMerchants.Count}");
                await EarnRepository.Instance.AddMerchantsInBatchAsync(lstProvisionedMerchants);

                Log.Info($"Successfully added {lstProvisionedMerchants.Count} merchants to db");

                scheduledJobInfo.JobCompletedTime = DateTime.UtcNow;
            }
            else
            {
                Log.Warn("Provisioning file from MasterCard has 0 merchants");
            }
        }