Beispiel #1
0
 private static void GetGroupTypeLabels(GroupTypeCache groupType, List <CheckInLabel> labels, Dictionary <string, object> mergeObjects, List <Guid> labelGuids)
 {
     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.Get(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);
        }
Beispiel #3
0
        /// <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(Attribute.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.Get(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);
        }
Beispiel #4
0
 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>
        /// 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.Get(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();
            }
        }
Beispiel #6
0
        /// <summary>
        /// Prints the labels.
        /// </summary>
        /// <param name="labels">The labels.</param>
        /// <returns></returns>
        public static List <string> PrintLabels(List <CheckInLabel> labels)
        {
            var messages = new List <string>();

            Socket socket    = null;
            string currentIp = string.Empty;

            foreach (var label in labels
                     .OrderBy(l => l.PersonId)
                     .ThenBy(l => l.Order))
            {
                var labelCache = KioskLabel.Get(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();
                            }

                            socket = ZebraPrint.OpenSocket(label.PrinterAddress);
                        }

                        string printContent = ZebraPrint.MergeLabelFields(labelCache.FileContent, label.MergeFields);

                        if (socket.Connected)
                        {
                            ZebraPrint.Print(printContent, socket);
                        }
                        else
                        {
                            messages.Add("NOTE: Could not connect to printer!");
                        }
                    }
                }
            }

            // Close the socket
            if (socket != null && socket.Connected)
            {
                socket.Shutdown(SocketShutdown.Both);
                socket.Close();
            }

            return(messages);
        }
Beispiel #7
0
 private void GetGroupTypeLabels(GroupType groupType, List <CheckInLabel> labels, Dictionary <string, object> mergeObjects)
 {
     //groupType.LoadAttributes();
     foreach (var attribute in groupType.Attributes.OrderBy(a => a.Value.Order))
     {
         if (attribute.Value.FieldType.Guid == SystemGuid.FieldType.BINARY_FILE.AsGuid() &&
             attribute.Value.QualifierValues.ContainsKey("binaryFileType") &&
             attribute.Value.QualifierValues["binaryFileType"].Value.Equals(SystemGuid.BinaryFiletype.CHECKIN_LABEL, StringComparison.OrdinalIgnoreCase))
         {
             Guid?binaryFileGuid = groupType.GetAttributeValue(attribute.Key).AsGuidOrNull();
             if (binaryFileGuid != null)
             {
                 var labelCache = KioskLabel.Read(binaryFileGuid.Value);
                 if (labelCache != null)
                 {
                     var checkInLabel = new CheckInLabel(labelCache, mergeObjects);
                     checkInLabel.FileGuid = binaryFileGuid.Value;
                     labels.Add(checkInLabel);
                 }
             }
         }
     }
 }
Beispiel #8
0
        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);
        }
Beispiel #9
0
        /// <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);
        }
Beispiel #10
0
        /// <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);
                    }
                }
            }
        }
Beispiel #11
0
        /// <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>
        /// 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();
        }
Beispiel #13
0
        /// <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);
                }
            }
        }
Beispiel #14
0
        private static List <CheckInLabel> GenerateAggregateLabel(Guid aggregateLabelGuid, Device kioskDevice, List <Person> people)
        {
            List <CheckInLabel> labels     = new List <CheckInLabel>();
            List <string>       labelCodes = new List <string>();

            foreach (var person in people)
            {
                var applicableAttendances = AttendanceCache.All().Where(p => p.PersonId == person.Id);
                //only if they are checked in to somewhere that is not a volunteer
                if (applicableAttendances.Any(a => !a.IsVolunteer))
                {
                    var newestAttendance = applicableAttendances.OrderByDescending(a => a.CreatedDateTime).FirstOrDefault();
                    labelCodes.Add($"{newestAttendance.Code}-{person.FormatAge()}");
                }
            }
            var labelCache = KioskLabel.Get(aggregateLabelGuid);

            List <string> mergeCodes = labelCache.MergeFields.Keys.ToList().Where(s => Regex.IsMatch(s, "\\b[A-Z]{3}\\b")).ToList();

            while (labelCodes.Count > 0 && mergeCodes.Any())
            {
                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());

                if (labelCache != null)
                {
                    var checkInLabel = new CheckInLabel(labelCache, new Dictionary <string, object>());
                    checkInLabel.FileGuid = aggregateLabelGuid;

                    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 = kioskDevice.PrintFrom;
                    checkInLabel.PrintTo   = kioskDevice.PrintToOverride;

                    if (checkInLabel.PrintTo == PrintTo.Kiosk)
                    {
                        var device = kioskDevice;
                        if (device != null)
                        {
                            checkInLabel.PrinterDeviceId = device.PrinterDeviceId;
                        }
                    }

                    if (checkInLabel.PrinterDeviceId.HasValue)
                    {
                        var printerDevice = new DeviceService(new RockContext()).Get(checkInLabel.PrinterDeviceId.Value);
                        checkInLabel.PrinterAddress = printerDevice.IPAddress;
                    }

                    labels.Add(checkInLabel);
                }
            }
            return(labels);
        }
Beispiel #15
0
        /// <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);
        }
