Spring into Fitness: Koha Community Challenge 2023

Spring into Fitness: Koha Community Challenge

ByWater Solutions has partnered with koha-US for another Community Challenge! This is a great way for the open source community to come together, move, and raise money for a good cause!

Walk, Jog, Run, Swim, Bike, Hike, Yoga, Dance- whatever your activity of choice is-come join us for this community challenge! Be part of the open-source community sharing your daily activities, photos, and words of wisdom!

The challenge will go from May 1 – May 31.

How Do I Join?

  • Sign Up at RunSignup.com
  • Set a fitness goal for yourself- there is no amount too little, or too much!
  • Simply log onto your RunSignup.com profile and click “Submit Virtual Results” to log your activity and miles or minutes. You will be able to view your results and community member results!
  • Share with others in the challenge in our Facebook Group
  • Share on social media with #KohaChallenge23

This event is awesome because age does not matter, pace does not matter; just make sure you get moving and enjoy yourself! All proceeds will be donated to help the Koha Community and koha-us.

Team Up (Or Stay Solo)

A great way to bring your library and co-workers together is by signing up as a team. You can definitely do this solo but this could be a fun way to motivate each other and even challenge another branch in your system to a little friendly competition!

Who Can Join?

Anyone! You don’t have to be a ByWater Solutions partner or a member of koha-US. This is a fun way to connect virtually and come together to celebrate open source and the open source community!


There will be a couple of ways to get involved in this fundraiser!

Koha Enthusiast – $10.00

  • Completion Certificate File
  • Access to Online Fitness Community

Koha Contributor- Don’t want to participate in the challenge but want to make a donation? Find out more at: https://koha-us.org/donate/

  • All the good feelings
  • Giving back to a growing community of open-source libraries

This year you can purchase your own shirt (and style) at koha-US’ Threadless Shop! You can order one here!

ALL Proceeds are going straight to koha-US!

Sign Up Now!

Sign Up Now!

Purchase a Shirt

Purchase a Shirt from threadless

Join the Facebook Group and Cheer Each Other On!

Join the Facebook Group and Cheer Each Other On!


Just Ask!

Email outreach@bywatersolutions.com for any questions or ways to get involved!

Slip Logic

The following is the code used in the Season 1 Episode 3: Slip Logic.

<font face="verdana">
	<div id="LocalHolds">
		<h2 style="margin-top:0px"><div id="Expiration">Expires: </div></h2>
		<div id="RegularHolds">
			<h1><div id="PatronID"></div></h1>
			<div id="CardSegment">Last 2 digits of card: </div>
			<h1 style="margin-top:20px">NOT CHECKED OUT</h1>
			<font size="1">Please check this item out before leaving.</font>
		<div id="HomeBoundHolds">
			Patron: <<borrowers.surname>>, <<borrowers.firstname>><br/>
			Address: <<borrowers.address>><br/>
			City: <<borrowers.city>><br/>
			State: <<borrowers.state>><br/>
			Zip: <<borrowers.zipcode>><br/>
			Phone: <<borrowers.phone>><br/>
			SMS: <<borrowers.smsalertnumber>><br/>
			E-mail: <<borrowers.email>>
		<h3 style="margin-top:400px"><div id="HoldAt">Hold at: <<branches.branchname>></div></h3>

	<div id="TransferredHolds">
		<h3 style="margin-top:20px">Transfer to</h3>
		<div style="margin-top:20px">
			<b>Title: <<biblio.title>><br/>
			Author: <<biblio.author>></b><br/>
			Barcode: <<items.barcode>><br/>
			Call No: <<items.itemcallnumber>><br/>
			Transfer Date: <<today>>
		<h3 style="margin-top:400px"><div id="SentFrom">Sent from: </div></h3>

	<div id="ExpiredHolds">
		<h2 style="margin-top:20px">HOLD EXPIRED</h2>
		<div style="margin-top:20px">
			<b>Title: <<biblio.title>><br/>
			Author: <<biblio.author>></b><br/>
			Barcode: <<items.barcode>><br/>
			Call No: <<items.itemcallnumber>><br/>
			<div id="ExpiredDate">Expired: </div>

	var mask = "*";
	var lastname = "<<borrowers.surname>>"
	var firstname = "<<borrowers.firstname>>";
	var cardnumber = "<<borrowers.cardnumber>>";
	if (cardnumber == '') {
		cardnumber = 'NULL'
	var patroncategory = "<<borrowers.categorycode>>";
	var partialname = lastname;
        if (firstname != '') {
		partialname += ", " + firstname.match(/\b./g).join('');
	var transferto = "<<branches.branchname>>";
	var expiration = '<<reserves.expirationdate>>'.substring(0, 5);
    var expire = "[% hold.expirationdate %]";
    var today = new Date();
    today = new Date(today.getFullYear(), today.getMonth(), today.getDate());
	var currentbranch = "[% USE Branches %] [% Branches.GetName( Branches.GetLoggedInBranchcode ) %]";
	currentbranch = currentbranch.trim();

	if (!(transferto == currentbranch)) {
		document.getElementById("SentFrom").innerHTML += currentbranch;
	} else {
		if (cardnumber == 'NULL') {
			document.getElementById("CardSegment").innerHTML = 'SELF REGISTERED - See Front Desk';
		} else {
			document.getElementById("CardSegment").innerHTML += mask.repeat(cardnumber.length-2) + cardnumber.slice(-2);
		document.getElementById("Expiration").innerHTML += expiration;
		if (patroncategory == "NOTHOME") {
		} else {
		if (Date.parse(expire) < Date.parse(today)) {
			var expiredisplay = expire.split('-');
			expiredisplay = expiredisplay[1] + '/' + expiredisplay[2] + '/' + expiredisplay[0];
            document.getElementById("ExpiredDate").innerHTML += expiredisplay;

The modification that was shown to alter the way the patron name was displayed was done by altering the parialname variable in the logic:

var partialname = lastname.substring(0,3) + mask.repeat(lastname.length-3);
        if (firstname != '') {
		partialname += ", " + firstname.substring(0,3) + mask.repeat(firstname.length-3);