bringing in PINES files
authorChris Sharp <csharp@georgialibraries.org>
Thu, 17 Nov 2011 20:31:14 +0000 (15:31 -0500)
committerChris Sharp <csharp@georgialibraries.org>
Mon, 28 Nov 2011 19:04:28 +0000 (14:04 -0500)
27 files changed:
Open-ILS/examples/apache/startup.pl.orig [new file with mode: 0755]
Open-ILS/examples/pines-examples/homesearch.xml.survey [new file with mode: 0644]
Open-ILS/examples/pines-examples/pines-circ/circ_duration.js.example [new file with mode: 0755]
Open-ILS/examples/pines-examples/pines-circ/circ_groups.js.example [new file with mode: 0755]
Open-ILS/examples/pines-examples/pines-circ/circ_item_config.js.example [new file with mode: 0755]
Open-ILS/examples/pines-examples/pines-circ/circ_lib.js.example [new file with mode: 0755]
Open-ILS/examples/pines-examples/pines-circ/circ_permit_copy.js.example [new file with mode: 0755]
Open-ILS/examples/pines-examples/pines-circ/circ_permit_hold.js.example [new file with mode: 0755]
Open-ILS/examples/pines-examples/pines-circ/circ_permit_patron.js.example [new file with mode: 0755]
Open-ILS/examples/pines-examples/pines-circ/circ_permit_renew.js.example [new file with mode: 0755]
Open-ILS/examples/pines-examples/pines-survey-down.sh [new file with mode: 0755]
Open-ILS/examples/pines-examples/pines-survey-up.sh [new file with mode: 0755]
Open-ILS/examples/pines-examples/pines-zips.txt.example [new file with mode: 0644]
Open-ILS/examples/pines-examples/utility-server/scripts/circ_notices.sh [new file with mode: 0755]
Open-ILS/examples/pines-examples/utility-server/scripts/circ_notices_overdue_nomail.sh [new file with mode: 0755]
Open-ILS/examples/pines-examples/utility-server/scripts/gen_blocked_list.sh [new file with mode: 0755]
Open-ILS/examples/pines-examples/utility-server/scripts/run-collections.sh [new file with mode: 0755]
Open-ILS/examples/pines-examples/utility-server/scripts/ums/run-calls.pl [new file with mode: 0755]
Open-ILS/examples/templates/overdue_combined_xml_pines.example [new file with mode: 0644]
Open-ILS/src/sql/Pg/pines-1.6-2.1-upgrade.sh [new file with mode: 0644]
Open-ILS/src/sql/Pg/pines-circ.sql [new file with mode: 0644]
Open-ILS/src/sql/Pg/pines-post-1.6.1-2.1-upgrade.sql [new file with mode: 0644]
Open-ILS/src/sql/Pg/pines-pre-1.6.1-2.1-upgrade.sql [new file with mode: 0644]
Open-ILS/src/sql/Pg/post-2.0-pre-2.1-tasks.sql [new file with mode: 0644]
Open-ILS/web/opac/images/main_logo-default.jpg [new file with mode: 0644]
Open-ILS/web/opac/images/small_logo-default.jpg [new file with mode: 0644]
Open-ILS/xul/staff_client/server/locale/en-US/common_custom.properties [new file with mode: 0644]

