Question

Photo of Robert Fuller III

0

Check-Out Mechanism

I have been hunting through documentation, and experimenting with the check-in system for a while. I was wondering if anyone knows what the mechanism for checking-out a child is? How are they digitally released from the system, and is there any log of that? What processes do your other churches use to release children?


UPDATE:

This article was exceedingly helpful. http://shouldertheboulder.com/Article?id=557 I made a few custom tweeks to it, but nothing major. This is going to be the foundation for how we can track exactly when a child was checked-out.

  • Photo of Michael Garrison

    0

    Robert, I'm glad the article helped you. I looked into the feature that Jim pointed out, and it appears to be a great solution for what you might think of as an "unattended" check-out solution: it allows you to check an "Allow Checkout" box for a checkin group - if that's checked, parents using your existing kiosks who have someone currently checked in will be prompted for whether they want to check their kids IN or OUT after they put in their phone number and select their family.

    So the article you're looking at is designed from the perspective that your staff needs a list of everyone who's checked in, with the option to check them out. The forthcoming check-out functionality would allow parents to put in their phone number and check out their kids themselves. According to the devs, it also optionally prints a label at checkout, though I haven't found that yet.

    Hope that helps!

    P.S. I'd love to know what all you tweaked from what was in the article- I'd love to provide more options to churches who read that article in the future, if you came up with something useful =)

  • Photo of Robert Fuller III

    0

    This looks great. I think that our safety minded trustee's would not like the checkout to be done by anyone other than a ministry worker who has inspected the childs tag and receipt. They are a little tight that way. However, the functionality might be able to be used by us in another way.

    So far the only two substantive tweaks that i made were 1) getting the code that he provided to properly timestamp the attendance record on checkout. We host externally and because of the timezone difference I had to subtract an hour from the system time stamp that the code uses. 2) I added a simple html block to the checkout page that contains a "refresh" link. I did this because we will have multiple stations checking kids out, and it would be good to have a fresh view reflecting the updates to the system.

    I plan to add to that page as well a quick way to filter the list of children by classroom. As it stands, one has to click the filter button, and type in the room or name etc. Eventually i will read up on how to do that to make it easier for our workers to get the specific information they need.

    Also, I saw in the coming features that barcode support is coming. That would also be great to have the barcode on a receipt, scan it and it brings up a page like the one you shared for the worker to select the kids and check them all out. Again. I would have much studying to do to make that happen since I am not a coder. I am actually a musician, but I am the best we have right now.

    • Michael Garrison

      Filtering may be as easy as adding the location as a CSS Class to each row, and writing a list of valid filters as links which would use jQuery to hide other rows... I'll try to look back at the article tonight and see if I can't work out something for you. (edit: I guess that would require using FormattedOutput instead of the raw DD block output)


      Regarding the barcode checkout, I've toyed with the idea of creating a page (assume it's something like /barcodecheckout/{CheckinId}/{BeginDateTime} so that there are two factors to make tampering harder) which requires a staff login - in theory you can output the URL as a QR code using ZPL on the receipt- your staff worker would then be logged into Rock on their phone and use a QR code reader to scan the receipt - since they're logged in it would take them to the designated page (which they're already logged into) and if both the factors match in the database, would perform the check out. Depending on the app, they'd have to go "back" into the app between each scan, but that seems like a reasonable workflow. I just haven't tried to actually do it.


      I think that a barcode checkout would be harder- it would need software that knew what to do with the number the barcode stored. A QR code has the benefit of being able to store an entire URL, and every QR code reader app I've ever seen knows what to do with a URL naively, so it wouldn't need native or custom support...just an internet connection.


      Sorry for the mental dump, but maybe this helps you find a path? I'll try to ping back in here if I get a manage to publish something on the QR solution

  • Photo of Michael Garrison

    0

    OK, here's a way to add the filters you're looking for. Edit the DD block that gives you the list (not the one that actually does the checking out)

    Add this to the very top of the query:

    SELECT DISTINCT g.[Name] FROM [Group] g RIGHT JOIN [Attendance] a ON a.[GroupId]=g.[Id] WHERE a.[ScheduleId] IS NOT NULL AND a.[StartDateTime] > '{{ "Now" | Date:"yyyy-M-d" }}' AND a.[EndDateTime] IS NULL AND a.[Id] <> @checkout;

    And put this in Formatted Output:

    <b>Filters:</b><br />| <a onClick="$('tr.checkoutRow').show();" href="#!">Show all</a> |
    {% for row in table1.rows %}
        <a onClick="$('tr.checkoutRow').hide();$('tr.{{ row.Name | ToCssClass }}').show();" href="#!">{{ row.Name }}</a> |
    {% endfor %}
    <!-- for demo only- delete this row --><a onClick="$('tr.checkoutRow').hide();$('tr.no-kids').show();" href="#!">No Kids</a> |<!-- for demo only- delete this row -->
    <table style="width:100%;">
    <thead>
    <tr><th></th><th>Name</th><th>Group</th><th>Schedule</th><th>Campus</th><th></th></tr>
    </thead>
    <tbody>
    {% for row in table2.rows %}
        <tr class="checkoutRow {{ row.Group | ToCssClass }}"><td>{{ row.img }}</td><td>{{ row.Name }}</td><td>{{ row.Group }}</td><td>{{ row.Schedule }}</td><td>{{ row.Campus }}</td><td>{{ row.CheckOut }}</td></tr>
    {% endfor %}
    <!-- for demo only- delete this row --><tr class="checkoutRow no-kids"><td><img src="broken" style="border:1px solid black;height:50px;width:50px;" /></td><td>Fake kid for demo</td><td>No Kids</td><td>Test 24x7</td><td>Main Campus</td><td><a class="btn btn-danger btn-sm grid-delete-button"><i class="fa fa-times"></i></a></tr><!-- for demo only- delete this row -->
    </tbody>
    </table>

    This provides a list of links, one for each group that kids are checked into. When the link is clicked, it will filter the list to only the checked in kids in that group.

    I've included a fake kid as well, in case you want to test it and only have one group. When you're satisfied, just delete the two rows in formatted output that indicate they're for demo only, and the "no kids" group link will go away.


  • Photo of Robert Fuller III

    0

    Oh goodness...that works perfectly. That saved me a few hours. Would there be an easy way of getting each entry separated with horizontal lines (like the grid lines)? It might be easier for the worker to know which x is for the name when there are no pictures. I am just so appreciative of your help. This is great!

    • Michael Garrison

      Sure, you can make the table look like a standard Rock grid by changing
      <table style="width:100%;">
      to instead read:
      <table class="grid-table table table-bordered table-striped table-hover">

  • Photo of Robert Fuller III

    0

    Awesome. I will tinker around with that and see what I like. I am learning so much from all this. Our church is just in the beginning of Rock. I got the server set up about 20 days ago, so I still have a lot to learn.

  • Photo of Robert Fuller III

    0

    So, I realized that the filters in the above example do not like handling special characters like & or (. Is there a way that I could have a group named T&T and the filters still work? Right now I have to use "TandT"

  • Photo of Michael Garrison

    0

    I think that if you used

    {{ row.Name | Escape }}

    in the third row of your formatted output, your & characters should get turned into &amp; which should display correctly.

  • Photo of Robert Fuller III

    0

    The name is displayed correctly already. However, when I click on that group name to filter the results, no results are shown. If I change the group name to TandT, it works as expected.
  • Photo of Michael Garrison

    0

    Robert,

    It looks like {{ 'T&T' | ToCssClass }} is outputting t&t, which in my opinion is a bug. That's not typically a valid CSS class. I'm verifying that, and expect to be filing a bug report.

    In the meantime, it looks like replacing both instances of ToCssClass with ToPascal in the Formatted Output may do the trick for you., since {{ 'T&T' | ToPascal }} outputs TT

  • Photo of Michael Garrison

    0

    I should add, since this thread was started, I've actually developed a QR checkout routine like I'd speculated could be done. I used one more datapoint ("factor") than just the two I'd mentioned above, sterilized the input so that parents shouldn't be able to do damage by printing out a label with malicious parameters embedded in the QR code, and added lots of security checks to handle duplicate logins (it prompts for staff to approve the checkout attempt manually) and the like. I also developed a "lost ticket" page that allows staff to handle manual identification verification and check legal notes in the event that a parent comes up without a claim check. I'll be publishing an article on getting that set up to www.shouldertheboulder.com as soon as I can- keep on the lookout!