Beispiel #16
0
        /// <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");
                                var medicationMatrix = person.Person.GetAttributeValue(medicationKey);


                                var attributeMatrix = attributeMatrixService.Get(medicationMatrix.AsGuid());

                                var labelCache = KioskLabel.Get(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.Get(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);
            }

            errorMessages.Add($"Attempted to run {this.GetType().GetFriendlyTypeName()} in check-in, but the check-in state was null.");
            return(false);
        }
Beispiel #18
0
        /// <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");
                        string detailMsg = GetAttributeValue("DetailMessage");

                        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(detailMsg, person.ToString(), group.ToString(), location.Location.Name, 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.PersonId)
                            .ThenBy(l => l.Order)
                            .ToList().ForEach(l => l.LabelFile = urlRoot + l.LabelFile.Replace("GetFile.ashx", "NP_GetCheckinLabel.ashx"));
                            printFromClient.Take(printFromClient.Count() - 1).ToList().ForEach(l => {
                                l.LabelFile += "&delaycut=T";
                                l.LabelKey  += "-nocut";
                            });
                            AddLabelScript(printFromClient.ToJson());
                        }

                        if (printFromServer.Any())
                        {
                            var messages = new List <string>();

                            Socket socket    = null;
                            string currentIp = string.Empty;

                            foreach (var label in printFromServer
                                     .OrderBy(l => l.PersonId)
                                     .ThenBy(l => l.Order))
                            {
                                var labelCache = KioskLabel.Get(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();
                                            }

                                            int printerPort      = 9100;
                                            var printerIpAddress = label.PrinterAddress;

                                            // If the user specified in 0.0.0.0:1234 syntax then pull our the IP and port numbers.
                                            if (printerIpAddress.Contains(":"))
                                            {
                                                var segments = printerIpAddress.Split(':');

                                                printerIpAddress = segments[0];
                                                printerPort      = segments[1].AsInteger();
                                            }

                                            var printerEndpoint = new IPEndPoint(IPAddress.Parse(printerIpAddress), printerPort);

                                            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                                            IAsyncResult result  = socket.BeginConnect(printerEndpoint, 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), 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)
                                        {
                                            if (socket.Connected)
                                            {
                                                var ns = new NetworkStream(socket);
                                                //var encoder = System.Text.Encoding.GetEncoding( "ISO-8859-1" );
                                                var    encoder = System.Text.Encoding.UTF8;
                                                byte[] toSend  = encoder.GetBytes(printContent);
                                                ns.Write(toSend, 0, toSend.Length);
                                            }
                                        }
                                        else
                                        {
                                            messages.Add("NOTE: Could not connect to printer!");
                                        }
                                    }
                                }
                            }

                            // Close the socket
                            if (socket != null && socket.Connected)
                            {
                                socket.Shutdown(SocketShutdown.Both);
                                socket.Close();
                            }

                            foreach (var message in messages)
                            {
                                phResults.Controls.Add(new LiteralControl(string.Format("<br/>{0}", message)));
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        LogException(ex);
                    }
                }
            }
        }
Beispiel #19
0
        /// <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();
                    }
                }
            }
        }
Beispiel #20
0
        /// <summary>
        /// Prints the labels.
        /// </summary>
        /// <param name="labels">The labels.</param>
        /// <returns></returns>
        public static List <string> PrintLabels(List <CheckInLabel> labels)
        {
            var messages = new List <string>();

            Socket socket           = null;
            string currentIp        = string.Empty;
            bool   hasPrinterCutter = PrinterHasCutter(labels);
            int    labelCount       = 0;

            foreach (var label in labels.OrderBy(l => l.PersonId).ThenBy(l => l.Order))
            {
                labelCount++;

                var labelCache = KioskLabel.Get(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();
                            }

                            socket = ZebraPrint.OpenSocket(label.PrinterAddress);
                        }

                        string printContent = ZebraPrint.MergeLabelFields(labelCache.FileContent, label.MergeFields).TrimEnd();

                        // If the "enable label cutting" feature is enabled, then we are going to
                        // control which mode the printer is in. In this case, we will remove any
                        // tear-mode (^MMT) commands from the content and add the cut-mode (^MMC).
                        if (hasPrinterCutter)
                        {
                            printContent = printContent.Replace("^MMT", string.Empty);

                            // Here we are forcing the printer into cut mode (because
                            // we don't know if it has been put into cut-mode already) even
                            // though we might be suppressing the cut below. This is correct.
                            printContent = printContent.ReplaceIfEndsWith("^XZ", "^MMC^XZ");

                            // If it's not the last label or a "ROCK_CUT" label, then inject
                            // a suppress back-feed (^XB) command which will also suppress the cut.
                            if (!(labelCount == labels.Count() || printContent.Contains("ROCK_CUT")))
                            {
                                printContent = printContent.ReplaceIfEndsWith("^XZ", "^XB^XZ");
                            }
                        }

                        if (socket.Connected)
                        {
                            ZebraPrint.Print(printContent, socket);
                        }
                        else
                        {
                            messages.Add("NOTE: Could not connect to printer!");
                        }
                    }
                }
            }

            // Close the socket
            if (socket != null && socket.Connected)
            {
                socket.Shutdown(SocketShutdown.Both);
                socket.Close();
            }

            return(messages);
        }