public ActionResult ConfigureSMS(SendInBlueModel model)
        {
            if (!ModelState.IsValid)
            {
                return(Configure());
            }

            var storeId            = GetActiveStoreScopeConfiguration(_storeService, _workContext);
            var sendInBlueSettings = _settingService.LoadSetting <SendInBlueSettings>(storeId);

            /* We do not clear cache after each setting update.
             * This behavior can increase performance because cached settings will not be cleared
             * and loaded from database after each update */
            sendInBlueSettings.UseSMS = model.UseSMS;
            _settingService.SaveSettingOverridablePerStore(sendInBlueSettings, x => x.UseSMS, model.UseSMS_OverrideForStore, storeId, false);
            sendInBlueSettings.SMSFrom = model.SMSFrom;
            _settingService.SaveSettingOverridablePerStore(sendInBlueSettings, x => x.SMSFrom, model.SMSFrom_OverrideForStore, storeId, false);
            sendInBlueSettings.MyPhoneNumber = model.MyPhoneNumber;
            _settingService.SaveSetting(sendInBlueSettings, x => x.MyPhoneNumber, storeId, false);

            //now clear settings cache
            _settingService.ClearCache();

            SuccessNotification(_localizationService.GetResource("Admin.Plugins.Saved"));

            //select "sms" tab
            SaveSelectedTabName("tab-sms");

            return(Configure());
        }
        public ActionResult Synchronization(SendInBlueModel model)
        {
            if (!ModelState.IsValid)
            {
                return(Configure());
            }

            var storeId = GetActiveStoreScopeConfiguration(_storeService, _workContext);

            //synchronize subscriptions for the certain store
            var syncResult = _sendInBlueEmailManager.Synchronize(true, storeId);

            if (string.IsNullOrEmpty(syncResult))
            {
                TempData["synchronizationStart"] = true;
                SuccessNotification(_localizationService.GetResource("Plugins.Misc.SendInBlue.ImportProcess"));
            }
            else
            {
                ErrorNotification(syncResult);
            }

            //select "synchronization" tab
            SaveSelectedTabName("tab-synchronization");

            return(Configure());
        }
        public ActionResult Configure()
        {
            var model = new SendInBlueModel();

            PrepareModel(model);

            return(View("~/Plugins/Misc.SendInBlue/Views/Configure.cshtml", model));
        }
        public ActionResult Configure(SendInBlueModel model)
        {
            if (!ModelState.IsValid)
            {
                return(Configure());
            }

            var storeId            = GetActiveStoreScopeConfiguration(_storeService, _workContext);
            var sendInBlueSettings = _settingService.LoadSetting <SendInBlueSettings>(storeId);

            //set API key
            sendInBlueSettings.ApiKey = model.ApiKey;
            _settingService.SaveSetting(sendInBlueSettings, x => x.ApiKey, 0, false);

            //now clear settings cache
            _settingService.ClearCache();

            SuccessNotification(_localizationService.GetResource("Admin.Plugins.Saved"));

            return(Configure());
        }
        /// <summary>
        /// Prepare SendInBlueModel
        /// </summary>
        /// <param name="model">Model</param>
        protected void PrepareModel(SendInBlueModel model)
        {
            var storeId            = GetActiveStoreScopeConfiguration(_storeService, _workContext);
            var sendInBlueSettings = _settingService.LoadSetting <SendInBlueSettings>(storeId);

            model.ActiveStoreScopeConfiguration = storeId;

            if (string.IsNullOrEmpty(sendInBlueSettings.ApiKey))
            {
                return;
            }

            //synchronization task
            var task = FindScheduledTask();

            if (task != null)
            {
                model.AutoSyncEachMinutes = task.Seconds / 60;
                model.AutoSync            = task.Enabled;
            }

            //settings to model
            model.ApiKey        = sendInBlueSettings.ApiKey;
            model.ListId        = sendInBlueSettings.ListId;
            model.SMTPSenderId  = sendInBlueSettings.SMTPSenderId;
            model.UseSMS        = sendInBlueSettings.UseSMS;
            model.SMSFrom       = sendInBlueSettings.SMSFrom;
            model.MyPhoneNumber = sendInBlueSettings.MyPhoneNumber;

            //check whether email account exist
            if (sendInBlueSettings.UseSendInBlueSMTP && _emailAccountService.GetEmailAccountById(sendInBlueSettings.SendInBlueEmailAccountId) != null)
            {
                model.UseSendInBlueSMTP = sendInBlueSettings.UseSendInBlueSMTP;
            }

            //overridable settings
            if (storeId > 0)
            {
                model.ListId_OverrideForStore            = _settingService.SettingExists(sendInBlueSettings, x => x.ListId, storeId);
                model.UseSendInBlueSMTP_OverrideForStore = _settingService.SettingExists(sendInBlueSettings, x => x.UseSendInBlueSMTP, storeId);
                model.SMTPSenderId_OverrideForStore      = _settingService.SettingExists(sendInBlueSettings, x => x.SMTPSenderId, storeId);
                model.UseSMS_OverrideForStore            = _settingService.SettingExists(sendInBlueSettings, x => x.UseSMS, storeId);
                model.SMSFrom_OverrideForStore           = _settingService.SettingExists(sendInBlueSettings, x => x.SMSFrom, storeId);
            }

            //get SendInBlue account info
            var errors      = string.Empty;
            var accountInfo = _sendInBlueEmailManager.GetAccountInfo(ref errors);

            if (string.IsNullOrEmpty(errors))
            {
                model.AccountInfo = accountInfo;
            }
            else
            {
                ErrorNotification(errors);
            }

            //check SMTP status
            if (!_sendInBlueEmailManager.SmtpIsEnabled(ref errors))
            {
                ErrorNotification(errors);
            }

            //get available lists of subscriptions for the synchronization from SendInBlue account
            model.AvailableLists = _sendInBlueEmailManager.GetLists();

            //get available senders of emails from SendInBlue account
            model.AvailableSenders = _sendInBlueEmailManager.GetSenders();

            //get message templates
            model.AvailableMessageTemplates = _messageTemplateService.GetAllMessageTemplates(storeId).Select(x => new SelectListItem
            {
                Value = x.Id.ToString(),
                Text  = storeId > 0 ? x.Name : string.Format("{0} {1}", x.Name, !x.LimitedToStores ? string.Empty :
                                                             _storeService.GetAllStores().Where(s => _storeMappingService.GetStoresIdsWithAccess(x).Contains(s.Id))
                                                             .Aggregate("-", (current, next) => string.Format("{0} {1}, ", current, next.Name)).TrimEnd(','))
            }).ToList();

            //get string of allowed tokens
            model.AllowedTokens = _messageTokenProvider.GetListOfAllowedTokens()
                                  .Aggregate(string.Empty, (current, next) => string.Format("{0}, {1}", current, next)).Trim(',');
        }
        public ActionResult ConfigureSMTP(SendInBlueModel model)
        {
            if (!ModelState.IsValid)
            {
                return(Configure());
            }

            var storeId            = GetActiveStoreScopeConfiguration(_storeService, _workContext);
            var sendInBlueSettings = _settingService.LoadSetting <SendInBlueSettings>(storeId);

            if (model.UseSendInBlueSMTP)
            {
                //set case invariant for true because tokens are used in uppercase format in SendInBlue's transactional emails
                var messageTemplatesSettings = _settingService.LoadSetting <MessageTemplatesSettings>();
                messageTemplatesSettings.CaseInvariantReplacement = true;
                _settingService.SaveSetting(messageTemplatesSettings, x => x.CaseInvariantReplacement, 0, false);

                //check whether SMTP enabled on SendInBlue profile
                var errors = string.Empty;
                if (_sendInBlueEmailManager.SmtpIsEnabled(ref errors))
                {
                    //get email account or create new one
                    sendInBlueSettings.SendInBlueEmailAccountId = _sendInBlueEmailManager.GetEmailAccountId(_emailAccountService, model.SMTPSenderId, out errors);
                    if (string.IsNullOrEmpty(errors))
                    {
                        _settingService.SaveSetting(sendInBlueSettings, x => x.SendInBlueEmailAccountId, storeId, false);
                    }
                    else
                    {
                        ErrorNotification(errors);
                    }

                    //synchronize nopCommerce tokens and SendInBlue transactional attributes
                    _sendInBlueEmailManager.PrepareAttributes(_messageTokenProvider.GetListOfAllowedTokens(), out errors);
                    if (!string.IsNullOrEmpty(errors))
                    {
                        ErrorNotification(errors);
                    }
                }
                else
                {
                    //need to activate SMTP account
                    ErrorNotification(_localizationService.GetResource("Plugins.Misc.SendInBlue.ActivateSMTP"));
                    model.UseSendInBlueSMTP = false;
                }
            }

            //set whether to use SMTP of SendInBlue service
            sendInBlueSettings.UseSendInBlueSMTP = model.UseSendInBlueSMTP;
            _settingService.SaveSettingOverridablePerStore(sendInBlueSettings, x => x.UseSendInBlueSMTP, model.UseSendInBlueSMTP_OverrideForStore, storeId, false);

            //set sender of transactional emails
            sendInBlueSettings.SMTPSenderId = model.SMTPSenderId;
            _settingService.SaveSettingOverridablePerStore(sendInBlueSettings, x => x.SMTPSenderId, model.SMTPSenderId_OverrideForStore, storeId, false);

            //now clear settings cache
            _settingService.ClearCache();

            SuccessNotification(_localizationService.GetResource("Admin.Plugins.Saved"));

            //select "transactional" tab
            SaveSelectedTabName("tab-transactional");

            return(Configure());
        }
        public ActionResult SaveSynchronization(SendInBlueModel model)
        {
            if (!ModelState.IsValid)
            {
                return(Configure());
            }

            var storeId            = GetActiveStoreScopeConfiguration(_storeService, _workContext);
            var sendInBlueSettings = _settingService.LoadSetting <SendInBlueSettings>(storeId);

            //create or update synchronization task
            var task = FindScheduledTask();

            if (task != null)
            {
                task.Enabled = model.AutoSync;
                task.Seconds = model.AutoSyncEachMinutes * 60;
                _scheduleTaskService.UpdateTask(task);
            }
            else
            {
                _scheduleTaskService.InsertTask(new ScheduleTask
                {
                    Name    = "SendInBlue synchronization",
                    Seconds = model.AutoSyncEachMinutes * 60,
                    Enabled = model.AutoSync,
                    Type    = "Nop.Plugin.Misc.SendInBlue.Services.SendInBlueSynchronizationTask, Nop.Plugin.Misc.SendInBlue",
                });
            }
            if (model.AutoSync)
            {
                SuccessNotification(_localizationService.GetResource("Plugins.Misc.SendInBlue.AutoSyncRestart"));
            }

            //create store_id attribute (if not exists) in SendInBlue account
            _sendInBlueEmailManager.PrepareStoreAttribute();

            //set notify url for the importing process
            var currentStore = storeId == 0 ? _storeService.GetAllStores().FirstOrDefault() : _storeService.GetStoreById(storeId);

            sendInBlueSettings.UrlSync = string.Format("{0}{1}", currentStore.Url.TrimEnd('/'), Url.RouteUrl("Plugin.Misc.SendInBlue.ImportUsers"));
            _settingService.SaveSetting(sendInBlueSettings, x => x.UrlSync, storeId, false);

            //create webhook for the unsubscribing event
            var unsubscribeUrl = string.Format("{0}{1}", currentStore.Url.TrimEnd('/'), Url.RouteUrl("Plugin.Misc.SendInBlue.Unsubscribe"));

            sendInBlueSettings.UnsubscribeWebhookId = _sendInBlueEmailManager.GetUnsubscribeWebHookId(sendInBlueSettings.UnsubscribeWebhookId, unsubscribeUrl);
            _settingService.SaveSetting(sendInBlueSettings, x => x.UnsubscribeWebhookId, storeId, false);

            //set list for the synchronization
            sendInBlueSettings.ListId = model.ListId > 0 ? model.ListId : _sendInBlueEmailManager.CreateNewList(model.NewListName);
            _settingService.SaveSettingOverridablePerStore(sendInBlueSettings, x => x.ListId, model.ListId_OverrideForStore, storeId, false);

            //now clear settings cache
            _settingService.ClearCache();

            SuccessNotification(_localizationService.GetResource("Admin.Plugins.Saved"));

            //select "synchronization" tab
            SaveSelectedTabName("tab-synchronization");

            return(Configure());
        }