using framework_business; using framework_library; using System; using System.Collections; using System.Configuration; using System.Data; using System.Reflection; using System.Text; using System.Web.UI; using System.Web.UI.WebControls; using System.Linq; using System.Collections.Generic; public partial class controls_admin_campaigns : System.Web.UI.UserControl { #region methods /// /// Method to Bind Campaign Data /// private void BindCampaignData() { try { lblTotalCredits.Text = SMSCredit.currentBalance.ToString(); lblTotalAllocated.Text = SMSCredit.allocatedBalance.ToString(); lblTotalAvailable.Text = SMSCredit.availableBalance.ToString(); CheckThreshold(); ArrayList campaignList = xData.GetTypedByCriteriaSpecific("recId", typeof(ovCampaignDetail), "", "", "campaignTitle"); rptCampaigns.DataSource = campaignList; rptCampaigns.DataBind(); BindLog(); } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, Session["campaign"]); Response.Redirect("/error", false); } } /// /// Bind Log /// private void BindLog() { try { ArrayList campaignLogList = xData.GetTypedByCriteriaSpecific("recId", typeof(ovCampaignLog), "", "", "lastSent DESC"); rptLog.DataSource = campaignLogList; rptLog.DataBind(); } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, Session["campaign"]); Response.Redirect("/error", false); } } private void CheckThreshold() { try { if (SMSCredit.availableBalance < SMSCredit.threshold) { oEmail mail = new oEmail(); mail.Subject = "SMS Credit Threshold Reached"; StringBuilder emailBody = new StringBuilder(); emailBody.AppendLine("Your SMS Credit Threshold has been reached."); emailBody.AppendLine("Current Avaialble Credits: " + SMSCredit.availableBalance.ToString()); mail.fromAddress = ConfigurationManager.AppSettings["from"]; mail.bccAddress = ConfigurationManager.AppSettings["bcc"]; mail.toAddress = ConfigurationManager.AppSettings["admin"]; mail.Body = emailBody.ToString(); communication.SendAnEmail(mail); } } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, Session["campaign"]); Response.Redirect("/error", false); } } /// /// Bind Templates /// private void BindTemplates() { ArrayList templates = new ArrayList(); try { templates = xData.GetTypedByCriteriaSpecific("recId", typeof(oTemplate), "templateTypeId", "3", "templateName"); ddEmailTemplate.DataSource = templates; ddEmailTemplate.DataTextField = "templateName"; ddEmailTemplate.DataValueField = "recId"; ddEmailTemplate.DataBind(); ddEmailTemplate.Items.Insert(0, new ListItem("None Selected", "0")); } catch (Exception ex) { exception.HandleException("Admin:", MethodBase.GetCurrentMethod().Name, ex, 0); Response.Redirect("Error.aspx", false); } } /// /// Populate Form Values /// /// private void PopulatePageFormValues(ref oCampaign _Campaign) { try { BindCampaignTypes(); BindCampaignIntervals(); txtTitle.Value = _Campaign.campaignTitle; if (ddInterval.Items.FindByValue(_Campaign.interval.ToString()) != null) ddInterval.SelectedValue = _Campaign.interval.ToString(); if (ddInterval.SelectedItem != null && ddInterval.SelectedItem.Text == "Once Off") { if (ddCampaignType.Items.FindByText("Ad Hoc") != null) ddCampaignType.SelectedValue = ddCampaignType.Items.FindByText("Ad Hoc").Value; ddCampaignType.Enabled = false; divDateTime.Visible = false; _Campaign.nextSend = DateTime.Now; btnSave.Text = "Send Now"; } else { if (ddCampaignType.Items.FindByText("Ad Hoc") != null) ddCampaignType.Items.Remove(ddCampaignType.Items.FindByText("Ad Hoc")); if (ddCampaignType.Items.FindByValue(_Campaign.campaignType.ToString()) != null) ddCampaignType.SelectedValue = _Campaign.campaignType.ToString(); ddCampaignType.Enabled = true; divDateTime.Visible = true; btnSave.Text = "Save"; } ddMessageType.SelectedValue = _Campaign.messageType.ToString(); ToggleMessageTypes(); if (_Campaign.messageType == 1) edEmailMessage.Content = _Campaign.campaignBody; else if (_Campaign.messageType == 2) txbMessageSMS.Value = _Campaign.campaignBody; if (_Campaign.nextSend.Year > 1901) { txbStartDate.Text = utils.formatDateToString(_Campaign.nextSend); txbTime.Text = _Campaign.nextSend.ToString("HH:mm"); } else { txbStartDate.Text = string.Empty; txbTime.Text = string.Empty; } chkActive.Checked = _Campaign.isActive; string currentState = ""; divCurrentState.Visible = _Campaign.recId > 0; if (_Campaign.isDraft) currentState = "Draft"; else if (_Campaign.lastSent > Convert.ToDateTime("1900-01-01")) currentState = "Sent"; else currentState = "Pending"; lblCurrentState.Text = currentState; //<%#(Convert.ToBoolean(DataBinder.Eval(Container.DataItem, "isDraft"))==true)?"Draft":Convert.ToDateTime(DataBinder.Eval(Container.DataItem, "lastSent")) > Convert.ToDateTime("1900-01-01") ? "Sent": "Pending" %> divRecipients.Visible = true; BindRecipients(_Campaign.recId); } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, 0); Response.Redirect("/error", false); } } /// /// Validate SMS Credits - Take SMS length into account /// /// private bool ValidateSMSCredits() { bool valid = false; try { int smsLength = txbMessageSMS.Value.Length; int smsCount = 0; if (smsLength > 0 && smsLength <= 160) smsCount = 0; else { decimal calc = (smsLength - 160m) / (160m - 7m) + 1m; int.TryParse((Math.Ceiling(calc)).ToString(), out smsCount); } int creditsNeeded = smsCount * RecipientCount; valid = creditsNeeded <= SMSCredit.availableBalance; } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, 0); Response.Redirect("/error", false); } return valid; } private void BindRecipients(int campaignId) { try { DataTable dtRecipients = xData.GetTypedByCriteriaSpecificTable("recId", typeof(oCampaignRecipient), "campaignId,isIncluded", campaignId.ToString() + ",1", "recipientName"); Session["dtRecipient"] = dtRecipients; lblRecipientCount.Text = "Number of Recipients: " + dtRecipients.Rows.Count.ToString(); if (ddMessageType.SelectedValue == "2") { //CVH 2018-03-27 Allowing longer sms'es to be sent, check message length in validation //if (RecipientCount > SMSCredit.availableBalance) if (!ValidateSMSCredits()) { btnSave.Enabled = false; lblRecipientCount.ForeColor = System.Drawing.Color.Red; } else { btnSave.Enabled = RecipientCount > 0; lblRecipientCount.ForeColor = System.Drawing.Color.Empty; } } else { btnSave.Enabled = RecipientCount > 0; lblRecipientCount.ForeColor = System.Drawing.Color.Empty; } } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, 0); Response.Redirect("/error", false); } } /// /// Bind Campaign Types /// private void BindCampaignTypes() { try { DataTable dtCampaignTypes = xData.GetTypedByCriteriaSpecificTable("recId", typeof(oCampaignType), "isActive", "1"); ddCampaignType.DataSource = dtCampaignTypes; ddCampaignType.DataTextField = "campaignType"; ddCampaignType.DataValueField = "recId"; ddCampaignType.DataBind(); if (dtCampaignTypes.Rows.Count == 1) ddCampaignType.Enabled = false; } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, 0); Response.Redirect("/error", false); } } /// /// Bind Campaign Intervals /// private void BindCampaignIntervals() { try { DataTable dtCampaignIntervals = xData.GetTypedByCriteriaSpecificTable("recId", typeof(oCampaignInterval), "isActive", "1"); ddInterval.DataSource = dtCampaignIntervals; ddInterval.DataTextField = "interval"; ddInterval.DataValueField = "recId"; ddInterval.DataBind(); //if (dtCampaignIntervals.Rows.Count == 1) // ddInterval.Enabled = false; } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, 0); Response.Redirect("/error", false); } } /// /// Save Form Values /// /// private void SavePageFormValues(ref oCampaign _Campaign) { try { _Campaign.campaignTitle = txtTitle.Value; _Campaign.campaignType = int.Parse(ddCampaignType.SelectedValue); _Campaign.messageType = int.Parse(ddMessageType.SelectedValue); if (_Campaign.messageType == 1) _Campaign.campaignBody = edEmailMessage.Content; else if (_Campaign.messageType == 2) _Campaign.campaignBody = txbMessageSMS.Value; else _Campaign.campaignBody = ""; _Campaign.interval = int.Parse(ddInterval.SelectedValue); if (_Campaign.interval == 1) _Campaign.isRecurring = false; else _Campaign.isRecurring = true; DateTime dateOnly = DateTime.Now; DateTime timeOnly = new DateTime(); if (txbStartDate.Text != string.Empty) dateOnly = utils.formatStringToDate(txbStartDate.Text); if (txbTime.Text != string.Empty) { timeOnly = Convert.ToDateTime(txbTime.Text); } _Campaign.nextSend = dateOnly.Date.Add(timeOnly.TimeOfDay); _Campaign.isActive = chkActive.Checked; _Campaign.dateUpdated = DateTime.Now; } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, 0); Response.Redirect("/error", false); } } /// /// Method to Toggle Panels /// /// private void TogglePanels(string panelName) { switch (panelName) { case "pnlCampaignPage": pnlCampaignPage.Visible = true; pnlCampaignList.Visible = false; break; case "pnlCampaignList": pnlCampaignPage.Visible = false; pnlCampaignList.Visible = true; break; } //clear result pnlResult.Visible = false; } /// /// Toggle Message Types /// private void ToggleMessageTypes() { switch (ddMessageType.SelectedValue) { case "0": divEmailTemplate.Visible = false; pnlEmailMessage.Visible = false; pnlSMSMessage.Visible = false; break; case "1"://email divEmailTemplate.Visible = true; pnlEmailMessage.Visible = true; pnlSMSMessage.Visible = false; break; case "2"://sms divEmailTemplate.Visible = false; pnlEmailMessage.Visible = false; pnlSMSMessage.Visible = true; break; } } /// /// Generate Recipient List /// /// private void GenerateRecipients(bool clearExisting = true) { try { int surfaceId = Convert.ToInt32(ddRecipientSurface.SelectedValue.ToString()); oSurface _surface = new oSurface(); foreach (oSurface surf in xData.GetTypedByCriteriaSpecific("recId", typeof(oSurface), "recId", surfaceId.ToString())) { _surface = surf; break; } string filterField = string.Empty; string filterValues = string.Empty; string filter = string.Empty; if (handler.ReturnSetup().code == "STUD-1") { filterField = "School|IntakeYear"; string schoolValues = string.Empty; string intakeYearValues = string.Empty; foreach (ListItem item in lstRecipientFilterSchool.Items.GetSelectedItems()) { if (item.Selected) { if (schoolValues != string.Empty) schoolValues += ",'" + item.Value.ToString().Replace("'", "''") + "'"; else schoolValues += "'" + item.Value.ToString().Replace("'", "''") + "'"; } } foreach (ListItem item in lstRecipientFilterIntakeYear.Items.GetSelectedItems()) { if (item.Selected) { if (intakeYearValues != string.Empty) intakeYearValues += ",'" + item.Value.ToString() + "'"; else intakeYearValues += "'" + item.Value.ToString() + "'"; } } filterValues = schoolValues + "|" + intakeYearValues; if (schoolValues != string.Empty) { if (filter != string.Empty) filter += " AND "; filter += "ProfileHeader_School IN (" + schoolValues + ")"; } if (intakeYearValues != string.Empty) { if (filter != string.Empty) filter += " AND "; filter += "ProfileHeader_IntakeYear IN (" + intakeYearValues + ")"; } } else { filterField = ddRecipientFilter.SelectedValue.ToString(); foreach (ListItem item in lstRecipientFilterValue.Items.GetSelectedItems()) { if (item.Selected) { if (filterValues != string.Empty) filterValues += ",'" + item.Value.ToString() + "'"; else filterValues += "'" + item.Value.ToString() + "'"; } } if (filterField != "0") filter = filterField + " IN (" + filterValues + ")"; } if (surfaceId > 0 && lstRecipientName.GetSelectedIndices().Any() && ddRecipientNumber.SelectedValue.ToString() != "0") { int totalRows = 0; if (_surface.isPublished) totalRows = xData.GetPublishedSurfaceDataCount(surfaceId, 0, "", filter); else totalRows = xData.GetSurfaceQueryDataCount(surfaceId, 0, "", filter); //CVH 2017-10-10 Getting Object Ref exceptions here, no Campaign session. If not, save new. oCampaign campaign = new oCampaign(); if (utils.verifySession("Campaign")) campaign = (oCampaign)Session["Campaign"]; campaign.contactSourceSurface = surfaceId; campaign.contactNumberField = ddRecipientNumber.SelectedValue.ToString(); var contactNameFields = String.Empty; foreach (var selected in lstRecipientName.GetSelectedIndices()) { if (contactNameFields == String.Empty) contactNameFields = lstRecipientName.Items[selected].Value; else contactNameFields += "," + lstRecipientName.Items[selected].Value; } campaign.contactNameField = contactNameFields; campaign.filterField = filterField; campaign.filterValue = filterValues; if (campaign.recId > 0) xData.UpdateTyped("recId", campaign.recId.ToString(), typeof(oCampaign), campaign); else { campaign.createdBy = handler.ReturnUser().recId; campaign.dateSaved = System.DateTime.Now; campaign.recId = xData.SaveTyped("recId", typeof(oCampaign), campaign); } Session["CampaignId"] = campaign.recId; Session["Campaign"] = campaign; DataTable dtRecipients = xData.GetTypedByCriteriaSpecificTable("recId", typeof(oCampaignRecipient), "campaignId,isIncluded", campaign.recId.ToString() + ",1", "recipientName"); DataTable dtGenerated = new DataTable(); if (_surface.isPublished) dtGenerated = xData.GetPublishedSurfaceDataPaged(surfaceId, 0, totalRows, "", "", handler.ReturnUser().recId, 0, filter, true); else dtGenerated = xData.GetSurfaceQueryDataPaged(surfaceId, 0, totalRows, "", "", handler.ReturnUser().recId, 0, filter, true); if (dtGenerated.Rows.Count > 0) { DataView view = new DataView(dtGenerated); //DataTable dtRec = view.ToTable("Recipients", false, ddRecipientName.SelectedValue.ToString(), ddRecipientNumber.SelectedValue.ToString(), "itemID"); //CVH 2017-11-22 Return selected Name columns, as well as Number column and ItemID in table int fieldCount = campaign.contactNameField.Split(',').Count() + 2; string[] fields = new string[fieldCount]; for (int i = 0; i < fieldCount; i++) { if (i < (fieldCount - 2)) fields[i] = campaign.contactNameField.Split(',')[i]; else if (i < (fieldCount - 1)) fields[i] = campaign.contactNumberField; else fields[i] = "itemID"; } DataTable dtRec = view.ToTable("Recipients", false, fields); foreach (DataRow row in dtRec.Rows) { DataRow newRecipientRow = dtRecipients.NewRow(); //newRecipientRow["recipientName"] = row[ddRecipientName.SelectedValue.ToString()].ToString(); //newRecipientRow["recipientNumber"] = row[ddRecipientNumber.SelectedValue.ToString()].ToString(); string name = String.Empty; foreach (var colName in campaign.contactNameField.Split(',')) { if (name == String.Empty) name = row[colName].ToString(); else name += " " + row[colName].ToString(); } newRecipientRow["recipientName"] = name; newRecipientRow["recipientNumber"] = row[campaign.contactNumberField].ToString(); newRecipientRow["surfaceItemId"] = row["itemID"].ToString(); newRecipientRow["isIncluded"] = false; newRecipientRow["recId"] = 0; var dr = from r in dtRecipients.AsEnumerable() where r.Field("recipientName") == newRecipientRow["recipientName"].ToString() && r.Field("recipientNumber") == newRecipientRow["recipientNumber"].ToString() select r; if (dr.AsDataView().Count == 0) dtRecipients.Rows.Add(newRecipientRow); } } Session["dtRecipient"] = dtRecipients; grdRecipients.DataSource = dtRecipients; grdRecipients.DataBind(); lblRecipientIncludedCount.Text = "Recipient Count: " + RecipientCount.ToString(); btnRecipientSave.Visible = RecipientCount > 0; upRecipient.Update(); } else if (surfaceId == 0) { if (utils.verifySession("Campaign")) { oCampaign campaign = (oCampaign)Session["Campaign"]; DataTable dtRecipients = xData.GetTypedByCriteriaSpecificTable("recId", typeof(oCampaignRecipient), "campaignId,isIncluded", campaign.recId.ToString() + ",1", "recipientName"); Session["dtRecipient"] = dtRecipients; grdRecipients.DataSource = dtRecipients; grdRecipients.DataBind(); lblRecipientIncludedCount.Text = "Recipient Count: " + RecipientCount.ToString(); btnRecipientSave.Visible = RecipientCount > 0; upRecipient.Update(); } } } catch (Exception ex) { exception.HandleException("campaigns:", MethodBase.GetCurrentMethod().Name, ex, 0); Response.Redirect("/error", false); } } /// /// Validate Campaign /// /// private bool ValidateCampaign() { bool result = true; try { DateTime dateOnly = DateTime.Now; DateTime timeOnly = new DateTime(); if (txbStartDate.Text != string.Empty) dateOnly = utils.formatStringToDate(txbStartDate.Text); if (txbTime.Text != string.Empty) timeOnly = Convert.ToDateTime(txbTime.Text); DateTime dateToCheck = dateOnly.Date.Add(timeOnly.TimeOfDay); int idToIgnore = 0; if (utils.verifySession("Campaign")) { idToIgnore = ((oCampaign)Session["Campaign"]).recId; } if (idToIgnore > 0 && (ddInterval.SelectedItem != null && ddInterval.SelectedItem.Text != "Once Off") && (handler.ReturnSetup().code != "PROP-1")) { foreach (oCampaign campaign in xData.GetTypedByCriteriaSpecific("recId", typeof(oCampaign), "recId,~DATEONLYnextSend", "~<>" + idToIgnore.ToString() + "," + dateOnly.ToString("MM/dd/yyyy"))) { DateTime existingDateTime = campaign.nextSend; if (existingDateTime.Subtract(dateToCheck).TotalMinutes < 15 && existingDateTime.Subtract(dateToCheck).TotalMinutes > -15) { result = false; pnlResult.Visible = true; lblResult.Text = "Campaign (" + campaign.campaignTitle + " - " + campaign.nextSend.ToString("dd/MM/yyyy hh:mm tt") + ") already exists for that time slot"; } } } } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, Session["campaign"]); Response.Redirect("/error", false); } return result; } /// /// bind surfaces /// private void BindSurfaces() { try { DataTable apps = xData.GetTypedByCriteriaSpecificTable("recId", typeof(oSurface), "isActive", "1", "surface"); if (handler.ReturnSetup().code == "STUD-1") { ArrayList allowedSurfaces = new ArrayList(); allowedSurfaces.Add("Profiles"); //allowedSurfaces.Add("DetailsofPrimaryCaregivers"); DataTable sourceSurface = apps.AsEnumerable() .Where(r => allowedSurfaces.Contains(r.Field("name"))) .CopyToDataTable(); ddRecipientSurface.DataSource = sourceSurface; } else ddRecipientSurface.DataSource = apps; ddRecipientSurface.DataTextField = "surface"; ddRecipientSurface.DataValueField = "recId"; ddRecipientSurface.DataBind(); ddRecipientSurface.Items.Insert(0, new ListItem("select...", "0")); if (utils.verifySession("Campaign")) { oCampaign campaign = (oCampaign)Session["Campaign"]; if (ddRecipientSurface.Items.FindByValue(campaign.contactSourceSurface.ToString()) != null) { ddRecipientSurface.Items.FindByValue(campaign.contactSourceSurface.ToString()).Selected = true; ddRecipientSurface_SelectedIndexChanged(null, null); } } } catch (Exception ex) { exception.HandleException("campaigns:", MethodBase.GetCurrentMethod().Name, ex, 0); Response.Redirect("/error", false); } } #endregion #region events /// /// Page Load Event /// /// /// protected void Page_Load(object sender, EventArgs e) { try { if (!Page.IsPostBack) { BindCampaignData(); BindTemplates(); if (utils.verifySession("campaign")) { oCampaign campaign = (oCampaign)Session["campaign"]; } if (utils.verifySession("eventToCampaigns")) { SetCampaignFromEvent(); } else if (utils.verifySession("campaignParcel")) { SetCampaignFromParcel(); } if (utils.displayDateFormat() == "yyyy/MM/dd") regExportDate.ValidationExpression = "^(((20[0-9][0-9])|(19[0-9][0-9]))\\/((((0[1-9])|(1[0-2]))\\/((0[1-9])|(1\\d)|(2[0-8])))|((((0[13578])|(1[02]))\\/31)|(((0[1,3-9])|(1[0-2]))\\/(29|30)))))|(((19|20)(([02468][048])|([13579][26]))\\/02\\/29))$"; } } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, Session["campaign"]); Response.Redirect("/error", false); } } /// /// set campaign from event /// private void SetCampaignFromEvent() { try { oCalendarEvent evnt = (oCalendarEvent)Session["eventToCampaigns"]; oCampaign campaign = new oCampaign(); campaign.campaignTitle = "Reminder for " + evnt.subject + " (created " + DateTime.Now.ToString("dd/MM/yyyy HH:mm") + ")"; campaign.campaignType = 1; ddCampaignType.Items.Add(new ListItem("Appointment Reminder", "1")); foreach (oCalendarEventModule calmod in xData.GetTypedByCriteriaSpecific("recId", typeof(oCalendarEventModule), "calendarId", evnt.calendarId.ToString())) { foreach (oSurfaceField field in xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceField), "recId", calmod.entityNameField.ToString())) { campaign.contactNameField = field.surfaceFieldName; } foreach (oSurfaceField field in xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceField), "recId", calmod.entityMobileField.ToString())) { campaign.contactNumberField = field.surfaceFieldName; } campaign.contactSourceSurface = calmod.entityId; campaign.filterField = evnt.filterField; campaign.filterValue = evnt.filterValue; } foreach (oTemplate campaignTemplate in xData.GetTypedByCriteriaSpecific("recId", typeof(oTemplate), "templateTypeId,templateName", ((int)pNums.TemplateType.Campaign).ToString() + ",Event Notification")) { campaign.campaignBody = campaignTemplate.templateContent.Replace("{eventName}", evnt.subject).Replace("{eventDate}", evnt.start.ToString("dd/MM/yyyy HH:mm")); } campaign.isDraft = true; campaign.isActive = true; campaign.isRecurring = false; campaign.interval = 1; campaign.messageType = 2; campaign.nextSend = evnt.start.AddDays(-1); campaign.dateSaved = System.DateTime.Now; campaign.createdBy = handler.ReturnUser().recId; campaign.recId = xData.SaveTyped("recId", typeof(oCampaign), campaign); TogglePanels("pnlCampaignPage"); Session["CampaignId"] = campaign.recId; Session["Campaign"] = campaign; IncludeAll = false; PopulatePageFormValues(ref campaign); pnlSMSMessage.Visible = true; //saveDraft(); ArrayList newRecipList = new ArrayList(); foreach (oCalendarEventContact contact in xData.GetTypedByCriteriaSpecific("recId", typeof(oCalendarEventContact), "calendarEventId,isIncluded", evnt.recId.ToString() + ",1")) { oCampaignRecipient newRecip = new oCampaignRecipient(); newRecip.campaignId = Convert.ToInt32(Session["CampaignId"].ToString()); newRecip.surfaceItemId = contact.contactSurfaceItemId; newRecip.recipientName = contact.recipientName; newRecip.recipientNumber = contact.recipientNumber; newRecip.isIncluded = contact.isIncluded; newRecipList.Add(newRecip); } xData.UpdateTypedCollection("recId", typeof(oCampaignRecipient), newRecipList); DataTable dtRecipients = xData.GetTypedByCriteriaSpecificTable("recId", typeof(oCampaignRecipient), "campaignId,isIncluded", campaign.recId.ToString() + ",1", "recipientName"); Session["dtRecipient"] = dtRecipients; lblRecipientCount.Text = "Recipient Count: " + RecipientCount.ToString(); ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "showRecipientModal", "$('#modRecipient').modal('hide');", true); if (ddMessageType.SelectedValue == "2") { //CVH 2018-03-27 Allowing longer sms'es to be sent, check message length in validation //if (RecipientCount > SMSCredit.availableBalance) if (!ValidateSMSCredits()) { btnSave.Enabled = false; lblRecipientCount.ForeColor = System.Drawing.Color.Red; } else { btnSave.Enabled = true; lblRecipientCount.ForeColor = System.Drawing.Color.Empty; } } else { btnSave.Enabled = true; lblRecipientCount.ForeColor = System.Drawing.Color.Empty; } upCampaigns.Update(); utils.disposeSession("eventToCampaigns"); } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, Session["campaign"]); Response.Redirect("/error", false); } } /// /// Set Campaign from parcel /// private void SetCampaignFromParcel() { try { oCampaignParcel parcel = (oCampaignParcel)Session["campaignParcel"]; //set recipient details btnNewCampaign_Click(null, null); if (ddMessageType.Items.FindByValue(parcel.messageType.ToString()) != null) ddMessageType.SelectedValue = parcel.messageType.ToString(); ToggleMessageTypes(); oCampaignRecipient onceOffRecipient = new oCampaignRecipient(); onceOffRecipient.recipientName = parcel.name; if (parcel.messageType == 1) onceOffRecipient.recipientNumber = parcel.email; else if (parcel.messageType == 2) onceOffRecipient.recipientNumber = parcel.mobile; onceOffRecipient.surfaceItemId = parcel.itemId; onceOffRecipient.isIncluded = true; ArrayList recipList = new ArrayList(); recipList.Add(onceOffRecipient); DataTable dtRecipients = utils.ConvertListToDataTable(recipList); Session["dtRecipient"] = dtRecipients; //CVH 2017-10-10 Pro-Pro-113 Show name of recipient lblRecipientCount.Text = "Recipient: " + onceOffRecipient.recipientName; if (ddMessageType.SelectedValue == "2") { //CVH 2018-03-27 Allowing longer sms'es to be sent, check message length in validation //if (RecipientCount > SMSCredit.availableBalance) if (!ValidateSMSCredits()) { btnSave.Enabled = false; lblRecipientCount.ForeColor = System.Drawing.Color.Red; } else { btnSave.Enabled = RecipientCount > 0; lblRecipientCount.ForeColor = System.Drawing.Color.Empty; } } else { btnSave.Enabled = RecipientCount > 0; lblRecipientCount.ForeColor = System.Drawing.Color.Empty; } btnSave.Text = "Send Now"; //CVH 2017-10-10 Pro-Pro-111 Enable changing of message type if (handler.ReturnSetup().code != "PROP-1") { ddMessageType.Enabled = false; } lnkRecipients.Enabled = false; if (ddInterval.Items.FindByValue("1") != null) ddInterval.SelectedValue = "1"; ddInterval.Enabled = false; utils.disposeSession("campaignParcel"); oCampaign camp = new oCampaign(); if (utils.verifySession("campaign")) { camp = (oCampaign)Session["campaign"]; } camp.contactSourceSurface = parcel.contactSourceSurface; camp.contactNameField = parcel.contactNameField; camp.contactNumberField = parcel.contactNumberField; Session["campaign"] = camp; } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, Session["campaign"]); Response.Redirect("/error", false); } } /// /// New Campaign /// /// /// protected void btnNewCampaign_Click(object sender, EventArgs e) { try { //show Content Specific TogglePanels("pnlCampaignPage"); Session["CampaignId"] = 0; utils.disposeSession("Campaign"); oCampaign Campaign = new oCampaign(); Campaign.isActive = true; IncludeAll = false; PopulatePageFormValues(ref Campaign); divEmailTemplate.Visible = false; pnlEmailMessage.Visible = false; pnlSMSMessage.Visible = false; btnSave.Text = "Save"; } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, Session["campaign"]); Response.Redirect("/error", false); } } /// /// Edit the Campaign /// /// /// protected void lnkEdit_Click(object sender, EventArgs e) { oCampaign _Campaign = new oCampaign(); ArrayList catList = new ArrayList(); try { if (sender.GetType() == typeof(LinkButton)) { int recId = int.Parse(((LinkButton)sender).CommandArgument); if (recId > 0) { Session["CampaignId"] = recId; //enumerate list foreach (oCampaign cat in xData.GetTypedByCriteriaSpecific("recId", typeof(oCampaign), "recId", recId.ToString())) { //assign object _Campaign = cat; //populate page form PopulatePageFormValues(ref _Campaign); Session["Campaign"] = _Campaign; break; } //show Campaign Form IncludeAll = false; TogglePanels("pnlCampaignPage"); //if (!IsOnceOffMessage) btnSave.Text = "Save"; //else //{ // btnSave.Text = "Send"; // ddCampaignType.Enabled = false; // ddMessageType.Enabled = false; //} } } } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, Session["campaign"]); Response.Redirect("/error", false); } } /// /// Clone the Campaign /// /// /// protected void lnkClone_Click(object sender, EventArgs e) { oCampaign _Campaign = new oCampaign(); try { if (sender.GetType() == typeof(LinkButton)) { int recId = int.Parse(((LinkButton)sender).CommandArgument); if (recId > 0) { Session["CampaignId"] = 0; foreach (oCampaign campaigntoClone in xData.GetTypedByCriteriaSpecific("recId", typeof(oCampaign), "recId", recId.ToString())) { //assign object _Campaign = campaigntoClone; _Campaign.recId = 0; _Campaign.campaignTitle += " (Cloned)"; //populate page form PopulatePageFormValues(ref _Campaign); Session["Campaign"] = _Campaign; break; } //show Campaign Form IncludeAll = false; TogglePanels("pnlCampaignPage"); btnSave.Text = "Save"; saveDraft(true); int newCampaignId = Convert.ToInt32(Session["CampaignId"].ToString()); List recipList = xData.GetTypedByCriteriaSpecific("recId", typeof(oCampaignRecipient), "campaignId,isIncluded", recId.ToString() + ",1") .Cast() .ToList(); recipList.ForEach(x => x.campaignId = newCampaignId); ArrayList recipients = new ArrayList(recipList); xData.SaveTypedCollection("recId", typeof(oCampaignRecipient), recipients); BindRecipients(newCampaignId); } } } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, Session["campaign"]); Response.Redirect("/error", false); } } /// /// save draft method /// /// private void saveDraft(bool isClone = false) { oCampaign Campaign = new oCampaign(); try { if (utils.verifySession("Campaign") && ((oCampaign)Session["Campaign"]).recId > 0)//update mode { Campaign = (oCampaign)Session["Campaign"]; Campaign.isDraft = true; //save form values SavePageFormValues(ref Campaign); if (xData.UpdateTyped("recId", Campaign.recId.ToString(), typeof(oCampaign), Campaign)) { Session["CampaignId"] = Campaign.recId; Session["Campaign"] = Campaign; BindCampaignData(); pnlResult.Visible = true; lblResult.Text = "your changes were updated successfully."; } } else { if (utils.verifySession("Campaign") && isClone) Campaign = (oCampaign)Session["Campaign"]; //save form values SavePageFormValues(ref Campaign); if (!xData.VerifyExists("recId", typeof(oCampaign), "campaignTitle", Campaign.campaignTitle, "")) { //setup initial values for campaign Campaign.dateSaved = DateTime.Now; Campaign.isDraft = true; oUser usr = handler.ReturnUser(); Campaign.createdBy = usr.recId; Campaign.recId = xData.SaveTyped("recId", typeof(oCampaign), Campaign); if (Campaign.recId > 0) { Session["CampaignId"] = Campaign.recId; Session["Campaign"] = Campaign; BindCampaignData(); PopulatePageFormValues(ref Campaign); pnlResult.Visible = true; lblResult.Text = "the Campaign was created successfully."; } } else { pnlResult.Visible = true; lblResult.Text = "A campaign with this title already exists on the system"; } } } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, Session["campaign"]); Response.Redirect("/error", false); } } /// /// Remove the Campaign /// /// /// protected void lnkRemove_Click(object sender, EventArgs e) { try { if (sender.GetType() == typeof(LinkButton)) { // int recId = int.Parse(((LinkButton)sender).CommandArgument); //Delete cat if (xData.DeleteTyped("recId", recId.ToString(), typeof(oCampaign))) { //rebind pages grid BindCampaignData(); pnlResult.Visible = true; //display successful result lblResult.Text = "the selected Campaign was deleted successfully."; } } } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, Session["campaign"]); Response.Redirect("/error", false); } } /// /// Cancel /// /// /// protected void btnCancel_Click(object sender, EventArgs e) { try { Session["CampaignId"] = 0; utils.disposeSession("Campaign"); //CVH 2017-10-10 Pro-Pro-112 Redirect back to surface instead of campaign grid if came from surface if (utils.verifySession("SurfaceControlParcel")) { //only catering for main surface now, not handling child surface redirect back oSurfaceControlParcel parcel = (oSurfaceControlParcel)Session["SurfaceControlParcel"]; Response.Redirect("/pages/" + parcel.SurfaceApp.name + "?mode=view", false); } else { BindCampaignData(); //show list TogglePanels("pnlCampaignList"); } } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, Session["campaign"]); Response.Redirect("/error", false); } } /// /// Save Click /// /// /// protected void btnSave_Click(object sender, EventArgs e) { oCampaign Campaign = new oCampaign(); try { if (ValidateCampaign()) { //CVH 2018-03-27 Don't send SMS if not enough credits if (ddMessageType.SelectedValue == "2" && !ValidateSMSCredits()) { pnlResult.Visible = true; lblResult.Text = "Not enough credits to send SMS."; } else { if (utils.verifySession("Campaign") && ((oCampaign)Session["Campaign"]).recId > 0)//update mode { Campaign = (oCampaign)Session["Campaign"]; Campaign.isDraft = false; //save form values SavePageFormValues(ref Campaign); if (xData.UpdateTyped("recId", Campaign.recId.ToString(), typeof(oCampaign), Campaign)) { Session["CampaignId"] = Campaign.recId; Session["Campaign"] = Campaign; BindCampaignData(); pnlResult.Visible = true; if (Campaign.interval == 1) //once off lblResult.Text = "your message has been queued"; else lblResult.Text = "your changes were updated successfully."; } } else { if (utils.verifySession("Campaign")) Campaign = (oCampaign)Session["Campaign"]; //save form values SavePageFormValues(ref Campaign); if (!xData.VerifyExists("recId", typeof(oCampaign), "campaignTitle", Campaign.campaignTitle, "") || Campaign.interval == 1) { //setup initial values for campaign Campaign.dateSaved = DateTime.Now; Campaign.isDraft = false; oUser usr = handler.ReturnUser(); Campaign.createdBy = usr.recId; Campaign.recId = xData.SaveTyped("recId", typeof(oCampaign), Campaign); if (Campaign.recId > 0) { Session["CampaignId"] = Campaign.recId; Session["Campaign"] = Campaign; BindCampaignData(); if (Campaign.interval == 1) { if (utils.verifySession("dtRecipient")) { DataTable dtRecipient = (DataTable)Session["dtRecipient"]; foreach (oCampaignRecipient recip in utils.ConvertDataTableToList(dtRecipient, typeof(oCampaignRecipient))) { recip.campaignId = Campaign.recId; if (recip.recId == 0) { recip.recId = xData.SaveTyped("recId", typeof(oCampaignRecipient), recip); } } } lblResult.Text = "your message has been queued"; lnkRecipients.Enabled = true; } else lblResult.Text = "the " + (handler.ReturnSetup().code == "PROP-1" ? "Template" : "Campaign") + " was created successfully."; pnlResult.Visible = true; PopulatePageFormValues(ref Campaign); pnlResult.Visible = true; lblResult.Text = "the Campaign was created successfully."; } } else { pnlResult.Visible = true; lblResult.Text = "A campaign with this title already exists on the system"; } } } } } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, Session["campaign"]); Response.Redirect("/error", false); } } /// /// Send Once off message /// /// private void SendOnceOff(oCampaign campaign) { //change this to allow for recipients to be sent to once off try { //campaign.messageType == if (txbMessageSMS.Value != String.Empty) { foreach (oCampaignRecipient recipient in xData.GetTypedByCriteriaSpecific("recId", typeof(oCampaignRecipient), "campaignId", campaign.recId.ToString())) { if (recipient.recipientNumber != String.Empty) { lblResultSMSTest.Visible = true; if (txtMobileNumbers.Value.Contains(","))//send the sms in a batch { int resultBatch = xSendEasy.SendSMSBatch(handler.ReturnConfigAppSetting("smsU"), handler.ReturnConfigAppSetting("smsP"), txtMobileNumbers.Value.Split(char.Parse(",")), txbMessageSMS.Value); if (resultBatch < 0) { lblResultSMSTest.Text = "SMS Failed: " + xSendEasy.ReturnErrorDetail(resultBatch); } else { lblResultSMSTest.Text = "SMS Test message was sent successfully."; } } else//send individual { long resultSingle = xSendEasy.SendSMS(handler.ReturnConfigAppSetting("smsU"), handler.ReturnConfigAppSetting("smsP"), txtMobileNumbers.Value, txbMessageSMS.Value); if (resultSingle < 0) { lblResultSMSTest.Text = "SMS Failed: " + xSendEasy.ReturnErrorDetail(Convert.ToInt32(resultSingle)); } else { lblResultSMSTest.Text = "SMS Test message was sent successfully."; } } } } } } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, Session["campaign"]); Response.Redirect("/error", false); } } /// /// Save Draft Click /// /// /// protected void btnDraft_Click(object sender, EventArgs e) { saveDraft(); } /// /// Selected Index Changed event /// /// /// protected void ddCampaignType_SelectedIndexChanged(object sender, EventArgs e) { try { if (ddCampaignType.SelectedValue == "1") txbMessageSMS.Value = "Dear {name}, this is just a reminder of your appointment with {customer} tomorrow, {startDate} at {startTime}.See you then."; } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, Session["campaign"]); Response.Redirect("/error", false); } } /// /// Message Type Selection Changed /// /// /// protected void ddMessageType_SelectedIndexChanged(object sender, EventArgs e) { try { ToggleMessageTypes(); } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, Session["campaign"]); Response.Redirect("/error", false); } } /// /// Email Template selected index changed /// /// /// protected void ddEmailTemplate_SelectedIndexChanged(object sender, EventArgs e) { try { if (ddEmailTemplate.SelectedValue != "0") { ArrayList templateList = new ArrayList(); templateList = xData.GetTypedByCriteriaSpecific("recId", typeof(oTemplate), "recId", ddEmailTemplate.SelectedValue); foreach (oTemplate template in templateList) { //apply template to editor edEmailMessage.Content = template.templateContent; } } } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, Session["campaign"]); Response.Redirect("/error", false); } } /// /// Send Test Email /// /// /// protected void lnkSendEmailTest_Click(object sender, EventArgs e) { try { if (edEmailMessage.Content != String.Empty) { if (txtTestEmails.Value != String.Empty) { oEmail testEmail = new oEmail(); testEmail.Subject = txtTitle.Value; testEmail.Body = edEmailMessage.Content; testEmail.Body = testEmail.Body.Replace("src=\"/images", "src=\"" + handler.ReturnConfigAppSetting("WebAddy") + "/images"); testEmail.Body = testEmail.Body.Replace("{WebAddress}", handler.ReturnConfigAppSetting("WebAddy")); testEmail.toAddress = txtTestEmails.Value; testEmail.fromAddress = handler.ReturnConfigAppSetting("from"); bool success = false; success = communication.SendAnEmail(testEmail); lblResultEmailTest.Visible = true; if (success) lblResultEmailTest.Text = "Email Test message was sent successfully."; else lblResultEmailTest.Text = "Email Test message failed to send."; } } } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, Session["campaign"]); Response.Redirect("/error", false); } } /// /// Send a Test SMS /// /// /// protected void lnkSendTextSMS_Click(object sender, EventArgs e) { try { if (txbMessageSMS.Value != String.Empty) { if (txtMobileNumbers.Value != String.Empty) { lblResultSMSTest.Visible = true; if (txtMobileNumbers.Value.Contains(","))//send the sms in a batch { int resultBatch = xSendEasy.SendSMSBatch(handler.ReturnConfigAppSetting("smsU"), handler.ReturnConfigAppSetting("smsP"), txtMobileNumbers.Value.Split(char.Parse(",")), txbMessageSMS.Value); if (resultBatch < 0) { lblResultSMSTest.Text = "SMS Failed: " + xSendEasy.ReturnErrorDetail(resultBatch); } else { lblResultSMSTest.Text = "SMS Test message was sent successfully."; } } else//send individual { long resultSingle = xSendEasy.SendSMS(handler.ReturnConfigAppSetting("smsU"), handler.ReturnConfigAppSetting("smsP"), txtMobileNumbers.Value, txbMessageSMS.Value); if (resultSingle < 0) { lblResultSMSTest.Text = "SMS Failed: " + xSendEasy.ReturnErrorDetail(Convert.ToInt32(resultSingle)); } else { lblResultSMSTest.Text = "SMS Test message was sent successfully."; } } } } } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, Session["campaign"]); Response.Redirect("/error", false); } } /// /// recipients click /// /// /// protected void lnkRecipients_Click(object sender, EventArgs e) { //if (MessageType == "email") //{ // lblRecipientNumber.Text = "Contact Email"; //} //else if (MessageType == "sms") //{ // lblRecipientNumber.Text = "Contact Number"; //} ReadonlyRecipients = false; divRecipientsFilter.Visible = !ReadonlyRecipients; BindSurfaces(); GenerateRecipients(true); upRecipient.Update(); ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "showRecipientModal", "$('#modRecipient').modal('show');", true); } /// /// surface change /// /// /// protected void ddRecipientSurface_SelectedIndexChanged(object sender, EventArgs e) { try { if (ddRecipientSurface.SelectedValue != null) { if ((ddMessageType.SelectedItem != null && ddMessageType.SelectedItem.Value == "2") || (utils.verifySession("Campaign") && ((oCampaign)Session["Campaign"]).messageType == 2)) { DataTable numberFields = xData.GetTypedByCriteriaSpecificTable("recId", typeof(oSurfaceField), "isActive,validationType,surfaceId", "1," + ((int)pNums.ValidationType.ContactNumber).ToString() + "," + ddRecipientSurface.SelectedValue.ToString(), "surfaceFieldName"); foreach (oSurfaceField labelFields in xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceField), "isActive,surfaceFieldTypeId,surfaceId", "1,29," + ddRecipientSurface.SelectedValue.ToString(), "surfaceFieldName")) { foreach (oSurfaceField labelNumberFields in xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceField), "recId,validationType", labelFields.relationalFields + "," + ((int)pNums.ValidationType.ContactNumber).ToString())) { DataTable numberLabelFields = xData.GetTypedByCriteriaSpecificTable("recId", typeof(oSurfaceField), "recId", labelFields.recId.ToString()); numberFields.Merge(numberLabelFields); } } ddRecipientNumber.DataSource = numberFields; ddRecipientNumber.DataTextField = "surfaceFieldDisplay"; ddRecipientNumber.DataValueField = "surfaceFieldName"; ddRecipientNumber.DataBind(); ddRecipientNumber.Items.Insert(0, new ListItem("select...", "0")); } else { DataTable emailFields = xData.GetTypedByCriteriaSpecificTable("recId", typeof(oSurfaceField), "isActive,validationType,surfaceId", "1," + ((int)pNums.ValidationType.Email).ToString() + "," + ddRecipientSurface.SelectedValue.ToString(), "surfaceFieldName"); foreach (oSurfaceField labelFields in xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceField), "isActive,surfaceFieldTypeId,surfaceId", "1,29," + ddRecipientSurface.SelectedValue.ToString(), "surfaceFieldName")) { foreach (oSurfaceField labelEmailFields in xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceField), "recId,validationType", labelFields.relationalFields + "," + ((int)pNums.ValidationType.Email).ToString())) { DataTable emailLabelFields = xData.GetTypedByCriteriaSpecificTable("recId", typeof(oSurfaceField), "recId", labelFields.recId.ToString()); emailFields.Merge(emailLabelFields); } } ddRecipientNumber.DataSource = emailFields; ddRecipientNumber.DataTextField = "surfaceFieldDisplay"; ddRecipientNumber.DataValueField = "surfaceFieldName"; ddRecipientNumber.DataBind(); ddRecipientNumber.Items.Insert(0, new ListItem("select...", "0")); } DataTable nameFields = xData.GetTypedByCriteriaSpecificTable("recId", typeof(oSurfaceField), "isActive,surfaceFieldTypeId,surfaceId,surfaceFieldName", "1,~()3|29," + ddRecipientSurface.SelectedValue.ToString() + ",~%name", "surfaceFieldName"); //CVH 2018-04-09 There are multiple fields with display "First Name", "Surname" etc. Add group to help differentiate if (handler.ReturnSetup().code == "GLOB-1" || handler.ReturnSetup().code == "GLOB-2" || handler.ReturnSetup().code == "MEDI-1") { var groups = xData.GetDynamicByCriteriaSpecific("recId", typeof(oSurfaceField), "isActive,surfaceFieldTypeId,surfaceId", "1,2," + ddRecipientSurface.SelectedValue.ToString()).AsEnumerable(); for (int i=0; i 0) { var groupDisplay = (from groupRow in groups where groupRow.Field("recId").Equals(groupId) select groupRow.Field("surfaceFieldDisplay")).FirstOrDefault(); nameFields.Rows[i]["surfaceFieldDisplay"] = nameFields.Rows[i]["surfaceFieldDisplay"].ToString() + " (" + groupDisplay + ")"; } } } lstRecipientName.DataSource = nameFields; lstRecipientName.DataTextField = "surfaceFieldDisplay"; lstRecipientName.DataValueField = "surfaceFieldName"; lstRecipientName.DataBind(); //ddRecipientName.Items.Insert(0, new ListItem("select...", "0")); if (handler.ReturnSetup().code == "STUD-1")//only show sbf filters { divFilterStandard.Visible = false; divFilterSBF.Visible = true; foreach (oSurface surface in xData.GetTypedByCriteriaSpecific("recId", typeof(oSurface), "name,isActive", "Profiles,1")) { foreach (oSurfaceField field in xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceField), "surfaceId,isActive,surfaceFieldName", surface.recId.ToString() + ",1,ProfileHeader_School")) { DataTable dtSchoolValues = xData.GetSurfaceModulePicklist(Convert.ToInt32(field.relationalFields)); lstRecipientFilterSchool.DataSource = dtSchoolValues; lstRecipientFilterSchool.DataTextField = "DataText"; lstRecipientFilterSchool.DataValueField = "DataText"; lstRecipientFilterSchool.DataBind(); } } lstRecipientFilterIntakeYear.Items.Clear(); for (int i = 2010; i <= DateTime.Now.Year; i++) { string display = i.ToString(); if (i == DateTime.Now.Year - 4) display = i.ToString() + " (Grade 12)"; if (i == DateTime.Now.Year - 3) display = i.ToString() + " (Grade 11)"; if (i == DateTime.Now.Year - 2) display = i.ToString() + " (Grade 10)"; if (i == DateTime.Now.Year - 1) display = i.ToString() + " (Grade 9)"; if (i == DateTime.Now.Year) display = i.ToString() + " (Grade 8)"; lstRecipientFilterIntakeYear.Items.Add(new ListItem(display, i.ToString())); } } else { divFilterStandard.Visible = true; divFilterSBF.Visible = false; DataTable filterFields = xData.GetTypedByCriteriaSpecificTable("recId", typeof(oSurfaceField), "isActive,surfaceFieldTypeId,surfaceId", "1,6," + ddRecipientSurface.SelectedValue.ToString(), "surfaceFieldName"); ddRecipientFilter.DataSource = filterFields; ddRecipientFilter.DataTextField = "surfaceFieldDisplay"; ddRecipientFilter.DataValueField = "surfaceFieldName"; ddRecipientFilter.DataBind(); ddRecipientFilter.Items.Insert(0, new ListItem("select...", "0")); } if (utils.verifySession("Campaign")) { oCampaign campaign = (oCampaign)Session["Campaign"]; if (ddRecipientNumber.Items.FindByValue(campaign.contactNumberField.ToString()) != null) ddRecipientNumber.Items.FindByValue(campaign.contactNumberField.ToString()).Selected = true; foreach (var sel in campaign.contactNameField.Split(',')) { if (lstRecipientName.Items.FindByValue(sel) != null) lstRecipientName.Items.FindByValue(sel).Selected = true; } if (handler.ReturnSetup().code == "STUD-1") { int filterIndex = 0; foreach (string fieldType in campaign.filterValue.Split('|')) { foreach (string fields in fieldType.Split(',')) { switch (filterIndex) { case 0://school if (fields.Length > 0) { if (lstRecipientFilterSchool.Items.FindByValue(fields.Substring(1, fields.Length - 2).Replace("''", "'")) != null) { lstRecipientFilterSchool.Items.FindByValue(fields.Substring(1, fields.Length - 2).Replace("''", "'")).Selected = true; } } break; case 1://intake year if (lstRecipientFilterIntakeYear.Items.FindByValue(fields.Replace("'", "")) != null) { lstRecipientFilterIntakeYear.Items.FindByValue(fields.Replace("'", "")).Selected = true; } break; default: break; } } filterIndex++; } GenerateRecipients(true); } else { if (ddRecipientFilter.Items.FindByValue(campaign.filterField.ToString()) != null) { ddRecipientFilter.Items.FindByValue(campaign.filterField.ToString()).Selected = true; ddRecipientFilter_SelectedIndexChanged(null, null); } } } } } catch (Exception ex) { exception.HandleException("campaigns:", MethodBase.GetCurrentMethod().Name, ex, 0); Response.Redirect("/error", false); } } /// /// recipient filter selected index change /// /// /// protected void ddRecipientFilter_SelectedIndexChanged(object sender, EventArgs e) { try { string fieldId = ddRecipientFilter.SelectedValue; if (fieldId != "0") { oSurfaceField filterField = ((oSurfaceField)xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceField), "surfaceFieldName", fieldId)[0]); if (filterField.isCustomSource) { string fieldSelect = String.Empty; String[] flds = filterField.relationalFields.Split(char.Parse(",")); foreach (string f in flds) { if (fieldSelect == String.Empty) fieldSelect = f; else fieldSelect += " + ' ' + " + f; } string query = "Select " + filterField.relationalValues + ", " + fieldSelect + " AS Display FROM " + filterField.relationalObject + " "; if (filterField.relationalWhere != String.Empty) { query += "WHERE " + filterField.relationalWhere + " "; } if (filterField.relationalOrderBy != String.Empty) { query += "ORDER By " + filterField.relationalOrderBy + " "; } DataTable customDT = xData.GetCustomTypedTable(query); lstRecipientFilterValue.DataSource = customDT; lstRecipientFilterValue.DataTextField = "Display"; lstRecipientFilterValue.DataValueField = filterField.relationalValues; lstRecipientFilterValue.DataBind(); //lstRecipientFilterValue.Items.Insert(0, new ListItem("select", "0")); } else { int lookupCatId = ((oSurfaceField)xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceField), "surfaceFieldName", fieldId)[0]).lookupCategory; DataTable dtFilterValues = xData.GetTypedByCriteriaSpecificTable("recId", typeof(oSurfaceLookup), "categoryId,isActive", lookupCatId.ToString() + ",1", "sequence"); lstRecipientFilterValue.DataSource = dtFilterValues; lstRecipientFilterValue.DataTextField = "display"; lstRecipientFilterValue.DataValueField = "display"; lstRecipientFilterValue.DataBind(); //lstRecipientFilterValue.Items.Insert(0, new ListItem("select...")); } if (utils.verifySession("Campaign")) { oCampaign campaign = (oCampaign)Session["Campaign"]; foreach (string fields in campaign.filterValue.Split(',')) { if (lstRecipientFilterValue.Items.FindByValue(fields.Replace("'", "")) != null) { lstRecipientFilterValue.Items.FindByValue(fields.Replace("'", "")).Selected = true; } } //if (lstRecipientFilterValue.SelectedIndex != -1) // GenerateRecipients(true); } } } catch (Exception ex) { exception.HandleException("campaigns:", MethodBase.GetCurrentMethod().Name, ex, 0); Response.Redirect("/error", false); } } /// /// btn generate click /// /// /// protected void btnGenerate_Click(object sender, EventArgs e) { GenerateRecipients(); } /// /// recipient save /// /// /// protected void btnRecipientSave_Click(object sender, EventArgs e) { try { ArrayList currentList = new ArrayList(); ArrayList newList = new ArrayList(); oCampaign campaign = new oCampaign(); //string contactNumberField = ""; //if (ddMessageType.SelectedItem != null && ddMessageType.SelectedItem.Value == "2") //sms // contactNumberField = "Mobile"; //else // contactNumberField = "Email"; //var contactNameFields = String.Empty; //foreach (var selected in lstRecipientName.GetSelectedIndices()) //{ // if (contactNameFields == String.Empty) // contactNameFields = lstRecipientName.Items[selected].Value; // else // contactNameFields += "," + lstRecipientName.Items[selected].Value; //} if (!utils.verifySession("Campaign")) { //CVH 2017-10-11 If no campaign, need to create it, otherwise recipients saved with campaignId = 0 btnSave_Click(this, new EventArgs()); if (utils.verifySession("Campaign")) campaign = (oCampaign)Session["Campaign"]; } else { campaign = (oCampaign)Session["Campaign"]; } if (campaign.recId <= 0) throw new Exception("Campaign could not be created, unknown reason."); currentList = xData.GetTypedByCriteriaSpecific("recId", typeof(oCampaignRecipient), "campaignId,isIncluded", campaign.recId.ToString() + ",1"); if (currentList.Count > 0) { foreach (oCampaignRecipient item in currentList) { item.isIncluded = false; } xData.UpdateTypedCollection("recId", typeof(oCampaignRecipient), currentList); } DataTable dtRecipients = (DataTable)Session["dtRecipient"]; foreach (DataRow row in dtRecipients.Rows) { if (row["isIncluded"].ToString() == "True") { oCampaignRecipient campaignRecipient = new oCampaignRecipient(); campaignRecipient.campaignId = campaign.recId; campaignRecipient.surfaceItemId = Convert.ToInt32(row["surfaceItemId"].ToString()); campaignRecipient.recipientName = row["recipientName"].ToString(); campaignRecipient.recipientNumber = row["recipientNumber"].ToString(); campaignRecipient.isIncluded = true; newList.Add(campaignRecipient); } } xData.UpdateTypedCollection("recId", typeof(oCampaignRecipient), newList); lblRecipientCount.Text = "Recipient Count: " + RecipientCount.ToString(); ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "showRecipientModal", "$('#modRecipient').modal('hide');", true); if (ddMessageType.SelectedValue == "2") { //CVH 2018-03-27 Allowing longer sms'es to be sent, check message length in validation //if (RecipientCount > SMSCredit.availableBalance) if (!ValidateSMSCredits()) { btnSave.Enabled = false; lblRecipientCount.ForeColor = System.Drawing.Color.Red; } else { btnSave.Enabled = true; lblRecipientCount.ForeColor = System.Drawing.Color.Empty; } } else { btnSave.Enabled = true; lblRecipientCount.ForeColor = System.Drawing.Color.Empty; } upCampaigns.Update(); } catch (Exception ex) { exception.HandleException("campaigns:", MethodBase.GetCurrentMethod().Name, ex, 0); Response.Redirect("/error", false); } } /// /// include all click /// /// /// protected void lnkIncludeAll_Click(object sender, EventArgs e) { try { LinkButton lnkIncludeAll = (LinkButton)sender; DataTable dtRecipients = (DataTable)Session["dtRecipient"]; if (IncludeAll) { IncludeAll = false; foreach (DataRow row in dtRecipients.Rows) { row["isIncluded"] = false; } } else { IncludeAll = true; foreach (DataRow row in dtRecipients.Rows) { row["isIncluded"] = true; } } Session["dtRecipient"] = dtRecipients; grdRecipients.DataSource = dtRecipients; grdRecipients.DataBind(); lnkIncludeAll.Text = IncludeAll ? "exclude all" : "include all"; lblRecipientIncludedCount.Text = "Recipient Count: " + RecipientCount.ToString(); btnRecipientSave.Visible = RecipientCount > 0; upRecipient.Update(); } catch (Exception ex) { exception.HandleException("campaigns:", MethodBase.GetCurrentMethod().Name, ex, 0); Response.Redirect("/error", false); } } /// /// recipient prerender /// /// /// protected void rptRecipient_PreRender(object sender, EventArgs e) { Repeater rptRecipient = (Repeater)sender; LinkButton lnkIncludeAll = (LinkButton)rptRecipient.Controls[0].Controls[0].FindControl("lnkIncludeAll"); lnkIncludeAll.Text = IncludeAll ? "exclude all" : "include all"; } /// /// recipient item created /// /// /// protected void rptRecipient_ItemCreated(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.Header) { LinkButton lnkIncludeAll = (LinkButton)e.Item.FindControl("lnkIncludeAll"); lnkIncludeAll.Text = IncludeAll ? "exclude all" : "include all"; } } /// /// check included /// /// /// protected void chkIncluded_CheckedChanged(object sender, EventArgs e) { int selRowIndex = ((GridViewRow)(((CheckBox)sender).Parent.Parent)).RowIndex; CheckBox cb = (CheckBox)grdRecipients.Rows[selRowIndex].FindControl("chkIncluded"); Label lblId = (Label)grdRecipients.Rows[selRowIndex].FindControl("lblId"); Label lblName = (Label)grdRecipients.Rows[selRowIndex].FindControl("lblName"); Label lblNumber = (Label)grdRecipients.Rows[selRowIndex].FindControl("lblNumber"); DataTable dtRecipients = (DataTable)Session["dtRecipient"]; DataRow[] foundRows = dtRecipients.Select("recId = " + lblId.Text + "AND recipientName = '" + lblName.Text + "' AND recipientNumber = '" + lblNumber.Text + "'"); foundRows[0]["isIncluded"] = cb.Checked; Session["dtRecipient"] = dtRecipients; grdRecipients.DataSource = dtRecipients; //grdRecipients.DataBind(); lblRecipientIncludedCount.Text = "Recipient Count: " + RecipientCount.ToString(); btnRecipientSave.Visible = RecipientCount > 0; upRecipient.Update(); } /// /// recipientlist click /// /// /// protected void lnkRecipientList_Click(object sender, EventArgs e) { oCampaign _Campaign = new oCampaign(); ArrayList catList = new ArrayList(); try { if (sender.GetType() == typeof(LinkButton)) { int recId = int.Parse(((LinkButton)sender).CommandArgument); if (recId > 0) { Session["CampaignId"] = recId; catList = xData.GetTypedByCriteriaSpecific("recId", typeof(oCampaign), "recId", recId.ToString()); //enumerate list foreach (oCampaign cat in catList) { //assign object _Campaign = cat; Session["Campaign"] = _Campaign; break; } ReadonlyRecipients = true; BindSurfaces(); GenerateRecipients(); divRecipientsFilter.Visible = !ReadonlyRecipients; upRecipient.Update(); ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "showRecipientModal", "$('#modRecipient').modal('show');", true); } } } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, Session["campaign"]); Response.Redirect("/error", false); } } /// /// grid recipients prerender /// /// /// protected void grdRecipients_PreRender(object sender, EventArgs e) { if (grdRecipients.Rows.Count > 0) { LinkButton lnkIncludeAll = (LinkButton)grdRecipients.Controls[0].Controls[0].FindControl("lnkIncludeAll"); lnkIncludeAll.Text = IncludeAll ? "exclude all" : "include all"; lnkIncludeAll.Visible = !ReadonlyRecipients; } } /// /// grid recipients rowcreated /// /// /// protected void grdRecipients_RowCreated(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.Header) { e.Row.TableSection = TableRowSection.TableHeader; LinkButton lb = (LinkButton)e.Row.Cells[3].FindControl("lnkIncludeAll"); lb.Visible = !ReadonlyRecipients; } if (e.Row.RowType == DataControlRowType.DataRow) { e.Row.TableSection = TableRowSection.TableBody; CheckBox chkIncluded = (CheckBox)e.Row.FindControl("chkIncluded"); chkIncluded.Enabled = !ReadonlyRecipients; } if (e.Row.RowType == DataControlRowType.Footer) { e.Row.TableSection = TableRowSection.TableFooter; } } /// /// Campaign Log Item Data Bound /// /// /// protected void rptLog_ItemDataBound(object sender, RepeaterItemEventArgs e) { try { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { Label lblRecipientType = (Label)e.Item.FindControl("lblRecipientType"); if (lblRecipientType != null) { string surfaceId = lblRecipientType.Text; if (surfaceId == "" || surfaceId == "0") lblRecipientType.Text = ""; else if (surfaceId == "1") lblRecipientType.Text = "General"; else { lblRecipientType.Text = ""; foreach (oSurface surf in xData.GetTypedByCriteriaSpecific("recId", typeof(oSurface), "recId", surfaceId)) { lblRecipientType.Text = surf.surface; } } } } } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, Session["campaign"]); Response.Redirect("/error", false); } } /// /// Interval selection changed /// /// /// protected void ddInterval_SelectedIndexChanged(object sender, EventArgs e) { try { if (sender is DropDownList) { DropDownList dd = (DropDownList)sender; BindCampaignTypes(); if (dd.SelectedItem != null && dd.SelectedItem.Text == "Once Off") { if (ddCampaignType.Items.FindByText("Ad Hoc") != null) ddCampaignType.SelectedValue = ddCampaignType.Items.FindByText("Ad Hoc").Value; ddCampaignType.Enabled = false; divDateTime.Visible = false; btnSave.Text = "Send Now"; txbStartDate.Text = System.DateTime.Now.ToString("dd/MM/yyyy"); txbTime.Text = System.DateTime.Now.ToString("HH:mm"); } else { if (ddCampaignType.Items.FindByText("Ad Hoc") != null) ddCampaignType.Items.Remove(ddCampaignType.Items.FindByText("Ad Hoc")); ddCampaignType.Enabled = true; divDateTime.Visible = true; btnSave.Text = "Save"; } } } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, Session["campaign"]); Response.Redirect("/error", false); } } /// /// /// /// /// protected void lnkLogTitle_Click(object sender, EventArgs e) { oCampaign _Campaign = new oCampaign(); ArrayList catList = new ArrayList(); try { if (sender.GetType() == typeof(LinkButton)) { int recId = int.Parse(((LinkButton)sender).CommandArgument); foreach (oCampaign campaign in xData.GetTypedByCriteriaSpecific("recId", typeof(oCampaign), "recId", recId.ToString())) { if (campaign.messageType == 1) //email { radMessageSent.Content = campaign.campaignBody; lblMessageSent.Visible = false; radMessageSent.Visible = true; } else { lblMessageSent.Text = campaign.campaignBody; lblMessageSent.Visible = true; radMessageSent.Visible = false; } lblLogTitle.Text = string.Format("{0} message", campaign.campaignTitle); } upLogMessage.Update(); ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "showMessageModal", "$('#modMessage').modal('show');", true); } } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, Session["campaign"]); Response.Redirect("/error", false); } } /// /// Export to Excel /// /// /// protected void btnExport_Click(object sender, EventArgs e) { try { string exportDate = ""; DateTime dtExportDate = new DateTime(); if (txtExportDate.Text != "" && DateTime.TryParse(txtExportDate.Text, out dtExportDate) && dtExportDate > Convert.ToDateTime("2000-01-01")) exportDate = dtExportDate.ToString("yyyy-MM-dd"); //create Excel string fileName = "CommunicationsLog" + exportDate.Replace("-", "") + "_" + DateTime.Now.ToString("yyyy-MM-dd-hh-mm-ss") + ".xlsx"; List list = new List(); oDynamicParam param = new oDynamicParam(); param.paramDisplayName = "exportDate"; param.paramObject = exportDate; list.Add(param); DataTable dt = xData.GetTypedTableByProc("recId", typeof(oCampaignMessage), "sp_CampaignLogExport", list); dt.TableName = "Communications Log"; string excelFile = Server.MapPath("~/upload/documents/" + fileName); utils.ExportDataTabletoExcelFormatted(dt, excelFile, true, false); //CVH 2018-01-12 Response.Transmitfile not working, getting javascript error, doing it this way works. string virtualPath = ConfigurationManager.AppSettings["WebAddy"] + "/upload/documents/" + fileName; ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "downloadFile", "window.open('" + virtualPath + "');", true); } catch (Exception ex) { exception.HandleException("Campaigns:", MethodBase.GetCurrentMethod().Name, ex, Session["campaign"]); Response.Redirect("/error", false); } } #endregion #region Properties /// /// Include All Property /// public bool IncludeAll { get { if (ViewState["includeAll"] == null) return false; else return (bool)ViewState["includeAll"]; } set { ViewState["includeAll"] = value; } } /// /// Calc Recipient Count /// public int RecipientCount { get { int counter = 0; DataTable dtRecipients = (DataTable)Session["dtRecipient"]; foreach (DataRow row in dtRecipients.Rows) { if (row["isIncluded"].ToString() == "True") { counter++; } } return counter; } } public oSMSCredit SMSCredit { get { return (oSMSCredit)(xData.GetTypedByCriteriaSpecific("recId", typeof(oSMSCredit), "customerCode", handler.ReturnSetup().code, "", "pal_", true)[0]); } } //public string MessageType //{ // get // { // string returnVal = ""; // if (ViewState["messageType"] == null) // { // if (utils.verifySession("campaign")) // { // oCampaign campaign = (oCampaign)Session["campaign"]; // switch (campaign.messageType) // { // case 1: // returnVal = "email"; // break; // case 2: // returnVal = "sms"; // break; // default: // break; // } // } // return returnVal; // } // else // return ViewState["messageType"].ToString(); // } // set // { // ViewState["messageType"] = value; // } //} public bool ReadonlyRecipients { get { if (ViewState["readonlyRecipients"] == null) return false; else return (bool)ViewState["readonlyRecipients"]; } set { ViewState["readonlyRecipients"] = value; } } #endregion }