Adding our "unmerge" script to ease the correction of patron accounts
authorChris Sharp <csharp@georgialibraries.org>
Wed, 15 Oct 2014 21:19:11 +0000 (17:19 -0400)
committerChris Sharp <csharp@georgialibraries.org>
Wed, 15 Oct 2014 21:19:11 +0000 (17:19 -0400)
merged in error.

patron-merge-tools/unmerge.sh [new file with mode: 0755]

diff --git a/patron-merge-tools/unmerge.sh b/patron-merge-tools/unmerge.sh
new file mode 100755 (executable)
index 0000000..9132633
--- /dev/null
@@ -0,0 +1,196 @@
+#!/bin/bash
+
+#   (C) 2014 Georgia Public Library Service
+#   Chris Sharp <csharp@georgialibraries.org>
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation, either version 3 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.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+#   We found after running our automated patron deduplication program that
+#   several users were merged together in error.  This script is an attempt
+#   to ease the "unmerge" process.  Note that merges are pretty much 
+#   permanent, so this script doesn't fully undo the merge.
+#
+#   Usage: enter the lead patron barcode and merged patron barcode. Get
+#   circ/hold information from the staff client and manually paste in the
+#   ids.  There is not a safe automated way to do that :-/.
+#
+# TODO: Implement this script in Perl using DBI.  In the meantime,
+# make this script more accommodating if there's more than one address
+# that needs to be transferred, or more than one user who got merged 
+# with the same lead user.
+
+PSQL="/usr/bin/psql"
+PSQL_USER="evergreen"
+
+read -p "Please enter the lead patron's barcode: " LEAD_PATRON_BARCODE
+read -p "Please enter the merged patron's barcode: " MERGE_PATRON_BARCODE
+
+read -d '' LEAD_PATRON_SQL <<EOF
+SELECT usr
+FROM actor.card
+WHERE barcode = '$LEAD_PATRON_BARCODE'
+EOF
+
+LEAD_PATRON_ID=`$PSQL -U $PSQL_USER -A -t -c "$LEAD_PATRON_SQL"`
+
+       read -d '' MERGE_PATRON_SQL <<EOF
+SELECT usr
+FROM ums.duplicates_excluding_outreach
+WHERE lead_usr <> usr
+AND lead_usr = $LEAD_PATRON_ID
+EOF
+
+MERGE_PATRON_ID=`$PSQL -U $PSQL_USER -A -t -c "$MERGE_PATRON_SQL"`
+
+read -d '' LEAD_PATRON_HOME_OU_SQL <<EOF
+SELECT shortname
+FROM actor.org_unit
+WHERE id IN (
+       SELECT home_ou
+       FROM actor.usr 
+       WHERE id = $LEAD_PATRON_ID
+)
+EOF
+
+read -d '' MERGE_PATRON_HOME_OU_SQL <<EOF
+SELECT shortname
+FROM actor.org_unit
+WHERE id IN (
+        SELECT home_ou
+        FROM actor.usr 
+        WHERE id = $MERGE_PATRON_ID
+)
+EOF
+
+LEAD_PATRON_HOME_OU=`$PSQL -U $PSQL_USER -A -t -c "$LEAD_PATRON_HOME_OU_SQL"`
+MERGE_PATRON_HOME_OU=`$PSQL -U $PSQL_USER -A -t -c "$MERGE_PATRON_HOME_OU_SQL"`
+
+echo "Lead patron $LEAD_PATRON_BARCODE has ID $LEAD_PATRON_ID and home library $LEAD_PATRON_HOME_OU."
+echo "Merged patron has ID $MERGE_PATRON_ID and home library $MERGE_PATRON_HOME_OU."
+
+read -d '' LEAD_PATRON_ADDRESS_SQL <<EOF
+SELECT *
+FROM actor.usr_address
+WHERE usr = $LEAD_PATRON_ID
+EOF
+
+echo "The following addresses belong to the lead account, but one of them needs to become the address of the soon-to-be unmerged user:"
+echo
+$PSQL -U $PSQL_USER -x -c "$LEAD_PATRON_ADDRESS_SQL"
+echo
+read -p "Please enter the ID for the address that belongs to the merge user: " MERGE_PATRON_ADDRESS_ID
+echo
+read -p "Please enter the IDs (separated by comma and one space) for any circs that need transferring to the unmerged user (Enter for none): " MERGE_PATRON_CIRC_LIST
+echo
+read -p "Please enter the IDs (separated by comma and one space) for any holds that need transferring to the unmerged user (Enter for none): " MERGE_PATRON_HOLD_LIST
+
+read -d '' UPDATE_USR_SQL <<EOF
+UPDATE actor.usr
+        SET deleted = FALSE,
+        alert_message = NULL,
+        card = (
+                SELECT id
+                FROM actor.card
+                WHERE barcode = '$MERGE_PATRON_BARCODE'
+        ),
+        mailing_address = $MERGE_PATRON_ADDRESS_ID,
+        billing_address = $MERGE_PATRON_ADDRESS_ID
+        WHERE id = $MERGE_PATRON_ID
+EOF
+
+read -d '' UPDATE_CARD_SQL <<EOF
+UPDATE actor.card SET usr = $MERGE_PATRON_ID, active = TRUE WHERE barcode = '$MERGE_PATRON_BARCODE'
+EOF
+
+read -d '' UPDATE_ADDRESS_SQL <<EOF
+UPDATE actor.usr_address SET usr = $MERGE_PATRON_ID WHERE id = $MERGE_PATRON_ADDRESS_ID
+EOF
+
+if [ -n "$MERGE_PATRON_CIRC_LIST" ]; then
+read -d '' UPDATE_CIRCS_SQL <<EOF
+UPDATE action.circulation SET usr = $MERGE_PATRON_ID WHERE id IN ( $MERGE_PATRON_CIRC_LIST )
+EOF
+else 
+echo "No circ list given, so not processing any circs."
+fi
+
+if [ -n "$MERGE_PATRON_HOLD_LIST" ]; then
+read -d '' UPDATE_HOLDS_SQL << EOF
+UPDATE action.hold_request SET usr = $MERGE_PATRON_ID where id IN ( $MERGE_PATRON_HOLD_LIST )
+EOF
+else
+echo "No hold list given, so not processing any holds."
+fi
+
+read -d '' INSERT_NOTE_MERGE_USR_SQL <<EOF
+INSERT INTO actor.usr_note (
+        usr,
+        creator,
+        title,
+        value
+) VALUES (
+        $MERGE_PATRON_ID,
+        1,
+        'User mistakenly merged with user $LEAD_PATRON_BARCODE',
+        'During the PINES patron merge, this user was mistakenly matched on first name, last name, and date of birth with another user ($LEAD_PATRON_BARCODE).  We restored the card, address, and any open circulations, holds, or billings to this user''s history.  Please submit a Helpdesk ticket if you have problems - csharp'
+);
+EOF
+
+read -d '' INSERT_NOTE_LEAD_USR_SQL <<EOF
+INSERT INTO actor.usr_note (
+        usr,
+        creator,
+        title,
+        value
+) VALUES (
+        $LEAD_PATRON_ID,
+        1,
+        'User mistakenly merged with user $MERGE_PATRON_BARCODE',
+        'During the PINES patron merge, this user was mistakenly matched on first name, last name, and date of birth with another user ($MERGE_PATRON_BARCODE).  We restored the card, addresses, and any open circulations, holds, or billings to the merged user''s history, but this account will contain any other circulation, billing, or hold history from both accounts.  Please submit a Helpdesk ticket if you have problems - csharp'
+);
+EOF
+
+# uncomment this next block for handy SQL debugging
+
+#echo "Generated SQL Statements:"
+#echo 
+#echo $UPDATE_USR_SQL
+#echo
+#echo $UPDATE_CARD_SQL
+#echo
+#echo $UPDATE_ADDRESS_SQL
+#if [ -n "$UPDATE_CIRCS_SQL" ]; then
+#echo
+#echo $UPDATE_CIRCS_SQL
+#fi
+#if [ -n "$UPDATE_HOLDS_SQL" ]; then
+#echo
+#echo $UPDATE_HOLDS_SQL
+#fi
+#echo 
+#echo $INSERT_NOTE_LEAD_USR_SQL
+#echo
+#echo $INSERT_NOTE_MERGE_USR_SQL
+#
+$PSQL -U $PSQL_USER -c "$UPDATE_USR_SQL"
+$PSQL -U $PSQL_USER -c "$UPDATE_CARD_SQL"
+$PSQL -U $PSQL_USER -c "$UPDATE_ADDRESS_SQL"
+if [ -n "$UPDATE_CIRCS_SQL" ]; then
+$PSQL -U $PSQL_USER -c "$UPDATE_CIRCS_SQL"
+fi
+if [ -n "$UPDATE_HOLDS_SQL" ]; then
+$PSQL -U $PSQL_USER -c "$UPDATE_HOLDS_SQL"
+fi
+$PSQL -U $PSQL_USER -c "$INSERT_NOTE_LEAD_USR_SQL"
+$PSQL -U $PSQL_USER -c "$INSERT_NOTE_MERGE_USR_SQL"