From 3e3b3c2f01e0e5eb056e46e907d1985e751cb403 Mon Sep 17 00:00:00 2001 From: Chris Sharp Date: Thu, 17 Nov 2011 15:31:14 -0500 Subject: [PATCH] bringing in PINES files --- Open-ILS/examples/apache/startup.pl.orig | 23 + .../examples/pines-examples/homesearch.xml.survey | 117 ++ .../pines-circ/circ_duration.js.example | 85 ++ .../pines-circ/circ_groups.js.example | 114 ++ .../pines-circ/circ_item_config.js.example | 535 +++++++ .../pines-examples/pines-circ/circ_lib.js.example | 315 ++++ .../pines-circ/circ_permit_copy.js.example | 30 + .../pines-circ/circ_permit_hold.js.example | 141 ++ .../pines-circ/circ_permit_patron.js.example | 36 + .../pines-circ/circ_permit_renew.js.example | 20 + .../examples/pines-examples/pines-survey-down.sh | 6 + .../examples/pines-examples/pines-survey-up.sh | 5 + .../examples/pines-examples/pines-zips.txt.example | 1504 ++++++++++++++++++++ .../utility-server/scripts/circ_notices.sh | 49 + .../scripts/circ_notices_overdue_nomail.sh | 25 + .../utility-server/scripts/gen_blocked_list.sh | 17 + .../utility-server/scripts/run-collections.sh | 23 + .../utility-server/scripts/ums/run-calls.pl | 31 + .../templates/overdue_combined_xml_pines.example | 65 + Open-ILS/src/sql/Pg/pines-1.6-2.1-upgrade.sh | 37 + Open-ILS/src/sql/Pg/pines-circ.sql | 183 +++ .../src/sql/Pg/pines-post-1.6.1-2.1-upgrade.sql | 72 + .../src/sql/Pg/pines-pre-1.6.1-2.1-upgrade.sql | 130 ++ Open-ILS/src/sql/Pg/post-2.0-pre-2.1-tasks.sql | 7 + Open-ILS/web/opac/images/main_logo-default.jpg | Bin 0 -> 8571 bytes Open-ILS/web/opac/images/small_logo-default.jpg | Bin 0 -> 6714 bytes .../server/locale/en-US/common_custom.properties | 1 + 27 files changed, 3571 insertions(+) create mode 100755 Open-ILS/examples/apache/startup.pl.orig create mode 100644 Open-ILS/examples/pines-examples/homesearch.xml.survey create mode 100755 Open-ILS/examples/pines-examples/pines-circ/circ_duration.js.example create mode 100755 Open-ILS/examples/pines-examples/pines-circ/circ_groups.js.example create mode 100755 Open-ILS/examples/pines-examples/pines-circ/circ_item_config.js.example create mode 100755 Open-ILS/examples/pines-examples/pines-circ/circ_lib.js.example create mode 100755 Open-ILS/examples/pines-examples/pines-circ/circ_permit_copy.js.example create mode 100755 Open-ILS/examples/pines-examples/pines-circ/circ_permit_hold.js.example create mode 100755 Open-ILS/examples/pines-examples/pines-circ/circ_permit_patron.js.example create mode 100755 Open-ILS/examples/pines-examples/pines-circ/circ_permit_renew.js.example create mode 100755 Open-ILS/examples/pines-examples/pines-survey-down.sh create mode 100755 Open-ILS/examples/pines-examples/pines-survey-up.sh create mode 100644 Open-ILS/examples/pines-examples/pines-zips.txt.example create mode 100755 Open-ILS/examples/pines-examples/utility-server/scripts/circ_notices.sh create mode 100755 Open-ILS/examples/pines-examples/utility-server/scripts/circ_notices_overdue_nomail.sh create mode 100755 Open-ILS/examples/pines-examples/utility-server/scripts/gen_blocked_list.sh create mode 100755 Open-ILS/examples/pines-examples/utility-server/scripts/run-collections.sh create mode 100755 Open-ILS/examples/pines-examples/utility-server/scripts/ums/run-calls.pl create mode 100644 Open-ILS/examples/templates/overdue_combined_xml_pines.example create mode 100644 Open-ILS/src/sql/Pg/pines-1.6-2.1-upgrade.sh create mode 100644 Open-ILS/src/sql/Pg/pines-circ.sql create mode 100644 Open-ILS/src/sql/Pg/pines-post-1.6.1-2.1-upgrade.sql create mode 100644 Open-ILS/src/sql/Pg/pines-pre-1.6.1-2.1-upgrade.sql create mode 100644 Open-ILS/src/sql/Pg/post-2.0-pre-2.1-tasks.sql create mode 100644 Open-ILS/web/opac/images/main_logo-default.jpg create mode 100644 Open-ILS/web/opac/images/small_logo-default.jpg create mode 100644 Open-ILS/xul/staff_client/server/locale/en-US/common_custom.properties diff --git a/Open-ILS/examples/apache/startup.pl.orig b/Open-ILS/examples/apache/startup.pl.orig new file mode 100755 index 0000000000..6f1a74261d --- /dev/null +++ b/Open-ILS/examples/apache/startup.pl.orig @@ -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 +# - 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 index 0000000000..9d72f6ec21 --- /dev/null +++ b/Open-ILS/examples/pines-examples/homesearch.xml.survey @@ -0,0 +1,117 @@ + + + + + + + + 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 index 0000000000..cb113da483 --- /dev/null +++ b/Open-ILS/examples/pines-examples/pines-circ/circ_duration.js.example @@ -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 index 0000000000..6fc2bf1149 --- /dev/null +++ b/Open-ILS/examples/pines-examples/pines-circ/circ_groups.js.example @@ -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 index 0000000000..ceba8e7391 --- /dev/null +++ b/Open-ILS/examples/pines-examples/pines-circ/circ_item_config.js.example @@ -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 index 0000000000..ac3c5d6612 --- /dev/null +++ b/Open-ILS/examples/pines-examples/pines-circ/circ_lib.js.example @@ -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 index 0000000000..5475198478 --- /dev/null +++ b/Open-ILS/examples/pines-examples/pines-circ/circ_permit_copy.js.example @@ -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 index 0000000000..734c5f27f1 --- /dev/null +++ b/Open-ILS/examples/pines-examples/pines-circ/circ_permit_hold.js.example @@ -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 index 0000000000..8b8cd43246 --- /dev/null +++ b/Open-ILS/examples/pines-examples/pines-circ/circ_permit_patron.js.example @@ -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 index 0000000000..f05607b504 --- /dev/null +++ b/Open-ILS/examples/pines-examples/pines-circ/circ_permit_renew.js.example @@ -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 index 0000000000..b3c72f4cb5 --- /dev/null +++ b/Open-ILS/examples/pines-examples/pines-survey-down.sh @@ -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 index 0000000000..f64ac26721 --- /dev/null +++ b/Open-ILS/examples/pines-examples/pines-survey-up.sh @@ -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 index 0000000000..cf28d8cf3a --- /dev/null +++ b/Open-ILS/examples/pines-examples/pines-zips.txt.example @@ -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 index 0000000000..de3b6f1369 --- /dev/null +++ b/Open-ILS/examples/pines-examples/utility-server/scripts/circ_notices.sh @@ -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 index 0000000000..e66bd1efff --- /dev/null +++ b/Open-ILS/examples/pines-examples/utility-server/scripts/circ_notices_overdue_nomail.sh @@ -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 index 0000000000..be99fc21d8 --- /dev/null +++ b/Open-ILS/examples/pines-examples/utility-server/scripts/gen_blocked_list.sh @@ -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 index 0000000000..a8497aae70 --- /dev/null +++ b/Open-ILS/examples/pines-examples/utility-server/scripts/run-collections.sh @@ -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 index 0000000000..c29d03e569 --- /dev/null +++ b/Open-ILS/examples/pines-examples/utility-server/scripts/ums/run-calls.pl @@ -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 " 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 index 0000000000..63533456ec --- /dev/null +++ b/Open-ILS/examples/templates/overdue_combined_xml_pines.example @@ -0,0 +1,65 @@ +[% USE date -%] + + + [%- 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 -%] + + + [% user.card.barcode %] + [% user.first_given_name %] + [% user.family_name %] + [% IF !user_addr %] + false + [% ELSE %] + [% IF user_addr.valid == 'f' %] + false + [% ELSE %] + true + [% END %] + [% escape_xml(user_addr.street1) %] + [% escape_xml(user_addr.street2) %] + [% escape_xml(user_addr.city) %] + [% user_addr.state %] + [% user_addr.post_code %] + [% END %] + [% user.email %] + [% user.day_phone %] + [% user.evening_phone %] + [% user.other_phone %] + [% user.id %] + + + [% escape_xml(lib.name) %] + [% lib.shortname %] + [% lib.phone %] + [% escape_xml(lib_addr.street1) %] + [% escape_xml(lib_addr.street2) %] + [% escape_xml(lib_addr.city) %] + [% lib_addr.state %] + [% lib_addr.post_code %] + [% lib.email %] + [% lib.id %] + + [%- FOREACH circ = circ_set.circ_list %] + [%- SET due_date = parse_due_date(circ) %] + + [% escape_xml(get_bib_attr(circ, 'title')) %] + [% escape_xml(get_bib_attr(circ, 'author')) %] + [% date.format(due_date, '%Y-%m-%d') %] + [% escape_xml(circ.target_copy.call_number.label) %] + [% escape_xml(circ.target_copy.barcode) %] + [% circ.id %] + + [%- END %] + + [%- END %] + 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 index 0000000000..9dab966e96 --- /dev/null +++ b/Open-ILS/src/sql/Pg/pines-1.6-2.1-upgrade.sh @@ -0,0 +1,37 @@ +#!/bin/bash +# +# Copyright (C) 2011 Georgia Public Library Service +# Chris Sharp +# +# 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 index 0000000000..97a9c89564 --- /dev/null +++ b/Open-ILS/src/sql/Pg/pines-circ.sql @@ -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 index 0000000000..1a140d79da --- /dev/null +++ b/Open-ILS/src/sql/Pg/pines-post-1.6.1-2.1-upgrade.sql @@ -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 index 0000000000..ded6b8b073 --- /dev/null +++ b/Open-ILS/src/sql/Pg/pines-pre-1.6.1-2.1-upgrade.sql @@ -0,0 +1,130 @@ +/* Copyright (C) 2011 Georgia Public Library Service + * Chris Sharp + * + * 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 + * + * 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 + * + * 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 index 0000000000..fe827a340d --- /dev/null +++ b/Open-ILS/src/sql/Pg/post-2.0-pre-2.1-tasks.sql @@ -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 index 0000000000000000000000000000000000000000..633b7a75f907159c7f6b19b714aa54e8599ab66b GIT binary patch literal 8571 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 literal 0 HcmV?d00001 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 index 0000000000000000000000000000000000000000..7e2585553abf8ff0dd7b8d1dacee6cd9eacdb66c GIT binary patch literal 6714 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 V23%LDBl9Cho1`O#r2lgEzW}eO=sy4e literal 0 HcmV?d00001 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 index 0000000000..f4323f844f --- /dev/null +++ b/Open-ILS/xul/staff_client/server/locale/en-US/common_custom.properties @@ -0,0 +1 @@ +staff.circ_modifier.display=%1$s -- 2.11.0