Evergreen Documentation

Documentation Interest Group

Part I. Introduction

Chapter 1. About This Documentation

This guide was produced by the Evergreen Documentation Interest Group (DIG), consisting of numerous volunteers from many different organizations. The DIG has drawn together, edited, and supplemented pre-existing documentation contributed by libraries and consortia running Evergreen that were kind enough to release their documentation into the creative commons. Please see the Attributions section for a full list of authors and contributing organizations. Just like the software it describes, this guide is a work in progress, continually revised to meet the needs of its users, so if you find errors or omissions, please let us know, by contacting the DIG facilitators at docs@evergreen-ils.org.

This guide to Evergreen is intended to meet the needs of front-line library staff, catalogers, library administrators, system administrators, and software developers. It is organized into Parts, Chapters, and Sections addressing key aspects of the software, beginning with the topics of broadest interest to the largest groups of users and progressing to some of the more specialized and technical topics of interest to smaller numbers of users.

Copies of this guide can be accessed in PDF and HTML formats from http://docs.evergreen-ils.org/.

Chapter 2. About Evergreen

Evergreen is an open source library automation software designed to meet the needs of the very smallest to the very largest libraries and consortia. Through its staff interface, it facilitates the management, cataloging, and circulation of library materials, and through its online public access interface it helps patrons find those materials.

The Evergreen software is freely licensed under the GNU General Public License, meaning that it is free to download, use, view, modify, and share. It has an active development and user community, as well as several companies offering migration, support, hosting, and development services.

The community’s development requirements state that Evergreen must be:

Stable, even under extreme load.

Robust, and capable of handling a high volume of transactions and simultaneous users.

Flexible, to accommodate the varied needs of libraries.

Secure, to protect our patrons’ privacy and data.

User-friendly, to facilitate patron and staff use of the system.

Evergreen, which first launched in 2006 now powers over 544 libraries of every type – public, academic, special, school, and even tribal and home libraries – in over a dozen countries worldwide.

Chapter 3. Release notes

3.1. Upgrade notes

3.1.1. Log Protect (redaction)

To prevent sensitive information such as passwords from being logged in general activity logs, add the following XML chunk to the bottom of opensrf_core.xml, just inside the <config> section:

  ...
  </routers>
  <shared> <!-- new block starts here -->
    <log_protect>
      <match_string>open-ils.auth.authenticate.verify</match_string>
      <match_string>open-ils.auth.authenticate.complete</match_string>
      <match_string>open-ils.auth_proxy.login</match_string>
      <match_string>open-ils.actor.patron.password_reset.commit</match_string>
      <match_string>open-ils.actor.user.password</match_string>
      <match_string>open-ils.actor.user.username</match_string>
      <match_string>open-ils.actor.user.email</match_string>
      <match_string>open-ils.actor.patron.update</match_string>
      <match_string>open-ils.cstore.direct.actor.user.create</match_string>
      <match_string>open-ils.cstore.direct.actor.user.update</match_string>
      <match_string>open-ils.cstore.direct.actor.user.delete</match_string>
    </log_protect>
  </shared> <!-- new block ends here -->
</config>

3.1.2. EDI Order Template Updates

An updated EDI order template is now part of the stock data. To avoid clobbering potentially functional EDI templates, no upgrade script was included to automatically upgrade existing templates. To upgrade to the newest template:

UPDATE action_trigger.event_definition SET template =
$$
...
$$ WHERE id = 23;

/*
Use the template value for event definition 23 (line 7995) in
950.data.seed-values.sql as the contents (...) of the above command.
*/

3.2. New features

3.2.1. Acquisitions

3.2.1.1. ACQ Invoice Inline Lineitem Search and Add

The Invoice UI is now composed of two tabs, the main invoice tab and a new Search tab. The search tab consists of a subset of the Acquisitions unified search interface. The goal is to allow users to search for lineitems to invoice. Search results may be added directly to the growing invoice. A number of small usability features are included.

Option (default) to limit searches to invoiceable items.

These are lineitems that are not cancelled, have at least one invoiceable copy, linked to a PO whose provider matches that of the current invoice, and are not already linked to the current invoice.

Search defaults to last-run search (on workstation).

New Lineitem Detail filter options

Sort searches by lineitem number (default) and title.

There is a new Expected Cost field which includes both the total invoiced cost plus the anticipated cost of lineitems as they are added.

New Price per Copy field

Lineitem count field

Show / Hide Invoice details button. Details are displayed by default, but hidden when the user enters the search tab. From there it remains hidden until manually shown (or a new invoice is opened).

A new "Save & Clear" button which saves the current invoice then clears the invoice display to create a new invoice.

Provider, shipper, and receiver fields are auto-populated from the first-added invoice data (when not already set).

Totals are now read-only, since they are derived from existing data (and are informational only).

3.2.1.2. EDI Invoices

The same setup that is required today for retrieving and reacting to EDI Order Response messages (ORDRSP) will also react to Invoices (INVOIC).

This essentially means you must have a Provider (acq.provider) configured with an EDI Account (acq.edi_account) containing login credentials for a vendor, you must have the edi_webrick service running (EDI translator), and you must have the edi_pusher script run periodically by cron.

An open Evergreen invoice will be created for a each EDI Invoice message. Evergreen invoice entries will be created for each lineitem detected in the EDI message if that lineitem can be linked to a known Evergreen lineitem in your system. An Evergreen invoice item will be created for a whole-invoice tax.

3.2.1.3. Enriched EDI

Support for Enriched EDI with copy-level data via EDI in ORDER messages.

3.2.1.4. Encumbrance-only Rollover

A new Library Setting allows the year-end close-out operation to roll over encumbrances while dumping any unspent money.

3.2.1.5. Fund Report

A new IDL reporter view that provides summary information for funds for reporting. The resulting table looks like a fund with four additional fields: allocated_total, spent_total, encumbrance_total, and combined_balance.

3.2.1.6. EDI Fetching and Parsing Enhancements / Repairs

This release includes various improvements to how Evergreen processes vendor EDI responses, including order responses and invoices. Changes include architectural improvements as well as new features.

Improved order response handling for cancelled items.

Deleting fund debits (encumbrances) for cancelled items.

Extracting invoice date

Invoices include quantity and amount paid (in addition to billed) to reduce manual staff data entry

Proper handling of previously-cancelled (e.g. back-ordered) invoiced items.

For EDI parsing, the Ruby libraries, Ruby HTTP gateway, and Business::EDI Perl modules are no longer needed. They have been replaced with a single Perl module which handles EDI parsing.

This reduces the complexity of the fetching and parsing layer. Though the Ruby libraries and Ruby HTTP gateway are still needed for outbound EDI (for now), the Perl Business::EDI modules are no longer needed at all, so they are no longer installed.

3.2.1.7. EDI order template improvements (no SQL upgrade script!)

Improved template for EDI purchase orders. This theoretically just works better where the old template worked. Corrections made for interactions with ULS, Midwest Tape, Baker & Taylor, and Recorded Books especially. GIR segments in the right place.

And also the template is just more maintainable now.

THERE IS NO UPGRADE SCRIPT INCLUDED. Sites using EDI may not necessarily want to mess with what they already have working.

If you want the changes, and maybe you do, especially if you’re doing enriched ordering and/or ordering from the vendors listed above, you can extract the template changes easily enough yourself from the 950.data.seed-values.sql file. See Upgrade Notes above.

3.2.2. OPAC

3.2.2.1. TPAC: Simplified CSS Color Customization

CSS colors are now defined as a pair of Template::Toolkit files, Open-ILS/src/templates/opac/css/styles.css.tt2 and Open-ILS/src/templates/opac/parts/css/colors.tt2. Evergreen administrators can customize the color scheme for a given skin by copying colors.tt2 into a template override directory and adjusting the colors as desired.

To enable Apache to pass the CSS file to the Template::Toolkit handler, you must remove .css from the list of file extensions that should not be passed to a handler in eg_vhost.conf as follows:

From. 

<LocationMatch ^/eg/.*(\.js|\.css|\.html|\.xhtml|\.xml|\.jpg|\.png|\.gif)$>
    SetHandler None
</LocationMatch>

To. 

<LocationMatch ^/eg/.*(\.js|\.html|\.xhtml|\.xml|\.jpg|\.png|\.gif)$>
    SetHandler None
</LocationMatch>

After making this change, restart Apache to make the change take effect.

3.2.2.2. Add to Permanent Bookbag

TPAC was modified to allow a logged-in user to add records from search results and record summary screens to their permanent bookbags rather than to a temporary bookbag that goes away when logged out.

The search results and record summary screens were modified so that the "Add to my list" will show a menu when moused over by a logged-in user. This menu will display the option to add to a temporary bookbag, the user’s default list (if any), up to ten of the user’s other bookbags, a "See all" option to allow the user to choose one of the bags not on the menu, and to create a new list and add the record to it.

Choosing the temporary list from the menu will add the record to the temporary my list as TPAC does before the addition of this feature.

Choosing a named list will add the record to the chosen list.

Choosing "See all" or "Add to new list" will take the user to their My Lists page. (The only difference being that "See all" will actually list all of the user’s bookbags if they have more than the current limit.) The My Lists page will have a new button "Add to this list" next to each of their existing lists. In addition, if the user creates a new list on this screen, the selected record will automatically be added to this new list.

You can tell all of the above is working if you are redirected to your search results or record summary after adding to a list. If there was a problem, you will get either an error page or will see your My Lists page.

The user’s My List screen has had a Make Default List button added for each list. Clicking the button will cause that list to be registered as the user’s default list. This is the list that will be added to when a user chooses the Default List option on the Add to my list menu in search or record summary.

The current default list has a Remove Default List button next to it. Clicking this button will unset the default status of the list and return to a state of having no default list.

One handy way that users may want to use this feature is to create a new list, and then designate it as the default. This list could then be used to add records from searches based on a current topic of interest. Changing the default list is so easy that users may want to do so when changing search topics in order to keep their results better organized.

If a user has a bookbag with an overly long name, the end of it will jut out past the right margin of the menu in Firefox and several other browsers. To change this behavior, you may want to edit the .popmenu li:hover li a css entry in web/css/skin/default/opac/style.css by adding an overflow property. If you desire to have the longer names clipped to the size of the menu then add overflow: hidden. If you prefer to have a scroll bar for oversized entries, then add overflow: auto.

3.2.2.3. Warn When Adding to a Temporary Bookbag

TPAC has been modified so that a user will see a warning before adding a record to a temporary bookbag. This message serves to inform the user that they are adding to a temporary list that will disappear when their session ends.

A new org. unit setting has been added, opac.patron.temporary_list_warn, that will enable this warning when set. Sites may choose not to display this warning.

The user may also set a preference in their search preferences to disable this warning. The setting only works when a user is logged in, of course.

3.2.2.4. Kid’s OPAC

The Kids OPAC (KPAC) is a public catalog search that was designed for children and teens. Colorful menu items,large buttons, and simple navigation make this an appealing search interface for kids. Librarians will appreciate the flexible configuration of the KPAC. Librarians can create links to canned search results for kids and can apply these links by branch. The KPAC uses the same infrastructure as the Template Toolkit OPAC (TPAC), the adult catalog search, so you can easily extend the KPAC using the code that already exists in the TPAC. Finally, third party content, such as reader reviews, can be integrated into the KPAC.

3.2.2.5. Locale picker

In situations in which more than a single locale is configured, the TPAC header will display a locale picker based on the registered locales.

3.2.2.6. Hidden Place Hold Links

The title-level Place Hold link in TPAC will be hidden on the search result and record summary screens when there are no holdable copies on the bib. This is based on the copy, status and location holdable flags.

When enabled in config.tt2, the Place Holds link in TPAC will also be hidden if copies are available in the search location.

3.2.2.7. Library Selectors in Advanced Searches

The library selector is now available on the numeric and expert search pages.

3.2.2.8. Journal Title Search

A journal title search is now available as a stock TPAC filter.

3.2.2.9. Public Patron Notes

Public patron notes are now visible in the Account Summary box of My Account.

3.2.2.10. Auto-Override Permissible Patron Hold Fail Events

A new Library Setting is available that tells TPAC to automatically override hold placement failure events in cases where the patron has the permission to do so. The goal is to skip the confirmation step previously required by patrons when overriding a TPAC hold.

3.2.3. Cataloging

3.2.3.1. Z39.50 Source Attributes Management Interface

There is a new interface for managing Z39.50 attributes on a Z39.50 source. The interface is linked from each source name in the Z39.50 Source administrative interface.

In addition to attribute creation, deletion, and editing, it’s also possible to clone a set of attributes from one source into another. When cloning, any attributes present in the cloned source that are not present in the destination source are copied into the destination source.

3.2.3.2. Vandelay (MARC Import/Export) Copy Overlay

Vandelay Item Attributes (Cataloging → MARC Import / Export → Import Item Attribute Definitions) contains a new field called "Overlay Match ID". The presence of data in this field extracted from an import-item copy indicates to the Vandelay import process that a copy overlay is requested instead of new copy creation. The value for the field is the copy id for bib record queues and the ACQ lineitem_detail ID for Acquisitions Queues. For either type of queue, however, overlay occurs against a real copy (asset.copy). In the ACQ queue case, we use the lineitem_detail ID because this is the data ACQ providers and sub-systems will have access to.

When a match point ID value is a set and a matching copy is found, the values extracted from the inbound copy data are used to replace values on the existing found copy, including the call-number label. Any fields on the inbound copy that are empty are ignored.

One use case for this feature are shelf-ready items produced by a 3rd-party (e.g. ACQ provider) and delivered to the library via MARC file for upload. The file might contain improved MARC bibliographic data as well as real barcodes (i.e. not temporary ACQ generated barcodes) for the copies already purchased through the vendor.

This adds a new permission called IMPORT_OVERLAY_COPY which is required to perform the copy overlay step.

Regardless of permission, it is not possible to overlay values on a copy unless the imported bib record links (creates/overlays/merges) to/with the owning bib record for the copy to be overlaid. This is both for security and removal of a potent foot-gun.

3.2.4. Circulation

3.2.4.1. Simplified Hold Pull List

There is a new hold pull list interface based on the Flattener service that’s designed to perform faster than existing pull list interfaces, both in staff client display and printing.

You can sort on any one column by clicking on it. Click again to reverse direction. This is typical of similar interfaces.

Now you can also sort by multiple columns. Right click the column headers of the grid in the pull list interface to get a dialog that allows you to sort by multiple columns, in any order.

The same dialog that allows you to choose multiple sort columns (accessed by right clicking any column header) also allows you to toggle the display of any column available to the pull list on or off.

Once saved, your changes in this dialog persist for your user account. Column display, display order, and `sorting choices affect printing as well as displayed output.

3.2.5. Administration

3.2.5.1. Search Filter Groups

Search filter groups support the collection of free-form search queries into named groups of named filters which can be applied to searches. The purpose is to allow systems to fine tune filters in the catalog.

Editing the groups and their entries is done in the staff client at Admin → Local Administration → Search Filter Groups.

Consider a new filter called "reading_level". It uses a combination of MARC audience and shelving location to differentiate items. It might have entries that look like this:

Children’s Materials ⇒ audience(a,b,c) locations(1,2,3,4,5,6,7)

Young Adult ⇒ audience(j,d) locations(5,6,7,8,9,10)

Adult ⇒ audience(e,f,g, ) -locations(1,2,3,4,5,6,7,8,9)

<span>[% ctx.filter_groups.reading_level.label %]</span>
<span>
[%
    INCLUDE 'opac/parts/filter_group_selector.tt2'
    filter_group='reading_level'
    none_ok=1
    none_label=l('All')
%]
</span>

3.2.5.2. Standing Penalty CAPTURE and FULFILL Blocks

This feature adds two additional types of standing penalty blocks to manage holds.

When a user has a standing penalty containing CAPTURE in the block list, the user can place holds (pending no HOLD block), but no holds for the user will be captured. This is effectively a policy-based freeze of the hold.

Users that have penalties with FULFILL in the block list will be able to place holds and have their holds captured (i.e. delivered) but will not be able to check out the captured holds. This is basically a way to get patrons in to pay outstanding balances.

3.2.5.3. Copy Location Additions to Circulation Policies

Similar to circulation modifiers, circ policies can now be based on copy location. This also adds copy location to the circ matrix weights and to circ limit sets.

3.2.6. Staff Client

3.2.6.1. XULRunner / Firefox

Support for later versions of XULRunner is included, which means that later improvements to XULRunner can be taken advantage of. This also means that the Firefox extension mode works in Firefox 3.6+, though some frequent tweaking will be needed due to the rapid Firefox major release schedule.

The majority of the actual changes are backend changes, but there are some significant things to note for local customizations.

Remote XUL no longer works in XULRunner/Firefox 4+, but to work around it a custom extension now creates an oils:// wrapper. Within the staff client that wrapper contains a "remote" host, from which server-side XUL can be loaded.

Custom XUL pages stored on the server will need to reference the new wrapper to function.

As a note: The new wrapper is used for all OPAC access and only talks SSL.

The enablePrivilege command that would allow code to access various protected functionality is no longer available. Any code that depended upon it will need to be adjusted to use the oils:// wrapper created for Remote XUL.

Unfortunately, the oils:// wrapper has one less than useful effect. Any JavaScript loaded via it loses access to cookies. This is most notable when you are dealing with authtoken cookies. This only applies to JavaScript, however, and the server can still see the cookies when it gets requests.

As a workaround you can load the data stash and fetch authtokens via it instead. This should always work when using the oils:// wrapper due to the elevated permission set it gets (nearly, if not equal to, local XUL).

Finally, as a useful feature, the url_prefix function is now slightly easier to use. Instead of needing to reference urls.SOMETHING you can instead just put the SOMETHING at the start of the url to prefix:

url_prefix(SOMETHING/stuff.html)

In this case SOMETHING can be terminated by the end of the string or up to the first instance of a slash (/), question mark (?), or pipe (|). The pipe is a special case and is removed during the replacement.

For example, if urls.REPLACE were set to oils://remote/replace:

url_prefix(REPLACE/stuff) becomes oils://remote/replace/stuff url_prefix(REPLACE?query) becomes oils://remote/replace?query url_prefix(REPLACE|ment) becomes oils://remote/replacement

The pipe is intended for cases where the urls entry may or may not already contain a query string, say for differences between OPACs where one requires that something be passed into the query string, but the other uses a path component instead.

3.2.6.2. New Operator Change Features

The operator change dialog has a new dropdown allowing the selection of a Temporary, Staff, or Permanent authtoken. The first option provides a temporary operator change as has typically been done through this menu item. Staff uses a normal staff login authtoken for a multi-hour timeout. Permanent is a staff change that disregards the previous login instead of allowing it to be recovered by using the menu item again.

3.2.6.3. Additional Work Log Entries

Entries for bill payment and hold placement are now available in the Work Log.

3.2.7. SIP

3.2.7.1. Support for credit card payment type and fine items details

Support is now available to create a credit card payment type in the SIP Fee Paid message. There is also now support for SIP clients to retrieve and display a detailed/itemized list of billings to the patron.

3.2.7.2. Staff Client Initial Hostname

For fresh installs of the staff client a common issue is people remembering what hostname to specify. If you are building your own staff clients you can now fill this in automatically.

You can specify this when configuring Evergreen with a new configure option:

--with-initialhost=example.org

It is also possible to specify when building the staff client itself using the INITIAL_HOST variable:

make INITIAL_HOST=example.org build

Part II. Software Installation

Chapter 4. Introduction

This part will guide you through the installation steps installation or upgrading your Evergreen system. It is intended for system administrators.

Chapter 5. System Requirements

5.1. Server Minimum Requirements

The following are the base requirements setting Evergreen up on a test server:

An available desktop, server or virtual image

1GB RAM, or more if your server also runs a graphical desktop

Linux Operating System

Ports 80 and 443 should be opened in your firewall for TCP connections to allow OPAC and staff client connections to the Evergreen server.

5.2. Staff Client Requirements

Staff terminals connect to the central database using the Evergreen staff client, available for download from The Evergreen download page. The staff client must be installed on each staff workstation and requires at minimum:

Windows (XP, Vista, or 7), Mac OS X, or Linux operating system

a reliable high speed Internet connection

512Mb of RAM

The staff client uses the TCP protocol on ports 80 and 443 to communicate with the Evergreen server.

Barcode Scanners

Evergreen will work with virtually any barcode scanner – if it worked with your legacy system it should work on Evergreen.

Printers

Evergreen can use any printer configured for your terminal to print receipts, check-out slips, holds lists, etc. The single exception is spine label printing, which is still under development. Evergreen currently formats spine labels for output to a label roll printer. If you do not have a roll printer manual formatting may be required.

Chapter 6. Installing the Evergreen server

6.1. Preamble: referenced user accounts

In subsequent sections, we will refer to a number of different accounts, as follows:

Linux user accounts:

The user Linux account is the account that you use to log onto the Linux system as a regular user.

The root Linux account is an account that has system administrator privileges. On Debian and Fedora you can switch to this account from your user account by issuing the su - command and entering the password for the root account when prompted. On Ubuntu you can switch to this account from your user account using the sudo su - command and entering the password for your user account when prompted.

The opensrf Linux account is an account that you create when installing OpenSRF. You can switch to this account from the root account by issuing the su - opensrf command.

The postgres Linux account is created automatically when you install the PostgreSQL database server. You can switch to this account from the root account by issuing the su - postgres command.

PostgreSQL user accounts:

The evergreen PostgreSQL account is a superuser account that you will create to connect to the PostgreSQL database server.

Evergreen administrator account:

The egadmin Evergreen account is an administrator account for Evergreen that you will use to test connectivity and configure your Evergreen instance.

6.2. Preamble: developer instructions

Skip this section if you are using an official release tarball downloaded from http://evergreen-ils.org/downloads

Developers working directly with the source code from the Git repository, rather than an official release tarball, must install some extra packages and perform one step before they can proceed with the ./configure step.

As the root Linux account, install the following packages:

autoconf

automake

libtool

As the user Linux account, issue the following command in the Evergreen source directory to generate the configure script and Makefiles:

autoreconf -i

After running make install, developers also need to install the Dojo Toolkit set of JavaScript libraries. The appropriate version of Dojo is included in Evergreen release tarballs. Developers should install the Dojo 1.3.3 version of Dojo by issuing the following commands as the opensrf Linux account:

wget http://download.dojotoolkit.org/release-1.3.3/dojo-release-1.3.3.tar.gz
tar -C /openils/var/web/js -xzf dojo-release-1.3.3.tar.gz
cp -r /openils/var/web/js/dojo-release-1.3.3/* /openils/var/web/js/dojo/.

6.3. Installing prerequisites

Evergreen has a number of prerequisite packages that must be installed before you can successfully configure, compile, and install Evergreen.

Begin by installing the most recent version of OpenSRF (2.1 or later). You can download OpenSRF releases from http://evergreen-ils.org/opensrf.php

On many distributions, it is necessary to install PostgreSQL 9 from external repositories.

On Debian Squeeze, open /etc/apt/sources.list in a text editor as the root Linux account and add the following line:

deb http://backports.debian.org/debian-backports squeeze-backports main contrib

On Ubuntu Lucid, you can use a PPA (personal package archive), which are package sources hosted on Launchpad. The one most commonly used by Evergreen Community members is maintained by Martin Pitt, who also maintains the official PostgreSQL packages for Ubuntu. As the root Linux account, issue the following commands to add the PPA source:

apt-get install python-software-properties
add-apt-repository ppa:pitti/postgresql

Ubuntu Precise comes with PostgreSQL 9, so no additional steps are required.

Fedora comes with PostgreSQL 9, so no additional steps are required.

On Debian and Ubuntu, run aptitude update as the root Linux account to retrieve the new packages from the backports repository.

Issue the following commands as the root Linux account to install prerequisites using the Makefile.install prerequisite installer, substituting debian-squeeze, fedora, ubuntu-lucid, or ubuntu-precise for <osname> below:

make -f Open-ILS/src/extras/Makefile.install <osname>

Add the libdbi-libdbd libraries to the system dynamic library path by issuing the following commands as the root Linux account:

You should skip this step if installing on Ubuntu Precise. The ubuntu-precise target uses libdbd-pgsql from packages.

Debian / Ubuntu Lucid. 

echo "/usr/local/lib/dbd" > /etc/ld.so.conf.d/eg.conf
ldconfig

Fedora. 

echo "/usr/lib64/dbd" > /etc/ld.so.conf.d/eg.conf
ldconfig

6.4. Configuration and compilation instructions

For the time being, we are still installing everything in the /openils/ directory. From the Evergreen source directory, issue the following commands as the user Linux account to configure and build Evergreen:

./configure --prefix=/openils --sysconfdir=/openils/conf
make

6.5. Installation instructions

Once you have configured and compiled Evergreen, issue the following command as the root Linux account to install Evergreen, build the server portion of the staff client, and copy example configuration files to /openils/conf. Change the value of the STAFF_CLIENT_STAMP_ID variable to match the version of the staff client that you will use to connect to the Evergreen server.

make STAFF_CLIENT_STAMP_ID=rel_name install

The server portion of the staff client expects http://hostname/xul/server to resolve. Issue the following commands as the root Linux account to create a symbolic link pointing to the server subdirectory of the server portion of the staff client that we just built using the staff client ID rel_name:

cd /openils/var/web/xul
ln -sf rel_name/server server

6.6. Change ownership of the Evergreen files

All files in the /openils/ directory and subdirectories must be owned by the opensrf user. Issue the following command as the root Linux account to change the ownership on the files:

chown -R opensrf:opensrf /openils

6.7. Configure the Apache Web server

Use the example configuration files in Open-ILS/examples/apache/ to configure your Web server for the Evergreen catalog, staff client, Web services, and administration interfaces. Issue the following commands as the root Linux account:

Debian and Ubuntu. 

cp Open-ILS/examples/apache/eg.conf       /etc/apache2/sites-available/
cp Open-ILS/examples/apache/eg_vhost.conf /etc/apache2/
cp Open-ILS/examples/apache/startup.pl    /etc/apache2/
# Now set up SSL
mkdir /etc/apache2/ssl
cd /etc/apache2/ssl

Fedora. 

cp Open-ILS/examples/apache/eg.conf       /etc/httpd/conf.d/
cp Open-ILS/examples/apache/eg_vhost.conf /etc/httpd/
cp Open-ILS/examples/apache/startup.pl    /etc/httpd/
# Now set up SSL
mkdir /etc/httpd/ssl
cd /etc/httpd/ssl

The openssl command cuts a new SSL key for your Apache server. For a production server, you should purchase a signed SSL certificate, but you can just use a self-signed certificate and accept the warnings in the staff client and browser during testing and development. Create an SSL key for the Apache server by issuing the following command as the root Linux account:

openssl req -new -x509 -days 365 -nodes -out server.crt -keyout server.key

As the root Linux account, edit the eg.conf file that you copied into place.

Replace Allow from 10.0.0.0/8 with Allow from all (to enable access to the offline upload / execute interface from any workstation on any network - note that you must secure this for a production instance)

(Fedora): Change references from the non-existent /etc/apache2/ directory to /etc/httpd/.

Change the user for the Apache server.

(Debian and Ubuntu): As the root Linux account, edit /etc/apache2/envvars. Change export APACHE_RUN_USER=www-data to export APACHE_RUN_USER=opensrf.

(Fedora): As the root Linux account , edit /etc/httpd/conf/httpd.conf. Change User apache to User opensrf.

Configure Apache with performance settings appropriate for Evergreen:

(Debian and Ubuntu): As the root Linux account, edit /etc/apache2/apache2.conf:

(Fedora): As the root Linux account, edit /etc/httpd/conf/httpd.conf:

Change KeepAliveTimeout to 1. Higher values reduce the chance of a request timing out unexpectedly, but increase the risk of using up all available Apache child processes.

Optional: Change MaxKeepAliveRequests to 100

Update the prefork configuration section to suit your environment. The following settings apply to a busy system:

<IfModule mpm_prefork_module>
   StartServers           20
   MinSpareServers         5
   MaxSpareServers        15
   MaxClients            150
   MaxRequestsPerChild 10000
</IfModule>

(Fedora): As the root Linux account, edit the /etc/httpd/eg_vhost.conf file to change references from the non-existent /etc/apache2/ directory to /etc/httpd/.

(Debian and Ubuntu): As the root Linux account, enable the Evergreen site:

a2dissite default  # OPTIONAL: disable the default site (the "It Works" page)
a2ensite eg.conf

6.8. Configure OpenSRF for the Evergreen application

There are a number of example OpenSRF configuration files in /openils/conf/ that you can use as a template for your Evergreen installation. Issue the following commands as the opensrf Linux account:

cp -b /openils/conf/opensrf_core.xml.example /openils/conf/opensrf_core.xml
cp -b /openils/conf/opensrf.xml.example /openils/conf/opensrf.xml

When you installed OpenSRF, you created four Jabber users on two separate domains and edited the opensrf_core.xml file accordingly. Please refer back to the OpenSRF README and, as the opensrf Linux account, edit the Evergreen version of the opensrf_core.xml file using the same Jabber users and domains as you used while installing and testing OpenSRF.

The -b flag tells the cp command to create a backup version of the destination file. The backup version of the destination file has a tilde (~) appended to the file name, so if you have forgotten the Jabber users and domains, you can retrieve the settings from the backup version of the files.

eg_db_config.pl, described in the following section, sets the database connection information in opensrf.xml for you.

6.9. Creating the Evergreen database

By default, the Makefile.install prerequisite installer does not install the PostgreSQL 9 database server required by every Evergreen system; for production use, most libraries install the PostgreSQL database server on a dedicated machine. You can install the packages required by Debian or Ubuntu Lucid on the machine of your choice using the following commands as the root Linux account:

(Debian and Ubuntu Lucid) Installing PostgreSQL 9.1 server packages. 

make -f Open-ILS/src/extras/Makefile.install install_pgsql_server_backport_debs_91

(Ubuntu Precise) Installing PostgreSQL 9.1 server packages. 

make -f Open-ILS/src/extras/Makefile.install install_pgsql_server_debs_91

You can install the packages required by Fedora on the machine of your choice using the following commands as the root Linux account:

(Fedora) Installing PostgreSQL server packages. 

make -f Open-ILS/src/extras/Makefile.install install_fedora_pgsql_server
postgresql-setup initdb

For a standalone PostgreSQL server, install the following Perl modules as the root Linux account:

(Debian / Ubuntu) Installing additional Perl modules on a standalone PostgreSQL 9 server. 

aptitude install gcc libxml-libxml-perl libxml-libxslt-perl
cpan Business::ISBN
cpan JSON::XS
cpan Library::CallNumber::LC
cpan MARC::Record
cpan MARC::File::XML
cpan UUID::Tiny

(Fedora) Installing additional Perl modules on a standalone PostgreSQL 9 server. 

yum install gcc perl-XML-LibXML perl-XML-LibXSLT perl-Business-ISBN
cpan Library::CallNumber::LC
cpan MARC::Record
cpan MARC::File::XML
cpan UUID::Tiny

You need to create a PostgreSQL superuser to create and access the database. Issue the following command as the postgres Linux account to create a new PostgreSQL superuser named evergreen. When prompted, enter the new user’s password:

createuser -s -P evergreen

Once you have created the evergreen PostgreSQL account, you also need to create the database and schema, and configure your configuration files to point at the database server. Issue the following command as the root Linux account from inside the Evergreen source directory, replacing <user>, <password>, <hostname>, <port>, and <dbname> with the appropriate values for your PostgreSQL database (where <user> and <password> are for the evergreen PostgreSQL account you just created), and replace <admin-user> and <admin-pass> with the values you want for the egadmin Evergreen administrator account:

perl Open-ILS/src/support-scripts/eg_db_config.pl --update-config \
       --service all --create-database --create-schema --create-offline \
       --user <user> --password <password> --hostname <hostname> --port <port> \
       --database <dbname> --admin-user <admin-user> --admin-pass <admin-pass>

This creates the database and schema and configures all of the services in your /openils/conf/opensrf.xml configuration file to point to that database. It also creates the configuration files required by the Evergreen cgi-bin administration scripts, and sets the user name and password for the egadmin Evergreen administrator account to your requested values.

6.9.1. Creating the database on a remote server

In a production instance of Evergreen, your PostgreSQL server should be installed on a dedicated server.

6.9.1.1. PostgreSQL 9.1 and later

To create the database instance on a remote database server running PostgreSQL 9.1 or later, simply use the --create-database flag on eg_db_config.pl.

6.9.1.2. For PostgreSQL 9.0

To create the database instance on a remote database server running PostgreSQL 9.0, you can either:

Install the PostgreSQL contrib modules on the machine on which you are installing the Evergreen code, and use the --create-database option from that machine, or

Copy the Open-ILS/src/sql/Pg/create_database.sql script to your PostgreSQL server and invoke it as the postgres Linux account:

psql -vdb_name=<dbname> -vcontrib_dir=`pg_config --sharedir`/contrib -f create_database.sql

Then you can issue the eg_db_config.pl command as above without the --create-database argument to create your schema and configure your configuration files.

6.10. Starting Evergreen

As the root Linux account, start the memcached and ejabberd services (if they aren’t already running):

/etc/init.d/ejabberd start
/etc/init.d/memcached start

As the opensrf Linux account, start Evergreen. The -l flag in the following command is only necessary if you want to force Evergreen to treat the hostname as localhost; if you configured opensrf.xml using the real hostname of your machine as returned by perl -ENet::Domain 'print Net::Domain::hostfqdn() . "\n";', you should not use the -l flag.

osrf_ctl.sh -l -a start_all

If you receive the error message bash: osrf_ctl.sh: command not found, then your environment variable PATH does not include the /openils/bin directory; this should have been set in the opensrf Linux account’s .bashrc configuration file. To manually set the PATH variable, edit the configuration file ~/.bashrc as the opensrf Linux account and add the following line:

export PATH=$PATH:/openils/bin

As the opensrf Linux account, generate the Web files needed by the staff client and catalogue and update the organization unit proximity (you need to do this the first time you start Evergreen, and after that each time you change the library hierarchy in config.cgi):

autogen.sh -u

As the root Linux account, restart the Apache Web server:

/etc/init.d/apache2 restart

If the Apache Web server was running when you started the OpenSRF services, you might not be able to successfully log in to the OPAC or staff client until the Apache Web server is restarted.

6.11. Testing connections to Evergreen

Once you have installed and started Evergreen, test your connection to Evergreen via srfsh. As the opensrf Linux account, issue the following commands to start srfsh and try to log onto the Evergreen server using the egadmin Evergreen administrator user name and password that you set using the eg_db_config.pl command:

/openils/bin/srfsh
srfsh% login <admin-user> <admin-pass>

You should see a result like:

Received Data: "250bf1518c7527a03249858687714376"
------------------------------------
Request Completed Successfully
Request Time in seconds: 0.045286
------------------------------------

Received Data: {
   "ilsevent":0,
   "textcode":"SUCCESS",
   "desc":" ",
   "pid":21616,
   "stacktrace":"oils_auth.c:304",
   "payload":{
      "authtoken":"e5f9827cc0f93b503a1cc66bee6bdd1a",
      "authtime":420
   }

}

------------------------------------
Request Completed Successfully
Request Time in seconds: 1.336568
------------------------------------

If this does not work, it’s time to do some troubleshooting.

As the opensrf Linux account, run the settings-tester.pl script to see if it finds any system configuration problems. The script is found at Open-ILS/src/support-scripts/settings-tester.pl in the Evergreen source tree.

Follow the steps in the troubleshooting guide.

If you have faithfully followed the entire set of installation steps listed here, you are probably extremely close to a working system. Gather your configuration files and log files and contact the Evergreen development mailing list for assistance before making any drastic changes to your system configuration.

6.12. Getting help

Need help installing or using Evergreen? Join the mailing lists at http://evergreen-ils.org/listserv.php or contact us on the Freenode IRC network on the #evergreen channel.

6.13. License

This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.

Chapter 7. Installing the Staff Client

7.1. Installing on Windows

Official Evergreen releases have corresponding Windows based staff clients ready to use.

Download the staff client from http://www.open-ils.org/downloads.php.

The version of your staff client will need to match the version of your Evergreen server. If you are unsure about the version of your Evergreen server, contact your system administrator.

Click on the downloaded Evergreen setup file.

Click Next to begin installation:

Click Next to accept destination folder.

Click Install.

A pop-up should appear indicating that Evergreen has been installed. Click Finish to complete the installation.

When you login to Evergreen from the workstation for the first time, you will also need to register your workstation.

7.2. Installing on Linux

On the Evergreen server, navigate to the staff_client directory inside the Evergreen source:

cd  /path/to/Evergreen/Open-ILS/xul/staff_client

As the root user, build release versions of staff clients for both 32-bit and 64-bit Linux systems:

make rigrelease rebuild linux32-updates-client linux64-updates-client

This builds and copies two staff client tarballs for Linux to the updates directory on the Web server.

As the root user, reset the ownership of the Evergreen install directory to the opensrf user. For example, if your install directory is /openils:

chown -R opensrf:opensrf /openils

On your staff client workstation, download the 32-bit or 64-bit version of the staff client from your Web server at http://hostname/updates/manualupdate.html (where hostname represents the hostname of your Web server).

On your staff client workstation, create a directory with the name of your staff client and version.

Extract the tar files into that directory.

Within the directory, click on the evergreen file to start the program.

Or, you can run the program from a terminal (command line). For example, if the staff client files were extracted to a directory called evergreen_client in your home directory, you can run it with:

~/evergreen_client/evergreen

7.3. Registering a Workstation

Before you can connect to Evergreen from your staff client, you will need to register your workstation when you try to login.

You will need the permissions to add workstations to your network. If you do not have these permissions, ask your system administrator for assistance.

When you login for the first time, a red box will appear around your workstation information on the right side of the screen.

Create a unique workstation name or use the default computer name provided.

Click Register

You will now be able to log into the system.

7.4. Removing Staff Client Preferences

7.4.1. Windows

When you uninstall the Evergreen staff client code from your system, the staff client preferences and cached data are not removed from your system. This can be a problem if, for example, you have registered your workstation with the wrong library; or if you have chosen a display language (locale) that is broken and will not let you start up the client again

On Windows, you can uninstall the Evergreen staff client code using the Add/Remove Programs menu.

To remove the staff client preferences and cached data entirely on Windows, there are two directories that you must delete completely (where <profile> represents your user profile name):

C:\Documents and Settings\<profile>\Application Data\OpenILS

C:\Documents and Settings\<profile>\Local Settings\Application Data\OpenILS

You might need to change the preferences in Windows Explorer to display hidden files (Tools → Folder Options… → View).

7.4.2. Linux

To remove the staff client preferences and cached data from your user account on Linux, there is one directory that you must delete completely:

rm -fr ~/.openils

Chapter 8. Upgrading the Evergreen Server

Before upgrading, it is important to carefully plan an upgrade strategy to minimize system downtime and service interruptions. All of the steps in this chapter are to be completed from the command line.

8.1. Software Prerequisites:

PostgreSQL: Version 9.1 is recommended. The minimum supported version is 9.0.

Linux: Evergreen 2.3 has been tested on Debian Squeeze (6.0), Ubuntu Lucid Lynx (10.04) and Ubuntu Precise Pangolin (12.04). If you are running an older version of these distributions, you may want to upgrade before upgrading Evergreen. For instructions on upgrading these distributions, visit the Debian or Ubuntu websites.

OpenSRF: The minimum supported version of OpenSRF is 2.1.0.

In the following instructions, you are asked to perform certain steps as either the root or opensrf user.

Debian: To become the root user, issue the su command and enter the password of the root user.

Ubuntu: To become the root user, issue the sudo su command and enter the password of your current user.

To switch from the root user to a different user, issue the su - [user] command; for example, su - opensrf. Once you have become a non-root user, to become the root user again simply issue the exit command.

8.2. Upgrade the Evergreen code

The following steps guide you through a simplistic upgrade of a production server. You must adjust these steps to accommodate your customizations such as catalogue skins.

Stop Evergreen and back up your data:

As root, stop the Apache web server.

As the opensrf user, stop all Evergreen and OpenSRF services:

osrf_ctl.sh -l -a stop_all

Back up the /openils directory.

Upgrade OpenSRF. Download and install the latest version of OpenSRF from the OpenSRF download page.

As the opensrf user, download and extract Evergreen 2.3:

wget http://evergreen-ils.org/downloads/Evergreen-ILS-2.3.10.tar.gz
tar xzf Evergreen-ILS-2.3.10.tar.gz

For the latest edition of Evergreen, check the Evergreen download page and adjust upgrading instructions accordingly.

As the root user, install the prerequisites:

cd /home/opensrf/Evergreen-ILS-2.3.10

On the next command, replace [distribution] with one of these values for your distribution of Debian or Ubuntu:

debian-squeeze for Debian Squeeze (6.0)

ubuntu-lucid for Ubuntu Lucid Lynx (10.04)

ubuntu-precise for Ubuntu Precise Pangolin (12.04)

make -f Open-ILS/src/extras/Makefile.install [distribution]

As the opensrf user, configure and compile Evergreen:

cd /home/opensrf/Evergreen-ILS-2.3.10
./configure --prefix=/openils --sysconfdir=/openils/conf
make

As the root user, install Evergreen:

cd /home/opensrf/Evergreen-ILS-2.3.10
make STAFF_CLIENT_STAMP_ID=rel_2_3_10 install

As the root user, change all files to be owned by the opensrf user and group:

chown -R opensrf:opensrf /openils

As the opensrf user, update the server symlink in /openils/var/web/xul/:

cd /openils/var/web/xul/
rm server
ln -sf rel_2_3_10/server server

As the opensrf user, update opensrf_core.xml and opensrf.xml by copying the new example files (/openils/conf/opensrf_core.xml.example and /openils/conf/opensrf.xml). The -b option creates a backup copy of the old file.

cp -b /openils/conf/opensrf_core.xml.example /openils/conf/opensrf_core.xml
cp -b /openils/conf/opensrf.xml.example /openils/conf/opensrf.xml

Copying these configuration files will remove any customizations you have made to them. Remember to redo your customizations after copying them.

As the opensrf user, update the configuration files:

cd /home/opensrf/Evergreen-ILS-2.3.10
perl Open-ILS/src/support-scripts/eg_db_config.pl --update-config --service all \
--create-offline --database evergreen --host localhost --user evergreen --password evergreen

As the root user, update the Apache files:

Copying these Apache configuration files will remove any customizations you have made to them. Remember to redo your customizations after copying them. For example, if you purchased an SSL certificate, you will need to edit eg.conf to point to the appropriate SSL certificate files.

Update /etc/apache2/startup.pl by copying the example from Open-ILS/examples/apache/startup.pl.

cp /home/opensrf/Evergreen-ILS-2.3.10/Open-ILS/examples/apache/startup.pl /etc/apache2/startup.pl

Update /etc/apache2/eg_vhost.conf by copying the example from Open-ILS/examples/apache/eg_vhost.conf.

cp /home/opensrf/Evergreen-ILS-2.3.10/Open-ILS/examples/apache/eg_vhost.conf /etc/apache2/eg_vhost.conf

Update /etc/apache2/sites-available/eg.conf by copying the example from Open-ILS/ examples/apache/eg.conf.

cp /home/opensrf/Evergreen-ILS-2.3.10/Open-ILS/examples/apache/eg.conf /etc/apache2/sites-available/eg.conf

8.3. Upgrade the Evergreen database schema

The upgrade of the Evergreen database schema is the lengthiest part of the upgrade process for sites with a significant amount of production data.

Before running the upgrade script against your production Evergreen database, back up your database, restore it to a test server, and run the upgrade script against the test server. This enables you to determine how long the upgrade will take and whether any local customizations present problems for the stock upgrade script that require further tailoring of the upgrade script. The backup also enables you to cleanly restore your production data if anything goes wrong during the upgrade.

Pay attention to error output as you run the upgrade scripts. If you encounter errors that you cannot resolve yourself through additional troubleshooting, please report the errors to the Evergreen Technical Discussion List.

Run the following script as a user with the ability to connect to the database server. Adjust the arguments to the psql command to reflect your database server connection information:

cd /home/opensrf/Evergreen-ILS-2.3.10/Open-ILS/src/sql/Pg
psql -U evergreen -h localhost -f version-upgrade/2.2-2.3.0-upgrade-db.sql evergreen
psql -U evergreen -h localhost -f version-upgrade/2.3.0-2.3.1-upgrade-db.sql evergreen
psql -U evergreen -h localhost -f version-upgrade/2.3.1-2.3.2-upgrade-db.sql evergreen
psql -U evergreen -h localhost -f version-upgrade/2.3.2-2.3.3-upgrade-db.sql evergreen
psql -U evergreen -h localhost -f version-upgrade/2.3.3-2.3.4-upgrade-db.sql evergreen
psql -U evergreen -h localhost -f version-upgrade/2.3.4-2.3.5-upgrade-db.sql evergreen
psql -U evergreen -h localhost -f version-upgrade/2.3.5-2.3.6-upgrade-db.sql evergreen
psql -U evergreen -h localhost -f version-upgrade/2.3.6-2.3.7-upgrade-db.sql evergreen
psql -U evergreen -h localhost -f version-upgrade/2.3.7-2.3.8-upgrade-db.sql evergreen
psql -U evergreen -h localhost -f version-upgrade/2.3.8-2.3.9-upgrade-db.sql evergreen
psql -U evergreen -h localhost -f version-upgrade/2.3.9-2.3.10-upgrade-db.sql evergreen

8.4. Restart Evergreen and Test

As the opensrf user, start all Evergreen and OpenSRF services:

osrf_ctl.sh -l -a start_all

As the opensrf user, run autogen to refresh the static organizational data files:

cd /openils/bin
./autogen.sh

Start srfsh and try logging in using your Evergreen username and password:

/openils/bin/srfsh
srfsh% login username password

You should see a result like:

Received Data: "250bf1518c7527a03249858687714376"
    ------------------------------------
    Request Completed Successfully
    Request Time in seconds: 0.045286
    ------------------------------------

    Received Data: {
       "ilsevent":0,
       "textcode":"SUCCESS",
       "desc":" ",
       "pid":21616,
       "stacktrace":"oils_auth.c:304",
       "payload":{
          "authtoken":"e5f9827cc0f93b503a1cc66bee6bdd1a",
          "authtime":420
       }

    }

    ------------------------------------
    Request Completed Successfully
    Request Time in seconds: 1.336568
    ------------------------------------

If this does not work, it’s time to do some troubleshooting.

As the root user, start the Apache web server.

If you encounter errors, refer to the troubleshooting section of this documentation for tips on finding solutions and seeking further assistance from the Evergreen community.

Chapter 9. Setting Up EDI Acquisitions

9.1. Introduction

Electronic Data Interchange (EDI) is used to exchange information between participating vendors and Evergreen. This chapter contains technical information for installation and configuration of the components necessary to run EDI Acquisitions for Evergreen.

9.2. Installation

9.2.1. Install EDI Translator

The EDI Translator is used to convert data into EDI format. It runs on localhost and listens on port 9191 by default. This is controlled via the edi_webrick.cnf file located in the edi_translator directory. It should not be necessary to edit this configuration if you install EDI Translator on the same server used for running Action/Triggers events.

If you are running Evergreen with a multi-server configuration, make sure to install EDI Translator on the same server used for Action/Trigger event generation.

Steps for Installing

As the opensrf user, copy the EDI Translator code found in Open-ILS/src/edi_translator to somewhere accessible (for example, /openils/var/edi):

cp -r Open-ILS/src/edi_translator /openils/var/edi

Navigate to where you have saved the code to begin next step:

cd /openils/var/edi

Next, as the root user (or a user with sudo rights), install the dependencies, via "install.sh". This will perform some apt-get routines to install the code needed for the EDI translator to function. (Note: subversion must be installed first)

./install.sh

Now, we’re ready to start "edi_webrick.bash" which is the script that calls the "Ruby" code to translate EDI. This script needs to be started in order for EDI to function so please take appropriate measures to ensure this starts following reboots/upgrades/etc. As the opensrf user:

./edi_webrick.bash

You can check to see if EDI translator is running.

Using the command "ps aux | grep edi" should show you something similar if the script is running properly:

root    30349  0.8  0.1  52620 10824 pts/0      S       13:04   0:00 ruby ./edi_webrick.rb

To shutdown EDI Translator you can use something like pkill (assuming no other ruby processes are running on that server):

kill -INT $(pgrep ruby)

9.2.2. Install EDI Scripts

The EDI scripts are "edi_pusher.pl" and "edi_fetcher.pl" and are used to "push" and "fetch" EDI messages for configured EDI accounts.

As the opensrf user, copy edi_pusher.pl and edi_fetcher.pl from Open-ILS/src/support-scripts into /openils/bin:

cp Open-ILS/src/support-scripts/edi_pusher.pl /openils/bin
cp Open-ILS/src/support-scripts/edi_fetcher.pl /openils/bin

Setup the edi_pusher.pl and edi_fetcher.pl scripts to run as cron jobs in order to regularly push and receive EDI messages.

Add to the opensrf user’s crontab the following entries:

10 * * * * cd /openils/bin && /usr/bin/perl ./edi_pusher.pl > /dev/null
0 1 * * * cd /openils/bin && /usr/bin/perl ./edi_fetcher.pl > /dev/null

The example for edi_pusher.pl sets the script to run at 10 minutes past the hour, every hour.

The example for edi_fetcher.pl sets the script to run at 1 AM every night.

You may choose to run the EDI scripts more or less frequently based on the necessary response times from your vendors.

9.3. Configuration

9.3.1. Configuring Providers

Look in Admin > Server Administration > Acquisitions > Providers

Column
Description/Notes

Provider Name

A unique name to identify the provider

Code

A unique code to identify the provider

Owner

The org unit who will "own" the provider.

Currency

The currency format the provider accepts

Active

Whether or not the Provider is "active" for use

Default Claim Policy

??

EDI Default

The default "EDI Account" to use (see EDI Accounts Configuration)

Email

The email address for the provider

Fax Phone

A fax number for the provider

Holdings Tag

The holdings tag to be utilized (usually 852, for Evergreen)

Phone

A phone number for the provider

Prepayment Required

Whether or not prepayment is required

SAN

The vendor provided, org unit specific SAN code

URL

The vendor website

9.3.2. Configuring EDI Accounts

Look in Admin > Server Administration > Acquisitions > EDI Accounts

Column
Description/Notes

Label

A unique name to identify the provider

Host

FTP/SFTP/SSH hostname - vendor assigned

Username

FTP/SFTP/SSH username - vendor assigned

Password

FTP/SFTP/SSH password - vendor assigned

Account

Vendor assigned account number associated with your organization

Owner

The organizational unit who owns the EDI account

Last Activity

The date of last activity for the account

Provider

This is a link to one of the "codes" in the "Providers" interface

Path

The path on the vendor’s server where Evergreen will send it’s outgoing .epo files

Incoming Directory

The path on the vendor’s server where "incoming" .epo files are stored

Vendor Account Number

Vendor assigned account number.

Vendor Assigned Code

Usually a sub-account designation. Can be used with or without the Vendor Account Number.

9.3.3. Configuring Organizational Unit SAN code

Look in Admin > Server Settings > Organizational Units

This interface allows a library to configure their SAN, alongside their address, phone, etc.

9.4. Troubleshooting

9.4.1. PO JEDI Template Issues

Some libraries may run into issues with the action/trigger (PO JEDI). The template has to be modified to handle different vendor codes that may be used. For instance, if you use "ingra" instead of INGRAM this may cause a problem because they are hardcoded in the template. The following is an example of one modification that seems to work.

Original template has: 

"buyer":[
    [%   IF   target.provider.edi_default.vendcode && (target.provider.code == 'BT' || target.provider.name.match('(?i)^BAKER & TAYLOR'))  -%]
        {"id-qualifier": 91, "id":"[% target.ordering_agency.mailing_address.san _ ' ' _ target.provider.edi_default.vendcode %]"}
    [%- ELSIF target.provider.edi_default.vendcode && target.provider.code == 'INGRAM' -%]
        {"id":"[% target.ordering_agency.mailing_address.san %]"},
        {"id-qualifier": 91, "id":"[% target.provider.edi_default.vendcode %]"}
    [%- ELSE -%]
        {"id":"[% target.ordering_agency.mailing_address.san %]"}
    [%- END -%]
],

Modified template has the following where it matches on provider SAN instead of code: 

"buyer":[
    [%   IF   target.provider.edi_default.vendcode && (target.provider.san == '1556150')  -%]
        {"id-qualifier": 91, "id":"[% target.ordering_agency.mailing_address.san _ ' ' _ target.provider.edi_default.vendcode %]"}
        {"id-qualifier": 91, "id":"[% target.ordering_agency.mailing_address.san _ ' ' _ target.provider.edi_default.vendcode %]"}
    [%- ELSIF target.provider.edi_default.vendcode && (target.provider.san == '1697978')  -%]
        {"id":"[% target.ordering_agency.mailing_address.san %]"},
        {"id-qualifier": 91, "id":"[% target.provider.edi_default.vendcode %]"}
    [%- ELSE -%]
        {"id":"[% target.ordering_agency.mailing_address.san %]"}
    [%- END -%]
],

Part III. System Configuration and Customization

Chapter 10. Introduction

The Evergreen system allows a free range of customizations to every aspect of the system. Use this part of the documentation to become familiar with the tools for configuring the system as well as customizing the catalog and staff client.

Chapter 11. Describing your organization

Your Evergreen system is almost ready to go. You’ll need to add each of the libraries that will be using your Evergreen system. If you’re doing this for a consortium, you’ll have to add your consortium as a whole, and all the libraries and branches that are members of the consortium. In this chapter, we’ll talk about how to get the Evergreen system to see all your libraries, how to set each one up, and how to edit all the details of each one.

11.1. Organization Unit Types

The term Organization Unit Types refers to levels in the hierarchy of your library system(s). Examples could include: All-Encompassing Consortium, Library System, Branch, Bookmobile, Sub-Branch, etc.

You can add or remove organizational unit types, and rename them as needed to match the organizational hierarchy that matches the libraries using your installation of Evergreen. Organizational unit types should never have proper names since they are only generic types.

When working with configuration, settings, and permissions, it is very important to be careful of the Organization Unit Context Location - this is the organizational unit to which the configuration settings are being applied. If, for example, a setting is applied at the Consortium context location, all child units will inherit that setting. If a specific branch location is selected, only that branch and its child units will have the setting applied. The levels of the hierarchy to which settings can be applied are often referred to in terms of "depth" in various configuration interfaces. In a typical hierarchy, the consortium has a depth of 0, the system is 1, the branch is 2, and any bookmobiles or sub-branches is 3.

11.1.1. Create and edit Organization Unit Types

Open Admin > Server Administration > Organization Types.

In the left panel, expand the Organization Unit Types hierarchy.

Click on a organization type to edit the existing type or to add a new organization unit.

A form opens in the right panel, displaying the data for the selected organization unit.

Edit the fields as required and click Save.

To create a new dependent organization unit, click New Child. The new child organization unit will appear in the left panel list below the parent. Highlight the new unit and edit the data as needed, click Save

11.2. Organizational Units

Organizational Units are the specific instances of the organization unit types that make up your library’s hierarchy. These will have distinctive proper names such as Main Street Branch or Townsville Campus.

11.2.1. Remove or edit default Organizational Units

After installing the Evergreen software, the default CONS, SYS1, BR1, etc., organizational units remain. These must be removed or edited to reflect actual library entities.

11.2.2. Create and edit Organizational Units

Open Admin > Server Administration > Organizational Units.

In the left panel, expand the the Organizational Units hierarchy, select a unit.

A form opens in the right panel, displaying the data for the selected organizational unit.

To edit the existing, default organizational unit, enter system or library specific data in the form; complete all three tabs: Main Settings, Hours of Operation, Addresses.

Click Save.

To create a new dependent organizational unit, click New Child. The new child will appear in the hierarchy list below the parent unit. Click on the new unit and edit the data, click Save

11.2.3. Organizational Unit data

The Addresses tab allows you to enter library contact information. Library Phone number, email address, and addresses are used in patron email notifications, hold slips, and transit slips. The Library address tab is broken out into four address types: Physical Address, Holds Address, Mailing Address, ILL Address.

The Hours of Operation tab is where you enter regular, weekly hours. Holiday and other closures are set in the Closed Dates Editor. Hours of operation and closed dates impact due dates and fine accrual.

11.2.4. Set closed dates using the Closed Dates Editor

Open Admin > Local Administration > Closed Dates Editor.

Select type of closure: typically Single Day or Multiple Day.

Click the Calendar gadget to select the All Day date or starting and ending dates.

Enter a Reason for closure (optional).

Click Apply to all of my libraries if your organizational unit has children units that will also be closed.

Click Save.

Now that your organizational structure is established, you can begin configuring permissions for the staff users of your Evergreen system.

Chapter 12. Describing your people

Many different members of your staff will use your Evergreen system to perform the wide variety of tasks required of the library.

When the Evergreen installation was completed, a number of permission groups should have been automatically created. These permission groups are:

Users

Patrons

Staff

Catalogers

Circulators

Acquisitions

Acquisitions Administrator

Cataloging Administrator

Circulation Administrator

Local Administrator

Serials

System Administrator

Global Administrator

Data Review

Volunteers

Each of these permission groups has a different set of permissions connected to them that allow them to do different things with the Evergreen system. Some of the permissions are the same between groups; some are different. These permissions are typically tied to one or more working location (sometimes referred to as a working organizational unit or work OU) which affects where a particular user can exercise the permissions they have been granted.

12.1. Setting the staff user’s working location

To grant a working location to a staff user in the staff client:

Search for the patron. Select Search > Search for Patrons from the top menu.

When you retrieve the correct patron record, select Other > User Permission Editor from the upper right corner. The permissions associated with this account appear in the right side of the client, with the Working Location list at the top of the screen.

The Working Location list displays the Organizational Units in your consortium. Select the check box for each Organization Unit where this user needs working permissions. Clear any other check boxes for Organization Units where the user no longer requires working permissions.

Scroll all the way to the bottom of the page and click Save. This user account is now ready to be used at your library.

As you scroll down the page you will come to the Permissions list. These are the permissions that are given through the Permission Group that you assigned to this user. Depending on your own permissions, you may also have the ability to grant individual permissions directly to this user.

12.2. Comparing approaches for managing permissions

The Evergreen community uses two different approaches to deal with managing permissions for users:

Staff Client

Evergreen libraries that are most comfortable using the staff client tend to manage permissions by creating different profiles for each type of user. When you create a new user, the profile you assign to the user determines their basic set of permissions. This approach requires many permission groups that contain overlapping sets of permissions: for example, you might need to create a Student Circulator group and a Student Cataloger group. Then if a new employee needs to perform both of these roles, you need to create a third Student Cataloger / Circulator group representing the set of all of the permissions of the first two groups.

The advantage to this approach is that you can maintain the permissions entirely within the staff client; a drawback to this approach is that it can be challenging to remember to add a new permission to all of the groups. Another drawback of this approach is that the user profile is also used to determine circulation and hold rules, so the complexity of your circulation and hold rules might increase significantly.

Database Access

Evergreen libraries that are comfortable manipulating the database directly tend to manage permissions by creating permission groups that reflect discrete roles within a library. At the database level, you can make a user belong to many different permission groups, and that can simplify your permission management efforts. For example, if you create a Student Circulator group and a Student Cataloger group, and a new employee needs to perform both of these roles, you can simply assign them to both of the groups; you do not need to create an entirely new permission group in this case. An advantage of this approach is that the user profile can represent only the user’s borrowing category and requires only the basic Patrons permissions, which can simplify your circulation and hold rules.

Permissions and profiles are not carved in stone. As the system administrator, you can change them as needed. You may set and alter the permissions for each permission group in line with what your library, or possibly your consortium, defines as the appropriate needs for each function in the library.

12.3. Managing permissions in the staff client

In this section, we’ll show you in the staff client:

where to find the available permissions

where to find the existing permission groups

how to see the permissions associated with each group

how to add or remove permissions from a group

We also provide an appendix with a listing of suggested minimum permissions for some essential groups. You can compare the existing permissions with these suggested permissions and, if any are missing, you will know how to add them.

12.3.1. Where to find existing permissions and what they mean

In the staff client, in the upper right corner of the screen, click on Admin > Server Administration > Permissions.

The list of available permissions will appear on screen and you can scroll down through them to see permissions that are already available in your default installation of Evergreen.

There are over 500 permissions in the permission list. They appear in two columns: Code and Description. Code is the name of the permission as it appear in the Evergreen database. Description is a brief note on what the permission allows. All of the most common permissions have easily understandable descriptions.

12.3.2. Where to find existing Permission Groups

In the staff client, in the upper right corner of the screen, navigate to Admin > Server Administration > Permission Groups.

Two panes will open on your screen. The left pane provides a tree view of existing Permission Groups. The right pane contains two tabs: Group Configuration and Group Permissions.

In the left pane, you will find a listing of the existing Permission Groups which were installed by default. Click on the + sign next to any folder to expand the tree and see the groups underneath it. You should see the Permission Groups that were listed at the beginning of this chapter. If you do not and you need them, you will have to create them.

12.3.3. Adding or removing permissions from a Permission Group

First, we will remove a permission from the Staff group.

From the list of Permission Groups, click on Staff.

In the right pane, click on the Group Permissions tab. You will now see a list of permissions that this group has.

From the list, choose CREATE_CONTAINER. This will now be highlighted.

Click the Delete Selected button. CREATE_CONTAINER will be deleted from the list. The system will not ask for a confirmation. If you delete something by accident, you will have to add it back.

Click the Save Changes button.

You can select a group of individual items by holding down the Ctrl key and clicking on them. You can select a list of items by clicking on the first item, holding down the Shift key, and clicking on the last item in the list that you want to select.

Now, we will add the permission we just removed back to the Staff group.

From the list of Permission Groups, click on Staff.

In the right pane, click on the Group Permissions tab.

Click on the New Mapping button. The permission mapping dialog box will appear.

From the Permission drop down list, choose CREATE_CONTAINER.

From the Depth drop down list, choose Consortium.

Click the checkbox for Grantable.

Click the Add Mapping button. The new permission will now appear in the Group Permissions window.

Click the Save Changes button.

If you have saved your changes and you don’t see them, you may have to click the Reload button in the upper left side of the staff client screen.

12.4. Managing role-based permission groups in the database

While the ability to assign a user to multiple permission groups has existed in Evergreen for years, a staff client interface is not currently available to facilitate the work of the Evergreen administrator. However, if you or members of your team are comfortable working directly with the Evergreen database, you can use this approach to separate the borrowing profile of your users from the permissions that you grant to staff, while minimizing the amount of overlapping permissions that you need to manage for a set of permission groups that would otherwise multiply exponentially to represent all possible combinations of staff roles.

In the following example, we create three new groups:

a Student group used to determine borrowing privileges

a Student Cataloger group representing a limited set of cataloging permissions appropriate for students

a Student Circulator group representing a limited set of circulation permissions appropriate for students

Then we add three new users to our system: one who needs to perform some cataloging duties as a student; one who needs perform some circulation duties as a student; and one who needs to perform both cataloging and circulation duties. This section demonstrates how to add these permissions to the users at the database level.

To create the Student group, add a new row to the permission.grp_tree table as a child of the Patrons group:

INSERT INTO permission.grp_tree (name, parent, usergroup, description, application_perm)
SELECT 'Students', pgt.id, TRUE, 'Student borrowers', 'group_application.user.patron.student'
FROM permission.grp_tree pgt
 WHERE name = 'Patrons';

To create the Student Cataloger group, add a new row to the permission.grp_tree table as a child of the Staff group:

INSERT INTO permission.grp_tree (name, parent, usergroup, description, application_perm)
SELECT 'Student Catalogers', pgt.id, TRUE, 'Student catalogers', 'group_application.user.staff.student_cataloger'
FROM permission.grp_tree pgt
WHERE name = 'Staff';

To create the Student Circulator group, add a new row to the permission.grp_tree table as a child of the Staff group:

INSERT INTO permission.grp_tree (name, parent, usergroup, description, application_perm)
SELECT 'Student Circulators', pgt.id, TRUE, 'Student circulators', 'group_application.user.staff.student_circulator'
FROM permission.grp_tree pgt
WHERE name = 'Staff';

We want to give the Student Catalogers group the ability to work with MARC records at the consortial level, so we assign the UPDATE_MARC, CREATE_MARC, and IMPORT_MARC permissions at depth 0:

WITH pgt AS (
  SELECT id
  FROM permission.grp_tree
  WHERE name = 'Student Catalogers'
)
INSERT INTO permission.grp_perm_map (grp, perm, depth)
SELECT pgt.id, ppl.id, 0
FROM permission.perm_list ppl, pgt
WHERE ppl.code IN ('UPDATE_MARC', 'CREATE_MARC', 'IMPORT_MARC');

Similarly, we want to give the Student Circulators group the ability to check out copies and record in-house uses at the system level, so we assign the COPY_CHECKOUT and CREATE_IN_HOUSE_USE permissions at depth 1 (overriding the same Staff permissions that were granted only at depth 2):

WITH pgt AS (
  SELECT id
  FROM permission.grp_tree
  WHERE name = 'Student Circulators'
) INSERT INTO permission.grp_perm_map (grp, perm, depth)
SELECT pgt.id, ppl.id, 1
FROM permission.perm_list ppl, pgt
WHERE ppl.code IN ('COPY_CHECKOUT', 'CREATE_IN_HOUSE_USE');

Finally, we want to add our students to the groups. The request may arrive in your inbox from the library along the lines of "Please add Mint Julep as a Student Cataloger, Bloody Caesar as a Student Circulator, and Grass Hopper as a Student Cataloguer / Circulator; I’ve already created their accounts and given them a work organizational unit." You can translate that into the following SQL to add the users to the pertinent permission groups, adjusting for the inevitable typos in the names of the users.

First, add our Student Cataloger:

WITH pgt AS (
  SELECT id FROM permission.grp_tree
  WHERE name = 'Student Catalogers'
)
INSERT INTO permission.usr_grp_map (usr, grp)
SELECT au.id, pgt.id
FROM actor.usr au, pgt
WHERE first_given_name = 'Mint' AND family_name = 'Julep';

Next, add the Student Circulator:

WITH pgt AS (
  SELECT id FROM permission.grp_tree
  WHERE name = 'Student Circulators'
)
INSERT INTO permission.usr_grp_map (usr, grp)
SELECT au.id, pgt.id
FROM actor.usr au, pgt
WHERE first_given_name = 'Bloody' AND family_name = 'Caesar';

Finally, add the all-powerful Student Cataloger / Student Circulator:

 WITH pgt AS (
  SELECT id FROM permission.grp_tree
  WHERE name IN ('Student Catalogers', 'Student Circulators')
)
INSERT INTO permission.usr_grp_map (usr, grp)
SELECT au.id, pgt.id
FROM actor.usr au, pgt
WHERE first_given_name = 'Grass' AND family_name = 'Hopper';

While adopting this role-based approach might seem labour-intensive when applied to a handful of students in this example, over time it can help keep the permission profiles of your system relatively simple in comparison to the alternative approach of rapidly reproducing permission groups, overlapping permissions, and permissions granted on a one-by-one basis to individual users.

Chapter 13. Migrating Patron Data

This section will explain the task of migrating your patron data from comma delimited files into Evergreen. It does not deal with the process of exporting from the non-Evergreen system since this process may vary depending on where you are extracting your patron records. Patron could come from an ILS or it could come from a student database in the case of academic records.

When importing records into Evergreen you will need to populate 3 tables in your Evergreen database:

actor.usr - The main table for user data

actor.card - Stores the barcode for users; Users can have more than 1 card but only 1 can be active at a given time;

actor.usr_address - Used for storing address information; A user can have more than one address.

Before following the procedures below to import patron data into Evergreen, it is a good idea to examine the fields in these tables in order to decide on a strategy for data to include in your import. It is important to understand the data types and constraints on each field.

Export the patron data from your existing ILS or from another source into a comma delimited file. The comma delimited file used for importing the records should use Unicode (UTF8) character encoding.

Create a staging table. A staging table will allow you to tweak the data before importing. Here is an example sql statement:

    CREATE TABLE students (
         student_id int, barcode text, last_name text, first_name text, email text,
                 address_type text, street1 text, street2 text,
        city text, province text, country text, postal_code text, phone text, profile
        int DEFAULT 2, ident_type int, home_ou int, claims_returned_count int DEFAULT
                0, usrname text, net_access_level int DEFAULT 2, password text
    );

The default variables allow you to set default for your library or to populate required fields in Evergreen if your data includes NULL values.

The data field profile in the above SQL script refers to the user group and should be an integer referencing the id field in permission.grp_tree. Setting this value will effect the permissions for the user. See the values in permission.grp_tree for possibilities.

ident_type is the identification type used for identifying users. This is a integer value referencing config.identification_type and should match the id values of that table. The default values are 1 for Drivers License, 2 for SSN or 3 for other.

home_ou is the home organizational unit for the user. This value needs to match the corresponding id in the actor.org_unit table.

Copy records into staging table from a comma delimited file.

    COPY students (student_id, last_name, first_name, email, address_type, street1, street2,
        city, province, country, postal_code, phone)
        FROM '/home/opensrf/patrons.csv'
                WITH CSV HEADER;

The script will vary depending on the format of your patron load file (patrons.csv).

Formatting of some fields to fit Evergreen filed formatting may be required. Here is an example of sql to adjust phone numbers in the staging table to fit the evergreen field:

    UPDATE students phone = replace(replace(replace(rpad(substring(phone from 1 for 9), 10, '-') ||
    substring(phone from 10), '(', ''), ')', ''), ' ', '-');

Data “massaging” will be required to fit formats used in Evergreen.

Insert records from the staging table into the actor.usr Evergreen table:

     INSERT INTO actor.usr (
        profile, usrname, email, passwd, ident_type, ident_value, first_given_name,
        family_name, day_phone, home_ou, claims_returned_count, net_access_level)
        SELECT profile, students.usrname, email, password, ident_type, student_id,
        first_name, last_name, phone, home_ou, claims_returned_count, net_access_level
        FROM students;

Insert records into actor.card from actor.usr .

    INSERT INTO actor.card (usr, barcode)
        SELECT actor.usr.id, students.barcode
        FROM students
                INNER JOIN actor.usr
                        ON students.usrname = actor.usr.usrname;

This assumes a one to one card patron relationship. If your patron data import has multiple cards assigned to one patron more complex import scripts may be required which look for inactive or active flags.

Update actor.usr.card field with actor.card.id to associate active card with the user:

    UPDATE actor.usr
        SET card = actor.card.id
        FROM actor.card
        WHERE actor.card.usr = actor.usr.id;

Insert records into actor.usr_address to add address information for users:

    INSERT INTO actor.usr_address (usr, street1, street2, city, state, country, post_code)
        SELECT actor.usr.id, students.street1, students.street2, students.city, students.province,
        students.country, students.postal_code
        FROM students
        INNER JOIN actor.usr ON students.usrname = actor.usr.usrname;

Update actor.usr.address with address id from address table.

    UPDATE actor.usr
        SET mailing_address = actor.usr_address.id, billing_address = actor.usr_address.id
        FROM actor.usr_address
        WHERE actor.usr.id = actor.usr_address.usr;

This assumes 1 address per patron. More complex scenarios may require more sophisticated SQL.

13.1. Creating an sql Script for Importing Patrons

The procedure for importing patron can be automated with the help of an sql script. Follow these steps to create an import script:

Create an new file and name it import.sql

Edit the file to look similar to this:

    BEGIN;

    -- Create staging table.
    CREATE TABLE students (
        student_id int, barcode text, last_name text, first_name text, email text, address_type text,
                street1 text, street2 text, city text, province text, country text, postal_code text, phone
                text, profile int, ident_type int, home_ou int, claims_returned_count int DEFAULT 0, usrname text,
        net_access_level int DEFAULT 2, password text
    );

    --Copy records from your import text file
    COPY students (student_id, last_name, first_name, email, address_type, street1, street2, city, province,
        country, postal_code, phone, password)
        FROM '/home/opensrf/patrons.csv' WITH CSV HEADER;

    --Insert records from the staging table into the actor.usr table.
    INSERT INTO actor.usr (
        profile, usrname, email, passwd, ident_type, ident_value, first_given_name, family_name,
        day_phone, home_ou, claims_returned_count, net_access_level)
        SELECT profile, students.usrname, email, password, ident_type, student_id, first_name,
        last_name, phone, home_ou, claims_returned_count, net_access_level FROM students;

    --Insert records from the staging table into the actor.usr table.
    INSERT INTO actor.card (usr, barcode)
        SELECT actor.usr.id, students.barcode
        FROM students
                INNER JOIN actor.usr
                        ON students.usrname = actor.usr.usrname;

    --Update actor.usr.card field with actor.card.id to associate active card with the user:
    UPDATE actor.usr
        SET card = actor.card.id
        FROM actor.card
        WHERE actor.card.usr = actor.usr.id;

    --INSERT records INTO actor.usr_address from staging table.
    INSERT INTO actor.usr_address (usr, street1, street2, city, state, country, post_code)
        SELECT actor.usr.id, students.street1, students.street2, students.city, students.province,
        students.country, students.postal_code
        FROM students
        INNER JOIN actor.usr ON students.usrname = actor.usr.usrname;

   --Update actor.usr mailing address with id from actor.usr_address table.:
    UPDATE actor.usr
        SET mailing_address = actor.usr_address.id, billing_address = actor.usr_address.id
        FROM actor.usr_address
        WHERE actor.usr.id = actor.usr_address.usr;

    COMMIT;

Placing the sql statements between BEGIN; and COMMIT; creates a transaction block so that if any sql statements fail, the entire process is canceled and the database is rolled back to its original state. Lines beginning with — are comments to let you you what each sql statement is doing and are not processed.

13.2. Batch Updating Patron Data

For academic libraries, doing batch updates to add new patrons to the Evergreen database is a critical task. The above procedures and import script can be easily adapted to create an update script for importing new patrons from external databases. If the data import file contains only new patrons, then, the above procedures will work well to insert those patrons. However, if the data load contains all patrons, a second staging table and a procedure to remove existing patrons from that second staging table may be required before importing the new patrons. Moreover, additional steps to update address information and perhaps delete inactive patrons may also be desired depending on the requirements of the institution.

After developing the scripts to import and update patrons have been created, another important task for library staff is to develop an import strategy and schedule which suits the needs of the library. This could be determined by registration dates of your institution in the case of academic libraries. It is important to balance the convenience of patron loads and the cost of processing these loads vs staff adding patrons manually.

Chapter 14. Migrating from a legacy system

When you migrate to Evergreen, you generally want to migrate the bibliographic records and copy information that existed in your previous library system. For anything more than a few thousand records, you should import the data directly into the database rather than use the tools in the staff client. While the data that you can extract from your legacy system varies widely, this section assumes that you or members of your team have the ability to write scripts and are comfortable working with SQL to manipulate data within PostgreSQL. If so, then the following section will guide you towards a method of generating common data formats so that you can then load the data into the database in bulk.

14.1. Making electronic resources visible in the catalog

Electronic resources generally do not have any call number or copy information associated with them, and Evergreen enables you to easily make bibliographic records visible in the public catalog within sections of the organizational unit hierarchy. For example, you can make a set of bibliographic records visible only to specific branches that have purchased licenses for the corresponding resources, or you can make records representing publicly available electronic resources visible to the entire consortium.

Therefore, to make a record visible in the public catalog, modify the records using your preferred MARC editing approach to ensure the 856 field contains the following information before loading records for electronic resources into Evergreen:

Table 14.1. 856 field for electronic resources: indicators and subfields

Attribute
Value
Note

Indicator 1

4

Indicator 2

0 or 1

Subfield u

URL for the electronic resource

Subfield y

Text content of the link

Subfield z

Public note

Normally displayed after the link

Subfield 9

Organizational unit short name

The record will be visible when a search is performed specifying this organizational unit or one of its children. You can repeat this subfield as many times as you need.

Once your electronic resource bibliographic records have the required indicators and subfields for each 856 field in the record, you can proceed to load the records using either the command-line bulk import method or the MARC Batch Importer in the staff client.

14.2. Migrating your bibliographic records

Convert your MARC21 binary records into the MARCXML format, with one record per line. You can use the following Python script to achieve this goal; just install the pymarc library first, and adjust the values of the input and output variables as needed.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import codecs
import pymarc

input = 'records_in.mrc'
output = 'records_out.xml'

reader = pymarc.MARCReader(open(input, 'rb'), to_unicode=True)
writer = codecs.open(output, 'w', 'utf-8')
for record in reader:
    record.leader = record.leader[:9] + 'a' + record.leader[10:]
    writer.write(pymarc.record_to_xml(record) + "\n")

Once you have a MARCXML file with one record per line, you can load the records into your Evergreen system via a staging table in your database.

Connect to the PostgreSQL database using the psql command. For example:

psql -U <user-name> -h <hostname> -d <database>

Create a staging table in the database. The staging table is a temporary location for the raw data that you will load into the production table or tables. Issue the following SQL statement from the psql command line, adjusting the name of the table from staging_records_import, if desired:

CREATE TABLE staging_records_import (id BIGSERIAL, dest BIGINT, marc TEXT);

Create a function that will insert the new records into the production table and update the dest column of the staging table. Adjust "staging_records_import" to match the name of the staging table that you plan to create when you issue the following SQL statement:

CREATE OR REPLACE FUNCTION staging_importer() RETURNS NULL AS $$
DECLARE stage RECORD;
BEGIN
FOR stage IN SELECT * FROM staging_records_import ORDER BY id LOOP
      INSERT INTO biblio.record_entry (marc, last_xact_id) VALUES (stage.marc, 'IMPORT');
      UPDATE staging_records_import SET dest = currval('biblio.record_entry_id_seq');
   END LOOP;
  END;
  $$ LANGUAGE plpgsql;

Load the data from your MARCXML file into the staging table using the COPY statement, adjusting for the name of the staging table and the location of your MARCXML file:

COPY staging_records_import (marc) FROM '/tmp/records_out.xml';

Load the data from your staging table into the production table by invoking your staging function:

SELECT staging_importer();

When you leave out the id value for a BIGSERIAL column, the value in the column automatically increments for each new record that you add to the table.

Once you have loaded the records into your Evergreen system, you can search for some known records using the staff client to confirm that the import was successful.

14.3. Migrating your call numbers, copies, and parts

Holdings, comprised of call numbers, copies, and parts, are the set of objects that enable users to locate and potentially acquire materials from your library system.

Call numbers connect libraries to bibliographic records. Each call number has a label associated with a classification scheme such as a the Library of Congress or Dewey Decimal systems, and can optionally have either or both a label prefix and a label suffix. Label prefixes and suffixes do not affect the sort order of the label.

Copies connect call numbers to particular instances of that resource at a particular library. Each copy has a barcode and must exist in a particular copy location. Other optional attributes of copies include circulation modifier, which may affect whether that copy can circulate or for how long it can circulate, and OPAC visibility, which controls whether that particular copy should be visible in the public catalog.

Parts provide more granularity for copies, primarily to enable patrons to place holds on individual parts of a set of items. For example, an encyclopedia might be represented by a single bibliographic record, with a single call number representing the label for that encyclopedia at a given library, with 26 copies representing each letter of the alphabet, with each copy mapped to a different part such as A, B, C, … Z.

To migrate this data into your Evergreen system, you will create another staging table in the database to hold the raw data for your materials from which the actual call numbers, copies, and parts will be generated.

Begin by connecting to the PostgreSQL database using the psql command. For example:

psql -U <user-name> -h <hostname> -d <database>

Create the staging materials table by issuing the following SQL statement:

CREATE TABLE staging_materials (
  bibkey BIGINT,  -- biblio.record_entry_id
  callnum TEXT, -- call number label
  callnum_prefix TEXT, -- call number prefix
  callnum_suffix TEXT, -- call number suffix
  callnum_class TEXT, -- classification scheme
  create_date DATE,
  location TEXT, -- shelving location code
  item_type TEXT, -- circulation modifier code
  owning_lib TEXT, -- org unit code
  barcode TEXT, -- copy barcode
  part TEXT
);

For the purposes of this example migration of call numbers, copies, and parts, we assume that you are able to create a tab-delimited file containing values that map to the staging table properties, with one copy per line. For example, the following 5 lines demonstrate how the file could look for 5 different copies, with non-applicable attribute values represented by \N, and 3 of the copies connected to a single call number and bibliographic record via parts:

1   QA 76.76 A3 \N  \N  LC  2012-12-05  STACKS  BOOK    BR1 30007001122620  \N
2   GV 161 V8   Ref.    Juv.    LC  2010-11-11  KIDS    DVD BR2 30007005197073  \N
3   AE 5 E363 1984  \N  \N      LC  1984-01-10  REFERENCE   BOOK    BR1 30007006853385  A
3   AE 5 E363 1984  \N  \N      LC  1984-01-10  REFERENCE   BOOK    BR1 30007006853393  B
3   AE 5 E363 1984  \N  \N      LC  1984-01-10  REFERENCE   BOOK    BR1 30007006853344  C

Once your holdings are in a tab-delimited format—which, for the purposes of this example, we will name holdings.tsv--you can import the holdings file into your staging table. Copy the contents of the holdings file into the staging table using the COPY SQL statement:

COPY staging_items (bibkey, callnum, callnum_prefix,
  callnum_suffix, callnum_class, create_date, location,
  item_type, owning_lib, barcode, part) FROM 'holdings.tsv';

Generate the copy locations you need to represent your holdings:

INSERT INTO asset.copy_location (name, owning_lib)
  SELECT DISTINCT location, 1 FROM staging_materials
  WHERE NOT EXISTS (
    SELECT 1 FROM asset.copy_location
    WHERE name = location
  );

Generate the circulation modifiers you need to represent your holdings:

INSERT INTO config.circ_modifier (code, name, description, sip2_media_type)
  SELECT DISTINCT circmod, circmod, circmod, '001'
  FROM staging_materials
  WHERE NOT EXISTS (
    SELECT 1 FROM config.circ_modifier
    WHERE circmod = code
  );

Generate the call number prefixes and suffixes you need to represent your holdings:

INSERT INTO asset.call_number_prefix (owning_lib, label)
  SELECT DISTINCT aou.id, callnum_prefix
  FROM staging_materials sm
    INNER JOIN actor.org_unit aou
      ON aou.shortname = sm.owning_lib
  WHERE NOT EXISTS (
    SELECT 1 FROM asset.call_number_prefix acnp
    WHERE callnum_prefix = acnp.label
      AND aou.id = acnp.owning_lib
  ) AND callnum_prefix IS NOT NULL;

INSERT INTO asset.call_number_suffix (owning_lib, label)
  SELECT DISTINCT aou.id, callnum_suffix
  FROM staging_materials sm
    INNER JOIN actor.org_unit aou
      ON aou.shortname = sm.owning_lib
  WHERE NOT EXISTS (
    SELECT 1 FROM asset.call_number_suffix acns
    WHERE callnum_suffix = acns.label
      AND aou.id = acns.owning_lib
  ) AND callnum_suffix IS NOT NULL;

Generate the call numbers for your holdings:

INSERT INTO asset.call_number (
  creator, editor, record, owning_lib, label, prefix, suffix, label_class
)
  SELECT DISTINCT 1, 1, bibkey, aou.id, callnum, acnp.id, acns.id,
  CASE WHEN callnum_class = 'LC' THEN 1
             WHEN callnum_class = 'DEWEY' THEN 2
  END
  FROM staging_materials sm
    INNER JOIN actor.org_unit aou
      ON aou.shortname = owning_lib
    INNER JOIN asset.call_number_prefix acnp
      ON COALESCE(acnp.label, '') = COALESCE(callnum_prefix, '')
    INNER JOIN asset.call_number_suffix acns
      ON COALESCE(acns.label, '') = COALESCE(callnum_suffix, '')
;

Generate the copies for your holdings:

INSERT INTO asset.copy (
  circ_lib, creator, editor, call_number, location,
 loan_duration, fine_level, barcode
)
  SELECT DISTINCT aou.id, 1, 1, acn.id, acl.id, 2, 2, barcode
  FROM staging_materials sm
    INNER JOIN actor.org_unit aou
      ON aou.shortname = sm.owning_lib
    INNER JOIN asset.copy_location acl
      ON acl.name = sm.location
    INNER JOIN asset.call_number acn
      ON acn.label = sm.callnum
  WHERE acn.deleted IS FALSE
;

Generate the parts for your holdings. First, create the set of parts that are required for each record based on your staging materials table:

INSERT INTO biblio.monograph_part (record, label)
  SELECT DISTINCT bibkey, part
  FROM staging_materials sm
  WHERE part IS NOT NULL AND NOT EXISTS (
    SELECT 1 FROM biblio.monograph_part bmp
    WHERE sm.part = bmp.label
      AND sm.bibkey = bmp.record
  );

Now map the parts for each record to the specific copies that you added:

INSERT INTO asset.copy_part_map (target_copy, part)
  SELECT DISTINCT acp.id, bmp.id
  FROM staging_materials sm
    INNER JOIN asset.copy acp
      ON acp.barcode = sm.barcode
    INNER JOIN biblio.monograph_part bmp
      ON bmp.record = sm.bibkey
  WHERE part IS NOT NULL
    AND part = bmp.label
    AND acp.deleted IS FALSE
    AND NOT EXISTS (
    SELECT 1 FROM asset.copy_part_map
    WHERE target_copy = acp.id
      AND part = bmp.id
  );

At this point, you have loaded your bibliographic records, call numbers, call number prefixes and suffixes, copies, and parts, and your records should be visible to searches in the public catalog within the appropriate organization unit scope.

Chapter 15. Importing materials in the staff client

Evergreen exists to connect users to the materials represented by bibliographic records, call numbers, and copies — so getting these materials into your Evergreen system is vital to a successful system. There are two primary means of getting materials into Evergreen:

The Evergreen staff client offers the MARC Batch Importer, which is a flexible interface primarily used for small batches of records;

Alternately, import scripts can load data directly into the database, which is a highly flexible but much more complex method of loading materials suitable for large batches of records such as the initial migration from your legacy library system.

15.1. Staff client batch record imports

The staff client has a utility for importing batches of bibliographic and copy records available through Cataloging > MARC Batch Import/Export. In addition to importing new records, this interface can be used to match incoming records to existing records in the database, add or overlay MARC fields in the existing record, and add copies to those records.

The MARC Batch Import interface may also be colloquially referred to as "Vandelay" in the Evergreen community, referring to this interface’s internals in the system.You will also see this name used in several places in the editor. For instance, when you click on the Record Match Sets, the title on the screen will be Vandelay Match Sets.

15.1.1. When to use the MARC Batch Importer

When importing in batches of up to 500 to 1,000 records.

When you need the system to match those incoming records to existing records and overlay or add fields to the existing record.

When you need to add copies to existing records in the system.

The MARC Batch Importer should only be used for importing copies that already have barcodes and call numbers. Use Acquisitions > Load MARC Order Records to add on-order copies that do not yet have barcodes and call numbers.

15.1.2. Record Match Sets

Click the Record Match Sets button to identify how Evergreen should match incoming records to existing records in the system.

These record match sets can be used when importing records through the MARC Batch Importer or when importing order records through the Acquisitions Load MARC Order Records interface.

Common match points used when creating a match set include:

MARC tag 020a (ISBN)

MARC tag 022a (ISSN)

MARC tag 024a (UPC)

MARC tag 028a (Publisher number)

15.1.3. Create Match Sets

On the Record Match Sets screen, click New Match Set to create a set of record match points. Give the set a Name. Assign the Owning Library from the dropdown list. The Match Set Type should remain as biblio. Click Save.

If you don’t see your new set in the list, in the upper left corner of the staff client window, click the Reload button.

If you had to reload, click the Record Match Sets button to get back to that screen. Find your new set in the list and click its name. (The name will appear to be a hyperlink.) This will bring you to the Vandelay Match Set Editor.

Create an expression that will define the match points for the incoming record. You can choose from two areas to create a match: Record Attribute (MARC fixed fields) or MARC Tag and Subfield. You can use the Boolean operators AND and OR to combine these elements to create a match set.

When adding a Record Attribute or MARC tag/subfield, you also can enter a Match Score. The Match Score indicates the relative importance of that match point as Evergreen evaluates an incoming record against an existing record. You can enter any integer into this field. The number that you enter is only important as it relates to other match points.

Recommended practice is that you create a match score of one (1) for the least important match point and assign increasing match points to the power of 2 to working points in increasing importance. . After creating a match point, drag the completed match point under the folder with the appropriately-named Boolean folder under the Expression tree.

Click Save Changes to Expression.

15.1.4. Quality Metrics

Quality metrics provide a mechanism for Evergreen to measure the quality of records and to make importing decisions based on quality.

Metrics are configured in the match set editor.

Quality metrics are not required when creating a match set.

You can use a value in a record attribute (MARC fixed fields) or a MARC tag as your quality metric.

The encoding level record attribute can be one indicator of record quality.

15.1.5. Import Item Attributes

If you are importing copies with your records, you will need to map the data in your holdings tag to fields in the copy record. Click the Import Item Attributes button to map this information.

Click the New Definition button to create a new mapping for the holdings tag.

Use the Tag field to identify the MARC tag that contains your holdings information.

Add the subfields that contain specific copy information to the appropriate copy field.

Select the Keep box if Evergreen should keep this holdings tag in the record after it is imported. Otherwise, Evergreen will remove this holdings tag.

At a minimum, you should add a name for the definition, identify the MARC holdings tag, and add the subfields that identify the circulating library, the owning library, the call number and the barcode.

15.1.6. Overlay/Merge Profiles

If Evergreen finds a match for an incoming record in the database, you need to identify which fields should be replaced, which should be preserved, and which should be added to the record. Click the Merge/Overlay Profiles button to create a profile that contains this information.

These overlay/merge profiles can be used when importing records through the MARC Batch Importer or when importing order records through the Acquisitions Load MARC Order Records interface.

Evergreen comes pre-installed with two default profiles:

Default merge - No fields from incoming record are added to match. This profile is useful for item loads or for order record uploads.

Default overlay - Incoming record will replace existing record.

You can customize the overlay/merge behavior with a new profile by clicking the New Merge Profile button. Available options for handling the fields include:

Preserve specification - fields in the existing record that should be preserved.

Replace specification - fields in existing record that should be replaced by those in the incoming record.

Add specification - fields from incoming record that should be added to existing record (in addition to any already there.)

Remove specification - fields that should be removed from incoming record.

You can add multiple tags to these specifications, separating each tag with a comma.

15.1.7. Importing the records

After making the above configurations, you are now ready to import your records.

Click the Import Records button

Provide a unique name for the queue where the records will be loaded

Identify the match set that should be used for matching

If you are importing copies, identify the Import Item Attributes definition in the Holdings Import Profile

Select a record source

Select the overlay/merge profile that defines which fields should be replaced, added or preserved

Identify which records should be imported, the options are:

Import Non-Matching Records will automatically import records that have no match in the system

Merge on Exact Match will automatically import records that match on the 901c (record ID)

Merge on Single Match will automatically import records when there is only one match in the system

Merge on Best Match will automatically import records for the best match in the system; the best match will be determined by the combined total of the records match point scores

You do not need to select any of these import options at this step. You may also opt to review the records first in the import queue and then import them.

Best Single Match Minimum Quality Ratio should only be changed if quality metrics were used in the match set

Set to 0.0 to import a record regardless of record quality

Set to 1.0 if the incoming record must be of equal or higher quality than the existing record to be imported

Set to 1.1 if the incoming record must be of higher quality than the existing record to be imported

Insufficient Quality Fall-Through Profile can also be used with quality metrics. If an incoming record does not meet the standards of the minimum quality ratio, you can identify a back-up merge profile to be used for those records. For example, you may want to use the default overlay profile for high-quality records but use the default merge profile for lower quality records.

Chapter 16. Ordering materials

Acquisitions allows you to order materials, track the expenditure of your collections funds, track invoices and set up policies for manual claiming. In this chapter, we’re going to be describing how to use the most essential functions of acquisitions in the Evergreen system.

16.1. When should libraries use acquisitions?

When you want to track spending of your collections budget.

When you want to use Evergreen to place orders electronically with your vendors.

When you want to import large batches of records to quickly get your on-order titles into the system.

If your library simply wants to add on-order copies to the catalog so that patrons can view and place holds on titles that have not yet arrived, acquisitions may be more than you need. Adding those on-order records via cataloging is a simpler option that works well for this use case.

Below are the basic administrative settings to be configured to get started with acquisitions. At a minimum, a library must configure Funding Sources, Funds, and Providers to use acquisitions.

16.2. Managing Funds

16.2.1. Funding Sources (Required)

Funding sources allow you to specify the sources that contribute monies to your fund(s). You can create as few or as many funding sources as you need. These can be used to track exact amounts for accounts in your general ledger.

Example funding sources might be:

A municipal allocation for your materials budget;

A trust fund used for collections;

A revolving account that is used to replace lost materials;

Grant funds to be used for collections.

Funding sources are not tied to fiscal or calendar years, so you can continue to add money to the same funding source over multiple years, e.g. County Funding. Alternatively, you can name funding sources by year, e.g. County Funding 2010 and County Funding 2011, and apply credits each year to the matching source.

To create a funding source, select Admin > Server Administration > Acquisitions > Funding Source. Click the New Funding Source button. Give the funding source a name, an owning library, and code. You should also identify the type of currency that is used for the fund.

You must add money to the funding source before you can use it. Click the hyperlinked name of the funding source and then click the Apply Credit button. Add the amount of funds you need to add. The Note field is optional.

16.2.2. Funds (Required)

Funds allow you to allocate credits toward specific purchases. They typically are used to track spending and purchases for specific collections. Some libraries may choose to define very broad funds for their collections (e.g. children’s materials, adult materials) while others may choose to define more specific funds (e.g. adult non-fiction DVDs for BR1).

If your library does not wish to track fund accounting, you can create one large generic fund and use that fund for all of your purchases.

To create a fund, select Admin > Server Administration > Acquisitions > Funds. Click the New Fund button. Give the fund a name and code.

The Year can either be the fiscal or calendar year for the fund.

If you are a multi-branch library that will be ordering titles for multiple branches, you should select the system as the owning Org Unit, even if this fund will only be used for collections at a specific branch. If you are a one-branch library or if your branches do their own ordering, you can select the branch as the owning Org Unit.

Select the Currency Type that will be used for this fund.

You must select the Active checkbox to use the fund.

Enter a Balance Stop Percent. The balance stop percent prevents you from making purchases when only a specified amount of the fund remains. For example, if you want to spend 95 percent of your funds, leaving a five percent balance in the fund, then you would enter 95 in the field. When the fund reaches its balance stop percent, it will appear in red when you apply funds to copies.

Enter a Balance Warning Percent. The balance warning percent gives you a warning that the fund is low. You can specify any percent. For example, if you want to spend 90 percent of your funds and be warned when the fund has only 10 percent of its balance remaining, then enter 90 in the field. When the fund reaches its balance warning percent, it will appear in yellow when you apply funds to copies.

Check the Propagate box to propagate funds. When you propagate a fund, the system will create a new fund for the following fiscal year with the same parameters as your current fund. All of the settings transfer except for the year and the amount of money in the fund. Propagation occurs during the fiscal year close-out operation.

Check the Rollover box if you want to roll over remaining encumbrances and funds into the same fund next year. If you need the ability to roll over encumbrances without rolling over funds, go to the Library Settings Editor (Admin > Local Administration > Library Settings Editor) and set Allow funds to be rolled over without bringing the money along to True.

You must add money to the fund before you can begin using it. Click the hyperlinked name of the fund. Click the Create Allocation button. Select a Funding Source from which the allocation will be drawn and then enter an amount for the allocation. The Note field is optional.

16.2.3. Fund Tags (Optional)

You can apply tags to funds so that you can group funds for easy reporting. For example, you have three funds for children’s materials: Children’s Board Books, Children’s DVDs, and Children’s CDs. Assign a fund tag of children’s to each fund. When you need to report on the amount that has been spent on all children’s materials, you can run a report on the fund tag to find total expenditures on children’s materials rather than reporting on each individual fund.

To create a fund tag, select Admin > Server Administration > Acquisitions > Fund Tags. Click the the New Fund Tag button. Select a owning library and add the name for the fund tag.

To apply a fund tag to a fund, select Admin > Server Administration > Acquisitions > Funds. Click on the hyperlinked name for the fund. Click the Tags tab and then click the Add Tag button. Select the tag from the dropdown menu.

16.3. Ordering

16.3.1. Providers (Required)

Providers are the vendors from whom you order titles.

To add a provider record, select Admin > Server Administration > Acquisitions > Providers.

Enter information about the provider. At a minimum, you need to add a Provider Name, Code, Owner, and Currency. You also need to select the Active checkbox to use the provider.

16.3.2. Distribution Formulas (Optional)

If you are ordering for a multi-branch library system, distribution formulas are a useful way to specify the number of copies that should be distributed to specific branches and copy locations.

To create a distribution formula, select Admin > Server Administration > Acquisitions > Distribution Formulas. Click the New Formula button. Enter the formula name and select the owning library. Ignore the Skip Count field.

Click New Entry. Select an Owning Library from the drop down menu. This indicates the branch that will receive the items.

Select a Shelving Location from the drop down menu.

In the Item Count field, enter the number of items that should be distributed to that branch and copy location. You can enter the number or use the arrows on the right side of the field.

Keep adding entries until the distribution formula is complete.

16.3.3. Helpful acquisitions Library Settings

There are several acquisitions Library Settings available that will help with acquisitions workflow. These settings can be found at Admin > Local Administration > Library Settings Editor.

Default circulation modifier - Automatically applies a default circulation modifier to all of your acquisitions copies. Useful if you use a specific circulation modifier for on-order copies.

Default copy location - Automatically applies a default copy location (e.g. On Order) to acquisitions copies.

Temporary barcode prefix - Applies a unique prefix to the barcode that is automatically generated during the acquisitions process.

Temporary call number prefix - Applies a unique prefix to the start of the call number that is automatically generated during the acquisitions process.

16.3.4. Preparing for order record loading

If your library is planning to upload order records in a batch, you need to add some information to your provider records so that Evergreen knows how to map the copy data contained in the order record.

Retrieve the record for the provider that has supplied the order records by selecting Admin > Server Administration > Acquisitions > Providers. Click on the hyperlinked Provider name.

In the top frame, add the MARC tag that contains your holdings data in the Holdings Tag field (this tag can also be entered at the time you create the provider record.)

To map the tag’s subfields to the appropriate copy data, click the Holding Subfield tab. Click the New Holding Subfield button and select the copy data that you are mapping. Add the subfield that contains that data and click Save.

If your vendor is sending other data in a MARC tag that needs to be mapped to a field in acquisitions, you can do so by clicking the Attribute Definitions tab. As an example, if you need to import the PO Name, you could set up an attribute definition by adding an XPath similar to:

code => purchase_order
xpath => //*[@tag="962"]/*[@code="p"]
Is Identifier => false

where 962 is the holdings tag and p is the subfield that contains the PO Name.

16.3.5. Preparing to send electronic orders from Evergreen

If your library wants to transmit electronic order information to a vendor, you will need to configure your server to use EDI. You need to install the EDI translator and EDI scripts on your server by following the instructions in the Evergreen 2.3 documentation. (http://docs.evergreen-ils.org/2.3/_installation.html)

Configure your provider’s EDI information by selecting Admin > Server Administration > Acquisitions > EDI Accounts. Give the account a name in the Label box.

Host is the vendor-assigned FTP/SFTP/SSH hostname.

Username is the vendor-assigned FTP/SFTP/SSH username.

Password is the vendor-assigned FTP/SFTP/SSH password.

Account is the vendor-assigned account number associated with your organization.

Owner is the organizational unit who owns the EDI account

Last Activity is the date of last activity for the account

Provider is a link to the codes for the Provider record.

Path is the path on the vendor’s server where Evergreen will send its outgoing .epo files.

Incoming Directory is the path on the vendor’s server where incoming .epo files are stored.

Vendor Account Number is the Vendor assigned account number.

Vendor Assigned Code is usually a sub-account designation. It can be used with or without the Vendor Account Number.

You now need to add this EDI Account and the SAN code to the provider’s record.

Select Admin > Server Administration > Acquisitions > Providers.

Click the hyperlinked Provider name.

Select the account you just created in the EDI Default field.

Add the vendor-provided SAN code to the SAN field.

The last step is to add your library’s SAN code to Evergreen.

Select Admin > Server Administration > Organizational Units.

Select your library from the organizational hierarchy in the left pane.

Click the Addresses tab and add your library’s SAN code to the SAN field.

Chapter 17. Designing your catalog

When people want to find things in your Evergreen system, they will check the catalog. In Evergreen, the catalog is made available through a web interface, called the OPAC (Online Public Access Catalog). In the latest versions of the Evergreen system, the OPAC is built on a set of programming modules called the Template Toolkit. You will see the OPAC sometimes referred to as the TPAC.

In this chapter, we’ll show you how to customize the OPAC, change it from its default configuration, and make it your own.

17.1. Configuring and customizing the public interface

The public interface is referred to as the TPAC or Template Toolkit (TT) within the Evergreen community. The template toolkit system allows you to customize the look and feel of your OPAC by editing the template pages (.tt2) files as well as the associated style sheets.

17.1.1. Locating the default template files

The default URL for the TPAC on a default Evergreen system is http://localhost/eg/opac/home (adjust localhost to match your hostname or IP address).

The default template file is installed in /openils/var/templates/opac.

You should generally avoid touching the installed default template files, unless you are contributing changes for Evergreen to adopt as a new default. Even then, while you are developing your changes, consider using template overrides rather than touching the installed templates until you are ready to commit the changes to a branch. See below for information on template overrides.

17.1.2. Mapping templates to URLs

The mapping for templates to URLs is straightforward. Following are a few examples, where <templates> is a placeholder for one or more directories that will be searched for a match:

http://localhost/eg/opac/home ⇒ /openils/var/<templates>/opac/home.tt2

http://localhost/eg/opac/advanced ⇒ /openils/var/<templates>/opac/advanced.tt2

http://localhost/eg/opac/results ⇒ /openils/var/<templates>/opac/results.tt2

The template files themselves can process, be wrapped by, or include other template files. For example, the home.tt2 template currently involves a number of other template files to generate a single HTML file.

Example Template Toolkit file: opac/home.tt2.

[%  PROCESS "opac/parts/header.tt2";
    WRAPPER "opac/parts/base.tt2";
    INCLUDE "opac/parts/topnav.tt2";
    ctx.page_title = l("Home") %]
    <div id="search-wrapper">
      [% INCLUDE "opac/parts/searchbar.tt2" %]
    </div>
    <div id="content-wrapper">
        <div id="main-content-home">
             <div class="common-full-pad"></div>
             [% INCLUDE "opac/parts/homesearch.tt2" %]
             <div class="common-full-pad"></div>
        </div>
     </div>
[% END %]

Note that file references are relative to the top of the template directory.

17.1.3. How to override template files

Overrides for template files or TPAC pages go in a directory that parallels the structure of the default templates directory. The overrides then get pulled in via the Apache configuration.

The following example demonstrates how to create a file that overrides the default "Advanced search page" (advanced.tt2) by adding a new templates_custom directory and editing the new file in that directory.

bash$ mkdir -p /openils/var/templates_custom/opac
bash$ cp /openils/var/templates/opac/advanced.tt2 \
         /openils/var/templates_custom/opac/.
bash$ vim /openils/var/templates_custom/opac/advanced.tt2

17.1.4. Configuring the custom templates directory in Apache’s eg.conf

You now need to teach Apache about the new custom template directory. Edit /etc/apache2/sites-available/eg.conf and add the following <Location /eg> element to each of the <VirtualHost> elements in which you want to include the overrides. The default Evergreen configuration includes a VirtualHost directive for port 80 (HTTP) and another one for port 443 (HTTPS); you probably want to edit both, unless you want the HTTP user experience to be different from the HTTPS user experience.

<VirtualHost *:80>
    # <snip>

    # - absorb the shared virtual host settings
    Include eg_vhost.conf
    <Location /eg>
        PerlAddVar OILSWebTemplatePath "/openils/var/templates_custom"
    </Location>

    # <snip>
</VirtualHost>

Finally, reload the Apache configuration to pick up the changes. You should now be able to see your change at http://localhost/eg/opac/advanced where localhost is the hostname of your Evergreen server.

17.1.5. Adjusting colors for your public interface

You may adjust the colors of your public interface by editing the colors.tt2 file. The location of this file is in /openils/var/templates/opac/parts/css/colors.tt2. When you customize the colors of your public interface, remember to create a custom file in your custom template folder and edit the custom file and not the file located in you default template.

17.1.6. Adjusting fonts in your public interface

Font sizes can be changed in the colors.tt2 file located in /openils/var/templates/opac/parts/css/. Again, create and edit a custom template version and not the file in the default template.

Other aspects of fonts such as the default font family can be adjusted in /openils/var/templates/opac/css/style.css.tt2.

17.1.7. Media file locations in the public interface

The media files (mostly PNG images) used by the default TPAC templates are stored in the repository in Open-ILS/web/images/ and installed in /openils/var/web/images/.

17.1.8. Changing some text in the public interface

Out of the box, TPAC includes a number of placeholder text and links. For example, there is a set of links cleverly named Link 1, Link 2, and so on in the header and footer of every page in TPAC. Here is how to customize that for a custom templates skin.

To begin with, find the page(s) that contain the text in question. The simplest way to do that is with the grep -s command. In the following example, search for files that contain the text "Link 1":

bash$ grep -r "Link 1" /openils/var/templates/opac
/openils/var/templates/opac/parts/topnav_links.tt2
4:            <a href="http://example.com">[% l('Link 1') %]</a>

Next, copy the file into our overrides directory and edit it with vim.

Copying the links file into the overrides directory.

bash$ cp /openils/var/templates/opac/parts/topnav_links.tt2 \
/openils/var/templates_custom/opac/parts/topnav_links.tt2
bash$ vim /openils/var/templates_custom/opac/parts/topnav_links.tt2

Finally, edit the link text in opac/parts/header.tt2. Content of the opac/parts/header.tt2 file.

<div id="gold-links-holder">
    <div id="gold-links">
        <div id="header-links">
            <a href="http://example.com">[% l('Link 1') %]</a>
            <a href="http://example.com">[% l('Link 2') %]</a>
            <a href="http://example.com">[% l('Link 3') %]</a>
            <a href="http://example.com">[% l('Link 4') %]</a>
            <a href="http://example.com">[% l('Link 5') %]</a>
        </div>
    </div>
</div>

For the most part, the page looks like regular HTML, but note the [%(" ")%]_ that surrounds the text of each link. The [% … %] signifies a TT block, which can contain one or more TT processing instructions. l(" … "); is a function that marks text for localization (translation); a separate process can subsequently extract localized text as GNU gettext-formatted PO (Portable Object) files.

As Evergreen supports multiple languages, any customization to Evergreen’s default text must use the localization function. Also, note that the localization function supports placeholders such as [_1], [_2] in the text; these are replaced by the contents of variables passed as extra arguments to the l() function.

Once the link and link text has been edited to your satisfaction, load the page in a Web browser and see the live changes immediately.

17.1.9. Adding and removing MARC fields from the record details display page

It is possible to add and remove the MARC fields and subfields displayed in the record details page. In order to add MARC fields to be displayed on the details page of a record, you will need to map the MARC code to variables in the /openils/var/templates/opac/parts/misc_util.tt2 file.

For example, to map the template variable args.pubdates to the date of publication MARC field 260, subfield c, add these lines to misc_util.tt2:

args.pubdates = [];
FOR sub IN xml.findnodes('//*[@tag="260"]/*[@code="c"]');
    args.pubdates.push(sub.textContent);
END;
args.pubdate = (args.pubdates.size) ? args.pubdates.0 : ''

You will then need to edit the /openils/var/templates/opac/parts/record/summary.tt2 file in order to get the template variable for the MARC field to display.

For example, to display the date of publication code you created in the misc_util.tt2 file, add these lines:

[% IF attrs.pubdate; %]
    <span itemprop="datePublished">[% attrs.pubdate | html; %]</span>
[% END; %]

You can add any MARC field to your record details page. Moreover, this approach can also be used to display MARC fields in other pages, such as your results page.

17.2. Setting the default physical location for your library environment

physical_loc is an Apache environment variable that sets the default physical location, used for setting search scopes and determining the order in which copies should be sorted. This variable is set in /etc/apache2/sites-available/eg.conf. The following example demonstrates the default physical location being set to library ID 104:

SetEnv physical_loc 104

17.3. Setting a default language and adding optional languages

OILSWebLocale adds support for a specific language. Add this variable to the Virtual Host section in /etc/apache2/sites-available/eg.conf.

OILSWebDefaultLocale specifies which locale to display when a user lands on a page in TPAC and has not chosen a different locale from the TPAC locale picker. The following example shows the fr_ca locale being added to the locale picker and being set as the default locale:

PerlAddVar OILSWebLocale "fr_ca"
PerlAddVar OILSWebLocale "/openils/var/data/locale/fr-CA.po"
PerlAddVar OILSWebDefaultLocale "fr-CA"

Below is a table of the currently supported languages packaged with Evergreen:

Language
Code
PO file

Czech

cs_cz

/openils/var/data/locale/cs-CZ.po

English - Canada

en_ca

/openils/var/data/locale/en-CA.po

English - Great Britain

en_gb

/openils/var/data/locale/en-GB.po

*English - United States

en_us

not applicable

French - Canada

fr_ca

/openils/var/data/locale/fr-CA.po

Portuguese - Brazil

pt_br

/openils/var/data/locale/pt_BR.po

Russian

ru_ru

/openils/var/data/locale/ru_RU.po

*American English is built into Evergreen so you do not need to set up this language and there are no PO files.

17.4. Editing the formats select box options in the search interface.

You may wish to remove, rename or organize the options in the formats select box. This can be accomplished from the staff client.

From the staff client, navigate to Admin > Server Administration > Marc Coded Value Maps

Select Type from the Record Attribute Type select box.

Double click on the format type you wish to edit.

To change the label for the type, enter a value in the Search Label field.

To move the option to a top list separated by a dashed line from the others, check the Is Simple Selector check box.

To hide the type so that it does not appear in the search interface, uncheck the OPAC Visible checkbox.

Changes will be immediate.

17.5. Adding and removing search fields in advanced search

It is possible to add and remove search fields on the advanced search page by editing the opac/parts/config.tt2 file in your template directory. Look for this section of the file:

search.adv_config = [
    {adv_label => l("Item Type"), adv_attr => ["mattype", "item_type"]},
    {adv_label => l("Item Form"), adv_attr => "item_form"},
    {adv_label => l("Language"),  adv_attr => "item_lang"},
    {adv_label => l("Audience"),  adv_attr => ["audience_group", "audience"], adv_break => 1},
    {adv_label => l("Video Format"), adv_attr => "vr_format"},
    {adv_label => l("Bib Level"), adv_attr => "bib_level"},
    {adv_label => l("Literary Form"), adv_attr => "lit_form", adv_break => 1},
    {adv_label => l("Search Library"), adv_special => "lib_selector"},
    {adv_label => l("Publication Year"), adv_special => "pub_year"},
    {adv_label => l("Sort Results"), adv_special => "sort_selector"},
];

For example, if you delete the line:

{adv_label => l("Language"),  adv_attr => "item_lang"},

the language field will no longer appear on your advanced search page. Changes will appear immediately after you save your changes.

17.6. Changing the display of facets and facet groups

Facets can be reordered on the search results page by editing the opac/parts/config.tt2 file in your template directory.

Edit the following section of config.tt2, changing the order of the facet categories according to your needs:

facet.display = [
    {facet_class => 'author',  facet_order => ['personal', 'corporate']},
    {facet_class => 'subject', facet_order => ['topic']},
    {facet_class => 'series',  facet_order => ['seriestitle']},
    {facet_class => 'subject', facet_order => ['name', 'geographic']}
];

You may also change the default number of facets appearing under each category by editing the facet.default_display_count value in config.tt2. The default value is 5.

17.7. Including external content to you public interface

The public interface allows you to include external services and content in your public interface. These can include book cover images, user reviews, table of contents, summaries, author notes, annotations, user suggestions, series information among other services. Some of these services are free while others require a subscription.

The following are some of the external content services which you can configure in Evergreen.

17.7.1. OpenLibrary

The default install of Evergreen includes OpenLibrary book covers. The settings for this are controlled by the <added_content> section of /openils/conf/opensrf.xml. Here are the key elements of this configuration:

<module>OpenILS::WWW::AddedContent::OpenLibrary</module>

This section calls the OpenLibrary perl module. If you wish to link to a different book cover service other than OpenLibrary, you must refer to the location of the corresponding Perl module. You will also need to change other settings accordingly.

<timeout>1</timeout>

Max number of seconds to wait for an added content request to return data. Data not returned within the timeout is considered a failure.

<retry_timeout>600</retry_timeout>

This setting is the amount of time to wait before we try again.

<max_errors>15</max_errors>

Maximum number of consecutive lookup errors a given process can have before added content lookups are disabled for everyone. To adjust the site of the cover image on the record details page edit the config.tt2 file and change the value of the record.summary.jacket_size. The default value is "medium" and the available options are "small", "medium" and "large."

17.7.2. ChiliFresh

ChiliFresh is a subscription-based service which allows book covers, reviews and social interaction of patrons to appear in your catalog. To activate ChiliFresh, you will need to open the Apache configuration file /etc/apache2/eg_vhost.conf and edit several lines:

Uncomment (remove the "#" at the beginning of the line) and add your ChiliFresh account number:

#SetEnv OILS_CHILIFRESH_ACCOUNT

Uncomment this line and add your ChiliFresh Profile:

#SetEnv OILS_CHILIFRESH_PROFILE

Uncomment the line indicating the location of the Evergreen JavaScript for ChiliFresh:

#SetEnv OILS_CHILIFRESH_URL http://chilifresh.com/on-site /js/evergreen.js

Uncomment the line indicating the secure URL for the Evergreen JavaScript :

#SetEnv OILS_CHILIFRESH_HTTPS_URL https://secure.chilifresh.com/on-site/js/evergreen.js

17.7.3. Content Café

Content Café is a subscription-based service that can add jacket images, reviews, summaries, tables of contents and book details to your records.

In order to activate Content Café, edit the /openils/conf/opensrf.xml file and change the <module> element to point to the ContentCafe Perl Module:

<module>OpenILS::WWW::AddedContent::ContentCafe</module>

To adjust settings for Content Café, edit a couple of fields with the <ContentCafe> Section of /openils/conf/opensrf.xml.

Edit the userid and password elements to match the user id and password for your Content Café account.

Change the return_behavior_on_no_jacket_image to set the behavior of your service when an image is not available for an item. By default this value is set to T which will result in a small image with the text "No Image Available" in place of a book cover. If you set this value to 1 a 1X1 blank image will be in place of a book cover.

17.7.4. Google Analytics

Google Analytics is a free service to collect statistics for your Evergreen site. In order to use Google Analytics you will first need to set up the service from the Google Analytics website at http://www.google.com/analytics/. To activate Google Analytics you will need to edit config.tt2 in your template. To enable the service set the value of google_analytics.enabled to true and change the value of google_analytics.code to be the code in your Google Analytics account.

17.7.5. NoveList

Novelist is a subscription-based service providing reviews and recommendation for books in you catalog. To activate your Novelist service in Evergreen, open the Apache configuration file /etc/apache2/eg_vhost.conf and edit the line:

#SetEnv OILS_NOVELIST_URL

You should use the URL provided by NoveList.

17.7.6. RefWorks

RefWorks is a subscription-based online bibliographic management tool. If you have a RefWorks subscription, you can activate RefWorks in Evergreen by editing the config.tt2 file located in your template directory. You will need to set the ctx.refworks.enabled value to true. You may also set the RefWorks URL by changing the ctx.refworks.url setting on the same file.

17.7.7. SFX OpenURL resolver

An OpenURL resolver allows you to find electronic resources and pull them into your catalog based on the ISBN or ISSN of the item. In order to use the SFX OpenURL resolver, you will need to subscribe to the Ex Libris SFX service. To activate the service in Evergreen edit the config.tt2 file in your template. Enable the resolver by changing the value of openurl.enabled to true and change the openurl.baseurl setting to point to the URL of your OpenURL resolver.

17.7.8. Syndetic Solutions

Syndetic Solutions is a subscription service providing book covers and other data for items in your catalog. In order to activate Syndetic, edit the /openils/conf/opensrf.xml file and change the <module> element to point to the Syndetic Perl Module:

<module>OpenILS::WWW::AddedContent::Syndetic</module>

You will also need to edit the <userid> element to be the user id provided to you by Syndetic.

Then, you will need to uncomment and edit the <base_url> element so that it points to the Syndetic service:

<base_url>http://syndetics.com/index.aspx</base_url>

For changes to be activated for your public interface you will need to restart Evergreen and Apache.

17.8. Troubleshooting TPAC errors

If there is a problem such as a TT syntax error, it generally shows up as an ugly server failure page. If you check the Apache error logs, you will probably find some solid clues about the reason for the failure. For example, in the following example, the error message identifies the file in which the problem occurred as well as the relevant line numbers.

Example error message in Apache error logs:

bash# grep "template error" /var/log/apache2/error_log
[Tue Dec 06 02:12:09 2011] [warn] [client 127.0.0.1] egweb: template error:
 file error - parse error - opac/parts/record/summary.tt2 line 112-121:
  unexpected token (!=)\n  [% last_cn = 0;\n        FOR copy_info IN
  ctx.copies;\n            callnum = copy_info.call_number_label;\n

Chapter 18. Borrowing items: who, what, for how long

Circulation policies pull together user, library, and item data to determine how library materials circulate, such as: which patrons, from what libraries can borrow what types of materials, for how long, and with what overdue fines.

Individual elements of the circulation policies are configured using specific interfaces, and should be configured prior to setting up the circulation policies.

18.1. Data elements that affect your circulation policies

There are a few data elements which must be considered when setting up your circulation policies.

18.1.1. Copy data

Several fields set via the copy editor are commonly used to affect the circulation of an item.

Circulation modifier - Circulation modifiers are fields used to control circulation policies on specific groups of items. They can be added to copies during the cataloging process. New circulation modifiers can be created in the staff client by navigating to Admin > Server Administration > Circulation Modifiers.

Circulate? flag - The circulate? flag in the copy editor can be set to False to disallow an item from circulating.

Reference? flag - The reference? flag in the copy editor can also be used as a data element in circulation policies.

18.1.2. Copy Locations

To get to the Copy Locations Editor, navigate to Admin > Local Administration > Copy Locations Editor.

When setting up copy locations for your library you can set an entire copy location to allow or disallow circulation.

Copy locations can also be used as a data element in circulation policies.

18.1.3. User Permission Group

The user permission group is also commonly used as a data element in circulation policies.

Other user data that can be used for circulation policies include the juvenile flag in the user record.

18.2. Circulation Rules

Loan duration describes the length of time for a checkout. You can also identify the maximum renewals that can be placed on an item.

You can find Circulation Duration Rules by navigating to Admin > Server Administration > Circulation Duration Rules.

Recurring fine describes the amount assessed for daily and hourly fines as well as fines set for other regular intervals. You can also identify any grace periods that should be applied before the fine starts accruing.

You can find Recurring Fine Rules by navigating to Admin > Server Administration > Circulation Recurring Fine Rules.

Max fine describes the maximum amount of fines that will be assessed for a specific circulation. Set the Use Percent field to True if the maximum fine should be a percentage of the item’s price.

You can find Circ Max Fine Rules by navigating to Admin > Server Administration > Circulation Max Fine Rules.

These rules generally cause the most variation between organizational units.

Loan duration and recurring fine rate are designed with 3 levels: short, normal, and extended loan duration, and low, normal, and high recurring fine rate. These values are applied to specific items, when copy records are created.

When naming these rules, give them a name that clearly identifies what the rule does. This will make it easier to select the correct rule when creating your circ policies.

18.2.1. Circulation Limit Sets

Circulation Limit Sets allow you to limit the maximum number of copies for different types of materials that a patron can check out at one time. Evergreen supports creating these limits based on circulation modifiers, copy locations, or circ limit groups, which allow you to create limits based on MARC data. The below instructions will allow you to create limits based on circulation modifiers.

Configure the circulation limit sets by selecting Admin > Local Administration > Circulation Limit Sets.

Items Out - the maximum number of items circulated to a patron at the same time.

Depth - Enter the Min Depth, or the minimum depth, in the org tree that Evergreen will consider as valid circulation libraries for counting items out. The min depth is based on org unit type depths. For example, if you want the items in all of the circulating libraries in your consortium to be eligible for restriction by this limit set when it is applied to a circulation policy, then enter a zero (0) in this field.

Global - Check the box adjacent to Global Flag if you want all of the org units in your consortium to be restricted by this limit set when it is applied to a circulation policy. Otherwise, Evergreen will only apply the limit to the direct ancestors and descendants of the owning library.

Linked Limit Groups - add any circulation modifiers, copy locations, or circ limit groups that should be part of this limit set.

Example Your library (BR1) allows patrons to check out up to 5 videos at one time. This checkout limit should apply when your library’s videos are checked out at any library in the consortium. Items with DVD, BLURAY, and VHS circ modifiers should be included in this maximum checkout count.

To create this limit set, you would add 5 to the Items Out field, 0 to the Depth field and select the Global Flag. Add the DVD, BLURAY and VHS circ modifiers to the limit set.

18.3. Creating Circulation Policies

Once you have identified your data elements that will drive circulation policies and have created your circulation rules, you are ready to begin creating your circulation policies.

If you are managing a small number of rules, you can create and manage circulation policies in the staff client via Admin > Local Administration > Circulation Policies. However, if you are managing a large number of policies, it is easier to create and locate rules directly in the database by updating config.circ_matrix_matchpoint.

The config.circ_matrix_matchpoint table is central to the configuration of circulation parameters. It collects the main set of data used to determine what rules apply to any given circulation. It is useful for us to think of their columns in terms of match columns, those that are used to match the particulars of a given circulation transaction, and result columns, those that return the various parameters that are applied to the matching transaction.

Circulation policies by checkout library or owning library?

If your policies should follow the rules of the library that checks out the item, select the checkout library as the Org Unit(org_unit).

If your policies should follow the rules of the library that owns the item, select the consortium as the Org Unit (org_unit) and select the owning library as the Copy Circ Lib (copy_circ_lib).

Renewal policies can be created by setting Renewals? (is_renewal) to True.

You can apply the duration rules, recurring fine rules, maximum fine rules, and circulation sets created in the above sets when creating the circulation policy.

18.3.1. Best practices for creating policies

Start by replacing the default consortium-level circ policy with one that contains a majority of your libraries' duration, recurring fine, and max fine rules. This first rule will serve as a default for all materials and permission groups.

If many libraries in your consortium have rules that differ from the default for particular materials or people, set a consortium-wide policy for that circ modifier or that permission group.

After setting these consortium defaults, if a library has a circulation rule that differs from the default, you can then create a rule for that library. You only need to change the parameters that are different from the default parameters. The rule will inherit the values for the other parameters from that default consortium rule.

Try to avoid unnecessary repetition.

Try to get as much agreement as possible among the libraries in your consortium.

Example 1

In this example, the consortium has decided on a 21_day_2_renew loan rule for general materials, i.e. books, etc. Most members do not charge overdue fines. System 1 charges 25 cents per day to a maximum of $3.00, but otherwise uses the default circulation duration.

Example 2

This example includes a basic set of fields and creates a situation where items with a circ modifier of "book" or "music" can be checked out, but "dvd" items will not circulate. The associated rules would apply during checkouts.

Example 3

This example builds on the earlier example and adds some more complicated options.

It is still true that "book" and "music" items can be checked out, while "dvd" is not circulated. However, now we have added new rules that state that "Adult" patrons of "SYS1" can circulate "dvd" items.

18.3.2. Settings Relevant to Circulation

The following circulation settings, available via Admin > Local Administration > Library Settings Editor, can also affect your circulation duration, renewals and fine policy.

Auto-Extend Grace Periods - When enabled, grace periods will auto-extend. By default this will be only when they are a full day or more and end on a closed date, though other options can alter this.

Auto-Extending Grace Periods extend for all closed dates - If enabled and Grace Periods auto-extending is turned on, grace periods will extend past all closed dates they intersect, within hard-coded limits.

Auto-Extending Grace Periods include trailing closed dates - If enabled and Grace Periods auto-extending is turned on, grace periods will include closed dates that directly follow the last day of the grace period.

Checkout auto renew age - When an item has been checked out for at least this amount of time, an attempt to check out the item to the patron that it is already checked out to will simply renew the circulation.

Cap Max Fine at Item Price - This prevents the system from charging more than the item price in overdue fines.

Charge fines on overdue circulations when closed - Normally, fines are not charged when a library is closed. When set to True, fines will be charged during scheduled closings and normal weekly closed days.

Chapter 19. TPac Configuration and Customization

19.1. Template toolkit documentation

For more general information about template toolkit see: official documentation.

The purpose of this chapter is to focus on the Evergreen-specific uses of Template Toolkit (TT) in the OPAC.

19.2. TPAC URL

The URL for the TPAC on a default Evergreen system is http://localhost/eg/opac/home (adjust localhost to match your hostname or IP address, naturally!)

19.3. Perl modules used directly by TPAC

Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm

Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm

Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Container.pm

Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Record.pm

Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Search.pm

Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Util.pm

19.4. Default templates

The source template files are found in Open-ILS/src/templates/opac.

These template files are installed in /openils/var/templates/opac.

NOTE. You should generally avoid touching the installed default template files, unless you are contributing changes that you want Evergreen to adopt as a new default. Even then, while you are developing your changes, consider using template overrides rather than touching the installed templates until you are ready to commit the changes to a branch. See below for information on template overrides.

19.5. Apache configuration files

The base Evergreen configuration file on Debian-based systems can be found in /etc/apache2/sites-enabled/eg.conf. This file defines the basic virtual host configuration for Evergreen (hostnames and ports), then single-sources the bulk of the configuration for each virtual host by including /etc/apache2/eg_vhost.conf.

19.6. TPAC CSS and media files

The CSS files used by the default TPAC templates are stored in the repo in Open-ILS/web/css/skin/default/opac/ and installed in /openils/var/web/css/skin/default/opac/.

The media files—mostly PNG images—used by the default TPAC templates are stored in the repo in Open-ILS/web/images/ and installed in /openils/var/web/images/.

19.7. Mapping templates to URLs

The mapping for templates to URLs is straightforward. Following are a few examples, where <templates> is a placeholder for one or more directories that will be searched for a match:

http://localhost/eg/opac/home ⇒ /openils/var/<templates>/opac/home.tt2

http://localhost/eg/opac/advanced ⇒ /openils/var/<templates>/opac/advanced.tt2

http://localhost/eg/opac/results ⇒ /openils/var/<templates>/opac/results.tt2

The template files themselves can process, be wrapped by, or include other template files. For example, the home.tt2 template currently involves a number of other template files to generate a single HTML file:

Example Template Toolkit file: opac/home.tt2. 

[%  PROCESS "opac/parts/header.tt2";
    WRAPPER "opac/parts/base.tt2";
    INCLUDE "opac/parts/topnav.tt2";
    ctx.page_title = l("Home") %]
    <div id="search-wrapper">
        [% INCLUDE "opac/parts/searchbar.tt2" %]
    </div>
    <div id="content-wrapper">
        <div id="main-content-home">
            <div class="common-full-pad"></div>
            [% INCLUDE "opac/parts/homesearch.tt2" %]
            <div class="common-full-pad"></div>
        </div>
    </div>
[% END %]

We will dissect this example in some more detail later, but the important thing to note is that the file references are relative to the top of the template directory.

19.8. How to override templates

Overrides for templates go in a directory that parallels the structure of the default templates directory. The overrides then get pulled in via the Apache configuration.

In the following example, we demonstrate how to create a file that overrides the default "Advanced search page" (advanced.tt2) by adding a new templates directory and editing the new file in that directory.

Adding an override for the Advanced search page (example). 

bash$ mkdir -p /openils/var/templates_custom/opac
bash$ cp /openils/var/templates/opac/advanced.tt2 \
         /openils/var/templates_custom/opac/.
bash$ vim /openils/var/templates_custom/opac/advanced.tt2

We now need to teach Apache about the new templates directory. Open eg.conf and add the following <Location /eg> element to each of the <VirtualHost> elements in which you want to include the overrides. The default Evergreen configuration includes a VirtualHost directive for port 80 (HTTP) and another one for port 443 (HTTPS); you probably want to edit both, unless you want the HTTP user experience to be different from the HTTPS user experience.

Configuring the custom templates directory in Apache’s eg.conf. 

<VirtualHost *:80>
    # <snip>

    # - absorb the shared virtual host settings
    Include eg_vhost.conf
    <Location /eg>
        PerlAddVar OILSWebTemplatePath "/openils/var/templates_algoma"
    </Location>

    # <snip>
</VirtualHost>

Finally, reload the Apache configuration to pick up the changes:

Reloading the Apache configuration. 

bash# /etc/init.d/apache2 reload

You should now be able to see your change at http://localhost/eg/opac/advanced

19.8.1. Defining multiple layers of overrides

You can define multiple layers of overrides, so if you want every library in your consortium to have the same basic customizations, and then apply library-specific customizations, you can define two template directories for each library.

In the following example, we define the template_CONS directory as the set of customizations to apply to all libraries, and template_BR# as the set of customizations to apply to library BR1 and BR2.

As the consortial customizations apply to all libraries, we can add the extra template directory directly to eg_vhost.conf:

Apache configuration for all libraries (eg_vhost.conf). 

# Templates will be loaded from the following paths in reverse order.
PerlAddVar OILSWebTemplatePath "/openils/var/templates"
PerlAddVar OILSWebTemplatePath "/openils/var/templates_CONS"

Then we define a virtual host for each library to add the second layer of customized templates on a per-library basis. Note that for the sake of brevity we only show the configuration for port 80.

Apache configuration for each virtual host (eg.conf). 

<VirtualHost *:80>
    ServerName br1.concat.ca
    DocumentRoot /openils/var/web/
    DirectoryIndex index.xml index.html index.xhtml
    Include eg_vhost.conf
    <Location /eg>
        PerlAddVar OILSWebTemplatePath "/openils/var/templates_BR1"
    </Location>
</VirtualHost>

<VirtualHost *:80>
    ServerName br2.concat.ca
    DocumentRoot /openils/var/web/
    DirectoryIndex index.xml index.html index.xhtml
    Include eg_vhost.conf
    <Location /eg>
        PerlAddVar OILSWebTemplatePath "/openils/var/templates_BR2"
    </Location>
</VirtualHost>

19.9. Changing some text in the TPAC

Out of the box, the TPAC includes a number of placeholder text and links. For example, there is a set of links cleverly named Link 1, Link 2, and so on in the header and footer of every page in the TPAC. Let’s customize that for our templates_BR1 skin.

To begin with, we need to find the page(s) that contain the text in question. The simplest way to do that is with the handy utility ack, which is much like grep but with built-in recursion and other tricks. On Debian-based systems, the command is ack-grep as ack conflicts with an existing utility. In the following example, we search for files that contain the text "Link 1":

Searching for text matching "Link 1". 

bash$ ack-grep "Link 1" /openils/var/templates/opac
/openils/var/templates/opac/parts/topnav_links.tt2
4:            <a href="http://example.com">[% l('Link 1') %]</a>

Next, we copy the file into our overrides directory and edit it with vim:

Copying the links file into the overrides directory. 

bash$ cp /openils/var/templates/opac/parts/topnav_links.tt2 \
         /openils/var/templates_BR1/opac/parts/topnav_links.tt2
bash$ vim /openils/var/templates_BR1/opac/parts/topnav_links.tt2

Finally, we edit the link text in opac/parts/header.tt2.

Content of the opac/parts/header.tt2 file. 

<div id="gold-links-holder">
    <div id="gold-links">
        <div id="header-links">
            <a href="http://example.com">[% l('Link 1') %]</a>
            <a href="http://example.com">[% l('Link 2') %]</a>
            <a href="http://example.com">[% l('Link 3') %]</a>
            <a href="http://example.com">[% l('Link 4') %]</a>
            <a href="http://example.com">[% l('Link 5') %]</a>
        </div>
    </div>
</div>

For the most part, the page looks like regular HTML, but note the [%_(" ")%] that surrounds the text of each link. The [% ... %] signifies a TT block, which can contain one or more TT processing instructions. l(" ... "); is a function that marks text for localization (translation); a separate process can subsequently extract localized text as GNU gettext-formatted PO files.

NOTE. As Evergreen supports multiple languages, any customizations to Evergreen’s default text must use the localization function. Also, note that the localization function supports placeholders such as [_1], [_2] in the text; these are replaced by the contents of variables passed as extra arguments to the l() function.

Once we have edited the link and link text to our satisfaction, we can load the page in our Web browser and see the live changes immediately (assuming we are looking at the BR1 overrides, of course).

19.10. Troubleshooting

If there is a problem such as a TT syntax error, it generally shows up as a an ugly server failure page. If you check the Apache error logs, you will probably find some solid clues about the reason for the failure. For example, in the following example the error message identifies the file in which the problem occurred as well as the relevant line numbers:

Example error message in Apache error logs. 

bash# grep "template error" /var/log/apache2/error_log
[Tue Dec 06 02:12:09 2011] [warn] [client 127.0.0.1] egweb: template error:
  file error - parse error - opac/parts/record/summary.tt2 line 112-121:
  unexpected token (!=)\n  [% last_cn = 0;\n        FOR copy_info IN
  ctx.copies;\n            callnum = copy_info.call_number_label;\n

Chapter 20. Creating a New Skin: the Bare Minimum

When you adopt the TPAC as your catalog, you must create a new skin. This involves a combination of overriding template files and setting Apache directives to control the look and feel of your customized TPAC.

20.1. Apache directives

There are a few Apache directives and environment variables of note for customizing TPAC behavior. These directives should generally live within a <vhost> section of your Apache configuration.

OILSWebDefaultLocale specifies which locale to display when a user lands on a page in the TPAC and has not chosen a different locale from the TPAC locale picker. The following example shows the fr_ca locale being added to the locale picker and being set as the default locale:

PerlAddVar OILSWebLocale "fr_ca"
PerlAddVar OILSWebLocale "/openils/var/data/locale/fr-CA.po"
PerlAddVar OILSWebDefaultLocale "fr-CA"

physical_loc is an Apache environment variable that sets the default physical location, used for setting search scopes and determining the order in which copies should be sorted. The following example demonstrates the default physical location being set to library ID 104:

SetEnv physical_loc 104

20.2. Customizing templates

When you install Evergreen, the TPAC templates include many placeholder images, text, and links. You should override most of these to provide your users with a custom experience that matches your library. Following is a list of templates that include placeholder images, text, or links that you should override.

All paths are relative to /openils/var/templates/opac

parts/config.tt2: contains many configuration settings that affect the behavior of the TPAC, including:

hiding the Place Hold button for available items

enabling RefWorks support for citation management

adding OpenURL resolution for electronic resources

enabling Google Analytics tracking for your TPAC

displaying the "Forgot your password?" prompt

controlling the size of cover art on the record details page

defining which facets to display, and in which order

controlling basic and advanced search options

parts/footer.tt2 and parts/topnav_links.tt2: contains customizable links. Defaults like Link 1 will not mean much to your users!

parts/homesearch.tt2: holds the large Evergreen logo on the home page of the TPAC. Substitute your library’s logo, or if you are adventurous, create a "most recently added items" carousel… and then share your customization with the Evergreen community.

parts/topnav_logo.tt2: holds the small Evergreen logo that appears on the top left of every page in the TPAC. You will also want to remove or change the target of the link that wraps the logo and leads to the Evergreen site.

parts/login/form.tt2: contains some assumptions about terminology and examples that you might prefer to change to be more consistent with your own site’s existing practices. For example, you may not use PIN at your library because you want to encourage users to use a password that is more secure than a four-digit number.

parts/login/help.tt2: contains links that point to http://example.com, images with text on them (which is not an acceptable practice for accessibility reasons), and promises of answers to frequently asked questions that might not exist at your site.

‘parts/login/password_hint.tt2`: contains a hint about your users’ password on first login that is misleading if your library does not set the initial password for an account to the last four digits of the phone number associated with the account.

parts/myopac/main_refund_policy.tt2: describes the policy for refunds for your library.

parts/myopac/prefs_hints.tt2: suggests that users should have a valid email on file so they can receive courtesy and overdue notices. If your library does not send out email notices, you should edit this to avoid misleading your users.

‘parts/css/fonts.tt2`: defines the font sizes for the TPAC in terms of one base font size, and all other sizes derived from that in percentages. The default is 12 pixels, but some design sites strongly suggest a base font size of 16 pixels. Perhaps you want to try 1em as a base to respect your users’ preferences. You only need to change one number in this file if you want to experiment with different options for your users.

parts/css/colors.tt2: chances are your library’s official colors do not match Evergreen’s wall of dark green. This file defines the colors in use in the standard Evergreen template. In theory you should be able to change just a few colors and everything will work, but in practice you will need to experiment to avoid light-gray-on-white low-contrast combinations.

Chapter 21. Auto Suggest in Catalog Search

The auto suggest feature suggestions for completing search terms as the user enters his search query. Ten suggestions are the default, but the number of suggestions is configurable at the database level. Scroll through suggestions with your mouse, or use the arrow keys to scroll through the suggestions. Select a suggestion to view records that are linked to this suggestion. This feature is not turned on by default. You must turn it on in the Admin module.

21.1. Enabling this Feature

To enable this feature, click Admin → Server Administration → Global Flags.

Scroll down to item 10, OPAC.

Double click anywhere in the row to edit the fields.

Check the box adjacent to Enabled to turn on the feature.

The Value field is optional. If you checked Enabled in step 4, and you leave this field empty, then Evergreen will only suggest searches for which there are any corresponding MARC records.

note: If you checked Enabled in step 4, and you enter the string, opac_visible, into this field, then Evergreen will suggest searches for which there are matching MARC records with copies within your search scope. For example, it will suggest MARC records with copies at your branch.

Click Save.

21.2. Using this Feature

Enter search terms into the basic search field. Evergreen will automatically suggest search terms.

Select a suggestion to view records that are linked to this suggestion.

Chapter 22. Customizing the Staff Client

22.1. Customizable Toolbar

By default, two toolbars are available in the staff client: circulation and cataloging. This feature enables you to customize toolbars in the staff client. You can create toolbars for specific org unit(s), workstation(s), or login(s).

22.1.1. Configure Toolbar

Click Admin → Workstation Administration → Toolbars → Configure Toolbars.

Click New Toolbar.

Enter label for toolbar.

Click Ok. .Select one of the buttons in the Available panel. The Button ID describes that action that the button will take, and the Label will display in the toolbar.

Click the -→ A button to add the selected function to the Selected panel on the bottom right side of the screen. To remove a button, click the ←-R button.

Continue adding buttons if desired. The buttons will display in the order that you add them. If you want to reorder the buttons, click the Up or Down buttons.

To separate buttons onto left and right sides of the screen on the same toolbar, select toolbarspacer, and click -→ A.

To add a dividing line between buttons that appear on the same side of the screen, select toolbarseparator, and click -→A.

At the bottom of the screen, choose the owner of this toolbar. If you click Owning Org Unit, then the owning org unit that you specify will display this toolbar. Select the owning org unit from the drop down menu. The rule of parental inheritance applies, so all child units will inherit the toolbars of their parental units. If you click Owning Workstation, then the workstation to which you are logged in when you created the toolbar will display this toolbar. If you select Owning User, then your login has access to that toolbar.

When you are finished creating the toolbar, click Save Toolbar. Any toolbar to which you have access displays under Admin → Workstation Administration → Toolbars → Current.

Permissions

ADMIN_TOOLBAR - Allow a user to create, edit, and delete custom toolbars

Part IV. Using the Staff Client

Chapter 23. Introduction

This part of the documentation deals with general Staff Client usage including logging in, navigation and shortcuts.

Chapter 24. Logging in to Evergreen

Select the Locale to match your language preference.

Enter the Hostname of the Evergreen server you are connecting.

Click Test Server to ensure that you are able to reach the server. You should see “200 : OK” indicated in green for Status and Version.

If Status indicates “There was an error testing this server”, check for a typo in the Hostname field or ask your administrator for the correct Hostname to use.

IF version indicates “404 Not Found”, the server does not support the version of your staff client. You will need to download the correct version or contact your system administrator.

If your server has a self-signed SSL certificate, you may need to click Add SSL Exception in order to login.

Enter your Username and Password and click Login.

If this is the first time you login from the workstation, you will need to register your workstation.

24.1. Standalone Interface

If your connection to Evergreen is lost, click Standalone Interface to circulate items or register patrons while connection is down.

24.2. Logging Out

There are several ways to end your Evergreen staff client session:

Click the Exit Evergreen button on the bottom of the login page.

Click the x at the top left of the login window.

Choose File → Quit Program from the menu of the application window.

Clicking the x on the application window (not the login window) will not exit Evergreen, but only close the window.

A new application window can be opened by clicking Open New Window from the login window.

Chapter 25. Tab Buttons

This feature enables you to add a new tab to the Evergreen staff client by clicking the + sign adjacent to the tab that you currently have opened. As in previous versions, you can also add new tabs by clicking File → New Tab, or use the hotkey, Ctrl+T.

Chapter 26. New Options for Double Clicking

26.1. Double Click to Retrieve a Patron’s Record

Click Search → Search for Patrons to access a patron’s record

Enter search terms.

Retrieve a list of possible matches. Double click on the record that you want to open.

26.2. Double Click to Retrieve Item Attributes

Enter search terms to retrieve a bibliographic record.

Click Actions for this Record → Holdings Maintenance.

Double click on an item.

The copy information will appear in a new tab.

Chapter 27. Patron Border Color Enhancement

This feature gives librarians new choices for color coding patron penalties.

In version 2.3, if the staff_alert column on the Standing Penalty Type is set to True and no other more serious penalty (as defined by the CSS) trumps it, then, when a patron incurs a penalty, a blue border will appear around the patron’s name.

For example, by default, the standing penalty type, ALERT_NOTE, has the staff_alert value set to TRUE. If I apply an alert to a user’s account, and no other penalty color takes precedence over it, then a blue border will appear around the patron’s name.

In addition, librarians now can customize the color coding on custom penalty types. For example, librarians can create a penalty type and, using the CSS classname PATRON_HAS_CUSTOM_PENALTY, apply a custom color box to the patron’s record.

Chapter 28. Sorting Columns

This feature enables you to sort display columns so that you can find easily the information that you need on a screen that contains multiple columns. You can sort display columns on any screen that is built on a grid, such as the Check In screen or the On Shelf Pull List.

You can also sort the columns on the following Administration screens: Circulation Policies, Hold Policies, Circulation Limit Sets, Barcode Completion, Acquisitions User Request List, and Vandelay Import Errors.

You can sort items in an ascending or descending order, and you can prioritize the order in which columns will sort. The following use cases illustrate how to sort items within the Circulation and Administration interfaces.

28.1. Sorting the On Shelf Pull List

You want to capture items that are on the shelf to fill current holds. To simplify this process, you will sort the items on the On Shelf Pull List by Copy Location and Call Number.

Click Circulation → Pull List for Hold Requests.

The first column that you want to sort is the column, Current Copy Location. Right click the column header, Current Copy Location.

Click Sort First (Descending).

The next column that you want to sort is the column, Call Number. Right click the column header, Call Number.

Click Sort Next (Ascending).

The pull list has now been sorted by copy location and call number.

If you wanted to sort more columns, you could continue the process by clicking Sort Next for any subsequent columns.

28.2. Sorting Circulation Policies

You want to sort the display of circulation policies in your staff client.

Click Administration → Local Administration → Circulation Policies.

Right click on any column header.

A pop-up box appears.

Check the Display box if you want to display a column in the staff client.

Check the Auto Width box if you want the width of the columns to adjust to fit the staff client.

Select a sort priority.

A sort priority of "0" indicates that no sorting has been applied. Columns will display in their default order.

A sort priority of "1" indicates that ascending sorting should be applied to this column first. Subsequent sorts will be applied as you continue to enter increasing numbers.

A sort priority of "-1" indicates that descending sorting should be applied to this column.

Click Save. The circulation policies will now sort according to your selections each time that you log into the staff client.

Chapter 29. Recent Staff Searches

This feature enables you to view your recent searches as you perform them in the staff client. The number of searches that you can view is configurable. This feature is only available through the staff client; it is not available to patrons in the OPAC.

29.1. Administrative Settings

By default, ten searches will be saved as you search the staff client. If you want to change the number of saved searches, then you can configure the number of searches that you wish to save through the Library Settings Editor in the Admin module.

To configure the number of recent staff searches:

Click Admin → Local Administration → Library Settings Editor.

Scroll to OPAC: Number of staff client saved searches to display on left side of results and record details pages

Click Edit.

Select a Context from the drop down menu.

Enter the number of searches that you wish to save in the Value field.

Click Update Setting

To retain this setting, the system administrator must restart the web server.

If you do not want to save any searches, then you can turn off this feature.

To deactivate this feature:

Follow steps 1-4 (one through four) as listed in the previous section.

In the value field, enter 0 (zero).

Click Update Setting. This will prevent you from viewing any saved searches.

29.2. Recent Staff Searches

Evergreen will save staff searches that are entered through either the basic or advanced search fields. To view recent staff searches:

Enter a search term in either the basic or advanced search fields.

Your search results for the current search will appear in the middle of the screen. The most recent searches will appear on the left side of the screen.

Chapter 30. Return to Search Results from MARC Record

This feature enables you to return to your title search results directly from any view of the MARC record, including the OPAC View, MARC Record, MARC Edit, and Holdings Maintenance. You can use this feature to page through records in the MARC Record View or Edit interfaces. You do not have to return to the OPAC View to access title results.

Chapter 31. Workstation Administration

31.1. Copy Editor: Copy Location Name First

By default, when editing item records, library code is displayed in front of shelving location in Shelving Location field. You may reverse the order by going to Admin → Workstation Administration → Copy Editor: Copy Location Name First. Simply click it to make copy location name displayed first. The setting is saved on the workstation.

31.2. Font and Sound Settings

You may change the size of displayed text or turn staff client sounds on and off. These settings are specific to each workstation and stored on local hard disk. They do not affect OPAC font sizes.

Select Admin → Workstation Administration → Global Font and Sound Settings.

To turn off the system sounds, like the noise that happens when a patron with a block is retrieved, check the disable sound box and click Save to Disk.

To change the size of the font, pick the desired option and click Save to Disk.

31.3. Select Hotkeys

All or partial hotkeys can be turned on or off. It can be done for a particular workstation:

Navigate to Admin → Workstation Administration → Hotkeys → Current.

Select Default, Minimal, and None.

Default: including all hotkeys

Minimal: including those hotkeys using CTRL key

None: excluding all hotkeys

Go back to the above menu.

Click Set Workstation Default to Current.

To clear the existing default click Clear Workstation Default.

You can use the Toggle Hotkeys button, included in some toolbars, on top right corner, to switch your selected Hotkeys on or off for the current login session. It has the same effect as when you click Disable Hotkeys on the Hotkeys menu.

31.4. Configure Printers

Use the Printer Settings Editor to configure printer output for each workstation. If left unconfigured Evergreen will use the default printer set in the workstation’s operating system (Windows, OSX, Ubuntu, etc).

Evergreen printing works best if you are using recent, hardware-specific printer drivers.

Select Admin → Workstation Administration → Printer Settings Editor.

Select the Printer Context. At a minimum set the Default context on each Evergreen workstation. Repeat the procedure for other contexts if they differ from the default (e.g. if spine labels should output to a different printer.

Default: Default settings for staff client print functions (set for each workstation).

Receipt: Settings for printing receipts.

Label: Printer settings for spine and pocket labels.

Mail: Settings for printing mailed notices (not yet active).

Offline: Applies to all printing from the Offline Interface.

After choosing Printer Context click Set Default Printer and Print Test Page and follow the prompts. If successful, test output will print to your chosen printer.

(optional) To further format or customize printed output click Page Settings and adjust settings. When finished click OK and print another test page to view changes.

31.4.1. Advanced Settings

If you followed the steps above and still cannot print there are two alternate print strategies:

DOS LPTI Print (sends unformatted text directly to the parallel port)

Custom/External Print (configuration required)

Evergreen cannot print using the Windows Generic/Text Only driver. If this driver is the only one available try one of the alternate print strategies instead.

31.5. Receipt Template Editor

There are many default receipt templates included with the Evergreen staff client. These templates are saved on individual workstations. Customization can be done workstation by workstation or by exporting the templates to import to other workstations.

Select Admin → Workstation Administration → Receipt Template Editor.

Select the checkout template from the dropdown menu.

This is what the default checkout template looks like. The template preview is on the left hand side. You can edit the Header, Line Item or Footer on the right hand side.

In the upper right hand corner you can see the available macros by clicking on the Macros button. A macro prints a real value from the database. In this example, the macro %LIBRARY% prints “Prince Rupert Library”. The macros that are available vary slightly between types of receipt templates (i.e. bills, holds, items).

Receipt templates are marked up with HTML tags. You may use most HTML tags. See http://www.w3schools.com/html/ for more information on HTML tags.

You may insert a link to an image, e.g. your library’s logo, that exists on the web. For example, to include the white Evergreen logo from this document, enter tag <img src=http://docs.evergreen-ils.org/2.3/media/small_logo_white.jpg>. in the receipt template.

There are several macros that can carry pre-built contents specific to individual libraries. The contents can be set up in local administration. For details see Library Settings. Though text can be hard-coded in receipt templates, the pre-built contents will be automatically applied to receipts printed from all workstations without editing each template.

%INCLUDE(notice_text)%

%INCLUDE(alert_text)%

%INCLUDE(event_text)%

%INCLUDE(footer_text)%%

%INCLUDE(header_text)%

Below are some example edits:

The above is the default Line Item in Checkout template. The macro %barcode% prints the item barcodes of the books that were checked out. The macro %due_date% prints the due date for each item that was checked out. You may add a line break between them: Barcode: %barcode% </br> Due: %due_date%

The receipt preview will look like this:

The due date can only be printed in the YYYY-MM-DD format.

Once you have the checkout template how you want it, click Save Locally to save the template to your computer.

31.5.1. Print Holds Slip with Landscape Layout

This feature enables you to use Mozilla-specific CSS to print holds with a landscape layout. To use the landscape layout:

Click Admin → Workstation Administration → Receipt Template Editor.

Select hold transit slip from the Template Name drop down menu.

Enter <div> before and after the block of text that you wish to rotate.

Enter the stylesheet text in the <div> bracket that appears before the block of text that you wish to rotate:

<div style="moz-transform: rotate(90deg);">

When you click out of this box, notice that the text in the Preview box on the left side of the screen has rotated 90 degrees.

You can further customize the look of the text by adjusting its height and width. The height and width that you specify will be unique to your printer. For example, you could add the following height and width to your rotated text:

<div style="moz-transform: rotate(90deg);height: 300px; width: 200px;">

The holds slip will print with the configured text in a landscape layout:

31.5.2. Exporting Templates

As you can only save a template on to the computer you are working on you will need to export the template if you have more than one computer that prints out receipts (e.g. more than one computers on the circulation desk, or another computer in the workroom that you use to checkin items or capture holds with).

Click on Export.

Select the location to save the template to, name the template, and click Save.

Click OK to confirm.

31.5.3. Importing Templates

Send the exported templates file to the workstation to which you want to import the templates. You may do it using memory stick or email, etc.

On Receipt Template Editor, Click Import.

Navigate to and select the template file that you want to import. Click Open.

Click OK to confirm on the prompt.

Click Save Locally.

By default all libraries use shared and hard-coded templates for Hold Slip and Transit Slip. Libraries can switch to using their own templates by setting up a library setting: Use legacy hardcoded receipts/slips. Details see Library Settings.

31.6. Button Bar/Toolbar

There is an optional toolbar with buttons providing quick access to commonly used staff client functions. When activated the toolbar appears below the menu bar.

The look of the buttons can be customized. Use Mode, Label Position and Icon Size on the Toolbar menu shown on the screen below to select your preference.

A group of buttons can be selected or activated by default for all workstations at a particular library (see Library Settings for details). A different default group can be set up on individual workstations by the following steps.

Go to Admin → Workstation Administration → Toolbars → Current.

Choose a group from the list.

Go back to the above menu. Select Set Workstation Default to Current. The above selected toolbar group is set as default for this workstation.

To clear an existing setting click Clear Workstation Default.

Circulation and Cataloguing are the default toolbar groups. Local system administrators can create new groups for individual accounts, workstations or all in a particular library.

Go to *Admin → Workstation Administration → Toolbars → Configure Toolbars.

Click New Toolbar

In the prompt window type in a name for the new group, and then click OK.

Choose the function buttons you want to add to the new group. Click -->(A) to add. You may select one in the Selected pane, and then click <--(R) to remove it.

Check one of the radio buttons: Owning Org Unit, Owning Workstation, or Owning User to specify the new group should be available to everyone/workstation in your library, or this workstation or yourself only.

If you chose Owning Workstation in the above step, click the down-pointed arrow at the end of the Permission Context box to select your library in the organization unit tree.

Click Save Toolbar.

The new toolbar group will be displayed together with Circulation and Cataloguing groups when you choose a toolbar group next time.

Part V. System Administration From the Staff Client

Chapter 32. Introduction

This part deals with the options in the Server Administration menu found in the staff client.

Chapter 33. Acquisitions Administration

33.1. Acquisitions Permissions in the Admin module

Several setting in the Library Settings area of the Admin module pertain to functions in the Acquisitions module. You can access these settings by clicking Admin → Local Administration →Library Settings Editor.

CAT: Delete bib if all copies are deleted via Acquisitions lineitem cancellation - If you cancel a line item, then all of the on order copies in the catalog are deleted. If, when you cancel a line item, you also want to delete the bib record, then set this setting to TRUE.

Default circulation modifier - This modifier would be applied to items that are created in the acquisitions module

Default copy location - This copy location would be applied to items that are created in the acquisitions module

Fund Spending Limit for Block - When the amount remaining in the fund, including spent money and encumbrances, goes below this percentage, attempts to spend from the fund will be blocked.

Fund Spending Limit for Warning - When the amount remaining in the fund, including spent money and encumbrances, goes below this percentage, attempts to spend from the fund will result in a warning to the staff.

Temporary barcode prefix - Temporary barcode prefix for items that are created in the acquisitions module

Temporary call number prefix - Temporary call number prefix for items that are created in the acquisitions module

33.2. Cancel/Suspend reasons

The Cancel reasons link enables you to predefine the reasons for which a line item or a PO can be cancelled. A default list of reasons appears, but you can add custom reasons to this list. Applying the cancel reason will prevent the item from appearing in a claims list and will allow you to cancel debits associated with the purchase. Cancel reasons also enable you to suspend or delay a purchase. For example, you could create a cancel reason of back ordered, and you could choose to keep the debits associated with the purchase.

33.2.1. Create a cancel/suspend reason

To add a new cancel reason, click Administration → Server Administration → Acquisitions → Cancel reasons.

Click New Cancel Reason.

Select a using library from the drop down menu. The using library indicates the organizational units whose staff can use this cancel reason. This menu is populated with the shortnames that you created for your libraries in the organizational units tree (See Admin → Server Administration → Organizational Units.)

Create a label for the cancel reason. This label will appear when you select a cancel reason on an item or a PO.

Create a description of the cancel reason. This is a free text field and can be comprised of any text of your choosing.

If you want to retain the debits associated with the cancelled purchase, click the box adjacent to Keep Debits→

Click Save.

33.3. Claiming

Currently, all claiming is manual, but the admin module enables you to build claim policies and specify the action(s) that users should take to claim items.

33.3.1. Create a claim policy

The claim policy link enables you to name the claim policy and specify the organization that owns it.

To create a claim policy, click Admin → Server Administration → Acquisitions → Claim Policies.

Create a claim policy name. No limits exist on the number of characters that can be entered in this field.

Select an org unit from the drop down menu. The org unit indicates the organizational units whose staff can use this claim policy. This menu is populated with the shortnames that you created for your libraries in the organizational units tree (See Admin → Server Administration → Organizational Units).

The rule of parental inheritance applies to this list.

Enter a description. No limits exist on the number of characters that can be entered in this field.

Click Save.

33.3.2. Create a claim type

The claim type link enables you to specify the reason for a type of claim.

To create a claim type, click Admin → Server Administration → Acquisitions → Claim types.

Create a claim type. No limits exist on the number of characters that can be entered in this field.

Select an org unit from the drop down menu. The org unit indicates the organizational units whose staff can use this claim type. This menu is populated with the shortnames that you created for your libraries in the organizational units tree (See Admin → Server Administration → Organizational Units).

The rule of parental inheritance applies to this list.

Enter a description. No limits exist on the number of characters that can be entered in this field.

Click Save.

33.3.3. Create a claim event type

The claim event type describes the physical action that should occur when an item needs to be claimed. For example, the user should notify the vendor via email that the library is claiming an item.

To access the claim event types, click Admin → Server Administration → Acquisitions →Claim event type.

Enter a code for the claim event type. No limits exist on the number of characters that can be entered in this field.

Select an org unit from the drop down menu. The org unit indicates the organizational units whose staff can use this event type. This menu is populated with the shortnames that you created for your libraries in the organizational units tree (See Admin → Server Administration → Organizational Units).

The rule of parental inheritance applies to this list.

Enter a description. No limits exist on the number of characters that can be entered in this field.

If this claim is initiated by the user, then check the box adjacent to Library Initiated.

Currently, all claims are initiated by a user. The ILS cannot automatically claim an issue.

Click Save.

33.3.4. Create a claim policy action

The claim policy action enables you to specify how long a user should wait before claiming the item.

To access claim policy actions, click Admin → Server Administration → Acquisitions →Claim Policy Actions.

Select an Action (Event Type) from the drop down menu.

Enter an action interval. This field indicates how long a user should wait before claiming the item.

In the Claim Policy ID field, select a claim policy from the drop down menu.

Click Save.

You can create claim cycles by adding multiple claim policy actions to a claim policy.

33.4. Currency Types

Currency types can be created and applied to funds in the administrative module. When a fund is applied to a copy or line item for purchase, the item will be purchased in the currency associated with that fund.

33.4.1. Create a currency type

To create a new currency type, click Admin → Server Administration → Acquisitions → Currency types.

Enter the currency code. No limits exist on the number of characters that can be entered in this field.

Enter the name of the currency type in Currency Label field. No limits exist on the number of characters that can be entered in this field.

Click Save.

33.4.2. Edit a currency type

To edit a currency type, click your cursor in the row that you want to edit. The row will turn blue.

Doubleclick. The popup box will appear, and you can edit the fields.

After making changes, click Save.

From the currency types interface, you can delete currencies that have never been applied to funds or used to make purchases.

33.5. Distribution Formulas

Distribution formulas allow you to specify the number of copies that should be distributed to specific branches. You can create and reuse formulas as needed.

33.5.1. Create a distribution formula

Click Admin → Server Administration → Acquisitions →Distribution Formulas.

Click New Formula.

Enter a Formula Name. No limits exist on the number of characters that can be entered in this field.

Choose a Formula Owner from the drop down menu. The Formula Owner indicates the organizational units whose staff can use this formula. This menu is populated with the shortnames that you created for your libraries in the organizational units tree (See Admin → Server Administration → Organizational Units).

The rule of parental inheritance applies to this list.

Ignore the Skip Count field which is currently not used.

Click Save.

Click New Entry.

Select an Owning Library from the drop down menu. This indicates the branch that will receive the items. This menu is populated with the shortnames that you created for your libraries in the organizational units tree (See Admin → Server Administration → Organizational Units).

Select a Shelving Location from the drop down menu.

In the Item Count field, enter the number of items that should be distributed to the branch. You can enter the number or use the arrows on the right side of the field.

Click Apply Changes. The screen will reload.

To view the changes to your formula, click Admin → Server Administration → Acquisitions → Distribution Formulas. The item_count will reflect the entries to your distribution formula.

To edit the Formula Name, click the hyperlinked name of the formula in the top left corner. A pop up box will enable you to enter a new formula name.

33.5.2. Edit a distribution formula

To edit a distribution formula, click the hyperlinked title of the formula.

33.6. EDI

Many libraries use Electronic Data Interchange (EDI) accounts to order new acquisitions. Users can set up EDI accounts and manage EDI messages in the admin module. EDI messages and notes can be viewed in the acquisitions module. See also the EDI Installation Instructions because this is required for use of EDI.

The following fields are required to create an EDI account:

host, username, password, path, and incoming directory.

33.6.1. EDI Accounts

Create EDI Accounts to communicate electronically with providers.

Create a label. The label allows you to differentiate between accounts for the same provider. No limits exist on the number of characters that can be entered in this field.

Enter a host. Your provider will provide you with the requisite FTP or SCP information.

Enter the username that has been supplied by your provider.

Enter the password that has been supplied by your provider.

Enter account information. This field enables you to add a supplemental password for entry to a remote system after log in has been completed. This field is optional for the ILS but may be required by your provider.

Select an owner from the drop down menu. The owner indicates the organizational units whose staff can use this EDI account. This menu is populated with the shortnames that you created for your libraries in the organizational units tree (See Admin → Server Administration → Organizational Units).

The rule of parental inheritance applies to this list.

The Last Activity updates automatically with any inbound or outbound communication.

Select a provider from the drop down menu to whom this account belongs.

Enter a path. The path indicates the remote location on the server from which files are pulled in to the ILS.

Enter the incoming directory. This directory indicates the location on your local network to which the files download.

Enter the vendor account number supplied by your provider.

Enter the vendor account code supplied by your provider.

Click Save.

33.6.2. EDI Messages

The EDI messages screen displays all incoming and outgoing messages between the library and the vendor.

33.7. Exchange Rates

Exchange rates define the rate of exchange between currencies. Evergreen will automatically calculate exchange rates for purchases. Evergreen assumes that the currency of the purchasing fund is identical to the currency of the provider, but it provides for two unique situations: If the currency of the fund that is used for the purchase is different from the currency of the provider as listed in the provider profile, then Evergreen will use the exchange rate to calculate the price of the item in the currency of the fund and debit the fund accordingly. When money is transferred between funds that use different currency types, Evergreen will automatically use the exchange rate to convert the money to the currency of the receiving fund. During such transfers, however, staff can override the automatic conversion by providing an explicit amount to credit to the receiving fund.

33.7.1. Create an exchange rate

To create a new exchange rate, click Admin → Server Administration → Acquisitions → Exchange Rates.

Click New Exchange Rate.

Enter the From Currency from the drop down menu populated by the currency types.

Enter the To Currency from the drop down menu populated by the currency types.

Enter the exchange Ratio.

Click Save.

33.7.2. Edit an Exchange Rate

Edit an exchange rate just as you would edit a currency type.

33.8. MARC Federated Search

The MARC Federated Search enables you to import bibliographic records into a selection list or purchase order from a Z39.50 source.

Click Acquisitions → MARC Federated Search.

Check the boxes of Z39.50 services that you want to search. Your local Evergreen Catalog is checked by default. Click Submit.

A list of results will appear. Click the Copies link to add copy information to the line item. See Line Item Feratures for more information.

Click the Notes link to add notes or line item alerts to the line item. See Line Item Feratures for more information.

Enter a price in the Estimated Price field.

You can save the line item(s) to a selection list by checking the box on the line item and clicking Actions → Save Items to Selection List. You can also create a purchase order from the line item(s) by checking the box on the line item and clicking Actions → Create Purchase Order.

33.9. Fund Tags

You can apply tags to funds so that you can group funds for easy reporting. For example, you have three funds for children’s materials: Children’s Board Books, Children’s DVDs, and Children’s CDs. Assign a fund tag of children’s to each fund. When you need to report on the amount that has been spent on all children’s materials, you can run a report on the fund tag to find total expenditures on children’s materials rather than reporting on each individual fund.

Create a Fund Tag

To create a fund tag, click Admin → Server Administration → Acquisitions → Fund Tags.

Click New Fund Tag. No limits exist on the number of characters that can be entered in this field.

Select a Fund Tag Owner from the drop down menu. The owner indicates the organizational unit(s) whose staff can use this fund tag. This menu is populated with the shortnames that you created for your libraries in the organizational units tree (See Admin → Server Administration → Organizational Units).

The rule of parental inheritance applies to this list.

Enter a Fund Tag Name. No limits exist on the number of characters that can be entered in this field.

Click Save.

33.10. Funding Sources

Funding sources allow you to specify the sources that contribute monies to your fund(s). You can create as few or as many funding sources as you need. These can be used to track exact amounts for accounts in your general ledger. You can then use funds to track spending and purchases for specific collections.

33.10.1. Create a funding source

To create a new funding source, click Admin → Server Administration → Acquisitions → Funding Source.

Enter a funding source name. No limits exist on the number of characters that can be entered in this field.

Select an owner from the drop down menu. The owner indicates the organizational unit(s) whose staff can use this funding source. This menu is populated with the shortnames that you created for your libraries in the organizational units tree (See Admin → Server Administration → Organizational Units).

The rule of parental inheritance applies to this list. For example, if a system is made the owner of a funding source, then users with appropriate permissions at the branches within the system could also use the funding source.

Create a code for the source. No limits exist on the number of characters that can be entered in this field.

Select a currency from the drop down menu. This menu is populated from the choices in the Currency Types interface.

Click Save.

33.10.2. Allocate Credits to Funding Sources

Apply a credit to this funding source.

Enter the amount of money that the funding source contributes to the organization. Funding sources are not tied to fiscal or calendar years, so you can continue to add money to the same funding source over multiple years, e.g. County Funding. Alternatively, you can name funding sources by year, e.g. County Funding 2010 and County Funding 2011, and apply credits each year to the matching source.

To apply a credit, click on the hyperlinked name of the funding source. The Funding Source Details will appear.

Click Apply Credit.

Enter an amount to apply to this funding source.

Enter a note. This field is optional.

Click Apply.

33.10.3. Allocate credits to funds

If you have already set up your funds, then you can then click the Allocate to Fund button to apply credits from the funding sources to the funds. If you have not yet set up your funds, or you need to add a new one, you can allocate credits to funds from the funds interface. See section 1.2 for more information.

To allocate credits to funds, click Allocate to Fund.

Enter the amount that you want to allocate.

Enter a note. This field is optional.

Click Apply.

33.10.4. Track Debits and Credits

You can track credits to and allocations from each funding source. These amounts are updated when credits and allocations are made in the Funding Source Details. Access the Funding Source Details by clicking on the hyperlinked name of the Funding Source.

33.11. Funds

Funds allow you to allocate credits toward specific purchases. In the funds interface, you can create funds; allocate credits from funding sources to funds; transfer money between funds; and apply fund tags to funds. Funds are created for a specific year, either fiscal or calendar. These funds are owned by org units. At the top of the funds interface, you can set a contextual org unit and year. The drop down menu at the top of the screen enables you to focus on funds that are owned by specific organizational units during specific years.

33.11.1. Create a fund

To create a new fund, click Admin → Server Administration → Acquisitions → Funds.

Enter a name for the fund. No limits exist on the number of characters that can be entered in this field.

Create a code for the fund. No limits exist on the number of characters that can be entered in this field.

Enter a year for the fund. This can be a fiscal year or a calendar year. The format of the year is YYYY.

Select an org unit from the drop down menu. The org unit indicates the organizational units whose staff can use this fund. This menu is populated with the shortnames that you created for your libraries in the organizational units tree (See Admin → Server Administration → Organizational Units).

The rule of parental inheritance applies to this list. See section

Select a currency type from the drop down menu. This menu is comprised of entries in the currency types menu. When a fund is applied to a line item or copy, the price of the item will be encumbered in the currency associated with the fund.

Click the Active box to activate this fund. You cannot make purchases from this fund if it is not active.

Enter a Balance Stop Percent. The balance stop percent prevents you from making purchases when only a specified amount of the fund remains. For example, if you want to spend 95 percent of your funds, leaving a five percent balance in the fund, then you would enter 95 in the field. When the fund reaches its balance stop percent, it will appear in red when you apply funds to copies.

Enter a Balance Warning Percent. The balance warning percent gives you a warning that the fund is low. You can specify any percent. For example, if you want to spend 90 percent of your funds and be warned when the fund has only 10 percent of its balance remaining, then enter 90 in the field. When the fund reaches its balance warning percent, it will appear in yellow when you apply funds to copies.

Check the Propagate box to propagate funds. When you propagate a fund, the ILS will create a new fund for the following fiscal year with the same parameters as your current fund. All of the settings transfer except for the year and the amount of money in the fund. Propagation occurs during the fiscal year close~out operation.

Check the Rollover box if you want to roll over remaining funds into the same fund next year.

Click Save.

33.11.2. Allocate Credits from Funding Sources to Funds

Credits can be applied to funds from funding sources using the fund interface. The credits that you apply to the fund can be applied later to purchases.

To access funds, click Admin → Server Administration → Acquisitions → Funds.

Click the hyperlinked name of the fund.

To add a credit to the fund, click the Create Allocation tab.

Choose a Funding Source from the drop down menu.

Enter an amount that you want to apply to the fund from the funding source.

Enter a note. This field is optional.

Click Apply.

33.11.3. Transfer credits between funds

The credits that you allocate to funds can be transferred between funds if desired. In the following example, you can transfer $500.00 from the Young Adult Fiction fund to the Children’s DVD fund.

To access funds, click Admin → Server Administration → Acquisitions → Funds.

Click the hyperlinked name of the originating fund.

The Fund Details screen appears. Click Transfer Money.

Enter the amount that you would like to transfer.

From the drop down menu, select the destination fund.

Add a note. This field is optional.

Click Transfer.

33.11.4. Track Balances and Expenditures

The Fund Details allows you to track the fund’s balance, encumbrances, and amount spent. It also allows you to track allocations from the funding source(s), debits, and fund tags.

To access the fund details, click on the hyperlinked name of the fund that you created.

The Summary allows you to track the following:

Balance - The balance is calculated by subtracting both items that have been invoiced and encumbrances from the total allocated to the fund.

Total Allocated - This amount is the total amount allocated from the Funding Source.

Spent Balance - This balance is calculated by subtracting only the items that have been invoiced from the total allocated to the fund. It does not include encumbrances.

Total Debits - The total debits are calculated by adding the cost of items that have been invoiced and encumbrances.

Total Spent - The total spent is calculated by adding the cost of items that have been invoiced. It does not include encumbrances.

Total Encumbered - The total encumbered is calculated by adding all encumbrances.

33.11.5. Core Source Added for Fund Reporting

A new core source, Fund Summary, has been added to the reports interface. This core source enables librarians to run easily a report on fund activity. Fields that are accessible in this interface include Remaining Balance, Total Allocated, Total Encumbered, and Total Spent.

33.11.6. Edit a Fund

Edit a fund just as you would edit a currency type.

33.11.7. Perform Year End Closeout Operation

The Year End Closeout Operation allows you to deactivate funds for the current year and create analogous funds for the next year. It transfers encumbrances to the analogous funds, and it rolls over any remaining funds if you checked the rollover box when creating the fund.

To access the year end closeout of a fund, click Admin → Server Administration → Acquisitions → Funds.

Click Fund Propagation and Rollover.

Check the box adjacent to Perform Fiscal Year Close~Out Operation.

Notice that the context org unit reflects the context org unit that you selected at the top of the Funds screen.

If you want to perform the close~out operation on the context org unit and its child units, then check the box adjacent to Include Funds for Descendant Org Units.

Check the box adjacent to dry run if you want to test changes to the funds before they are enacted. Evergreen will generate a summary of the changes that would occur during the selected operations. No data will be changed.

Click Process.

Evergreen will begin the propagation process. Evergreen will make a clone of each fund, but it will increment the year by 1.

33.12. Enhancements to Fiscal Rollover

An enhancement to the fiscal rollover process enables you to move a fund’s encumbrances from one year to the next without moving unspent money. Unused money is not added to the next year’s fund and is not available for use.

To enable this enhancement, you must configure a new org unit setting:

Click Administration → Local Administration → Library Settings Editor.

Search for the setting, Allow funds to be rolled over without bringing the money along.

Click Edit.

Set the value to True.

Click Update Setting.

Enabling this setting will display a new check box in the Fund Propagation & Rollover drop down menu. To use this feature during the fiscal rollover process, click the check box adjacent to Limit Fiscal Year Close-out Operation to Encumbrances.

33.13. Invoice menus

Invoice menus allow you to create drop down menus that appear on invoices. You can create an invoice item type or invoice payment method.

33.13.1. Invoice item type

The invoice item type allows you to enter the types of additional charges that you can add to an invoice. Examples of additional charge types might include taxes or processing fees. Charges for bibliographic items are listed separately from these additional charges. A default list of charge types displays, but you can add custom charge types to this list. Invoice item types can also be used when adding non~bibliographic items to a purchase order. When invoiced, the invoice item type will copy from the purchase order to the invoice.

To create a new charge type, click Admin → Server Administration → Acquisitions → Invoice Item Type.

Click New Invoice Item Type.

Create a code for the charge type. No limits exist on the number of characters that can be entered in this field.

Create a label. No limits exist on the number of characters that can be entered in this field. The text in this field appears in the drop down menu on the invoice.

If items on the invoice were purchased with the monies in multiple funds, then you can divide the additional charge across funds. Check the box adjacent to Prorate→ if you want to prorate the charge across funds.

Click Save.

33.13.2. Invoice payment method

The invoice payment method allows you to predefine the type(s) of invoices and payment method(s) that you accept. The text that you enter in the admin module will appear as a drop down menu in the invoice type and payment method fields on the invoice.

To create a new invoice payment method, click Admin → Server Administration → Acquisitions → Invoice Payment Method.

Click New Invoice Payment Method.

Create a code for the invoice payment method. No limits exist on the number of characters that can be entered in this field.

Create a name for the invoice payment method. No limits exist on the number of characters that can be entered in this field. The text in this field appears in the drop down menu on the invoice.

Click Save.

Payment methods can be deleted from this screen.

33.14. Line item features

Line item alerts are predefined text that can be added to line items that are on selection lists or purchase orders. You can define the alerts from which staff can choose. Line item alerts appear in a pop up box when the line item, or any of its copies, are marked as received.

33.14.1. Create a line item alert

To create a line item alert, click Administration → Server Administration → Acquisitions → Line Item Alerts.

Click New Line Item Alert Text.

Create a code for the text. No limits exist on the number of characters that can be entered in this field.

Create a description for the text. No limits exist on the number of characters that can be entered in this field.

Select an owning library from the drop down menu. The owning library indicates the organizational units whose staff can use this alert. This menu is populated with the shortnames that you created for your libraries in the organizational units tree (See Admin → Server Administration → Organizational Units).

Click Save.

33.14.2. Line Item MARC Attribute Definitions

Line item attributes define the fields that Evergreen needs to extract from the bibliographic records that are in the acquisitions database to display in the catalog. Also, these attributes will appear as fields in the New Brief Record interface. You will be able to enter information for the brief record in the fields where attributes have been defined.

Chapter 34. Authorities

34.1. Authority Control Sets

The tags and subfields that display in authority records in Evergreen are proscribed by control sets. The Library of Congress control set is the default control set in Evergreen. In Evergreen release 2.2, you can create customized control sets for authority records. Also, you can define thesauri and authority fields for these control sets.

Patrons and staff will be able to browse authorities in the OPAC. The following fields are browsable by default: author, series, subject, title, and topic. You will be able to add custom browse axes in addition to these default fields.

34.1.1. Control Sets

You can specify the MARC tags and subfields that an authority record should contain. The Library of Congress control set exists in the staff client by default. The control sets feature enables librarians to add or customize new control sets.

To access existing control sets, click Admin → Server Administration → Authorities → Control Sets.

To add a control set:

Click Admin → Server Administration → Authorities → Control Sets.

Click New Control Set.

Add a Name to the control set. Enter any number of characters.

Add a Description of the control set. Enter any number of characters.

Click Save.

34.2. Thesauri

A thesaurus describes the semantic rules that govern the meaning of words in a MARC record. The thesaurus code, which indicates the specific thesaurus that should control a MARC record, is encoded in a fixed field using the mnemonic Subj in the authority record. Eleven thesauri associated with the Library of Congress control set exist by default in the staff client.

To access an existing thesaurus, click Admin → Server Administration → Authorities → Control Sets, and choose the hyperlinked thesaurus that you want to access, or click Admin → Server Administration → Authorities → Thesauri.

To add a Thesaurus:

Click Admin → Server Administration → Authorities → Control Sets, and choose the hyperlinked thesaurus that you want to access, or click Admin → Server Administration → Authorities → Thesauri.

Click New Thesaurus.

Add a Thesaurus Code. Enter any single, upper case character. This character will be entered in the fixed fields of the MARC record.

Add a Name to the thesaurus. Enter any number of characters.

Add a Description of the thesaurus. Enter any number of characters.

34.3. Authority Fields

Authority fields indicate the tags and subfields that should be entered in the authority record. Authority fields also enable you to specify the type of data that should be entered in a tag. For example, in an authority record governed by a Library of Congress control set, the 100 tag would contain a "Heading - Personal Name." Authority fields also enable you to create the corresponding tag in the bibliographic record that would contain the same data.

34.3.1. To create an Authority Field:

Click Admin → Server Administration → Authorities → Control Sets.

Click Authority Fields. The number in parentheses indicates the number of authority fields that have been created for the control set.

Click New Authority Field.

Add a Name to the authority field. Enter any number of characters.

Add a Description to describe the type of data that should be entered in this tag. Enter any number of characters.

Select a Main Entry if you are linking the tag(s) to another entry.

Add a tag in the authority record.

Add a subfield in the authority record. Multiple subfields should be entered without commas or spaces.

Click Save.

Create the corresponding tag in the bibliographic record that should contain this information. Click the None link in the Controlled Bib Fields column.

Click New Control Set Bib Field.

Add the corresponding tag in the bibliographic record.

Click Save.

34.4. Browse Axes

Authority records can be browsed, by default, along five axes: author, series, subject, title, and topic. Use the Browse Axes feature to create additional axes.

Create a new Browse Axis:

Click Admin → Server Administration → Authorities → Browse Axes

Click New Browse Axis.

Add a code. Do not enter any spaces.

Add a name to the axis that will appear in the OPAC. Enter any number of characters.

Add a description of the axis. Enter any number of characters.

Add a sorter attribute. The sorter attribute indicates the order in which the results will be displayed.

Assign the axis to an authority so that users can find the authority record when browsing authorities. Click Admin → Server Administration → Authorities → Control Sets.

Choose the control set to which you will add the axis. Click Authority Fields

Click the link in the Axes column of the tag of your choice.

Click New Browse Axis-Authority Field Map.

Select an Axis from the drop down menu.

Click Save.

34.5. OPAC Searching of Authorities

Patrons and librarians can browse authorities through the OPAC.

To search for Authorities:

Click Advanced Search in the OPAC.

Find the Authority Browse column in the left side of the screen.

Select a browse axis, and enter a keyword. The terms in the middle of the results list should yield the best match.

Click Submit.

A list of results will appear. The authorities with bibliographic records attached will be listed in bold with the number of attached bibliographic records in parentheses.

Click on the bolded text to view bibliographic records.

Permissions to use this Feature

To use authority control sets, you will need the following permissions:

CREATE_AUTHORITY_CONTROL_SET

UPDATE_AUTHORITY_CONTROL_SET

DELETE_AUTHORITY_CONTROL_SET

Chapter 35. Call Number Prefixes and Suffixes

You can configure call number prefixes and suffixes in the Admin module. This feature ensures more precise cataloging because each cataloger will have access to an identical drop down menu of call number prefixes and suffixes that are used at his library. In addition, it may streamline cataloging workflow. Catalogers can use a drop down menu to enter call number prefixes and suffixes rather than entering them manually. You can also run reports on call number prefixes and suffixes that would facilitate collection development and maintenance.

35.1. Configure call number prefixes

Call number prefixes are codes that precede a call number.

To configure call number prefixes:

Select Admin → Server Administration → Call Number Prefixes.

Click New Prefix.

Enter the call number label that will appear on the item.

Select the owning library from the drop down menu. Staff at this library, and its descendant org units, with the appropriate permissions, will be able to apply this call number prefix.

Click Save.

35.2. Configure call number suffixes

Call number suffixes are codes that succeed a call number.

To configure call number suffixes:

Select Admin → Server Administration → Call Number Suffixes.

Click New Suffix.

Enter the call number label that will appear on the item.

Select the owning library from the drop down menu. Staff at this library, and its descendant org units, with the appropriate permissions, will be able to apply this call number suffix.

Click Save.

35.3. Apply Call Number Prefixes and Suffixes

You can apply call number prefixes and suffixes to items from a pre-configured list in the Unified Volume/Copy Creator. See the document, Unified Volume/Copy Creator, for an example.

Chapter 36. Circulation Limit Sets

36.1. Maximum Checkout by Copy Location

This feature enables you to specify the maximum number of checkouts of items by copy location and is an addition to the circulation limit sets. Circulation limit sets refine circulation policies by limiting the number of items that users can check out. Circulation limit sets are linked by name to circulation policies.

To limit checkouts by copy location:

Click Admin → Local Administration → Circulation Limit Sets.

Click New to create a new circulation limit set.

In the Owning Library field, select the library that can create and edit this limit set.

Enter a Name for the circulation set. You will select the Name to link the circulation limit set to a circulation policy.

Enter the number of Items Out that a user can take from this copy location.

Enter the Min Depth, or the minimum depth in the org tree that Evergreen will consider as valid circulation libraries for counting items out. The min depth is based on org unit type depths. For example, if you want the items in all of the circulating libraries in your consortium to be eligible for restriction by this limit set when it is applied to a circulation policy, then enter a zero (0) in this field.

Check the box adjacent to Global Flag if you want all of the org units in your consortium to be restricted by this limit set when it is applied to a circulation policy. Otherwise, Evergreen will only apply the limit to the direct ancestors and descendants of the owning library.

Enter a brief Description of the circulation limit set.

Click Save.

To link the circulation limit set to a circulation policy:

Click Admin → Local Administration → Circulation Policies

Select an existing circulation policy, or create a new one.

Scroll down to the Linked Limit Sets.

Select the Name of the limit set that you want to add to the circulation policy.

Click Add.

Click Save.

Chapter 37. Restrict Z39.50 Sources by Permission Group

In Evergreen versions preceding 2.2, all users with cataloging privileges could view all of the Z39.50 servers that were available for use in the staff client. In Evergreen version 2.2, you can use a permission to restrict users' access to Z39.50 servers. You can apply a permission to the Z39.50 servers to restrict access to that server, and then assign that permission to users or groups so that they can access the restricted servers.

37.1. Administrative Settings

You can add a permission to limit use of Z39.50 servers, or you can use an existing permission.

You must be authorized to add permission types at the database level to add a new permission.

Add a new permission:

1) Create a permission at the database level.

2) Click Admin → Server Administration → Permissions to add a permission to the staff client.

3) In the New Permission field, enter the text that describes the new permission.

4) Click Add.

5) The new permission appears in the list of permissions.

37.2. Restrict Z39.50 Sources by Permission Group

1) Click Admin → Server Administration → Z39.50 Servers

2) Click New Z39.50 Server, or double click on an existing Z39.50 server to restrict its use.

3) Select the permission that you added to restrict Z39.50 use from the drop down menu.

4) Click Save.

5) Add the permission that you created to a user or user group so that they can access the restricted server.

6) Users that log in to the staff client and have that permission will be able to see the restricted Z39.50 server.

As an alternative to creating a new permission to restrict use, you can use a preexisting permission. For example, your library uses a permission group called SuperCat, and only members in this group should have access to a restricted Z39.50 source. Identify a permission that is unique to the SuperCat group (e.g. CREATE_MARC) and apply that permission to the restricted Z39.50 server. Because these users are in the only group with the permission, they will be the only group w/ access to the restricted server.

Chapter 38. Booking Module Administration

38.1. Creating Bookable Non-Bibliographic Resources

Staff with the required permissions (Circulator and above) can create bookable non-bibliographic resources such as laptops, projectors, and meeting rooms.

The following pieces make up a non-bibliographic resource:

Resource Type

Resource Attribute

Resource Attribute Values

Resource

Resource Attribute Map

You need to create resource types and resource attributes (features of the resource types), and add booking items (resources) to individual resource type. Each resource attribute may have multiple values. You need to link the applicable features (resource attributes and values) to individual item (resource) through the Resource Attribute Map. Before you create resources (booking items) you need to have a resource type and associated resource attributes and values, if any, for them.

38.1.1. Create New Resource Type

1) Select Admin -→ Server Administration -→ Booking -→ Resource Types.

2) A list of current resource types will appear. Use Back and Next buttons to browse the whole list.

You may also see cataloged items in the list. Those items have been marked bookable or booked before.

3) To create a new resource type, click New Resource Type in the top right corner, .

4) A box will appear in which you create your new type of resource.

Resource Type Name - Give your resource a name.

Fine Interval - How often will fines be charged? This period can be input in several ways:

second(s), minute(s), hour(s), day(s), week(s), month(s), year(s)

sec(s), min(s)

s, m, h

00:00:30, 00:01:00, 01:00:00

Fine Amount - The amount that will be charged at each Fine Interval.

Owning Library - The home library of the resource.

Catalog Item - (Function not currently available.)

Transferable - This allows the item to be transferred between libraries.

Inter-booking and Inter-circulation Interval - The amount of time required by your library between the return of a resource and a new reservation for the resource. This interval uses * the same input conventions as the Fine Interval.

Max Fine Amount - The amount at which fines will stop generating.

5) Click Save when you have entered the needed information.

6) The new resource type will appear in the list.

38.1.2. Create New Resource Attribute

1) Select Server Administration -→ Booking -→ Resource Attributes.

2) Click New Resource Attribute in the top right corner.

3) A box will appear in which you can add the attributes of the resource. Attributes are categories of descriptive information that are provided to the staff member when the booking request is made. For example, an attribute of a projector may be the type of projector. Other attributes might be the number of seats available in a room, or the computing platform of a laptop.

Resource Attribute Name - Give your attribute a name.

Owning Library - The home library of the resource.

Resource Type - Type in the first letter to list then choose the Resource Type to which the Attribute is applicable.

Is Required - (Function not currently available.)

4) Click Save when the necessary information has been entered.

5) The added attribute will appear in the list.

One resource type may have multiple attributes. You may repeat the above procedure to add more.

38.1.3. Create New Resource Attribute Value

1) One resource attribute may have multiple values. To add new attribute value, select Server Administration → Booking → Resource Attribute Values.

2) Click New Resource Attribute Value in the top right corner.

3) A box will appear in which you assign a value to a particular attribute. Values can be numbers, words, or a combination of them, that describe the particular aspects of the resource that have been defined as Attributes. As all values appear on the same list for selection, values should be as unique as possible. For example, a laptop may have a computing platform that is either PC or Mac.

Owning Library - The home library of the resource.

Resource Attribute - The attribute you wish to assign the value to.

Valid Value - Enter the value for your attribute.

4) Click Save when the required information has been added.

5) The attribute value will appear in the list. Each attribute should have at least two values attached to it; repeat this process for all applicable attribute values.

38.1.4. Create New Resource

1) Add items to a resource type. Click Admin → Server Administration → Booking → Resources.

2) Click New Resource in the top right corner.

3) A box will appear. Add information for the resource.

Owning Library - The home library of the resource.

Resource Type - Type in the first letter of the resource type’s name to list then select the resource type for your item.

Barcode - Barcode for the resource.

Overbook - This allows a single item to be reserved, picked up, and returned by multiple patrons during overlapping or identical time periods.

Is Deposit Required - (Function not currently available.)

Deposit Amount - (Function not currently available.)

User Fee - (Function not currently available.)

4) Click Save when the required information has been added.

5) The resource will appear in the list.

One resource type may have multiple resources attached.

38.1.5. Map Resource Attributes and Values to Resources

1) Use Resource Attribute Maps to bring together the resources and their attributes and values. Select Admin → Server Administration → Booking → Resource Attribute Maps.

2) Click New Resource Attribute Map in the right top corner.

3) A box will appear in which you will map your attributes and values to your resources.

Resource - Enter the barcode of your resource.

Resource Attribute - Select an attribute that belongs to the Resource Type.

Attribute Value - Select a value that belongs to your chosen attribute and describes your resource. If your attribute and value do not belong together you will be unable to save.

4) Click Save once you have entered the required information.

A resource may have multiple attributes and values. Repeat the above steps to map all.

5) The resource attribute map will appear in the list.

Once all attributes have been mapped your resource will be part of a hierarchy similar to the example below.

38.2. Editing Non-Bibliographic Resources

Staff with the required permissions can edit aspects of existing non-bibliographic resources. For example, resource type can be edited in the event that the fine amount for a laptop changes from $2.00 to $5.00.

38.2.1. Editing Resource Types

1) Bring up your list of resource types. Select Admin -→ Server Administration -→ Booking -→ Resource Types.

2) A list of current resource types will appear.

3) Double click anywhere on the line of the resource type you would like to edit.

4) The resource type box will appear. Make your changes and click Save.

5) Following the same procedure you may edit Resource Attributes, Attributes Values, Resources and Attribute Map by selecting them on Admin -→ Server Administration -→ Booking menu.

38.3. Deleting Non-bibliographic Resources

1) To delete a booking resource, go to Admin → Server Administration → Booking → Resources.

2) Select the checkbox in front the resource you want to delete. Click Delete Selected. The resource will disappear from the list.

Following the same procedure you may delete Resource Attributes Maps.

You may also delete Resource Attribute Values, Resource Attributes and Resource Types. But you have to delete them in the reverse order when you create them to make sure the entry is not in use when you try to delete it.

This is the deletion order: Resource Attribute Map/Resources -→ Resource Attribute Values -→ Resource Attributes -→ Resource Types.

Chapter 39. User and Group Permissions

It is essential to understand how user and group permissions can be used to allow staff to fulfill their roles while ensuring that they only have access to the appropriate level.

Permissions in Evergreen are applied to a specific location and system depth based on the home library of the user. The user will only have that permission within the scope provided by the Depth field in relation to his/her working locations.

Evergreen provides group application permissions in order to restrict which staff members have the ability to assign elevated permissions to a user, and which staff members have the ability to edit users in particular groups.

39.1. Staff Accounts

New staff accounts are created in much the same way as patron accounts, using Circulation → Register Patron or Shift+F1. Select one of the staff profiles from the Profile Group drop-down menu.

Each new staff account must be assigned a Working Location which determines its access level in staff client interfaces.

To assign a working location open the newly created staff account using F1 (retrieve patron) or F4 (patron search).

Select Other → User Permission Editor

Place a check in the box next to the desired working location, then scroll to the bottom of the display and click Save.

In multi-branch libraries it is possible to assign more than one working location

39.1.1. Staff Account Permissions

To view a detailed list of permissions for a particular Evergreen account go to Admin (-) → User permission editor in the staff client.

39.1.2. Granting Additional Permissions

A Local System Administrator (LSA) may selectively grant LSA permissions to other staff accounts. In the example below a Circ +Full Cat account is granted permission to process offline transactions, a function which otherwise requires an LSA login.

Log in as a Local System Administrator.

Select Admin (-) → User Permission Editor and enter the staff account barcode when prompted

OR

Retrieve the staff account first, then select Other → User Permission Editor

The User Permission Editor will load (this may take a few seconds). Greyed-out permissions cannot be edited because they are either a) already granted to the account, or b) not available to any staff account, including LSAs.

1) List of permission names.

2) If checked the permission is granted to this account.

3) Depth limits application to the staff member’s library and should be left at the default.

4) If checked this staff account will be able to grant the new privilege to other accounts (not recommended).

To allow processing of offline transactions check the Applied column next to OFFLINE_EXECUTE.

Scroll down and click Save to apply the changes.

Chapter 40. SMS Text Messaging

The SMS Text Messaging feature enables users to receive hold notices via text message. Users can opt-in to this hold notification as their default setting for all holds, or they can receive specific hold notifications via text message. Users can also send call numbers and copy locations via text message.

40.1. Administrative Setup

You cannot receive text messages from Evergreen by default. You must enable this feature to receive hold notices and copy information from Evergreen via text message.

40.1.1. Enable Text Messages

Click Admin → Local Admin → Library Settings Editor.

Select the setting, Enable features that send SMS text messages.

Set the value to True, and click Update Setting.

40.1.2. Authenticate Patrons

By default, you must be logged into your OPAC account to send a text message from Evergreen. However, if you disable this setting, you can text message copy information without having to login to your OPAC account.

To disable the patron login requirement:

Click Admin → Local Administration → Library Settings Editor.

Select the setting, Disable auth requirement for texting call numbers.

Set the value to True, and click Update Setting.

40.1.3. Configure SMS Carriers

A list of SMS carriers that can transmit text messages to users is available in the staff client. Library staff can edit this list, or add new carriers.

To add or edit SMS carriers:

Click Admin → Server Administration → SMS Carriers.

To add a new carrier, click the New Carrier button in the top right corner of the screen. To edit an existing carrier, double click in any white space in the carrier’s row.

Enter a (geographical) Region.

Enter the carrier’s Name.

Enter an Email Gateway. The SMS carrier can provide you with the content for this field. The $number field is converted to the user’s phone number when the text message is generated.

Check the Active box to use this SMS Carrier.

40.1.4. Configure Text Message Templates

Library staff control the content and format of text messages through the templates in Notifications/Action Triggers. Patrons cannot add free text to their text messages.

To configure the text of the SMS text message:

Click Admin → Local Administration → Notifications/Action Triggers.

Create a new A/T and template, or use or modify an existing template. For example, a default template, "Hold Ready for Pickup SMS Notification," notifies users that the hold is ready for pickup.

You can use the default template, or you can edit the template and add content specific to your library. Click the hyperlinked name to view and/or edit the hold notice.

40.2. Receiving Holds Notices via Text Message

You can receive notification that your hold is ready for pickup from a text message that is sent to your mobile phone.

Login to your account.

Search the catalog.

Retrieve a record, and click the Place Hold link.

Select the option to retrieve hold notification via text message.

Choose an SMS Carrier from the drop down menu. NOTE: You can enter your SMS carrier and phone number into your Account Preferences to skip steps five and six.

Enter a phone number.

Click Submit.

40.3. Sending Copy Locations via Text Message

You can search the catalog for an item, and, after retrieving results for the item, click a hyperlink to send the copy location in a text message.

Login to your account in the OPAC. NOTE: If you have disabled the setting that requires patron login, then you do not have to login to their accounts to send text messages. See Administrative Setup for more information.

Search the catalog, and retrieve a title with copies.

Click the Text link adjacent to the call number.

The text of the SMS Text Message appears.

Choose an SMS Carrier from the drop down menu. NOTE: You can enter your SMS carrier and phone number into your Account Preferences to skip steps five and six.

Enter a phone number.

Click Submit.

The number and carrier are converted to an email address, and the text message is sent to your mobile phone.

Permissions to use this Feature

ADMIN_SMS_CARRIER - Enables users to add/create/delete SMS Carrier entries.

Chapter 41. User Activity Types

The User Activity Types feature enables you to specify the user activity that you want to record in the database. You can use this feature for reporting purposes. This function will also display a last activity date in a user’s account.

41.1. Enabling this Feature

Click Admin → Server Administration → User Activity Types to access the default set of user activity types and to add new ones. The default set of user activity types records user logins to the Evergreen ILS and to third party products that communicate with Evergreen.

The Label is a free text field that enables you to describe the activity that you are tracking.

The Event Caller describes the third party software or Evergreen interface that interacts with the Evergreen database and is responsible for managing the communication between the parties.

The Event Type describes the type of activity that Evergreen is tracking. Currently, this feature only tracks user authentication.

The Event Mechanism describes the framework for communication between the third party software or OPAC and the database. Enter an event mechanism if you want to track the means by which the software communicates with the database. If you do not want to track how the softwares communicate, then leave this field empty.

The Enabled field allows you to specify which types of user activity that you would like to track.

The Transient column enables you to decide how many actions you want to track. If you want to track only the last activity, then enter True. If you want to trace all activity by the user, enter False.

41.2. Using this Feature

The last activity date for user logins appears in the patron’s summary.

Part VI. Local Administration

Chapter 42. Introduction

This part covers the options in the Local Administration menu found in the staff client.

Chapter 43. Hold-driven recalls

Added in Evergreen 2.1

In academic libraries, it is common for groups like faculty and graduate students to have extended loan periods (for example, 120 days), while others have more common loan periods such as 3 weeks. In these environments, it is desirable to have a hold placed on an item that has been loaned out for an extended period to trigger a recall, which:

Truncates the loan period

Sets the remaining available renewals to 0

Optionally: Changes the fines associated with overdues for the new due date

Optionally: Notifies the current patron of the recall, including the new due date and fine level

43.1. Enabling hold-driven recalls

By default, holds do not trigger recalls. To enable hold-driven recalls of circulating items, library settings must be changed as follows:

Click Admin → Local Administration → Library Settings Editor.

Set the Recalls: Circulation duration that triggers a recall (recall threshold) setting. The recall threshold is specified as an interval (for example, "21 days"); any items with a loan duration of less that this interval are not considered for a recall.

Set the Recalls: Truncated loan period (return interval) setting. The return interval is specified as an interval (for example, "7 days"). The due date on the recalled item is changed to be the greater of either the recall threshold or the return interval.

Optionally: Set the Recalls: An array of fine amount, fine interval, and maximum fine setting. If set, this applies the specified fine rules to the current circulation period for the recalled item.

When a hold is placed and no available copies are found by the hold targeter, the recall logic checks to see if the recall threshold and return interval settings are set; if so, then the hold targeter checks the currently checked-out copies to determine if any of the currently circulating items at the designated pickup library have a loan duration longer than the recall threshold. If so, then the eligible item with the due date nearest to the current date is recalled.

43.2. Editing the item recall notification email template

The template for the item recall notification email is contained in the Item Recall Email Notice template, found under Admin → Local Administration → Notifications / Action Triggers.

Chapter 44. Recent Staff Searches

This feature enables you to view your recent searches as you perform them in the staff client. The number of searches that you can view is configurable. This feature is only available through the staff client; it is not available to patrons in the OPAC.

Administrative Settings

By default, ten searches will be saved as you search the staff client. If you want to change the number of saved searches, then you can configure the number of searches that you wish to save through the Library Settings Editor in the Admin module.

To configure the number of recent staff searches:

Click Admin → Local Administration → Library Settings Editor.

Scroll to OPAC: Number of staff client saved searches to display on left side of results and record details pages

Click Edit.

Select a Context from the drop down menu.

Enter the number of searches that you wish to save in the Value field.

Click Update Setting

To retain this setting, the system administrator must restart the web server.

If you do not want to save any searches, then you can turn off this feature.

To deactivate this feature:

Follow steps 1-4 (one through four) as listed in the previous section.

In the value field, enter 0 (zero).

Click Update Setting. This will prevent you from viewing any saved searches.

Recent Staff Searches

Evergreen will save staff searches that are entered through either the basic or advanced search fields. To view recent staff searches:

Enter a search term in either the basic or advanced search fields.

Your search results for the current search will appear in the middle of the screen. The most recent searches will appear on the left side of the screen.

Chapter 45. Library Settings Editor

45.1. Fine Accrual on Closed Dates

By default, fines accrue only on dates that the library is open. This feature enables you to charge patrons fines on dates the library is closed. Fines accrue during scheduled closings as well as during normal weekly closed dates.

To enable this feature:

Click Admin → Local Administration → Library Settings → Charge fines on overdue circulations when closed

Click Edit.

Set the value to True.

Click Update Setting.

45.2. Target Copies for Holds at Closed Libraries

By default, when a patron places a hold on a title, the hold targeter will search for copies to fill the hold only at circulating libraries that are open. Copies at closed libraries are not targeted to fill holds. When turned on, this feature enables Evergreen to target copies that have closed circulating libraries to fill holds. Two new org unit settings control this feature.

Use the following setting to target copies for holds at closed circulating libraries:

Click Admin → Local Administration → Library Settings Editor → Target copies for a hold even if copy’s circ lib is closed . Set the value to True if you want to target copies for holds at closed circulating libraries. Set the value to False, or leave it unset, if you do not want to enable this feature.

Click Update Setting.

Use the following setting to target copies for holds IF AND ONLY IF the circulating library is the hold’s pickup library.

Click Admin → Local Administration → Library Settings Editor → Target copies for a hold even if copy’s circ lib is closed IF the circ lib is the hold’s pickup lib . Set the value to True if you want to target copies for holds at closed circulating libraries when the circulating library of the item and the pickup library of the hold are the same. Set the value to False, or leave it unset, if you do not want to enable this feature.

Click Update Setting.

45.3. Auto Override Patron Hold Events

In previous versions of Evergreen, you can assign patrons a permission that enables them to manually override a failed hold. In version 2.3, when a patron places a hold in the OPAC that fails, and the patron has the permission to override the failed hold, a new org unit setting automatically overrides the failed hold rather than requiring the patron to manually override the hold.

In version 2.3, a new org unit setting exists so that the hold override occurs automatically, and the patron does not have to choose to override it. To enable this org unit setting:

Click Admin → Local Administration →Library Settings Editor.

Scroll or search to find Auto-Override Permitted Hold Blocks (Patrons).

Set the value to True.

Use Case

A patron has placed a hold in the OPAC on a title that he has currently checked out. The patron permission group contains the permission, HOLD_ITEM_CHECKED_OUT.override. In versions prior to 2.3, a hold failure message appears, and the patron must click Submit to override the hold.

In version 2.3, with the appropriate org unit setting enabled, the hold success message appears automatically, and the patron is not required to take further action.

Chapter 46. Standing Penalties

In versions of Evergreen prior to 2.3, the following penalty types were available by default. When applied to user accounts, these penalties prevented users from completing the following actions:

CIRC - Users cannot check out items

HOLD - Users cannot place holds on items

RENEW - Users cannot renew items

In version 2.3, two new penalty types are available in Evergreen:

CAPTURE - This penalty prevents a user’s holds from being captured. If the HOLD penalty has not been applied to a user’s account, then the patron can place a hold, but the targeted item will not appear on a pull list and will not be captured for a hold if it is checked in.

FULFILL - This penalty prevents a user from checking out an item that is on hold. If the HOLD and CAPTURE penalties have not been applied to a user’s account, then the user can place a hold on an item, and the item can be captured for a hold. However, when he tries to check out the item, the circulator will see a pop up box with the name of the penalty type, FULFILL. The circulator must correct the problem with the account or must override the penalty to check out the item.

Chapter 47. Statistical Categories Editor

This is where you configure your statistical categories (stat cats). Stat cats are a way to save and report on additional information that doesn’t fit elsewhere in Evergreen’s default records. It is possible to have stat cats for copies or patrons.

Click Admin → Local Administration → Statistical Categories Editor.

To create a new stat cat, enter the name of the category and select either patron or copy from the Type dropdown menu. Each category type has a number of options you may set.

Copy Statistical Categories

Copy stat cats appear in the Copy Editor, also known as the Edit Item Attributes screen. You might use copy stat cats to track books you have bought from a specific vendor, or donations.

An example of the Create a new statistical category controls for copies:

OPAC Visibility: Should the category be displayed in the OPAC?

Required: Must the category be assigned a value when editing the item attributes?

Archive with Circs: Should the category and its values for the copy be archived with aged circulation data?

SIP Field: Select the SIP field identifier that will contain the category and its value

SIP Format: Specify the SIP format string

Some sample copy stat cats:

To add an entry, select Add. To edit an entry, select the entry you wish to edit from the drop-down list for the category.

This is how the copy stat cats appear in the Copy Editor:

Patron Statistical Categories

Patron stat cats can be used to keep track of information such as the high school a patron attends, or the home library for a consortium patron, e.g. Interlink, or patron preferences. They appear in the fifth section of the Patron Registration or Edit Patron screen.

An example of the Create a new statistical category controls for patrons:

OPAC Visibility: Should the category be displayed in the OPAC?

Required: Must the category be assigned a value when registering a new patron or editing an existing one?

Archive with Circs: Should the category and its values for the patron be archived with aged circulation data?

Allow Free Text: May the person registering/editing the patron information supply their own value for the category?

Show in Summary: Display the category and its value in the patron summary view?

SIP Field: Select the SIP field identifier that will contain the category and its value

SIP Format: Specify the SIP format string

[Warning]
WARNING

If you make a category required and also disallow free text, make sure that you populate an entry list for the category so that the user may select a value. Failure to do so will result in an unsubmittable patron registration/edit form!

Some sample patron stat cats:

To add an entry, click on Add in the category row under the Add Entry column:

To edit an entry, select the entry you wish to edit from the drop-down list for the category:

An organizational unit (consortium, library system branch library, sub library, etc.) may create their own categories and entries, or supplement categories defined by a higher-level org unit with their own entries.

An entry can be set as the default entry for a category and for an org unit. If an entry is set as the default, it will be automatically selected in the patron edit screen, provided no other value has been previously set for the patron. Only one default may be set per category for any given org unit.

Lower-level org unit defaults override defaults set for higher-level org units; but in the absence of a default set for a given org unit, the nearest parent org unit default will be selected.

Default entries for the focus location org unit are marked with an asterisk in the entry dropdowns.

This is how patron stat cats appear in the patron registration/edit screen:

Chapter 48. Work Log

48.1. Expanding the Work Log

In versions of Evergreen prior to 2.3, the work log recorded check ins, checkouts, patron registration, patron editing, and renewals. In version 2.3, the work log also records holds that have been placed and payments that have been received.

In this example, a staff member has collected a fine from a patron. To view this action in the work log, click Admin → Local Administration → Work Log. By default, the work log will record the staff member’s username, the amount that was received, the payment type, the patron’s barcode, and the patron’s last name.

In this example, a staff member has placed a hold for a patron. To view this action in the work log, click Admin → Local Administration → Work Log. By default, the work log will record the staff member’s username, the hold type, the patron’s barcode, and the patron’s last name.

Part VII. Acquisitions

Chapter 49. Acquisitions

This section is intended for those who are responsible for managing and processing acquisitions.

Before beginning to use Acquisitions, the following must be configured by an administrator:

Cancel/Suspend Reasons (optional)

Claiming (optional)

Currency Types (defaults exist)

Distribution Formulas (optional)

EDI Accounts (optional) (see Setting Up EDI Acquisitions under Software Installation)

Exchange Rates (defaults exist)

Funds and Fund Sources

Invoice Types (defaults exist) and Invoice Payment Methods

Line Item Features (optional)

Merge Overlay Profiles and Record Match Sets (see Batch Importing MARC Records in Cataloging)

Providers

49.1. Acquisitions Workflow

The following diagram shows how the workflow functions in Evergreen. One of the differences in this process you should notice is that when creating a selection list on the vendor site, libraries will be downloading and importing the vendor bibs and item records.

Chapter 50. Selection Lists and Purchase Orders

50.1. Selection Lists

Selection lists allow you to create, manage, and save lists of items that you may want to purchase. To view your selection list, click Acquisitions → My Selection Lists. Use the general search to view selection lists created by other users.

50.1.1. Create a selection list

Selection lists can be created in four areas within the module. Selection lists can be created when you Add Brief Records, Upload MARC Order Records, or find records through the MARC Federated Search. In each of these interfaces, you will find the Add to Selection List field. Enter the name of the selection list that you want to create in that field.

Selection lists can also be created through the My Selection Lists interface:

Click Acquisitions → My Selection Lists.

Click the New Selection List drop down arrow.

Enter the name of the selection list in the box that appears.

Click Create.

50.1.2. Add items to a selection list

You can add items to a selection list in one of three ways: add a brief record; upload MARC order records; add records through a federated search; or use the View/Place Orders menu item in the catalog.

50.1.3. Clone selection lists

Cloning selection lists enables you to copy one selection list into a new selection list. You can maintain both copies of the list, or you can delete the previous list.

Click Acquisitions → My Selection Lists.

Check the box adjacent to the list that you want to clone.

Click Clone Selected.

Enter a name into the box that appears, and click Clone.

50.1.4. Merge selection lists

You can merge two or more selection lists into one selection list.

Click Acquisitions → My Selection Lists.

Check the boxes adjacent to the selection lists that you want to merge, and click Merge Selected.

Choose the Lead Selection List from the drop down menu. This is the list to which the items on the other list(s) will be transferred.

Click Merge.

50.1.5. Delete selection lists

You can delete selection lists that you do not want to save. You will not be able to retrieve these items through the General Search after you have deleted the list. You must delete all line items from a selection list before you can delete the list.

Click Acquisitions → My Selection Lists.

Check the box adjacent to the selection list(s) that you want to delete.

Click Delete Selected.

50.1.6. Mark Ready for Selector

After an item has been added to a selection list or purchase order, you can mark it ready for selector. This step is optional but may be useful to individual workflows.

If you want to mark part of a selection list ready for selector, then you can check the box(es) of the line item(s) that you wish to mark ready for selector. If you want to mark the entire list ready for selector, then skip to step 2.

Click Actions → Mark Ready for Selector.

A pop up box will appear. Choose to mark the selected line items or all line items.

Click Go.

The screen will refresh. The marked line item(s) will be highlighted pink, and the status changes to selector~ready.

50.1.7. Convert selection list to purchase order

Use the Actions menu to convert a selection list to a purchase order.

From a selection list, click Actions ~> Create Purchase Order.

A pop up box will appear.

Select the ordering agency from the drop down menu.

Enter the provider.

Check the box adjacent to prepayment required if prepayment is required.

Choose if you will add All Lineitems or Selected Lineitems to your purchase order.

Check the box if you want to Import Bibs and Create Copies in the catalog.

Click Submit.

50.2. Purchase Orders

50.2.1. Activate Purchase Order with Zero Copies

In previous versions, by default, a purchase order could be activated with or without copies attached to line items.

In versions 2.3 and above, by default, a purchase order cannot be activated if a line item on the purchase order has zero copies. A new feature enables you to activate a purchase order that lacks copies.

To activate a purchase order with line items that have zero copies, check the box Allow activation with zero-copy lineitems.

50.3. Brief Records

Brief records are short bibliographic records with minimal information that are often used as placeholder records until items are received. Brief records can be added to selection lists or purchase orders and can be imported into the catalog. You can add brief records to new or existing selection lists. You can add brief records to new, pending or on~order purchase orders.

50.3.1. Add brief records to a selection list

Click Acquisitions → New Brief Record. You can also add brief records to an existing selection list by clicking the Actions menu on the selection list and choosing Add Brief Record.

Choose a selection list from the drop down menu, or enter the name of a new selection list.

Enter bibliographic information in the desired fields.

Click Save Record.

50.3.2. Add brief records to purchase orders

You can add brief records to new or existing purchase orders.

Open or create a purchase order. See the section on purchase orders for more information.

Click Add Brief Record.

Enter bibliographic information in the desired fields. Notice that the record is added to the purchase order that you just created.

Click Save Record.

50.4. MARC Federated Search

The MARC Federated Search enables you to import bibliographic records into a selection list or purchase order from a Z39.50 source.

Click Acquisitions → MARC Federated Search.

Check the boxes of Z39.50 services that you want to search. Your local Evergreen Catalog is checked by default. Click Submit.

image::media/acq_marc_search.png[search form]

A list of results will appear. Click the "Copies" link to add copy information to the line item. See the section on Line Items for more information.

Click the Notes link to add notes or line item alerts to the line item. See the section on Line Items for more information.

Enter a price in the "Estimated Price" field.

You can save the line item(s) to a selection list by checking the box on the line item and clicking Actions → Save Items to Selection List. You can also create a purchase order from the line item(s) by checking the box on the line item and clicking Actions ~> Create Purchase Order.

50.5. Line Items

50.5.1. Return to Line Item

This feature enables you to return to a specific line item on a selection list, purchase order, or invoice after you have navigated away from the page that contained the line item. This feature is especially useful when you must identify a line item in a long list. After working with a line item, you can return to your place in the search results or the list of line items.

To use this feature, select a line item, and then, depending on the location of the line item, click Return or Return to search. Evergreen will take you back to the specific line item in your search and highlight the line item with a colored box.

For example, you retrieve a selection list, find a line item to examine, and click the Copies link. After editing the copies, you click Return. Evergreen takes you back to your selection list and highlights the line item that you viewed.

This feature is available in General Search Results, Purchase Orders, and Selection Lists, whenever any of the following links are available:

Selection List

Purchase Order

Copies

Notes

Worksheet

This feature is available in Invoices whenever any of the following links are available:

Title

Selection List

Purchase Order

Chapter 51. Invoices

51.1. Electronic Invoicing

Evergreen can receive electronic invoices from providers. To access an electronic invoice, you must:

Configure EDI for your provider.

Evergreen will receive invoices electronically from the provider.

Click Acquisitions → Open Invoices to view a list of open invoices, or use the General Search to retrieve invoices. Click a hyperlinked invoice number to view the invoice.

51.2. Search for Line Items from an Invoice

You can open an invoice, search for line items from the invoice, and add your search results to a new or existing invoice. This feature is especially useful when you want to populate an invoice with line items from multiple purchase orders.

In this example, we’ll add line items to a new invoice:

Click Acquisitions → Create Invoice.

An invoice summary appears at the top of the invoice and includes the number of line items on the invoice and the expected cost of the items. This number will change as we add line items to the invoice.

Enter the invoice details (optional). If you do not enter the invoice details, then Evergreen will populate the Provider and Receiver fields with information from the line items.

If you do not want to display the details, click Hide Details.

Click the Search tab to add line items to an invoice.

Select your search criteria from the drop down menu.

On the right side of the screen, Limit to Invoiceable Items is checked by default. Invoiceable items are those that are on order, have not been cancelled, and have not yet been invoiced. Evergreen also filters out items that have already been added to an invoice. Finally, if this box is checked, and if your entered the invoice details at the top of the screen, then Evergreen will filter your search for items that have the same provider as the one that you entered. If you have not entered the invoice details, then Evergreen removes this limit.

Sort by title (optional). By default, results are listed by line item number. Check this box to sort by ascending title.

Building the results list progressively (optional). By default, new search results will replace previous results on the screen. Check this box for the search results list to build with each subsequent search. This option is useful for libraries that might search for line items by scanning an ISBN. Several ISBNs can be scanned and then the entire result set can be selected and moved to the invoice in a batch.

Click Search.

Use the Next button to page through results, or select a line item(s), and click Add Selected Items to Invoice.

The rows that you selected are highlighted, and the invoice summary at the. top of the screen updates.

Click the Invoice tab to see the updated invoice.

Enter the number of copies for which you were invoiced, the amount that was billed, and the amount that was paid. The Per Copy field calculates the cost of each copy by dividing the amount that was billed by the number of copies for which the library paid.

Save the invoice. A new option, Save and Clear, saves the current invoice and replaces it with a new invoice so that you can continue invoicing items.

51.3. Receive Items From an Invoice

This feature enables users to receive items from an invoice. Staff can receive individual copies, or they can receive items in batch.

51.3.1. Receive Items in Batch (List Mode)

In this example, we have created a purchase order, added line items and copies, and activated the purchase order. We will create an invoice from the purchase order, receive items, and invoice them. We will receive the items in batch from the invoice.

1) Retrieve a purchase order.

2) Click Create Invoice.

3) The blank invoice appears. In the top half of the invoice, enter descriptive information about the invoice. In the bottom half of the invoice, enter the number of items for which you were invoiced, the amount that you were billed, and the amount that you paid.

4) Click Save. You must choose a save option before you can receive items.

5) The screen refreshes. In the top right corner of the screen, click Receive Items.

6) The Acquisitions Invoice Receiving screen opens. By default, this screen enables users to receive items in batch, or Numeric Mode. You can select the number of copies that you want to receive; you are not receiving specific copies in this mode.

7) Select the number of copies that you want to receive. By default, the number that you invoiced will appear. In this example, we will receive one copy of each title.

You cannot receive fewer items than 0 (zero) or more items than the number that you ordered.

8) Click Receive Selected Copies.

9) When you are finished receiving items, close the screen. You can repeat this process as you receive more copies.

51.3.2. Receive Specific Copies (Numeric Mode)

In this example, we have created a purchase order, added line items and copies, and activated the purchase order. We will create an invoice from the purchase order, receive items, and invoice them. We will receive specific copies from the invoice. This function may be useful to libraries who purchase items that have been barcoded by their vendor.

1) Complete steps 1-5 in the previous section.

2) The Acquisitions Invoice Receiving screen by default enables user to receive items in batch, or Numeric Mode. Click Use List Mode to receive specific copies.

3) Select the check boxes adjacent to the copies that you want to receive. Leave unchecked the copies that you do not want to receive.

4) Click Receive Selected Copies.

The screen will refresh. Copies that have not yet been received remain on the screen so that you can receive them when they arrive.

5) When all copies on an invoice have been received, a message confirms that no copies remain to be received.

6) The purchase order records that all items have been received.

Chapter 52. Vandelay Integration into Acquisitions

The Acquisitions Load MARC Order Record interface enables you to add MARC records to selection lists and purchase orders and upload the records into the catalog. The Vandelay interface enables you to create specific match points between incoming MARC records and exisiting catalog records. Combining these two features enables you to track on order MARC records through the Acquisitions interface and to utilize the record matching mechanisms available in Vandelay.

The purpose of this documentation is to describe the interaction between Vandelay and the Acquisitions MARC Batch Upload interface. For detailed instructions on using the Acquisitions MARC Batch Upload interface, see the Evergreen Documentation Interest Group’s Book of Evergreen, 2.1 documentation, Chapter 5, Load MARC Order Records. For detailed instructions on using the Vandelay functions for record matching and importing, see the Evergreen Documentation Interest Group’s Book of Evergreen, 2.2 documentation, Chapter 7, Batch Importing MARC Records.

Use Cases for Vandelay Integration into Acquisitions

You can add items to a selection list or purchase order and ignore the Vandelay options, or you can use both acquisitions and cataloging functions. In these examples, you will use both functions.

Example 1: Using the Acquisitions MARC Batch Load interface, upload MARC records to a selection list and a Vandelay queue, and match queued records with existing catalog records.

In this example, an acquisitions librarian has received a batch of MARC records from a vendor. She will add the records to a selection list and a Vandelay record queue. A cataloger will later view the queue, edit the records, and import them into the catalog.

Click Acquisitions → Load MARC Order Records

Add MARC order records to a Selection list and/or a Purchase Order. Check the box to create a purchase order if desired.

Select a Provider from the drop down menu, or begin typing the code for the provider, and the field will auto-fill.

Select a Context Org Unit from the drop down menu, or begin typing the code for the context org unit, and the field will auto-fill.

Select a Selection List from the drop down menu, or begin typing the name of the selection list. You can create a new list, or the field will auto-fill.

Create a new record queue in Vandelay, or upload the records to an existing queue.

Select a Record Match Set.

Browse your computer to find the MARC file, and click Upload.

The processed items appear at the bottom of the screen.

You can click the link(s) to access the selection list or the import queue. Click the link to View Selection List.

Look at the first line item. The line item has not yet been linked to the catalog, but it is linked to a Vandelay record queue. Click the link to the queue to examine the MARC record.

The Vandelay interface opens in a new tab. The bibliographic records appear in the queue. Records that have matches are identified in the queue. You can edit these records and/or import them into the catalog, completing the process.

Example 2: Using the Acquisitions MARC Batch Load interface, upload MARC records to a selection list, and use the Vandelay options to import the records directly into the catalog. The Vandelay options will enable you to match incoming records with existing catalog records.

In this example, a librarian will add MARC records to a selection list, create criteria for matching incoming and existing records, and import the matching and non-matching records into the catalog.

Click Acquisitions → Load MARC Order Records

Add MARC order records to a Selection list and/or a Purchase Order. Check the box to create a purchase order if desired.

Select a Provider from the drop down menu, or begin typing the code for the provider, and the field will auto-fill.

Select a Context Org Unit from the drop down menu, or begin typing the code for the context org unit, and the field will auto-fill.

Select a Selection List from the drop down menu, or begin typing the name of the selection list. You can create a new list, or the field will auto-fill.

Create a new record queue in Vandelay, or upload the records to an existing queue.

Select a Record Match Set.

Select Merge Profile → Match-Only Merge.

Check the box adjacent to Merge on Best Match.

Browse your computer to find the MARC file, and click Upload.

Click the link to View Selection List Line items that do not match existing catalog records on title and ISBN contain the link, link to catalog. This link indicates that you could link the line item to a catalog record, but currently, no match exists between the line item and catalog records. Line items that do have matching records in the catalog contain the link, catalog.

Click the catalog link to view the line item in the catalog.

Permissions to use this Feature

IMPORT_MARC - Using Vandelay to create new bib records now requres the IMPORT_MARC permission (same as open-ils.cat.biblio.record.xml.import). If the permission fails, the queued record will fail import and be stamped with a new "import.record.perm_failure" vandelay import error

IMPORT_ACQ_LINEITEM_BIB_RECORD_UPLOAD - This allows interfaces leveraging Vandelay, such as Acquisitions, to create a higher barrier to entry. This permission prevents users from creating new bib records directly from the ACQ vendor MARC file upload interface.

Part VIII. Cataloging

Chapter 53. Introduction

Cataloguers should use this part for understanding the cataloguing procedures used in Evergreen.

Chapter 54. Batch Importing MARC Records

The cataloging module includes an enhanced MARC Batch Import interface for loading MARC records. This interface allows you to specify match points between incoming and existing records, to specify MARC fields that should be overlaid or preserved, and to only overlay records if the incoming record is of higher quality than the existing record. Records are added to a queue where you can apply filters that enable you to generate any errors that may have occurred during import. You can print your queue, email your queue, or export your queue as a CSV file.

54.1. Permissions

To use match sets to import records, you will need the following permission:

ADMIN_IMPORT_MATCH_SET

54.2. Record Display Attributes

This feature enables you to specify the tags and subfields that will display in records that appear in the import queue.

54.3. Record Match Sets

This feature enables you to create custom match points that you can use to accurately match incoming records with existing catalog records.

54.3.1. Creating a Match Set

In this example, to demonstrate matching on record attributes and MARC tags and subfields, we will create a record match set that defines a match based on the title of the record, in either the 240 or 245, and the fixed field, Lang. You can add multiple record attributes and MARC tags to customize a record match set.

1) Click Cataloging → MARC Batch Import/Export.

2) Create a new record match set. Click Record Match Sets → New Match Set.

3) Enter a name for the record match set.

4) Select an Owning Library from the drop down menu. Staff with permissions at this location will be able to use this record match set.

5) Select a Match Set Type from the drop down menu. You can create a match set for authority records or bibliographic records.

6) Click Save.

7) The screen will refresh to list the record match set that you created. Click the link to the record match set.

8) Create an expression that will define the match points for the incoming record. You can choose from two areas to create a match: Record Attribute or MARC Tag and Subfield. You can use the Boolean operators AND and OR to combine these elements to create a match set.

9) Select a Record Attribute from the drop-down menu.

10) Enter a Match Score. The Match Score indicates the relative importance of that match point as Evergreen evaluates an incoming record against an existing record. You can enter any integer into this field. The number that you enter is only important as it relates to other match points. Recommended practice is that you create a match score of one (1) for the least important match point and assign increasing match points to the power of 2 to working points in increasing importance.

11) Check the Negate? box if you want to negate the match point. Checking this box would be the equivalent of applying a Boolean operator of NOT to the match point.

12) Click Ok.

13) Drag the completed match point under the folder with the appropriately-named Boolean folder under the Expression tree.

The match point will nest underneath the folder in the Expression tree.

14) Enter another Boolean Operator to further refine your match set.

15) Click Boolean Operator.

16) Select the OR operator from the drop down menu.

17) Click Ok.

18) Drag the operator to the expression tree.

19) Click MARC Tag and Subfield.

20) Enter a MARC tag on which you want the records to match.

21) Enter a subfield on which you want the records to match.

22) Enter a Match Score. The Match Score indicates the relative importance of that match point as Evergreen evaluates an incoming record against an existing record. You can enter any integer into this field. The number that you enter is only important as it relates to other match points. Recommended practice is that you create a match score of one (1) for the least important match point and assign increasing match points to the power of 2 to working points in increasing importance.

23) Check the Negate? box if you want to negate the match point. Checking this box would be the equivalent of applying a Boolean operator of NOT to the match point.

24) Click Ok.

25) Drag the completed match point under the folder with the appropriately-named Boolean folder under the Expression tree. The Expression will build across the top of the screen.

26) Add additional MARC tags or record attributes to build the expression tree.

27) Click Save Changes to Expression.

54.3.2. Replace Mode

Replace Mode enables you to replace an existing part of the expression tree with a new record attribute, MARC tag, or Boolean operator. For example, if the top of the tree is AND, in replace mode, you could change that to an OR.

1) Create a working match point.

2) Click Enter replace mode.

3) Highlight the piece of the tree that you want to replace.

4) Drag the replacement piece over the highlighted piece.

5) Click Exit Replace Mode.

54.3.3. Quality Metrics

1) Set the Quality Metrics for this Match Set. Quality metrics are used to determine the overall quality of a record. Each metric is given a weight and the total quality value for a record is equal to the sum of all metrics that apply to that record. For example, a record that has been cataloged thoroughly and contains accurate data would be more valuable than one of poor quality. You may want to ensure that the incoming record is of the same or better quality than the record that currently exists in your catalog; otherwise, you may want the match to fail. The quality metric is optional.

2) You can create quality metrics based on the record attribute or the MARC Tag and Subfield.

3) Click Record Attribute.

4) Select an attribute from the drop down menu.

5) Enter a value for the attribute.

6.) Enter a match score. You can enter any integer into this field. The number that you enter is only important as it relates to other quality values for the current configuration. Higher scores would indicate increasing quality of incoming records. You can, as in the expression match score, increase the quality points by increasing subsequent records by a power of 2 (two).

7) Click Ok.

54.4. Import Records

The Import Records interface incorporates record match sets, quality metrics, more merging options, and improved ways to manage your queue. In this example, we will import a batch of records. One of the records in the queue will contain a matching record in the catalog that is of lower quality than the incoming record. We will import the record according to the guidelines set by our record match set, quality metrics, and merge/overlay choices that we will select.

1) Select a Record Type from the drop down menu.

2) Create a queue to which you can upload your records, or add you records to an existing queue. Queues are linked to match sets and a holdings import profile. You cannot change a holdings import or record match set for a queue.

3) Select a Record Match Set from the drop down menu.

4) Select a Holdings Import Profile if you want to import holdings that are attached to your records.

5) Select a Record Source from the drop down menu.

6) Select a Merge Profile. Merge profiles enable you to specify which tags should be removed or preserved in incoming records.

7) Choose one of the following import options if you want to auto-import records:

Merge on Single Match - Using the Record Match Set, Evergreen will only attempt to perform the merge/overlay action if only one match was found in the catalog.

Merge on Best Match - If more than one match is found in the catalog for a given record, Evergreen will attempt to perform the merge/overlay action with the best match as defined by the match score and quality metric.

Quality ratio affects only the Merge on Single Match and Merge on Best Match options.

8) Enter a Best/Single Match Minimum Quality Ratio. Divide the incoming record quality score by the record quality score of the best match that might exist in the catalog. By default, Evergreen will assign any record a quality score of 1 (one). If you want to ensure that the inbound record is only imported when it has a higher quality than the best match, then you must enter a ratio that is higher than 1. For example, if you want the incoming record to have twice the quality of an existing record, then you should enter a 2 (two) in this field. If you want to bypass all quality restraints, enter a 0 (zero) in this field.

9) Select an Insufficient Quality Fall-Through Profile if desired. This field enables you to indicate that if the inbound record does not meet the configured quality standards, then you may still import the record using an alternate merge profile. This field is typically used for selecting a merge profile that allows the user to import holdings attached to a lower quality record without replacing the existing (target) record with the incoming record. This field is optional.

10) Browse to find the appropriate file, and click Upload. The files will be uploaded to a queue.

11) The screen will display records that have been uploaded to your queue.

12) If Evergreen indicates that matching records exist, then click the Matches link to view the matching records. Check the box adjacent to the existing record that you want to merge with the incoming record.

13) Click Back to Import Queue.

14) Check the boxes of the records that you want to import, and click Import Selected Records, or click Import All Records.

15) A pop up window will offer you the same import choices that were present on the Import Records screen. You can choose one of the import options, or click Import.

16) The screen will refresh. The Queue Summary indicates that the record was imported. The Import Time column records the date that the record was imported.

17) Search the catalog to confirm that the record was imported.

Chapter 55. Overlay Existing Catalog Record via Z39.50 Import

This feature enables you to replace a catalog record with a record obtained through a Z39.50 search. No new permissions or administrative settings are needed to use this feature.

To Overlay an Existing Record via Z39.50 Import:

1) Click Cataloging → Import Record from Z39.50

2) Select at least one Service in addition to the Local Catalog in the Service and Credentials window in the top right panel.

3) Enter search terms in the Query window in the top left panel.

4) Click Search.

5) The results will appear in the lower window.

6) Select the record in the local catalog that you wish to overlay.

7) Click Mark Local Result as Overlay Target

8) A confirmation message appears. Click OK.

9) Select the record that you want to replace the existing catalog record.

10) Click Overlay.

11) The record that you selected will open in the MARC Editor. Make any desired changes to the record, and click Overlay Record.

12) The catalog record that you want to overlay will appear in a new window. Review the MARC record to verify that you are overlaying the correct catalog record.

13) If the correct record appears, click Overlay.

14) A confirmation message will appear to confirm that you have overlaid the record. Click Ok.

15) The screen will refresh in the OPAC View to show that the record has been overlaid.

Chapter 56. Monograph Parts

Monograph Parts enables you to differentiate between parts of monographs or other multi-part items. This feature enables catalogers to describe items more precisely by labeling the parts of an item. For example, catalogers might identify the parts of a monograph or the discs of a DVD set. This feature also allows patrons more flexibility when placing holds on multi-part items. A patron could place a hold on a specific disc of a DVD set if they want to access a specific season or episode rather than an entire series.

Four new permissions are used by this functionality: CREATE_MONOGRAPH_PART, UPDATE_MONOGRAPH_PART, DELETE_MONOGRAPH_PART and MAP_MONOGRAPH_PART. These permissions should be assigned at the consortial level to those groups or users that will make use of the features described below.

56.1. Add a monograph part to an existing record

To add a monograph part to an existing record in the catalog:

1) Retrieve a record.

2) Click Actions for this Record → Manage Parts

3) Click New Monograph Part

4) Enter the label that you want to appear to the user in the catalog, and click Save. This will create a list of monograph parts from which you can choose when you create a volume and copy.

5) Add a volume and copy. To add a volume and copy to your workstation library, click the Add Volumes link in the Record Summary at the top of the bibliographic record, or click Actions for this Record → Add Volumes.

To add a volume and copy to your workstation library or other libraries, click Actions for this Record → Holdings Maintenance → Add Volumes.

6) The Unified Volume/Copy Creator opens. Enter the number of volumes that you want to add to the catalog and the volume description.

7) Enter the number of copies and barcode(s) of each item.

8) Select the part designation from the drop down menu adjacent to the barcode field.

9) Apply a template to the copies, or edit fields in the Copy Editor.

10) Click Create Volumes/Items.

11) The Holdings Maintenance screen will refresh to demonstrate the addition of the volume, copy, and part. These fields also appear in the OPAC View.

Chapter 57. Conjoined Items

Prior to Evergreen version 2.1, items could be attached to only one bibliographic record. The Conjoined Items feature in Evergreen 2.1 enables catalogers to link items to multiple bibliographic records. This feature will enable more precise cataloging. For example, catalogers will be able to indicate items that are printed back to back, are bilingual, are part of a bound volume, are part of a set, or are available as an e-reader pre-load. This feature will also help the user retrieve more relevant search results. For example, a librarian catalogs a multi-volume festschrift. She can create a bibliographic record for the festschrift and a record for each volume. She can link the items on each volume to the festschrift record so that a patron could search for a volume or the festschrift and retrieve information about both works.

In the example below, a librarian has created a bibliographic record for two bestselling items. These books are available as physical copies in the library, and they are available as e-reader downloads. The librarian will link the copy of the Kindle to the bibliographic records that are available on the e-reader.

57.1. Using the Conjoined Items Feature

The Conjoined Items feature was designed so that you can link items between bibliographic records when you have the item in hand, or when the item is not physically present. Both processes are described here. The steps are fewer if you have the item in hand, but both processes accomplish the same task. This document also demonstrates the process to edit or delete links between items and bibliographic records. Finally, the permission a cataloger needs to use this feature is listed.

Scenario 1: I want to link an item to another bibliographic record, but I do not have the item in hand. 1) Retrieve the bibliographic record to which you would like to link an item.

2) Click Actions for this Record → Mark as Target for Conjoined Items.

3) A confirmation message will appear. Click OK.

4) In a new tab, retrieve the bibliographic record with the item that you want to link to the other record.

5) Click Actions for this Record → Holdings Maintenance.

6) Select the copy that you want to link to the other bibliographic record. Right-click, or click Actions for Selected Rows → Link as Conjoined Items to Previously Marked Bib Record.

7) The Manage Conjoined Items interface opens in a new tab. This interface enables you to confirm the success of the link, and to change the peer type if desired. The Result column indicates that you created a successful link between the item and the bib record.

The default peer type, Back-to-back, was set as the peer type for our item. To change a peer type after the link has been created, right-click or click Actions for Selected Items → Change Peer Type. A drop down menu will appear. Select the desired peer type, and click OK.

8) The Result column will indicate that the Peer Type [has been] Updated.

9) To confirm the link between the item and the desired bib record, reload the tab containing the bib record to which you linked the item. Click the link for Linked Titles.

10) To view the copy details, including the peer type, click Copy Details.

Items can be linked to multiple bibliographic records simultaneously. If you click the linked titles button in the copy details, then you will retrieve a list of bibliographic records to which this item is linked.

Scenario 2: I want to link an item to another bibliographic record, and I do have the item in hand. 1) Retrieve the bibliographic record to which you would like to add the item.

2) Click Actions for this Record → Manage Conjoined Items.

3) A note in the bottom left corner of the screen will confirm that the record was targeted for linkage with conjoined items, and the Manage Conjoined Items screen will appear.

4) Select the peer type from the drop down menu, and scan in the barcode of the item that you want to link to this record.

5) Click Link to Bib (Submit).

6) The linked item will appear in the screen. The Result column indicates Success.

7) To confirm the linkage, click Actions for this Record → OPAC View.

8) When the bibliographic record appears, click Reload. Linked Titles will show the linked title and item.

Scenario 3: I want to edit or break the link between a copy and a bibliographic record. 1) Retrieve the bibliographic record that has a copy linked to it.

2) Click Actions for this Record → Manage Conjoined Items.

3) Select the copy that you want to edit, and right-click or click Actions for Selected Items.

4) Make any changes, and click OK.

UPDATE_COPY - Link items to bibliographic records

Part IX. Serials

Chapter 58. Serials

This documentation is intended for users who will be ordering subscriptions, distributing issues, and receiving issues in Evergreen.

58.1. Serial Control View vs. Alternate Serial Control View

Serial Control View and Alternate Serial Control View offer you two views of Serials. Both views enable you to create subscriptions, add distributions, define captions, predict future issues, and receive items. Serial Control View was designed for users who work with a smaller number of issues and was designed to accommodate workflows in academic and special libraries. Alternate Serial Control View was designed for users who receive a larger number of issues and was designed for use in public libraries.

The views are interoperable, but because the views were designed for different purposes, some differences emerge. For example, Serial Control View enables you to create and edit serials in a single tabbed interface while Alternate Serial Control View leads you through a series of steps on multiple screens. In addition, receiving functions vary between views. Both receiving interfaces enable you to batch receive issues. However, the Serials Batch Receive interface, which is associated with Alternate Serial Control View, allows for more customization of each receiving unit while the Items tab in Serial Control View allows for greater flexibility in creating multi-issue units, such as in binding serials.

Table 58.1. Serials Control View and Alternate Serials Control View Comparison

Function
Serials Control View
Alternate Serials Control View

Menu Style

Menu driven

Wizard oriented

Setting Up subscription

No calendar drop downs

Includes calendar drop down

Setting up distributions

No copy template selection

Requires the selection of a copy template

Creating streams

No setup required

Requires streams

Creating captions and patterns

Wizard available

Wizard available

Adding Starting Issue

No holdings code wizard

Includes holdings code wizard

Generate Predictions

Make predictions

Generate predictions

Add items for special issue

No functionality

New items on issuances tab

58.2. MFHD Records

MARC Format for Holdings Display (MFHD) display in the PAC in addition to holding statements generated by Evergreen from subscriptions created in the Serials Control View or the Alternate Serials Control View. The MFHDs are editable as MARC but the holdings statements generated from the control view are system generated. Multiple MFHDs can be created and are tied to Organizational Units.

Chapter 59. Copy Template for Serials

A copy template enables you to specify item attributes that should be applied by default to copies of serials. You can create one copy template and apply it to multiple serials. You can also create multiple copy templates. Templates will be used in the Alternate Serial Control View or the Serial Control View.

59.1. Create a copy template

To create a copy template, click Admin → Local Administration → Copy Template Editor.

Enter a Name for the template.

Select an owning library from the Owning lib drop down menu. This organization owns the copy template. A staff member with permissions at that organization can modify the copy template. The menu is populated from the organizations that you created in Admin . Server Administration . Organizational Units.

Click the box adjacent to Circulate. If you want the item to circulate.

Check the box adjacent to Holdable. if patrons can place holds on the item.

Check the box adjacent to OPAC Visible. if you want patrons to be able to see the item in the OPAC after you receive it.

Select a loan duration rule from the drop down menu.

Select a fine level for the item from the drop down menu.

Select a copy Location from the drop down menu. The menu is populated from the copy locations that you created in Admin . Local Administration . Copy Locations.

Select a circ modifier from the drop down box. The menu is populated from the modifiers that you created in Admin . Server Administration . Circulation Modifiers.

Check the box adjacent to Floating. if the item is part of a floating collection.

Check the box adjacent to Deposit. if patrons must place a deposit on the copy before they can use it.

Check the box adjacent to Reference. if the item is a reference item.

If the item is in mint condition, then check the box adjacent to Mint Condition.

Enter age protection rules in the Age Protect field. Age protection allows you to control the extent to which an item can circulate after it has been received. For example, you may want to protect new copies of a serial so that only patrons who check out the item at your branch can use it.

Enter a message in the Alert Message field. This message will appear every time the item is checked out to a patron.

Enter a code from the MARC fixed fields if you want to control the circulation based on the item type in the Circ as Type field.

Enter a deposit amount if patrons must place a deposit on the copy before they can use it.

Enter the price of the item.

Enter the ID of the copy status in the Status field. A list of copy statuses and their IDs can be found in Admin . Server Administration . Copy Status.

Click Save.

Fine level and loan duration are required fields in the Copy Template Editor.

59.2. Edit a copy template

You can make changes to an existing copy template. Changes that you make to a copy template will apply to any items that you receive after you edited the template.

To edit a copy template, click your cursor in the row that you want to edit. The row will turn blue.

Double-click. The copy template will appear, and you can edit the fields.

After making changes, click Save.

From the copy template interface, you can delete copy templates that have never been used.

Chapter 60. Serials Control View

Serial Control View is separate from the Alternate Serial Control interface. Serial Control View enables you to manage serials in a single tabbed interface. This view also enables you to bind units. Serial Control View consists of five tabs: Items, Units, Distributions, Subscriptions, and Claims. Units and Claims are not functional in 2.0.

60.1. Create a subscription

A subscription is designed to hold all information related to a single serial title. Therefore, each library is likely to have only one subscription per serial title.

Click the Subscriptions link.

Select the branch that will own the subscription.

Right-click or click Actions for Selected Row, and click Add Subscription.

Enter the date that the subscription begins in the start date, and click Apply. You must enter the date in YYYY-MM-DD format.

Enter the date that the subscription ends in the end date. This field is optional.

Enter the difference between the nominal publishing date of an issue and the date that you expect to receive your copy in the Expected Date Offset. For example, if an issue is published the first day of each month, but you receive the copy two days prior to the publication date, then enter -2 days into this field.

When finished, click Create Subscription(s) in the bottom right corner of the screen.

A confirmation message appears. Click OK.

You can add notes to the subscription by clicking Subscription Notes. These notes are currently viewable only in the staff client by clicking on the Subscription Notes button.

60.2. Create a distribution

Distributions indicate the branches that should receive copies of a serial. Distributions work together with streams to indicate the number of copies that should be sent to each branch.

Click the distributions link beneath the subscription. Right click or click Actions for Selected Rows, and click Add distribution.

Apply a new label to the distribution. It may be useful to identify the branch to which you are distributing these issues in this field. This field is not publicly visible and only appears when an item is received. There are no limits on the number of characters that can be entered in this field.

Apply a prefix to the spine label if desired. This information will display in Serial Control View when the items are received, but it does not print on the spine label in . 0.

Apply a suffix to the spine label if desired. This information will display in Serial Control View when the items are received, but it does not print on the spine label in . 0.

The holding library is filled in by default and is the library to which you attached the subscription.

The Legacy Record Entry contains the MFHD records that are attached to the bib record if the owning library is identical to the distribution’s holding library. A distribution can thus be an extension of an MFHD record. Select the MFHD record from the drop down menu.

The Receive Call Number field is empty until you receive the first item. When you receive the first item, you are prompted to enter a call number. That call number will populate this drop down menu.

The Bind Call Number field is empty until you bind the first item. When you receive the first item, you are prompted to enter a call number. That call number will populate this drop down menu.

Receive Unit Template - The template that should be applied to copies when they are received. Select a template from the drop down menu.

Bind Unit Template - The template that should be applied to copies when they are bound. Select a template from the drop down menu.

When finished, click Create Distribution(s) in the bottom right corner of the screen.

A confirmation message appears. Click OK.

You can add notes to the distribution by clicking Distribution Notes. These notes are currently viewable only in the staff client by clicking on the Distribution Notes button.

60.3. Create Captions and Patterns

Click the captions and patterns link beneath the subscription. Right click or click Actions for Selected Rows, and click Add Caption/Pattern.

Apply the type which can be for basic subscription, supplements, or indices

Apply active. Only one active caption and pattern is allowed per type

In the Pattern Code dbox, you can enter a JSON representation of the 85X tag by hand, or you can click the Pattern CodeWizard to enter the information in a user-friendly format.

60.3.1. Use the Pattern Code Wizard

The Pattern Code Wizard enables you to create the caption of the item and add its publication information. The Wizard is composed of five pages of questions. You can use the Next and Previous navigation buttons in the top corners to flip between pages.

To add a pattern code, click Wizard.

60.3.1.1. Page 1: Enumerations

To add an enumeration, check the box adjacent to Use enumerations.. The enumerations conform to $a-$h of the 853,854, and 855 MARC tags.

A field for the First level will appear. Enter the enumeration for the first level. A common first level enumeration is volume, or "v."

Click Add Enumeration.

A field for the Second level will appear. Enter the enumeration for the second level. A common first level enumeration is number, or "no."

Enter the number of bibliographic units per next higher level. This conforms to $u in the 853, 854, and 855 MARC tags.

Choose the enumeration scheme from the drop down menu. This conforms to $v in the 853, 854, and 855 MARC tags.

You can add up to six levels of enumeration.

Add Alternate Enumeration if desired.

When you have completed the enumerations, click Next.

60.3.1.2. Page 2: Calendar

To use months, seasons, or dates in your caption, check the box adjacent to Use calendar changes.

Identify the point in the year at which the highest level enumeration caption changes.

In the Type drop down menu, select the points during the year at which you want the calendar to restart.

In the Point drop down menu, select the specific time at which you would like to change the calendar

To add another calendar change, click Add Calendar Change. There are no limits on the number of calendar changes that you can add.

When you have finished the calendar changes, click Next.

60.3.1.3. Page 3: Chronology

To add chronological units to the captions, check the box adjacent to Use chronology captions.

Choose a chronology for the first level. If you want to display the terms such as "year" and "month" next to the chronology caption in the catalog, then check the box beneath Display in holding field.

To include additional levels of chronology, click Add Chronology Caption. Each level that you add must be smaller than the previous level.

After you have completed the chronology caption, click Next.

60.3.1.4. Page 4: Compress and Expand Captions

Select the appropriate option for compressing or expanding your captions in the catalog from the compressibility and expandability drop down menu. The entries in the drop down menu correspond to the indicator codes and the subfield $w in the 853 tag. Compressibility and expandability correspond to the first indicator in the 853 tag.

Choose the appropriate caption evaluation from the drop down menu.

Choose the frequency of your publication from the drop down menu. For irregular frequencies, you may wish to select use number of issues per year, and enter the total number of issues that you receive each year. However, in the . 0 release, recommended practice is that you use only regular frequencies. Planned development will create an additional step to aid in the creation of irregular frequencies.

Click Next.

60.3.1.5. Page 5: Regularity Information

If needed, check box for Use specific regularity information

Choose the appropriate information for combined, omitted or published issues

Choose the appropriate frequency and issue

Add additional rows as required

60.3.1.6. Page 5: Finish Captions and Patterns

To complete the wizard, click Create Pattern Code.

Return to Subscription Details.

Confirm that the box adjacent to Active is checked. Click Save Changes. The row is now highlighted gray instead of orange.

60.4. Creating an Issuance

The Issuances function enables you to manually create an issue. Evergreen will use the initial issue that you manually create to predict future issues.

Click the Issuances link beneath the subscription. Right click or click Actions for Selected Rows, and click Issuance.

Click the holdings code and click apply. Currently there is no wizard to create this code. The wizard is only available in the Alternate Serials Control View.

Click the Caption/Pattern selecting the appropriate patternand click apply

Click the date published and enter date information (format YYYY-MM-DD) and click apply

Click label, enter label and click apply

When finished, click Create Issuance(s) in the bottom right corner of the screen.

A confirmation message appears. Click OK.

60.5. Generate Prediction

Open the Subscriptions tab.

Right-click or click Actions for Selected Row → Make predictions.

A pop up box will ask you how many items you want to predict. Enter the number, and click OK.

A confirmation message will appear. Click OK.

Click the Issuances link to view the predicted issues.

Chapter 61. Alternate Serial Control View

Using the Alternate Serial Control View, you can create a subscription, a distribution, a stream, and a caption and pattern, and you can generate predictions and receive issues. To access Alternate Serial Control View, open a serials record, and click Actions for this Record >> Alternate Serial Control. This opens the Subscriptions interface

Create a subscription

Create a distribution

Create a a stream (within the distribution)

Create a caption and pattern (or import from bibliographic or legacy serial records)

Create at least the first issuance and generate predictions

61.1. Creating a Subscription

A subscription is designed to hold all information related to a single serial title. Therefore, each library is likely to have only one subscription per serial title.

Add new subscriptions to a serials record that exists in the catalog.

Create a subscription

Click New Subscription.

Select an owning library. The owning library indicates the organizational unit(s) whose staff can use this subscription. This menu is populated with the shortnames that you created for your libraries in the organizational units tree in Admin . Server Administration . Organizational Units. The rule of parental inheritance applies to this list. For example, if a system is made the owner of a subscription, then users, with appropriate permissions, at the branches within the system could also use this subscription.

Enter the date that the subscription begins in the start date. Recommended practice is that you select the date from the drop down calendar although you can manually enter a date. Owning library and start date are required fields in the new subscription pop up box.

Enter the date that the subscription ends in the end date. Recommended practice is to select a date from the drop down calendar, but you can manually enter a date, also.

Enter the difference between the nominal publishing date of an issue and the date that you expect to receive your copy in the Expected Date Offset. For example, if an issue is published the first day of each month, but you receive the copy two days prior to the publication date, then enter -2 days into this field.

Click Save.

After you save the subscription, it will appear in a list with a hyperlinked ID number. Use the drop down menu at the top of the screen to view subscriptions at other organizations.

61.2. Creating a Distribution

Distributions indicate the branches that should receive copies of a serial. Distributions work together with streams to indicate the number of copies that should be sent to each branch.

Click the Distributions tab.

Click New Distribution.

Enter a name for the distribution in the Label field. It may be useful to identify the branch to which you are distributing these issues in this field. This field is not publicly visible and only appears when an item is received. There are no limits on the number of characters that can be entered in this field.

Select a holding library from the drop down menu. The holding library is the branch that will receive the copies.

Select a copy template from the Receive Unit Template drop down menu. This menu is populated with the copy templates that you created in Copy Template Editor.

Label, Holding Library, and Receive Unit Template are required fields in the new distribution pop up box.

Ignore the fields, Unit Label Prefix and Unit Label Suffix. These fields are not functional in Alternate Serial Control View.

Click Save. The distribution will appear in a list in the Distributions tab in the Subscription Details.

61.3. Creating a Stream

Distributions work together with streams to indicate the number of copies that should be sent to each branch. Distributions identify the branches that should receive copies of a serial. Streams identify how many copies should be sent to each branch. Streams are intended for copies that are received on a recurring, even if irregular, basis.

Click the hyperlinked title of the distribution. The number of streams that have already been created for this distribution displays adjacent to the title. You can choose one of two ways to create a stream: New Stream or Create Many Streams. The New Stream button allows you to create one new stream and assign it a routing label.

Click New Stream

Enter a routing label so that the copy could be read by specific users or departments before the copy is shelved. The routing label appears during receiving and could be added to routing lists; it is not viewable by the public. Routing lists do not print from in 2.0. This field is optional.

Click Save.

The "Create Many Streams button" allows you to create multiple streams at once, but it does not allow you to add a routing label when you create the stream.

Click Create Many Streams.

Enter the number of streams that you want to create in the How many. Field.

Click Create.

61.4. Creating a Caption and Pattern

The Captions and Patterns wizard allows you to enter caption and pattern data as it is described by the 853, 854, and 855 MARC tags. These tags allow you to define how issues will be captioned, and how often the library receives issues of the serial.

Open the Subscription Details.

Click the Captions and Patterns tab.

Click Add Caption and Pattern.

In the Type drop down box, select the MARC tag to which you would like to add data.

In the Pattern Code drop down box, you can enter a JSON representation of the 85X tag by hand, or you can click the Wizard to enter the information in a user-friendly format.

The Caption and Pattern that you create is Active by default, but you can deactivate a caption and pattern at a later time by unchecking the box.

A subscription may have multiple captions and patterns listed in the subscription details, but only one Caption and Pattern can be active at any time. If you want to add multiple patterns, e.g. for Basic and Supplement, Click Add Caption and Pattern.

61.4.1. Use the Pattern Code Wizard

The Pattern Code Wizard enables you to create the caption of the item and add its publication information. The Wizard is composed of five pages of questions. You can use the Next and Previous navigation buttons in the top corners to flip between pages.

To add a pattern code, click Wizard.

61.4.1.1. Page 1: Enumerations

To add an enumeration, check the box adjacent to Use enumerations.. The enumerations conform to $a-$h of the 853,854, and 855 MARC tags.

A field for the First level will appear. Enter the enumeration for the first level. A common first level enumeration is volume, or "v."

Click Add Enumeration.

A field for the Second level will appear. Enter the enumeration for the second level. A common first level enumeration is number, or "no."

Enter the number of bibliographic units per next higher level. This conforms to $u in the 853, 854, and 855 MARC tags.

Choose the enumeration scheme from the drop down menu. This conforms to $v in the 853, 854, and 855 MARC tags.

You can add up to six levels of enumeration.

Add Alternate Enumeration if desired.

When you have completed the enumerations, click Next.

61.4.1.2. Page 2: Calendar

To use months, seasons, or dates in your caption, check the box adjacent to Use calendar changes.

Identify the point in the year at which the highest level enumeration caption changes.

In the Type drop down menu, select the points during the year at which you want the calendar to restart.

In the Point drop down menu, select the specific time at which you would like to change the calendar

To add another calendar change, click Add Calendar Change. There are no limits on the number of calendar changes that you can add.

When you have finished the calendar changes, click Next.

61.4.1.3. Page 3: Chronology

To add chronological units to the captions, check the box adjacent to Use chronology captions.

Choose a chronology for the first level. If you want to display the terms, "year" and "month" next to the chronology caption in the catalog, then check the box beneath Display in holding field.

To include additional levels of chronology, click Add Chronology Caption. Each level that you add must be smaller than the previous level.

After you have completed the chronology caption, click Next.

61.4.1.4. Page 4: Compress and Expand Captions

Select the appropriate option for compressing or expanding your captions in the catalog from the compressibility and expandability drop down menu. The entries in the drop down menu correspond to the indicator codes and the subfield $w in the 853 tag. Compressibility and expandability correspond to the first indicator in the 853 tag.

Choose the appropriate caption evaluation from the drop down menu.

Choose the frequency of your publication from the drop down menu. For irregular frequencies, you may wish to select use number of issues per year, and enter the total number of issues that you receive each year. However, in the . 0 release, recommended practice is that you use only regular frequencies. Planned development will create an additional step to aid in the creation of irregular frequencies.

Click Next.

61.4.1.5. Page 5: Regularity Information

If needed, check box for Use specific regularity information

Choose the appropriate information for combined, omitted or published issues

Choose the appropriate frequency and issue

Add additional rows as required

61.4.1.6. Page 5: Finish Captions and Patterns

To complete the wizard, click Create Pattern Code.

Return to Subscription Details.

Confirm that the box adjacent to Active is checked. Click Save Changes. The row is now highlighted gray instead of orange.

61.5. Creating an Issuance

The Issuances tab enables you to manually create an issue. Evergreen will use the initial issue that you manually create to predict future issues.

Click the Issuances tab in the Subscription Details.

Click New Issuance.

The Subscription, Creator, and Editor fields contain subscription and user IDs, respectively. These fields are disabled because Evergreen automatically fills in these fields.

Enter a name for this issuance in the Label field. There are no limits on the number of characters that can be entered in this field. You may want to enter the month and year of the publication in hand.

Enter the Date Published of the issuance that you are editing. Recommended practice is that you select the date from the drop down calendar although you can manually enter a date. If you are creating one manual issue before automatically predicting more issues, then this date should be the date of the most current issue before the prediction starts.

Select a Caption/Pattern from the drop down menu. The numbers in the drop down menu correspond to the IDs of the caption/patterns that you created.

The Holding Type appears by default and corresponds to the Type that you selected when you created the Caption/Pattern.

In the holding code area of the New Issuance dialog, click Wizard. The Wizard enables you to add holdings information.

Enter the volume of the item in hand in the v. field.

Enter the number of the item in hand in the no. field.

Enter the year of publication in the Year field.

Enter the month of publication in the Month field if applicable. You must enter the calendar number of the month rather than the name of the month. For example, enter 12 if the item in hand was published in December.

Enter the day of publication in the day field if applicable.

Click Compile to generate the holdings code.

61.6. Generate Item Predictions

After you manually create the first issue, Evergreen will predict future issuances. Use the Generate Predictions functionality to predict future issues.

Click Subscription Details → Issuances → Generate Predictions.

Choose the length of time for which you want to predict issues. If you select the radio button to predict until end of subscription, then Evergreen will predict issues until the end date that you created when you created the subscription. See simplesect . 1 for more information. If you do not have an end date, select the radio button to predict a certain number of issuances, and enter a number in the field.

Click Generate.

Evergreen will predict a run of issuances and copies. The prediction will appear in a list.

You can delete the first, manual issuance by clicking the check box adjacent to the issuance and clicking Delete Selected.

Chapter 62. Edit Subscriptions

Subscriptions can be edited to change the caption and pattern and other information.

Serials Control View

. To access Serial Control View, open a serials record, and click Actions for this Record >> Serial Control. This opens the Subscriptions interface
. Click the subscriptions tab
. Click on the appropriate link to edit

Alternate Serials Control View

To access Alternate Serial Control View, open a serials record, and click Actions for this Record >> Alternate Serial Control. This opens the Subscriptions interface

Click the hyperlinked ID number to edit the subscription.

Click on the appropriate tab to edit the information

Chapter 63. Receiving

You can receive either through the Serials Control View or in Batch Receive with the simple or advanced interface

63.1. Serials Control View Receiving

To receive items, click the Receive radio button. In the top half of the screen, the items that have yet to be received are displayed. In the bottom half of the screen, recently received items are displayed.

Select the branch that will receive the items from the drop down box.

Select the issue that you want to receive.

Select the current working unit. Click Set Current Unit, located in the lower right corner of the screen. A drop down menu will appear.

If you want to barcode each item individually, select Auto per item. This setting is recommended for most receiving processes.

If you want each item within a unit to share the same barcode, then select New Unit. This setting is advised for most binding processes.

If you want the item to be received or bound into an existing item, select Recent and select the desired issue. To making a change in bound items, receive or bind the items into an already existing unit.

Click Receive/Move Selected.

Enter a barcode and call number if prompted to do so.

A message confirming receipt of the item appears. Click OK.

The screen refreshes. In the top half of the screen, the item displays a received date. In the bottom half of the screen, the item that you have just received is now at the top of the list of the received items.

After receiving items, you can view the updated holdings in the OPAC. In this example, the legacy MFHD record and the items recently received in the serial control view display together in the MFHD statement.

63.2. Batch Receiving

You can batch receive items through a simple or an advanced interface. The simple interface does not allow you to add barcodes or use the copy template. These items are also not visible in the OPAC. The advanced interface enables you to use the copy templates that you created, add barcodes, and make items OPAC visible and holdable.

You can access both Batch Receive interfaces from two locations in the ILS. From the Subscription Details screen, you can click Batch Item Receive. You can also access these interfaces by opening the catalog record for the serial, and clicking Actions for this Record . Serials Batch Receive.

63.2.1. Simple Batch Receiving

Follow these steps to receive items in batch in a simple interface.

The Batch Receive interface displays issues that have not yet been received. The earliest expected issue appears at the top of the list.

In the right lower corner, you see a check box to Create Units for Received Items. If you do not check this box, then you will receive items in simple mode.

Click Next.

In simple mode, the distributions that you created are displayed. They are marked received by default. If you hover over the branch name, you can view the name of the distribution and its stream.

You can receive and add a note to each item individually, or you can perform these actions on all of the distributions and streams at once. To do so, look above the line, and enter the note that you want to apply to all copies and confirm that the box to Receive. is checked.

Click Apply. The note should appear in the note field in each distribution.

Then click Receive Selected Items.

The received items are cleared from the screen.

63.2.2. Advanced Batch Receiving

Follow these steps to receive items in batch in a simple interface.

The Batch Receive interface displays issues that have not yet been received. The earliest expected issue appears at the top of the list.

If you want to barcode each copy, display it in the catalog, and make it holdable, then check the box adjacent to Create Units for Received Items in the lower right side of the screen.

This will allow you to utilize the copy templates and input additional information about the copy:

Barcode - You can scan printed barcodes into the barcode field for each copy, or you can allow the system to auto-generate barcodes. To auto-generate barcodes, check the box adjacent to Auto-generate., and enter the first barcode into the barcode field in the first row of the table. Then press the Tab key. The remaining barcode fields will automatically populate with the next barcodes in sequence, including check digits.

Circ Modifiers - The circ modifiers drop down menu is populated with the circulation modifiers that you created in Admin . Server Administration . Circulation Modifiers. If you entered a circ modifier in the copy template that you created for this subscription, then it will appear by default in the distributions.

Call Number - Enter a call number. Any item with a barcode must also have a call number.

Note - Add a note. There are no limits on the number of characters that can be entered in this field. The note only displays in this screen.

Copy Location - The copy location drop down menu is populated with the copy locations that you created in Admin . Local Administration . Copy Location Editor. If you entered a copy location in the copy template that you created for this subscription, then it will appear by default in the distributions.

Price - If you entered a price in the copy template that you created for this subscription, then it will appear by default in the distributions. You can also manually enter a price if you did not include one in the copy template.

Receive - The boxes in the Receive Column are checked by default. Uncheck the box if you do not want to receive the item. Evergreen will retain the unreceived copies and will allow you to receive them at a later time.

When you are ready to receive the items, click Receive Selected Items.

The items that have been received are cleared from the Batch Receive interface. The remaining disabled item is an unreceived item.

If the items that you received have a barcode, a copy template that was set to OPAC Visible, and are assigned a shelving location that is OPAC Visible, then you can view the received items in the catalog. Notice that the Holdings Summary has been updated to reflect the most recent addition to the holdings.

Chapter 64. Special Issues

Currently, Setting up the special issue can only be done through the Alternate Serials Control view.

Create an issuance in the Serials Control View or the Alternate Serials Control View

In the Alternate Serials Control View, click on the name of your special issue in the list of issuances.

Click the New Items button

Enter the appropriate information

The item is now ready to receive. If you complete the Date Received field and change the status to received then it will receive the issue but it won’t create the associated copy record whereas if you leave it blank and receive the item through the Serials Control View or Batch Receive function you can create the Copy Record at that time.

Chapter 65. Holdings

65.1. System Generated Holdings Statement

As issues are received, Evergreen creates a holding statement in the OPAC based on what is set up in the Caption and Patterns of the subscription. The systems generated holdings can only be edited by changing caption and pattern information and there is no ability to edit the statement as free text.

65.2. MARC Format for Holdings Display (MFHD)

Evergreen users can create, edit and delete their own MFHD.

65.2.1. Create an MFHD record

Open a serial record, and in the bottom right corner above the copy information, click Add MFHD Record. You can also add the MFHD statement by clicking Actions for this Record .MFHD Holdings .Add MFHD Record.

A message will confirm that you have created the MFHD Record. Click OK.

Click Reload in the top left corner of the record.

The Holdings Summary will appear. Click Edit Holdings in the right corner.

Click Edit Record.

The MFHD window will pop up. Enter holdings information. Click Save MFHD.

Close the MFHD window.

Click Reload in the top left corner of the record. The Holdings Summary will reflect the changes to the MFHD statement.

65.2.2. Edit a MFHD record

Open a serial record, and in the Actions for this Record, click MFHD Record>>Edit MFHD Record and select the appropriate MFHD.

Edit the MFHD

Click Save MFHD

65.2.3. Delete a MFHD Record

Open a serial record, and in the Actions for this Record, click MFHD Record>>Delete MFHD Record and select the appropriate MFHD.

Click to confirm the deletion of the MFHD

Chapter 66. Group Serials Issues in the Template Toolkit OPAC

In previous versions of Evergreen, issues of serials displayed in a list ordered by publication date. The list could be lengthy if the library had extensive holdings of a serial. Using the Template Toolkit OPAC that is available in version 2.2, you can group issues of serials in the OPAC by chronology or enumeration. For example, you might group issues by date published or by volume. Users can expand these hyperlinked groups to view holdings of specific issues. The result is a clean, easy-to-navigate interface for viewing holdings of serials with a large quantity of issues.

This feature is only available in the Template Toolkit OPAC.

66.1. Administration

Enable the following organizational unit settings to use this feature:

Click Admin → Local Administration → Library Settings Editor.

Search or scroll to find Serials: Default display grouping for serials distributions presented in the OPAC.

Click Edit.

Enter enum to display issues by enumeration, or enter chron to display issues in chronological order. This value will become your default setting for display issues in the OPAC.

Click Update Setting.

Search or scroll to find OPAC: Use fully compressed serials holdings.

Select the value, True, to view a compressed holdings statement.

Click Update Setting.

66.2. Displaying Issues in the OPAC

Your library system has a subscription to the periodical, Bon Appetit. The serials librarian has determined that the issues at the Forest Falls branch should display in the OPAC by month and year. The issues at the McKinley branch should display by volume and number. The serials librarian will create two distributions for the serial that will include these groupings.

Retrieve the bibliographic record for the serial, and click Actions for this Record → Alternate Serial Control.

Create a New Subscription or click on the hyperlinked ID of an existing subscription.

Click New Distribution.

Create a label to identify the distribution.

Select the holding library from the drop down menu that will own physical copies of the issues.

Select a display grouping. Select chronology from the drop down menu.

Select a template from the drop down menu to receive copies.

Click Save.

Click New Distribution and repeat the process to send issues to the McKinley Branch. Choose enumeration in the Display Grouping field to display issues by volume and number.

Complete the creation of your subscription.

Retrieve the record from the catalog.

Scroll down to and click the Issues Held link. The issues label for each branch appears.

Click the hyperlinked issues label.

The issues owned by the Forest Falls branch are grouped by chronology:

The issues owned by the McKinley branch are grouped by enumeration:

Part X. Circulation

Chapter 67. Introduction

Use this section for understanding the circulation procedures in the Evergreen system.

Chapter 68. Circulating Items

68.1. Check Out (F1)

68.1.1. Regular Items

1) To check out an item press F1, click Check Out on the Circulation toolbar, or select Circulation → Check Out Items.

2) Scan or enter patron’s barcode and click Submit if entering barcode manually. If scanning, number is submitted automatically.

3) Scan or enter item barcode manually, clicking Submit if manual.

4) Due date is now displayed.

5) When all items are scanned, hit the F1 key or click the Check Out button on the Circulation toolbar to generate slip receipt or to exit patron record if not printing slip receipts.

68.1.2. Pre-cataloged Items

1) Go to patron’s Check Out screen by clicking Circulation → Check Out Items.

2) Scan the item barcode.

3) At prompt, click Pre-Cataloged.

4) Enter required information and click Check Out.

On check-in, Evergreen will prompt staff to re-route the item to cataloging.

68.1.3. Due Dates

Circulation periods are pre-set. When items are checked out, due dates are automatically calculated and inserted into circulation records if the Specific Due Date checkbox is not selected on the Check Out screen. The Specific Due Date checkbox allows you to set a different due date to override the pre-set loan period.

Before you scan the item, select the Specific Due Date checkbox. Use the calendar widget to select a date. Or click in day, month or year, then use the up or down arrows to make the change or simply delete the data, then enter again. Time is used for hourly loan only. This date applies to all items until you change the date, de-select the Specific Due Date checkbox, or quit the patron record.

68.2. Check In (F2)

68.2.1. Regular check in

1) To check in an item, select Circulation → Check In Items, click Check In on the Circulation toolbar, or press F2.

2) Scan item barcode or enter manually and click Submit.

3) If there is an overdue fine associated with the checkin, an alert will appear at the top of the screen with a fine tally for the current checkin session. To immediately handle fine payment, click the alert to jump to the patron’s bill record.

68.2.2. Backdated check in

This is useful for clearing a book drop.

1) To change effective check-in date, select Circulation → Check In Items, or press F2. Use the calendar widget to choose the effective date.

2) The top green bar changes to red. The new effective date is now displayed in the header.

3) Move the cursor to the Barcode field. Scan the items. When finishing backdated check-in, change the Effective Date back to today’s date.

68.2.3. Backdate Post-Checkin

After an item has been checked in, you may use the Backdate Post-Checkin function to backdate the check-in date.

1) Select the item on the Check In screen, click Actions for Selected Items → Backdate Post-Checkin.

2) Use the calendar widget to select an effective check-in date. Click Apply. Overdue fines, if any, will be adjusted according to the new effective check-in date.

Checkin Modifiers

At the right bottom corner there is a Checkin Modifiers pop-up list. The options are:

Ignore Pre-cat Items: no prompt when checking in a pre-cat item. Item will be routed to Cataloging with Cataloging status.

Suppress Holds and Transit: item will not be used to fill holds or sent in transit. Item has Reshelving status.

Amnesty Mode/Forgive Fines: overdue fines will be voided if already created or not be inserted if not yet created (e.g. hourly loans).

Auto-Print Hold and Transit Slips: slips will be automatically printed without prompt for confirmation.

These options may be selected simultaneously. The selected option is displayed in the header area.

68.3. Renewal and Editing the Item’s Due Date

Checked-out items can be renewed if your library’s policy allows it. The new due date is calculated from the renewal date. Existing loans can also be extended to a specific date by editing the due date or renewing with a specific due date.

68.3.1. Renewing via a Patron’s Account

1) Retrieve the patron record and go to the Items Out screen.

2) Select the item you want to renew. Click on Actions for Selected Items → Renew. If you want to renew all items in the account, click Renew All instead.

3) If you want to specify the due date, click Renew with Specific Due Date. You will be prompted to select a due date. Once done, click Apply.

Renewal can also be done on the Item Status screen. See the section called Item Status (F5) for more information.

68.3.2. Renewing by Item Barcode

1) To renew items by barcode, select Circulation → Renew Items or press CTRL-F2.

2) Scan or manually entire the item barcode.

3) If you want to specify the due date, click Specific Due Date and select a new due date from the calendar.

68.3.3. Editing Due Date

1) Retrieve the patron record and go to the Items Out screen.

2) Select the item you want to renew. Click on Actions for Selected Items → Edit Due Date.

3) Select a new due date in the pop-up window, then click Apply.

You can select multiple items by pressing down the CTRL key on your keyboard and clicking each items you want to edit.

Editing a due date is not included in the renewal count.

68.4. Marking Items Lost and Claimed Returned

68.4.1. Lost Items

1) To mark items Lost, retrieve patron record and click Items Out.

2) Select the item. Click on Actions for Selected Items → Mark Lost (by Patron).

3) The lost item now displays in the Lost/Claimed Returned/Long Overdue, Has Unpaid Billings section of the patron record.

4) The lost item also adds to the count of Lost items in the patron summary on the left (or top) of the screen.

Lost Item Billing

Marking an item Lost will automatically bill the patron the replacement cost of the item as recorded in the price field in the item record, and a processing fee as determined by your local policy. If the lost item has overdue charges, the overdue charges may be voided or retained based on local policy.

A lost-then-returned item will disappear from the Items Out screen only when all bills linked to this particular circulation have been resolved. Bills may include replacement charges, processing fees, and manual charges added to the existing bills.

The replacement fee and processing fee for lost-then-returned items may be voided if set by local policy. Overdue fines may be reinstated on lost-then-returned items if set by local policy.

68.4.2. Refunds for Lost Items

If an item is returned after a lost bill has been paid and the library’s policy is to void the replacement fee for lost-then-returned items, there will be a negative balance in the bill. A refund needs to be made to close the bill and the circulation record. Once the outstanding amount has been refunded, the bill and circulation record will be closed and the item will disappear from the Items Out screen.

If you need to balance a bill with a negative amount and close the linked lost circulation record without making a refund (removing the item from the Lost, Claimed Returned, Long Overdue, Has Unpaid Bills panel on the Items Out screen), you need to add two dummy bills to the existing bills. The first one can be of any amount (e.g. $0.01), while the second should be of the absolute value of the negative amount. Then you need to void the first dummy bill. The reason for using a dummy bill is that Evergreen will check and close the circulation record only when payment is applied or bills are voided.

68.4.3. Claimed Returned Items

1) To mark an item Claimed Returned, retrieve the patron record and go to the Items Out screen.

2) Select the item, then select Actions for Selected Items → Mark Claimed Returned from the dropdown menu.

3) Select a date and click Apply.

4) The Claimed Returned item now displays in the Lost/Claimed Returned/Long Overdue, Has Unpaid Billings section of the patron record.

5) The Claimed Returned item adds to the count of Check Outs that are Claimed Returned in the patron summary on the left (or top) of the screen. It also adds to the total Claims-returned Count (including those that are current Check Outs and those that have since been returned) that is displayed when editing the patron’s record.

More on Claimed Returned Items

The date entered for a Claimed Returned item establishes the fine. If the date given has passed, bills will be adjusted accordingly.

When a Claimed Returned item is returned, if there is an outstanding bill associated with it, the item will not disappear from the Items Out screen. It will disappear when the outstanding bills are resolved.

When an item is marked Claimed Returned, the value in Claims-returned Count field in the patron record is automatically increased. Staff can manually adjust this count by editing the patron record.

68.5. In-house Use (F6)

1) To record in-house use, select Circulation → Record-In House Use, click Check Out → Record In-House Use on the circulation toolbar , or press F6.

2) To record in-house use for cataloged items, enter number of uses, scan barcode or type barcode and click Submit.

The statistics of in-house use are separated from circulation statistics. The in-house use count of cataloged items is not included in the items' total use count.

68.6. Item Status (F5)

The Item Status screen is very useful. Many actions can be taken by either circulation staff or catalogers on this screen. Here we will cover some circulation-related functions, namely checking item status, viewing past circulations, inserting item alert messages, marking items missing or damaged, etc.

68.6.1. Checking item status

1) To check the status of an item, select Search → Search for copies by Barcode or Circulation → Show Item Status by Barcode; click the Item Status button on the circulation or cataloging toolbar; or press F5.

2) Scan the barcode or type it and click Submit. The current status of the item is displayed with selected other fields. You can use the column picker to select more fields to view.

3) Click the Alternate View button, and the item summary and circulation history will be displayed.

4) Click List View to go back.

If the item’s status is "Available", the displayed due date refers to the previous circulation’s due date.

Upload From File allows you to load multiple items saved in a file on your local computer. The file contains a list of the barcodes in text format. To ensure smooth uploading and further processing on the items, it is recommended that the list contains no more than 100 items.

68.6.2. Viewing past circulations

1) To view past circulations, retrieve the item on the Item Status screen as described above.

2) Select Actions for Selected Items → Show Last Few Circulations.

3) The item’s recent circulation history is displayed.

4) To retrieve the patron(s) of the last circulations, click the Retrieve Last Patron or the Retrieve All These Patrons button at the bottom of the above screen. Patron record(s) will be displayed in new tab(s).

The number of items that displays in the circulation history can be set in Local Administration → Library Settings Editor.

You can also retrieve the past circulations on the patron’s Items Out screen and from the Check In screen.

68.6.3. Marking items damaged or missing and other functions

1) To mark items damaged or missing, retrieve the item on the Item Status screen.

2) Select the item. Click on Actions for Selected Items → Mark Item Damaged or Mark Item Missing.

[NOTE} Depending on the library’s policy, when marking an item damaged, bills (cost and/or processing fee) may be inserted into the last borrower’s account.

3) Following the above procedure, you can check in and renew items by using the Check in Items and Renew Items on the dropdown menu.

68.6.4. Item alerts

The Edit Item Attributes function on the Actions for Selected Items dropdown list allows you to edit item records. Here, we will show you how to insert item alert messages by this function. See cataloging instructions for more information on item editing. 1) Retrieve record on Item Status screen.

2) Once item is displayed, highlight it and select Actions for Selected Items → Edit Item Attributes.

3) The item record is displayed in the Copy Editor.

4) Click Alert Message in the Miscellaneous column. The background color of the box changes. Type in the message then click Apply.

5) Click Modify Copies, then confirm the action.

Chapter 69. Holds Management

69.1. Display Hold Types on Pull Lists

This feature ensures that the hold type can be displayed on all hold interfaces.

You will find the following changes to the hold type indicator:

The hold type indicator will display by default on all XUL-based hold interfaces. XUL-based hold interfaces are those that number the items on the interface. This can be overridden by saving column configurations that remove the column, Type.

The hold type indicator will display by default on the HTML-based pull list. To access, click Circulation → Pull List for Hold Requests → Print Full Pull List (Alternate Strategy).

The hold type indicator can be added to the Simplified Pull List. To access, click Circulation* → Pull List for Hold Requests → Simplified Pull List Interface.

To add the hold type indicator to the simplified pull list, click Simplified Pull List Interface, and right click on any of the column headers. The Column Picker appears in a pop up window. Click the box adjacent to Hold Type, and Click Save. The Simplified Pull List Interface will now include the hold type each time that you log into the staff client.

Chapter 70. Booking Module

70.1. Creating a Booking Reservation

Only staff members may create reservations. A reservation can be started from a patron record, or a booking resource. To reserve catalogued items, you may start from searching the catalogue, if you do not know the booking item’s barcode.

70.1.1. To create a reservation from a patron record

1) Retrieve the patron’s record.

2) Select Other -→ Booking -→ Create or Cancel Reservations. This takes you to the Reservations Screen.

3) For non-catalogued items, choose a Bookable Resource Type and click Next. For catalogued items, enter the barcode in Enter the barcode of a catalogued, bookable resource box, then click Next beside the box.

4) For non-catalogued resources, the Bookable Resource Type and the items associated with the type will appear.

For catalogued items, the title and the item will display in the box.

5) Select the date and time for the reservation in I need this resource… area. Click the date field. A calendar widget will be displayed for you to choose a date. Click the time field to choose time from the dropdown list.

If incorrect date and time is selected, the date/time boxes will appear in red. For example, if the time for which the reservation is set has already passed, the boxes will appear in red. There must be at least 15 minutes between the creation of the reservation and the start time of the reservation.

6) For non-catalogued resources, patrons may specify special feature(s), if any, of the resource. With these attributes: allows you to do so. For example, if a patron is booking a laptop he/she can choose between PC and Mac and even choose a specific operating system if they need to. Click the drop down arrow to select your option from the list.

7) Select the pickup location from the dropdown list.

8) If there are multiple copies of the resource and any item listed is acceptable, click Reserve Any. To choose a specific item, select it and then click Reserve Selected.

9) A message will confirm that the action succeeded. Click OK on the prompt.

10) The screen will refresh and the reservation will appear below the patron’s name at the bottom of the screen.

70.1.2. To create a reservation from a booking resource

You need to know the barcode of the patron when you create a reservation for him/her from a booking resource.

1) From the Booking menu, select Create Reservations

2) Choose a Bookable Resource Type and click Next or enter the barcode of a catalogued resource and click Next.

3) For non-catalogued resources, a screen showing the Bookable Resource Type and the items associated with the type will appear.

For catalogued resources, the title and item will appear.

4) Enter the user’s barcode in the Reserve to patron barcode box. The user’s existing reservations, if any, will appear at the bottom of the screen.

5) Select the date and time for the reservation in I need this resource… area. Click the date field. A calendar widget will be displayed for you to choose a date. Click the time field to choose time from the dropdown list.

If incorrect date and time is selected, the date/time boxes will appear in red. For example, if the time for which the reservation is set has already passed, the boxes will appear in red. The times must be set correctly for the reservation to be created. There must be at least 15 minutes between the creation of the reservation and the start time of the reservation.

6) For non-catalogued resources, patrons may specify special feature(s), if any, of the resource. The With these attributes: allows you to do so. For example, if a patron is booking a laptop they can choose between PC and Mac and even choose a specific operating system if they need to. Click the dropdown arrow to select your option from the list.

7) Select the pickup location from the dropdown list.

8) If there are multiple copies of the resource and any item listed is acceptable, click Reserve Any. To choose a specific item, select it and then click Reserve Selected.

9) A message will confirm that the action succeeded. Click OK on the prompt.

10) The screen will refresh and the reservation will appear below the patron’s name at the bottom of the screen.

70.1.3. Search the catalogue to create a reservation

If you would like to reserve a catalogued item but do not know the item barcode, you may start with a catalogue search.

1) In the staff client, select Cataloguing -→ Search the Catalogue or keyboard shortcut F3 to search for the item you wish to reserve. You may search by any bibliographic information.

2) Click the title to display the record summary. In the Copy Summary, select Copy Details in Actions column.

3) The Copy Details will appear in a new row. In the barcode column, click the book now link.

4) A screen showing the title and barcodes of available copies will appear.

5) Enter the user’s barcode in the Reserve to patron barcode box. The user’s existing reservations, if any, will appear at the bottom of the screen.

6) Select the date and time in I need this resource… section. If the date and time set is incorrect the boxes appear in red. For example, if the time for which the reservation is set has already passed, the boxes will appear in red.

7) Select pickup location. If there are multiple copies and any of the listed items is acceptable, click Reserve Any. To choose a specific item, select it and then click Reserve Selected.

8) A message will confirm that the action succeeded. Click OK on the prompt.

9) The screen will refresh, and the reservation will appear below the user’s name.

Reservations on catalogued items can be created on Item Status (F5) screen. Select the item, then Actions for Selected Items → Book Item Now.

70.2. Reservation Pull List

Reservation pull list can be generated dynamically on the Staff Client.

1) To create a pull list, select Booking -→ Pull List.

2) You can decide how many days in advance you would like to pull reserved items. Enter the number of days in the box adjacent to Generate list for this many days hence. For example, if you would like to pull items that are needed today, you can enter 1 in the box, and you will retrieve items that need to be pulled today.

3) Click Fetch to retrieve the pull list.

4) The pull list will appear. Click Print to print the pull list.

70.3. Capturing Items for Reservations

Reservations must be captured before they are ready to be picked up by the patron.

Always capture reservations in Booking Module. Check In function in Circulation does not function the same as Capture Resources.

1) In the staff client, select Booking -→ Capture Resources.

2) Scan the item barcode or type the barcode then click Capture.

3) The message Capture succeeded will appear to the right. Information about the item will appear below the message. Click Print button to print a slip for the reservation.

70.4. Picking Up Reservations

Always use the dedicated Booking Module interfaces for tasks related to reservations. Items that have been captured for a reservation cannot be checked out using the Check Out interface, even if the patron is the reservation recipient.

1) Ready-for-pickup reservations can be listed from Other -→ Booking -→ Pick Up Reservations within a patron record or Booking -→ Pick Up Reservations.

2) Scan the patron barcode if using Booking -→ Pick Up Reservations.

3) The reservation(s) available for pickup will display. Select those you want to pick up and click Pick Up.

4) The screen will refresh to show that the patron has picked up the reservation(s).

70.5. Returning Reservations

When a reserved item is brought back, staff must use the Booking Module to return the reservation.

1) To return reservations, select Booking -→ Return Reservations

2) You can return the item by patron or item barcode. Here we choose Resource to return by item barcode. Scan or enter the barcode, and click Go.

3) A pop up box will tell you that the item was returned. Click OK on the prompt.

4) If we select Patron on the above screen, after scanning the patron’s barcode, reservations currently out to that patron are displayed. Highlight the reservations you want to return, and click Return.

5) The screen will refresh to show any resources that remain out and the reservations that have been returned.

Reservations can be returned from within patron records by selecting Other -→ Booking -→ Return Reservations

70.6. Cancelling a Reservation

A reservation can be cancelled in a patron’s record or reservation creation screen.

70.6.1. Cancel a reservation from the patron record

1) Retrieve the patron’s record.

2) Select Other -→ Booking -→ Create or Cancel Reservations.

3) The existing reservations will appear at the bottom of the screen.

4) Highlight the reservation that you want to cancel. Click Cancel Selected.

Use Shift or Ctrl on keyboard and mouse click to select multiple reservations if needed.

5) A pop-up window will confirm the cancellation. Click OK on the prompt.

6) The screen will refresh, and the cancelled reservation(s) will disappear.

70.6.2. Cancel a reservation on reservation creation screen

1) Access the reservation creation screen by selecting Booking -→ Create Reservations.

2) Select any Bookable Resource Type, then click Next.

3) Scan or type in the patron barcode in Reserve to Patron box then hit Enter.

4) Patron’s existing reservations will display at the bottom of the screen.

5) Select those that you want to cancel, then click Cancel Selected.

Chapter 71. Circulation - Patron Record

71.1. Searching Patrons

To search for a patron, select the Patron Search option from the toolbar, Search → Search for Patrons from the menu bar, or F4.

The Patron Search screen will display. The orientation of the search pane may be vertical or horizontal, depending on your library’s configuration. It will contain options to search on the following fields:

Last Name

First Name

Middle Name

Alias

Address 1

Address 2

City

Zip

Phone

Email

State

Barcode

OPAC Login ID

Use the options above the search fields to include patrons marked “inactive” in your search results or to limit results to patrons in a specific library branch or in a specific permission group.

[Tip]
Tips for searching

Search one field or combine fields for more precise results.

Truncate search terms for more search results.

Once you have located the desired patron, highlight the entry for this patron in the results screen. A summary for this patron will display in place of the search fields.

Use the Retrieve Patron button to retrieve the patron for circulation or editing.

The Search Form button may be used to resume searching for patrons.

71.2. Registering New Patrons

To register a new patron, select Patron Registration from the toolbar, Circulation → Register Patron from the menu bar, or shift + F1. The Patron Registration form will display.

Mandatory fields display in yellow.

The Show Only Required Fields and Show Suggested Fields may be used to limit the options on this page.

When one of these options is selected, it is possible switch to the other limited view or to revert to the original view by selecting Show All Fields.

When finished entering the necessary information, select Save to save the new patron record or Save & Clone to register a patron with the same address. When Save & Clone is selected, the address information is copied into the resulting patron registration screen. It is linked to the original patron. Address information may only be edited through the original record.

Requested fields may be configured in the Library Settings Editor (Admin → Local Admin → Library Settings Editor).

Statistical categories may be created for information tracked by your library that is not in the default patron record.

These may be configured in the Statistical Categories Editor (Admin → Local Admin → Statistical Categories Editor).

Staff accounts may also function as patron accounts.

71.3. Updating Patron Information

Retrieve the patron record as described in the section Searching Patrons.

Select Edit from the options that display at the top of the patron record.

Edit information as required. When finished, select Save. If you attempt to close out of the patron account before the information is received, an alert will display.

Select OK to continue or Cancel to return to the editing form.

After selecting Save, the page will refresh. The edited information will be reflected in the patron summary pane.

If collapsed, you will need to manually “un-collapse” this pane.

71.4. Renewing Library Cards

Expired patron accounts display with a black box around the patron’s name, a note that the patron is expired, and – when initially retrieved – an alert stating that the “Patron account is EXPIRED.”

Open the patron record in edit mode as described in the section Updating Patron Information.

Navigate to the information field labeled Privilege Expiration Date. Enter a new date in this box. When you place your cursor in the Patron Expiration Date box, a calendar widget will display to help you easily navigate to the desired date.

Select the date using the calendar widget or key the date in manually. Click the Save button. The screen will refresh and the “expired” alerts on the account will be removed.

71.5. Lost Library Cards

Retrieve the patron record as described in the section Searching Patrons.

Open the patron record in edit mode as described in the section Updating Patron Information.

Next to the Barcode field, select the Replace Barcode button.

This will clear the barcode field. Enter a new barcode and Save the record. The screen will refresh and the new barcode will display in the patron summary pane.

If a patron’s barcode is mistakenly replaced, the old barcode may be reinstated. Retrieve the patron record as described in the section Searching Patrons. Open the patron record in edit mode as described in the section Updating Patron Information.

Select the See All button next to the Replace Barcode button. This will display the current and past barcodes associated with this account.

Check the box(es) for all barcodes that should be “active” for the patron. An “active” barcode may be used for circulation transactions. A patron may have more than one “active” barcode. Only one barcode may be designated “primary.” The “primary” barcode displays in the patron’s summary information in the Library Card field.

Once you have modified the patron barcode(s), Save the patron record. If you modified the “primary” barcode, the new primary barcode will display in the patron summary screen.

71.6. Resetting Patron’s Password

A patron’s password may be reset from the OPAC or through the staff client. To reset the password from the staff client, retrieve the patron record as described in the section Searching Patrons.

Open the patron record in edit mode as described in the section Updating Patron Information.

Select the Reset Password button next to the Password field.

The existing password is not displayed in patron records for security reasons.

A new number will populate the Password and Verify Password text boxes. Make note of the new password and Save the patron record. The screen will refresh and the new password will be suppressed from view.

71.7. Barring a Patron

A patron may be barred from circulation activities. To bar a patron, retrieve the patron record as described in the section Searching Patrons.

Open the patron record in edit mode as described in the section Updating Patron Information.

Check the box for Barred in the patron account.

Save the user. The screen will refresh.

The patron account will now display an alert stating that the patron account is BARRED.

Additionally a red box and note will indicate the patron’s barred status.

Barring a patron from one library bars that patron from all consortium member libraries.

To unbar a patron, uncheck the Barred checkbox.

71.8. Barred vs. Blocked

Barred: Stops patrons from using their library cards; alerts the staff that the patron is banned/barred from the library. The “check-out” functionality is disabled for barred patrons (NO option to override – the checkout window is unusable and the bar must be removed from the account before the patron is able to checkout items).  These patrons may still log in to the OPAC to view their accounts.

Blocked: Often, these are system-generated blocks on patron accounts. 

Some examples:

Patron exceeds fine threshold

Patron exceeds max checked out item threshold

A notice appears when a staff person tries to checkout an item to blocked patrons, but staff may be given permissions to override blocks.

71.9. Patron Alerts

When an account has an alert on it, a Stop sign is displayed when the record is retrieved.

Navigating to an area of the patron record using the navigation buttons at the top of the record (for example, Edit or Bills) will clear the message from view.

If you wish to view these alerts after they are cleared from view, they may be retrieved. Use the Other menu to select Display Alert and Messages.

There are two types of Patron Alerts:

System-generated alerts: Once the cause is resolved (e.g. patron’s account has been renewed), the message will disappear automatically.

Staff-generated alerts: Must be added and removed manually.

To add an alert to a patron account, retrieve the patron record as described in the section Searching Patrons.

Open the patron record in edit mode as described in the section Updating Patron Information.

Enter the alert text in the Alert Message field.

Save the record. The screen will refresh and the alert will display.

Additionally, the patron name will be highlighted in yellow and a note will indicate that there is an alert on the account.

To remove the alert, retrieve the patron record as described in the section Searching Patrons.

Open the patron record in edit mode as described in the section Updating Patron Information.

Delete the alert text in the Alert Message field.

Save the record.

The screen will refresh and the indicators for the alert will be removed from the account.

71.10. Patron Notes

When a patron account contains a note, a See Notes message appears beneath the patron’s name in the patron summary pane.

Notes are strictly communicative and may be made visible to the patron via their account on the OPAC. In the JSPAC, these notes display on the account summary screen in the OPAC.

To insert or remove a note, retrieve the patron record as described in the section Searching Patrons.

Open the patron record in edit mode as described in the section Updating Patron Information.

Use the Other menu to navigate to Notes.

Select the Add New Note button. An Add Note window displays.

Enter note information.

Select the check box for Patron Visible to display the note in the OPAC.

Select Add Note to save the note to the patron account.

To delete a note, go to Other → Notes and use the Delete This Note button under each note.

An alert will display. Click Yes to delete the note or No to retain the note. A confirmation box will display; click OK.

71.11. Merging Patron Records

When patron records are erroneously duplicated, they may be merged into one record. As described in the section Searching Patrons, search for the term(s) shared by the two records.

Select the two records to merge by pressing down the CTRL key and clicking each record.

Click the Merge Patrons button next to the Search Form and Retrieve Patron buttons on the top of the screen.

A Record Merging window will display. Compare the two records.

Select the record you want to keep by checking the radio button Lead Record next to the appropriate record.

After making your selection, click the Merge button. The screen will refresh. Only one of the two patron names will display.

Once two records have been merged, the notes, bills, holds and outstanding items under the non-lead record are brought to the lead record. Staff-inserted alert messages are not transferred from the non-lead record; lead record alerts are retained.

Patron records may also be merged from the Patron Group screen Retrieve one of the two patron records you want to merge.

Go to Other → Group Member Details.

The patron records are displayed as group members. If both patron records are not already displayed on this screen, click Choose an Action → Move another patron to this patron group.

At the prompt, scan or type the patron’s barcode.

Click OK.

Confirm the move by clicking the Move button on top of the screen.

Click OK on the confirmation pop-up window.

Both records are displayed as group members.

Select both records by pressing CTRL key and clicking each record.

Click Choose an Action → Merge Selected Patrons. The merging records window pops up.

Choose the lead record and continue to merge records as described in the above.

The merged record will still show under group members. Both members point to the same patron record.

71.12. Bills and Payments

When a patron account has bills attached to it, a note displays under the patron name in the patron summary panel.

To view more information about the patron’s bills, or to make payments on or edit the bills, click on the Bills button from the patron account screen.

Circulation bills: system-generated (overdue fines, lost item cost, processing fees, etc.).

Overdue fines are added daily once an item is overdue. When an item is marked

as lost, bills may be automatically generated to cover the item’s cost and a

processing fee, according to library policy.

Grocery bills: staff-applied to patron accounts.

One default grocery bill, Misc, exists in an unmodified Evergreen

installation. Additional grocery bills may be configured through the Admin

settings. Admin → Server Administration → Billing Types.

To view more information about a bill, highlight the bill and right-click or use the Actions for Selected Transactions menu to select Full Details.

A window will display additional information about the bill, including a record of any payments that have been made on the bill.

From the Full Details screen, portions of the bill may be voided (e.g. an erroneous daily overdue charge) by using the Void selected billings button. Notes may be added to payments or line items by using the Edit note button.

71.12.1. Making Payments

To collect payments, retrieve the patron record. Navigate to the Bills screen as described in Bills and Payments.

When bills are paid, the money applied starts at the top of the list of bills. To pay specific bills, uncheck the bills that you do not wish to pay at this time. The amount displayed in Total Checked: will change to reflect the appropriate amount.

the presence of the Uncheck All and Check All options below the list of bills.

When you are ready to make a payment, select a payment type from the dropdown menu in the Pay Bill portion of the screen.

Enter the amount of payment in the Payment received field.

If you would like to add a note to the payment, check the box for Annotate Payment.

Click Apply Payment! to make the payment.

If you have selected Annotate Payment, a box will display for the annotation.

The screen will refresh to display the updated bill information for the patron. If change is due, the bottom portion of the screen, Change Due Upon Payment: will briefly reflect the amount due to the patron.

if you need more time to review the amount due, click outside the Payment Received box before selecting Apply Payment! This will cause the screen to refresh and display the amount due.

It is possible to convert change due to a patron credit by selecting the Convert Change to Patron Credit checkbox.

Items marked with red are still checked out. It is possible for a patron to

pay a bill while the item is still out and accruing fines. When Check is

selected as the payment type, it is not necessary to select _Annotate

Payment_, as a box for the check number and a note displays automatically.

71.12.2. Void vs. Forgive

Void clears all history of the bill, while forgive retains the history.

71.12.3. Forgiving Bills

Choose forgive as the payment type as described in the section Making Payments.

Enter the amount to be forgiven. Choose Annotate Payment as required by local policy.

Apply Payment. Annotate, if prompted.

The screen will refresh to display the payment.

71.12.4. Voiding Bills

Bills under one transaction are grouped in one bill line. Bills may be voided in part or in whole.

To void the full billing amount:

Select the bill(s) to be voided from the list in the patron account.

Right click or use the Actions for Selected Transactions menu to select Void All Billings.

Confirm the action.

To void a partial amount:

Select a billing and choose Full Details for the transaction, as described in the section <circ_vs_grocery,Circulation vs. Grocery Bills>>

The bill details screen displays.

Select the specific bill to void.

Void Selected Billings and confirm the action.

71.12.5. Adding New “Grocery” Bills

A grocery bill can be added as a new bill or to an existing bill.

To add a as a new bill:

Retrieve the patron record.

Navigate to the Bills screen.

Click the_Bill Patron_ button above the list of current bills.

Choose appropriate Billing Type from the drop down menu. (“Grocery” is the. only available transaction type.) . Enter the Amount and Note (as required). . Submit this Bill and confirm this action.

To add bill to an existing bill line:

Retrieve the patron record.

Navigate to the Bills screen.

Highlight the desired bill.

Use the Actions for Selected Transactions to select Add Billing. Confirm this action.

Follow steps 4 through 6 above. There is no confirmation message after clicking Submit this Bill.

The Money Summary will adjust accordingly.

71.12.6. Bill History

To view a patron’s bill history:

Retrieve the patron record.

From the Bills screen, click History.

A Bill History screen with two tabs will display. One for Transactions and one for Payments.

For more information about a specific billing, select the bill and click Full Details. A screen detailing item information, billings, and payments will display.

Items may be deleted from the catalog even if a charge for that item is still attached to the patron’s record. The charge will remain on the patron’s account after the deletion.

71.12.7. Sorting Money Columns in Billing Interface

This enhancement enables Evergreen to sort money columns numerically in the billing interface. You can perform an ascending or descending sort on these columns.

To view and sort patron bills, retrieve the patron’s account, and click the Bills tab in the top right corner of the screen. You can view the money that is owed or paid in the "Total Billed" and Total Paid columns. Simply click on the headers of these columns to sort the columns numerically.

Chapter 72. Triggered Events and Notices

Improvements to the Triggered Events interface enables you to easily filter, sort, and print triggered events from the patron’s account or an item’s details. This feature is especially useful when tracking notice completion from a patron’s account.

72.1. Access and View

You can access Triggered Events from two Evergreen interfaces: a patron’s account or an item’s details.

To access this interface in the patron’s account, open the patron’s record and click Other → Triggered Events.

To access this interface from the item’s details, enter the item barcode into the Item Status screen, and click Actions for Selected Items → Triggered Events.

Information about the patron, the item, and the triggered event appear in the center of the screen. Add or delete columns to the display by right clicking on any column. The Column Picker appears in a pop up box and enables you to select the columns that you want to display.

72.2. Filter

The triggered events that display are controlled by the filters on the right side of the screen. By default, Evergreen displays completed circulation events. Notice that the default filters display Event State is Complete and Core Type is Circ.

To view completed hold-related events, such as hold capture or hold notice completion, choose Event State is Complete and Core Type is Hold from the drop down menu.

You can also use the Event State filter to view circs and holds that are pending or have an error.

Add and delete filters to customize the list of triggered events that displays. To add another filter, click Add Row. To delete a filter, click the red X adjacent to a row.

72.3. Sort

You can sort your results by clicking the column name.

72.4. Print

You can select the events that you want to print, or you can print all events. To print selected events, check the boxes adjacent to the events that you want to print, and click Print Selected Events. To print all events, simply click Print All Events.

72.5. Reset

If the triggered event does not complete or the notice is not sent and the trigger needs to be run again, then select the event, and click Reset Selected Events.

Chapter 73. Offline Transactions

Evergreen’s Standalone Interface / Offline Interface is designed to log transactions during network outage, which can be uploaded and processed once network operations are restored.

The terms Offline Interface and Standalone Interface mean the same thing: a separate program to handle simple circulation tasks while the network is down.

To access the Offline Interface, navigate to the Staff Client login screen and click Standalone Interface. The Evergreen Standalone Interface window opens.

73.1. Patron Registration

Patron registration on the Evergreen Offline Interface records the minimum patron information necessary to register a new patron.

All of the fields, except for Line 2 of Billing Address, on the Patron Registration screen are required. If your library does not record information for any field, you need to work out a standard fake value for it, for example, 1900-01-01 for Date of Birth.

The account password is automatically generated. Patrons can access their account with the password after the offline transactions are uploaded and processed.

To register a patron:

Click Register Patron on the top menu bar. The Patron Registration window opens.

Fill in the form with patron information, using the drop down list if available.

Click Save patron registration. A confirmation dialog opens.

Click OK to finish registering the patron.

73.2. Checking Out Items

To circulate items from the Evergreen standalone interface:

Click Check Out on the top menu bar. The Standalone Check Out screen opens.

Ensure that the date on the left-hand side of the menu bar is correct.

Enter the patron’s library card barcode in the Enter the patron’s barcode field by scanning or typing the barcode.

Ensure that the due date is correct in the Enter the item due date field. You may enter a different due date manually, or select a different duration from the dropdown list to select a relative due date based on the loan period.

Check out items:

For cataloged items, scan each item’s barcode in Enter the item barcode field. The barcode appears on the right side of the screen.

For non-cataloged items:

Click Choose a non-barcode option to select a non-catalogued category from the drop-down list.

Enter the number of items you want to check out, then click OK on the prompt window.

Scan all items, changing the due date if necessary.

To print a receipt, select the Print receipt? checkbox.

Click Save these transactions.

The default dates are based on your computer settings.

Pre-catalogued item circulation is not available on Offline Interface. If an existing pre-cat barcode happens to be used, it is checked out with the previous author and title. If a new pre-cat barcode is attempted, an error of ASSET NOT FOUND (item not found) is returned upon processing offline transactions.

73.3. Renew

To renew an item, you must know the item’s barcode number. The patron’s barcode is optional.

To renew items from the Evergreen standalone interface:

Click Renew on the top menu bar.

The Renew window is very similar to the Check Out window. The differences are that a patron’s barcode is optional on the Renew window, and the non-barcoded option is not available on the Renew window, as non-barcoded items can not be renewed.

Ensure that the date on the left-hand side of the menu bar is correct.

(Optional): Enter the patron’s library card barcode in the Enter the patron’s barcode field by scanning or typing the barcode.

Ensure that the due date is correct in the Enter the item due date field. You may enter a different due date manually, or select a different duration from the dropdown list to select a relative due date based on the loan period.

For each item to be renewed, enter the item’s barcode in the Enter the item barcode field. The barcode appears on the right side of the screen.

To print a receipt, select the Print receipt? checkbox.

Click Save these transactions.

73.4. In-house Use

To record in-house use transactions from the Evergreen standalone interface:

Click In House Use on the top menu bar.

Ensure the date is correct.

Enter the number of uses to record for the item in the Enter the number of uses of the item field.

Enter the item barcode number in the Enter the item barcode field.

Repeat the previous 2 steps until all items have been scanned.

To print a receipt, select the Print receipt? checkbox.

Click Save these transactions.

73.5. Check In

To check in items from the Evergreen standalone interface:

Click Check In on the top menu bar. The Check In screen opens.

Ensure the date is correct.

For each item you want to check in, enter the item’s barcode in the Enter item barcode field. The number is displayed on the right side of the screen.

To print a receipt, select the Print receipt? checkbox.

Click Save these transactions.

Without access to Evergreen database, items on holds or with special status will not be captured in offline mode.

73.6. Uploading Offline Transactions

Once you are able to connect to the server, you need to upload the offline transactions. To avoid confusion for patrons and in the system, you should upload the offline transactions as soon as possible.

Once you can connect to the server, there are 3 steps to uploading offline transactions:

Create a session: to be done by local system administrators at an administration workstation.

Upload transactions to a session: to be done by circulation staff at circulation workstations.

Process the uploaded transactions: to be done by local system administrators at an administration workstation.

Once network connectivity has been restored, a local system administrator must create an offline transaction session. Then, staff can upload transactions from each of the workstations used in offline circulation mode to that session. Once all of the branch workstations have uploaded their transactions to the session, the manager processes all the transactions from all the workstations at once.

Uploading transactions to the session does not put the transactions into the Evergreen database. The transactions will not be sent to the Evergreen database until the manager processes the session.

73.6.1. Creating an Offline Session

In the Evergreen staff client:

Log into Evergreen using an account with local system administrator privileges.

Select Admin (-) → Offline Transaction Management from the menu. The Offline Transactions screen opens. Previously created sessions are listed in the Offline Sessions section.

In the upper Offline Sessions section, click Create to create a new session.

Enter a name for the session, like Internet Down 2012-12-02. Click OK.

In the Offline Sessions section, highlight the session you created. An Uploaded Transactions section appears in the bottom of the screen. Initially, this section is empty.

Inform library staff that the session has been created and tell them the name of the session.

73.6.2. Uploading Workstation Transactions to a Session

Wait until the local system administrator has created a session and told you that it’s ready for your upload. There may be several sessions shown on the Offline Transaction Management screen, so you will need the name of the correct session from your local system administrator.

Each workstation used to perform offline circulation during the outage must upload its transactions to the offline transaction session.

To upload offline transaction from a workstation to a session, perform the following steps in the Evergreen staff client:

Log into Evergreen with your regular username and password.

Select Admin (-) → Offline Transaction Management from the menu. The Offline Transactions screen opens. You should see at least one session in the Offline Sessions section. You may also see older sessions.

In the upper Offline Sessions section, highlight the correct session, then click Upload. The transactions are transferred to the Evergreen server.

When the transactions have been uploaded, select the session in the Offline Sessions section. The value in the Upload Count column has increased by 1 and your workstation is now listed in the Uploaded Transactions section.

Inform your local system administrator that your transaction has been uploaded to the session.

73.6.3. Processing the Transactions

When all of the participating staff workstations have uploaded their transactions to the offline session, the workstation names are listed in the Uploaded Transactions section. To process the offline transactions and make them live on the Evergreen server:

Log into Evergreen using an account with local system administrator privileges.

Select Admin (-) → Offline Transaction Management from the menu. The Offline Transactions screen opens. Previously created sessions are listed in the Offline Sessions section.

Highlight the correct session and, if necessary, click Refresh to verify all the participating workstations have uploaded their transactions to your session.

Click Process. The processing may take some time to complete, depending on how many transactions you have done. Click Refresh to see the updated status of the processing step. Processing is complete when the Processing? column shows Completed.

The number in the Transactions Processed column is equal to the number of items checked out or checked in. For example, 5 transactions processed could mean that:

5 items were checked out, or

3 items were checked in and 2 items were checked out, or

5 items were checked in.

73.6.4. Exceptions

Exceptions are problems that were encountered during processing. For example, a mis-scanned patron barcode, an open circulation, or an item that was not checked in before it was checked out to another patron would be listed as an exception. Those transactions causing exceptions may not be loaded into Evergreen database. Staff should examine the exceptions and take necessary action.

These are a few notes about possible exceptions. It is not an all-inclusive list.

Checking out a DVD with the wrong date (leaving due date set at +2 weeks instead of +1 week) does not cause an exception.

Overdue books are not flagged as exceptions.

Checking out a reference book does not cause an exception.

Checking out an item belonging to another library does not cause an exception.

The Standalone Interface does not recognize books on hold, so no exceptions will be generated when matching items are checked in or checked out.

The Standalone Interface can recognize blocked, barred, and expired patrons, as well as lost cards, if you have recently run an Admin (-) → Download Offline Patron List action on the workstation on which you are using the Standalone Interface. You will get an error message indicating the patron status from within the Standalone Interface at check-out time.

73.6.4.1. Common error messages

ROUTE-ITEM - Indicates the book should be routed to another branch or library system. You’ll need to find the book and re-check it in (online) to get the Transit Slip to print.

COPY_STATUS_LOST - Indicates a book previously marked as lost was found and checked in.

CIRC_CLAIMS_RETURNED - Indicates a book previously marked as claimed-returned was found and checked in.

ASSET_COPY_NOT_FOUND - Indicates the item barcode was mis-scanned/mis-typed.

ACTOR_CARD_NOT_FOUND - Indicates the patron’s library barcode was mis-scanned/ mis-typed.

OPEN_CIRCULATION_EXISTS - Indicates a book was checked out that had never been checked in.

MAX_RENEWALS_REACHED - Indicates the item has already been renewed the maximum times allowed (or it’s a video/DVD).

Part XI. Reports

Chapter 74. Introduction

Learn how to create and use reports in Evergreen.

Chapter 75. Starting and Stopping the Reporter Daemon

Before you can view reports, the Evergreen administrator must start the reporter daemon from the command line of the Evergreen server.

The reporter daemon periodically checks for requests for new reports or scheduled reports and gets them running.

75.1. Starting the Reporter Daemon

To start the reporter daemon, run the following command as the opensrf user:

clark-kent.pl --daemon

You can also specify other options:

sleep=interval: number of seconds to sleep between checks for new reports to run; defaults to 10

lockfile=filename: where to place the lockfile for the process; defaults to /tmp/reporter-LOCK

concurrency=integer: number of reporter daemon processes to run; defaults to 1

boostrap=filename: OpenSRF bootstrap configuration file; defaults to /openils/conf/opensrf_core.xml

The open-ils.reporter process must be running and enabled on the gateway before the reporter daemon can be started.

Remember that if the server is restarted, the reporter daemon will need to be restarted before you can view reports unless you have configured your server to start the daemonautomatically at start up time.

75.2. Stopping the Reporter Daemon

To stop the reporter daemon, you have to kill the process and remove the lockfile. Assuming you’re running just a single process and that the lockfile is in the default location, perform the following commands as the opensrf user:

kill `ps wax | grep "Clark Kent" | grep -v grep | cut -b1-6`

rm /tmp/reporter-LOCK

Chapter 76. Folders

There are three main components to reports: Templates, Reports, and Output. Each of these components must be stored in a folder. Folders can be private (accessible to your login only) or shared with other staff at your library, other libraries in your system or consortium. It is also possible to selectively share only certain folders and/or subfolders.

There are two parts to the folders pane. The My Folders section contains folders created with your Evergreen account. Folders that other users have shared with you appear in the Shared Folders section under the username of the sharing account.

76.1. Creating Folders

Whether you are creating a report from scratch or working from a shared template you must first create at least one folder.

The steps for creating folders are similar for each reporting function. It is easier to create folders for templates, reports, and output all at once at the beginning, though it is possible to do it before each step. This example demonstrates creating a folder for a template.

Click on Templates in the My Folders section.

Name the folder. Select Share or Do not share from the dropdown menu.

If you want to share your folder, select who you want to share this folder with from the dropdown menu.

Click Create Sub Folder.

Click OK.

Next, create a folder for the report definition to be saved to. Click on Reports.

Repeat steps 2-5 to create a Reports folder also called Circulation.

Finally, you need to create a folder for the report’s output to be saved in. Click on Output.

Repeat steps 2-5 to create an Output folder named Circulation.

Using a parallel naming scheme for folders in Templates, Reports, and Output helps keep your reports organized and easier to find

The folders you just created will now be visible by clicking the arrows in My Folders. Bracketed after the folder name is whom the folder is shared with. For example, Circulation (BNCLF) is shared with the North Coast Library Federation. If it is not a shared folder there will be nothing after the folder name. You may create as many folders and sub-folders as you like.

76.2. Managing Folders

Once a folder has been created you can change the name, delete it, create a new subfolder, or change the sharing settings. This example demonstrates changing a folder name; the other choices follow similar steps

Click on the folder that you wish to rename.

Click Manage Folder.

Select Change folder name from the dropdown menu and click Go.

Enter the new name and click Submit.

Click OK.

You will get a confirmation box that the Action Succeeded. Click OK.

Chapter 77. Creating Templates

Once you have created a folder, the next step in building a report is to create or clone a template. Templates allow you to run a report more than once without building it anew every time, by changing definitions to suit current requirements. For example, you can create a shared template that reports on circulation at a given library. Then, other libraries can use your template and simply select their own library when they run the report.

It may take several tries to refine a report to give the output that you want. It can be useful to plan out your report on paper before getting started with the reporting tool. Group together related fields and try to identify the key fields that will help you select the correct source.

It may be useful to create complex queries in several steps. For example, first add all fields from the table at the highest source level. Run a report and check to see that you get results that seem reasonable. Then clone the report, add any filters on fields at that level and run another report. Then drill down to the next table and add any required fields. Run another report. Add any filters at that level. Run another report. Continue until you’ve drilled down to all the fields you need and added all the filters. This might seem time consuming and you will end up cloning your initial report several times. However, it will help you to check the correctness of your results, and will help to debug if you run into problems because you will know exactly what changes caused the problem. Also consider adding extra fields in the intermediate steps to help you check your results for correctness.

This example illustrates creating a template for circulation statistics. This is an example of the most basic template that you can create. The steps required to create a template are the same every time, but the tables chosen, how the data is transformed and displayed, and the filters used will vary depending on your needs.

77.1. Choosing Report Fields

Click on the My Folder template folder where you want the template to be saved.

Click on Create a new Template for this folder.

You can now see the template creating interface. The upper half of the screen is the Database Source Browser. The top left hand pane contains the database Sources drop-down list. This is the list of tables available as a starting point for your report. Commonly used sources are Circulation (for circ stats and overdue reports), ILS User (for patron reports), and Item (for reports on a library’s holdings).

The Enable source nullability checkbox below the sources list is for advanced reporting and should be left unchecked by default.

Select Circulation in the Sources dropdown menu. Note that the Core Sources for reporting are listed first, however it is possible to access all available sources at the bottom of this dropdown menu. You may only specify one source per template.

Click on Circulation to retrieve all the field names in the Field Name pane. Note that the Source Specifier (above the middle and right panes) shows the path that you took to get to the specific field.

Select Circ ID in the middle Field Name pane, and Count Distinct from the right Field Transform pane. The Field Transform pane is where you choose how to manipulate the data from the selected fields. You are counting the number of circulations.

Field Transforms have either an Aggregate or Non-Aggregate output type. See the section called Field Transforms for more about Count, _Count Distinct, and other transform options.

Click Add Selected Fields underneath the Field Transform pane to add this field to your report output. Note that Circ ID now shows up in the bottom left hand pane under the Displayed Fields tab.

Circ ID will be the column header in the report output. You can rename default display names to something more meaningful. To do so in this example, select the Circ ID row and click Alter Display Header.

Double-clicking on the displayed field name is a shortcut to altering the display header.

Type in the new column header name, for example Circ count and click OK.

Add other data to your report by going back to the Sources pane and selecting the desired fields. In this example, we are going to add Circulating Item -→ Shelving Location to further refine the circulation report.

In the top left hand Sources pane, expand Circulation. Depending on your computer you will either click on the + sign or on an arrow to expand the tree.

Click on the + or arrow to expand Circulating Item. Select Shelving Location.

When you are creating a template take the shortest path to the field you need in the left hand Sources pane. Sometimes it is possible to find the same field name further in the file structure, but the shortest path is the most efficient.

In the Field Name pane select Name.

In the upper right Field Transform pane, select Raw Data and click Add Selected Fields. Use Raw Data when you do not wish to transform field data in any manner.

Name will appear in the bottom left pane. Select the Name row and click Alter Display Header.

Enter a new, more descriptive column header, for example, Shelving location. Click OK.

Note that the order of rows (top to bottom) will correspond to the order of columns (left to right) on the final report. Select Shelving location and click on Move Up to move Shelving location before Circ count.

Return to the Sources pane to add more fields to your template. Under Sources click Circulation, then select Check Out Date/Time from the middle Field Name pane.

Select Year + Month in the right hand Field Transform pane and click Add Selected Fields

Check Out Date/Time will appear in the Displayed Fields pane. In the report it will appear as a year and month (YYYY-MM) corresponding to the selected tranform.

Select the Check Out Date/Time row. Click Alter Display Header and change the column header to Check out month.

Move Check out month to the top of the list using the Move Up button, so that it will be the first column in an MS Excel spreadsheet or in a chart. Report output will sort by the first column.

Note the Change Transform button in the bottom left hand pane. It has the same function as the upper right Field Transform pane for fields that have already been added.

77.2. Applying Filters

Evergreen reports access the entire database, so to limit report output to a single library or library system you need to apply filters.

After following the steps in the previous section you will see three fields in the bottom left hand Template Configuration pane. There are three tabs in this pane: Displayed Fields (covered in the previous section), Base Filters and Aggregate Filters. A filter allows you to return only the results that meet the criteria you set.

Base Filters apply to non-aggregate output types, while Aggregate Filters are used for aggregate types. In most reports you will be using the Base Filters tab. For more information on aggregate and non-aggregate types see the section called “Field Transforms”.

There are many available operators when using filters. Some examples are Equals, In list, is NULL, Between, Greater than or equal to, and so on. In list is the most flexible operator, and in this case will allow you flexibility when running a report from this template. For example, it would be possible to run a report on a list of timestamps (in this case will be trimmed to year and month only), run a report on a single month, or run a report comparing two months. It is also possible to set up recurring reports to run at the end of each month.

In this example we are going to use a Base Filter to filter out one library’s circulations for a specified time frame. The time frame in the template will be configured so that you can change it each time you run the report.

77.2.1. Using Base Filters

Select the Base Filters tab in the bottom Template Configuration pane.

For this circulation statistics example, select Circulation -→ Check Out Date/Time -→ Year + Month and click on Add Selected Fields. You are going to filter on the time period.

Select Check Out Date/Time. Click on Change Operator and select In list from the dropdown menu.

To filter on the location of the circulation select Circulation -→ Circulating library -→ Raw Data and click on Add Selected Fields.

Select Circulating Library and click on Change Operator and select Equals. Note that this is a template, so the value for Equals will be filled out when you run the report.

For multi-branch libraries, you would select Circulating Library with In list as the operator, so you could specify the branch(es) when you run the report. This leaves the template configurable to current requirements. In comparison, sometimes you will want to hardcode true/false values into a template. For example, deleted bibliographic records remain in the database, so perhaps you want to hardcode deleted=false, so that deleted records don’t show up in the results. You might want to use deleted=true, for a template for a report on deleted items in the last month.

Once you have configured your template, you must name and save it. Name this template Circulations by month for one library. You can also add a description. In this example, the title is descriptive enough, so a description is not necessary. Click Save.

Click OK.

You will get a confirmation dialogue box that the template was successfully saved. Click OK.

After saving it is not possible to edit a template. To make changes you will need to clone it and edit the clone

The bottom right hand pane is also a source specifier. By selecting one of these rows you will limit the fields that are visible to the sources you have specified. This may be helpful when reviewing templates with many fields. Use Ctrl+Click to select or deselect items.

Chapter 78. Generating Reports from Templates

Now you are ready to run the report from the template you have created.

In the My Folders section click the arrow next to Templates to expand this folder and select circulation.

Select the box beside Circulations by month for one library. Select Create a new report from selected template from the dropdown menu. Click Submit.

Complete the first part of report settings. Only Report Name and Choose a folder… are required fields.

1) Template Name, Template Creator, and Template Description are for informational purposes only. They are hard coded when the template is created. At the report definition stage it is not possible to change them.

2) Report Name is required. Reports stored in the same folder must have unique names.

3) Report Description is optional but may help distinguish among similar reports.

4) Report Columns lists the columns that will appear in the output. This is derived from the template and cannot be changed during report definition.

5) Pivot Label Column and Pivot Data Column are optional. Pivot tables are a different way to view data. If you currently use pivot tables in MS Excel it is better to select an Excel output and continue using pivot tables in Excel.

6) You must choose a report folder to store this report definition. Only report folders under My Folders are available. Click on the desired folder to select it.

Select values for the Circulation > Check Out Date/Time. Use the calendar widget or manually enter the desired dates, then click Add to include the date on the list. You may add multiple dates.

The Transform for this field is Year + Month, so even if you choose a specific date (2009-10-20) it will appear as the corresponding month only (2009-10).

It is possible to select relative dates. If you select a relative date 1 month ago you can schedule reports to automatically run each month. If you want to run monthly reports that also show comparative data from one year ago, select a relative date 1 month ago, and 13 months ago.

Select a value for the Circulating Library.

Complete the bottom portion of the report definition interface, then click Save.

1) Select one or more output formats. In this example the report output will be available as an Excel spreadsheet, an HTML table (for display in the staff client or browser), and as a bar chart.

2) If you want the report to be recurring, check the box and select the Recurrence Interval as described in Recurring Reports. In this example, as this is a report that will only be run once, the Recurring Report box is not checked.

3) Select Run as soon as possible for immediate output. It is also possible to set up reports that run automatically at future intervals.

4) It is optional to fill out an email address where a completion notice can be sent. The email will contain a link to password-protected report output (staff login required). If you have an email address in your Local System Administrator account it will automatically appear in the email notification box. However, you can enter a different email address or multiple addresses separated by commas.

Select a folder for the report’s output.

You will get a confirmation dialogue box that the Action Succeeded. Click OK.

Once saved, reports stay there forever unless you delete them.

Chapter 79. Viewing Report Output

When a report runs Evergreen sends an email with a link to the output to the address defined in the report. Output is also stored in the specified Output folder and will remain there until manually deleted.

To view report output in the staff client, open the reports interface from Admin (-) -→ Local Administration -→ Reports

Click on Output to expand the folder. Select Circulation (where you just saved the circulation report output).

View report output is the default selection in the dropdown menu. Select Recurring Monthly Circ by Location by clicking the checkbox and click Submit.

A new tab will open for the report output. Select either Tabular Output or Excel Output. If Bar Charts was selected during report definition the chart will also appear.

Tabular output looks like this:

If you want to manipulate, filter or graph this data, Excel output would be more useful. Excel output looks like this in Excel:

Chapter 80. Cloning Shared Templates

This chapter describes how to make local copies of shared templates for routine reports or as a starting point for customization. When creating a new template it is a good idea to review the shared templates first: even if the exact template you need does not exist it is often faster to modify an existing template than to build a brand new one. A Local System Administrator account is required to clone templates from the Shared Folders section and save them to My Folders.

The steps below assume you have already created at least one Templates folder. If you haven’t done this, please see Creating Folders.

Access the reports interface from the Admin (-) menu under Local Administration -→ Reports

Under Shared Folders expand the Templates folder and the subfolder of the report you wish to clone. To expand the folders click on the grey arrow or folder icon. Do not click on the blue underlined hyperlink.

Click on the subfolder.

Select the template you wish to clone. From the dropdown menu choose Clone selected templates, then click Submit.

By default Evergreen only displays the first 10 items in any folder. To view all content, change the Limit output setting from 10 to All.

Choose the folder where you want to save the cloned template, then click Select Folder. Only template folders created with your account will be visible. If there are no folders to choose from please see Creating Folders.

The cloned template opens in the template editor. From here you may modify the template by adding, removing, or editing fields and filters as described in Creating Templates. Template Name and Description can also be edited. When satisfied with your changes click Save.

Click OK in the resulting confirmation windows.

Once saved it is not possible to edit a template. To make changes, clone a template and change the clone.

Chapter 81. Adding Data Sources to Reporter

You can further customize your Evergreen reporting environment by adding additional data sources.

The Evergreen reporter module does not build and execute SQL queries directly, but instead uses a data abstraction layer called Fieldmapper to mediate queries on the Evergreen database.Fieldmapper is also used by other core Evergreen DAO services, including cstore and permacrud. The configuration file fm_IDL.xml contains the mapping between Fieldmapper class definitions and the database. The fm_IDL.xml file is located in the /openils/conf directory.

There are 3 basic steps to adding a new data source. Each step will be discussed in more detail in the

Create a PostgreSQL query, view, or table that will provide the data for your data source.

Add a new class to fm_IDL.xml for your data source.

Restart the affected services to see the new data source in Reporter.

There are two possbile sources for new data sources:

An SQL query built directly into the class definition in fm_IDL.xml. You can use this method if you are only going to access this data source through the Evergreen reporter and/or cstore code that you write.

A new table or view in the Evergreen PostgresSQL database on which a class definition in fm_IDL.xml. You can use this method if you want to be able to access this data source through directly through SQL or using other reporting tool.

81.1. Create a PostgreSQL query, view, or table for your data source

You need to decide whether you will create your data source as a query, a view, or a table.

Create a query if you are planning to access this data source only through the Evergreen reporter and/or cstore code that you write. You will use this query to create an IDL only view.

Create a view if you are planning to access this data source through other methods in addition to the Evergreen reporter, or if you may need to do performance tuning to optimize your query.

You may also need to use an additional table as part of your data source if you have additional data that’s not included in the base Evergreen, or if you need to use a table to store the results of a query for performance reasons.

To develop and test queries, views, and tables, you will need

Access to the Evergree PostgreSQL database at the command line. This is normally the psql application. You can access the Postgres documentation at the Official Postgres documentation for more information about PostgreSQL.

Knowledge of the Evergreen database structure for the data that you want to access. You can find this information by looking at the Evergreen schema Evergreen schema

If the views that you are creating are purely local in usage and are not intended for contribution to the core Evergreen code, create the Views and Tables in the extend_reporter schema. This schema is intended to be used for local customizations and will not be modified during upgrades to the Evergreen system.

You should make that you have an appropriate version control pocess for the SQL used to create you data sources.

Here’s an example of a view created to incorporate some locally defined user statistical categories:

example view for reports. 

create view extend_reporter.patronstats as
select u.id,
grp.name as "ptype",
rl.stat_cat_entry as "reg_lib",
gr.stat_cat_entry as "gender",
ag.stat_cat_entry as "age_group",
EXTRACT(YEAR FROM age(u.dob)) as "age",
hl.id as "home_lib",
u.create_date,
u.expire_date,
ms_balance_owed
from actor.usr u
join permission.grp_tree grp
    on (u.profile = grp.id and (grp.parent = 2 or grp.name = 'patron'))
join actor.org_unit hl on (u.home_ou = hl.id)
left join money.open_usr_summary ms
    on (ms.usr = u.id)
left join actor.stat_cat_entry_usr_map rl
    on (u.id = rl.target_usr and rl.stat_cat = 4)
left join actor.stat_cat_entry_usr_map bt
    on (u.id = bt.target_usr and bt.stat_cat = 3)
left join actor.stat_cat_entry_usr_map gr
    on (u.id = gr.target_usr and gr.stat_cat = 2)
left join actor.stat_cat_entry_usr_map gr
    on (u.id = gr.target_usr and gr.stat_cat = 2)
left join actor.stat_cat_entry_usr_map ag
    on (u.id = ag.target_usr and ag.stat_cat = 1)
where u.active = 't' and u.deleted <> 't';

81.2. Add a new class to fm_IDL.xml for your data source

Once you have your data source, the next step is to add that data source as a new class in fm_IDL.xml.

You will need to add the following attributes for the class definition:

id. You should follow a consistent naming convention for your class names that won’t create conflicts in the future with any standard classes added in future upgrades. Evergreen normally names each class with the first letter of each word in the schema and table names. You may want to add a local prefix or suffix to your local class names.

controller=”open-ils.cstore”

oils_obj:fieldmapper=”extend_reporter::long_name_of_view”

oils_persist.readonly=”true”

reporter:core=”true” (if you want this to show up as a “core” reporting source)

reporter:label. This is the name that will appear on the data source list in the Evergreen reporter.

oils_persist:source_definition. If this is an IDL-only view, add the SQL query here. You don’t need this attribute if your class is based on a PostgreSQL view or table.

oils_persist:tablename="schemaname.viewname or tablename" If this class is based on a PostgreSQL view or table, add the table name here. You don’t need this attribute is your class is an IDL-only view.

For each column in the view or query output, add field element and set the following attributes. The fields should be wrapped with <field> </field>:

reporter:label. This is the name that appears in the Evergreen reporter.

name. This should match the column name in the view or query output.

reporter:datatype (which can be id, bool, money, org_unit, int, number, interval, float, text, timestamp, or link)

For each linking field, add a link element with the following attributes. The elements should be wrapped with <link> </link>:

field (should match field.name)

reltype (“has_a”, “might_have”, or “has_many”)

map (“”)

key (name of the linking field in the foreign table)

class (ID of the IDL class of the table that is to be linked to)

The following example is a class definition for the example view that was created in the previous section.

example class definition for reports. 

<class id="erpstats" controller="open-ils.reporter-store"
oils_obj:fieldmapper="extend_reporter::patronstats"
oils_persist:tablename="extend_reporter.patronstats" oils_persist:readonly="true"
reporter:label="Patron Statistics" reporter:core="true">
  <fields oils_persist:primary="id">
  <field reporter:label="Patron ID" name="id" reporter:datatype="link" />
  <field reporter:label="Patron Type" name="ptype" reporter:datatype="text" />
  <field reporter:label="Reg Lib" name="reg_lib" reporter:datatype="text" />
  <field reporter:label="Boro/Twp" name="boro_twp" reporter:datatype="text" />
  <field reporter:label="Gender" name="gender" reporter:datatype="text" />
  <field reporter:label="Age Group" name="age_group" reporter:datatype="text" />
  <field reporter:label="Age" name="age" reporter:datatype="int" />
  <field reporter:label="Home Lib ID" name="home_lib_id"
    reporter:datatype="link" />
  <field reporter:label="Home Lib Code" name="home_lib_code"
    reporter:datatype="text" />
  <field reporter:label="Home Lib" name="home_lib" reporter:datatype="text" />
  <field reporter:label="Create Date" name="create_date"
    reporter:datatype="timestamp" />
  <field reporter:label="Expire Date" name="expire_date"
    reporter:datatype="timestamp" />
  <field reporter:label="Balance Owed" name="balance_owed"
    reporter:datatype="money" />
</fields>
<links>
  <link field="id" reltype="has_a" key="id" map="" class="au"/>
  <link field="home_lib_id" reltype="has_a" key="id" map="" class="aou"/>
</links>
</class>

fm_IDL.xml is used by other core Evergreen DAO services, including cstore and permacrud. So changes to this file can affect the entire Evergreen application, not just reporter. After making changes fm_IDL.xml, it is a good idea to ensure that it is valid XML by using a utility such as xmllint – a syntax error can render much of Evergreen nonfunctional. Set up a good change control system for any changes to fm_IDL.xml. You will need to keep a separate copy of you local class definitions so that you can reapply the changes to fm_IDL.xml after Evergreen upgrades.

81.3. Restart the affected services to see the new data source in the reporter

The following steps are needed to for Evergreen to recognize the changes to fm_IDL.xml

Copy the updated fm_IDL.xml into place:

cp fm_IDL.xml /openils/conf/.

(Optional) Make the reporter version of fm_IDL.xml match the core version. Evergreen systems supporting only one interface language will normally find that /openils/var/web/reports/fm_IDL.xml is a symbolic link pointing to /openils/conf/fm_IDL.xml, so no action will be required. However, systems supporting multiple interfaces will have a different version of fm_IDL.xml in the /openils/var/web/reports directory. The right way to update this is to go through the Evergreen internationalization build process to create the entity form of fm_IDL.xml and the updated fm_IDL.dtd files for each supported language. However, that is outside the scope of this document. If you can accept the reporter interface supporting only one language, then you can simply copy your updated version of fm_IDL.xml into the /openils/var/web/reports directory:

cp /openils/conf/fm_IDL.xml /openils/var/web/reports/.

As the opensrf user, run Autogen to to update the Javascript versions of the fieldmapper definitions.

/openils/bin/autogen.sh

As the opensrf user, restart Perl services:

osrf_ctl.sh -l -a restart_perl

As the opensrf user, restart C services:

osrf_ctl.sh -l -a restart_c

As the root user, restart the Apache web server:

service apache2 restart

As the opensrf user, restart the Evergreen reporter. You may need to modify this command depending on your system configuration and PID path:

opensrf-perl.pl -l -action restart -service open-ils.reporter \
-config /openils/conf/opensrf_core.xml -pid-dir /openils/var/run

Restart the Evergreen staff client, or use Admin -→ For Developers -→ Clear Cache

Chapter 82. Running Recurring Reports

Recurring reports are a useful way to save time by scheduling reports that you run on a regular basis, such as monthly circulation and monthly patron registration statistics. When you have set up a report to run on a monthly basis you’ll get an email informing you that the report has successfully run. You can click on a link in the email that will take you directly to the report output. You can also access the output through the reporter interface as described in Viewing Report Output.

To set up a monthly recurring report follow the procedure in Generating Reports from Templates but make the changes described below.

Select the Recurring Report check-box and set the recurrence interval to 1 month.

Do not select Run ASAP. Instead schedule the report to run early on the first day of the next month. Enter the date in YYYY-MM-DD format.

Ensure there is an email address to receive completion emails. You will receive an email completion notice each month when the output is ready.

Select a folder for the report’s output.

Click Save Report.

You will get a confirmation dialogue box that the Action Succeeded. Click OK.

You will get an email on the 1st of each month with a link to the report output. By clicking this link it will open the output in a web browser. It is still possible to login to the staff client and access the output in Output folder.

How to stop or make changes to an existing recurring report? Sometimes you may wish to stop or make changes to a recurring report, e.g. the recurrence interval, generation date, email address to receive completion email, output format/folder or even filter values (such as the number of days overdue). You will need to delete the current report from the report folder, then use the above procedure to set up a new recurring report with the desired changes. Please note that deleting a report also deletes all output associated with it.

Once you have been on Evergreen for a year, you could set up your recurring monthly reports to show comparative data from one year ago. To do this select relative dates of 1 month ago and 13 months ago.

Chapter 83. Template Terminology

83.1. Data Types

The central column of the Database Source Browser lists Field Name and Data Type for the selected database table.

Each data type has its own characteristics and uses:

Data Type
Description
Notes

int

Integer

money

id

Unique number assigned by the database to identify a record

A number that is a meaningful reference for the database but not of much use to a human user. Use in displayed fields when counting records or in filters.

text

Text field

Usually uses the Raw Data transform.

timestamp

Exact date and time

Select appropriate date/time transform. Raw Data includes second and timezone information, usually more than is required for a report.

bool

True or False

Commonly used to filter out deleted item or patron records.

org_unit

A number representing a library, library system, or federation

When you want to filter on a library, make sure that the field name is on an org_unit or id data type.

link

A link to another database table

Link outputs a number that is a meaningful reference for the database but not of much use to a human user. You will usually want to drill further down the tree in the Sources pane and select fields from the linked table. However, in some instances you might want to use a link field. For example, to count the number of patrons who borrowed items you could do a count on the Patron link data.

83.2. Field Transforms

A Field Transform tells the reporter how to process a field for output. Different data types have different transform options.

Raw Data. To display a field exactly as it appears in the database use the Raw Data transform, available for all data types.

Count and Count Distinct. These transforms apply to the id data type and are used to count database records (e.g. for circulation statistics). Use Count to tally the total number of records. Use Count Distinct to count the number of unique records, removing duplicates.

To demonstrate the difference between Count and Count Distinct, consider an example where you want to know the number of active patrons in a given month, where ``active" means they borrowed at least one item. Each circulation is linked to a Patron ID, a number identifying the patron who borrowed the item. If we use the Count Distinct transform for Patron IDs we will know the number of unique patrons who circulated at least one book (2 patrons in the table below). If instead, we use Count, we will know how many books were circulated, since every circulation is linked to a patron ID and duplicate values are also counted. To identify the number of active patrons in this example the Count Distinct transform should be used.

Title
Patron ID
Patron Name

Harry Potter and the Philosopher’s Stone

222

Jane Doe

Harry Potter and the Chamber of Secrets

001

John Doe

Northern Lights

001

John Doe

Output Type. Note that each transform has either an Aggregate or Non-Aggregate output type.

Selecting a Non-Aggregate output type will return one row of output in your report for each row in the database. Selecting an Aggregate output type will group together several rows of the database and return just one row of output with, say, the average value or the total count for that group. Other common aggregate types include minimum, maximum, and sum.

When used as filters, non-aggregate and aggregate types correspond to Base and Aggregate filters respectively. To see the difference between a base filter and an aggregate filter, imagine that you are creating a report to count the number of circulations in January. This would require a base filter to specify the month of interest because the month is a non-aggregate output type. Now imagine that you wish to list all items with more than 25 holds. This would require an aggregate filter on the number of holds per item because you must use an aggregate output type to count the holds.

Chapter 84. Exporting Report Templates Using phpPgAdmin

Once the data is exported. Database Administrators/Systems Administrators can easily import this data into the templates folder to make it available in the client.

84.1. Dump the Entire Reports Template Table

The data exported in this method can create issues importing into a different system if you do not have a matching folder and owner. This is going to export report templates created in your system. The most important fields for importing into the new system are name, description, and data. Data defines the actual structure of the report. The owner and folder fields will unique to the system they were exported from and will have to be altered to ensure they match the appropriate owner and folder information for the new system.

Go to the Reporter schema. Report templates are located in the Template table

Click on the link to the Template table

Click the export button at the top right of the phpPgAdmin screen

Make sure the following is selected

Data Only (checked)

Format: Select CSV or Tabbed did get the data in a text format

Download checked

Click export button at the bottom

A text file will download to your local system

84.2. Dump Data with an SQL Statement

The following statement could be used to grab the data in the folder and dump it with admin account as the owner and the first folder in your system.

SELECT 1 as owner, name, description, data, 1 as folder FROM reporter.template

or use the following to capture your folder names for export

SELECT 1 as owner, t.name, t.description, t.data, f.name as folder
        FROM reporter.template t
        JOIN reporter.template_folder f ON t.folder=f.id

Run the above query

Click the download link at the bottom of the page

Select the file format (CSV or Tabbed)

Check download

A text file with the report template data will be downloaded.

Part XII. Using the Public Access Catalog

Chapter 85. Introduction

Use this part for information about searching the Evergreen public access catalog.

Chapter 86. My Lists 2.2

The My Lists feature replaces the bookbag feature that was available in versions prior to 2.2. The My Lists feature is a part of the Template Toolkit OPAC that is available in version 2.2. This feature enables you to create temporary and permanent lists; create and edit notes for items in lists; place holds on items in lists; and share lists via RSS feeds and CSV files.

Create New Lists

1) Log in to your account in the OPAC.

2) Search for titles.

3) Choose a title to add to your list. Click Add to My List.

4) Scroll up to the gray row on top of the Search Results. Click View My List

5) Items are added to a temporary list. Your temporary list appears at the bottom of the screen.

6) The Actions for these items menu on the right side of the screen demonstrates the actions that you can apply to this list. You can place holds on items in your temporary list; remove items from the list; or move selected items to a permanent list.

To place a hold or remove items from the list, check the box adjacent to the title of the item, and select the desired function.

To move selected items into an existing list, check the box adjacent to the title, and highlight the list in which you will store the item.

7) If you do not want to place the item into an existing list, you can create a new list to contain the item. Enter the name of the new list, and, if desired, enter a description.

8) Click Submit.

9) The new list appears beneath the temporary list.

10) Select the title(s) of the items that you want to add to the list, and click Actions for these items. Select the permanent list that you created from the drop down menu.

11) Click Go.

12) Your existing lists appear. Click on a list to view the items in the list. You can sort the items in the permanent list. You can also add, edit, and remove notes.

13) Click Edit to add or edit a note.

14). Enter desired notes, and click Save Notes.

15) You can keep your list private, or you can share it. To share your list, click Share, and click the orange RSS icon to share through an RSS reader. You can also click HTML View to share your list as an HTML link.

You can also download your list into a CSV file by clicking Download CSV.

16) When you no longer need a list, click Delete List.

Chapter 87. Kids OPAC

The Kids OPAC (KPAC) is a public catalog search that was designed for children and teens. Colorful menu items,large buttons, and simple navigation make this an appealing search interface for kids. Librarians will appreciate the flexible configuration of the KPAC. Librarians can create links to canned search results for kids and can apply these links by branch. The KPAC uses the same infrastructure as the Template Toolkit OPAC (TPAC), the adult catalog search, so you can easily extend the KPAC using the code that already exists in the TPAC. Finally, third party content, such as reader reviews, can be integrated into the KPAC.

87.1. Choose a Skin

Two skins, or design interfaces, have been created for the KPAC. The KPAC was designed to run multiple skins on a single web server. A consortium, then, could allow each library system to choose a skin for their patrons.

Monster Skin:

In this skin, the search bar shares the top panel with a playful monster. The search grid appears beneath the search bar. Help and Login links appear in bold colors at the top right of the interface although you can customize these with CSS. After you login, the Login button disappears.

Alternate Skin:

In this skin, the search bar is the focal point of the top panel and is centered on the screen. The search grid appears beneath the search bar. Help and Login links appear at the top right of the interface. You can customize the appearance and position of these links with CSS. After you login, the user name is displayed in the top right corner, and the Login link becomes an option to Logout.

87.2. Search the Catalog

You can search the catalog using only the search bar, the search grid, or the search bar and the collection drop down menu.

Search using the Search Bar

To search the catalog from the home page, enter text into the search bar in the center of the main page, or enter text into the search bar to the right of the results on a results page. Search indices are configurable, but the default search indices include author, title and (key)word.

You can use this search bar to search the entire catalog, or, using the configuration files, you can apply a filter so that search queries entered here retrieve records that meet specific criteria, such as child-friendly copy locations or MARC audience codes.

Search using the Grid

From the home page, you can search the catalog by clicking on the grid of icons. An icon search can link to an external web link or to a canned search. For example, the icon, Musical Instruments, could link to the results of a catalog search on the subject heading, Musical instruments.

The labels on the grid of icons and the content that they search are configurable by branch. You can use the grid to search the entire catalog, or, using the configuration files, you can apply a filter so that search queries entered here retrieve records associated with specific criteria, such as child-friendly copy locations or MARC audience codes.

You can add multiple layers of icons and searches to your grid:

Search using the Search Bar and the Collection Drop Down Menu

On the search results page, a search bar and drop down menu appear on the right side of the screen. You can enter a search term and into the search bar and select a collection from the drop down menu to search these configured collections. Configured collections might provide more targeted searching for your audience than a general catalog search. For example, you could create collections by shelving location or by MARC audience code.

Using any search method, the search results display in the center of the screen. Brief information displays beneath each title in the initial search result. The brief information that displays, such as title, author, or publication information, is configurable.

For full details on a title, click More Info. The full details displays the configured fields from the title record and copy information. Click Show more copies to display up to fifty results. Use the breadcrumbs at the top to trace your search history.

87.3. Place a Hold

From the search results, click the Get it! link to place a hold.

The brief information about the title appears, and, if you have not yet logged in, the Get It! panel appears with fields for username and password. Enter the username and password, and select the pick up library. Then click Submit. If you have already logged into your account, you need only to select the pick up location, and click Submit.

A confirmation of hold placement appears. You can return to the previous record or to your search results.

87.4. Save Items to a List

You can save items to a temporary list, or, if you are logged in, you can save to a list of your own creation. To save items to a list, click the Get it button on the Search Results page.

Select a list in the Save It! panel beneath the brief information, and click Submit.

A confirmation of the saved item appears. To save the item to a list or to manage the lists, click the My Lists link to return to the list management feature in the TPAC.

87.5. Third Party Content

Third party content, such as reader reviews, can be viewed in the Kids OPAC. The reviews link appears adjacent to the brief information.

Click the Reviews link to view reader reviews from a third party source. The reader reviews open beneath the brief information.

Summaries and reviews from other publications appear in separate tabs beneath the copy information.

87.6. Configuration Files

Configuration files allow you to define labels for canned searches in the icon grid, determine how icons lead users to new pages, and define whether those icons are canned searches or links to external resources. Documentation describing how to use the configuration files is available in the Evergreen repository.

Chapter 88. Adding an Evergreen search form to a web page

To enable users to quickly search your Evergreen catalog, you can add a simple search form to any HTML page. The following code demonstrates how to create a quick search box suitable for the header of your web site:

Sample search form. 

<form action="http://example.com/eg/opac/results" method="get">    <!--  -->
    <input type="search" alt="Catalog Search" maxlength="200"
            size="20" name="query"
            placeholder="Search catalog for..." />
    <input type="hidden" name="qtype" value="keyword" />           <!--  -->
    <input type="hidden" name="locg" value="4" />                  <!--  -->
    <input type="submit" value="Search" />
</form>

Replace 'example.com' with the hostname for your catalog. To link to the Kid’s OPAC instead of the TPAC, replace 'opac' with 'tpac'.

Replace 'keyword' with 'title', 'author', 'subject', or 'series' if you want to provide more specific searches. You can even specify 'identifier|isbn' for an ISBN search.

Replace '4' with the ID number of the organizational unit at which you wish to anchor your search. This is the value of the 'locg' parameter in your normal search.

Part XIII. Developer Resources

Chapter 89. Introduction

Developers can use this part to learn more about the programming languages, communication protocols and standards used in Evergreen.

Chapter 90. Easing gently into OpenSRF

90.1. Abstract

The Evergreen open-source library system serves library consortia composed of hundreds of branches with millions of patrons - for example, the Georgia Public Library Service PINES system. One of the claimed advantages of Evergreen over alternative integrated library systems is the underlying Open Service Request Framework (OpenSRF, pronounced "open surf") architecture. This article introduces OpenSRF, demonstrates how to build OpenSRF services through simple code examples, and explains the technical foundations on which OpenSRF is built.

90.2. Introducing OpenSRF

OpenSRF is a message routing network that offers scalability and failover support for individual services and entire servers with minimal development and deployment overhead. You can use OpenSRF to build loosely-coupled applications that can be deployed on a single server or on clusters of geographically distributed servers using the same code and minimal configuration changes. Although copyright statements on some of the OpenSRF code date back to Mike Rylander’s original explorations in 2000, Evergreen was the first major application to be developed with, and to take full advantage of, the OpenSRF architecture starting in 2004. The first official release of OpenSRF was 0.1 in February 2005 (http://evergreen-ils.org/blog/?p=21), but OpenSRF’s development continues a steady pace of enhancement and refinement, with the release of 1.0.0 in October 2008 and the most recent release of 1.2.2 in February 2010.

OpenSRF is a distinct break from the architectural approach used by previous library systems and has more in common with modern Web applications. The traditional "scale-up" approach to serve more transactions is to purchase a server with more CPUs and more RAM, possibly splitting the load between a Web server, a database server, and a business logic server. Evergreen, however, is built on the Open Service Request Framework (OpenSRF) architecture, which firmly embraces the "scale-out" approach of spreading transaction load over cheap commodity servers. The initial GPLS PINES hardware cluster, while certainly impressive, may have offered the misleading impression that Evergreen is complex and requires a lot of hardware to run.

This article hopes to correct any such lingering impression by demonstrating that OpenSRF itself is an extremely simple architecture on which one can easily build applications of many kinds – not just library applications – and that you can use a number of different languages to call and implement OpenSRF methods with a minimal learning curve. With an application built on OpenSRF, when you identify a bottleneck in your application’s business logic layer, you can adjust the number of the processes serving that particular bottleneck on each of your servers; or if the problem is that your service is resource-hungry, you could add an inexpensive server to your cluster and dedicate it to running that resource-hungry service.

90.2.1. Programming language support

If you need to develop an entirely new OpenSRF service, you can choose from a number of different languages in which to implement that service. OpenSRF client language bindings have been written for C, Java, JavaScript, Perl, and Python, and server language bindings have been written for C, Perl, and Python. This article uses Perl examples as a lowest common denominator programming language. Writing an OpenSRF binding for another language is a relatively small task if that language offers libraries that support the core technologies on which OpenSRF depends:

Extensible Messaging and Presence Protocol (XMPP, sometimes referred to as Jabber) - provides the base messaging infrastructure between OpenSRF clients and servers

JavaScript Object Notation (JSON) - serializes the content of each XMPP message in a standardized and concise format

memcached - provides the caching service

syslog - the standard UNIX logging service

Unfortunately, the OpenSRF reference documentation, although augmented by the OpenSRF glossary, blog posts like the description of OpenSRF and Jabber, and even this article, is not a sufficient substitute for a complete specification on which one could implement a language binding. The recommended option for would-be developers of another language binding is to use the Python implementation as the cleanest basis for a port to another language.

90.2.2. OpenSRF communication flows over XMPP

The XMPP messaging service underpins OpenSRF, requiring an XMPP server such as ejabberd. When you start OpenSRF, the first XMPP clients that connect to the XMPP server are the OpenSRF public and private routers. OpenSRF routers maintain a list of available services and connect clients to available services. When an OpenSRF service starts, it establishes a connection to the XMPP server and registers itself with the private router. The OpenSRF configuration contains a list of public OpenSRF services, each of which must also register with the public router. Services and clients connect to the XMPP server using a single set of XMPP client credentials (for example, opensrf@private.localhost), but use XMPP resource identifiers to differentiate themselves in the Jabber ID (JID) for each connection. For example, the JID for a copy of the opensrf.simple-text service with process ID 6285 that has connected to the private.localhost domain using the opensrf XMPP client credentials could be opensrf@private.localhost/opensrf.simple-text_drone_at_localhost_6285.

90.2.3. OpenSRF communication flows over HTTP

Any OpenSRF service registered with the public router is accessible via the OpenSRF HTTP Translator. The OpenSRF HTTP Translator implements the OpenSRF-over-HTTP proposed specification as an Apache module that translates HTTP requests into OpenSRF requests and returns OpenSRF results as HTTP results to the initiating HTTP client.

Issuing an HTTP POST request to an OpenSRF method via the OpenSRF HTTP Translator. 

# curl request broken up over multiple lines for legibility
curl -H "X-OpenSRF-service: opensrf.simple-text"                                \ #
    --data 'osrf-msg=[                                                          \ #
        {"__c":"osrfMessage","__p":{"threadTrace":0,"locale":"en-CA",           \ #
            "type":"REQUEST","payload": {"__c":"osrfMethod","__p":              \
                {"method":"opensrf.simple-text.reverse","params":["foobar"]}    \
            }}                                                                  \
        }]'                                                                     \
http://localhost/osrf-http-translator                                           \ #

The X-OpenSRF-service header identifies the OpenSRF service of interest.

The POST request consists of a single parameter, the osrf-msg value, which contains a JSON array.

The first object is an OpenSRF message ("__c":"osrfMessage") with a set of parameters ("__p":{}) containing:

the identifier for the request ("threadTrace":0); this value is echoed back in the result

the message type ("type":"REQUEST")

the locale for the message; if the OpenSRF method is locale-sensitive, it can check the locale for each OpenSRF request and return different information depending on the locale

the payload of the message ("payload":{}) containing the OpenSRF method request ("__c":"osrfMethod") and its parameters ("__p:"{}), which in turn contains:

the method name for the request ("method":"opensrf.simple-text.reverse")

a set of JSON parameters to pass to the method ("params":["foobar"]); in this case, a single string "foobar"

The URL on which the OpenSRF HTTP translator is listening, /osrf-http-translator is the default location in the Apache example configuration files shipped with the OpenSRF source, but this is configurable.

Results from an HTTP POST request to an OpenSRF method via the OpenSRF HTTP Translator. 

# HTTP response broken up over multiple lines for legibility
[{"__c":"osrfMessage","__p":                                                    \ #
    {"threadTrace":0, "payload":                                                \ #
        {"__c":"osrfResult","__p":                                              \ #
            {"status":"OK","content":"raboof","statusCode":200}                 \ #
        },"type":"RESULT","locale":"en-CA"                                      \ #
    }
},
{"__c":"osrfMessage","__p":                                                     \ #
    {"threadTrace":0,"payload":                                                 \ #
        {"__c":"osrfConnectStatus","__p":                                       \ #
            {"status":"Request Complete","statusCode":205}                      \ #
        },"type":"STATUS","locale":"en-CA"                                      \ #
    }
}]

The OpenSRF HTTP Translator returns an array of JSON objects in its response. Each object in the response is an OpenSRF message ("__c":"osrfMessage") with a collection of response parameters ("__p":).

The OpenSRF message identifier ("threadTrace":0) confirms that this message is in response to the request matching the same identifier.

The message includes a payload JSON object ("payload":) with an OpenSRF result for the request ("__c":"osrfResult").

The result includes a status indicator string ("status":"OK"), the content of the result response - in this case, a single string "raboof" ("content":"raboof") - and an integer status code for the request ("statusCode":200).

The message also includes the message type ("type":"RESULT") and the message locale ("locale":"en-CA").

The second message in the set of results from the response.

Again, the message identifier confirms that this message is in response to a particular request.

The payload of the message denotes that this message is an OpenSRF connection status message ("__c":"osrfConnectStatus"), with some information about the particular OpenSRF connection that was used for this request.

The response parameters for an OpenSRF connection status message include a verbose status ("status":"Request Complete") and an integer status code for the connection status (`"statusCode":205).

The message also includes the message type ("type":"RESULT") and the message locale ("locale":"en-CA").

Before adding a new public OpenSRF service, ensure that it does not introduce privilege escalation or unchecked access to data. For example, the Evergreen open-ils.cstore private service is an object-relational mapper that provides read and write access to the entire Evergreen database, so it would be catastrophic to expose that service publicly. In comparison, the Evergreen open-ils.pcrud public service offers the same functionality as open-ils.cstore to any connected HTTP client or OpenSRF client, but the additional authentication and authorization layer in open-ils.pcrud prevents unchecked access to Evergreen’s data.

90.2.4. Stateless and stateful connections

OpenSRF supports both stateless and stateful connections. When an OpenSRF client issues a REQUEST message in a stateless connection, the router forwards the request to the next available service and the service returns the result directly to the client.

REQUEST flow in a stateless connection. REQUEST flow in a stateless connection

When an OpenSRF client issues a CONNECT message to create a stateful connection, the router returns the Jabber ID of the next available service to the client so that the client can issue one or more REQUEST message directly to that particular service and the service will return corresponding RESULT messages directly to the client. Until the client issues a DISCONNECT message, that particular service is only available to the requesting client. Stateful connections are useful for clients that need to make many requests from a particular service, as it avoids the intermediary step of contacting the router for each request, as well as for operations that require a controlled sequence of commands, such as a set of database INSERT, UPDATE, and DELETE statements within a transaction.

CONNECT, REQUEST, and DISCONNECT flow in a stateful connection. CONNECT

90.3. Enough jibber-jabber: writing an OpenSRF service

Imagine an application architecture in which 10 lines of Perl or Python, using the data types native to each language, are enough to implement a method that can then be deployed and invoked seamlessly across hundreds of servers. You have just imagined developing with OpenSRF – it is truly that simple. Under the covers, of course, the OpenSRF language bindings do an incredible amount of work on behalf of the developer. An OpenSRF application consists of one or more OpenSRF services that expose methods: for example, the opensrf.simple-text demonstration service exposes the opensrf.simple-text.split() and opensrf.simple-text.reverse() methods. Each method accepts zero or more arguments and returns zero or one results. The data types supported by OpenSRF arguments and results are typical core language data types: strings, numbers, booleans, arrays, and hashes.

To implement a new OpenSRF service, perform the following steps:

Include the base OpenSRF support libraries

Write the code for each of your OpenSRF methods as separate procedures

Register each method

Add the service definition to the OpenSRF configuration files

For example, the following code implements an OpenSRF service. The service includes one method named opensrf.simple-text.reverse() that accepts one string as input and returns the reversed version of that string:

#!/usr/bin/perl

package OpenSRF::Application::Demo::SimpleText;

use strict;

use OpenSRF::Application;
use parent qw/OpenSRF::Application/;

sub text_reverse {
    my ($self , $conn, $text) = @_;
    my $reversed_text = scalar reverse($text);
    return $reversed_text;
}

__PACKAGE__->register_method(
    method    => 'text_reverse',
    api_name  => 'opensrf.simple-text.reverse'
);

Ten lines of code, and we have a complete OpenSRF service that exposes a single method and could be deployed quickly on a cluster of servers to meet your application’s ravenous demand for reversed strings! If you’re unfamiliar with Perl, the use OpenSRF::Application; use parent qw/OpenSRF::Application/; lines tell this package to inherit methods and properties from the OpenSRF::Application module. For example, the call to __PACKAGE__->register_method() is defined in OpenSRF::Application but due to inheritance is available in this package (named by the special Perl symbol __PACKAGE__ that contains the current package name). The register_method() procedure is how we introduce a method to the rest of the OpenSRF world.

90.3.1. Registering a service with the OpenSRF configuration files

Two files control most of the configuration for OpenSRF:

opensrf.xml contains the configuration for the service itself as well as a list of which application servers in your OpenSRF cluster should start the service

opensrf_core.xml (often referred to as the "bootstrap configuration" file) contains the OpenSRF networking information, including the XMPP server connection credentials for the public and private routers; you only need to touch this for a new service if the new service needs to be accessible via the public router

Begin by defining the service itself in opensrf.xml. To register the opensrf.simple-text service, add the following section to the <apps> element (corresponding to the XPath /opensrf/default/apps/):

<apps>
  <opensrf.simple-text>                                                      <!--  -->
    <keepalive>3</keepalive>                                                 <!--  -->
    <stateless>1</stateless>                                                 <!--  -->
    <language>perl</language>                                                <!--  -->
    <implementation>OpenSRF::Application::Demo::SimpleText</implementation>  <!--  -->
    <max_requests>100</max_requests>                                         <!--  -->
    <unix_config>
      <max_requests>1000</max_requests>                                      <!--  -->
      <unix_log>opensrf.simple-text_unix.log</unix_log>                      <!--  -->
      <unix_sock>opensrf.simple-text_unix.sock</unix_sock>                   <!--  -->
      <unix_pid>opensrf.simple-text_unix.pid</unix_pid>                     <!--  -->
      <min_children>5</min_children>                                        <!-- (11) -->
      <max_children>15</max_children>                                       <!-- (12) -->
      <min_spare_children>2</min_spare_children>                            <!-- (13) -->
      <max_spare_children>5</max_spare_children>                            <!-- (14) -->
    </unix_config>
  </opensrf.simple-text>

  <!-- other OpenSRF services registered here... -->
</apps>

The element name is the name that the OpenSRF control scripts use to refer to the service.

Specifies the interval (in seconds) between checks to determine if the service is still running.

Specifies whether OpenSRF clients can call methods from this service without first having to create a connection to a specific service backend process for that service. If the value is 1, then the client can simply issue a request and the router will forward the request to an available service and the result will be returned directly to the client.

Specifies the programming language in which the service is implemented

Specifies the name of the library or module in which the service is implemented

(C implementations): Specifies the maximum number of requests a process serves before it is killed and replaced by a new process.

(Perl implementations): Specifies the maximum number of requests a process serves before it is killed and replaced by a new process.

The name of the log file for language-specific log messages such as syntax warnings.

The name of the UNIX socket used for inter-process communications.

The name of the PID file for the master process for the service.

(11)

The minimum number of child processes that should be running at any given time.

(12)

The maximum number of child processes that should be running at any given time.

(13)

The minimum number of child processes that should be available to handle incoming requests. If there are fewer than this number of spare child processes, new processes will be spawned.

(14)

The minimum number of child processes that should be available to handle incoming requests. If there are more than this number of spare child processes, the extra processes will be killed.

To make the service accessible via the public router, you must also edit the opensrf_core.xml configuration file to add the service to the list of publicly accessible services:

Making a service publicly accessible in opensrf_core.xml. 

<router>                                                                     <!--  -->
    <!-- This is the public router. On this router, we only register applications
     which should be accessible to everyone on the opensrf network -->
    <name>router</name>
    <domain>public.localhost</domain>                                        <!--  -->
    <services>
        <service>opensrf.math</service>
        <service>opensrf.simple-text</service>                               <!--  -->
    </services>
</router>

This section of the opensrf_core.xml file is located at XPath /config/opensrf/routers/.

public.localhost is the canonical public router domain in the OpenSRF installation instructions.

Each <service> element contained in the <services> element offers their services via the public router as well as the private router.

Once you have defined the new service, you must restart the OpenSRF Router to retrieve the new configuration and start or restart the service itself.

90.3.2. Calling an OpenSRF method

OpenSRF clients in any supported language can invoke OpenSRF services in any supported language. So let’s see a few examples of how we can call our fancy new opensrf.simple-text.reverse() method:

90.3.2.1. Calling OpenSRF methods from the srfsh client

srfsh is a command-line tool installed with OpenSRF that you can use to call OpenSRF methods. To call an OpenSRF method, issue the request command and pass the OpenSRF service and method name as the first two arguments; then pass a list of JSON objects as the arguments to the method being invoked.

The following example calls the opensrf.simple-text.reverse method of the opensrf.simple-text OpenSRF service, passing the string "foobar" as the only method argument:

$ srfsh
srfsh # request opensrf.simple-text opensrf.simple-text.reverse "foobar"

Received Data: "raboof"

=------------------------------------
Request Completed Successfully
Request Time in seconds: 0.016718
=------------------------------------

90.3.2.2. Getting documentation for OpenSRF methods from the srfsh client

The srfsh client also gives you command-line access to retrieving metadata about OpenSRF services and methods. For a given OpenSRF method, for example, you can retrieve information such as the minimum number of required arguments, the data type and a description of each argument, the package or library in which the method is implemented, and a description of the method. To retrieve the documentation for an opensrf method from srfsh, issue the introspect command, followed by the name of the OpenSRF service and (optionally) the name of the OpenSRF method. If you do not pass a method name to the introspect command, srfsh lists all of the methods offered by the service. If you pass a partial method name, srfsh lists all of the methods that match that portion of the method name.

The quality and availability of the descriptive information for each method depends on the developer to register the method with complete and accurate information. The quality varies across the set of OpenSRF and Evergreen APIs, although some effort is being put towards improving the state of the internal documentation.

srfsh# introspect opensrf.simple-text "opensrf.simple-text.reverse"
--> opensrf.simple-text

Received Data: {
  "__c":"opensrf.simple-text",
  "__p":{
    "api_level":1,
    "stream":0,                                                      \ #
    "object_hint":"OpenSRF_Application_Demo_SimpleText",
    "remote":0,
    "package":"OpenSRF::Application::Demo::SimpleText",              \ #
    "api_name":"opensrf.simple-text.reverse",                        \ #
    "server_class":"opensrf.simple-text",
    "signature":{                                                    \ #
      "params":[                                                     \ #
        {
          "desc":"The string to reverse",
          "name":"text",
          "type":"string"
        }
      ],
      "desc":"Returns the input string in reverse order\n",          \ #
      "return":{                                                     \ #
        "desc":"Returns the input string in reverse order",
        "type":"string"
      }
    },
    "method":"text_reverse",                                         \ #
    "argc":1                                                         \ #
  }
}

stream denotes whether the method supports streaming responses or not.

package identifies which package or library implements the method.

api_name identifies the name of the OpenSRF method.

signature is a hash that describes the parameters for the method.

params is an array of hashes describing each parameter in the method; each parameter has a description (desc), name (name), and type (type).

desc is a string that describes the method itself.

return is a hash that describes the return value for the method; it contains a description of the return value (desc) and the type of the returned value (type).

method identifies the name of the function or method in the source implementation.

argc is an integer describing the minimum number of arguments that must be passed to this method.

90.3.2.3. Calling OpenSRF methods from Perl applications

To call an OpenSRF method from Perl, you must connect to the OpenSRF service, issue the request to the method, and then retrieve the results.

#/usr/bin/perl
use strict;
use OpenSRF::AppSession;
use OpenSRF::System;

OpenSRF::System->bootstrap_client(config_file => '/openils/conf/opensrf_core.xml'); #

my $session = OpenSRF::AppSession->create("opensrf.simple-text");                   #

print "substring: Accepts a string and a number as input, returns a string\n";
my $result = $session->request("opensrf.simple-text.substring", "foobar", 3);       #
my $request = $result->gather();                                                    #
print "Substring: $request\n\n";

print "split: Accepts two strings as input, returns an array of strings\n";
$request = $session->request("opensrf.simple-text.split", "This is a test", " ");   #
my $output = "Split: [";
my $element;
while ($element = $request->recv()) {                                               #
    $output .= $element->content . ", ";                                            #
}
$output =~ s/, $/]/;
print $output . "\n\n";

print "statistics: Accepts an array of strings as input, returns a hash\n";
my @many_strings = [
    "First I think I'll have breakfast",
    "Then I think that lunch would be nice",
    "And then seventy desserts to finish off the day"
];

$result = $session->request("opensrf.simple-text.statistics", @many_strings);       #
$request = $result->gather();                                                       #
print "Length: " . $result->{'length'} . "\n";
print "Word count: " . $result->{'word_count'} . "\n";

$session->disconnect();                                                             #

The OpenSRF::System->bootstrap_client() method reads the OpenSRF configuration information from the indicated file and creates an XMPP client connection based on that information.

The OpenSRF::AppSession->create() method accepts one argument - the name of the OpenSRF service to which you want to want to make one or more requests - and returns an object prepared to use the client connection to make those requests.

The OpenSRF::AppSession->request() method accepts a minimum of one argument - the name of the OpenSRF method to which you want to make a request - followed by zero or more arguments to pass to the OpenSRF method as input values. This example passes a string and an integer to the opensrf.simple-text.substring method defined by the opensrf.simple-text OpenSRF service.

The gather() method, called on the result object returned by the request() method, iterates over all of the possible results from the result object and returns a single variable.

This request() call passes two strings to the opensrf.simple-text.split method defined by the opensrf.simple-text OpenSRF service and returns (via gather()) a reference to an array of results.

The opensrf.simple-text.split() method is a streaming method that returns an array of results with one element per recv() call on the result object. We could use the gather() method to retrieve all of the results in a single array reference, but instead we simply iterate over the result variable until there are no more results to retrieve.

While the gather() convenience method returns only the content of the complete set of results for a given request, the recv() method returns an OpenSRF result object with status, statusCode, and content fields as we saw in the HTTP results example.

This request() call passes an array to the opensrf.simple-text.statistics method defined by the opensrf.simple-text OpenSRF service.

The result object returns a hash reference via gather(). The hash contains the length and word_count keys we defined in the method.

The OpenSRF::AppSession->disconnect() method closes the XMPP client connection and cleans up resources associated with the session.

90.3.3. Accepting and returning more interesting data types

Of course, the example of accepting a single string and returning a single string is not very interesting. In real life, our applications tend to pass around multiple arguments, including arrays and hashes. Fortunately, OpenSRF makes that easy to deal with; in Perl, for example, returning a reference to the data type does the right thing. In the following example of a method that returns a list, we accept two arguments of type string: the string to be split, and the delimiter that should be used to split the string.

Text splitting method - streaming mode. 

sub text_split {
    my $self = shift;
    my $conn = shift;
    my $text = shift;
    my $delimiter = shift || ' ';

    my @split_text = split $delimiter, $text;
    return \@split_text;
}

__PACKAGE__->register_method(
    method    => 'text_split',
    api_name  => 'opensrf.simple-text.split'
);

We simply return a reference to the list, and OpenSRF does the rest of the work for us to convert the data into the language-independent format that is then returned to the caller. As a caller of a given method, you must rely on the documentation used to register to determine the data structures - if the developer has added the appropriate documentation.

90.3.4. Accepting and returning Evergreen objects

OpenSRF is agnostic about objects; its role is to pass JSON back and forth between OpenSRF clients and services, and it allows the specific clients and services to define their own semantics for the JSON structures. On top of that infrastructure, Evergreen offers the fieldmapper: an object-relational mapper that provides a complete definition of all objects, their properties, their relationships to other objects, the permissions required to create, read, update, or delete objects of that type, and the database table or view on which they are based.

The Evergreen fieldmapper offers a great deal of convenience for working with complex system objects beyond the basic mapping of classes to database schemas. Although the result is passed over the wire as a JSON object containing the indicated fields, fieldmapper-aware clients then turn those JSON objects into native objects with setter / getter methods for each field.

All of this metadata about Evergreen objects is defined in the fieldmapper configuration file (/openils/conf/fm_IDL.xml), and access to these classes is provided by the open-ils.cstore, open-ils.pcrud, and open-ils.reporter-store OpenSRF services which parse the fieldmapper configuration file and dynamically register OpenSRF methods for creating, reading, updating, and deleting all of the defined classes.

Example fieldmapper class definition for "Open User Summary". 

<class id="mous" controller="open-ils.cstore open-ils.pcrud"
 oils_obj:fieldmapper="money::open_user_summary"
 oils_persist:tablename="money.open_usr_summary"
 reporter:label="Open User Summary">                                       <!--  -->
    <fields oils_persist:primary="usr" oils_persist:sequence="">           <!--  -->
        <field name="balance_owed" reporter:datatype="money" />            <!--  -->
        <field name="total_owed" reporter:datatype="money" />
        <field name="total_paid" reporter:datatype="money" />
        <field name="usr" reporter:datatype="link"/>
    </fields>
    <links>
        <link field="usr" reltype="has_a" key="id" map="" class="au"/>     <!--  -->
    </links>
    <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">  <!--  -->
        <actions>
            <retrieve permission="VIEW_USER">                              <!--  -->
                <context link="usr" field="home_ou"/>                      <!--  -->
            </retrieve>
        </actions>
    </permacrud>
</class>

The <class> element defines the class:

The id attribute defines the class hint that identifies the class both elsewhere in the fieldmapper configuration file, such as in the value of the field attribute of the <link> element, and in the JSON object itself when it is instantiated. For example, an "Open User Summary" JSON object would have the top level property of "__c":"mous".

The controller attribute identifies the services that have direct access to this class. If open-ils.pcrud is not listed, for example, then there is no means to directly access members of this class through a public service.

The oils_obj:fieldmapper attribute defines the name of the Perl fieldmapper class that will be dynamically generated to provide setter and getter methods for instances of the class.

The oils_persist:tablename attribute identifies the schema name and table name of the database table that stores the data that represents the instances of this class. In this case, the schema is money and the table is open_usr_summary.

The reporter:label attribute defines a human-readable name for the class used in the reporting interface to identify the class. These names are defined in English in the fieldmapper configuration file; however, they are extracted so that they can be translated and served in the user’s language of choice.

The <fields> element lists all of the fields that belong to the object.

The oils_persist:primary attribute identifies the field that acts as the primary key for the object; in this case, the field with the name usr.

The oils_persist:sequence attribute identifies the sequence object (if any) in this database provides values for new instances of this class. In this case, the primary key is defined by a field that is linked to a different table, so no sequence is used to populate these instances.

Each <field> element defines a single field with the following attributes:

The name attribute identifies the column name of the field in the underlying database table as well as providing a name for the setter / getter method that can be invoked in the JSON or native version of the object.

The reporter:datatype attribute defines how the reporter should treat the contents of the field for the purposes of querying and display.

The reporter:label attribute can be used to provide a human-readable name for each field; without it, the reporter falls back to the value of the name attribute.

The <links> element contains a set of zero or more <link> elements, each of which defines a relationship between the class being described and another class.

The field attribute identifies the field named in this class that links to the external class.

The reltype attribute identifies the kind of relationship between the classes; in the case of has_a, each value in the usr field is guaranteed to have a corresponding value in the external class.

The key attribute identifies the name of the field in the external class to which this field links.

The rarely-used map attribute identifies a second class to which the external class links; it enables this field to define a direct relationship to an external class with one degree of separation, to avoid having to retrieve all of the linked members of an intermediate class just to retrieve the instances from the actual desired target class.

The class attribute identifies the external class to which this field links.

The <permacrud> element defines the permissions that must have been granted to a user to operate on instances of this class.

The <retrieve> element is one of four possible children of the <actions> element that define the permissions required for each action: create, retrieve, update, and delete.

The permission attribute identifies the name of the permission that must have been granted to the user to perform the action.

The contextfield attribute, if it exists, defines the field in this class that identifies the library within the system for which the user must have privileges to work. If a user has been granted a given permission, but has not been granted privileges to work at a given library, they can not perform the action at that library.

The rarely-used <context> element identifies a linked field (link attribute) in this class which links to an external class that holds the field (field attribute) that identifies the library within the system for which the user must have privileges to work.

When you retrieve an instance of a class, you can ask for the result to flesh some or all of the linked fields of that class, so that the linked instances are returned embedded directly in your requested instance. In that same request you can ask for the fleshed instances to in turn have their linked fields fleshed. By bundling all of this into a single request and result sequence, you can avoid the network overhead of requiring the client to request the base object, then request each linked object in turn.

You can also iterate over a collection of instances and set the automatically generated isdeleted, isupdated, or isnew properties to indicate that the given instance has been deleted, updated, or created respectively. Evergreen can then act in batch mode over the collection to perform the requested actions on any of the instances that have been flagged for action.

90.3.5. Returning streaming results

In the previous implementation of the opensrf.simple-text.split method, we returned a reference to the complete array of results. For small values being delivered over the network, this is perfectly acceptable, but for large sets of values this can pose a number of problems for the requesting client. Consider a service that returns a set of bibliographic records in response to a query like "all records edited in the past month"; if the underlying database is relatively active, that could result in thousands of records being returned as a single network request. The client would be forced to block until all of the results are returned, likely resulting in a significant delay, and depending on the implementation, correspondingly large amounts of memory might be consumed as all of the results are read from the network in a single block.

OpenSRF offers a solution to this problem. If the method returns results that can be divided into separate meaningful units, you can register the OpenSRF method as a streaming method and enable the client to loop over the results one unit at a time until the method returns no further results. In addition to registering the method with the provided name, OpenSRF also registers an additional method with .atomic appended to the method name. The .atomic variant gathers all of the results into a single block to return to the client, giving the caller the ability to choose either streaming or atomic results from a single method definition.

In the following example, the text splitting method has been reimplemented to support streaming; very few changes are required:

Text splitting method - streaming mode. 

sub text_split {
    my $self = shift;
    my $conn = shift;
    my $text = shift;
    my $delimiter = shift || ' ';

    my @split_text = split $delimiter, $text;
    foreach my $string (@split_text) {           #
        $conn->respond($string);
    }
    return undef;
}

__PACKAGE__->register_method(
    method    => 'text_split',
    api_name  => 'opensrf.simple-text.split',
    stream    => 1                              #
);

Rather than returning a reference to the array, a streaming method loops over the contents of the array and invokes the respond() method of the connection object on each element of the array.

Registering the method as a streaming method instructs OpenSRF to also register an atomic variant (opensrf.simple-text.split.atomic).

90.3.6. Error! Warning! Info! Debug!

As hard as it may be to believe, it is true: applications sometimes do not behave in the expected manner, particularly when they are still under development. The server language bindings for OpenSRF include integrated support for logging messages at the levels of ERROR, WARNING, INFO, DEBUG, and the extremely verbose INTERNAL to either a local file or to a syslogger service. The destination of the log files, and the level of verbosity to be logged, is set in the opensrf_core.xml configuration file. To add logging to our Perl example, we just have to add the OpenSRF::Utils::Logger package to our list of used Perl modules, then invoke the logger at the desired logging level.

You can include many calls to the OpenSRF logger; only those that are higher than your configured logging level will actually hit the log. The following example exercises all of the available logging levels in OpenSRF:

use OpenSRF::Utils::Logger;
my $logger = OpenSRF::Utils::Logger;
# some code in some function
{
    $logger->error("Hmm, something bad DEFINITELY happened!");
    $logger->warn("Hmm, something bad might have happened.");
    $logger->info("Something happened.");
    $logger->debug("Something happened; here are some more details.");
    $logger->internal("Something happened; here are all the gory details.")
}

If you call the mythical OpenSRF method containing the preceding OpenSRF logger statements on a system running at the default logging level of INFO, you will only see the INFO, WARN, and ERR messages, as follows:

Results of logging calls at the default level of INFO. 

[2010-03-17 22:27:30] opensrf.simple-text [ERR :5681:SimpleText.pm:277:] Hmm, something bad DEFINITELY happened!
[2010-03-17 22:27:30] opensrf.simple-text [WARN:5681:SimpleText.pm:278:] Hmm, something bad might have happened.
[2010-03-17 22:27:30] opensrf.simple-text [INFO:5681:SimpleText.pm:279:] Something happened.

If you then increase the the logging level to INTERNAL (5), the logs will contain much more information, as follows:

Results of logging calls at the default level of INTERNAL. 

[2010-03-17 22:48:11] opensrf.simple-text [ERR :5934:SimpleText.pm:277:] Hmm, something bad DEFINITELY happened!
[2010-03-17 22:48:11] opensrf.simple-text [WARN:5934:SimpleText.pm:278:] Hmm, something bad might have happened.
[2010-03-17 22:48:11] opensrf.simple-text [INFO:5934:SimpleText.pm:279:] Something happened.
[2010-03-17 22:48:11] opensrf.simple-text [DEBG:5934:SimpleText.pm:280:] Something happened; here are some more details.
[2010-03-17 22:48:11] opensrf.simple-text [INTL:5934:SimpleText.pm:281:] Something happened; here are all the gory details.
[2010-03-17 22:48:11] opensrf.simple-text [ERR :5934:SimpleText.pm:283:] Resolver did not find a cache hit
[2010-03-17 22:48:21] opensrf.simple-text [INTL:5934:Cache.pm:125:] Stored opensrf.simple-text.test_cache.masaa => "here" in memcached server
[2010-03-17 22:48:21] opensrf.simple-text [DEBG:5934:Application.pm:579:] Coderef for [OpenSRF::Application::Demo::SimpleText::test_cache] has been run
[2010-03-17 22:48:21] opensrf.simple-text [DEBG:5934:Application.pm:586:] A top level Request object is responding de nada
[2010-03-17 22:48:21] opensrf.simple-text [DEBG:5934:Application.pm:190:] Method duration for [opensrf.simple-text.test_cache]:  10.005
[2010-03-17 22:48:21] opensrf.simple-text [INTL:5934:AppSession.pm:780:] Calling queue_wait(0)
[2010-03-17 22:48:21] opensrf.simple-text [INTL:5934:AppSession.pm:769:] Resending...0
[2010-03-17 22:48:21] opensrf.simple-text [INTL:5934:AppSession.pm:450:] In send
[2010-03-17 22:48:21] opensrf.simple-text [DEBG:5934:AppSession.pm:506:] AppSession sending RESULT to opensrf@private.localhost/_dan-karmic-liblap_1268880489.752154_5943 with threadTrace [1]
[2010-03-17 22:48:21] opensrf.simple-text [DEBG:5934:AppSession.pm:506:] AppSession sending STATUS to opensrf@private.localhost/_dan-karmic-liblap_1268880489.752154_5943 with threadTrace [1]
...

To see everything that is happening in OpenSRF, try leaving your logging level set to INTERNAL for a few minutes - just ensure that you have a lot of free disk space available if you have a moderately busy system!

90.3.7. Caching results: one secret of scalability

If you have ever used an application that depends on a remote Web service outside of your control-say, if you need to retrieve results from a microblogging service-you know the pain of latency and dependability (or the lack thereof). To improve response time in OpenSRF applications, you can take advantage of the support offered by the OpenSRF::Utils::Cache module for communicating with a local instance or cluster of memcache daemons to store and retrieve persistent values.

use OpenSRF::Utils::Cache;                                       #
sub test_cache {
    my $self = shift;
    my $conn = shift;
    my $test_key = shift;
    my $cache = OpenSRF::Utils::Cache->new('global');            #
    my $cache_key = "opensrf.simple-text.test_cache.$test_key";  #
    my $result = $cache->get_cache($cache_key) || undef;         #
    if ($result) {
        $logger->info("Resolver found a cache hit");
        return $result;
    }
    sleep 10;                                                    #
    my $cache_timeout = 300;                                     #
    $cache->put_cache($cache_key, "here", $cache_timeout);       #
    return "There was no cache hit.";
}

This example:

Imports the OpenSRF::Utils::Cache module

Creates a cache object

Creates a unique cache key based on the OpenSRF method name and request input value

Checks to see if the cache key already exists; if so, it immediately returns that value

If the cache key does not exist, the code sleeps for 10 seconds to simulate a call to a slow remote Web service, or an intensive process

Sets a value for the lifetime of the cache key in seconds

When the code has retrieved its value, then it can create the cache entry, with the cache key, value to be stored ("here"), and the timeout value in seconds to ensure that we do not return stale data on subsequent calls

90.3.8. Initializing the service and its children: child labour

When an OpenSRF service is started, it looks for a procedure called initialize() to set up any global variables shared by all of the children of the service. The initialize() procedure is typically used to retrieve configuration settings from the opensrf.xml file.

An OpenSRF service spawns one or more children to actually do the work requested by callers of the service. For every child process an OpenSRF service spawns, the child process clones the parent environment and then each child process runs the child_init() process (if any) defined in the OpenSRF service to initialize any child-specific settings.

When the OpenSRF service kills a child process, it invokes the child_exit() procedure (if any) to clean up any resources associated with the child process. Similarly, when the OpenSRF service is stopped, it calls the DESTROY() procedure to clean up any remaining resources.

90.3.9. Retrieving configuration settings

The settings for OpenSRF services are maintained in the opensrf.xml XML configuration file. The structure of the XML document consists of a root element <opensrf> containing two child elements:

<default> contains an <apps> element describing all OpenSRF services running on this system — see Section 90.3.1, “Registering a service with the OpenSRF configuration files” --, as well as any other arbitrary XML descriptions required for global configuration purposes. For example, Evergreen uses this section for email notification and inter-library patron privacy settings.

<hosts> contains one element per host that participates in this OpenSRF system. Each host element must include an <activeapps> element that lists all of the services to start on this host when the system starts up. Each host element can optionally override any of the default settings.

OpenSRF includes a service named opensrf.settings to provide distributed cached access to the configuration settings with a simple API:

opensrf.settings.default_config.get: accepts zero arguments and returns the complete set of default settings as a JSON document

opensrf.settings.host_config.get: accepts one argument (hostname) and returns the complete set of settings, as customized for that hostname, as a JSON document

opensrf.settings.xpath.get: accepts one argument (an XPath expression) and returns the portion of the configuration file that matches the expression as a JSON document

For example, to determine whether an Evergreen system uses the opt-in support for sharing patron information between libraries, you could either invoke the opensrf.settings.default_config.get method and parse the JSON document to determine the value, or invoke the opensrf.settings.xpath.get method with the XPath /opensrf/default/share/user/opt_in argument to retrieve the value directly.

In practice, OpenSRF includes convenience libraries in all of its client language bindings to simplify access to configuration values. C offers osrfConfig.c, Perl offers OpenSRF::Utils::SettingsClient, Java offers org.opensrf.util.SettingsClient, and Python offers osrf.set. These libraries locally cache the configuration file to avoid network roundtrips for every request and enable the developer to request specific values without having to manually construct XPath expressions.

90.4. Getting under the covers with OpenSRF

Now that you have seen that it truly is easy to create an OpenSRF service, we can take a look at what is going on under the covers to make all of this work for you.

90.4.1. Get on the messaging bus - safely

One of the core innovations of OpenSRF was to use the Extensible Messaging and Presence Protocol (XMPP, more colloquially known as Jabber) as the messaging bus that ties OpenSRF services together across servers. XMPP is an "XML protocol for near-real-time messaging, presence, and request-response services" (http://www.ietf.org/rfc/rfc3920.txt) that OpenSRF relies on to handle most of the complexity of networked communications. OpenSRF achieves a measure of security for its services through the use of public and private XMPP domains; all OpenSRF services automatically register themselves with the private XMPP domain, but only those services that register themselves with the public XMPP domain can be invoked from public OpenSRF clients.

In a minimal OpenSRF deployment, two XMPP users named "router" connect to the XMPP server, with one connected to the private XMPP domain and one connected to the public XMPP domain. Similarly, two XMPP users named "opensrf" connect to the XMPP server via the private and public XMPP domains. When an OpenSRF service is started, it uses the "opensrf" XMPP user to advertise its availability with the corresponding router on that XMPP domain; the XMPP server automatically assigns a Jabber ID (JID) based on the client hostname to each service’s listener process and each connected drone process waiting to carry out requests. When an OpenSRF router receives a request to invoke a method on a given service, it connects the requester to the next available listener in the list of registered listeners for that service.

The opensrf and router user names, passwords, and domain names, along with the list of services that should be public, are contained in the opensrf_core.xml configuration file.

90.4.2. Message body format

OpenSRF was an early adopter of JavaScript Object Notation (JSON). While XMPP is an XML protocol, the Evergreen developers recognized that the compactness of the JSON format offered a significant reduction in bandwidth for the volume of messages that would be generated in an application of that size. In addition, the ability of languages such as JavaScript, Perl, and Python to generate native objects with minimal parsing offered an attractive advantage over invoking an XML parser for every message. Instead, the body of the XMPP message is a simple JSON structure. For a simple request, like the following example that simply reverses a string, it looks like a significant overhead: but we get the advantages of locale support and tracing the request from the requester through the listener and responder (drone).

A request for opensrf.simple-text.reverse("foobar"): 

<message from='router@private.localhost/opensrf.simple-text'
  to='opensrf@private.localhost/opensrf.simple-text_listener_at_localhost_6275'
  router_from='opensrf@private.localhost/_karmic_126678.3719_6288'
  router_to='' router_class='' router_command='' osrf_xid=''
>
  <thread>1266781414.366573.12667814146288</thread>
  <body>
[
  {"__c":"osrfMessage","__p":
    {"threadTrace":"1","locale":"en-US","type":"REQUEST","payload":
      {"__c":"osrfMethod","__p":
        {"method":"opensrf.simple-text.reverse","params":["foobar"]}
      }
    }
  }
]
  </body>
</message>

A response from opensrf.simple-text.reverse("foobar"). 

<message from='opensrf@private.localhost/opensrf.simple-text_drone_at_localhost_6285'
  to='opensrf@private.localhost/_karmic_126678.3719_6288'
  router_command='' router_class='' osrf_xid=''
>
  <thread>1266781414.366573.12667814146288</thread>
  <body>
[
  {"__c":"osrfMessage","__p":
    {"threadTrace":"1","payload":
      {"__c":"osrfResult","__p":
        {"status":"OK","content":"raboof","statusCode":200}
      } ,"type":"RESULT","locale":"en-US"}
  },
  {"__c":"osrfMessage","__p":
    {"threadTrace":"1","payload":
      {"__c":"osrfConnectStatus","__p":
        {"status":"Request Complete","statusCode":205}
      },"type":"STATUS","locale":"en-US"}
  }
]
  </body>
</message>

The content of the <body> element of the OpenSRF request and result should look familiar; they match the structure of the OpenSRF over HTTP examples that we previously dissected.

90.4.3. Registering OpenSRF methods in depth

Let’s explore the call to __PACKAGE__->register_method(); most of the elements of the hash are optional, and for the sake of brevity we omitted them in the previous example. As we have seen in the results of the introspection call, a verbose registration method call is recommended to better enable the internal documentation. So, for the sake of completeness here, is the set of elements that you should pass to __PACKAGE__->register_method():

method: the name of the procedure in this module that is being registered as an OpenSRF method

api_name: the invocable name of the OpenSRF method; by convention, the OpenSRF service name is used as the prefix

api_level: (optional) can be used for versioning the methods to allow the use of a deprecated API, but in practical use is always 1

argc: (optional) the minimal number of arguments that the method expects

stream: (optional) if this argument is set to any value, then the method supports returning multiple values from a single call to subsequent requests, and OpenSRF automatically creates a corresponding method with ".atomic" appended to its name that returns the complete set of results in a single request; streaming methods are useful if you are returning hundreds of records and want to act on the results as they return

signature: (optional) a hash describing the method’s purpose, arguments, and return value

desc: a description of the method’s purpose

params: an array of hashes, each of which describes one of the method arguments

name: the name of the argument

desc: a description of the argument’s purpose

type: the data type of the argument: for example, string, integer, boolean, number, array, or hash

return: a hash describing the return value of the method

desc: a description of the return value

type: the data type of the return value: for example, string, integer, boolean, number, array, or hash

90.5. Evergreen-specific OpenSRF services

Evergreen is currently the primary showcase for the use of OpenSRF as an application architecture. Evergreen 1.6.0 includes the following set of OpenSRF services:

open-ils.actor: Supports common tasks for working with user accounts and libraries.

open-ils.auth: Supports authentication of Evergreen users.

open-ils.cat: Supports common cataloging tasks, such as creating, modifying, and merging bibliographic and authority records.

open-ils.circ: Supports circulation tasks such as checking out items and calculating due dates.

open-ils.collections: Supports tasks to assist collections services for contacting users with outstanding fines above a certain threshold.

open-ils.cstore: Supports unrestricted access to Evergreen fieldmapper objects. This is a private service.

open-ils.ingest: Supports tasks for importing bibliographic and authority records.

open-ils.pcrud: Supports permission-based access to Evergreen fieldmapper objects.

open-ils.penalty: Supports the calculation of penalties for users, such as being blocked from further borrowing, for conditions such as having too many items checked out or too many unpaid fines.

open-ils.reporter: Supports the creation and scheduling of reports.

open-ils.reporter-store: Supports access to Evergreen fieldmapper objects for the reporting service. This is a private service.

open-ils.search: Supports searching across bibliographic records, authority records, serial records, Z39.50 sources, and ZIP codes.

open-ils.storage: A deprecated method of providing access to Evergreen fieldmapper objects. Implemented in Perl, this service has largely been replaced by the much faster C-based open-ils.cstore service.

open-ils.supercat: Supports transforms of MARC records into other formats, such as MODS, as well as providing Atom and RSS feeds and SRU access.

open-ils.trigger: Supports event-based triggers for actions such as overdue and holds available notification emails.

open-ils.vandelay: Supports the import and export of batches of bibliographic and authority records.

Of some interest is that the open-ils.reporter-store and open-ils.cstore services have identical implementations. Surfacing them as separate services enables a deployer of Evergreen to ensure that the reporting service does not interfere with the performance-critical open-ils.cstore service. One can also direct the reporting service to a read-only database replica to, again, avoid interference with open-ils.cstore which must write to the master database.

There are only a few significant services that are not built on OpenSRF in Evergreen 1.6.0, such as the SIP and Z39.50 servers. These services implement different protocols and build on existing daemon architectures (Simple2ZOOM for Z39.50), but still rely on the other OpenSRF services to provide access to the Evergreen data. The non-OpenSRF services are reasonably self-contained and can be deployed on different servers to deliver the same sort of deployment flexibility as OpenSRF services, but have the disadvantage of not being integrated into the same configuration and control infrastructure as the OpenSRF services.

90.6. Evergreen after one year: reflections on OpenSRF

Project Conifer has been live on Evergreen for just over a year now, and as one of the primary technologists I have had to work closely with the OpenSRF infrastructure during that time. As such, I am in a position to identify some of the strengths and weaknesses of OpenSRF based on our experiences.

90.6.1. Strengths of OpenSRF

As a service infrastructure, OpenSRF has been remarkably reliable. We initially deployed Evergreen on an unreleased version of both OpenSRF and Evergreen due to our requirements for some functionality that had not been delivered in a stable release at that point in time, and despite this risky move we suffered very little unplanned downtime in the opening months. On July 27, 2009 we moved to a newer (but still unreleased) version of the OpenSRF and Evergreen code, and began formally tracking our downtime. Since then, we have achieved more than 99.9% availability - including scheduled downtime for maintenance. This compares quite favourably to the maximum of 75% availability that we were capable of achieving on our previous library system due to the nightly downtime that was required for our backup process. The OpenSRF "maximum request" configuration parameter for each service that kills off drone processes after they have served a given number of requests provides a nice failsafe for processes that might otherwise suffer from a memory leak or hung process. It also helps that when we need to apply an update to a Perl service that is running on multiple servers, we can apply the updated code, then restart the service on one server at a time to avoid any downtime.

As promised by the OpenSRF infrastructure, we have also been able to tune our cluster of servers to provide better performance. For example, we were able to change the number of maximum concurrent processes for our database services when we noticed that we seeing a performance bottleneck with database access. Making a configuration change go live simply requires you to restart the opensrf.setting service to pick up the configuration change, then restart the affected service on each of your servers. We were also able to turn off some of the less-used OpenSRF services, such as open-ils.collections, on one of our servers to devote more resources on that server to the more frequently used services and other performance-critical processes such as Apache.

The support for logging and caching that is built into OpenSRF has been particularly helpful with the development of a custom service for SFX holdings integration into our catalogue. Once I understood how OpenSRF works, most of the effort required to build that SFX integration service was spent on figuring out how to properly invoke the SFX API to display human-readable holdings. Adding a new OpenSRF service and registering several new methods for the service was relatively easy. The support for directing log messages to syslog in OpenSRF has also been a boon for both development and debugging when problems arise in a cluster of five servers; we direct all of our log messages to a single server where we can inspect the complete set of messages for the entire cluster in context, rather than trying to piece them together across servers.

90.6.2. Weaknesses

The primary weakness of OpenSRF is the lack of either formal or informal documentation for OpenSRF. There are many frequently asked questions on the Evergreen mailing lists and IRC channel that indicate that some of the people running Evergreen or trying to run Evergreen have not been able to find documentation to help them understand, even at a high level, how the OpenSRF Router and services work with XMPP and the Apache Web server to provide a working Evergreen system. Also, over the past few years several developers have indicated an interest in developing Ruby and PHP bindings for OpenSRF, but the efforts so far have resulted in no working code. Without a formal specification, clearly annotated examples, and unit tests for the major OpenSRF communication use cases that could be ported to the new language as a base set of expectations for a working binding, the hurdles for a developer new to OpenSRF are significant. As a result, Evergreen integration efforts with popular frameworks like Drupal, Blacklight, and VuFind result in the best practical option for a developer with limited time — database-level integration — which has the unfortunate side effect of being much more likely to break after an upgrade.

In conjunction with the lack of documentation that makes it hard to get started with the framework, a disincentive for new developers to contribute to OpenSRF itself is the lack of integrated unit tests. For a developer to contribute a significant, non-obvious patch to OpenSRF, they need to manually run through various (undocumented, again) use cases to try and ensure that the patch introduced no unanticipated side effects. The same problems hold for Evergreen itself, although the Constrictor stress-testing framework offers a way of performing some automated system testing and performance testing.

These weaknesses could be relatively easily overcome with the effort through contributions from people with the right skill sets. This article arguably offers a small set of clear examples at both the networking and application layer of OpenSRF. A technical writer who understands OpenSRF could contribute a formal specification to the project. With a formal specification at their disposal, a quality assurance expert could create an automated test harness and a basic set of unit tests that could be incrementally extended to provide more coverage over time. If one or more continual integration environments are set up to track the various OpenSRF branches of interest, then the OpenSRF community would have immediate feedback on build quality. Once a unit testing framework is in place, more developers might be willing to develop and contribute patches as they could sanity check their own code without an intense effort before exposing it to their peers.

90.7. Summary

In this article, I attempted to provide both a high-level and detailed overview of how OpenSRF works, how to build and deploy new OpenSRF services, how to make requests to OpenSRF method from OpenSRF clients or over HTTP, and why you should consider it a possible infrastructure for building your next high-performance system that requires the capability to scale out. In addition, I surveyed the Evergreen services built on OpenSRF and reflected on the strengths and weaknesses of the platform based on the experiences of Project Conifer after a year in production, with some thoughts about areas where the right application of skills could make a significant difference to the Evergreen and OpenSRF projects.

90.8. Appendix: Python client

Following is a Python client that makes the same OpenSRF calls as the Perl client:

#!/usr/bin/env python
"""OpenSRF client example in Python"""
import osrf.system
import osrf.ses

def osrf_substring(session, text, sub):
    """substring: Accepts a string and a number as input, returns a string"""
    request = session.request('opensrf.simple-text.substring', text, sub)

    # Retrieve the response from the method
    # The timeout parameter is optional
    response = request.recv(timeout=2)

    request.cleanup()
    # The results are accessible via content()
    return response.content()

def osrf_split(session, text, delim):
    """split: Accepts two strings as input, returns an array of strings"""
    request = session.request('opensrf.simple-text.split', text, delim)
    response = request.recv()
    request.cleanup()
    return response.content()

def osrf_statistics(session, strings):
    """statistics: Accepts an array of strings as input, returns a hash"""
    request = session.request('opensrf.simple-text.statistics', strings)
    response = request.recv()
    request.cleanup()
    return response.content()

if __name__ == "__main__":
    file = '/openils/conf/opensrf_core.xml'

    # Pull connection settings from <config><opensrf> section of opensrf_core.xml
    osrf.system.System.connect(config_file=file, config_context='config.opensrf')

    # Set up a connection to the opensrf.settings service
    session = osrf.ses.ClientSession('opensrf.simple-text')

    result = osrf_substring(session, "foobar", 3)
    print(result)
    print

    result = osrf_split(session, "This is a test", " ")
    print("Received %d elements: [" % len(result)),
    print(', '.join(result)), ']'

    many_strings = (
        "First I think I'll have breakfast",
        "Then I think that lunch would be nice",
        "And then seventy desserts to finish off the day"
    )
    result = osrf_statistics(session, many_strings)
    print("Length: %d" % result["length"])
    print("Word count: %d" % result["word_count"])

    # Cleanup connection resources
    session.cleanup()

Python’s dnspython module refuses to read /etc/resolv.conf, so to access hostnames that are not served up via DNS, such as the extremely common case of localhost, you may need to install a package like dnsmasq to act as a local DNS server for those hostnames.

Chapter 91. Updating translations using Launchpad

This document describes how to update the translations in an Evergreen branch by pulling them from Launchpad, as well as update the files to be translated in Launchpad by updating the POT files in the Evergreen master branch.

91.1. Prerequisites

You must install all of the Python prerequisites required for building translations, per http://evergreen-ils.org/dokuwiki/doku.php?id=evergreen-admin:customizations:i18n

polib

translate-toolkit

levenshtein

setuptools

simplejson

lxml

91.2. Updating the translations

Check out the latest translations from Launchpad by branching the Bazaar repository:

bzr branch lp:~denials/evergreen/translation-export

This creates a directory called "translation-export".

Ensure you have an updated Evergreen release branch.

Run the build/i18n/scripts/update_pofiles script to copy the translations into the right place and avoid any updates that are purely metadata (dates generated, etc).

Commit the lot! And backport to whatever release branches need the updates.

Build updated POT files:

cd build/i18n
make newpot

This will extract all of the strings from the latest version of the files in Evergreen.

(This part needs automation): Then, via the magic of git diff and git add, go through all of the changed files and determine which ones actually have string changes. Recommended approach is to re-run git diff after each git add.

Commit the updated POT files and backport to the pertinent release branches.

Appendix A. Attributions

Copyright © 2009-2012 Evergreen DIG

Copyright © 2007-2012 Equinox

Copyright © 2007-2012 Dan Scott

Copyright © 2009-2012 BC Libraries Cooperative (SITKA)

Copyright © 2008-2012 King County Library System

Copyright © 2009-2012 Pioneer Library System

Copyright © 2009-2012 PALS

Copyright © 2009-2012 Georgia Public Library Service

Copyright © 2008-2012 Project Conifer

Copyright © 2009-2012 Bibliomation

Copyright © 2008-2012 Evergreen Indiana

Copyright © 2008-2012 SC LENDS

Current DIG Members

Hilary Caws-Elwitt, Susquehanna County Library

Karen Collier, Kent County Public Library

George Duimovich, NRCan Library

Sally Fortin, Equinox Software

Wolf Halton, Lyrasis

June Rayner, eiNetwork

Steve Sheppard

Ben Shum, Bibliomation

Roni Shwaish, eiNetwork

Robert Soulliere, Mohawk College

Tim Spindler, C/W MARS

Lindsay Stratton, Pioneer Library System

Yamil Suarez, Berklee College of Music

Jenny Turner, PALS

Appendix B. Licensing

This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

Appendix C. Admonitions

Note

warning

caution

tip

Index

A

accounts, EDI Accounts

acquisitions

claiming, Claiming

currency types, Currency Types

distribution formulas, Distribution Formulas

EDI

accounts, EDI Accounts

messages, EDI Messages

exchange rates, Exchange Rates

funding sources, Funding Sources

funds, Funds

tags, Fund Tags

invoices, Invoice menus, Invoices

electronic, Electronic Invoicing

searching for lineitems, Search for Line Items from an Invoice

line item

cancellation, Cancel/Suspend reasons

line items, Line item features

lineitems

adding, Search for Line Items from an Invoice

searching for, Search for Line Items from an Invoice

MARC federated search, MARC Federated Search

permissions, Acquisitions Permissions in the Admin module

purchase order

cancellation, Cancel/Suspend reasons

adding, Search for Line Items from an Invoice

adding data sources, Adding Data Sources to Reporter

aggregate filters, Applying Filters

Alerts, Patron Alerts

Apache, Upgrade the Evergreen code

applying filters, Applying Filters

aggregate filters, Applying Filters

base filter, Applying Filters, Using Base Filters

aquisitions

funds

fiscal rollover, Perform Year End Closeout Operation, Enhancements to Fiscal Rollover

reports, Core Source Added for Fund Reporting

B

barring, Barring a Patron, Barred vs. Blocked

base filter, Applying Filters, Using Base Filters

blocking, Barred vs. Blocked

button bar

customization, Button Bar/Toolbar

C

cancellation, Cancel/Suspend reasons

checkout, Receipt Template Editor

choosing reports fields, Choosing Report Fields

circulation

recalls

hold-driven, Hold-driven recalls

claiming, Claiming

cloning, Cloning Shared Templates

configuration, Workstation Administration

copy editor

shelving location, Copy Editor: Copy Location Name First

count, Field Transforms

creating, Creating Folders

creating templates, Creating Templates

choosing reports fields, Choosing Report Fields

currency types, Currency Types

customization, Button Bar/Toolbar

D

data types, Data Types

database schema, Upgrade the Evergreen database schema, Create a PostgreSQL query, view, or table for your data source

Debian, Upgrade the Evergreen code

distribution formulas, Distribution Formulas

E

EDI

accounts, EDI Accounts

messages, EDI Messages

electronic, Electronic Invoicing

Excel, Viewing Report Output

exchange rates, Exchange Rates

exporting, Exporting Templates

exporting templates, Exporting Report Templates Using phpPgAdmin

F

field transform, Choosing Report Fields

field transforms, Field Transforms

count, Field Transforms

output type, Field Transforms

raw data, Field Transforms

raw distinct, Field Transforms

fieldmapper, Add a new class to fm_IDL.xml for your data source

fiscal rollover, Perform Year End Closeout Operation, Enhancements to Fiscal Rollover

fm_IDL.xml, Adding Data Sources to Reporter, Add a new class to fm_IDL.xml for your data source

folders, Folders

creating, Creating Folders

managing, Managing Folders

fonts, Font and Sound Settings

funding sources, Funding Sources

funds, Funds, Core Source Added for Fund Reporting

fiscal rollover, Perform Year End Closeout Operation, Enhancements to Fiscal Rollover

reports, Core Source Added for Fund Reporting

tags, Fund Tags

G

generating, Generating Reports from Templates

H

hold-driven, Hold-driven recalls

hold-driven recalls, Hold-driven recalls

holds receipt

layout, Print Holds Slip with Landscape Layout

hotkeys, Select Hotkeys

I

importing, Importing Templates

installation

Linux, Installing on Linux

Windows, Installing on Windows

invoices, Invoice menus, Invoices

electronic, Electronic Invoicing

searching for lineitems, Search for Line Items from an Invoice

L

layout, Print Holds Slip with Landscape Layout

library cards

renewing, Renewing Library Cards

replacing, Lost Library Cards

line item

cancellation, Cancel/Suspend reasons

line items, Line item features

lineitems

adding, Search for Line Items from an Invoice

searching for, Search for Line Items from an Invoice

Linux, Installing on Linux

Debian, Upgrade the Evergreen code

Ubuntu, Upgrade the Evergreen code

logging in, Logging in to Evergreen

logging out, Logging Out

M

macros, Receipt Template Editor

managing, Managing Folders

MARC federated search, MARC Federated Search

merging, Merging Patron Records

messages, EDI Messages

N

notes, Patron Notes

O

output, Viewing Report Output

Excel, Viewing Report Output

spreadsheet, Viewing Report Output

tabular, Viewing Report Output

output type, Field Transforms

P

passwords, Resetting Patron’s Password

patrons

Alerts, Patron Alerts

barring, Barring a Patron, Barred vs. Blocked

blocking, Barred vs. Blocked

merging, Merging Patron Records

notes, Patron Notes

passwords, Resetting Patron’s Password

registering, Registering New Patrons

searching for, Searching Patrons

updating, Updating Patron Information

permissions, Acquisitions Permissions in the Admin module

PostgreSQL, Adding Data Sources to Reporter, Create a PostgreSQL query, view, or table for your data source

printers, Configure Printers

purchase order

cancellation, Cancel/Suspend reasons

R

raw data, Field Transforms

raw distinct, Field Transforms

recalls

hold-driven, Hold-driven recalls

receipt template editor, Receipt Template Editor

checkout, Receipt Template Editor

exporting, Exporting Templates

holds receipt

layout, Print Holds Slip with Landscape Layout

importing, Importing Templates

macros, Receipt Template Editor

recurring, Running Recurring Reports

registering, Registering New Patrons

registering a workstation, Registering a Workstation

removing user preferences, Removing Staff Client Preferences

removing user settings, Removing Staff Client Preferences

renewing, Renewing Library Cards

replacing, Lost Library Cards

report sources, Add a new class to fm_IDL.xml for your data source

reporter

starting, Starting the Reporter Daemon

starting daemon, Starting and Stopping the Reporter Daemon

stopping daemon, Stopping the Reporter Daemon

reports, Core Source Added for Fund Reporting

adding data sources, Adding Data Sources to Reporter

applying filters, Applying Filters

aggregate filters, Applying Filters

base filter, Applying Filters, Using Base Filters

cloning, Cloning Shared Templates

creating templates, Creating Templates

choosing reports fields, Choosing Report Fields

data types, Data Types

exporting templates, Exporting Report Templates Using phpPgAdmin

field transform, Choosing Report Fields

field transforms, Field Transforms

count, Field Transforms

output type, Field Transforms

raw data, Field Transforms

raw distinct, Field Transforms

folders, Folders

creating, Creating Folders

managing, Managing Folders

funds, Core Source Added for Fund Reporting

generating, Generating Reports from Templates

output, Viewing Report Output

Excel, Viewing Report Output

spreadsheet, Viewing Report Output

tabular, Viewing Report Output

recurring, Running Recurring Reports

starting server application, Starting and Stopping the Reporter Daemon

stopping server application, Stopping the Reporter Daemon

S

searching for, Search for Line Items from an Invoice, Searching Patrons

searching for lineitems, Search for Line Items from an Invoice

shelving location, Copy Editor: Copy Location Name First

sounds, Font and Sound Settings

spreadsheet, Viewing Report Output

SQL, Adding Data Sources to Reporter

SSL certificate, Logging in to Evergreen

staff client

button bar

customization, Button Bar/Toolbar

configuration, Workstation Administration

fonts, Font and Sound Settings

hotkeys, Select Hotkeys

installation

Linux, Installing on Linux

Windows, Installing on Windows

logging in, Logging in to Evergreen

logging out, Logging Out

printers, Configure Printers

registering a workstation, Registering a Workstation

removing user preferences, Removing Staff Client Preferences

removing user settings, Removing Staff Client Preferences

sounds, Font and Sound Settings

standalone interface, Standalone Interface

toolbar

customization, Button Bar/Toolbar

standalone interface, Standalone Interface

starting, Starting the Reporter Daemon

starting daemon, Starting and Stopping the Reporter Daemon

starting server application, Starting and Stopping the Reporter Daemon

stopping daemon, Stopping the Reporter Daemon

stopping server application, Stopping the Reporter Daemon

T

tabular, Viewing Report Output

tags, Fund Tags

toolbar

customization, Button Bar/Toolbar

U

Ubuntu, Upgrade the Evergreen code

updating, Updating Patron Information

W

Windows, Installing on Windows

workstation

configuration, Workstation Administration