private void GetGroupTypeLabels(GroupTypeCache groupType, List <CheckInLabel> labels, Dictionary <string, object> mergeObjects, List <Guid> labelGuids) { //groupType.LoadAttributes(); foreach (var attribute in groupType.Attributes.OrderBy(a => a.Value.Order)) { if (attribute.Value.FieldType.Guid == Rock.SystemGuid.FieldType.LABEL.AsGuid() && attribute.Value.QualifierValues.ContainsKey("binaryFileType") && attribute.Value.QualifierValues["binaryFileType"].Value.Equals(Rock.SystemGuid.BinaryFiletype.CHECKIN_LABEL, StringComparison.OrdinalIgnoreCase)) { Guid?binaryFileGuid = groupType.GetAttributeValue(attribute.Key).AsGuidOrNull(); if (binaryFileGuid != null) { if (labelGuids.Contains(binaryFileGuid ?? new Guid())) { //don't add an already exisiting label continue; } var labelCache = KioskLabel.Read(binaryFileGuid.Value); if (labelCache != null) { var checkInLabel = new CheckInLabel(labelCache, mergeObjects); checkInLabel.FileGuid = binaryFileGuid.Value; labels.Add(checkInLabel); labelGuids.Add(binaryFileGuid ?? new Guid()); } } } } }
private List <KioskLabel> GetGroupTypeLabels(GroupTypeCache groupType) { var labels = new List <KioskLabel>(); //groupType.LoadAttributes(); foreach (var attribute in groupType.Attributes.OrderBy(a => a.Value.Order)) { if (attribute.Value.FieldType.Guid == Rock.SystemGuid.FieldType.LABEL.AsGuid() && attribute.Value.QualifierValues.ContainsKey("binaryFileType") && attribute.Value.QualifierValues["binaryFileType"].Value.Equals(Rock.SystemGuid.BinaryFiletype.CHECKIN_LABEL, StringComparison.OrdinalIgnoreCase)) { Guid?binaryFileGuid = groupType.GetAttributeValue(attribute.Key).AsGuidOrNull(); if (binaryFileGuid != null) { var labelCache = KioskLabel.Read(binaryFileGuid.Value); labelCache.Order = attribute.Value.Order; if (labelCache != null) { labels.Add(labelCache); } } } } return(labels); }
private void GetGroupTypeLabels(GroupType groupType, List <CheckInLabel> labels, int labelFileTypeId, Dictionary <string, object> mergeObjects) { //groupType.LoadAttributes(); foreach (var attribute in groupType.Attributes) { if (attribute.Value.FieldType.Guid == new Guid(SystemGuid.FieldType.BINARY_FILE) && attribute.Value.QualifierValues.ContainsKey("binaryFileType") && attribute.Value.QualifierValues["binaryFileType"].Value == labelFileTypeId.ToString()) { string attributeValue = groupType.GetAttributeValue(attribute.Key); if (attributeValue != null) { int fileId = int.MinValue; if (int.TryParse(attributeValue, out fileId)) { var labelCache = KioskLabel.Read(fileId); if (labelCache != null) { var checkInLabel = new CheckInLabel(labelCache, mergeObjects); checkInLabel.FileId = fileId; labels.Add(checkInLabel); } } } } } }
/// <summary> /// Gets the labels for an item (person, grouptype, group, location). /// </summary> /// <param name="item">The item.</param> /// <param name="existingLabels">The existing labels.</param> /// <returns></returns> public virtual List <KioskLabel> GetLabels(IHasAttributes item, List <KioskLabel> existingLabels) { var labels = new List <KioskLabel>(existingLabels); if (item.Attributes == null) { item.LoadAttributes(); } foreach (var attribute in item.Attributes.OrderBy(a => a.Value.Order)) { if (attribute.Value.FieldType.Class == typeof(Rock.Field.Types.LabelFieldType).FullName) { Guid?binaryFileGuid = item.GetAttributeValue(attribute.Key).AsGuidOrNull(); if (binaryFileGuid != null) { if (!labels.Any(l => l.Guid == binaryFileGuid.Value)) { var labelCache = KioskLabel.Read(binaryFileGuid.Value); labelCache.Order = attribute.Value.Order; if (labelCache != null && ( labelCache.LabelType == KioskLabelType.Family || labelCache.LabelType == KioskLabelType.Person || labelCache.LabelType == KioskLabelType.Location)) { labels.Add(labelCache); } } } } } return(labels); }
/// <summary> /// Fires the action that prints the labels to networked printers /// </summary> public void PrintNetworkLabels() { var printQueue = new Dictionary <string, StringBuilder>(); // Print server labels if (_labels.Any(l => l.PrintFrom == Rock.Model.PrintFrom.Server)) { string delayCut = @"^XB"; string endingTag = @"^XZ"; var printerIp = string.Empty; var labelContent = new StringBuilder(); // make sure labels have a valid ip var lastLabel = _labels.Last(); foreach (var label in _labels.Where(l => l.PrintFrom == PrintFrom.Server && !string.IsNullOrEmpty(l.PrinterAddress))) { var labelCache = KioskLabel.Read(label.FileGuid); if (labelCache != null) { if (printerIp != label.PrinterAddress) { printQueue.AddOrReplace(label.PrinterAddress, labelContent); printerIp = label.PrinterAddress; labelContent = new StringBuilder(); } var printContent = labelCache.FileContent; foreach (var mergeField in label.MergeFields) { if (!string.IsNullOrWhiteSpace(mergeField.Value)) { printContent = Regex.Replace(printContent, string.Format(@"(?<=\^FD){0}(?=\^FS)", mergeField.Key), ZebraFormatString(mergeField.Value)); } else { printContent = Regex.Replace(printContent, string.Format(@"\^FO.*\^FS\s*(?=\^FT.*\^FD{0}\^FS)", mergeField.Key), string.Empty); printContent = Regex.Replace(printContent, string.Format(@"\^FD{0}\^FS", mergeField.Key), "^FD^FS"); } } // send a Delay Cut command at the end to prevent cutting intermediary labels if (label != lastLabel) { printContent = Regex.Replace(printContent.Trim(), @"\" + endingTag + @"$", delayCut + endingTag); } labelContent.Append(printContent); } } printQueue.AddOrReplace(printerIp, labelContent); } if (printQueue.Any()) { SendNetworkPrintData(printQueue); printQueue.Clear(); } }
private List <KioskLabel> GetGroupTypeLabels(GroupTypeCache groupType) { var labels = new List <KioskLabel>(); //groupType.LoadAttributes(); foreach (var attribute in groupType.Attributes.OrderBy(a => a.Value.Order)) { if (attribute.Value.FieldType.Guid == SystemGuid.FieldType.LABEL.AsGuid()) { Guid?binaryFileGuid = groupType.GetAttributeValue(attribute.Key).AsGuidOrNull(); if (binaryFileGuid != null) { var labelCache = KioskLabel.Read(binaryFileGuid.Value); labelCache.Order = attribute.Value.Order; if (labelCache != null && labelCache.LabelType == KioskLabelType.Checkout) { labels.Add(labelCache); } } } } return(labels); }
/// <summary> /// Raises the <see cref="E:System.Web.UI.Control.Load" /> event. /// </summary> /// <param name="e">The <see cref="T:System.EventArgs" /> object that contains the event data.</param> protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (CurrentWorkflow == null || CurrentCheckInState == null) { NavigateToHomePage(); } else { if (!Page.IsPostBack) { try { var printFromClient = new List <CheckInLabel>(); var printFromServer = new List <CheckInLabel>(); // Print the labels foreach (var family in CurrentCheckInState.CheckIn.Families.Where(f => f.Selected)) { lbAnother.Visible = CurrentCheckInState.CheckInType.TypeOfCheckin == TypeOfCheckin.Individual && family.People.Count > 1; foreach (var person in family.GetPeople(true)) { foreach (var groupType in person.GetGroupTypes(true)) { foreach (var group in groupType.GetGroups(true)) { foreach (var location in group.GetLocations(true)) { foreach (var schedule in location.GetSchedules(true)) { var li = new HtmlGenericControl("li"); li.InnerText = string.Format("{0} was checked into {1} in {2} at {3}", person.ToString(), group.ToString(), location.ToString(), schedule.ToString(), person.SecurityCode); phResults.Controls.Add(li); } } } if (groupType.Labels != null && groupType.Labels.Any()) { printFromClient.AddRange(groupType.Labels.Where(l => l.PrintFrom == Rock.Model.PrintFrom.Client)); printFromServer.AddRange(groupType.Labels.Where(l => l.PrintFrom == Rock.Model.PrintFrom.Server)); } } } } if (printFromClient.Any()) { var urlRoot = string.Format("{0}://{1}", Request.Url.Scheme, Request.Url.Authority); printFromClient.OrderBy(l => l.Order).ToList().ForEach(l => l.LabelFile = urlRoot + l.LabelFile.Replace("GetFile.ashx", "GetCheckinLabel.ashx")); printFromClient.Take(printFromClient.Count() - 1).ToList().ForEach(l => l.LabelFile += "&delaycut=T"); AddLabelScript(printFromClient.ToJson()); } if (printFromServer.Any()) { Socket socket = null; string currentIp = string.Empty; foreach (var label in printFromServer.OrderBy(l => l.Order)) { var labelCache = KioskLabel.Read(label.FileGuid); if (labelCache != null) { if (!string.IsNullOrWhiteSpace(label.PrinterAddress)) { if (label.PrinterAddress != currentIp) { if (socket != null && socket.Connected) { socket.Shutdown(SocketShutdown.Both); socket.Close(); } currentIp = label.PrinterAddress; var printerIp = new IPEndPoint(IPAddress.Parse(currentIp), 9100); socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IAsyncResult result = socket.BeginConnect(printerIp, null, null); bool success = result.AsyncWaitHandle.WaitOne(5000, true); } string printContent = labelCache.FileContent; foreach (var mergeField in label.MergeFields) { if (!string.IsNullOrWhiteSpace(mergeField.Value)) { printContent = Regex.Replace(printContent, string.Format(@"(?<=\^FD){0}(?=\^FS)", mergeField.Key), ZebraFormatString(mergeField.Value)); } else { // Remove the box preceding merge field printContent = Regex.Replace(printContent, string.Format(@"\^FO.*\^FS\s*(?=\^FT.*\^FD{0}\^FS)", mergeField.Key), string.Empty); // Remove the merge field printContent = Regex.Replace(printContent, string.Format(@"\^FD{0}\^FS", mergeField.Key), "^FD^FS"); } } if (label != printFromServer.OrderBy(l => l.Order).LastOrDefault()) { printContent = printContent.Replace("^PQ1,1,1,Y", ""); printContent = printContent.Replace("^XZ", "^XB^XZ"); } if (socket.Connected) { var ns = new NetworkStream(socket); byte[] toSend = System.Text.Encoding.ASCII.GetBytes(printContent); ns.Write(toSend, 0, toSend.Length); } else { phResults.Controls.Add(new LiteralControl("<br/>NOTE: Could not connect to printer!")); } } } } if (socket != null && socket.Connected) { socket.Shutdown(SocketShutdown.Both); socket.Close(); } } } catch (Exception ex) { LogException(ex); } } } }
/// <summary> /// Creates the labels. /// </summary> /// <param name="checkinArray">The checkin array.</param> private void ProcessLabels(DataKeyArray checkinArray) { if (checkinArray.Count == 0) { return; } // All family members need attendance now so they also get the same code if (RunSaveAttendance) { var attendanceErrors = new List <string>(); if (ProcessActivity("Save Attendance", out attendanceErrors)) { SaveState(); } else { string errorMsg = "<ul><li>" + attendanceErrors.AsDelimited("</li><li>") + "</li></ul>"; maAlert.Show(errorMsg, Rock.Web.UI.Controls.ModalAlertType.Warning); return; } RunSaveAttendance = false; } var printQueue = new Dictionary <string, StringBuilder>(); bool printIndividually = GetAttributeValue("PrintIndividualLabels").AsBoolean(); var designatedLabelGuid = GetAttributeValue("DesignatedSingleLabel").AsGuidOrNull(); foreach (var selectedFamily in CurrentCheckInState.CheckIn.Families.Where(f => f.Selected && f.People.Any(p => p.Selected))) { List <CheckInLabel> labels = new List <CheckInLabel>(); List <CheckInPerson> selectedPeople = selectedFamily.People.Where(p => p.Selected).ToList(); List <CheckInGroupType> selectedGroupTypes = selectedPeople.SelectMany(gt => gt.GroupTypes).Where(gt => gt.Selected).ToList(); List <CheckInGroup> availableGroups = null; List <CheckInLocation> availableLocations = null; List <CheckInSchedule> availableSchedules = null; List <CheckInSchedule> possibleSchedules = null; foreach (DataKey dataKey in checkinArray) { var personId = Convert.ToInt32(dataKey["PersonId"]); var groupId = Convert.ToInt32(dataKey["GroupId"]); var locationId = Convert.ToInt32(dataKey["LocationId"]); var scheduleId = Convert.ToInt32(dataKey["ScheduleId"]); var groupTypeId = selectedGroupTypes.Where(gt => gt.Groups.Any(g => g.Group.Id == groupId)) .Select(gt => gt.GroupType.Id).FirstOrDefault(); availableGroups = selectedGroupTypes.SelectMany(gt => gt.Groups).ToList(); availableLocations = availableGroups.SelectMany(l => l.Locations).ToList(); availableSchedules = availableLocations.SelectMany(s => s.Schedules).ToList(); possibleSchedules = selectedPeople.SelectMany(p => p.PossibleSchedules).ToList(); // Only the current item should be selected in the merge object, unselect everything else if (printIndividually || checkinArray.Count == 1) { // Note: This depends on PreSelected being set properly to undo changes later selectedPeople.ForEach(p => p.Selected = (p.Person.Id == personId)); selectedGroupTypes.ForEach(gt => gt.Selected = (gt.GroupType.Id == groupTypeId)); availableGroups.ForEach(g => g.Selected = (g.Group.Id == groupId)); availableLocations.ForEach(l => l.Selected = (l.Location.Id == locationId)); availableSchedules.ForEach(s => s.Selected = (s.Schedule.Id == scheduleId)); // Unselect the SelectedSchedule properties too possibleSchedules.ForEach(s => s.Selected = (s.Schedule.Id == scheduleId)); } // Create labels for however many items are currently selected var labelErrors = new List <string>(); if (ProcessActivity("Create Labels", out labelErrors)) { SaveState(); } // Add valid grouptype labels, excluding the one-time label (if set) if (checkinArray.Count == 1) { var selectedPerson = selectedPeople.FirstOrDefault(p => p.Person.Id == personId); if (selectedPerson != null) { labels.AddRange(selectedPerson.GroupTypes.Where(gt => gt.Labels != null) .SelectMany(gt => gt.Labels) .Where(l => (!RemoveFromQueue || l.FileGuid != designatedLabelGuid)) ); } RemoveFromQueue = RemoveFromQueue || labels.Any(l => l.FileGuid == designatedLabelGuid); } else { labels.AddRange(selectedGroupTypes.Where(gt => gt.Labels != null) .SelectMany(gt => gt.Labels) .Where(l => (!RemoveFromQueue || l.FileGuid != designatedLabelGuid)) ); } if (!printIndividually) { // don't continue processing if printing all info on one label break; } } // Print client labels if (labels.Any(l => l.PrintFrom == PrintFrom.Client)) { var clientLabels = labels.Where(l => l.PrintFrom == PrintFrom.Client).ToList(); var urlRoot = string.Format("{0}://{1}", Request.Url.Scheme, Request.Url.Authority); clientLabels .OrderBy(l => l.PersonId) .ThenBy(l => l.Order) .ToList() .ForEach(l => l.LabelFile = urlRoot + l.LabelFile); if (!GetAttributeValue("ReprintDesignatedLabel").AsBoolean()) { var item = clientLabels.FirstOrDefault(l => l.FileGuid == designatedLabelGuid); if (item != null && hfLabelReprint.Value.AsBoolean()) { clientLabels.Remove(item); } else { hfLabelReprint.Value = true.ToString(); } } AddLabelScript(clientLabels.ToJson()); pnlContent.Update(); } // Print server labels if (labels.Any(l => l.PrintFrom == PrintFrom.Server)) { string delayCut = @"^XB"; string endingTag = @"^XZ"; var printerIp = string.Empty; var labelContent = new StringBuilder(); // make sure labels have a valid ip var lastLabel = labels.Last(l => l.PrintFrom == PrintFrom.Server && !string.IsNullOrEmpty(l.PrinterAddress)); foreach (var label in labels.Where(l => l.PrintFrom == PrintFrom.Server && !string.IsNullOrEmpty(l.PrinterAddress))) { var labelCache = KioskLabel.Read(label.FileGuid); if (labelCache != null) { if (printerIp != label.PrinterAddress) { printQueue.AddOrReplace(label.PrinterAddress, labelContent); printerIp = label.PrinterAddress; labelContent = new StringBuilder(); } var printContent = labelCache.FileContent; foreach (var mergeField in label.MergeFields) { if (!string.IsNullOrWhiteSpace(mergeField.Value)) { printContent = Regex.Replace(printContent, string.Format(@"(?<=\^FD){0}(?=\^FS)", mergeField.Key), ZebraFormatString(mergeField.Value)); } else { printContent = Regex.Replace(printContent, string.Format(@"\^FO.*\^FS\s*(?=\^FT.*\^FD{0}\^FS)", mergeField.Key), string.Empty); printContent = Regex.Replace(printContent, string.Format(@"\^FD{0}\^FS", mergeField.Key), "^FD^FS"); } } // send a Delay Cut command at the end to prevent cutting intermediary labels if (label != lastLabel) { printContent = Regex.Replace(printContent.Trim(), @"\" + endingTag + @"$", delayCut + endingTag); } labelContent.Append(printContent); } } printQueue.AddOrReplace(printerIp, labelContent); if (printQueue.Any()) { PrintLabels(printQueue); printQueue.Clear(); } else { // give the user feedback when no server labels are configured phPrinterStatus.Controls.Add(new LiteralControl("No labels were created. Please verify that the grouptype is configured with labels and cache is reset.")); } } if (printIndividually || checkinArray.Count == 1) { // reset selections to what they were before queue selectedPeople.ForEach(p => p.Selected = p.PreSelected); possibleSchedules.ForEach(s => s.Selected = s.PreSelected); selectedGroupTypes.ForEach(gt => gt.Selected = gt.PreSelected); availableGroups.ForEach(g => g.Selected = g.PreSelected); availableLocations.ForEach(l => l.Selected = l.PreSelected); availableSchedules.ForEach(s => s.Selected = s.PreSelected); } // since Save Attendance already ran, mark everyone as being checked in var selectedSchedules = availableLocations.Where(l => l.Selected) .SelectMany(s => s.Schedules).Where(s => s.Selected).ToList(); foreach (var selectedSchedule in selectedSchedules) { var serviceStart = (DateTime)selectedSchedule.StartTime; selectedSchedule.LastCheckIn = serviceStart.AddMinutes((double)selectedSchedule.Schedule.CheckInEndOffsetMinutes); } } // refresh the currently checked in flag BindGrid(); }
/// <summary> /// Creates the labels. /// </summary> /// <param name="dataKeyArray">The data key array.</param> /// <returns></returns> private void ProcessLabels(DataKeyArray checkinArray) { // Make sure we can save the attendance and get an attendance code if (RunSaveAttendance) { var attendanceErrors = new List <string>(); if (ProcessActivity("Save Attendance", out attendanceErrors)) { SaveState(); } else { string errorMsg = "<ul><li>" + attendanceErrors.AsDelimited("</li><li>") + "</li></ul>"; maAlert.Show(errorMsg, Rock.Web.UI.Controls.ModalAlertType.Warning); return; } RunSaveAttendance = false; } var printQueue = new Dictionary <string, StringBuilder>(); bool printIndividually = GetAttributeValue("PrintIndividualLabels").AsBoolean(); var designatedLabelGuid = GetAttributeValue("DesignatedSingleLabel").AsGuidOrNull(); foreach (var selectedFamily in CurrentCheckInState.CheckIn.Families.Where(p => p.Selected)) { List <CheckInLabel> labels = new List <CheckInLabel>(); List <CheckInPerson> selectedPeople = selectedFamily.People.Where(p => p.Selected).ToList(); List <CheckInGroupType> selectedGroupTypes = selectedPeople.SelectMany(gt => gt.GroupTypes) .Where(gt => gt.Selected).ToList(); List <CheckInGroup> availableGroups = null; List <CheckInLocation> availableLocations = null; List <CheckInSchedule> availableSchedules = null; foreach (DataKey dataKey in checkinArray) { var personId = Convert.ToInt32(dataKey["PersonId"]); var groupId = Convert.ToInt32(dataKey["GroupId"]); var locationId = Convert.ToInt32(dataKey["LocationId"]); var scheduleId = Convert.ToInt32(dataKey["ScheduleId"]); // Make sure only the current item is selected in the merge object if (printIndividually) { int groupTypeId = selectedGroupTypes.Where(gt => gt.Groups.Any(g => g.Group.Id == groupId)) .Select(gt => gt.GroupType.Id).FirstOrDefault(); availableGroups = selectedGroupTypes.SelectMany(gt => gt.Groups).ToList(); availableLocations = availableGroups.SelectMany(l => l.Locations).ToList(); availableSchedules = availableLocations.SelectMany(s => s.Schedules).ToList(); selectedPeople.ForEach(p => p.Selected = (p.Person.Id == personId)); selectedGroupTypes.ForEach(gt => gt.Selected = (gt.GroupType.Id == groupTypeId)); availableGroups.ForEach(g => g.Selected = (g.Group.Id == groupId)); availableLocations.ForEach(l => l.Selected = (l.Location.Id == locationId)); availableSchedules.ForEach(s => s.Selected = (s.Schedule.Id == scheduleId)); } // Create labels for however many items are currently selected // #TODO: Rewrite CreateLabels so it would only resolve a list of ID's var labelErrors = new List <string>(); if (ProcessActivity("Create Labels", out labelErrors)) { SaveState(); } // Add valid grouptype labels, excluding the one-time label (if set) if (printIndividually) { var selectedPerson = selectedPeople.FirstOrDefault(p => p.Person.Id == personId); labels.AddRange(selectedPerson.GroupTypes.Where(gt => gt.Labels != null) .SelectMany(gt => gt.Labels) .Where(l => (!RemoveFromQueue || l.FileGuid != designatedLabelGuid)) ); RemoveFromQueue = RemoveFromQueue || labels.Any(l => l.FileGuid == designatedLabelGuid); } else { labels.AddRange(selectedGroupTypes.Where(gt => gt.Labels != null) .SelectMany(gt => gt.Labels) .Where(l => (!RemoveFromQueue || l.FileGuid != designatedLabelGuid)) ); // don't continue processing if printing all info on one label break; } } // Print client labels if (labels.Any(l => l.PrintFrom == Rock.Model.PrintFrom.Client)) { var clientLabels = labels.Where(l => l.PrintFrom == PrintFrom.Client).ToList(); var urlRoot = string.Format("{0}://{1}", Request.Url.Scheme, Request.Url.Authority); clientLabels.ForEach(l => l.LabelFile = urlRoot + l.LabelFile); AddLabelScript(clientLabels.ToJson()); } // Print server labels if (labels.Any(l => l.PrintFrom == Rock.Model.PrintFrom.Server)) { string delayCut = @"^XB"; string endingTag = @"^XZ"; var printerIp = string.Empty; var labelContent = new StringBuilder(); // make sure labels have a valid ip var lastLabel = labels.Last(); foreach (var label in labels.Where(l => l.PrintFrom == PrintFrom.Server && !string.IsNullOrEmpty(l.PrinterAddress))) { var labelCache = KioskLabel.Read(label.FileGuid); if (labelCache != null) { if (printerIp != label.PrinterAddress) { printQueue.AddOrReplace(label.PrinterAddress, labelContent); printerIp = label.PrinterAddress; labelContent = new StringBuilder(); } var printContent = labelCache.FileContent; foreach (var mergeField in label.MergeFields) { if (!string.IsNullOrWhiteSpace(mergeField.Value)) { printContent = Regex.Replace(printContent, string.Format(@"(?<=\^FD){0}(?=\^FS)", mergeField.Key), ZebraFormatString(mergeField.Value)); } else { printContent = Regex.Replace(printContent, string.Format(@"\^FO.*\^FS\s*(?=\^FT.*\^FD{0}\^FS)", mergeField.Key), string.Empty); printContent = Regex.Replace(printContent, string.Format(@"\^FD{0}\^FS", mergeField.Key), "^FD^FS"); } } // send a Delay Cut command at the end to prevent cutting intermediary labels if (label != lastLabel) { printContent = Regex.Replace(printContent.Trim(), @"\" + endingTag + @"$", delayCut + endingTag); } labelContent.Append(printContent); } } printQueue.AddOrReplace(printerIp, labelContent); } if (printQueue.Any()) { PrintLabels(printQueue); printQueue.Clear(); } if (printIndividually) { // reset selections to what they were before queue selectedPeople.ForEach(p => p.Selected = p.PreSelected); selectedGroupTypes.ForEach(gt => gt.Selected = gt.PreSelected); availableGroups.ForEach(g => g.Selected = g.PreSelected); availableLocations.ForEach(l => l.Selected = l.PreSelected); availableSchedules.ForEach(s => s.Selected = s.PreSelected); } } }
/// <summary> /// Executes the specified workflow. /// </summary> /// <param name="rockContext">The rock context.</param> /// <param name="action">The workflow action.</param> /// <param name="entity">The entity.</param> /// <param name="errorMessages">The error messages.</param> /// <returns></returns> /// <exception cref="System.NotImplementedException"></exception> public override bool Execute(RockContext rockContext, WorkflowAction action, Object entity, out List <string> errorMessages) { var checkInState = GetCheckInState(entity, out errorMessages); CheckInGroupType lastCheckinGroupType = null; List <string> labelCodes = new List <string>(); List <int> childGroupIds; var volAttributeGuid = GetAttributeValue(action, "VolunteerGroupAttribute"); string volAttributeKey = ""; if (!string.IsNullOrWhiteSpace(volAttributeGuid)) { volAttributeKey = AttributeCache.Read(volAttributeGuid.AsGuid()).Key; childGroupIds = checkInState.Kiosk.KioskGroupTypes .SelectMany(g => g.KioskGroups) .Where(g => !g.Group.GetAttributeValue(volAttributeKey).AsBoolean()) .Select(g => g.Group.Id).ToList(); } else { childGroupIds = new List <int>(); } if (checkInState != null) { var attendanceService = new AttendanceService(rockContext); var globalAttributes = Rock.Web.Cache.GlobalAttributesCache.Read(rockContext); var globalMergeValues = Rock.Lava.LavaHelper.GetCommonMergeFields(null); var groupMemberService = new GroupMemberService(rockContext); foreach (var family in checkInState.CheckIn.Families.Where(f => f.Selected)) { foreach (var person in family.People.Where(p => p.Selected)) { if (person.GroupTypes.Where(gt => gt.Selected).SelectMany(gt => gt.Groups).Where(g => g.Selected && childGroupIds.Contains(g.Group.Id)).Any()) { labelCodes.Add((person.SecurityCode) + "-" + LabelAge(person.Person)); } if (string.IsNullOrEmpty(person.SecurityCode)) { var lastAttendance = attendanceService.Queryable() .Where(a => a.PersonAlias.PersonId == person.Person.Id && a.AttendanceCode != null) .OrderByDescending(a => a.StartDateTime) .FirstOrDefault(); if (lastAttendance != null) { person.SecurityCode = lastAttendance.AttendanceCode.Code; } } var firstCheckinGroupType = person.GroupTypes.Where(g => g.Selected).FirstOrDefault(); if (firstCheckinGroupType != null) { List <Guid> labelGuids = new List <Guid>(); var mergeObjects = new Dictionary <string, object>(); foreach (var keyValue in globalMergeValues) { mergeObjects.Add(keyValue.Key, keyValue.Value); } mergeObjects.Add("Person", person); mergeObjects.Add("GroupTypes", person.GroupTypes.Where(g => g.Selected).ToList()); List <Group> mergeGroups = new List <Group>(); List <Location> mergeLocations = new List <Location>(); List <Schedule> mergeSchedules = new List <Schedule>(); var sets = attendanceService .Queryable().AsNoTracking().Where(a => a.PersonAlias.Person.Id == person.Person.Id && a.StartDateTime >= Rock.RockDateTime.Today && a.EndDateTime == null && a.Group != null && a.Schedule != null && a.Location != null ) .Select(a => new { Group = a.Group, Location = a.Location, Schedule = a.Schedule, AttendanceGuid = a.Guid } ) .ToList() .OrderBy(a => a.Schedule.StartTimeOfDay); //Load breakout group var breakoutGroups = GetBreakoutGroups(person.Person, rockContext, action); //Add in an empty object as a placeholder for our breakout group mergeObjects.Add("BreakoutGroup", ""); //Add in GUID for QR code if (sets.Any()) { mergeObjects.Add("AttendanceGuid", sets.FirstOrDefault().AttendanceGuid.ToString()); } foreach (var set in sets) { mergeGroups.Add(set.Group); mergeLocations.Add(set.Location); mergeSchedules.Add(set.Schedule); //Add the breakout group mergefield if (breakoutGroups.Any()) { var breakoutGroup = breakoutGroups.Where(g => g.ScheduleId == set.Schedule.Id).FirstOrDefault(); if (breakoutGroup != null) { var breakoutGroupEntity = new GroupService(rockContext).Get(breakoutGroup.Id); if (breakoutGroupEntity != null) { breakoutGroupEntity.LoadAttributes(); mergeObjects["BreakoutGroup"] = breakoutGroupEntity.GetAttributeValue("Letter"); } } } } mergeObjects.Add("Groups", mergeGroups); mergeObjects.Add("Locations", mergeLocations); mergeObjects.Add("Schedules", mergeSchedules); foreach (var groupType in person.GroupTypes.Where(g => g.Selected)) { lastCheckinGroupType = groupType; groupType.Labels = new List <CheckInLabel>(); GetGroupTypeLabels(groupType.GroupType, firstCheckinGroupType.Labels, mergeObjects, labelGuids); var PrinterIPs = new Dictionary <int, string>(); foreach (var label in groupType.Labels) { label.PrintFrom = checkInState.Kiosk.Device.PrintFrom; label.PrintTo = checkInState.Kiosk.Device.PrintToOverride; if (label.PrintTo == PrintTo.Default) { label.PrintTo = groupType.GroupType.AttendancePrintTo; } if (label.PrintTo == PrintTo.Kiosk) { var device = checkInState.Kiosk.Device; if (device != null) { label.PrinterDeviceId = device.PrinterDeviceId; } } else if (label.PrintTo == PrintTo.Location) { // Should only be one var group = groupType.Groups.Where(g => g.Selected).FirstOrDefault(); if (group != null) { var location = group.Locations.Where(l => l.Selected).FirstOrDefault(); if (location != null) { var device = location.Location.PrinterDevice; if (device != null) { label.PrinterDeviceId = device.PrinterDeviceId; } } } } if (label.PrinterDeviceId.HasValue) { if (PrinterIPs.ContainsKey(label.PrinterDeviceId.Value)) { label.PrinterAddress = PrinterIPs[label.PrinterDeviceId.Value]; } else { var printerDevice = new DeviceService(rockContext).Get(label.PrinterDeviceId.Value); if (printerDevice != null) { PrinterIPs.Add(printerDevice.Id, printerDevice.IPAddress); label.PrinterAddress = printerDevice.IPAddress; } } } } } } } //Add in custom labels for parents //This is the aggregate part List <CheckInLabel> customLabels = new List <CheckInLabel>(); List <string> mergeCodes = (( string )GetAttributeValue(action, "MergeText")).Split(',').ToList(); while (labelCodes.Count > 0) { var mergeDict = new Dictionary <string, string>(); foreach (var mergeCode in mergeCodes) { if (labelCodes.Count > 0) { mergeDict.Add(mergeCode, labelCodes[0]); labelCodes.RemoveAt(0); } else { mergeDict.Add(mergeCode, ""); } } mergeDict.Add("Date", Rock.RockDateTime.Today.DayOfWeek.ToString().Substring(0, 3) + " " + Rock.RockDateTime.Today.ToMonthDayString()); var labelCache = KioskLabel.Read(new Guid(GetAttributeValue(action, "AggregatedLabel"))); if (labelCache != null) { var checkInLabel = new CheckInLabel(labelCache, new Dictionary <string, object>()); checkInLabel.FileGuid = new Guid(GetAttributeValue(action, "AggregatedLabel")); foreach (var keyValue in mergeDict) { if (checkInLabel.MergeFields.ContainsKey(keyValue.Key)) { checkInLabel.MergeFields[keyValue.Key] = keyValue.Value; } else { checkInLabel.MergeFields.Add(keyValue.Key, keyValue.Value); } } checkInLabel.PrintFrom = checkInState.Kiosk.Device.PrintFrom; checkInLabel.PrintTo = checkInState.Kiosk.Device.PrintToOverride; if (checkInLabel.PrintTo == PrintTo.Default) { checkInLabel.PrintTo = lastCheckinGroupType.GroupType.AttendancePrintTo; } if (checkInLabel.PrintTo == PrintTo.Kiosk) { var device = checkInState.Kiosk.Device; if (device != null) { checkInLabel.PrinterDeviceId = device.PrinterDeviceId; } } else if (checkInLabel.PrintTo == PrintTo.Location) { // Should only be one var group = lastCheckinGroupType.Groups.Where(g => g.Selected).FirstOrDefault(); if (group != null) { var location = group.Locations.Where(l => l.Selected).FirstOrDefault(); if (location != null) { var device = location.Location.PrinterDevice; if (device != null) { checkInLabel.PrinterDeviceId = device.PrinterDeviceId; } } } } if (checkInLabel.PrinterDeviceId.HasValue) { var printerDevice = new DeviceService(rockContext).Get(checkInLabel.PrinterDeviceId.Value); checkInLabel.PrinterAddress = printerDevice.IPAddress; } if (lastCheckinGroupType != null) { lastCheckinGroupType.Labels.Add(checkInLabel); } } } } return(true); } return(false); }
/// <summary> /// Prints the label. /// </summary> /// <param name="person">The person.</param> private void PrintLabel(int personId, int locationId, int scheduleId) { CheckInPerson selectedPerson = CurrentCheckInState.CheckIn.Families.Where(f => f.Selected).FirstOrDefault() .People.Where(p => p.Person.Id == personId).FirstOrDefault(); List <CheckInGroupType> selectedGroupTypes = selectedPerson.GroupTypes.Where(gt => gt.Selected && gt.Groups.Any(g => g.Selected && g.Locations.Any(l => l.Location.Id == locationId && l.Schedules.Any(s => s.Schedule.Id == scheduleId)))).ToList(); foreach (var groupType in selectedGroupTypes) { var printFromClient = groupType.Labels.Where(l => l.PrintFrom == Rock.Model.PrintFrom.Client); if (printFromClient.Any()) { AddLabelScript(printFromClient.ToJson()); } var printFromServer = groupType.Labels.Where(l => l.PrintFrom == Rock.Model.PrintFrom.Server); if (printFromServer.Any()) { Socket socket = null; string currentIp = string.Empty; foreach (var label in printFromServer) { var labelCache = KioskLabel.Read(label.FileId); if (labelCache != null) { if (label.PrinterAddress != currentIp) { if (socket != null && socket.Connected) { socket.Shutdown(SocketShutdown.Both); socket.Close(); } currentIp = label.PrinterAddress; var printerIp = new IPEndPoint(IPAddress.Parse(currentIp), 9100); socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IAsyncResult result = socket.BeginConnect(printerIp, null, null); bool success = result.AsyncWaitHandle.WaitOne(5000, true); } string printContent = labelCache.FileContent; foreach (var mergeField in label.MergeFields) { var rgx = new Regex(string.Format(@"(?<=\^FD){0}(?=\^FS)", mergeField.Key)); printContent = rgx.Replace(printContent, mergeField.Value); } if (socket.Connected) { var ns = new NetworkStream(socket); byte[] toSend = System.Text.Encoding.ASCII.GetBytes(printContent); ns.Write(toSend, 0, toSend.Length); } else { maWarning.Show("Could not connect to printer.", ModalAlertType.Warning); } } } if (socket != null && socket.Connected) { socket.Shutdown(SocketShutdown.Both); socket.Close(); } } } }
/// <summary> /// Executes the specified workflow. /// </summary> /// <param name="rockContext">The rock context.</param> /// <param name="action">The workflow action.</param> /// <param name="entity">The entity.</param> /// <param name="errorMessages">The error messages.</param> /// <returns></returns> /// <exception cref="System.NotImplementedException"></exception> public override bool Execute(RockContext rockContext, WorkflowAction action, Object entity, out List <string> errorMessages) { var checkInState = GetCheckInState(entity, out errorMessages); if (checkInState != null) { List <string> labelCodes = new List <string>(); var volAttributeGuid = GetAttributeValue(action, "VolunteerGroupAttribute").AsGuid(); var volAttribute = AttributeCache.Read(volAttributeGuid); List <int> ChildGroupIds; if (volAttribute != null) { AttributeValueService attributeValueService = new AttributeValueService(rockContext); ChildGroupIds = attributeValueService.Queryable().Where(av => av.AttributeId == volAttribute.Id && av.Value == "False").Select(av => av.EntityId.Value).ToList(); } else { ChildGroupIds = new List <int>(); } var globalAttributes = Rock.Web.Cache.GlobalAttributesCache.Read(rockContext); var globalMergeValues = Rock.Lava.LavaHelper.GetCommonMergeFields(null); var groupMemberService = new GroupMemberService(rockContext); AttendanceService attendanceService = new AttendanceService(rockContext); foreach (var family in checkInState.CheckIn.Families.Where(f => f.Selected)) { foreach (var person in family.People) { var attendances = attendanceService.Queryable("AttendanceCode") .Where(a => a.CreatedDateTime >= Rock.RockDateTime.Today && person.Person.Id == a.PersonAlias.PersonId && ChildGroupIds.Contains(a.GroupId ?? 0) && a.AttendanceCode != null) .DistinctBy(a => a.AttendanceCodeId).ToList(); foreach (var attendance in attendances) { if (attendance != null && attendance.AttendanceCode != null) { labelCodes.Add(attendance.AttendanceCode.Code + "-" + LabelAge(person.Person)); } } } //Add in custom labels for parents //This is the aggregate part List <CheckInLabel> customLabels = new List <CheckInLabel>(); List <string> mergeCodes = (( string )GetAttributeValue(action, "MergeText")).Split(',').ToList(); while (labelCodes.Count > 0) { var mergeDict = new Dictionary <string, string>(); foreach (var mergeCode in mergeCodes) { if (labelCodes.Count > 0) { mergeDict.Add(mergeCode, labelCodes[0]); labelCodes.RemoveAt(0); } else { mergeDict.Add(mergeCode, ""); } } var labelCache = KioskLabel.Read(new Guid(GetAttributeValue(action, "AggregatedLabel"))); if (labelCache != null) { var checkInLabel = new CheckInLabel(labelCache, new Dictionary <string, object>()); checkInLabel.FileGuid = new Guid(GetAttributeValue(action, "AggregatedLabel")); foreach (var keyValue in mergeDict) { if (checkInLabel.MergeFields.ContainsKey(keyValue.Key)) { checkInLabel.MergeFields[keyValue.Key] = keyValue.Value; } else { checkInLabel.MergeFields.Add(keyValue.Key, keyValue.Value); } } checkInLabel.MergeFields.Add("Date", Rock.RockDateTime.Today.DayOfWeek.ToString().Substring(0, 3) + " " + Rock.RockDateTime.Today.ToMonthDayString()); checkInLabel.PrintFrom = checkInState.Kiosk.Device.PrintFrom; checkInLabel.PrintTo = checkInState.Kiosk.Device.PrintToOverride; if (checkInLabel.PrintTo == PrintTo.Kiosk) { var device = checkInState.Kiosk.Device; if (device != null) { checkInLabel.PrinterDeviceId = device.PrinterDeviceId; } } if (checkInLabel.PrinterDeviceId.HasValue) { var printerDevice = new DeviceService(rockContext).Get(checkInLabel.PrinterDeviceId.Value); checkInLabel.PrinterAddress = printerDevice.IPAddress; } var firstPerson = family.People.Where(p => p.GroupTypes.Any()).FirstOrDefault(); if (firstPerson != null) { //we have to set as selected or it wil not print firstPerson.Selected = true; var firstGroupType = firstPerson.GroupTypes.FirstOrDefault(); firstGroupType.Selected = true; if (firstGroupType.Labels == null) { firstGroupType.Labels = new List <CheckInLabel>() { checkInLabel }; } else { firstGroupType.Labels.Add(checkInLabel); } } } } } return(true); } return(false); }
/// <summary> /// Raises the <see cref="E:System.Web.UI.Control.Load" /> event. /// </summary> /// <param name="e">The <see cref="T:System.EventArgs" /> object that contains the event data.</param> protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (CurrentWorkflow == null || CurrentCheckInState == null) { NavigateToHomePage(); } else { if (!Page.IsPostBack) { try { lTitle.Text = GetAttributeValue("Title"); var printFromClient = new List <CheckInLabel>(); var printFromServer = new List <CheckInLabel>(); using (var rockContext = new RockContext()) { var attendanceService = new AttendanceService(rockContext); var now = RockDateTime.Now; // Print the labels foreach (var family in CurrentCheckInState.CheckIn.Families.Where(f => f.Selected)) { foreach (var person in family.CheckOutPeople.Where(p => p.Selected)) { foreach (var attendance in attendanceService.Queryable() .Where(a => person.AttendanceIds.Contains(a.Id)) .ToList()) { attendance.EndDateTime = now; if (attendance.Group != null && attendance.Location != null && attendance.Schedule != null) { var li = new HtmlGenericControl("li"); li.InnerText = string.Format(GetAttributeValue("DetailMessage"), person.ToString(), attendance.Group.ToString(), attendance.Location.ToString(), attendance.Schedule.ToString()); phResults.Controls.Add(li); } } if (person.Labels != null && person.Labels.Any()) { printFromClient.AddRange(person.Labels.Where(l => l.PrintFrom == Rock.Model.PrintFrom.Client)); printFromServer.AddRange(person.Labels.Where(l => l.PrintFrom == Rock.Model.PrintFrom.Server)); } } } rockContext.SaveChanges(); } if (printFromClient.Any()) { var urlRoot = string.Format("{0}://{1}", Request.Url.Scheme, Request.Url.Authority); printFromClient .OrderBy(l => l.PersonId) .ThenBy(l => l.Order) .ToList() .ForEach(l => l.LabelFile = urlRoot + l.LabelFile); AddLabelScript(printFromClient.ToJson()); } if (printFromServer.Any()) { Socket socket = null; string currentIp = string.Empty; foreach (var label in printFromServer .OrderBy(l => l.PersonId) .ThenBy(l => l.Order)) { var labelCache = KioskLabel.Read(label.FileGuid); if (labelCache != null) { if (!string.IsNullOrWhiteSpace(label.PrinterAddress)) { if (label.PrinterAddress != currentIp) { if (socket != null && socket.Connected) { socket.Shutdown(SocketShutdown.Both); socket.Close(); } currentIp = label.PrinterAddress; var printerIp = new IPEndPoint(IPAddress.Parse(currentIp), 9100); socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IAsyncResult result = socket.BeginConnect(printerIp, null, null); bool success = result.AsyncWaitHandle.WaitOne(5000, true); } string printContent = labelCache.FileContent; foreach (var mergeField in label.MergeFields) { if (!string.IsNullOrWhiteSpace(mergeField.Value)) { printContent = Regex.Replace(printContent, string.Format(@"(?<=\^FD){0}(?=\^FS)", mergeField.Key), ZebraFormatString(mergeField.Value)); } else { // Remove the box preceding merge field printContent = Regex.Replace(printContent, string.Format(@"\^FO.*\^FS\s*(?=\^FT.*\^FD{0}\^FS)", mergeField.Key), string.Empty); // Remove the merge field printContent = Regex.Replace(printContent, string.Format(@"\^FD{0}\^FS", mergeField.Key), "^FD^FS"); } } if (socket.Connected) { var ns = new NetworkStream(socket); byte[] toSend = System.Text.Encoding.ASCII.GetBytes(printContent); ns.Write(toSend, 0, toSend.Length); } else { phResults.Controls.Add(new LiteralControl("<br/>NOTE: Could not connect to printer!")); } } } } if (socket != null && socket.Connected) { socket.Shutdown(SocketShutdown.Both); socket.Close(); } } } catch (Exception ex) { LogException(ex); } } } }
/// <summary> /// Raises the <see cref="E:System.Web.UI.Control.Load" /> event. /// </summary> /// <param name="e">The <see cref="T:System.EventArgs" /> object that contains the event data.</param> protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (CurrentWorkflow == null || CurrentCheckInState == null) { NavigateToHomePage(); } else { foreach (var family in CurrentCheckInState.CheckIn.Families.Where(f => f.Selected)) { lbAnother.Visible = family.People.Count > 1; foreach (var person in family.People.Where(p => p.Selected)) { foreach (var groupType in person.GroupTypes.Where(g => g.Selected)) { foreach (var group in groupType.Groups.Where(g => g.Selected)) { foreach (var location in group.Locations.Where(l => l.Selected)) { foreach (var schedule in location.Schedules.Where(s => s.Selected)) { var li = new HtmlGenericControl("li"); li.InnerText = string.Format("{0} was checked into {1} for {2} at {3}", person.ToString(), group.ToString(), location.ToString(), schedule.ToString(), person.SecurityCode); phResults.Controls.Add(li); } } } var printFromClient = groupType.Labels.Where(l => l.PrintFrom == Rock.Model.PrintFrom.Client); if (printFromClient.Any()) { AddLabelScript(printFromClient.ToJson()); } var printFromServer = groupType.Labels.Where(l => l.PrintFrom == Rock.Model.PrintFrom.Server); if (printFromServer.Any()) { Socket socket = null; string currentIp = string.Empty; foreach (var label in printFromServer) { var labelCache = KioskLabel.Read(label.FileId); if (labelCache != null) { if (label.PrinterAddress != currentIp) { if (socket != null && socket.Connected) { socket.Shutdown(SocketShutdown.Both); socket.Close(); } currentIp = label.PrinterAddress; var printerIp = new IPEndPoint(IPAddress.Parse(currentIp), 9100); socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IAsyncResult result = socket.BeginConnect(printerIp, null, null); bool success = result.AsyncWaitHandle.WaitOne(5000, true); } string printContent = labelCache.FileContent; foreach (var mergeField in label.MergeFields) { var rgx = new Regex(string.Format(@"(?<=\^FD){0}(?=\^FS)", mergeField.Key)); printContent = rgx.Replace(printContent, mergeField.Value); } if (socket.Connected) { var ns = new NetworkStream(socket); byte[] toSend = System.Text.Encoding.ASCII.GetBytes(printContent); ns.Write(toSend, 0, toSend.Length); } else { phResults.Controls.Add(new LiteralControl("<br/>NOTE: Could not connect to printer!")); } } } if (socket != null && socket.Connected) { socket.Shutdown(SocketShutdown.Both); socket.Close(); } } } } } } }
/// <summary> /// Executes the specified workflow. /// </summary> /// <param name="rockContext">The rock context.</param> /// <param name="action">The workflow action.</param> /// <param name="entity">The entity.</param> /// <param name="errorMessages">The error messages.</param> /// <returns></returns> /// <exception cref="System.NotImplementedException"></exception> public override bool Execute(RockContext rockContext, WorkflowAction action, Object entity, out List <string> errorMessages) { var checkInState = GetCheckInState(entity, out errorMessages); var matrixAttributeMedicationKey = GetAttributeValue(action, "MatrixAttributeMedicationKey"); var matrixAttributeInstructionsKey = GetAttributeValue(action, "MatrixAttributeInstructionsKey"); var matrixAttributeScheduleKey = GetAttributeValue(action, "MatrixAttributeScheduleKey"); AttributeMatrixService attributeMatrixService = new AttributeMatrixService(rockContext); GroupMemberService groupMemberService = new GroupMemberService(rockContext); if (checkInState != null) { var family = checkInState.CheckIn.CurrentFamily; if (family != null) { var commonMergeFields = Rock.Lava.LavaHelper.GetCommonMergeFields(null); var people = family.GetPeople(true); foreach (var person in people.Where(p => p.Selected)) { foreach (var groupType in person.GroupTypes) { groupType.Labels = new List <CheckInLabel>(); foreach (var group in groupType.Groups) { List <string> medicationText = (( string )GetAttributeValue(action, "MedicationText")).Split(',').ToList(); List <string> instructionsText = (( string )GetAttributeValue(action, "InstructionsText")).Split(',').ToList(); List <MedInfo> medInfos = new List <MedInfo>(); if (medicationText.Count == instructionsText.Count) { for (int i = 0; i < medicationText.Count; i++) { medInfos.Add(new MedInfo { Medication = medicationText[i], Instructions = instructionsText[i] }); } } group.Group.LoadAttributes(); var groupGuid = group.Group.GetAttributeValue(GetAttributeValue(action, "GroupAttributeKey")); var registrationGroup = new GroupService(rockContext).Get(groupGuid.AsGuid()); if (registrationGroup == null) { continue; } var groupMember = groupMemberService.GetByGroupIdAndPersonId(registrationGroup.Id, person.Person.Id).FirstOrDefault(); var medicationKey = GetAttributeValue(action, "MatrixAttributeKey"); groupMember.LoadAttributes(); var medicationMatrix = groupMember.GetAttributeValue(medicationKey); var attributeMatrix = attributeMatrixService.Get(medicationMatrix.AsGuid()); var labelCache = KioskLabel.Read(new Guid(GetAttributeValue(action, "MedicationLabel"))); //Set up merge fields so we can use the lava from the merge fields var mergeObjects = new Dictionary <string, object>(); foreach (var keyValue in commonMergeFields) { mergeObjects.Add(keyValue.Key, keyValue.Value); } mergeObjects.Add("RegistrationGroup", registrationGroup); mergeObjects.Add("RegistrationGroupMember", groupMember); mergeObjects.Add("Group", group); mergeObjects.Add("Person", person); mergeObjects.Add("People", people); mergeObjects.Add("GroupType", groupType); if (attributeMatrix == null || attributeMatrix.AttributeMatrixItems.Count == 0) { // Add a No Medication Information label for anyone without data var checkInLabel = new CheckInLabel(labelCache, mergeObjects); var index = 0; foreach (string mergeFieldText in medicationText) { checkInLabel.MergeFields.Add(mergeFieldText, index == 0?"No Medication Information Found":""); checkInLabel.MergeFields.Add(instructionsText[index], ""); index++; } addLabel(checkInLabel, checkInState, groupType, group, rockContext); } else { var items = attributeMatrix.AttributeMatrixItems.ToList(); var index = 0; while (index < items.Count) { var checkInLabel = new CheckInLabel(labelCache, mergeObjects); foreach (var med in medInfos) { if (items.Count > index) { items[index].LoadAttributes(); string scheduleText = ""; string separator = ""; var schedule = items[index].GetAttributeValue(matrixAttributeScheduleKey).SplitDelimitedValues(); foreach (var scheduleGuid in schedule) { scheduleText += separator + DefinedValueCache.Read(scheduleGuid); separator = ", "; } checkInLabel.MergeFields.Add(med.Medication, items[index].GetAttributeValue(matrixAttributeMedicationKey) + " - " + scheduleText ); checkInLabel.MergeFields.Add(med.Instructions, items[index].GetAttributeValue(matrixAttributeInstructionsKey)); } else { checkInLabel.MergeFields.Add(med.Medication, ""); checkInLabel.MergeFields.Add(med.Instructions, ""); } index++; } addLabel(checkInLabel, checkInState, groupType, group, rockContext); } } } } } } return(true); } return(false); }