OUS / Erinnerung vor Ablauf der Leihfrist Schematische Darstellung & Scripts / UB Rostock / Stand: 31.08.2011 - v008 1) Schematische Darstellung des Ablaufs Ablaufschritt / Script 1. sybase / crontab 2. hro<ILN>_read_userdat03_start_script hro<ILN>_read_userdat03_result_script Beschreibung > Prozess zur Generierung der Info-Mail wird 1x täglich gestartet > Script ermittelt via SQL-Abfrage hro<ILN>_read_userdat03_usr_sql alle Benutzer, deren Entleihungen in x-Tagen ablaufen > Daraus wird eine ausführbare Datei hro<ILN>_read_userdat03_result_script generiert, die mit Ihrer Ausführung für alle selektierten Benutzer den Text generiert und per E-Mail sendet > Zur Protokollierung wird eine E-Mail an den LBS-Admin gesendet > Script erzeugt zu versendende E-Mails inkl. Titeldaten mit dem SQL-Template hro<ILN>_read_userdat03_text_sql und versendet sie > Dazu wird im SQL-Template die jeweilige address_id_nr des Benutzers eingetragen und per SQL-Abfrage (isql) der Text inkl. der Liste der betreffenden Titel erstellt 2) Ergebnismail Informationsservice Universitätsbibliothek Rostock und Bibliotheken im Ausleihverbund Betreff : Ablauf der Leihfrist Bitte beachten Sie, dass Leihfristen Ihrer Entleihungen in 3 Tagen ablaufen. Liste der betreffenden Medien: -------------------------------------------------------------------------Autor/Titel: Lenz, Hanfried : Grundlagen der Elementarmathematik Barcode/Signatur: 28$002561069 / 28/BB1:SK 110 L575(3) Fällig am: 05-07-10 Verlängerungen: 3 Autor/Titel: Aigner, Martin : Diskrete Mathematik : mit 600 Übungsaufgaben Barcode/Signatur: 28$006090982 / 28/BB1:SK 170 A292(5) Fällig am: 05-07-10 Verlängerungen: 0 Autor/Titel: Basieux, Pierre : Abenteuer Mathematik : Brücken zwischen Wirklichke Barcode/Signatur: 28$005483042 / 28/BB1:SN 100 B311(2) Fällig am: 05-07-10 Verlängerungen: 0 Autor/Titel: Engel, Wolfgang : Mathematik in Aufgaben : ein Auswahl aus den Olymp Barcode/Signatur: 28$005912318 / 28/BB1:SM 940 E57 M42 Fällig am: 05-07-10 Verlängerungen: 0 -------------------------------------------------------------------------Bitte geben Sie die Medien zurück oder verlängern Sie die Leihfrist in Ihrem Nutzerkonto selbst (max.10x). https://katalog.ub.uni-rostock.de/loan/DB=1/LNG=DU/USERINFO_LOGIN Für vorgemerkte Medien, Fernleihen und Kurzausleihen ist keine Verlängerung möglich. Mit freundlichen Grüßen Ihre Bibliothek 1 3) Verwendete Scripts sybase / crontab: 30 04 * * * /global/sybase/com/hro62_read_userdat03_start_script batch hro62_read_userdat03_start_script #!/bin/ksh # # hro${ILN}_read_userdat03_start_script # Scriptgenerierung aus LBS-Datenbank mit SQL-Script # ---------------------------------------------------------# historie: # 02.07.10 - created, j.s. - ub hro # 05.07.10 - Script neu geordnet mit MODE als Parameter $1 # # Parameter: $1 = MODE # ---------------------------------------------------------# ---------------------------------------------------------# Parameter fuer Ausfuehrung setzen # ---------------------------------------------------------# Steuerung # --------SCRIPTID=03 # eindeutige Script-Identifikationsnummer ILN=62 # ILN MODE=inter # Ausfuehrungsmode batch oder inter(aktiv) COLUMNWITDH=300 # Spaltenbreite fuer SQL-Text SYBASEUSR=ro-user # RO-User LBS-Datenbank SYBASEUSRPW=passwd # Passwort fuer RO-User LBS-Datenbank [email protected] # Empfaenger LOG-File SLOG="3daysbefore reminder service" # Suject fuer LOG-File # Verzeichnisse # ------------SCRIPTDIR=$HOME/com TMPDIR=$HOME/tmp LOGDIR=$HOME/log # Dateien # ------SQLUSR=hro${ILN}_read_userdat${SCRIPTID}_usr_sql # SQL-Script Nutzerliste SQLTEXT=hro${ILN}_read_userdat${SCRIPTID}_text_sql # SQL-Script Text an Nutzer RESULTSCRIPT=hro${ILN}_read_userdat${SCRIPTID}_result_script # Auszufuehrendes ResultScript MAILTMP=mailtmp_${ILN}_${SCRIPTID}_user_ # fuer Generierung temp. File fuer Mailversand LOGFILE=mailtmp_${ILN}_${SCRIPTID}_log.txt # Logfile SEDSCRIPT=hro_remind_ous_sedscript # sed-Script zum Bearbeiten der SQLAusgabe Nutzerliste # ---------------------------------------------------------# LOGFILE an Administrator senden CR_SUBJECT() { { echo "From: sqlscript" echo "Subject: SQL-LOG_${ILN}: hro${ILN}_read_userdat${SCRIPTID} ${SLOG}" echo "\nSQL-LOG: hro${ILN}_read_userdat${SCRIPTID} - ${SLOG}\n" echo "Mail-Script fuer reminder service erzeugt und ausgefuehrt: $SCRIPTDIR/$RESULTSCRIPT" echo echo "SCRIPT:" echo "---------------" cat $SCRIPTDIR/$RESULTSCRIPT } > $TMPDIR/$LOGFILE /usr/lib/sendmail -t $1 < $TMPDIR/$LOGFILE } # ---------------------------------------------------------# Start des Main-Scripts 2 # ---------------------------------------------------------# MODE als Parameter uebergeben if [ $# = 1 ] then if [ $1 = "batch" ] then MODE=batch # Make sure this script is only executed from batch/crontab. # If so read .profile else stop execution #tty 1>/dev/null 2>&1 if [ $? -eq 0 ] then echo "MODE batch can only be executed from batch/crontab !!" exit 1 else . ${HOME}/define_sybase 1>/dev/null 2>&1 # SYBASE='/global/sybase/ASE_120'; export SYBASE fi else MODE=inter fi else MODE=inter fi # Check SYBASEUSR Verbindung zur Datenbank echo exit > $SCRIPTDIR/test_${SYBASEUSR}_pw.login $SYBASE/OCS-12_0/bin/isql -U$SYBASEUSR -P$SYBASEUSRPW i$SCRIPTDIR/test_${SYBASEUSR}_pw.login > $LOGDIR/test_${SYBASEUSR}.ok found="`wc -l $LOGDIR/test_${SYBASEUSR}.ok | awk '{ print $1 } ' | tr -d '[:space:]'`" rm $LOGDIR/test_${SYBASEUSR}.ok if [ $found != "0" ] then echo "\n\tWrong password for user $SYBASEUSR !!\n" exit fi # Loeschen Files der letzten Ausfuehrung { rm $TMPDIR/$LOGFILE rm -f $TMPDIR/${ILN}_*remind${SCRIPTID}.sql rm -f $TMPDIR/${ILN}_*remind${SCRIPTID}.txt rm -f $TMPDIR/${MAILTMP}*.txt } 2> /dev/null # Ausfuehrbare Datei fuer remind service erzeugen { echo CR_REMIND\(\) echo { echo \# Zuerste Mahntext mit Titelliste generieren echo \# Parameterliste echo \# 1 = E-Mail Absender echo \# 2 = E-Mail Empfaenger echo \# 3 = E-Mail Betreff echo \# 4 = address_id_nr Benutzer echo \# ACHTUNG - DIESER AUSDRUCK MUSS MIT DEM INHALT VON @address_id_nr IM SQL-SCRIPT UEBEREINSTIMMEN ! echo SUBST_ADDRESS_ID_NR=\"Xaddress_id_nrX\" echo \# Eigenes SQL-Script fuer Aufstellung genererien, substitute Aufstellung mittels sed echo sed s/\$SUBST_ADDRESS_ID_NR/\$4/ $SCRIPTDIR/$SQLTEXT \>$TMPDIR/${ILN}_\$4_remind${SCRIPTID}.sql echo \$SYBASE/OCS-12_0/bin/isql -U$SYBASEUSR -P$SYBASEUSRPW -w$COLUMNWITDH i$TMPDIR/${ILN}_\$4_remind${SCRIPTID}.sql \> $TMPDIR/${ILN}_\$4_remind${SCRIPTID}.tmp echo \# SQL-Result-File aufbereiten: echo cat $TMPDIR/${ILN}_\$4_remind${SCRIPTID}.tmp \| grep \"#\" \| sed \'s/#//\' \> $TMPDIR/${ILN}_\$4_remind${SCRIPTID}.sed echo cat $TMPDIR/${ILN}_\$4_remind${SCRIPTID}.sed \> $TMPDIR/${ILN}_\$4_remind${SCRIPTID}.txt echo rm -f $TMPDIR/${ILN}_\$4_remind${SCRIPTID}.tmp 3 echo rm -f $TMPDIR/${ILN}_\$4_remind${SCRIPTID}.sed echo { echo echo \"From: \$1\" echo echo \"To:\$2\" \| sed \'s/ /, /\' echo echo \"Subject: \$3\" echo cat $TMPDIR/${ILN}_\$4_remind${SCRIPTID}.txt echo } \> $TMPDIR/${MAILTMP}\$4.txt echo /usr/lib/sendmail -t \$2 \< $TMPDIR/${MAILTMP}\$4.txt 2\>\&1 \>/dev/null echo } } > $SCRIPTDIR/$RESULTSCRIPT case $MODE in 'inter') $SYBASE/OCS-12_0/bin/isql -U$SYBASEUSR -P$SYBASEUSRPW -i$SCRIPTDIR/$SQLUSR | sed f$SCRIPTDIR/$SEDSCRIPT | tee -a $SCRIPTDIR/$RESULTSCRIPT ;; 'batch') $SYBASE/OCS-12_0/bin/isql -U$SYBASEUSR -P$SYBASEUSRPW -i$SCRIPTDIR/$SQLUSR | sed f$SCRIPTDIR/$SEDSCRIPT >> $SCRIPTDIR/$RESULTSCRIPT ;; *) echo "Invalid argument" exit 1 ;; esac sleep 10 # Execute setzen und ausfuehren chmod 755 $SCRIPTDIR/$RESULTSCRIPT $SCRIPTDIR/$RESULTSCRIPT CR_SUBJECT $MAILLOGTO exit 4 hro62_read_userdat03_usr_sql /* ------------------------------------------------------------- */ /* Historie : */ /* 26-10-2007 - js: Nutzertyp 71 ergaenzt */ /* 04-02-2010 - js: Dauerschliessfach ueber v.free_text ausgeschlossen */ /* 01-07-2010 - js: address_id_nr fuer Titeldaten integriert */ /* ------------------------------------------------------------- */ /* SELECT @@VERSION ; go */ use lbsdb go PRINT PRINT PRINT PRINT PRINT '' '///////////////////////////////////////////////////////' '62-5. Erinnerungsservice - 3 Tage vor Leihfrist Ende' '///////////////////////////////////////////////////////' '' SELECT "Start information service at"= getdate () go SET ROWCOUNT 0 go DECLARE @iln smallint, @day_diff int, @free_text char(20) /* ----------------------------------------------------------------------------------------------- */ /* A = Nutzertypen ohne Beruecksichtigung der Kulanzfrist, day_diff Tage vor Rückgabedatum */ /* ----------------------------------------------------------------------------------------------- */ SELECT @iln = 62 /* UB ROSTOCK */, @day_diff = 3 /* Tagesdifferenz */, @free_text = "%Dauerschliessfach%" /* Dauerschliessfach hier nicht erinnern */ /* SELECT Statement Ausgabe fuer Befehlsdatei */ SELECT "CR_REMIND [email protected] " + CHAR(34) + rtrim(b.email_address) + CHAR(34) + " " + CHAR(34) + "Informationsservice UB Rostock `date +" + CHAR(34) + "%d.%m.%y" + CHAR(34) + "` / Ablauf der Leihfrist / s n " + b.borrower_bar + CHAR(34) + " " + CONVERT(VARCHAR(20), b.address_id_nr) FROM borrower b, loans_requests l, volume v WHERE b.iln=@iln /* 62 = Rostock */ /* Nur folgende Nutzertypen - only the following borrower types */ AND (b.borrower_type = 10 OR b.borrower_type = 20 OR b.borrower_type = 50 OR b.borrower_type = 70 OR b.borrower_type = 71 OR b.borrower_type = 80 ) /* @day_diff Tage vorher erinnern */ AND DATEDIFF(day,GETDATE(),l.expiry_date_loan) /* + r.number1 */ = @day_diff /* Wenn keine Mahnungen - if there are no reminders */ AND l.no_reminders = 0 /* Status muss 5 = ausgeliehen sein */ AND l.loan_status = 5 /* email adresse vorhanden */ AND NOT (PATINDEX('%@%', b.email_address) = 0) /* Kein Dauerschliessfach */ AND NOT (v.free_text like @free_text) /* Verknuepfungen der Tabellen */ AND b.iln = l.iln AND l.volume_number = v.volume_number AND b.address_id_nr = l.address_id_nr GROUP BY b.address_id_nr SELECT "End information service at"= getdate () go 5 hro62_read_userdat03_text_sql /* /* /* /* /* /* /* -------------------------------------------------------------------- */ hro_read_userdat03_text_sql */ Text und Titelliste fuer Vorab-Erinnerung generieren */ */ Historie: */ 01.07.10 js: created */ -------------------------------------------------------------------- */ /* LBS-DATENBANK */ use lbsdb go /* HIER ALLGEMEIN VERWENDETE VARIABLEN */ DECLARE @iln int, @address_id_nr int, @day_diff int, @free_text char(20) SELECT PRINT PRINT PRINT PRINT PRINT PRINT PRINT PRINT PRINT @iln = 62, /* ILN */ @day_diff = 3, /* Tagesdifferenz */ @free_text = "%Dauerschliessfach%", /* Dauerschliessfach hier nicht erinnern */ @address_id_nr = Xaddress_id_nrX /* Substitute-Ausdruck fuer CR_REMIND! */ '#Informationsservice' '#Universitätsbibliothek Rostock und Bibliotheken im Ausleihverbund' '#' '#Betreff : Ablauf der Leihfrist' '#' '#Bitte beachten Sie, dass Leihfristen Ihrer Entleihungen in 3 Tagen ablaufen.' '#' '#Liste der betreffenden Medien:' '#--------------------------------------------------------------------------' -- SELECT Statement kalkuliert mit CASE auch leeren ous_copy_cache ein (author, shorttitle, signature) SELECT CASE WHEN (c.shorttitle IS NULL) AND (c.author IS NULL) THEN '# ' -- STUFF: Jahresangaben beim Autor in Runden Klammern entfernen WHEN (c.shorttitle IS NULL) AND (c.author IS NOT NULL) THEN '#Autor: ' + CONVERT(char(70), STUFF(c.author, CHARINDEX('(', c.author), CHARINDEX(')', c.author) CHARINDEX('(', c.author) + 1, '')) + ' ' WHEN (c.shorttitle IS NOT NULL) AND (c.author IS NULL) THEN '#Titel: ' + CONVERT(char(70), c.shorttitle) WHEN (c.shorttitle IS NOT NULL) AND (c.author IS NOT NULL) THEN '#Autor/Titel: ' + CONVERT(char(70), RTRIM(STUFF(c.author, CHARINDEX('(', c.author), CHARINDEX(')', c.author) - CHARINDEX('(', c.author) + 1, '')) + -- Doppelpunt als Trennzeichen nur, wenn Autor vorhanden CASE WHEN RTRIM(STUFF(c.author, CHARINDEX('(', c.author), CHARINDEX(')', c.author) - CHARINDEX('(', c.author) + 1, '')) IS NOT NULL THEN ' : ' END + SUBSTRING(c.shorttitle,1,50)) + ' ' END, CASE WHEN (c.signature IS NULL) THEN CHAR(10) + '# Barcode: ' + CONVERT(char(12), v.volume_bar) WHEN (c.signature IS NOT NULL) THEN CHAR(10) + '# Barcode/Signatur: ' + CONVERT(char(42), v.volume_bar + ' / ' + c.signature) END, CHAR(10) + '# Fällig am: ' + CONVERT(char(8), l.expiry_date_loan,5), CHAR(10) + '# Verlängerungen: ' + CONVERT(char(2), l.no_renewals), CHAR(10) + '#' FROM loans_requests l, volume v, ous_copy_cache c WHERE l.iln = @iln and v.iln = @iln and c.iln = @iln and l.address_id_nr = @address_id_nr 6 and l.volume_number = v.volume_number and v.epn = c.epn /* @day_diff Tage vorher erinnern */ and DATEDIFF(day,GETDATE(),l.expiry_date_loan) = @day_diff /* Status muss 5 = ausgeliehen sein */ AND l.loan_status = 5 /* Kein Dauerschliessfach */ AND NOT (v.free_text like @free_text) ORDER BY l.no_renewals DESC PRINT PRINT PRINT PRINT PRINT PRINT PRINT PRINT PRINT PRINT PRINT PRINT PRINT '#--------------------------------------------------------------------------' '#' '#Bitte geben Sie die Medien zurück oder verlängern Sie die Leihfrist' '#in Ihrem Nutzerkonto selbst (max.10x).' '#https://katalog.ub.uni-rostock.de/loan/DB=1/LNG=DU/USERINFO_LOGIN' '#' '#Für vorgemerkte Medien, Fernleihen und Kurzausleihen ist keine ' '#Verlängerung möglich.' '#' '#' '#Mit freundlichen Grüßen' '#Ihre Bibliothek' '#' go hro_remind_ous_sedscript # sed script zur aufbereitung der kommandodatei informationsservice # 16 zeilen vom anfang loeschen 1,16d # von DELETE-Marke (x rows affected) bis Dateiende loeschen /(/,$d 7 hro62_read_userdat03_result_script CR_REMIND() { # Zuerste Mahntext mit Titelliste generieren # Parameterliste # 1 = E-Mail Absender # 2 = E-Mail Empfaenger # 3 = E-Mail Betreff # 4 = address_id_nr Benutzer # ACHTUNG - DIESER AUSDRUCK MUSS MIT DEM INHALT VON @address_id_nr IM SQL-SCRIPT UEBEREINSTIMMEN ! SUBST_ADDRESS_ID_NR="Xaddress_id_nrX" # Eigenes SQL-Script fuer Aufstellung genererien, substitute Aufstellung mittels sed sed s/$SUBST_ADDRESS_ID_NR/$4/ /global/sybase/com/hro62_read_userdat03_text_sql >/global/sybase/tmp/62_$4_remind03.sql $SYBASE/OCS-12_0/bin/isql -Uro-user -Ppasswd -w300 -i/global/sybase/tmp/62_$4_remind03.sql > /global/sybase/tmp/62_$4_remind03.tmp # SQL-Result-File aufbereiten: cat /global/sybase/tmp/62_$4_remind03.tmp | grep "#" | sed 's/#//' > /global/sybase/tmp/62_$4_remind03.sed cat /global/sybase/tmp/62_$4_remind03.sed > /global/sybase/tmp/62_$4_remind03.txt rm -f /global/sybase/tmp/62_$4_remind03.tmp rm -f /global/sybase/tmp/62_$4_remind03.sed { echo "From: $1" echo "To:$2" | sed 's/ /, /' echo "Subject: $3" cat /global/sybase/tmp/62_$4_remind03.txt } > /global/sybase/tmp/mailtmp_62_03_user_$4.txt /usr/lib/sendmail -t $2 < /global/sybase/tmp/mailtmp_62_03_user_$4.txt 2>&1 >/dev/null } CR_REMIND [email protected] "[email protected]" "Informationsservice UB Rostock `date +"%d.%m.%y"` / Ablauf der Leihfrist / s n 00280005334" 13533 CR_REMIND [email protected] "[email protected]" "Informationsservice UB Rostock `date +"%d.%m.%y"` / Ablauf der Leihfrist / s n 00280007183" 20622 # u.s.w. 8