diff --git a/Open-ILS/examples/apache/startup.pl.orig b/Open-ILS/examples/apache/startup.pl.orig
new file mode 100755 (executable)
index 0000000..6f1a742
--- /dev/null
@@ -0,0 +1,23 @@
+#!/usr/bin/perl
+use OpenILS::WWW::Exporter qw( /openils/conf/opensrf_core.xml );
+use OpenILS::WWW::SuperCat qw( /openils/conf/opensrf_core.xml );
+use OpenILS::WWW::AddedContent qw( /openils/conf/opensrf_core.xml );
+use OpenILS::WWW::Proxy ('/openils/conf/opensrf_core.xml');
+use OpenILS::WWW::Vandelay qw( /openils/conf/opensrf_core.xml );
+use OpenILS::WWW::TemplateBatchBibUpdate qw( /openils/conf/opensrf_core.xml );
+use OpenILS::WWW::EGWeb ('/openils/conf/oils_web.xml');
+use OpenILS::WWW::PasswordReset ('/openils/conf/opensrf_core.xml');
+use OpenILS::WWW::IDL2js ('/openils/conf/opensrf_core.xml');
+
+# - Uncoment the following 2 lines to make use of the IP redirection code
+# - The IP file should to contain a map with the following format:
+# - actor.org_unit.shortname <start_ip> <end_ip>
+# - e.g.  LIB123 10.0.0.1 10.0.0.254
+
+#use OpenILS::WWW::Redirect qw(/openils/conf/opensrf_core.xml);
+#OpenILS::WWW::Redirect->parse_ips_file('/openils/conf/lib_ips.txt');
+
+
+
+1;
+
diff --git a/Open-ILS/examples/pines-examples/homesearch.xml.survey b/Open-ILS/examples/pines-examples/homesearch.xml.survey
new file mode 100644 (file)
index 0000000..9d72f6e
--- /dev/null
@@ -0,0 +1,117 @@
+
+<div id='canvas_main' class='home_search canvas'
+       style='-moz-border-radius: 6px; padding: 6px; margin-top: 65px;' 
+       xmlns="http://www.w3.org/1999/xhtml" xmlns:xi="http://www.w3.org/2001/XInclude">
+
+       <!-- load my js -->
+       <script language='javascript' type='text/javascript'
+               src="<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/default/js/depth_selector.js"> </script>
+       <script language='javascript' type='text/javascript'
+               src="<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/default/js/search_bar.js"> </script>
+
+       <script language='javascript' type='text/javascript'>
+               config.ids.searchbar = {};
+               config.css.searchbar = {};
+               config.ids.searchbar.text                               = 'search_box'; 
+               config.ids.searchbar.submit                     = 'search_submit';      
+               config.ids.searchbar.type_selector      = 'search_type_selector';
+               config.ids.searchbar.depth_selector     = 'depth_selector';
+               config.ids.searchbar.form_selector      = 'form_selector';
+               config.ids.searchbar.extra_row          = 'searchbar_extra';
+               config.ids.searchbar.main_row                   = 'searchbar_main_row';
+               config.ids.searchbar.table                              = 'searchbar_table';
+               config.ids.searchbar.location_tag       = 'search_location_tag_link';
+               config.ids.searchbar.lib_sel_span       = 'lib_selector_span';
+               config.ids.searchbar.lib_sel_link       = 'lib_selector_link';
+               config.ids.searchbar.depth_sel_span     = 'depth_selector_span';
+       </script>
+
+
+       <div style='width: 100%; text-align: center'>
+               <img src='<!--#echo var="OILS_BASE"-->/images/main_logo.jpg' />
+       </div>
+
+       <style>.rowpad { height: 20px; }</style>
+
+       <table id='frontsearch_table' height='100%' width='100%' 
+               style='margin-top: 10px; border-collapse: collapse;'>
+
+               <tbody>
+
+                       <tr class='color_3'>
+
+                               <script language='javascript' type='text/javascript'>
+                                       config.ids.common.now_searching = 'now_searching_location';
+                               </script>
+
+                               <td style='padding: 6px;' class='border_5' align='center'>
+                                       <span>&opac.search.nowSearching;</span>
+                                       <span style='padding: 1px;' id='now_searching_location'>  </span>
+                               </td>
+                       </tr>
+
+
+                       <tr class='rowpad'><td><div style='width: 100%; color: red; font-weight: bold; text-align: center'><p><a href='http://www.surveymonkey.com/s/pinesannualsurvey2011'>Click Here</a> to take the PINES Annual Survey!</p></div></td></tr>
+
+                       <tr>
+                               <td nowrap='nowrap' align='center' class='color_1 border_5'>
+                                       <input id='search_box' style='width: 300px;' type='text' />
+                                       <span style='padding-left: 6px;'>
+                                               <input type='button' style='width: 40px;' id='search_submit' value='Go!' />
+                                       </span>
+                               </td>
+                       </tr>
+
+                       <tr class='rowpad'><td></td></tr>
+
+                       <tr class='color_3 border_5'>
+
+                               <td nowrap='nowrap' align='center' style='padding: 4px;'>
+
+                                       <span style='padding-right:40px;'>
+                                               <!--#include virtual="../common/stypes_selector.xml"-->
+                                       </span>
+
+                                       <span>
+                                               <!--
+                                               <span>&common.format;: </span>
+                                               -->
+                                               <!--#set var='FORM_SEL_ID' value='form_selector'-->
+                                               <!--#include virtual="../common/format_selector.xml"-->
+                                       </span>
+
+                               </td>
+                       </tr>
+
+                       <tr class='rowpad'><td></td></tr>
+
+                       <tr class='color_1 border_5'>
+                               <td align='center' style='padding: 4px; padding-bottom: 6px;'>
+                                       <span style='padding-right: 15px;'>
+                                               <a id='home_adv_search_link' href='javascript:void(0);'>&opac.navigate.advanced;</a></span>
+                                       <span>
+                                               <span class='hide_me' id='depth_selector_span'>
+                                                       <select id='depth_selector' >
+                                                               <option value='new'>&opac.navigate.selectNewOrg;...</option>
+                                                       </select>
+                                               </span>
+                                               <span class='hide_me' id='lib_selector_span'>
+                                                       <a id='lib_selector_link' href='javascript:void(0)'>&opac.navigate.selectOrg;</a>
+                                               </span>
+                                       </span>
+                                       <span style='padding-left: 15px;'>
+                                               <a id='home_myopac_link' href='javascript:void(0);'>&opac.navigate.myopac;</a>
+                                       </span>
+                               </td>
+                       </tr>
+
+               </tbody>
+       </table>
+
+</div>
+
+
+
+
+
+
diff --git a/Open-ILS/examples/pines-examples/pines-circ/circ_duration.js.example b/Open-ILS/examples/pines-examples/pines-circ/circ_duration.js.example
new file mode 100755 (executable)
index 0000000..cb113da
--- /dev/null
@@ -0,0 +1,85 @@
+function go(){
+
+load_lib('JSON_v1.js');
+load_lib('circ/circ_item_config.js');
+log_vars('circ_duration');
+
+
+/* treat pre-cat copies like vanilla books */
+if( isTrue(isPrecat) ) {
+       log_info("pre-cat copy getting duration defaults...");
+       result.durationRule                     = '14_days_2_renew';
+       result.recurringFinesRule       = '10_cent_per_day';
+       result.maxFine                                  = 'overdue_mid';
+       checkDurationExceptions();
+       return;
+}
+
+
+/* grab the config from the config script */
+var config = getItemConfig();
+var itemForm   = (marcXMLDoc) ? extractFixedField(marcXMLDoc,'Form') : "";
+
+
+/* ----------------------------------------------------------------------------- 
+       Now set the rule values based on the config.  If there is no configured info
+       on this copy, fall back on defaults.
+       ----------------------------------------------------------------------------- */
+if( config ) {
+
+       log_debug("circ_duration found a config for the copy");
+       result.durationRule                     = config.durationRule;
+       result.recurringFinesRule       = config.recurringFinesRule;
+       result.maxFine                                  = config.maxFine;
+
+} else {
+
+       result.durationRule                     = '14_days_2_renew';
+       result.recurringFinesRule       = "10_cent_per_day";
+       result.maxFine                                  = "overdue_mid";
+}
+
+
+
+/* ----------------------------------------------------------------------------- 
+       Add custom rules here.  
+       ----------------------------------------------------------------------------- */
+
+var circMod            = (copy.circ_modifier) ? copy.circ_modifier.toLowerCase() : '';
+
+if( isOrgDescendent('STATELIB', copy.circ_lib.id) ) {
+       if( circMod == 'book' )
+               result.durationRule = '35_days_1_renew';
+       if(isTrue(copy.ref))
+               result.durationRule     = '14_days_2_renew';
+
+} else if( isOrgDescendent('NCLS', copy.circ_lib.id) && ( circMod == 'dvd' || circMod == 'video' ) ) 
+       result.recurringFinesRule       = '10_cent_per_day';
+
+
+checkDurationExceptions();
+
+log_info('final duration results: ' + result.durationRule + ' : ' + result.recurringFinesRule + ' : ' + result.maxFine );
+
+} go();
+
+
+
+function checkDurationExceptions() {
+       log_debug("Checking duration rule exceptions for profile  "+patronProfile);
+
+       if(     isGroupDescendant('Staff', patronProfile) || 
+                       isGroupDescendant('Trustee', patronProfile) ||
+            isGroupDescendant('StaffNoPerm', patronProfile) ||
+                       isGroupDescendant('Outreach', patronProfile) ) {
+
+               result.recurringFinesRule       = "staff";
+               result.maxFine                                  = "staff";
+       }
+
+       if( isGroupDescendant('Outreach', patronProfile) ) {
+               log_info("Outreach user found, setting duration to 2 months");
+               result.durationRule = '2_months_2_renew';
+       }
+}
+
diff --git a/Open-ILS/examples/pines-examples/pines-circ/circ_groups.js.example b/Open-ILS/examples/pines-examples/pines-circ/circ_groups.js.example
new file mode 100755 (executable)
index 0000000..6fc2bf1
--- /dev/null
@@ -0,0 +1,114 @@
+/* ---------------------------------------------------------------------
+       Set up the limits for the various profiles (aka permission groups).
+       Values of -1 mean there is no limit 
+
+       maxItemsOut                     - the maximum number of items the user can have out
+       fineThreshold           - the fine threshold. 
+       overdueThreshold        - the overdue items threshold.
+       maxHolds                                - The maximum number of holds the user can have
+
+       A user exceeds the fineThreshold and/or overdueThreshold if they are 
+       equal to or exceed the threshold
+       --------------------------------------------------------------------- */
+
+var GROUP_CONFIG = {
+
+       'Patron' : {
+               maxItemsOut                     : 50,
+               fineThreshold           : 10,
+               overdueThreshold        : 10,
+               maxHolds                                : -1
+       },
+
+       'Class' : {
+               maxItemsOut                     : 50,
+               fineThreshold           : 10,
+               overdueThreshold        : 10,
+               maxHolds                                : 15
+       },
+
+       'Friend'        : {
+               maxItemsOut                     : 50,
+               fineThreshold           : 10,
+               overdueThreshold        : 10,
+               maxHolds                                : -1
+       },
+
+       'NonResident' : {
+               maxItemsOut                     : 50,
+               fineThreshold           : 10,
+               overdueThreshold        : 10,
+               maxHolds                                : -1
+       },
+
+       'OutOfState' : {
+               maxItemsOut                     : 50,
+               fineThreshold           : 10,
+               overdueThreshold        : 10,
+               maxHolds                                : -1
+       },
+
+       'Outreach' : {
+               maxItemsOut                     : -1,
+               fineThreshold           : -1,
+               overdueThreshold        : -1,
+               maxHolds                                : 15
+       },
+
+
+       'Restricted' : {
+               maxItemsOut                     : 2,
+               fineThreshold           : 0.01,
+               overdueThreshold        : 1,
+               maxHolds                                : 5
+       },
+
+       'Temp' : {
+               maxItemsOut                     : 5,
+               fineThreshold           : .01,
+               overdueThreshold        : 1,
+               maxHolds                                : 5
+       },
+
+       'TempRes6' : {
+               maxItemsOut                     : 50,
+               fineThreshold           : 10,
+               overdueThreshold        : 10,
+               maxHolds                                : -1
+       },
+
+       'tempRes12' : {
+               maxItemsOut                     : 50,
+               fineThreshold           : 10,
+               overdueThreshold        : 10,
+               maxHolds                                : -1
+       },
+
+       'Trustee' : {
+               maxItemsOut                     : 50,
+               fineThreshold           : 10,
+               overdueThreshold        : 10,
+               maxHolds                                : 10
+       },
+
+
+       'Vendor' : {
+               maxItemsOut                     : 0,
+               fineThreshold           : 0.01,
+               overdueThreshold        : 1,
+               maxHolds                                : 0
+       },
+
+       'Staff' : {
+               maxItemsOut                     : 50,
+               fineThreshold           : -1,
+               overdueThreshold        : -1,
+               maxHolds                                : -1 
+       },
+
+};
+
+
+
+
+
diff --git a/Open-ILS/examples/pines-examples/pines-circ/circ_item_config.js.example b/Open-ILS/examples/pines-examples/pines-circ/circ_item_config.js.example
new file mode 100755 (executable)
index 0000000..ceba8e7
--- /dev/null
@@ -0,0 +1,535 @@
+load_lib('circ/circ_lib.js');
+log_debug('loading circ_item_config.js ...');
+
+
+/* SIP media types
+000 Other
+001 Book
+002 Magazine
+003 Bound journal
+004 Audio tape
+005 Video tape
+006 CD/CDROM
+007 Diskette
+008 Book with diskette
+009 Book with CD
+010 Book with audio tape
+*/
+
+/* ----------------------------------------------------------------------------- 
+       Configure the duration rules for the various item types and circ modifiers
+
+       MARC Fixed Field info:
+       http://www.oclc.org/bibformats/en/fixedfield/
+
+       ----------------------------------------------------------------------------- */
+
+var MARC_ITEM_TYPE_MAP = {
+
+       a : { /* Language material [Books] */
+               SIPMediaType                    : '001',
+               magneticMedia                   : 'f',
+               durationRule                    : '14_days_2_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       t : { /* Manuscript language material [Books] */
+               SIPMediaType                    : '001',
+               magneticMedia                   : 'f',
+               durationRule                    : '14_days_2_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       g : { /* Projected medium [Videos, etc.] */
+               SIPMediaType                    : '005',
+               magneticMedia                   : 'f',
+               durationRule                    : '7_days_0_renew',
+               recurringFinesRule      : '50_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       k : { /* Two-dimensional nonprojectable graphic [Card, charts, etc.] */
+               SIPMediaType                    : '001',
+               magneticMedia                   : 'f',
+               durationRule                    : '3_month_0_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       r : { /* Three-dimensional artifact or naturally occurring object [Models, games, etc.] */ 
+               SIPMediaType                    : '001',
+               magneticMedia                   : 'f',
+               durationRule                    : '14_days_2_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       o : { /* Kit [Mixture of item types] */
+               SIPMediaType                    : '001',
+               magneticMedia                   : 'f',
+               durationRule                    : '14_days_2_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       p : { /* Mixed materials [Mixture of item types] */
+               SIPMediaType                    : '001',
+               magneticMedia                   : 'f',
+               durationRule                    : '14_days_2_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       e : { /* Cartographic material [Map] */
+               SIPMediaType                    : '001',
+               magneticMedia                   : 'f',
+               durationRule                    : '7_days_2_renew',
+               recurringFinesRule      : '50_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       f : { /* Manuscript cartographic material [Map] */
+               SIPMediaType                    : '001',
+               magneticMedia                   : 'f',
+               durationRule                    : '3_days_1_renew',
+               recurringFinesRule      : '50_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       c : { /* Notated music [Printed music] */
+               SIPMediaType                    : '001',
+               magneticMedia                   : 'f',
+               durationRule                    : '14_days_2_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       d : { /* Manuscript notated music [Printed music] */
+               SIPMediaType                    : '001',
+               magneticMedia                   : 'f',
+               durationRule                    : '14_days_2_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       i : { /* Nonmusical sound recording [Audiobooks, sound effects, etc.] */
+               SIPMediaType                    : '001',
+               magneticMedia                   : 'f',
+               durationRule                    : '14_days_2_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       j : { /* Musical sound recording [Music] */
+               SIPMediaType                    : '001',
+               magneticMedia                   : 'f',
+               durationRule                    : '14_days_2_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       m : { /* Computer file */
+               SIPMediaType                    : '001',
+               magneticMedia                   : 'f',
+               durationRule                    : '14_days_2_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       }
+}
+
+
+var CIRC_MOD_MAP = {
+
+       'art'           : {
+               SIPMediaType                    : '000',
+               magneticMedia                   : 'f',
+               durationRule                    : '3_month_1_renew', 
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'atlas'         : {
+               SIPMediaType                    : '000',
+               magneticMedia                   : 'f',
+               durationRule                    : '7_days_2_renew',
+               recurringFinesRule      : '50_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'audiobook' : {
+               SIPMediaType                    : '004',
+               magneticMedia                   : 'f',
+               durationRule                    : '14_days_2_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'av' : {
+               SIPMediaType                    : '005',
+               magneticMedia                   : 'f',
+               durationRule                    : '7_days_2_renew',
+               recurringFinesRule      : '50_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'new-av' : { 
+               SIPMediaType                    : '005',
+               magneticMedia                   : 'f',
+               durationRule                    : '3_days_1_renew',
+               recurringFinesRule      : '50_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'bestseller'                            : {
+               SIPMediaType                    : '001',
+               magneticMedia                   : 'f',
+               durationRule                    : '7_days_2_renew',
+               recurringFinesRule      : '50_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'bestsellernh'                          : {
+               SIPMediaType                    : '001',
+               magneticMedia                   : 'f',
+               durationRule                    : '7_days_2_renew',
+               recurringFinesRule      : '50_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'book'                                          : {
+               SIPMediaType                    : '001',
+               magneticMedia                   : 'f',
+               durationRule                    : '14_days_2_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'cd'                            : {
+               SIPMediaType                    : '006',
+               magneticMedia                   : 'f',
+               durationRule                    : '14_days_2_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'dvd'                                                   : {
+               SIPMediaType                    : '006',
+               magneticMedia                   : 'f',
+               durationRule                    : '7_days_0_renew',
+               recurringFinesRule      : '50_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'dvd-long'                                                      : {
+               SIPMediaType                    : '006',
+               magneticMedia                   : 'f',
+               durationRule                    : '14_days_2_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'dvd-mid'                                                       : {
+               SIPMediaType                    : '006',
+               magneticMedia                   : 'f',
+               durationRule                    : '7_days_2_renew',
+               recurringFinesRule          : '50_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'e-book' : {
+               SIPMediaType                    : '001',
+               magneticMedia                   : 'f',
+               durationRule                    : '3_days_1_renew',
+               recurringFinesRule      : '50_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'equipment' : { 
+               SIPMediaType                    : '000',
+               magneticMedia                   : 'f',
+               durationRule                    : '1_day_0_renew', /* make me 1 day, 0 renewal when possible */
+               recurringFinesRule      : '50_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'equip-long' : { 
+               SIPMediaType                    : '000',
+               magneticMedia                   : 'f',
+               durationRule                    : '3_days_1_renew',
+               recurringFinesRule      : '50_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'filmstrip'                                     : {
+               SIPMediaType                    : '000',
+               magneticMedia                   : 'f',
+               durationRule                    : '14_days_2_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'kit' : {
+               SIPMediaType                    : '000',
+               magneticMedia                   : 'f',
+               durationRule                    : '14_days_2_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'internet'      : {
+               SIPMediaType                    : '000',
+               magneticMedia                   : 'f',
+               durationRule                    : '1_hour_2_renew',
+               recurringFinesRule      : 'no_fines',
+               maxFine                                 : 'no_fines'
+       },
+
+       'magazine'      : {
+               SIPMediaType                    : '002',
+               magneticMedia                   : 'f',
+               durationRule                    : '14_days_2_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'map' : {
+               SIPMediaType                    : '000',
+               magneticMedia                   : 'f',
+               durationRule                    : '3_days_1_renew',
+               recurringFinesRule      : '50_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'microform' : {
+               SIPMediaType                    : '000',
+               magneticMedia                   : 'f',
+               durationRule                    : '14_days_2_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'music' : {
+               SIPMediaType                    : '004',
+               magneticMedia                   : 'f',
+               durationRule                    : '14_days_2_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'record'                                                : {
+               SIPMediaType                    : '000',
+               magneticMedia                   : 'f',
+               durationRule                    : '14_days_2_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'software' : {
+               SIPMediaType                    : '006',
+               magneticMedia                   : 'f',
+               durationRule                    : '7_days_2_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'softwrlong' : {
+               SIPMediaType                    : '006',
+               magneticMedia                   : 'f',
+               durationRule                    : '14_days_2_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'videogame' : {
+               SIPMediaType                    : '006',
+               magneticMedia                   : 'f',
+               durationRule                    : '7_days_2_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'videogamelong' : {
+               SIPMediaType                    : '006',
+               magneticMedia                   : 'f',
+               durationRule                    : '14_days_2_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'talking book'                          : {  
+               SIPMediaType                    : '006',
+               magneticMedia                   : 'f',
+               durationRule                    : 'unlimited',
+       },
+
+       'toy'                                                   : {
+               SIPMediaType                    : '000',
+               magneticMedia                   : 'f',
+               durationRule                    : '14_days_2_renew',
+               recurringFinesRule      : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'video' : {
+               SIPMediaType                    : '005',
+               magneticMedia                   : 'f',
+               durationRule                    : '7_days_0_renew',
+               recurringFinesRule      : '50_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'video-long'    : {
+               SIPMediaType                    : '005',
+               magneticMedia                   : 'f',
+               durationRule                    : '14_days_2_renew',
+               recurringFinesRule          : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'video-mid'     : {
+               SIPMediaType                    : '005',
+               magneticMedia                   : 'f',
+               durationRule                    : '7_days_2_renew',
+               recurringFinesRule          : '50_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+
+       'facbestslr'    : {
+               SIPMediaType                    : '001',
+               magneticMedia                   : 'f',
+               durationRule                    : '7_days_2_renew',
+               recurringFinesRule          : '10_cent_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+
+       'eventpass'     : {
+               SIPMediaType                    : '001',
+               magneticMedia                   : 'f',
+               durationRule                    : '7_day_1_renew',
+               recurringFinesRule          : '3_dollar_per_day',
+               maxFine                                 : 'overdue_mid'
+       },
+}
+
+
+/* Set up rules for legacy types */
+CIRC_MOD_MAP['DEPOSIT']        = CIRC_MOD_MAP['book'];
+CIRC_MOD_MAP['E-AUDIO']        = CIRC_MOD_MAP['book'];
+CIRC_MOD_MAP['FACNEWBK']       = CIRC_MOD_MAP['book'];
+CIRC_MOD_MAP['MAG-CIRC']       = CIRC_MOD_MAP['book'];
+CIRC_MOD_MAP['MAG-NOCIRC'] = CIRC_MOD_MAP['book'];
+CIRC_MOD_MAP['NEW-BOOK']       = CIRC_MOD_MAP['book'];
+CIRC_MOD_MAP['NEWSPAPER']      = CIRC_MOD_MAP['book'];
+CIRC_MOD_MAP['OUTREACH']       = CIRC_MOD_MAP['book'];
+CIRC_MOD_MAP['PAMPHLET']       = CIRC_MOD_MAP['book'];
+CIRC_MOD_MAP['PAPERBACK']      = CIRC_MOD_MAP['book'];
+CIRC_MOD_MAP['RESERVE']        = CIRC_MOD_MAP['book'];
+CIRC_MOD_MAP['STATE-BOOK'] = {
+       SIPMediaType                    : '001',
+       magneticMedia                   : 'f',
+       durationRule                    : '35_days_1_renew',
+       recurringFinesRule      : "10_cent_per_day",
+       maxFine                                 : "overdue_mid"
+};
+CIRC_MOD_MAP['STATE-MFRM'] =  {
+       SIPMediaType                    : '001',
+       magneticMedia                   : 'f',
+       durationRule                    : '14_days_2_renew',
+       recurringFinesRule      : "10_cent_per_day",
+       maxFine                                 : "overdue_mid"
+};
+
+
+
+
+/* this will set defaults even if no one asked for them */
+log_debug("Calling getItemConfig() to force defaults..");
+getItemConfig();
+log_debug("getItemConfig() set magneticMedia to "+result.magneticMedia);
+
+
+function getItemConfig() {
+
+       /* ----------------------------------------------------------------------------------- 
+               If a circ_modifier is defined on the copy and we have config info for the
+               provided circ_modifier, use that config.  Otherwise fall back on the MARC item type
+               ----------------------------------------------------------------------------------- */
+       var marcType    = getMARCItemType();
+       var itemForm    = (marcXMLDoc) ? extractFixedField(marcXMLDoc,'Form') : "";
+       //var circMod           = (copy.circ_modifier) ? copy.circ_modifier.toLowerCase() : '';
+       var circMod             = copy.circ_modifier;
+       
+       var config = null;
+
+   if( circMod ) {
+      config = CIRC_MOD_MAP[circMod];
+      if(!config) 
+         config = CIRC_MOD_MAP[circMod.toLowerCase()]
+      if(config)
+                  log_info("a circ_mod config exists for the copy with mod: " + circMod);
+   }
+
+   if(!config) {
+               /* otherwise, fall back on the MARC item type */
+               if( circMod ) 
+                       log_info("no circ_mod config found for " +circMod+", falling back to MARC");
+               config = MARC_ITEM_TYPE_MAP[marcType];
+       }
+
+       /* if no config could be found, default to 'book' */
+       if(!config) {
+               log_warn("item_config found no circ_mod OR MARC config, defaulting to 'book'");
+               config = CIRC_MOD_MAP['book'];
+       }
+
+       config.maxFine = setMaxFineByCircLocation();
+
+       /* go ahead and set some default result 
+               data (which may be overidden) */
+       for( var i in config ) {
+               log_debug("item_config setting result defaults: "+i+" = " +config[i]);
+               result[i] = config[i];
+       }
+
+       return config;
+}
+
+
+function setMaxFineByCircLocation() {
+       var max_libs = [ 'DTRL', 'SJRLS' ];
+       var mid_libs = [ 'ARL', 'CHRL', 'DCPL', 'ECGR', 'FRRLS', 'HCLS', 'NCLS', 'OCRL', 'OHOOP', 'OKRL', 'PMRLS', 'PPL', 'STRL' ];
+
+       var cl = (volume && volume.id != -1) ? volume.owning_lib : currentLocation.id;
+       var max_fine = null;
+
+       for( var i = 0; i < max_libs.length; i++ ) {
+               var org = max_libs[i];
+               if( isOrgDescendent(org, cl) ) {
+                       log_debug("found max-fine ancestor org "+org);
+                       max_fine = 'overdue_max';
+                       break;
+               }
+       }
+
+       if(!max_fine) {
+               for( var i = 0; i < mid_libs.length; i++ ) {
+                       var org = mid_libs[i];
+                       if( isOrgDescendent(org, cl) ) {
+                               log_debug("found mid-fine ancestor org "+org);
+                               max_fine = 'overdue_mid';
+                               break;
+                       }
+               }
+       }
+
+       if(!max_fine) max_fine = 'overdue_min';
+
+       log_info("setMaxFineByCircLocation() set max_fine to "+ max_fine);
+
+       return max_fine;
+}
+
+
diff --git a/Open-ILS/examples/pines-examples/pines-circ/circ_lib.js.example b/Open-ILS/examples/pines-examples/pines-circ/circ_lib.js.example
new file mode 100755 (executable)
index 0000000..ac3c5d6
--- /dev/null
@@ -0,0 +1,315 @@
+load_lib('catalog/record_type.js');
+load_lib('circ/circ_groups.js');
+load_lib('JSON_v1.js');
+
+
+try {
+       if( environment.copy ) {
+               environment.copy.fetchBestHold = function() {
+                       var key = scratchKey();
+                       environment.copy.__OILS_FUNC_fetch_best_hold(scratchPad(key));
+                       var val = getScratch(key);
+                       return (val) ? val : null;
+               }
+       }
+} catch(e) {}
+
+
+/* ----------------------------------------------------------------------------- 
+       Collect all of the global variables
+       ----------------------------------------------------------------------------- */
+
+/* the global result object.  Any data returned to the 
+       caller must be put into this object.  */
+var result                             = environment.result = {};
+result.event                   = 'SUCCESS';
+result.events                  = [];
+result.fatalEvents     = [];
+result.infoEvents              = [];
+
+
+/* Pull in any variables passed in from the calling process */
+var copy                                       = environment.copy;
+var volume                             = environment.volume;
+var title                              = environment.title;
+var recDescriptor              = environment.titleDescriptor;
+var patron                             = environment.patron;
+var patronItemsOut     = environment.patronItemsOut;
+var patronOverdueCount = environment.patronOverdueCount;
+var patronFines                = environment.patronFines;
+var isRenewal                  = environment.isRenewal;
+var isPrecat                   = environment.isPrecat;
+var currentLocation    = environment.location;
+var holdRequestLib     = environment.requestLib;
+var holdPickupLib       = environment.pickupLib; /* hold pickup lib */
+var requestor = environment.requestor || patron;
+var newHold = environment.newHold;
+
+
+
+/* create some new vars based on the data we have wherever possible */
+var patronProfile;
+var copyStatus;
+var marcXMLDoc;
+
+if( patron && patron.profile ) 
+       patronProfile = patron.profile.name;
+if( copy && copy.status ) 
+       copyStatus = copy.status.name;
+if( title && title.marc )
+       marcXMLDoc = new XML(title.marc);
+
+
+
+/* copy the group tree into some other useful data structures */
+var groupTree          = environment.groupTree;
+var groupList          = {};
+var groupIDList        = {};
+flattenGroupTree(groupTree);
+
+
+
+
+
+
+/* ----------------------------------------------------------------------------- 
+       Define all of the utility functions
+       ----------------------------------------------------------------------------- */
+
+
+
+/* useful functions for creating wrappers around system functions */
+var __scratchKey = 0;
+var __SCRATCH = {};
+function scratchKey()          { return '_' + __scratchKey++; };
+function scratchPad(key)       { return '__SCRATCH.'+ key; }
+function getScratch(key)       { return __SCRATCH[ key ]; }
+function scratchClear()                { for( var o in __SCRATCH ) __SCRATCH[o] = null; }
+
+
+/* note: returns false if the value is 'f' or 'F' ... */
+function isTrue(d) {
+       if(     d && 
+                       d != "0" && 
+                       d != "f" &&
+                       d != "F" )
+                       return true;
+       return false;
+}
+
+/* Utility function for iterating over array */
+function iterate( arr, callback ) {
+       for( var i = 0; i < arr.length; i++ ) 
+               callback(arr[i]);
+}
+
+
+/**
+  * returns a list of items that when passed to the callback 
+  * 'func' returned true returns null if none were found
+  */
+function grep( arr, func ) {
+       var results = [];
+       iterate( arr, 
+               function(d) {
+                       if( func(d) ) 
+                               results.push(d);
+               }
+       );
+       if(results.length > 0)  
+               return results;
+       return null;
+}
+
+
+
+function flattenGroupTree(node) {
+       if(!node) return null;
+       groupList[node.name] = node;
+       groupIDList[node.id] = node;
+       iterate( node.children,
+               function(n) {
+                       flattenGroupTree(n);
+               }
+       );
+}
+
+
+
+/**
+  * Returns true if 'child' is equal or descends from 'parent'
+  * @param parent The name of the parent group
+  * @param child The name of the child group
+  */
+function isGroupDescendant( parent, child ) {
+       log_debug("checking descendant p="+parent + " c=" + child);
+       return __isGroupDescendant(
+               groupList[parent],
+               groupList[child]);
+}
+
+function isGroupDescendantId( parentName, childId ) {
+       log_debug("checking descendant ID p="+parentName + " c=" + childId);
+       return __isGroupDescendant(
+               groupList[parentName],
+               groupIDList[childId]);
+}
+
+
+/**
+  * Returns true if 'child' is equal or descends from 'parent'
+  * @param parent The node of the parent group
+  * @param child The node of the child group
+  */
+function __isGroupDescendant( parent, child ) {
+    if(!(parent && child)) return false;
+       if (parent.id == child.id) return true;
+       var node = child;
+       while( (node = groupIDList[node.parent]) ) {
+               if( node.id == parent.id ) 
+                       return true;
+       }
+       return false;
+}
+
+
+function getMARCItemType() {
+       if(     copy &&
+                       copy.circ_as_type &&
+                       copy.circ_as_type != 'undef' )
+               return copy.circ_as_type;
+       
+       return (marcXMLDoc) ? extractFixedField(marcXMLDoc, 'Type') : "";
+}
+
+
+function isOrgDescendent( parentName, childId ) {
+       var key = scratchKey();
+       __OILS_FUNC_isOrgDescendent(scratchPad(key), parentName, childId);
+       var val = getScratch(key);
+       if( val == '1' ) return true;
+       return false;
+}
+
+/* returns the number of unfulfilled holds open on this user */
+function userHoldCount(userid) {
+   var key = scratchKey();
+   __OILS_FUNC_userHoldCount(scratchPad(key), userid);
+   return getScratch(key);
+}
+
+function hasCommonAncestor( org1, org2, depth ) {
+       var key = scratchKey();
+       __OILS_FUNC_hasCommonAncestor(scratchPad(key), org1, org2, depth);
+       var val = getScratch(key);
+       if( val == '1' ) return true;
+       return false;
+}
+
+/* returns a dictionary of circmod : count for checked out items */
+function checkoutsByCircModifier(userid) {
+    var key = scratchKey();
+    __OILS_FUNC_userCircsByCircmod(scratchPad(key), userid);
+    var val = getScratch(key);
+    return (val) ? val : {};
+}
+
+
+/* useful for testing */
+function die(msg) {
+       log_error("die(): "+msg);
+       log_stderr("die(): "+msg);
+       var foo = null;
+       var baz = foo.bar;
+}
+
+
+
+/* logs a load of info */
+function log_vars( prefix ) {
+       var str = prefix + ' : ';
+
+       if(patron) {
+               str += ' Patron=' + patron.id;
+               str += ', Patron_Username='+ patron.usrname;
+               str += ', Patron_Profile_Group='+ patronProfile;
+               str += ', Patron_Fines='        + patronFines;
+               str += ', Patron_OverdueCount=' + patronOverdueCount;
+               str += ', Patron_Items_Out=' + patronItemsOut;
+
+               try {
+                       str += ', Patron_Barcode='      + patron.card.barcode;
+                       str += ', Patron_Library='      + patron.home_ou.name;
+               } catch(e) {}
+       }
+
+    if(requestor.id != patron.id) 
+        str+= ' Requestor='+requestor.usrname;
+
+       if(copy)        {
+               str += ', Copy=' + copy.id;
+               str += ', Copy_Barcode=' + copy.barcode;
+               str += ', Copy_status=' + copyStatus;
+      str += (copy.circ_modifier) ? ', Circ_Mod=' + copy.circ_modifier : '';
+
+               try {
+                       str += ', Circ_Lib=' + copy.circ_lib.shortname;
+                       str += ', Copy_location=' + copy.location.name;
+               } catch(e) {}
+       }
+
+       if(volume) {
+        str += ', Item_Owning_lib=' + volume.owning_lib;
+        str += ', Volume='     + volume.id;
+    }
+
+       if(title) str += ', Record='    + title.id;
+
+       if(recDescriptor)       {
+               str += ', Record_Descriptor=' + recDescriptor.id;
+               str += ', Item_Type='                   + recDescriptor.item_type;
+               str += ', Item_Form='                   + recDescriptor.item_form;
+               str += ', Item_Lang='                   + recDescriptor.item_lang;
+               str += ', Item_Audience='               + recDescriptor.audience;
+       }
+
+       str += ', Is_Renewal: ' + ( (isTrue(isRenewal)) ? "yes" : "no" );
+       str += ', Is_Precat: '  + ( (isTrue(isPrecat)) ? "yes" : "no" );
+       str += (holdRequestLib) ? ', Hold_request_lib=' + holdRequestLib.shortname : '';
+    str += (holdPickupLib) ? ', Hold_Pickup_Lib=' + holdPickupLib : '';
+
+       log_info(str);
+}
+
+
+
+/**
+  * Returns config information for the requested group.  If 
+  * no config info exists for the requested group, then this
+  * function searches up the tree to find the config info 
+  * for the nearest ancestor
+  * @param The name of the group who's config info to return
+  */
+function findGroupConfig(name) {
+       if(!name) return null;
+       var node = groupList[name];
+       do {
+               if( GROUP_CONFIG[node.name] ) {
+                       debugGroupConfig(name, node.name, GROUP_CONFIG[node.name]);
+                       return GROUP_CONFIG[node.name];
+               }
+       } while( (node = groupIDList[node.parent]) );
+       return null;
+}
+
+
+/** prints out the settings for the given group config **/
+function debugGroupConfig(name, foundName, config) {
+       if(!config) return;
+       var str = "findGroupConfig('"+name+"'): returning config info for '"+ foundName +"': ";
+       for( var i in config ) 
+               str += i + '=' + config[i] + '  ';
+       log_debug(str);
+}
+
+
diff --git a/Open-ILS/examples/pines-examples/pines-circ/circ_permit_copy.js.example b/Open-ILS/examples/pines-examples/pines-circ/circ_permit_copy.js.example
new file mode 100755 (executable)
index 0000000..5475198
--- /dev/null
@@ -0,0 +1,30 @@
+function go() {
+
+/* load the lib script */
+load_lib('circ/circ_lib.js');
+log_vars('circ_permit_copy');
+
+
+if( ! isTrue(copy.circulate) || !isTrue(copy.location.circulate) ) 
+       result.events.push('COPY_CIRC_NOT_ALLOWED');
+
+
+if( ! isOrgDescendent( 'STATELIB', copy.circ_lib.id ) ) {
+       if( isTrue(copy.ref) ) 
+               result.events.push('COPY_IS_REFERENCE');
+}
+
+
+
+if( ! isTrue(isRenewal) ) {
+       if(copyStatus != 'Available' && 
+               copyStatus != 'On holds shelf' && copyStatus != 'Reshelving' ) {
+                       result.events.push('COPY_NOT_AVAILABLE');
+       } 
+}
+
+
+       
+} go();
+
+
diff --git a/Open-ILS/examples/pines-examples/pines-circ/circ_permit_hold.js.example b/Open-ILS/examples/pines-examples/pines-circ/circ_permit_hold.js.example
new file mode 100755 (executable)
index 0000000..734c5f2
--- /dev/null
@@ -0,0 +1,141 @@
+function go() {
+
+load_lib('circ/circ_lib.js');
+log_vars('circ_permit_hold');
+
+
+/* is a staff member placing this hold? */
+var isStaffHold = isGroupDescendantId('Staff', requestor.profile);
+
+
+/* non-staff members are allowed 50 open holds at most */
+if( ! isStaffHold ) {
+    if(newHold) {
+        var count = userHoldCount(patron.id);
+        log_info("patron has " + count + " open holds");
+        if( count >= 50 ) 
+            result.events.push('MAX_HOLDS');
+    }
+} else {
+    log_info("This is a staff-placed hold");
+}
+
+
+
+if( isTrue(patron.barred) ) 
+       result.events.push('PATRON_BARRED');
+
+if( isTrue(copy.ref) ) 
+       result.events.push('ITEM_NOT_HOLDABLE');
+
+if( !isTrue(copy.circulate) ) 
+       result.events.push('ITEM_NOT_HOLDABLE');
+
+/* all STATELIB items are holdable regardless of type */
+if( isOrgDescendent('STATELIB', copy.circ_lib.id) ) return;
+
+
+var mod = (copy.circ_modifier) ? copy.circ_modifier.toLowerCase() : "";
+var marcItemType = getMARCItemType();
+
+
+log_info("circ-modifier = "+mod);
+log_info("marc-type = "+marcItemType);
+
+
+if(mod == 'bestsellernh' || mod == 'eventpass')
+       result.events.push('ITEM_NOT_HOLDABLE');
+
+
+if( ( marcItemType == 'g' || 
+               marcItemType == 'i' || 
+               marcItemType == 'j' || 
+               mod == 'softwrlong' || 
+               mod == 'music' || 
+               mod == 'audiobook' || 
+               mod == 'av' || 
+               mod == 'new-av' || 
+               mod == 'cd' || 
+               mod == 'kit' || 
+               mod == 'dvd' || 
+               mod == 'deposit' || 
+               mod == 'atlas' || 
+               mod == 'magazine' || 
+               mod == 'equipment' || 
+               mod == 'equip-long' || 
+               mod == 'microform' || 
+               mod == 'record' || 
+               isTrue(copy.deposit) || 
+               mod == 'videogame' ||
+        mod == 'videogamelong' ||
+        mod == 'video-long' || 
+               mod == 'video' ) ) {
+
+
+       log_info("this is a range-protected item...");
+
+       /* ------------------------------------------------------------------------ */
+       /** This patch allows DCPL and LEE patrons to place 
+               holds on protected items accross their systems.  In short, if the pickup lib,
+               owning lib, and patron home (or request lib) are all within either of the two 
+               systems, allow the hold */
+       if(
+               /* DCPL=33, LEE=115 */
+               (hasCommonAncestor(holdPickupLib, 33, 1) || hasCommonAncestor(holdPickupLib, 115, 1)) &&
+               (hasCommonAncestor(volume.owning_lib, 33, 1) || hasCommonAncestor(volume.owning_lib, 115, 1)) &&
+               (
+                       hasCommonAncestor(patron.home_ou.id, 33, 1) || hasCommonAncestor(patron.home_ou.id, 115, 1) || 
+                       hasCommonAncestor(holdRequestLib.id, 33, 1) || hasCommonAncestor(holdRequestLib.id, 115, 1)
+               )) {
+
+               log_info("DCPL and LEE are allowed to place holds on protected items accross the two systems");
+               return;
+       }
+       /* ------------------------------------------------------------------------ */
+
+       /* ------------------------------------------------------------------------ */
+       /** VT696 SRL-DOUG going local request 2008-12-08 through 2009-01-31.**/
+    /* SRL-DOUG=135 */
+    //if( copy.circ_lib == 135  &&  holdPickupLib != '135' ) {
+    //    results.events.push('ITEM_NOT_HOLDABLE');
+    //    log_info("SRL-DOUG items must be picked up from SRL-DOUG for the time being");
+       //}
+       /* ------------------------------------------------------------------------ */
+
+    if( ! hasCommonAncestor( volume.owning_lib, holdPickupLib, 1 ) ) {
+
+        /* we don't want these items to transit to the pickup lib */
+        result.events.push('ITEM_NOT_HOLDABLE');
+           log_info("pickup_lib is not in the owning_lib's region...NOT OK");
+
+    } else { /* pickup lib is in the owning region */
+
+        if( isStaffHold && hasCommonAncestor( volume.owning_lib, holdRequestLib.id, 1) ) {
+
+            /* staff in the region can place holds for patrons outside the region with local pickup lib */
+            log_info("local, staff-placed hold is allowed with local pickup_lib...OK");
+
+        } else {
+
+            if( hasCommonAncestor( volume.owning_lib, patron.home_ou.id, 1 ) ) {
+
+                /* patrons can hold the item if they are registered 
+                    in the region and pickup lib is local */  
+                log_info("patron's home_ou is in the owning region...OK");
+
+            } else {
+
+                log_info("patron's home_ou lies outside the owning region...NOT OK");
+                result.events.push('ITEM_NOT_HOLDABLE');
+            }
+        }
+    }
+}
+
+
+
+
+} go();
+
+
+
diff --git a/Open-ILS/examples/pines-examples/pines-circ/circ_permit_patron.js.example b/Open-ILS/examples/pines-examples/pines-circ/circ_permit_patron.js.example
new file mode 100755 (executable)
index 0000000..8b8cd43
--- /dev/null
@@ -0,0 +1,36 @@
+function go() {
+
+/* load the script library */
+load_lib('circ/circ_lib.js');
+log_vars('circ_permit_patron');
+
+
+
+if( isTrue(patron.barred) ) 
+       result.events.push('PATRON_BARRED');
+
+
+/* ---------------------------------------------------------------------
+       Check the items out count 
+       --------------------------------------------------------------------- */
+var config = findGroupConfig(patronProfile);
+if( config ) {
+       
+       var limit = config.maxItemsOut;
+       if( limit >= 0 ) {
+               /* Patrons are allowed to renew regardless 
+                       of how many items they have checked out */
+               log_info('patron items out = ' + patronItemsOut +' limit = ' + limit);
+               if( !isTrue(isRenewal) && patronItemsOut >= limit ) {
+                               result.events.push('PATRON_EXCEEDS_CHECKOUT_COUNT');
+               }
+       }
+
+} else {
+       log_warn("** profile has no configured information: " + patronProfile);
+}
+
+
+} go();
+
+
diff --git a/Open-ILS/examples/pines-examples/pines-circ/circ_permit_renew.js.example b/Open-ILS/examples/pines-examples/pines-circ/circ_permit_renew.js.example
new file mode 100755 (executable)
index 0000000..f05607b
--- /dev/null
@@ -0,0 +1,20 @@
+function go() {
+
+/* load the lib script */
+load_lib('circ/circ_lib.js');
+log_vars('circ_permit_renew');
+
+log_info("permit_renew searching for potential holds for copy " + copy.barcode)
+var hold = copy.fetchBestHold();
+if( hold ) {
+       log_info("hold found for renewal item, checking hold->usr..");
+    log_info("hold = " + hold + "  hold.usr = " + hold.usr + "   patron.id = " + patron.id);
+       if( hold.usr != patron.id ) {
+        log_info("## Before the push.");
+               result.events.push('COPY_NEEDED_FOR_HOLD');
+        log_info("## After the push.");
+    }
+}
+
+
+} go();
diff --git a/Open-ILS/examples/pines-examples/pines-survey-down.sh b/Open-ILS/examples/pines-examples/pines-survey-down.sh
new file mode 100755 (executable)
index 0000000..b3c72f4
--- /dev/null
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+cd /openils/var/web/opac/skin/default/xml/home/
+rm homesearch.xml
+mv homesearch.xml.orig homesearch.xml
+
diff --git a/Open-ILS/examples/pines-examples/pines-survey-up.sh b/Open-ILS/examples/pines-examples/pines-survey-up.sh
new file mode 100755 (executable)
index 0000000..f64ac26
--- /dev/null
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+cd /openils/var/web/opac/skin/default/xml/home/
+mv homesearch.xml homesearch.xml.orig
+cp homesearch.xml.survey homesearch.xml
diff --git a/Open-ILS/examples/pines-examples/pines-zips.txt.example b/Open-ILS/examples/pines-examples/pines-zips.txt.example
new file mode 100644 (file)
index 0000000..cf28d8c
--- /dev/null
@@ -0,0 +1,1504 @@
+26266|GA|AVONDALE ESTATES|30002|1|13|DEKALB|404
+26267|GA|AVONDALE EST|30002|0|13||
+26268|GA|NORCROSS|30003|1|13|GWINNETT|770
+26269|GA|ALPHARETTA|30004|1|13|FULTON|404/770
+26270|GA|ALPHARETTA|30005|1|13|FULTON|678
+26271|GA|MARIETTA|30006|1|13|COBB|770
+26272|GA|MARIETTA|30007|1|13|COBB|770
+26273|GA|MARIETTA|30008|1|13|COBB|678/770
+26274|GA|ALPHARETTA|30009|1|13|FULTON|404/770
+26275|GA|NORCROSS|30010|1|13|GWINNETT|770
+26276|GA|AUBURN|30011|1|13|BARROW|770
+26277|GA|CONYERS|30012|1|13|ROCKDALE|678/770
+26278|GA|CONYERS|30013|1|13|ROCKDALE|678/770
+26279|GA|COVINGTON|30014|1|13|NEWTON|678/770
+26280|GA|COVINGTON|30015|1|13|NEWTON|770
+26281|GA|COVINGTON|30016|1|13|NEWTON|678/770
+26282|GA|GRAYSON|30017|1|13|GWINNETT|770
+26283|GA|JERSEY|30018|1|13|WALTON|770
+26284|GA|DACULA|30019|1|13|GWINNETT|770
+26285|GA|CLARKSTON|30021|1|13|DEKALB|404
+26286|GA|ALPHARETTA|30022|1|13|FULTON|404/770
+26287|GA|ALPHARETTA|30023|1|13|FULTON|404/770
+26288|GA|SUWANEE|30024|1|13|GWINNETT|770
+26289|GA|SOCIAL CIRCLE|30025|1|13|WALTON|678/770
+26290|GA|NORTH METRO|30026|1|13|GWINNETT|770
+26291|GA|DULUTH|30026|0|13||
+26292|GA|CUMMING|30028|1|13|FORSYTH|770
+26293|GA|NORTH METRO|30029|1|13|GWINNETT|770
+26294|GA|DULUTH|30029|0|13||
+26295|GA|DECATUR|30030|1|13|DEKALB|404
+26296|GA|DECATUR|30031|1|13|DEKALB|404
+26297|GA|DECATUR|30032|1|13|DEKALB|404
+26298|GA|BELVEDERE|30032|0|13||
+26299|GA|DUNAIRE|30032|0|13||
+26300|GA|DECATUR|30033|1|13|DEKALB|404
+26301|GA|NORTH DECATUR|30033|0|13||
+26302|GA|VISTA GROVE|30033|0|13||
+26303|GA|DECATUR|30034|1|13|DEKALB|404
+26304|GA|DECATUR|30035|1|13|DEKALB|404
+26305|GA|SNAPFINGER|30035|0|13||
+26306|GA|DECATUR|30036|1|13|DEKALB|404
+26307|GA|DECATUR|30037|1|13|DEKALB|404
+26308|GA|LITHONIA|30038|1|13|DEKALB|678/770
+26309|GA|SNELLVILLE|30039|1|13|GWINNETT|678/770
+26310|GA|CENTERVILLE BRANCH|30039|0|13||
+26311|GA|CUMMING|30040|1|13|FORSYTH|678/770
+26312|GA|CUMMING|30041|1|13|FORSYTH|678/770
+26313|GA|LAWRENCEVILLE|30042|1|13|GWINNETT|770
+26314|GA|LAWRENCEVILLE|30043|1|13|GWINNETT|678/770
+26315|GA|LAWRENCEVILLE|30044|1|13|GWINNETT|678/770
+26316|GA|LAWRENCEVILLE|30045|1|13|GWINNETT|678/770
+26317|GA|LAWRENCEVILLE|30046|1|13|GWINNETT|770
+26318|GA|LILBURN|30047|1|13|GWINNETT|678/770
+26319|GA|LILBURN|30048|1|13|GWINNETT|678
+26320|GA|LAWRENCEVILLE|30049|1|13|GWINNETT|770
+26321|GA|LOGANVILLE|30052|1|13|WALTON|770
+26322|GA|OXFORD|30054|1|13|NEWTON|770
+26323|GA|MANSFIELD|30055|1|13|JASPER|770
+26324|GA|NEWBORN|30056|1|13|NEWTON|770
+26325|GA|LITHONIA|30058|1|13|DEKALB|678/770
+26326|GA|MARIETTA|30060|1|13|COBB|678/770
+26327|GA|ATLANTA NAVAL AIR STATION|30060|0|13||
+26328|GA|DOBBINS A F B|30060|0|13||
+26329|GA|DOBBINS AIR FORCE BASE|30060|0|13||
+26330|GA|MARIETTA|30061|1|13|COBB|770
+26331|GA|MARIETTA|30062|1|13|COBB|678/770
+26332|GA|MARIETTA|30063|1|13|COBB|770
+26333|GA|LOCKHEED|30063|0|13||
+26334|GA|MARIETTA|30064|1|13|COBB|678/770
+26335|GA|MARIETTA|30065|1|13|COBB|770
+26336|GA|MAR|30065|0|13||
+26337|GA|MRETA|30065|0|13||
+26338|GA|MARIETTA|30066|1|13|COBB|678/770
+26339|GA|MARIETTA|30067|1|13|COBB|678/770
+26340|GA|MARIETTA|30068|1|13|COBB|678/770
+26341|GA|MARIETTA|30069|1|13|COBB|770
+26342|GA|DOBBINS AFB|30069|0|13||
+26343|GA|DOBBINS AIR FORCE BASE|30069|0|13||
+26344|GA|PORTERDALE|30070|1|13|NEWTON|770
+26345|GA|NORCROSS|30071|1|13|GWINNETT|770
+26346|GA|PINE LAKE|30072|1|13|DEKALB|404
+26347|GA|REDAN|30074|1|13|DEKALB|770
+26348|GA|ROSWELL|30075|1|13|FULTON|770
+26349|GA|SANDY PLAINS|30075|0|13||
+26350|GA|ROSWELL|30076|1|13|FULTON|770
+26351|GA|ROSWELL|30077|1|13|FULTON|770
+26352|GA|SNELLVILLE|30078|1|13|GWINNETT|678/770
+26353|GA|SCOTTDALE|30079|1|13|DEKALB|404/678
+26354|GA|SMYRNA|30080|1|13|COBB|770
+26355|GA|SMYRNA|30081|1|13|COBB|770
+26356|GA|SMYRNA|30082|1|13|COBB|770
+26357|GA|STONE MOUNTAIN|30083|1|13|DEKALB|678/770
+26358|GA|MEMORIAL SQUARE|30083|0|13||
+26359|GA|ST MOUNTAIN|30083|0|13||
+26360|GA|ST MTN|30083|0|13||
+26361|GA|STONE MTN|30083|0|13||
+26362|GA|TUCKER|30084|1|13|DEKALB|770
+26363|GA|TUCKER|30085|1|13|DEKALB|770
+26364|GA|STONE MOUNTAIN|30086|1|13|DEKALB|770
+26365|GA|ST MOUNTAIN|30086|0|13||
+26366|GA|STONE MTN|30086|0|13||
+26367|GA|STONE MOUNTAIN|30087|1|13|DEKALB|678/770
+26368|GA|STONE MTN|30087|0|13||
+26369|GA|STONE MOUNTAIN|30088|1|13|DEKALB|404/678
+26370|GA|STONE MTN|30088|0|13||
+26371|GA|MARIETTA|30090|1|13|COBB|770
+26372|GA|NORCROSS|30091|1|13|GWINNETT|770
+26373|GA|NORCROSS|30092|1|13|GWINNETT|678/770
+26374|GA|BERKELEY LAKE|30092|0|13||
+26375|GA|PARKWAY|30092|0|13||
+26376|GA|PEACHTREE CORNERS|30092|0|13||
+26377|GA|NORCROSS|30093|1|13|GWINNETT|678/770
+26378|GA|ROCKBRIDGE|30093|0|13||
+26379|GA|CONYERS|30094|1|13|ROCKDALE|678/770
+26380|GA|DULUTH|30095|1|13|GWINNETT|770
+26381|GA|DULUTH|30096|1|13|GWINNETT|678/770
+26382|GA|BERKELEY LAKE|30096|0|13||
+26383|GA|DULUTH|30097|1|13|FULTON|678/770
+26384|GA|DULUTH|30098|1|13|GWINNETT|770
+26385|GA|STATE FARM INSURANCE CO|30098|0|13||
+26386|GA|DULUTH|30099|1|13|GWINNETT|770
+26387|GA|PRIMERICA FINANCIAL SERVICES|30099|0|13||
+26388|GA|ACWORTH|30101|1|13|COBB|678/770
+26389|GA|OAK GROVE|30101|0|13||
+26390|GA|ACWORTH|30102|1|13|CHEROKEE|678/770
+26391|GA|ADAIRSVILLE|30103|1|13|BARTOW|678/770
+26392|GA|ARAGON|30104|1|13|POLK|770
+26393|GA|ARMUCHEE|30105|1|13|FLOYD|706
+26394|GA|AUSTELL|30106|1|13|COBB|678/770
+26395|GA|BALL GROUND|30107|1|13|CHEROKEE|770
+26396|GA|BOWDON|30108|1|13|CARROLL|678/770
+26397|GA|BOWDON JUNCTION|30109|1|13|CARROLL|770
+26398|GA|BOWDON JCT|30109|0|13||
+26399|GA|BREMEN|30110|1|13|HARALSON|678/770
+26400|GA|CLARKDALE|30111|1|13|COBB|770
+26401|GA|CARROLLTON|30112|1|13|CARROLL|770
+26402|GA|BUCHANAN|30113|1|13|HARALSON|678/770
+26403|GA|CANTON|30114|1|13|CHEROKEE|678/770
+26404|GA|CANTON|30115|1|13|CHEROKEE|678/770
+26405|GA|CARROLLTON|30116|1|13|CARROLL|678/770
+26406|GA|CARROLLTON|30117|1|13|CARROLL|678/770
+26407|GA|WEST GEORGIA COLLEGE|30117|0|13||
+26408|GA|CARROLLTON|30118|1|13|CARROLL|770
+26409|GA|WEST GEORGIA COLLEGE|30118|0|13||
+26410|GA|CARROLLTON|30119|1|13|CARROLL|770
+26411|GA|SOUTHWIRE|30119|0|13||
+26412|GA|CARTERSVILLE|30120|1|13|BARTOW|678/770
+26413|GA|EUHARLEE|30120|0|13||
+26414|GA|NORTH CORNERS|30120|0|13||
+26415|GA|CARTERSVILLE|30121|1|13|BARTOW|678/770
+26416|GA|LITHIA SPRINGS|30122|1|13|DOUGLAS|770
+26417|GA|CASSVILLE|30123|1|13|BARTOW|770
+26418|GA|CAVE SPRING|30124|1|13|FLOYD|706
+26419|GA|CEDARTOWN|30125|1|13|POLK|678/770
+26420|GA|MABLETON|30126|1|13|COBB|770
+26421|GA|POWDER SPRINGS|30127|1|13|COBB|678/770
+26422|GA|COOSA|30129|1|13|FLOYD|706
+26423|GA|DALLAS|30132|1|13|PAULDING|678/770
+26424|GA|DOUGLASVILLE|30133|1|13|DOUGLAS|770
+26425|GA|DOUGLASVILLE|30134|1|13|DOUGLAS|678/770
+26426|GA|DOUGLASVILLE|30135|1|13|DOUGLAS|678/770
+26427|GA|EMERSON|30137|1|13|BARTOW|770
+26428|GA|ESOM HILL|30138|1|13|POLK|770
+26429|GA|FAIRMOUNT|30139|1|13|GORDON|706/770
+26430|GA|FELTON|30140|1|13|HARALSON|770
+26431|GA|HIRAM|30141|1|13|PAULDING|770
+26432|GA|HOLLY SPRINGS|30142|1|13|CHEROKEE|770
+26433|GA|JASPER|30143|1|13|PICKENS|706
+26434|GA|BIG CANOE|30143|0|13||
+26435|GA|KENNESAW|30144|1|13|COBB|770
+26436|GA|BARRETT PARKWAY|30144|0|13||
+26437|GA|KINGSTON|30145|1|13|BARTOW|678/770
+26438|GA|EUHARLEE|30145|0|13||
+26439|GA|LEBANON|30146|1|13|CHEROKEE|770
+26440|GA|LINDALE|30147|1|13|FLOYD|706
+26441|GA|MARBLE HILL|30148|1|13|PICKENS|770
+26442|GA|MARBLEHILL|30148|0|13||
+26443|GA|MOUNT BERRY|30149|1|13|FLOYD|706
+26444|GA|ROME|30149|0|13||
+26445|GA|MOUNT ZION|30150|1|13|CARROLL|770
+26446|GA|NELSON|30151|1|13|CHEROKEE|770
+26447|GA|KENNESAW|30152|1|13|COBB|770
+26448|GA|ROCKMART|30153|1|13|POLK|678/770
+26449|GA|DOUGLASVILLE|30154|1|13|DOUGLAS|770
+26450|GA|KENNESAW|30156|1|13|COBB|770
+26451|GA|DALLAS|30157|1|13|PAULDING|678/770
+26452|GA|KENNESAW|30160|1|13|COBB|770
+26453|GA|ROME|30161|1|13|FLOYD|706
+26454|GA|ROME|30162|1|13|FLOYD|706
+26455|GA|ROME|30163|1|13|FLOYD|706
+26456|GA|ROME|30164|1|13|FLOYD|706
+26457|GA|ROME|30165|1|13|FLOYD|706
+26458|GA|AUSTELL|30168|1|13|COBB|678/770
+26459|GA|CANTON|30169|1|13|CHEROKEE|770
+26460|GA|ROOPVILLE|30170|1|13|CARROLL|678/770
+26461|GA|EPHESUS|30170|0|13||
+26462|GA|RYDAL|30171|1|13|BARTOW|770
+26463|GA|SHANNON|30172|1|13|FLOYD|706
+26464|GA|SILVER CREEK|30173|1|13|FLOYD|706
+26465|GA|TALKING ROCK|30175|1|13|PICKENS|706
+26466|GA|TALLAPOOSA|30176|1|13|HARALSON|678/770
+26467|GA|TATE|30177|1|13|PICKENS|770
+26468|GA|TAYLORSVILLE|30178|1|13|BARTOW|770
+26469|GA|TEMPLE|30179|1|13|CARROLL|678/770
+26470|GA|VILLA RICA|30180|1|13|CARROLL|678/770
+26471|GA|WACO|30182|1|13|HARALSON|770
+26472|GA|WALESKA|30183|1|13|CHEROKEE|770
+26473|GA|LAKE ARROWHEAD|30183|0|13||
+26474|GA|WHITE|30184|1|13|BARTOW|770
+26475|GA|WHITESBURG|30185|1|13|CARROLL|770
+26476|GA|WINSTON|30187|1|13|DOUGLAS|770
+26477|GA|WOODSTOCK|30188|1|13|CHEROKEE|678/770
+26478|GA|WOODSTOCK|30189|1|13|CHEROKEE|678/770
+26479|GA|BARNESVILLE|30204|1|13|LAMAR|678/770
+26480|GA|BROOKS|30205|1|13|FAYETTE|770
+26481|GA|CONCORD|30206|1|13|PIKE|770
+26482|GA|EXPERIMENT|30212|1|13|SPALDING|770
+26483|GA|FAIRBURN|30213|1|13|FULTON|770
+26484|GA|FAYETTEVILLE|30214|1|13|FAYETTE|678/770
+26485|GA|WOOLSEY|30214|0|13||
+26486|GA|FAYETTEVILLE|30215|1|13|FAYETTE|678/770
+26487|GA|FLOVILLA|30216|1|13|BUTTS|770
+26488|GA|INDIAN SPRINGS|30216|0|13||
+26489|GA|FRANKLIN|30217|1|13|HEARD|706
+26490|GA|GAY|30218|1|13|MERIWETHER|706
+26491|GA|GLENN|30219|1|13|HEARD|706
+26492|GA|GRANTVILLE|30220|1|13|COWETA|678/770
+26493|GA|GREENVILLE|30222|1|13|MERIWETHER|706
+26494|GA|STOVALL|30222|0|13||
+26495|GA|GRIFFIN|30223|1|13|SPALDING|678/770
+26496|GA|GRIFFIN|30224|1|13|SPALDING|770
+26497|GA|HAMPTON|30228|1|13|HENRY|770
+26498|GA|HARALSON|30229|1|13|COWETA|770
+26499|GA|HOGANSVILLE|30230|1|13|TROUP|706
+26500|GA|JACKSON|30233|1|13|BUTTS|678/770
+26501|GA|JENKINSBURG|30234|1|13|BUTTS|770
+26502|GA|JONESBORO|30236|1|13|CLAYTON|678/770
+26503|GA|JONESBORO|30237|1|13|CLAYTON|678
+26504|GA|JONESBORO|30238|1|13|CLAYTON|678/770
+26505|GA|LAGRANGE|30240|1|13|TROUP|706
+26506|GA|LAGRANGE|30241|1|13|TROUP|706
+26507|GA|LOCUST GROVE|30248|1|13|HENRY|770
+26508|GA|LOVEJOY|30250|1|13|CLAYTON|770
+26509|GA|LUTHERSVILLE|30251|1|13|MERIWETHER|678/770
+26510|GA|MCDONOUGH|30252|1|13|HENRY|678/770
+26511|GA|MCDONOUGH|30253|1|13|HENRY|678/770
+26512|GA|MC DONOUGH|30253|0|13||
+26513|GA|MEANSVILLE|30256|1|13|PIKE|770
+26514|GA|MILNER|30257|1|13|LAMAR|770
+26515|GA|MOLENA|30258|1|13|PIKE|770
+26516|GA|MORELAND|30259|1|13|COWETA|770
+26517|GA|MORROW|30260|1|13|CLAYTON|770
+26518|GA|LAKE CITY|30260|0|13||
+26519|GA|LAGRANGE|30261|1|13|TROUP|706
+26520|GA|MOUNTVILLE|30261|0|13||
+26521|GA|NEWNAN|30263|1|13|COWETA|678/770
+26522|GA|RAYMOND|30263|0|13||
+26523|GA|NEWNAN|30264|1|13|COWETA|678/770
+26524|GA|NEWNAN|30265|1|13|COWETA|678/770
+26525|GA|SHENANDOAH|30265|0|13||
+26526|GA|ORCHARD HILL|30266|1|13|SPALDING|770
+26527|GA|PALMETTO|30268|1|13|FULTON|770
+26528|GA|PEACHTREE CITY|30269|1|13|FAYETTE|770
+26529|GA|PEACHTREE CITY|30270|1|13|FAYETTE|770
+26530|GA|FAYETTEVILLE|30270|0|13||
+26531|GA|PEACHTREE CITY PARCEL RETURN|30270|0|13||
+26532|GA|NEWNAN|30271|1|13|COWETA|770
+26533|GA|RED OAK|30272|1|13|FULTON|404
+26534|GA|REX|30273|1|13|CLAYTON|770
+26535|GA|RIVERDALE|30274|1|13|CLAYTON|770
+26536|GA|SARGENT|30275|1|13|COWETA|770
+26537|GA|SENOIA|30276|1|13|COWETA|678/770
+26538|GA|SHARPSBURG|30277|1|13|COWETA|770
+26539|GA|STOCKBRIDGE|30281|1|13|HENRY|678/770
+26540|GA|SUNNY SIDE|30284|1|13|SPALDING|770
+26541|GA|THE ROCK|30285|1|13|UPSON|706
+26542|GA|THOMASTON|30286|1|13|UPSON|706
+26543|GA|MORROW|30287|1|13|CLAYTON|770
+26544|GA|CONLEY|30288|1|13|CLAYTON|404
+26545|GA|TURIN|30289|1|13|COWETA|770
+26546|GA|TYRONE|30290|1|13|FAYETTE|770
+26547|GA|UNION CITY|30291|1|13|FULTON|770
+26548|GA|WILLIAMSON|30292|1|13|PIKE|770
+26549|GA|WOODBURY|30293|1|13|MERIWETHER|706
+26550|GA|ELLENWOOD|30294|1|13|DEKALB|770
+26551|GA|ZEBULON|30295|1|13|PIKE|678/770
+26552|GA|RIVERDALE|30296|1|13|CLAYTON|770
+26553|GA|CHURCH STREET|30296|0|13||
+26554|GA|FOREST PARK|30297|1|13|CLAYTON|404
+26555|GA|FORT GILLEM|30297|0|13||
+26556|GA|FOREST PARK|30298|1|13|CLAYTON|404
+26557|GA|FOREST|30298|0|13||
+26558|GA|ATLANTA|30301|1|13|FULTON|404/678
+26559|GA|ATL|30301|0|13||
+26560|GA|ATLANTA|30302|1|13|FULTON|404/770
+26561|GA|ATL|30302|0|13||
+26562|GA|ATLANTA|30303|1|13|FULTON|404/678
+26563|GA|ATL|30303|0|13||
+26564|GA|GEORGIA STATE UNIVERSITY|30303|0|13||
+26565|GA|ATLANTA|30304|1|13|FULTON|404/770
+26566|GA|ATL|30304|0|13||
+26567|GA|ATLANTA|30305|1|13|FULTON|404/678
+26568|GA|ATL|30305|0|13||
+26569|GA|ATLANTA|30306|1|13|FULTON|404/678
+26570|GA|ATL|30306|0|13||
+26571|GA|NORTH HIGHLAND FINANCE|30306|0|13||
+26572|GA|ATLANTA|30307|1|13|FULTON|404/678
+26573|GA|ATL|30307|0|13||
+26574|GA|LITTLE FIVE POINTS PSTL STR|30307|0|13||
+26575|GA|ATLANTA|30308|1|13|FULTON|404/678
+26576|GA|ATL|30308|0|13||
+26577|GA|ATLANTA|30309|1|13|FULTON|404/678
+26578|GA|ATL|30309|0|13||
+26579|GA|ATLANTA|30310|1|13|FULTON|404/678
+26580|GA|ATL|30310|0|13||
+26581|GA|FORT MCPHERSON|30310|0|13||
+26582|GA|ATLANTA|30311|1|13|FULTON|404/678
+26583|GA|ATL|30311|0|13||
+26584|GA|ATLANTA|30312|1|13|FULTON|404/678
+26585|GA|ATL|30312|0|13||
+26586|GA|ATLANTA|30313|1|13|FULTON|404/678
+26587|GA|ATL|30313|0|13||
+26588|GA|ATLANTA|30314|1|13|FULTON|404/678
+26589|GA|ATL|30314|0|13||
+26590|GA|ATLANTA|30315|1|13|FULTON|404/678
+26591|GA|ATL|30315|0|13||
+26592|GA|ATLANTA|30316|1|13|FULTON|404/678
+26593|GA|ATL|30316|0|13||
+26594|GA|ATLANTA|30317|1|13|DEKALB|404/770
+26595|GA|ATL|30317|0|13||
+26596|GA|ATLANTA|30318|1|13|FULTON|404/678
+26597|GA|ATL|30318|0|13||
+26598|GA|ATLANTA|30319|1|13|DEKALB|404/678
+26599|GA|ATL|30319|0|13||
+26600|GA|NORTH ATLANTA|30319|0|13||
+26601|GA|ATLANTA|30320|1|13|FULTON|404
+26602|GA|AIRPORT MAIL CENTER|30320|0|13||
+26603|GA|ATL|30320|0|13||
+26604|GA|ATLANTA|30321|1|13|FULTON|404
+26605|GA|ATL|30321|0|13||
+26606|GA|ATLANTA|30322|1|13|DEKALB|404
+26607|GA|ATL|30322|0|13||
+26608|GA|EMORY UNIVERSITY|30322|0|13||
+26609|GA|ATLANTA|30324|1|13|FULTON|404/678
+26610|GA|ATL|30324|0|13||
+26611|GA|ATLANTA|30325|1|13|FULTON|770
+26612|GA|ATL|30325|0|13||
+26613|GA|ATLANTA|30326|1|13|FULTON|404/678
+26614|GA|ATL|30326|0|13||
+26615|GA|ATLANTA|30327|1|13|FULTON|404/678
+26616|GA|ATL|30327|0|13||
+26617|GA|ATLANTA|30328|1|13|FULTON|404/678
+26618|GA|ATL|30328|0|13||
+26619|GA|SANDY SPRINGS|30328|0|13||
+26620|GA|ATLANTA|30329|1|13|DEKALB|404/678
+26621|GA|ATL|30329|0|13||
+26622|GA|BRIARCLIFF|30329|0|13||
+26623|GA|ATLANTA|30330|1|13|FULTON|404/678
+26624|GA|ATL|30330|0|13||
+26625|GA|FORT MCPHERSON|30330|0|13||
+26626|GA|FT MCPHERSON|30330|0|13||
+26627|GA|ATLANTA|30331|1|13|FULTON|404/770
+26628|GA|ATL|30331|0|13||
+26629|GA|ATLANTA|30332|1|13|FULTON|404
+26630|GA|ATL|30332|0|13||
+26631|GA|ATLANTA|30333|1|13|DEKALB|404/770
+26632|GA|ATL|30333|0|13||
+26633|GA|DRUID HILLS|30333|0|13||
+26634|GA|ATLANTA|30334|1|13|FULTON|404/678
+26635|GA|ATL|30334|0|13||
+26636|GA|ATLANTA|30336|1|13|FULTON|404
+26637|GA|ATL|30336|0|13||
+26638|GA|INDUSTRIAL|30336|0|13||
+26639|GA|ATLANTA|30337|1|13|FULTON|404/678
+26640|GA|ATL|30337|0|13||
+26641|GA|COLLEGE PARK|30337|0|13||
+26642|GA|ATLANTA|30338|1|13|DEKALB|404/678
+26643|GA|ATL|30338|0|13||
+26644|GA|DUNWOODY|30338|0|13||
+26645|GA|NORTH SPRINGS|30338|0|13||
+26646|GA|ATLANTA|30339|1|13|FULTON|404/678
+26647|GA|ATL|30339|0|13||
+26648|GA|CUMBERLAND|30339|0|13||
+26649|GA|OVERLOOK SRU|30339|0|13||
+26650|GA|SMYRNA|30339|0|13||
+26651|GA|VININGS|30339|0|13||
+26652|GA|VINNINGS|30339|0|13||
+26653|GA|ATLANTA|30340|1|13|DEKALB|404/678
+26654|GA|ATL|30340|0|13||
+26655|GA|DORAVILLE|30340|0|13||
+26656|GA|ATLANTA|30341|1|13|DEKALB|404/678
+26657|GA|ATL|30341|0|13||
+26658|GA|CHAMBLEE|30341|0|13||
+26659|GA|ATLANTA|30342|1|13|FULTON|404/678
+26660|GA|ATL|30342|0|13||
+26661|GA|TUXEDO|30342|0|13||
+26662|GA|ATLANTA|30343|1|13|FULTON|404/770
+26663|GA|ATL|30343|0|13||
+26664|GA|ATLANTA|30344|1|13|FULTON|404/678
+26665|GA|ATL|30344|0|13||
+26666|GA|EAST POINT|30344|0|13||
+26667|GA|ATLANTA|30345|1|13|DEKALB|404/678
+26668|GA|ATL|30345|0|13||
+26669|GA|ATLANTA|30346|1|13|DEKALB|404/678
+26670|GA|ATL|30346|0|13||
+26671|GA|ATLANTA|30347|1|13|FULTON|404
+26672|GA|ATL|30347|0|13||
+26673|GA|EXECUTIVE PARK|30347|0|13||
+26674|GA|ATLANTA|30348|1|13|FULTON|404/770
+26675|GA|ATL|30348|0|13||
+26676|GA|ATLANTA|30349|1|13|FULTON|404/678
+26677|GA|ATL|30349|0|13||
+26678|GA|COLLEGE PARK|30349|0|13||
+26679|GA|ATLANTA|30350|1|13|DEKALB|404/678
+26680|GA|ATL|30350|0|13||
+26681|GA|SANDY SPRINGS|30350|0|13||
+26682|GA|ATLANTA|30353|1|13|FULTON|404/770
+26683|GA|ATL|30353|0|13||
+26684|GA|ATLANTA|30354|1|13|FULTON|404/678
+26685|GA|ATL|30354|0|13||
+26686|GA|HAPEVILLE|30354|0|13||
+26687|GA|ATLANTA|30355|1|13|FULTON|404
+26688|GA|ATL|30355|0|13||
+26689|GA|ATLANTA|30356|1|13|DEKALB|404
+26690|GA|ATL|30356|0|13||
+26691|GA|DUNWOODY|30356|0|13||
+26692|GA|ATLANTA|30357|1|13|FULTON|404/770
+26693|GA|ATL|30357|0|13||
+26694|GA|ATLANTA|30358|1|13|FULTON|404/770
+26695|GA|ATL|30358|0|13||
+26696|GA|SANDY SPRINGS|30358|0|13||
+26697|GA|ATLANTA|30359|1|13|DEKALB|404
+26698|GA|ATL|30359|0|13||
+26699|GA|ATLANTA|30360|1|13|DEKALB|678/770
+26700|GA|ATL|30360|0|13||
+26701|GA|DORAVILLE|30360|0|13||
+26702|GA|WINTERS CHAPEL|30360|0|13||
+26703|GA|ATLANTA|30361|1|13|FULTON|404/678
+26704|GA|ATL|30361|0|13||
+26705|GA|ATLANTA|30362|1|13|DEKALB|404/770
+26706|GA|ATL|30362|0|13||
+26707|GA|DORAVILLE|30362|0|13||
+26708|GA|ATLANTA|30363|1|13|FULTON|404
+26709|GA|ATLANTA|30364|1|13|FULTON|404/770
+26710|GA|ATL|30364|0|13||
+26711|GA|EAST POINT|30364|0|13||
+26712|GA|ATLANTA|30366|1|13|DEKALB|404/770
+26713|GA|ATL|30366|0|13||
+26714|GA|CHAMBLEE|30366|0|13||
+26715|GA|ATLANTA|30368|1|13|FULTON|404/770
+26716|GA|ATL|30368|0|13||
+26717|GA|SUNTRUST|30368|0|13||
+26718|GA|ATLANTA|30369|1|13|FULTON|404/678
+26719|GA|ATL|30369|0|13||
+26720|GA|U S P S BULK MAIL CTR|30369|0|13||
+26721|GA|ATLANTA|30370|1|13|FULTON|404/770
+26722|GA|ATL|30370|0|13||
+26723|GA|ATLANTA|30371|1|13|FULTON|404/770
+26724|GA|ATL|30371|0|13||
+26725|GA|ATLANTA|30374|1|13|FULTON|404
+26726|GA|ATL|30374|0|13||
+26727|GA|ATLANTA|30375|1|13|FULTON|404
+26728|GA|ATL|30375|0|13||
+26729|GA|SOUTHERN BELL|30375|0|13||
+26730|GA|ATLANTA|30376|1|13|FULTON|404/770
+26731|GA|ATL|30376|0|13||
+26732|GA|ATLANTA|30377|1|13|FULTON|404/770
+26733|GA|ATL|30377|0|13||
+26734|GA|ATLANTA|30378|1|13|FULTON|404/770
+26735|GA|ATL|30378|0|13||
+26736|GA|ATLANTA|30379|1|13|FULTON|404/770
+26737|GA|ATL|30379|0|13||
+26738|GA|ATLANTA|30380|1|13|FULTON|404/770
+26739|GA|ATL|30380|0|13||
+26740|GA|ATLANTA POSTAL CREDIT UNION|30380|0|13||
+26741|GA|ATLANTA|30384|1|13|FULTON|404/770
+26742|GA|ATL|30384|0|13||
+26743|GA|BANKAMERICA CORPORATION|30384|0|13||
+26744|GA|ATLANTA|30385|1|13|FULTON|404/770
+26745|GA|ATL|30385|0|13||
+26746|GA|SOUTHERN BELL|30385|0|13||
+26747|GA|ATLANTA|30386|1|13|FULTON|404/770
+26748|GA|ATL|30386|0|13||
+26749|GA|SEARS ROEBUCK CO|30386|0|13||
+26750|GA|ATLANTA|30387|1|13|FULTON|404/770
+26751|GA|ATL|30387|0|13||
+26752|GA|J C PENNEY|30387|0|13||
+26753|GA|ATLANTA|30388|1|13|FULTON|404/770
+26754|GA|ATL|30388|0|13||
+26755|GA|AVON|30388|0|13||
+26756|GA|ATLANTA|30389|1|13|FULTON|404/770
+26757|GA|ATL|30389|0|13||
+26758|GA|ATLANTA GAS LIGHT|30389|0|13||
+26759|GA|ATLANTA|30390|1|13|FULTON|404/770
+26760|GA|ATL|30390|0|13||
+26761|GA|J C PENNEY|30390|0|13||
+26762|GA|ATLANTA|30392|1|13|FULTON|404/770
+26763|GA|ATL|30392|0|13||
+26764|GA|ATLANTA|30394|1|13|FULTON|404/770
+26765|GA|ATL|30394|0|13||
+26766|GA|ATLANTA|30396|1|13|FULTON|404/770
+26767|GA|ATL|30396|0|13||
+26768|GA|GEORGIA POWER|30396|0|13||
+26769|GA|ATLANTA|30398|1|13|FULTON|404/770
+26770|GA|ATL|30398|0|13||
+26771|GA|BANK SOUTH|30398|0|13||
+26772|GA|ATLANTA|30399|1|13|FULTON|404/770
+26773|GA|ATL|30399|0|13||
+26774|GA|BANKAMERICA CORPORATION|30399|0|13||
+26775|GA|SWAINSBORO|30401|1|13|EMANUEL|478/912
+26776|GA|BLUN|30401|0|13||
+26777|GA|BLUNDALE|30401|0|13||
+26778|GA|COVENA|30401|0|13||
+26779|GA|DELLWOOD|30401|0|13||
+26780|GA|GARY|30401|0|13||
+26781|GA|KEMP|30401|0|13||
+26782|GA|LEXSY|30401|0|13||
+26783|GA|MODOC|30401|0|13||
+26784|GA|OAK PARK|30401|0|13||
+26785|GA|SUMMERTOWN|30401|0|13||
+26786|GA|WESLEY|30401|0|13||
+26787|GA|AILEY|30410|1|13|MONTGOMERY|912
+26788|GA|HIGGSTON|30410|0|13||
+26789|GA|MCGREGOR|30410|0|13||
+26790|GA|OAK PARK|30410|0|13||
+26791|GA|ALAMO|30411|1|13|WHEELER|912
+26792|GA|ALSTON|30412|1|13|MONTGOMERY|912
+26793|GA|BARTOW|30413|1|13|JEFFERSON|478
+26794|GA|BELLVILLE|30414|1|13|EVANS|912
+26795|GA|CLAXTON|30414|0|13||
+26796|GA|BROOKLET|30415|1|13|BULLOCH|912
+26797|GA|AKIN|30415|0|13||
+26798|GA|ARCOLA|30415|0|13||
+26799|GA|DENMARK|30415|0|13||
+26800|GA|HUBERT|30415|0|13||
+26801|GA|IVANHOE|30415|0|13||
+26802|GA|MCGREGOR|30415|0|13||
+26803|GA|STILSON|30415|0|13||
+26804|GA|CLAXTON|30417|1|13|EVANS|912
+26805|GA|COBBTOWN|30420|1|13|TATTNALL|912
+26806|GA|ALINE|30420|0|13||
+26807|GA|COLLINS|30421|1|13|TATTNALL|912
+26808|GA|DAISY|30423|1|13|EVANS|912
+26809|GA|DOVER|30424|1|13|SCREVEN|912
+26810|GA|GARFIELD|30425|1|13|EMANUEL|478
+26811|GA|GIRARD|30426|1|13|BURKE|478
+26812|GA|GLENNVILLE|30427|1|13|TATTNALL|912
+26813|GA|MENDES|30427|0|13||
+26814|GA|TISON|30427|0|13||
+26815|GA|GLENWOOD|30428|1|13|WHEELER|912
+26816|GA|HAGAN|30429|1|13|EVANS|912
+26817|GA|LOUISVILLE|30434|1|13|JEFFERSON|478
+26818|GA|GRANGE|30434|0|13||
+26819|GA|ROSIER|30434|0|13||
+26820|GA|VIDETTE|30434|0|13||
+26821|GA|LYONS|30436|1|13|TOOMBS|912
+26822|GA|CEDAR CROSSING|30436|0|13||
+26823|GA|JOHNSON CORNER|30436|0|13||
+26824|GA|NEW BRANCH|30436|0|13||
+26825|GA|NEWBRANCH|30436|0|13||
+26826|GA|OHOOPEE|30436|0|13||
+26827|GA|SANTA CLAUS|30436|0|13||
+26828|GA|STANLEYS STORE|30436|0|13||
+26829|GA|MANASSAS|30438|1|13|TATTNALL|912
+26830|GA|CLAXTON|30438|0|13||
+26831|GA|METTER|30439|1|13|CANDLER|912
+26832|GA|EXCELSIOR|30439|0|13||
+26833|GA|MIDVILLE|30441|1|13|BURKE|478
+26834|GA|COLEMAN LAKE|30441|0|13||
+26835|GA|COLEMANS LAKE|30441|0|13||
+26836|GA|GREEN WAY|30441|0|13||
+26837|GA|GREENWAY|30441|0|13||
+26838|GA|HERNDON|30441|0|13||
+26839|GA|MILLEN|30442|1|13|JENKINS|478
+26840|GA|BIRDSVILLE|30442|0|13||
+26841|GA|BUTTS|30442|0|13||
+26842|GA|EMMALANE|30442|0|13||
+26843|GA|SCARBORO|30442|0|13||
+26844|GA|THRIFT|30442|0|13||
+26845|GA|MOUNT VERNON|30445|1|13|MONTGOMERY|912
+26846|GA|NEWINGTON|30446|1|13|SCREVEN|912
+26847|GA|NORRISTOWN|30447|1|13|EMANUEL|478
+26848|GA|NUNEZ|30448|1|13|EMANUEL|478
+26849|GA|OLIVER|30449|1|13|SCREVEN|912
+26850|GA|PORTAL|30450|1|13|BULLOCH|912
+26851|GA|AARON|30450|0|13||
+26852|GA|PULASKI|30451|1|13|CANDLER|912
+26853|GA|REGISTER|30452|1|13|BULLOCH|912
+26854|GA|REIDSVILLE|30453|1|13|TATTNALL|912
+26855|GA|ROCKLEDGE|30454|1|13|LAURENS|478
+26856|GA|ROCKY FORD|30455|1|13|SCREVEN|912
+26857|GA|SARDIS|30456|1|13|BURKE|478
+26858|GA|SOPERTON|30457|1|13|TREUTLEN|912
+26859|GA|STATESBORO|30458|1|13|BULLOCH|912
+26860|GA|STATESBORO|30459|1|13|BULLOCH|912
+26861|GA|STATESBORO|30460|1|13|BULLOCH|912
+26862|GA|STATESBORO|30461|1|13|BULLOCH|912
+26863|GA|STILLMORE|30464|1|13|EMANUEL|478
+26864|GA|SYLVANIA|30467|1|13|SCREVEN|912
+26865|GA|HILTONIA|30467|0|13||
+26866|GA|TARRYTOWN|30470|1|13|MONTGOMERY|912
+26867|GA|TWIN CITY|30471|1|13|EMANUEL|478
+26868|GA|CANOOCHEE|30471|0|13||
+26869|GA|UVALDA|30473|1|13|MONTGOMERY|912
+26870|GA|VIDALIA|30474|1|13|TOOMBS|912
+26871|GA|CENTER|30474|0|13||
+26872|GA|CHARLES|30474|0|13||
+26873|GA|KIBBEE|30474|0|13||
+26874|GA|NORMANTOWN|30474|0|13||
+26875|GA|PETROSS|30474|0|13||
+26876|GA|VIDALIA|30475|1|13|TOOMBS|912
+26877|GA|WADLEY|30477|1|13|JEFFERSON|478
+26878|GA|MOXLEY|30477|0|13||
+26879|GA|REIDSVILLE|30499|1|13|TATTNALL|912
+26880|GA|GEORGIA STATE PENITENTIARY|30499|0|13||
+26881|GA|GAINESVILLE|30501|1|13|HALL|678/770
+26882|GA|WESTSIDE|30501|0|13||
+26883|GA|CHESTNUT MOUNTAIN|30502|1|13|HALL|770
+26884|GA|OAKWOOD|30502|0|13||
+26885|GA|GAINESVILLE|30503|1|13|HALL|770
+26886|GA|GAINESVILLE|30504|1|13|HALL|678/770
+26887|GA|GAINESVILLE|30506|1|13|HALL|678/770
+26888|GA|GAINESVILLE|30507|1|13|HALL|678/770
+26889|GA|ALTO|30510|1|13|HABERSHAM|706
+26890|GA|BALDWIN|30511|1|13|BANKS|706
+26891|GA|BLAIRSVILLE|30512|1|13|UNION|706
+26892|GA|BLUE RIDGE|30513|1|13|FANNIN|706
+26893|GA|BLAIRSVILLE|30514|1|13|UNION|706
+26894|GA|BUFORD|30515|1|13|GWINNETT|770
+26895|GA|BOWERSVILLE|30516|1|13|HART|706
+26896|GA|BRASELTON|30517|1|13|JACKSON|706
+26897|GA|BUFORD|30518|1|13|GWINNETT|678/770
+26898|GA|SUGAR HILL|30518|0|13||
+26899|GA|SUGARHILL|30518|0|13||
+26900|GA|BUFORD|30519|1|13|GWINNETT|678/770
+26901|GA|CANON|30520|1|13|FRANKLIN|706
+26902|GA|CARNESVILLE|30521|1|13|FRANKLIN|706
+26903|GA|CHERRYLOG|30522|1|13|GILMER|706
+26904|GA|CLARKESVILLE|30523|1|13|HABERSHAM|706
+26905|GA|CLAYTON|30525|1|13|RABUN|706
+26906|GA|CLERMONT|30527|1|13|HALL|678/770
+26907|GA|CLEVELAND|30528|1|13|WHITE|706
+26908|GA|COMMERCE|30529|1|13|JACKSON|706
+26909|GA|COMMERCE|30530|1|13|BANKS|706
+26910|GA|CORNELIA|30531|1|13|HABERSHAM|706
+26911|GA|DAHLONEGA|30533|1|13|LUMPKIN|706
+26912|GA|DAWSONVILLE|30534|1|13|DAWSON|706
+26913|GA|DEMOREST|30535|1|13|HABERSHAM|706
+26914|GA|ELLIJAY|30536|1|13|GILMER|706
+26915|GA|DILLARD|30537|1|13|RABUN|706
+26916|GA|SKY VALLEY|30537|0|13||
+26917|GA|EASTANOLLEE|30538|1|13|STEPHENS|706
+26918|GA|EAST ELLIJAY|30539|1|13|GILMER|706
+26919|GA|ELLIJAY|30540|1|13|GILMER|706
+26920|GA|EAST ELLIJAY|30540|0|13||
+26921|GA|EPWORTH|30541|1|13|FANNIN|706
+26922|GA|FLOWERY BRANCH|30542|1|13|HALL|678/770
+26923|GA|GILLSVILLE|30543|1|13|HALL|770
+26924|GA|DEMOREST|30544|1|13|HABERSHAM|706
+26925|GA|HABERSHAM|30544|0|13||
+26926|GA|HELEN|30545|1|13|WHITE|706
+26927|GA|HIAWASSEE|30546|1|13|TOWNS|706
+26928|GA|HOMER|30547|1|13|BANKS|706
+26929|GA|HOSCHTON|30548|1|13|JACKSON|706
+26930|GA|JEFFERSON|30549|1|13|JACKSON|706
+26931|GA|LAKEMONT|30552|1|13|RABUN|706
+26932|GA|LAVONIA|30553|1|13|FRANKLIN|706
+26933|GA|LULA|30554|1|13|HALL|678/770
+26934|GA|MC CAYSVILLE|30555|1|13|FANNIN|706
+26935|GA|FRY|30555|0|13||
+26936|GA|MCCAYSVILLE|30555|0|13||
+26937|GA|MARTIN|30557|1|13|STEPHENS|706
+26938|GA|MAYSVILLE|30558|1|13|BANKS|706
+26939|GA|MINERAL BLUFF|30559|1|13|FANNIN|706
+26940|GA|MORGANTON|30560|1|13|FANNIN|706
+26941|GA|MOUNTAIN CITY|30562|1|13|RABUN|706
+26942|GA|MOUNT AIRY|30563|1|13|HABERSHAM|706
+26943|GA|MURRAYVILLE|30564|1|13|HALL|770
+26944|GA|NICHOLSON|30565|1|13|JACKSON|706
+26945|GA|OAKWOOD|30566|1|13|HALL|770
+26946|GA|PENDERGRASS|30567|1|13|JACKSON|706
+26947|GA|RABUN GAP|30568|1|13|RABUN|706
+26948|GA|SAUTEE NACOOCHEE|30571|1|13|WHITE|706
+26949|GA|SUCHES|30572|1|13|UNION|706
+26950|GA|TALLULAH FALLS|30573|1|13|RABUN|706
+26951|GA|TALMO|30575|1|13|JACKSON|706
+26952|GA|TIGER|30576|1|13|RABUN|706
+26953|GA|TOCCOA|30577|1|13|STEPHENS|706
+26954|GA|TURNERVILLE|30580|1|13|HABERSHAM|706
+26955|GA|WILEY|30581|1|13|RABUN|706
+26956|GA|YOUNG HARRIS|30582|1|13|TOWNS|706
+26957|GA|ALTO|30596|1|13|HABERSHAM|706
+26958|GA|GA INDUSTRIAL INSTITUTE|30596|0|13||
+26959|GA|DAHLONEGA|30597|1|13|LUMPKIN|706
+26960|GA|NORTH GEORGIA COLLEGE|30597|0|13||
+26961|GA|TOCCOA FALLS|30598|1|13|STEPHENS|706
+26962|GA|COMMERCE|30599|1|13|JACKSON|706
+26963|GA|BAKER-TAYLOR|30599|0|13||
+26964|GA|ATHENS|30601|1|13|CLARKE|706
+26965|GA|ATHENS|30602|1|13|CLARKE|706
+26966|GA|ATHENS|30603|1|13|CLARKE|706
+26967|GA|ATHENS|30604|1|13|CLARKE|706
+26968|GA|ATHENS|30605|1|13|CLARKE|706
+26969|GA|ATHENS|30606|1|13|CLARKE|706
+26970|GA|NAVY SUPPLY CORPS SCHOOL|30606|0|13||
+26971|GA|ATHENS|30607|1|13|CLARKE|706
+26972|GA|ATHENS|30608|1|13|CLARKE|706
+26973|GA|ATHENS|30609|1|13|CLARKE|706
+26974|GA|ATHENS|30612|1|13|CLARKE|706
+26975|GA|ARNOLDSVILLE|30619|1|13|OGLETHORPE|706
+26976|GA|BETHLEHEM|30620|1|13|BARROW|770
+26977|GA|BISHOP|30621|1|13|OCONEE|706
+26978|GA|BOGART|30622|1|13|OCONEE|770
+26979|GA|BOSTWICK|30623|1|13|MORGAN|706
+26980|GA|BOWMAN|30624|1|13|ELBERT|706
+26981|GA|BUCKHEAD|30625|1|13|MORGAN|706
+26982|GA|CARLTON|30627|1|13|MADISON|706
+26983|GA|COLBERT|30628|1|13|MADISON|706
+26984|GA|COMER|30629|1|13|MADISON|706
+26985|GA|CRAWFORD|30630|1|13|OGLETHORPE|706
+26986|GA|CRAWFORDVILLE|30631|1|13|TALIAFERRO|706
+26987|GA|DANIELSVILLE|30633|1|13|MADISON|706
+26988|GA|DEWY ROSE|30634|1|13|ELBERT|706
+26989|GA|ELBERTON|30635|1|13|ELBERT|706
+26990|GA|FARMINGTON|30638|1|13|OCONEE|706
+26991|GA|FRANKLIN SPRINGS|30639|1|13|FRANKLIN|706
+26992|GA|GOOD HOPE|30641|1|13|WALTON|770
+26993|GA|GREENSBORO|30642|1|13|GREENE|706
+26994|GA|REYNOLDS PLANTATION|30642|0|13||
+26995|GA|HARTWELL|30643|1|13|HART|706
+26996|GA|HIGH SHOALS|30645|1|13|MORGAN|706
+26997|GA|HULL|30646|1|13|MADISON|706
+26998|GA|ILA|30647|1|13|MADISON|706
+26999|GA|LEXINGTON|30648|1|13|OGLETHORPE|706
+27000|GA|MADISON|30650|1|13|MORGAN|706
+27001|GA|MONROE|30655|1|13|WALTON|770
+27002|GA|MONROE|30656|1|13|WALTON|770
+27003|GA|RAYLE|30660|1|13|WILKES|706
+27004|GA|PHILOMATH|30660|0|13||
+27005|GA|ROYSTON|30662|1|13|FRANKLIN|706
+27006|GA|RUTLEDGE|30663|1|13|MORGAN|706
+27007|GA|SHARON|30664|1|13|TALIAFERRO|706
+27008|GA|SILOAM|30665|1|13|GREENE|706
+27009|GA|STATHAM|30666|1|13|BARROW|678/770
+27010|GA|STEPHENS|30667|1|13|OGLETHORPE|706
+27011|GA|TIGNALL|30668|1|13|WILKES|706
+27012|GA|DANBURG|30668|0|13||
+27013|GA|UNION POINT|30669|1|13|GREENE|706
+27014|GA|PENFIELD|30669|0|13||
+27015|GA|PENFLD|30669|0|13||
+27016|GA|WOODVILLE|30669|0|13||
+27017|GA|MAXEYS|30671|1|13|OGLETHORPE|706
+27018|GA|WASHINGTON|30673|1|13|WILKES|706
+27019|GA|WATKINSVILLE|30677|1|13|OCONEE|706
+27020|GA|WHITE PLAINS|30678|1|13|GREENE|706
+27021|GA|WINDER|30680|1|13|BARROW|678/770
+27022|GA|WINTERVILLE|30683|1|13|CLARKE|706
+27023|GA|CALHOUN|30701|1|13|GORDON|706
+27024|GA|CALHOUN|30703|1|13|GORDON|706
+27025|GA|CHATSWORTH|30705|1|13|MURRAY|706
+27026|GA|CHICKAMAUGA|30707|1|13|WALKER|706
+27027|GA|CISCO|30708|1|13|MURRAY|706
+27028|GA|COHUTTA|30710|1|13|WHITFIELD|706
+27029|GA|CRANDALL|30711|1|13|MURRAY|706
+27030|GA|DALTON|30719|1|13|WHITFIELD|706
+27031|GA|DALTON|30720|1|13|WHITFIELD|706
+27032|GA|DALTON|30721|1|13|WHITFIELD|706
+27033|GA|DALTON|30722|1|13|WHITFIELD|706
+27034|GA|ETON|30724|1|13|MURRAY|706
+27035|GA|FLINTSTONE|30725|1|13|WALKER|706
+27036|GA|GRAYSVILLE|30726|1|13|CATOOSA|706
+27037|GA|LA FAYETTE|30728|1|13|WALKER|706
+27038|GA|LAFAYETTE|30728|0|13||
+27039|GA|LYERLY|30730|1|13|CHATTOOGA|706
+27040|GA|MENLO|30731|1|13|CHATTOOGA|706
+27041|GA|CLOUDLAND|30731|0|13||
+27042|GA|OAKMAN|30732|1|13|GORDON|706
+27043|GA|PLAINVILLE|30733|1|13|GORDON|706
+27044|GA|RANGER|30734|1|13|GORDON|706
+27045|GA|RESACA|30735|1|13|GORDON|706
+27046|GA|RINGGOLD|30736|1|13|CATOOSA|706
+27047|GA|RISING FAWN|30738|1|13|DADE|706
+27048|GA|ROCK SPRING|30739|1|13|WALKER|706
+27049|GA|ROCKY FACE|30740|1|13|WHITFIELD|706
+27050|GA|ROSSVILLE|30741|1|13|WALKER|706
+27051|GA|FORT OGLETHORPE|30742|1|13|CATOOSA|706
+27052|GA|FT OGLETHORPE|30742|0|13||
+27053|GA|ROSSVILLE|30742|0|13||
+27054|GA|SUGAR VALLEY|30746|1|13|GORDON|706
+27055|GA|SUMMERVILLE|30747|1|13|CHATTOOGA|706
+27056|GA|LOOKOUT MOUNTAIN|30750|1|13|WALKER|706
+27057|GA|TENNGA|30751|1|13|MURRAY|706
+27058|GA|TRENTON|30752|1|13|DADE|706
+27059|GA|TRION|30753|1|13|CHATTOOGA|706
+27060|GA|TUNNEL HILL|30755|1|13|WHITFIELD|706
+27061|GA|VARNELL|30756|1|13|WHITFIELD|706
+27062|GA|WILDWOOD|30757|1|13|DADE|706
+27063|GA|APPLING|30802|1|13|COLUMBIA|706
+27064|GA|LEAH|30802|0|13||
+27065|GA|PHINIZY|30802|0|13||
+27066|GA|POLLARDS CORNER|30802|0|13||
+27067|GA|AVERA|30803|1|13|JEFFERSON|706
+27068|GA|BLYTHE|30805|1|13|RICHMOND|706
+27069|GA|ELLWOOD|30805|0|13||
+27070|GA|BONEVILLE|30806|1|13|MCDUFFIE|706
+27071|GA|CAMAK|30807|1|13|WARREN|706
+27072|GA|DEARING|30808|1|13|MCDUFFIE|706
+27073|GA|EVANS|30809|1|13|COLUMBIA|706
+27074|GA|GIBSON|30810|1|13|GLASCOCK|706
+27075|GA|EDGE HILL|30810|0|13||
+27076|GA|GOUGH|30811|1|13|BURKE|706
+27077|GA|KEYSVILLE|30811|0|13||
+27078|GA|GRACEWOOD|30812|1|13|RICHMOND|706
+27079|GA|GROVETOWN|30813|1|13|COLUMBIA|706
+27080|GA|HARLEM|30814|1|13|COLUMBIA|706
+27081|GA|BERZELIA|30814|0|13||
+27082|GA|CAMPANIA|30814|0|13||
+27083|GA|PUMPKIN CENTER|30814|0|13||
+27084|GA|HEPHZIBAH|30815|1|13|RICHMOND|706
+27085|GA|KEYSVILLE|30816|1|13|BURKE|706
+27086|GA|LINCOLNTON|30817|1|13|LINCOLN|706
+27087|GA|AGNES|30817|0|13||
+27088|GA|AMITY|30817|0|13||
+27089|GA|DOUBLE BRANCHES|30817|0|13||
+27090|GA|HONORA|30817|0|13||
+27091|GA|LEATHERSVILLE|30817|0|13||
+27092|GA|LOCO|30817|0|13||
+27093|GA|MAXIM|30817|0|13||
+27094|GA|NEW HOPE|30817|0|13||
+27095|GA|SYBERT|30817|0|13||
+27096|GA|MATTHEWS|30818|1|13|JEFFERSON|706
+27097|GA|NOAH|30818|0|13||
+27098|GA|WRENS|30818|0|13||
+27099|GA|MESENA|30819|1|13|WARREN|706
+27100|GA|MITCHELL|30820|1|13|GLASCOCK|706
+27101|GA|SHOALS|30820|0|13||
+27102|GA|NORWOOD|30821|1|13|WARREN|706
+27103|GA|BARNETT|30821|0|13||
+27104|GA|CADLEY|30821|0|13||
+27105|GA|PERKINS|30822|1|13|JENKINS|478
+27106|GA|STAPLETON|30823|1|13|JEFFERSON|706
+27107|GA|THOMSON|30824|1|13|MCDUFFIE|706
+27108|GA|WINFIELD|30824|0|13||
+27109|GA|WARRENTON|30828|1|13|WARREN|706
+27110|GA|NORRIS|30828|0|13||
+27111|GA|REESE|30828|0|13||
+27112|GA|WAYNESBORO|30830|1|13|BURKE|706
+27113|GA|MUNNERLYN|30830|0|13||
+27114|GA|SHELL BLUFF|30830|0|13||
+27115|GA|WRENS|30833|1|13|JEFFERSON|706
+27116|GA|AUGUSTA|30901|1|13|RICHMOND|706
+27117|GA|AUGUSTA|30903|1|13|RICHMOND|706
+27118|GA|AUGUSTA|30904|1|13|RICHMOND|706
+27119|GA|AUGUSTA|30905|1|13|RICHMOND|706
+27120|GA|FORT GORDON|30905|0|13||
+27121|GA|FT GORDON|30905|0|13||
+27122|GA|AUGUSTA|30906|1|13|RICHMOND|706
+27123|GA|PEACH ORCHARD|30906|0|13||
+27124|GA|AUGUSTA|30907|1|13|COLUMBIA|706
+27125|GA|MARTINEZ|30907|0|13||
+27126|GA|AUGUSTA|30909|1|13|RICHMOND|706
+27127|GA|FOREST HILLS|30909|0|13||
+27128|GA|AUGUSTA|30910|1|13|RICHMOND|706
+27129|GA|AUGUSTA|30911|1|13|RICHMOND|706
+27130|GA|AUGUSTA|30912|1|13|RICHMOND|706
+27131|GA|AUGUSTA|30913|1|13|RICHMOND|706
+27132|GA|AUGUSTA|30914|1|13|RICHMOND|706
+27133|GA|AUGUSTA|30916|1|13|RICHMOND|706
+27134|GA|AUGUSTA|30917|1|13|COLUMBIA|706
+27135|GA|AUGUSTA|30919|1|13|RICHMOND|706
+27136|GA|AUGUSTA|30999|1|13|RICHMOND|706
+27137|GA|RAILROAD RETIREMENT BOARD|30999|0|13||
+27138|GA|ABBEVILLE|31001|1|13|WILCOX|229
+27139|GA|ADRIAN|31002|1|13|EMANUEL|478
+27140|GA|ALLENTOWN|31003|1|13|WILKINSON|478
+27141|GA|BOLINGBROKE|31004|1|13|MONROE|478
+27142|GA|BONAIRE|31005|1|13|HOUSTON|478
+27143|GA|BUTLER|31006|1|13|TAYLOR|478
+27144|GA|BYROMVILLE|31007|1|13|DOOLY|478
+27145|GA|BYRON|31008|1|13|PEACH|478
+27146|GA|BRYON|31008|0|13||
+27147|GA|POWERSVILLE|31008|0|13||
+27148|GA|CADWELL|31009|1|13|LAURENS|478
+27149|GA|CORDELE|31010|1|13|CRISP|229
+27150|GA|CHAUNCEY|31011|1|13|DODGE|478
+27151|GA|CHESTER|31012|1|13|DODGE|478
+27152|GA|CLINCHFIELD|31013|1|13|HOUSTON|478
+27153|GA|COCHRAN|31014|1|13|BLECKLEY|478
+27154|GA|EMPIRE|31014|0|13||
+27155|GA|CORDELE|31015|1|13|CRISP|229
+27156|GA|CULLODEN|31016|1|13|MONROE|478
+27157|GA|DANVILLE|31017|1|13|TWIGGS|478
+27158|GA|DAVISBORO|31018|1|13|WASHINGTON|478
+27159|GA|DEXTER|31019|1|13|LAURENS|478
+27160|GA|DRY BRANCH|31020|1|13|TWIGGS|478
+27161|GA|DUBLIN|31021|1|13|LAURENS|478
+27162|GA|LOLLIE|31021|0|13||
+27163|GA|DUDLEY|31022|1|13|LAURENS|478
+27164|GA|EASTMAN|31023|1|13|DODGE|478
+27165|GA|PLAINFIELD|31023|0|13||
+27166|GA|EATONTON|31024|1|13|PUTNAM|706
+27167|GA|ELKO|31025|1|13|HOUSTON|478
+27168|GA|EATONTON|31026|1|13|PUTNAM|706
+27169|GA|HABAND|31026|0|13||
+27170|GA|EAST DUBLIN|31027|1|13|LAURENS|478
+27171|GA|DUBLIN|31027|0|13||
+27172|GA|E DUBLIN|31027|0|13||
+27173|GA|CENTERVILLE|31028|1|13|HOUSTON|478
+27174|GA|FORSYTH|31029|1|13|MONROE|478
+27175|GA|FORT VALLEY|31030|1|13|PEACH|478
+27176|GA|MARSHALLVILLE|31030|0|13||
+27177|GA|GORDON|31031|1|13|WILKINSON|478
+27178|GA|IVEY|31031|0|13||
+27179|GA|STEVENS POTTERY|31031|0|13||
+27180|GA|GRAY|31032|1|13|JONES|478
+27181|GA|HADDOCK|31033|1|13|JONES|478
+27182|GA|HARDWICK|31034|1|13|BALDWIN|478
+27183|GA|HARRISON|31035|1|13|WASHINGTON|478
+27184|GA|HAWKINSVILLE|31036|1|13|PULASKI|478
+27185|GA|GROVANIA|31036|0|13||
+27186|GA|HAYNEVILLE|31036|0|13||
+27187|GA|HVILLE|31036|0|13||
+27188|GA|KLONDIKE|31036|0|13||
+27189|GA|HELENA|31037|1|13|TELFAIR|229
+27190|GA|HILLSBORO|31038|1|13|JASPER|706
+27191|GA|ROUND OAK|31038|0|13||
+27192|GA|HOWARD|31039|1|13|TAYLOR|478
+27193|GA|DUBLIN|31040|1|13|LAURENS|478
+27194|GA|IDEAL|31041|1|13|MACON|478
+27195|GA|IRWINTON|31042|1|13|WILKINSON|478
+27196|GA|JEFFERSONVILLE|31044|1|13|TWIGGS|478
+27197|GA|JEWELL|31045|1|13|WARREN|706
+27198|GA|JULIETTE|31046|1|13|MONROE|478
+27199|GA|KATHLEEN|31047|1|13|HOUSTON|478
+27200|GA|KITE|31049|1|13|JOHNSON|478
+27201|GA|KNOXVILLE|31050|1|13|CRAWFORD|478
+27202|GA|LILLY|31051|1|13|DOOLY|478
+27203|GA|LIZELLA|31052|1|13|CRAWFORD|478
+27204|GA|MC INTYRE|31054|1|13|WILKINSON|478
+27205|GA|MC RAE|31055|1|13|TELFAIR|229
+27206|GA|MARSHALLVILLE|31057|1|13|MACON|478
+27207|GA|MAUK|31058|1|13|MARION|478
+27208|GA|MILLEDGEVILLE|31059|1|13|BALDWIN|478
+27209|GA|MILAN|31060|1|13|TELFAIR|229
+27210|GA|MILLEDGEVILLE|31061|1|13|BALDWIN|478
+27211|GA|MVILLE|31061|0|13||
+27212|GA|MILLEDGEVILLE|31062|1|13|BALDWIN|478
+27213|GA|CENTRAL STATE HOSPITAL|31062|0|13||
+27214|GA|MONTEZUMA|31063|1|13|MACON|478
+27215|GA|MONTICELLO|31064|1|13|JASPER|706
+27216|GA|MONTROSE|31065|1|13|LAURENS|478
+27217|GA|MUSELLA|31066|1|13|CRAWFORD|478
+27218|GA|OCONEE|31067|1|13|WASHINGTON|478
+27219|GA|OGLETHORPE|31068|1|13|MACON|478
+27220|GA|OGELTHORPE|31068|0|13||
+27221|GA|OLGETHORPE|31068|0|13||
+27222|GA|PERRY|31069|1|13|HOUSTON|478
+27223|GA|PINEHURST|31070|1|13|DOOLY|229
+27224|GA|PINEVIEW|31071|1|13|WILCOX|229
+27225|GA|PITTS|31072|1|13|WILCOX|229
+27226|GA|RENTZ|31075|1|13|LAURENS|478
+27227|GA|REYNOLDS|31076|1|13|TAYLOR|478
+27228|GA|RHINE|31077|1|13|DODGE|229
+27229|GA|ROBERTA|31078|1|13|CRAWFORD|478
+27230|GA|ROCHELLE|31079|1|13|WILCOX|229
+27231|GA|RUPERT|31081|1|13|TAYLOR|478
+27232|GA|SANDERSVILLE|31082|1|13|WASHINGTON|478
+27233|GA|DEEPSTEP|31082|0|13||
+27234|GA|SCOTLAND|31083|1|13|TELFAIR|912
+27235|GA|SEVILLE|31084|1|13|WILCOX|229
+27236|GA|SHADY DALE|31085|1|13|JASPER|706
+27237|GA|FARRAR|31085|0|13||
+27238|GA|KELLY|31085|0|13||
+27239|GA|SMARR|31086|1|13|MONROE|478
+27240|GA|SPARTA|31087|1|13|HANCOCK|706
+27241|GA|MAYFIELD|31087|0|13||
+27242|GA|WARNER ROBINS|31088|1|13|HOUSTON|478
+27243|GA|TENNILLE|31089|1|13|WASHINGTON|478
+27244|GA|TOOMSBORO|31090|1|13|WILKINSON|478
+27245|GA|UNADILLA|31091|1|13|DOOLY|478
+27246|GA|UNIDILLA|31091|0|13||
+27247|GA|VIENNA|31092|1|13|DOOLY|229
+27248|GA|WARNER ROBINS|31093|1|13|HOUSTON|478
+27249|GA|WARTHEN|31094|1|13|WASHINGTON|478
+27250|GA|WARNER ROBINS|31095|1|13|HOUSTON|478
+27251|GA|WRIGHTSVILLE|31096|1|13|JOHNSON|478
+27252|GA|YATESVILLE|31097|1|13|UPSON|706
+27253|GA|WARNER ROBINS|31098|1|13|HOUSTON|478
+27254|GA|ROBINS A F B|31098|0|13||
+27255|GA|ROBINS AFB|31098|0|13||
+27256|GA|ROBINS AIR FORCE BASE|31098|0|13||
+27257|GA|SOUTH BASE CPU|31098|0|13||
+27258|GA|WARNER ROBINS|31099|1|13|HOUSTON|478
+27259|GA|ATLANTA|31106|1|13|FULTON|404/770
+27260|GA|ATL|31106|0|13||
+27261|GA|ATLANTA|31107|1|13|FULTON|404/770
+27262|GA|ATL|31107|0|13||
+27263|GA|ATLANTA|31119|1|13|DEKALB|770
+27264|GA|ATL|31119|0|13||
+27265|GA|ATLANTA|31126|1|13|FULTON|404/770
+27266|GA|ATL|31126|0|13||
+27267|GA|LENOX SQ FINANCE|31126|0|13||
+27268|GA|LENOX SQUARE FINANCE|31126|0|13||
+27269|GA|ATLANTA|31131|1|13|FULTON|404/770
+27270|GA|ATL|31131|0|13||
+27271|GA|ATLANTA|31132|1|13|FULTON|404/770
+27272|GA|ATLANTA BMC MERCH RETURN|31132|0|13||
+27273|GA|ATLANTA|31139|1|13|FULTON|404/770
+27274|GA|ATL|31139|0|13||
+27275|GA|ATLANTA|31141|1|13|DEKALB|404/770
+27276|GA|ATL|31141|0|13||
+27277|GA|EMBRY HLS|31141|0|13||
+27278|GA|ATLANTA|31145|1|13|DEKALB|770
+27279|GA|ATL|31145|0|13||
+27280|GA|NORTHLAKE|31145|0|13||
+27281|GA|ATLANTA|31146|1|13|DEKALB|404
+27282|GA|ATL|31146|0|13||
+27283|GA|PERIMETER CENTER FINANCE|31146|0|13||
+27284|GA|ATLANTA|31150|1|13|FULTON|404/770
+27285|GA|ATL|31150|0|13||
+27286|GA|ATLANTA|31156|1|13|FULTON|404/770
+27287|GA|ATL|31156|0|13||
+27288|GA|ATLANTA|31191|1|13|FULTON|404/770
+27289|GA|ATL|31191|0|13||
+27290|GA|ATLANTA BMC|31191|0|13||
+27291|GA|FINGERHUT|31191|0|13||
+27292|GA|ATLANTA|31192|1|13|FULTON|404/770
+27293|GA|ATL|31192|0|13||
+27294|GA|MELLON BANK|31192|0|13||
+27295|GA|ATLANTA|31193|1|13|FULTON|404/770
+27296|GA|ATL|31193|0|13||
+27297|GA|FIRST UNION|31193|0|13||
+27298|GA|ATLANTA|31195|1|13|FULTON|404/770
+27299|GA|ATL|31195|0|13||
+27300|GA|ATLANTA BMC|31195|0|13||
+27301|GA|ATLANTA|31196|1|13|FULTON|404/770
+27302|GA|ATL|31196|0|13||
+27303|GA|ATLANTA BMC|31196|0|13||
+27304|GA|ATLANTA|31197|1|13|FULTON|404/770
+27305|GA|ATL|31197|0|13||
+27306|GA|ATLANTA BMC|31197|0|13||
+27307|GA|ATLANTA|31198|1|13|FULTON|404/770
+27308|GA|ATL|31198|0|13||
+27309|GA|ATLANTA BMC|31198|0|13||
+27310|GA|ATLANTA|31199|1|13|FULTON|404/770
+27311|GA|ATL|31199|0|13||
+27312|GA|ATLANTA BMC|31199|0|13||
+27313|GA|BMC|31199|0|13||
+27314|GA|MACON|31201|1|13|BIBB|478
+27315|GA|HUBER|31201|0|13||
+27316|GA|MACON|31202|1|13|BIBB|478
+27317|GA|MACON|31203|1|13|BIBB|478
+27318|GA|MACON|31204|1|13|BIBB|478
+27319|GA|PAYNE CITY|31204|0|13||
+27320|GA|MACON|31205|1|13|BIBB|478
+27321|GA|MACON|31206|1|13|BIBB|478
+27322|GA|LEWIS B WILSON AIRPORT|31206|0|13||
+27323|GA|S MACON|31206|0|13||
+27324|GA|SO MACON|31206|0|13||
+27325|GA|WILSON AIRPORT|31206|0|13||
+27326|GA|MACON|31207|1|13|BIBB|478
+27327|GA|MERCER UNIVERSITY|31207|0|13||
+27328|GA|MACON|31208|1|13|BIBB|478
+27329|GA|MACON|31209|1|13|BIBB|478
+27330|GA|MACON|31210|1|13|BIBB|478
+27331|GA|NO MACON|31210|0|13||
+27332|GA|ZEBULON BRANCH|31210|0|13||
+27333|GA|MACON|31211|1|13|BIBB|478
+27334|GA|MACON|31212|1|13|BIBB|478
+27335|GA|MACON|31213|1|13|BIBB|478
+27336|GA|MAIN OFFICE FIRMS|31213|0|13||
+27337|GA|MACON|31216|1|13|BIBB|478
+27338|GA|MACON|31217|1|13|BIBB|478
+27339|GA|MACON|31220|1|13|BIBB|478
+27340|GA|ZEBULON BRANCH|31220|0|13||
+27341|GA|MACON|31221|1|13|BIBB|478
+27342|GA|ZEBULON BRANCH|31221|0|13||
+27343|GA|MACON|31294|1|13|BIBB|478
+27344|GA|BUSINESS REPLY MAIL|31294|0|13||
+27345|GA|MACON BRM|31294|0|13||
+27346|GA|MACON|31295|1|13|BIBB|478
+27347|GA|GEICO UNDERWRITING|31295|0|13||
+27348|GA|MACON|31296|1|13|BIBB|478
+27349|GA|GEICO CLAIMS|31296|0|13||
+27350|GA|MACON|31297|1|13|BIBB|478
+27351|GA|MACON|31298|1|13|BIBB|478
+27352|GA|MACON|31299|1|13|BIBB|478
+27353|GA|MONTGOMERY WARD AND CO|31299|0|13||
+27354|GA|ALLENHURST|31301|1|13|LIBERTY|912
+27355|GA|BLOOMINGDALE|31302|1|13|CHATHAM|912
+27356|GA|CLYO|31303|1|13|EFFINGHAM|912
+27357|GA|CRESCENT|31304|1|13|MCINTOSH|912
+27358|GA|DARIEN|31305|1|13|MCINTOSH|912
+27359|GA|EDEN|31307|1|13|EFFINGHAM|912
+27360|GA|ELLABELL|31308|1|13|BRYAN|912
+27361|GA|BLACK CREEK|31308|0|13||
+27362|GA|FLEMING|31309|1|13|LIBERTY|912
+27363|GA|HINESVILLE|31310|1|13|LIBERTY|912
+27364|GA|GUYTON|31312|1|13|EFFINGHAM|912
+27365|GA|MARLOW|31312|0|13||
+27366|GA|PINEORA|31312|0|13||
+27367|GA|HINESVILLE|31313|1|13|LIBERTY|912
+27368|GA|FLEMINGTON|31313|0|13||
+27369|GA|FORT STEWART|31313|0|13||
+27370|GA|FS|31313|0|13||
+27371|GA|FT STEWART|31313|0|13||
+27372|GA|GUM BRANCH|31313|0|13||
+27373|GA|FORT STEWART|31314|1|13|LIBERTY|912
+27374|GA|FS|31314|0|13||
+27375|GA|FT STEWART|31314|0|13||
+27376|GA|HINESVILLE|31314|0|13||
+27377|GA|FORT STEWART|31315|1|13|LIBERTY|912
+27378|GA|FS|31315|0|13||
+27379|GA|FT STEWART|31315|0|13||
+27380|GA|HINESVILLE|31315|0|13||
+27381|GA|LUDOWICI|31316|1|13|LONG|912
+27382|GA|BAYVIEW|31316|0|13||
+27383|GA|DONALD|31316|0|13||
+27384|GA|ELIM|31316|0|13||
+27385|GA|MELDRIM|31318|1|13|EFFINGHAM|912
+27386|GA|MERIDIAN|31319|1|13|MCINTOSH|912
+27387|GA|CARNIGAN|31319|0|13||
+27388|GA|VALONA|31319|0|13||
+27389|GA|MIDWAY|31320|1|13|LIBERTY|912
+27390|GA|PEMBROKE|31321|1|13|BRYAN|912
+27391|GA|NEVILS|31321|0|13||
+27392|GA|POOLER|31322|1|13|CHATHAM|912
+27393|GA|RICEBORO|31323|1|13|LIBERTY|912
+27394|GA|JONES|31323|0|13||
+27395|GA|RETREAT|31323|0|13||
+27396|GA|SOUTH NEWPORT|31323|0|13||
+27397|GA|RICHMOND HILL|31324|1|13|BRYAN|912
+27398|GA|RINCON|31326|1|13|EFFINGHAM|912
+27399|GA|SAPELO ISLAND|31327|1|13|MCINTOSH|912
+27400|GA|TYBEE ISLAND|31328|1|13|CHATHAM|912
+27401|GA|FORT SCREVEN|31328|0|13||
+27402|GA|SPRINGFIELD|31329|1|13|EFFINGHAM|912
+27403|GA|STILLWELL|31329|0|13||
+27404|GA|TOWNSEND|31331|1|13|MCINTOSH|912
+27405|GA|ASHINTILLY|31331|0|13||
+27406|GA|COX|31331|0|13||
+27407|GA|EULONIA|31331|0|13||
+27408|GA|RIDGEVILLE|31331|0|13||
+27409|GA|SHELLMAN BLUFF|31331|0|13||
+27410|GA|WALTHOURVILLE|31333|1|13|LIBERTY|912
+27411|GA|SAVANNAH|31401|1|13|CHATHAM|912
+27412|GA|SAVANNAH|31402|1|13|CHATHAM|912
+27413|GA|SAVANNAH|31403|1|13|CHATHAM|912
+27414|GA|SAVANNAH|31404|1|13|CHATHAM|912
+27415|GA|STATE COLLEGE|31404|0|13||
+27416|GA|THUNDERBOLT|31404|0|13||
+27417|GA|SAVANNAH|31405|1|13|CHATHAM|912
+27418|GA|GARDEN CITY|31405|0|13||
+27419|GA|HUNTER ARMY AIR FIELD|31405|0|13||
+27420|GA|SAVANNAH|31406|1|13|CHATHAM|912
+27421|GA|SAVANNAH|31407|1|13|CHATHAM|912
+27422|GA|PORT WENTWORTH BRANCH|31407|0|13||
+27423|GA|SAVANNAH|31408|1|13|CHATHAM|912
+27424|GA|GARDEN CITY|31408|0|13||
+27425|GA|SAVANNAH|31409|1|13|CHATHAM|912
+27426|GA|HUNTER AAF|31409|0|13||
+27427|GA|SAVANNAH|31410|1|13|CHATHAM|912
+27428|GA|THUNDERBOLT|31410|0|13||
+27429|GA|WILMINGTON ISLAND|31410|0|13||
+27430|GA|SAVANNAH|31411|1|13|CHATHAM|912
+27431|GA|VILLAGE STATION|31411|0|13||
+27432|GA|SAVANNAH|31412|1|13|CHATHAM|912
+27433|GA|SAVANNAH|31414|1|13|CHATHAM|912
+27434|GA|SAVANNAH|31415|1|13|CHATHAM|912
+27435|GA|GARDEN CITY|31415|0|13||
+27436|GA|SAVANNAH|31416|1|13|CHATHAM|912
+27437|GA|SAVANNAH|31418|1|13|CHATHAM|912
+27438|GA|GARDEN CITY|31418|0|13||
+27439|GA|GRDN CITY|31418|0|13||
+27440|GA|SAVANNAH|31419|1|13|CHATHAM|912
+27441|GA|SAVANNAH|31420|1|13|CHATHAM|912
+27442|GA|SAVANNAH|31421|1|13|CHATHAM|912
+27443|GA|SAVANNAH|31498|1|13|CHATHAM|912
+27444|GA|SAVANNAH|31499|1|13|CHATHAM|912
+27445|GA|WAYCROSS|31501|1|13|WARE|912
+27446|GA|OKEFENOKEE|31501|0|13||
+27447|GA|WAYCROSS|31502|1|13|WARE|912
+27448|GA|WAYCROSS|31503|1|13|WARE|912
+27449|GA|ALMA|31510|1|13|BACON|912
+27450|GA|GUYSIE|31510|0|13||
+27451|GA|ROCKINGHAM|31510|0|13||
+27452|GA|AMBROSE|31512|1|13|COFFEE|912
+27453|GA|BAXLEY|31513|1|13|APPLING|912
+27454|GA|GRAHAM|31513|0|13||
+27455|GA|PINE GROVE|31513|0|13||
+27456|GA|BAXLEY|31515|1|13|APPLING|912
+27457|GA|BLACKSHEAR|31516|1|13|PIERCE|912
+27458|GA|JOT EM DOWN STORE|31516|0|13||
+27459|GA|BRISTOL|31518|1|13|PIERCE|912
+27460|GA|BROXTON|31519|1|13|COFFEE|912
+27461|GA|LOTTS|31519|0|13||
+27462|GA|PRIDGEN|31519|0|13||
+27463|GA|BRUNSWICK|31520|1|13|GLYNN|912
+27464|GA|ALTAMA|31520|0|13||
+27465|GA|SEARS|31520|0|13||
+27466|GA|BRUNSWICK|31521|1|13|GLYNN|912
+27467|GA|SAINT SIMONS ISLAND|31522|1|13|GLYNN|912
+27468|GA|BRUNSWICK|31522|0|13||
+27469|GA|BRUNSWICK|31523|1|13|GLYNN|912
+27470|GA|BRUNSWICK|31524|1|13|GLYNN|912
+27471|GA|FED LAW ENFORCE TRNG CTR|31524|0|13||
+27472|GA|GLYNCO|31524|0|13||
+27473|GA|BRUNSWICK|31525|1|13|GLYNN|912
+27474|GA|EVERETT|31525|0|13||
+27475|GA|STERLING|31525|0|13||
+27476|GA|THALMAN|31525|0|13||
+27477|GA|JEKYLL ISLAND|31527|1|13|GLYNN|912
+27478|GA|BRUNSWICK|31527|0|13||
+27479|GA|DENTON|31532|1|13|JEFF DAVIS|912
+27480|GA|SNIPESVILLE|31532|0|13||
+27481|GA|DOUGLAS|31533|1|13|COFFEE|912
+27482|GA|DOUGLAS|31534|1|13|COFFEE|912
+27483|GA|DOUGLAS|31535|1|13|COFFEE|912
+27484|GA|FOLKSTON|31537|1|13|CHARLTON|912
+27485|GA|HOMELAND|31537|0|13||
+27486|GA|HAZLEHURST|31539|1|13|JEFF DAVIS|912
+27487|GA|ROPER|31539|0|13||
+27488|GA|HOBOKEN|31542|1|13|BRANTLEY|912
+27489|GA|HORTENSE|31543|1|13|BRANTLEY|912
+27490|GA|JACKSONVILLE|31544|1|13|TELFAIR|229
+27491|GA|JESUP|31545|1|13|WAYNE|912
+27492|GA|DOCTORTOWN|31545|0|13||
+27493|GA|GARDI|31545|0|13||
+27494|GA|MADRAY SPRINGS|31545|0|13||
+27495|GA|MCKINNON|31545|0|13||
+27496|GA|JESUP|31546|1|13|WAYNE|912
+27497|GA|KINGS BAY|31547|1|13|CAMDEN|912
+27498|GA|KINGSLAND|31548|1|13|CAMDEN|912
+27499|GA|LUMBER CITY|31549|1|13|TELFAIR|912
+27500|GA|MANOR|31550|1|13|WARE|912
+27501|GA|MERSHON|31551|1|13|PIERCE|912
+27502|GA|MILLWOOD|31552|1|13|WARE|912
+27503|GA|FAIRFAX|31552|0|13||
+27504|GA|NAHUNTA|31553|1|13|BRANTLEY|912
+27505|GA|HICKOX|31553|0|13||
+27506|GA|LULATON|31553|0|13||
+27507|GA|RAYBON|31553|0|13||
+27508|GA|NICHOLLS|31554|1|13|COFFEE|912
+27509|GA|BEACH|31554|0|13||
+27510|GA|BICKLEY|31554|0|13||
+27511|GA|CHATTERTON|31554|0|13||
+27512|GA|SESSOMS|31554|0|13||
+27513|GA|WILSONVILLE|31554|0|13||
+27514|GA|ODUM|31555|1|13|WAYNE|912
+27515|GA|OFFERMAN|31556|1|13|PIERCE|912
+27516|GA|PATTERSON|31557|1|13|PIERCE|912
+27517|GA|SAINT MARYS|31558|1|13|CAMDEN|912
+27518|GA|SCREVEN|31560|1|13|WAYNE|912
+27519|GA|SEA ISLAND|31561|1|13|GLYNN|912
+27520|GA|BRUNSWICK|31561|0|13||
+27521|GA|SAINT GEORGE|31562|1|13|CHARLTON|912
+27522|GA|SURRENCY|31563|1|13|APPLING|912
+27523|GA|WARESBORO|31564|1|13|WARE|912
+27524|GA|WAVERLY|31565|1|13|CAMDEN|912
+27525|GA|HICKORY BLUFF|31565|0|13||
+27526|GA|PINEY BLUFF|31565|0|13||
+27527|GA|SPRING BLUFF|31565|0|13||
+27528|GA|WAYNESVILLE|31566|1|13|BRANTLEY|912
+27529|GA|WEST GREEN|31567|1|13|COFFEE|912
+27530|GA|WHITE OAK|31568|1|13|CAMDEN|912
+27531|GA|WOODBINE|31569|1|13|CAMDEN|912
+27532|GA|JESUP|31598|1|13|WAYNE|912
+27533|GA|JESUP|31599|1|13|WAYNE|912
+27534|GA|FEDERAL CORRECTIONAL INST|31599|0|13||
+27535|GA|VALDOSTA|31601|1|13|LOWNDES|229
+27536|GA|CLYATTVILLE|31601|0|13||
+27537|GA|DASHER|31601|0|13||
+27538|GA|REMERTON|31601|0|13||
+27539|GA|VALDOSTA|31602|1|13|LOWNDES|229
+27540|GA|VALDOSTA|31603|1|13|LOWNDES|229
+27541|GA|VALDOSTA|31604|1|13|LOWNDES|229
+27542|GA|VALDOSTA|31605|1|13|LOWNDES|229
+27543|GA|BEMISS|31605|0|13||
+27544|GA|VALDOSTA|31606|1|13|LOWNDES|229
+27545|GA|ADEL|31620|1|13|COOK|229
+27546|GA|ALAPAHA|31622|1|13|BERRIEN|229
+27547|GA|ARGYLE|31623|1|13|CLINCH|912
+27548|GA|AXSON|31624|1|13|ATKINSON|912
+27549|GA|BARNEY|31625|1|13|BROOKS|229
+27550|GA|BOSTON|31626|1|13|THOMAS|229
+27551|GA|CECIL|31627|1|13|COOK|229
+27552|GA|DIXIE|31629|1|13|BROOKS|229
+27553|GA|DU PONT|31630|1|13|CLINCH|912
+27554|GA|FARGO|31631|1|13|CLINCH|912
+27555|GA|HAHIRA|31632|1|13|LOWNDES|229
+27556|GA|HOMERVILLE|31634|1|13|CLINCH|912
+27557|GA|COGDELL|31634|0|13||
+27558|GA|LAKELAND|31635|1|13|LANIER|229
+27559|GA|LAKE PARK|31636|1|13|LOWNDES|229
+27560|GA|LAKEPARK|31636|0|13||
+27561|GA|LENOX|31637|1|13|COOK|229
+27562|GA|EL DORADO|31637|0|13||
+27563|GA|MORVEN|31638|1|13|BROOKS|229
+27564|GA|NASHVILLE|31639|1|13|BERRIEN|229
+27565|GA|NAYLOR|31641|1|13|LOWNDES|229
+27566|GA|PEARSON|31642|1|13|ATKINSON|912
+27567|GA|QUITMAN|31643|1|13|BROOKS|229
+27568|GA|RAY CITY|31645|1|13|BERRIEN|229
+27569|GA|SPARKS|31647|1|13|COOK|229
+27570|GA|STATENVILLE|31648|1|13|ECHOLS|229
+27571|GA|STOCKTON|31649|1|13|LANIER|229
+27572|GA|WILLACOOCHEE|31650|1|13|ATKINSON|912
+27573|GA|VALDOSTA|31698|1|13|LOWNDES|229
+27574|GA|VALDOSTA STATE COLLEGE|31698|0|13||
+27575|GA|MOODY A F B|31699|1|13|LOWNDES|229
+27576|GA|MOODY AFB|31699|0|13||
+27577|GA|MOODY AIR FORCE BASE|31699|0|13||
+27578|GA|ALBANY|31701|1|13|DOUGHERTY|229
+27579|GA|ALBANY|31702|1|13|DOUGHERTY|229
+27580|GA|ALBANY|31703|1|13|DOUGHERTY|229
+27581|GA|ALBANY|31704|1|13|DOUGHERTY|229
+27582|GA|MARINE CORPS LOGISTICS BASE|31704|0|13||
+27583|GA|ALBANY|31705|1|13|DOUGHERTY|229
+27584|GA|BRIDGEBORO|31705|0|13||
+27585|GA|RADIUM SPRINGS|31705|0|13||
+27586|GA|ALBANY|31706|1|13|DOUGHERTY|229
+27587|GA|ALBANY|31707|1|13|DOUGHERTY|229
+27588|GA|ALBANY|31708|1|13|DOUGHERTY|229
+27589|GA|AMERICUS|31709|1|13|SUMTER|229
+27590|GA|AMERICUS|31710|1|13|SUMTER|229
+27591|GA|TOG SHOP|31710|0|13||
+27592|GA|ANDERSONVILLE|31711|1|13|SUMTER|229
+27593|GA|ARABI|31712|1|13|CRISP|229
+27594|GA|ASHBURN|31714|1|13|TURNER|229
+27595|GA|BACONTON|31716|1|13|MITCHELL|229
+27596|GA|AMERICUS|31719|1|13|SUMTER|229
+27597|GA|BARWICK|31720|1|13|BROOKS|229
+27598|GA|ALBANY|31721|1|13|DOUGHERTY|229
+27599|GA|BERLIN|31722|1|13|COLQUITT|229
+27600|GA|BROOKFIELD|31727|1|13|TIFT|229
+27601|GA|CAMILLA|31730|1|13|MITCHELL|229
+27602|GA|CHULA|31733|1|13|TIFT|229
+27603|GA|COBB|31735|1|13|SUMTER|229
+27604|GA|COOLIDGE|31738|1|13|THOMAS|229
+27605|GA|COTTON|31739|1|13|MITCHELL|912
+27606|GA|DE SOTO|31743|1|13|SUMTER|229
+27607|GA|DOERUN|31744|1|13|COLQUITT|229
+27608|GA|ELLENTON|31747|1|13|COLQUITT|229
+27609|GA|ENIGMA|31749|1|13|BERRIEN|229
+27610|GA|FITZGERALD|31750|1|13|BEN HILL|229
+27611|GA|FUNSTON|31753|1|13|COLQUITT|229
+27612|GA|HARTSFIELD|31756|1|13|COLQUITT|229
+27613|GA|HARTVILLE|31756|0|13||
+27614|GA|THOMASVILLE|31757|1|13|THOMAS|229
+27615|GA|TVILLE|31757|0|13||
+27616|GA|THOMASVILLE|31758|1|13|THOMAS|229
+27617|GA|TVILLE|31758|0|13||
+27618|GA|IRWINVILLE|31760|1|13|IRWIN|229
+27619|GA|LEESBURG|31763|1|13|LEE|229
+27620|GA|LESLIE|31764|1|13|SUMTER|229
+27621|GA|MEIGS|31765|1|13|THOMAS|229
+27622|GA|HINSONTON|31765|0|13||
+27623|GA|MOULTRIE|31768|1|13|COLQUITT|229
+27624|GA|MOULTRIE MUNICIPAL AIRPORT|31768|0|13||
+27625|GA|MYSTIC|31769|1|13|IRWIN|229
+27626|GA|NORMAN PARK|31771|1|13|COLQUITT|229
+27627|GA|OAKFIELD|31772|1|13|WORTH|229
+27628|GA|OCHLOCKNEE|31773|1|13|THOMAS|229
+27629|GA|OCILLA|31774|1|13|IRWIN|229
+27630|GA|OMEGA|31775|1|13|TIFT|229
+27631|GA|MOULTRIE|31776|1|13|COLQUITT|229
+27632|GA|PAVO|31778|1|13|THOMAS|229
+27633|GA|PELHAM|31779|1|13|MITCHELL|229
+27634|GA|PLAINS|31780|1|13|SUMTER|229
+27635|GA|POULAN|31781|1|13|WORTH|229
+27636|GA|PUTNEY|31782|1|13|DOUGHERTY|229
+27637|GA|REBECCA|31783|1|13|TURNER|229
+27638|GA|SALE CITY|31784|1|13|MITCHELL|229
+27639|GA|SMITHVILLE|31787|1|13|LEE|229
+27640|GA|MOULTRIE|31788|1|13|COLQUITT|229
+27641|GA|SUMNER|31789|1|13|WORTH|229
+27642|GA|SYCAMORE|31790|1|13|TURNER|229
+27643|GA|SYLVESTER|31791|1|13|WORTH|229
+27644|GA|THOMASVILLE|31792|1|13|THOMAS|229
+27645|GA|GATEWAY|31792|0|13||
+27646|GA|METCALF|31792|0|13||
+27647|GA|TVILLE|31792|0|13||
+27648|GA|TIFTON|31793|1|13|TIFT|229
+27649|GA|TIFTON|31794|1|13|TIFT|229
+27650|GA|ABRAHAM BALDWIN COLLEGE CPO|31794|0|13||
+27651|GA|TY TY|31795|1|13|TIFT|229
+27652|GA|TYTY|31795|0|13||
+27653|GA|WARWICK|31796|1|13|WORTH|229
+27654|GA|WRAY|31798|1|13|IRWIN|229
+27655|GA|THOMASVILLE|31799|1|13|THOMAS|229
+27656|GA|TVILLE|31799|0|13||
+27657|GA|BOX SPRINGS|31801|1|13|TALBOT|706
+27658|GA|JUNIPER|31801|0|13||
+27659|GA|BUENA VISTA|31803|1|13|MARION|229
+27660|GA|TAZEWELL|31803|0|13||
+27661|GA|CATAULA|31804|1|13|HARRIS|706
+27662|GA|CUSSETA|31805|1|13|CHATTAHOOCHEE|706
+27663|GA|ELLAVILLE|31806|1|13|SCHLEY|229
+27664|GA|ELLERSLIE|31807|1|13|HARRIS|706
+27665|GA|FORTSON|31808|1|13|MUSCOGEE|706
+27666|GA|GENEVA|31810|1|13|TALBOT|706
+27667|GA|HAMILTON|31811|1|13|HARRIS|706
+27668|GA|JUNCTION CITY|31812|1|13|TALBOT|706
+27669|GA|LOUVALE|31814|1|13|STEWART|229
+27670|GA|LUMPKIN|31815|1|13|STEWART|229
+27671|GA|MANCHESTER|31816|1|13|MERIWETHER|706
+27672|GA|MIDLAND|31820|1|13|MUSCOGEE|706
+27673|GA|OMAHA|31821|1|13|STEWART|229
+27674|GA|PINE MOUNTAIN|31822|1|13|HARRIS|706
+27675|GA|PINE MOUNTAIN VALLEY|31823|1|13|HARRIS|706
+27676|GA|PRESTON|31824|1|13|WEBSTER|229
+27677|GA|RICHLAND|31825|1|13|STEWART|229
+27678|GA|SHILOH|31826|1|13|HARRIS|706
+27679|GA|TALBOTTON|31827|1|13|TALBOT|706
+27680|GA|UPATOI|31829|1|13|MUSCOGEE|706
+27681|GA|COLUMBUS|31829|0|13||
+27682|GA|WARM SPRINGS|31830|1|13|MERIWETHER|706
+27683|GA|WAVERLY HALL|31831|1|13|HARRIS|706
+27684|GA|WESTON|31832|1|13|WEBSTER|229
+27685|GA|WEST POINT|31833|1|13|TROUP|706
+27686|GA|WOODLAND|31836|1|13|TALBOT|706
+27687|GA|COLUMBUS|31901|1|13|MUSCOGEE|706
+27688|GA|COLS|31901|0|13||
+27689|GA|COLUMBUS|31902|1|13|MUSCOGEE|706
+27690|GA|COLS|31902|0|13||
+27691|GA|COLUMBUS|31903|1|13|MUSCOGEE|706
+27692|GA|COLS|31903|0|13||
+27693|GA|COLUMBUS|31904|1|13|MUSCOGEE|706
+27694|GA|BEALLWOOD|31904|0|13||
+27695|GA|COLS|31904|0|13||
+27696|GA|FORT BENNING|31905|1|13|MUSCOGEE|706
+27697|GA|CAMP ROGERS|31905|0|13||
+27698|GA|COLS|31905|0|13||
+27699|GA|COLUMBUS|31905|0|13||
+27700|GA|COLUMBUS|31906|1|13|MUSCOGEE|706
+27701|GA|COLS|31906|0|13||
+27702|GA|COLUMBUS|31907|1|13|MUSCOGEE|706
+27703|GA|COLS|31907|0|13||
+27704|GA|COLUMBUS|31908|1|13|MUSCOGEE|706
+27705|GA|COL|31908|0|13||
+27706|GA|COLS|31908|0|13||
+27707|GA|COLUMBUS|31909|1|13|MUSCOGEE|706
+27708|GA|COLS|31909|0|13||
+27709|GA|COLUMBUS|31914|1|13|MUSCOGEE|706
+27710|GA|COLS|31914|0|13||
+27711|GA|COLUMBUS|31917|1|13|MUSCOGEE|706
+27712|GA|COLS|31917|0|13||
+27713|GA|COLUMBUS|31993|1|13|MUSCOGEE|706
+27714|GA|COLUMBUS BRM|31993|0|13||
+27715|GA|COLUMBUS|31994|1|13|MUSCOGEE|706
+27716|GA|FORT BENNING|31995|1|13|MUSCOGEE|706
+27717|GA|COLS|31995|0|13||
+27718|GA|COLUMBUS|31995|0|13||
+27719|GA|COLUMBUS|31997|1|13|MUSCOGEE|706
+27720|GA|AT&T UNIVERSAL CARD SERVICE|31997|0|13||
+27721|GA|COLUMBUS|31998|1|13|MUSCOGEE|706
+27722|GA|AMER FAM LIFE INS BRM|31998|0|13||
+27723|GA|COLUMBUS|31999|1|13|MUSCOGEE|706
+27724|GA|AMERICAN FAMILY LIFE INS|31999|0|13||
+34618|GA|ARLINGTON|39813|1|13|CALHOUN|229
+34619|GA|ATTAPULGUS|39815|1|13|DECATUR|229
+34620|GA|BAINBRIDGE|39817|1|13|DECATUR|229
+34621|GA|BDGE|39817|0|13||
+34622|GA|WEST BAINBRIDGE|39817|0|13||
+34623|GA|BAINBRIDGE|39818|1|13|DECATUR|229
+34624|GA|BDGE|39818|0|13||
+34625|GA|BAINBRIDGE|39819|1|13|DECATUR|229
+34626|GA|BDGE|39819|0|13||
+34627|GA|BLAKELY|39823|1|13|EARLY|229
+34628|GA|BLUFFTON|39824|1|13|CLAY|229
+34629|GA|BRINSON|39825|1|13|DECATUR|229
+34630|GA|BRONWOOD|39826|1|13|TERRELL|229
+34631|GA|CAIRO|39827|1|13|GRADY|229
+34632|GA|CARIO|39827|0|13||
+34633|GA|KARO|39827|0|13||
+34634|GA|CAIRO|39828|1|13|GRADY|229
+34635|GA|CARIO|39828|0|13||
+34636|GA|KARO|39828|0|13||
+34637|GA|CALVARY|39829|1|13|GRADY|229
+34638|GA|CEDAR SPRINGS|39832|1|13|EARLY|229
+34639|GA|CLIMAX|39834|1|13|DECATUR|229
+34640|GA|COLEMAN|39836|1|13|RANDOLPH|229
+34641|GA|COLQUITT|39837|1|13|MILLER|229
+34642|GA|CUTHBERT|39840|1|13|RANDOLPH|229
+34643|GA|DAMASCUS|39841|1|13|EARLY|229
+34644|GA|DAWSON|39842|1|13|TERRELL|229
+34645|GA|DONALSONVILLE|39845|1|13|SEMINOLE|229
+34646|GA|DVILLE|39845|0|13||
+34647|GA|EDISON|39846|1|13|CALHOUN|229
+34648|GA|FORT GAINES|39851|1|13|CLAY|229
+34649|GA|FOWLSTOWN|39852|1|13|DECATUR|229
+34650|GA|GEORGETOWN|39854|1|13|QUITMAN|229
+34651|GA|IRON CITY|39859|1|13|SEMINOLE|229
+34652|GA|JAKIN|39861|1|13|EARLY|229
+34653|GA|LEARY|39862|1|13|CALHOUN|229
+34654|GA|MORGAN|39866|1|13|CALHOUN|229
+34655|GA|MORRIS|39867|1|13|QUITMAN|229
+34656|GA|NEWTON|39870|1|13|BAKER|912
+34657|GA|PARROTT|39877|1|13|TERRELL|229
+34658|GA|SASSER|39885|1|13|TERRELL|229
+34659|GA|SHELLMAN|39886|1|13|RANDOLPH|229
+34660|GA|WHIGHAM|39897|1|13|GRADY|229
+34661|GA|ATLANTA|39901|1|13|DEKALB|404/770
+34662|GA|IRS SERVICE CENTER|39901|0|13||
diff --git a/Open-ILS/examples/pines-examples/utility-server/scripts/circ_notices.sh b/Open-ILS/examples/pines-examples/utility-server/scripts/circ_notices.sh
new file mode 100755 (executable)
index 0000000..de3b6f1
--- /dev/null
@@ -0,0 +1,49 @@
+#!/bin/bash
+# ---------------------------------------------------------------
+# This file runs the overdue generation script.
+# If today is Monday, it runs the script for Sat/Sun/Mon, 
+# otherwise it runs once per day.
+# ---------------------------------------------------------------
+
+DATE=$(date +%Y-%m-%d);
+DAY=$(date +%u);
+XML_FILE="/openils/var/data/overdue/overdue.$DATE.xml";
+EMAIL_FILE="/openils/var/data/overdue/combined_email.$DATE.txt";
+PREMAIL_FILE="/openils/var/data/overdue/predue_email.$DATE.txt";
+REMOTE_HOST="sftp.example.com:files/"
+
+[ $(whoami) != "opensrf" ] && echo "Must be run as opensrf" && exit 1;
+source /etc/profile;
+
+cd /openils/bin/
+
+ARGS="0"
+
+# PREDUES + EMAIL
+./generate_circ_notices.pl --osrf_config /openils/conf/opensrf_core.xml --notice-types predue --use-email-outfile $PREMAIL_FILE --send-email --days-back $ARGS;
+
+[ $DAY == 6 -o $DAY == 7 ] && exit 0; # don't run overdues on saturday or sunday
+if [ $DAY == 1 ]; then ARGS="0,1,2"; fi; # If today is monday, run for sat/sun/mon
+
+# ALL, NO EMAIL
+#./generate_circ_notices.pl --osrf_config /openils/conf/opensrf_core.xml --notice-types overdue,predue --use-email-outfile $EMAIL_FILE --generate-global-templates --days-back $ARGS > $XML_FILE;
+
+# OVERDUES, NO EMAIL
+#./generate_circ_notices.pl --osrf_config /openils/conf/opensrf_core.xml --notice-types overdue --use-email-outfile /dev/null --generate-global-templates --days-back $ARGS > $XML_FILE;
+
+# ALL + EMAIL
+#./generate_circ_notices.pl --osrf_config /openils/conf/opensrf_core.xml --notice-types overdue,predue --use-email-outfile $EMAIL_FILE --generate-global-templates --send-email --days-back $ARGS > $XML_FILE;
+
+
+# --- overdues first, then predues
+
+# OVERDUES + EMAIL
+#./generate_circ_notices.pl --osrf_config /openils/conf/opensrf_core.xml --notice-types overdue --use-email-outfile $EMAIL_FILE --generate-global-templates --send-email --days-back $ARGS > $XML_FILE;
+./generate_circ_notices.pl --osrf_config /openils/conf/opensrf_core.xml --notice-types overdue --use-email-outfile $EMAIL_FILE --generate-global-templates --days-back $ARGS > $XML_FILE;
+
+# PREDUES + EMAIL
+#./generate_circ_notices.pl --osrf_config /openils/conf/opensrf_core.xml --notice-types predue --use-email-outfile $EMAIL_FILE --send-email --days-back $ARGS;
+
+#scp $XML_FILE home.unique-mgmt.com:~/
+scp $XML_FILE $REMOTE_HOST 
+
diff --git a/Open-ILS/examples/pines-examples/utility-server/scripts/circ_notices_overdue_nomail.sh b/Open-ILS/examples/pines-examples/utility-server/scripts/circ_notices_overdue_nomail.sh
new file mode 100755 (executable)
index 0000000..e66bd1e
--- /dev/null
@@ -0,0 +1,25 @@
+#!/bin/bash
+# ---------------------------------------------------------------
+# This file runs the overdue generation script.
+# If today is Monday, it runs the script for Sat/Sun/Mon, 
+# otherwise it runs once per day.
+# ---------------------------------------------------------------
+
+DATE=$(date +%Y-%m-%d);
+DAY=$(date +%u);
+XML_FILE="/openils/var/data/overdue/overdue.$DATE.xml";
+EMAIL_FILE="/openils/var/data/overdue/combined_email.$DATE.txt";
+
+[ $(whoami) != "opensrf" ] && echo "Must be run as opensrf" && exit 1;
+source /etc/profile;
+
+ARGS="0"
+[ $DAY == 6 -o $DAY == 7 ] && exit 0; # don't run on saturday or sunday
+if [ $DAY == 1 ]; then ARGS="0,1,2"; fi; # If today is monday, run for sat/sun/mon
+
+cd /openils/bin/
+
+# OVERDUES, NO EMAIL
+./generate_circ_notices.pl --osrf_config /openils/conf/opensrf_core.xml --notice-types overdue --generate-global-templates --days-back $ARGS > $XML_FILE;
+
+scp $XML_FILE home.unique-mgmt.com:~/
diff --git a/Open-ILS/examples/pines-examples/utility-server/scripts/gen_blocked_list.sh b/Open-ILS/examples/pines-examples/utility-server/scripts/gen_blocked_list.sh
new file mode 100755 (executable)
index 0000000..be99fc2
--- /dev/null
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+. /etc/profile
+cd /home/opensrf/scripts;\
+
+DATE=$(date +%Y-%m-%d);
+FILE="/openils/var/data/offline/blocked/patron-blocked-list.$DATE.txt"
+HOSTNAME="private.utility01.gapines.org"
+HEADS="'10.1.0.201' '10.1.0.202' '10.1.0.203' '10.1.0.204' '10.1.0.205' '10.1.0.206'"
+
+
+#/openils/bin/offline-blocked-list.pl /home/opensrf/.srfsh.xml srfsh  > $FILE
+/openils/bin/offline-blocked-list.pl --hostname $HOSTNAME --barcodes L --barcodes B --barcodes D > $FILE
+
+for host in $HEADS; do
+    scp "$FILE" "opensrf@$host:/openils/var/web/standalone/list.txt";
+done;
diff --git a/Open-ILS/examples/pines-examples/utility-server/scripts/run-collections.sh b/Open-ILS/examples/pines-examples/utility-server/scripts/run-collections.sh
new file mode 100755 (executable)
index 0000000..a8497aa
--- /dev/null
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+DATE=$(date +%Y-%m-%d);
+DIR="collections-$DATE"
+LIBS="ARL ECGR NCLS HALL OHOOP HCLS LEE RML SJRLS TLLS DCPL STRL ROCK HOU CRLS SHRL TCPLS TRRL CPRL WORTH PMRLS CLAYTN"
+USRNAME="myusername"
+PASSWD="mypass"
+REMOTE_HOST="sftp.example.com:files/"
+
+cd ums;
+mkdir $DIR
+
+for lib in $LIBS; do
+    ./run-calls.pl /openils/conf/opensrf_core.xml $USRNAME $PASSWD $lib
+    mv data-$lib $DIR/
+done;
+
+tar cvf $DIR.tar $DIR
+gzip $DIR.tar
+
+echo "scping $DIR.tar.gz...";
+scp $DIR.tar.gz $REMOTE_HOST
+
diff --git a/Open-ILS/examples/pines-examples/utility-server/scripts/ums/run-calls.pl b/Open-ILS/examples/pines-examples/utility-server/scripts/ums/run-calls.pl
new file mode 100755 (executable)
index 0000000..c29d03e
--- /dev/null
@@ -0,0 +1,31 @@
+#!/usr/bin/perl
+use strict; use warnings;
+use OpenSRF::AppSession;
+use OpenSRF::System;
+use OpenSRF::Utils::JSON;
+require '/home/opensrf/current/Open-ILS/src/support-scripts/oils_header.pl';
+use vars qw/$authtoken/;
+
+my $days_back = 15;
+my $fine_limit = '4.99';
+my $method = 'open-ils.collections.users_of_interest.retrieve';
+
+
+die "usage: $0 <config> <username> <password> <lib>" unless $ARGV[3];
+osrf_connect($ARGV[0]);
+oils_login($ARGV[1], $ARGV[2]);
+my $lib = $ARGV[3];
+
+my $ses = OpenSRF::AppSession->create('open-ils.collections');
+my $req = $ses->request($method, $authtoken, $days_back, $fine_limit, $lib);
+my @data;
+
+while(my $resp = $req->recv(timeout=>7200)) {
+       push(@data, $resp->content);    
+}
+
+open(F, ">data-$lib");
+print F OpenSRF::Utils::JSON->perl2JSON(\@data);
+close(F);
+
+
diff --git a/Open-ILS/examples/templates/overdue_combined_xml_pines.example b/Open-ILS/examples/templates/overdue_combined_xml_pines.example
new file mode 100644 (file)
index 0000000..6353345
--- /dev/null
@@ -0,0 +1,65 @@
+[% USE date -%]
+<?xml version='1.0' encoding='UTF-8'?>
+<file type="notice" date="[% date.format(date.now,'%Y-%m-%d') %]" time="[% date.format(date.now, '%H:%M:%S') %]">
+    [%- FOREACH circ_set = overdues %]
+        [%- SET user = circ_set.circ_list.0.usr -%]
+        [%- SET lib = circ_set.circ_list.0.circ_lib -%]
+        [%- SET user_addr = user.mailing_address -%]
+        [%- IF !user_addr or user_addr.valid == 'f' -%]
+                [%- SET user_addr = user.billing_address -%]
+        [%- END %]
+        [%- SET lib_addr = lib.mailing_address -%]
+        [%- IF !lib_addr -%]
+                [%- SET lib_addr = lib.billing_address -%]
+        [%- END -%]
+    <notice type='overdue' notify_interval='[% circ_set.notice.notify_interval %]'>
+        <patron>
+            <barcode>[% user.card.barcode %]</barcode>
+            <first_given_name>[% user.first_given_name %]</first_given_name>
+            <family_name>[% user.family_name %]</family_name>
+           [% IF !user_addr %]
+               <addr_valid>false</addr_valid>
+        [% ELSE %]
+               [% IF user_addr.valid == 'f' %]
+                <addr_valid>false</addr_valid>
+            [% ELSE %]
+                <addr_valid>true</addr_valid>
+            [% END %]
+            <addr_street1>[% escape_xml(user_addr.street1) %]</addr_street1>
+            <addr_street2>[% escape_xml(user_addr.street2) %]</addr_street2>
+            <addr_city>[% escape_xml(user_addr.city) %]</addr_city>
+            <addr_state>[% user_addr.state %]</addr_state>
+            <addr_post_code>[% user_addr.post_code %]</addr_post_code>
+        [% END %]
+            <email>[% user.email %]</email>
+            <day_phone>[% user.day_phone %]</day_phone>
+            <evening_phone>[% user.evening_phone %]</evening_phone>
+            <other_phone>[% user.other_phone %]</other_phone>
+            <sys_id>[% user.id %]</sys_id>
+        </patron>
+        <location>
+            <name>[% escape_xml(lib.name) %]</name>
+            <code>[% lib.shortname %]</name>
+            <phone>[% lib.phone %]</phone>
+            <addr_street1>[% escape_xml(lib_addr.street1) %]</addr_street1>
+            <addr_street2>[% escape_xml(lib_addr.street2) %]</addr_street2>
+            <addr_city>[% escape_xml(lib_addr.city) %]</addr_city>
+            <addr_state>[% lib_addr.state %]</addr_state>
+            <addr_post_code>[% lib_addr.post_code %]</addr_post_code>
+            <email>[% lib.email %]</email>
+            <sys_id>[% lib.id %]</sys_id>
+        </location>
+        [%- FOREACH circ = circ_set.circ_list %]
+            [%- SET due_date = parse_due_date(circ) %]
+        <item>
+            <title>[% escape_xml(get_bib_attr(circ, 'title')) %]</title>
+            <author>[% escape_xml(get_bib_attr(circ, 'author')) %]</author>
+            <due_date>[% date.format(due_date, '%Y-%m-%d') %]</due_date>
+            <call_number>[% escape_xml(circ.target_copy.call_number.label) %]</call_number>
+            <barcode>[% escape_xml(circ.target_copy.barcode) %]</barcode>
+            <circ_id>[% circ.id %]</circ_id>
+        </item>
+        [%- END %]
+    </notice>
+    [%- END %]
+</file>
diff --git a/Open-ILS/src/sql/Pg/pines-1.6-2.1-upgrade.sh b/Open-ILS/src/sql/Pg/pines-1.6-2.1-upgrade.sh
new file mode 100644 (file)
index 0000000..9dab966
--- /dev/null
@@ -0,0 +1,37 @@
+#!/bin/bash
+#
+# Copyright (C) 2011 Georgia Public Library Service
+# Chris Sharp <csharp@georgialibraries.org>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+
+# before running, create the evergreen user and evergreen database; 
+# as the postgres OS user:
+# createuser -s -P evergreen
+# 
+
+PGUSER=evergreen
+
+# tell syslog that we're beginning the process
+echo "Beginning the 1.6.1-2.1 upgrade script"
+logger Beginning the 1.6.1-2.1 upgrade script.
+
+# Run the pre-1.6.1-2.1 upgrade script to restore the auditor schema as of 1.6.1.8
+# and drop a couple of custom reporter views to be restored after the upgrade
+
+time /usr/bin/psql -f /root/pines/Open-ILS/src/sql/Pg/pines-pre-1.6.1-2.1-upgrade.sql
+logger pines-pre-1.6.1-2.1-upgrade.sql script complete
+
+# Run the 1.6.1-2.0 upgrade script
+
+time /usr/bin/psql -f /root/pines/OpenILS/src/sql/Pg/1.6.1-2.0-upgrade-db.sql
+logger 1.6.1-2.0-upgrade-db.sql script complete
diff --git a/Open-ILS/src/sql/Pg/pines-circ.sql b/Open-ILS/src/sql/Pg/pines-circ.sql
new file mode 100644 (file)
index 0000000..97a9c89
--- /dev/null
@@ -0,0 +1,183 @@
+BEGIN;
+-- add no_fines rules
+INSERT INTO config.rule_max_fine (name, amount, is_percent)  VALUES (
+       'no_fines', '0.00', FALSE);
+INSERT INTO config.rule_recurring_fine (name, high, normal, low, recurrence_interval, grace_period) VALUES (
+       'no_fines', '0.00', '0.00', '0.00', '1 day', '1 day');
+COMMIT;
+
+-- add circ_duration rules
+BEGIN;
+INSERT INTO config.rule_circ_duration (name, extended, normal, shrt, max_renewals) VALUES (
+       '3_months_1_renew', '3 mons', '3 mons', '3 mons', 1);
+INSERT INTO config.rule_circ_duration (name, extended, normal, shrt, max_renewals) VALUES (
+       '1_day_0_renew', '1 day', '1 day', '1 day', 0);
+COMMIT;
+
+-- add PINES circ_modifiers
+BEGIN;
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'art', 'art', 'art', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'atlas', 'atlas', 'atlas', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'audiobook', 'audiobook', 'audiobook', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'av', 'av', 'av', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'bestseller', 'bestseller', 'bestseller', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'bestsellernh', 'bestsellernh', 'bestsellernh', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'book', 'book', 'book', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'cd', 'cd', 'cd', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'computer', 'Computer', 'Fake computer circ mod', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'dvd', 'dvd', 'dvd', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'dvd-long', 'dvd-long', 'dvd-long', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'dvd-mid', 'dvd-mid', 'dvd-mid', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'e-book', 'e-book', 'e-book', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'equip-long', 'equip-long', 'equip-long', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'equipment', 'equipment', 'equipment', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'eventpass', 'eventpass', 'eventpass', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'filmstrip', 'filmstrip', 'filmstrip', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'internet', 'Internet', 'Fake internet circ mod', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'kit', 'kit', 'kit', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'magazine', 'magazine', 'magazine', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'map', 'map', 'map', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'microform', 'microform', 'microform', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'music', 'music', 'music', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'new-av', 'new-av', 'new-av', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'record', 'record', 'record', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'software', 'software', 'software', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'softwrlong', 'softwrlong', 'softwrlong', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'talking book', 'talking book', 'talking book', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'toy', 'toy', 'toy', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'video', 'video', 'video', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'video-long', 'video-long', 'video-long', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'video-mid', 'video-mid', 'video-mid', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'videogame', 'videogame', 'videogame', '001', TRUE);
+INSERT INTO config.circ_modifier (code, name, description, sip2_media_type, magnetic_media) VALUES (
+       'videogamelong', 'videogamelong', 'videogamelong', '001', TRUE);
+COMMIT;
+
+-- add basic circulation policies
+BEGIN;
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, NULL, 'a', NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 10, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, NULL, 't', NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 10, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, NULL, 'g', NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 1, 3, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, NULL, 'k', NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 3, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, NULL, 'r', NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 10, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, NULL, 'o', NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 10, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, NULL, 'p', NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 10, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, NULL, 'e', NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 4, 3, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, NULL, 'f', NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 4, 3, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, NULL, 'c', NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 10, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, NULL, 'd', NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 10, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, NULL, 'i', NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 10, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, NULL, 'j', NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 10, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, NULL, 'm', NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 10, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'atlas', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 7, 3, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'art', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 101, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'audiobook', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 10, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'av', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 7, 3, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'new-av', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 4, 3, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'bestseller', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 7, 3, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'bestsellernh', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 7, 3, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'book', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 10, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'cd', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 10, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'dvd', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 1, 3, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'dvd-long', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 10, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'dvd-mid', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 7, 3, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'e-book', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 4, 3, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'equipment', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 102, 3, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'equip-long', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 4, 3, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'filmstrip', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 10, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'kit', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 10, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'internet', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 8, 101, 101, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'magazine', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 10, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'map', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 4, 3, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'microform', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 10, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'music', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 10, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'record', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 10, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'software', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 7, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'softwrlong', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 10, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'videogame', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 7, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'videogamelong', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 10, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'talking book', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 10, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'video', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 1, 3, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'toy', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 10, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'video-long', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 10, 2, 3, NULL);
+INSERT INTO config.circ_matrix_matchpoint (id, active, org_unit, grp, circ_modifier, marc_type, marc_form, marc_vr_format, ref_flag, juvenile_flag, is_renewal, usr_age_lower_bound, usr_age_upper_bound, circulate, duration_rule, recurring_fine_rule, max_fine_rule, script_test) VALUES (
+       DEFAULT, TRUE, 1, 1, 'video-mid', NULL, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, TRUE, 7, 3, 3, NULL);
+COMMIT;
diff --git a/Open-ILS/src/sql/Pg/pines-post-1.6.1-2.1-upgrade.sql b/Open-ILS/src/sql/Pg/pines-post-1.6.1-2.1-upgrade.sql
new file mode 100644 (file)
index 0000000..1a140d7
--- /dev/null
@@ -0,0 +1,72 @@
+
+-- restore the reporter views we had to drop for the upgrade scripts to work.
+
+-- View: reporter.classic_current_billing_summary
+
+-- DROP VIEW reporter.classic_current_billing_summary;
+
+CREATE OR REPLACE VIEW reporter.classic_current_billing_summary AS 
+ SELECT x.id, x.usr, bl.shortname AS billing_location_shortname, bl.name AS billing_location_name, x.billing_location, c.barcode, u.home_ou AS usr_home_ou, ul.shortname AS usr_home_ou_shortname, ul.name AS usr_home_ou_name, x.xact_start, x.xact_finish, x.xact_type, x.total_paid, x.total_owed, x.balance_owed, x.last_payment_ts, x.last_payment_note, x.last_payment_type, x.last_billing_ts, x.last_billing_note, x.last_billing_type, paddr.county AS patron_county, paddr.city AS patron_city, paddr.post_code AS patron_zip, g.name AS profile_group, dem.general_division AS demographic_general_division
+   FROM money.open_billable_xact_summary x
+   JOIN actor.org_unit bl ON x.billing_location = bl.id
+   JOIN actor.usr u ON u.id = x.usr
+   JOIN actor.org_unit ul ON u.home_ou = ul.id
+   JOIN actor.card c ON u.card = c.id
+   JOIN permission.grp_tree g ON u.profile = g.id
+   JOIN reporter.demographic dem ON dem.id = u.id
+   JOIN actor.usr_address paddr ON paddr.id = u.billing_address;
+
+ALTER TABLE reporter.classic_current_billing_summary OWNER TO postgres;
+GRANT ALL ON TABLE reporter.classic_current_billing_summary TO postgres;
+GRANT SELECT, REFERENCES, TRIGGER ON TABLE reporter.classic_current_billing_summary TO public;
+
+
+
+-- View: reporter.classic_current_circ
+
+-- DROP VIEW reporter.classic_current_circ;
+
+CREATE OR REPLACE VIEW reporter.classic_current_circ AS 
+ SELECT cl.shortname AS circ_lib, cl.id AS circ_lib_id, circ.xact_start, circ_type.type AS circ_type, cp.id AS copy_id, cp.circ_modifier, ol.shortname AS owning_lib_name, lm.value AS language, lfm.value AS lit_form, ifm.value AS item_form, itm.value AS item_type, sl.name AS shelving_location, p.id AS patron_id, g.name AS profile_group, dem.general_division AS demographic_general_division, circ.id, cn.id AS call_number, cn.label AS call_number_label, call_number_dewey(cn.label) AS dewey, 
+        CASE
+            WHEN call_number_dewey(cn.label) ~ '^[0-9.]+$'::text THEN btrim(to_char(10::double precision * floor(call_number_dewey(cn.label)::double precision / 10::double precision), '000'::text))
+            ELSE NULL::text
+        END AS dewey_block_tens, 
+        CASE
+            WHEN call_number_dewey(cn.label) ~ '^[0-9.]+$'::text THEN btrim(to_char(100::double precision * floor(call_number_dewey(cn.label)::double precision / 100::double precision), '000'::text))
+            ELSE NULL::text
+        END AS dewey_block_hundreds, 
+        CASE
+            WHEN call_number_dewey(cn.label) ~ '^[0-9.]+$'::text THEN (btrim(to_char(10::double precision * floor(call_number_dewey(cn.label)::double precision / 10::double precision), '000'::text)) || '-'::text) || btrim(to_char(10::double precision * floor(call_number_dewey(cn.label)::double precision / 10::double precision) + 9::double precision, '000'::text))
+            ELSE NULL::text
+        END AS dewey_range_tens, 
+        CASE
+            WHEN call_number_dewey(cn.label) ~ '^[0-9.]+$'::text THEN (btrim(to_char(100::double precision * floor(call_number_dewey(cn.label)::double precision / 100::double precision), '000'::text)) || '-'::text) || btrim(to_char(100::double precision * floor(call_number_dewey(cn.label)::double precision / 100::double precision) + 99::double precision, '000'::text))
+            ELSE NULL::text
+        END AS dewey_range_hundreds, hl.id AS patron_home_lib, hl.shortname AS patron_home_lib_shortname, paddr.county AS patron_county, paddr.city AS patron_city, paddr.post_code AS patron_zip, sc1.stat_cat_entry AS stat_cat_1, sc2.stat_cat_entry AS stat_cat_2, sce1.value AS stat_cat_1_value, sce2.value AS stat_cat_2_value
+   FROM action.circulation circ
+   JOIN reporter.circ_type circ_type ON circ.id = circ_type.id
+   JOIN asset.copy cp ON cp.id = circ.target_copy
+   JOIN asset.copy_location sl ON cp.location = sl.id
+   JOIN asset.call_number cn ON cp.call_number = cn.id
+   JOIN actor.org_unit ol ON cn.owning_lib = ol.id
+   LEFT JOIN metabib.rec_descriptor rd ON rd.record = cn.record
+   JOIN actor.org_unit cl ON circ.circ_lib = cl.id
+   JOIN actor.usr p ON p.id = circ.usr
+   JOIN actor.org_unit hl ON p.home_ou = hl.id
+   JOIN permission.grp_tree g ON p.profile = g.id
+   JOIN reporter.demographic dem ON dem.id = p.id
+   LEFT JOIN actor.usr_address paddr ON paddr.id = p.billing_address
+   LEFT JOIN config.language_map lm ON rd.item_lang = lm.code
+   LEFT JOIN config.lit_form_map lfm ON rd.lit_form = lfm.code
+   LEFT JOIN config.item_form_map ifm ON rd.item_form = ifm.code
+   LEFT JOIN config.item_type_map itm ON rd.item_type = itm.code
+   LEFT JOIN asset.stat_cat_entry_copy_map sc1 ON sc1.owning_copy = cp.id AND sc1.stat_cat = 1
+   LEFT JOIN asset.stat_cat_entry sce1 ON sce1.id = sc1.stat_cat_entry
+   LEFT JOIN asset.stat_cat_entry_copy_map sc2 ON sc2.owning_copy = cp.id AND sc2.stat_cat = 2
+   LEFT JOIN asset.stat_cat_entry sce2 ON sce2.id = sc2.stat_cat_entry;
+
+ALTER TABLE reporter.classic_current_circ
+  OWNER TO postgres;
+GRANT ALL ON TABLE reporter.classic_current_circ TO postgres;
+GRANT SELECT, REFERENCES, TRIGGER ON TABLE reporter.classic_current_circ TO public;
diff --git a/Open-ILS/src/sql/Pg/pines-pre-1.6.1-2.1-upgrade.sql b/Open-ILS/src/sql/Pg/pines-pre-1.6.1-2.1-upgrade.sql
new file mode 100644 (file)
index 0000000..ded6b8b
--- /dev/null
@@ -0,0 +1,130 @@
+/* Copyright (C) 2011 Georgia Public Library Service
+ * Chris Sharp <csharp@georgialibraries.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * Parts of this script are taken from other programs - attributions precede each part.
+ */
+
+-- Run this script before proceeding with the 1.6.1-2.1 upgrade script
+
+-- Create auditor functions for 1.6.1:
+
+/* Copyright (C) 2004-2008  Georgia Public Library Service
+ * Copyright (C) 2007-2008  Equinox Software, Inc.
+ * Mike Rylander <miker@esilibrary.com> 
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+DROP SCHEMA auditor CASCADE;
+
+BEGIN;
+
+CREATE SCHEMA auditor;
+
+
+CREATE FUNCTION auditor.create_auditor ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
+BEGIN
+       EXECUTE $$
+                       CREATE SEQUENCE auditor.$$ || sch || $$_$$ || tbl || $$_pkey_seq;
+       $$;
+
+       EXECUTE $$
+                       CREATE TABLE auditor.$$ || sch || $$_$$ || tbl || $$_history (
+                               audit_id        BIGINT                          PRIMARY KEY,
+                               audit_time      TIMESTAMP WITH TIME ZONE        NOT NULL,
+                               audit_action    TEXT                            NOT NULL,
+                               LIKE $$ || sch || $$.$$ || tbl || $$
+                       );
+       $$;
+
+       EXECUTE $$
+                       CREATE FUNCTION auditor.audit_$$ || sch || $$_$$ || tbl || $$_func ()
+                       RETURNS TRIGGER AS $func$
+                       BEGIN
+                               INSERT INTO auditor.$$ || sch || $$_$$ || tbl || $$_history
+                                       SELECT  nextval('auditor.$$ || sch || $$_$$ || tbl || $$_pkey_seq'),
+                                               now(),
+                                               SUBSTR(TG_OP,1,1),
+                                               OLD.*;
+                               RETURN NULL;
+                       END;
+                       $func$ LANGUAGE 'plpgsql';
+       $$;
+
+       EXECUTE $$
+                       CREATE TRIGGER audit_$$ || sch || $$_$$ || tbl || $$_update_trigger
+                               AFTER UPDATE OR DELETE ON $$ || sch || $$.$$ || tbl || $$ FOR EACH ROW
+                               EXECUTE PROCEDURE auditor.audit_$$ || sch || $$_$$ || tbl || $$_func ();
+       $$;
+
+       EXECUTE $$
+                       CREATE VIEW auditor.$$ || sch || $$_$$ || tbl || $$_lifecycle AS
+                               SELECT  -1, now() as audit_time, '-' as audit_action, *
+                                 FROM  $$ || sch || $$.$$ || tbl || $$
+                                       UNION ALL
+                               SELECT  *
+                                 FROM  auditor.$$ || sch || $$_$$ || tbl || $$_history;
+       $$;
+       RETURN TRUE;
+END;
+$creator$ LANGUAGE 'plpgsql';
+
+COMMIT;
+
+-- Create auditor tables from 1.6
+
+/*
+ * Copyright (C) 2004-2008  Georgia Public Library Service
+ * Copyright (C) 2007-2008  Equinox Software, Inc.
+ * Mike Rylander <miker@esilibrary.com> 
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+BEGIN;
+
+SELECT auditor.create_auditor ( 'actor', 'usr' );
+SELECT auditor.create_auditor ( 'actor', 'usr_address' );
+SELECT auditor.create_auditor ( 'actor', 'org_unit' );
+SELECT auditor.create_auditor ( 'biblio', 'record_entry' );
+SELECT auditor.create_auditor ( 'asset', 'call_number' );
+SELECT auditor.create_auditor ( 'asset', 'copy' );
+
+COMMIT;
+
+
+-- These are restored by the post-upgrade PINES sql script.
+
+DROP VIEW reporter.classic_current_billing_summary;
+
+DROP VIEW reporter.classic_current_circ;
+
+
diff --git a/Open-ILS/src/sql/Pg/post-2.0-pre-2.1-tasks.sql b/Open-ILS/src/sql/Pg/post-2.0-pre-2.1-tasks.sql
new file mode 100644 (file)
index 0000000..fe827a3
--- /dev/null
@@ -0,0 +1,7 @@
+-- the 2.0 to 2.1 upgrade script requires that the search path for functions is updated
+-- the script tries to do this itself, but something is not working.
+-- see https://bugs.launchpad.net/evergreen/+bug/881774 for more information
+
+ALTER DATABASE evergreen SET search_path=evergreen, public, pg_catalog;
+
+
diff --git a/Open-ILS/web/opac/images/main_logo-default.jpg b/Open-ILS/web/opac/images/main_logo-default.jpg
new file mode 100644 (file)
index 0000000..633b7a7
Binary files /dev/null and b/Open-ILS/web/opac/images/main_logo-default.jpg differ
diff --git a/Open-ILS/web/opac/images/small_logo-default.jpg b/Open-ILS/web/opac/images/small_logo-default.jpg
new file mode 100644 (file)
index 0000000..7e25855
Binary files /dev/null and b/Open-ILS/web/opac/images/small_logo-default.jpg differ
diff --git a/Open-ILS/xul/staff_client/server/locale/en-US/common_custom.properties b/Open-ILS/xul/staff_client/server/locale/en-US/common_custom.properties
new file mode 100644 (file)
index 0000000..f4323f8
--- /dev/null
@@ -0,0 +1 @@
+staff.circ_modifier.display=%1$s