From e3970bea2f3c8b3aebd91662c31eb8f7bf952937 Mon Sep 17 00:00:00 2001 From: Colin Campbell Date: Thu, 17 Feb 2011 12:12:38 +0000 Subject: [PATCH] Squashed commit of the branch bug_3203: Content-Type: text/plain; charset="utf-8" commit 47109ddc5ba84d76c8041088b0ff669cd2e24ceb Author: Colin Campbell Date: Sun Nov 15 20:13:48 2009 +0000 Checkin Notices need to get date_due from old_issues commit 09db73830520b6ffff83178badd2f709103c68ef Author: Colin Campbell Date: Tue Nov 10 01:23:48 2009 +0000 Add full set of item fields : ensure dates are formatted Could specify some fields for item that were not being substituted ensure contents is set and that dates are formatted commit 210855d9d113a5cb17c6f8fc7000aa967fc2bd02 Author: Colin Campbell Date: Wed Oct 28 17:19:08 2009 +0000 Need to format dates in advance_notices commit c51daefcb59e6ab33a8564b825f2afb5a2c9ad10 Author: Colin Campbell Date: Mon Oct 26 09:24:08 2009 +0000 Add issuedate, barcode, return_date and call no to item notice fields Allow these to be separately designated in circulation notices item.contents remains the preferred way in batch notices commit bac77ee9b4b2e489083dc18a08803bf9fe1136ec Author: J. David Bavousett Date: Wed Mar 31 09:57:57 2010 -0400 tidy up digest notices commit 1e17381bd4d912db45e4290cffa11d384aa68815 Author: Colin Campbell Date: Fri Oct 23 13:51:43 2009 +0100 Need to be tolerant of the format of the itemscontent parameter specifically strip whitespace when separating out filenames --- C4/Circulation.pm | 1 + C4/Letters.pm | 57 ++++++++++++++++++++++++++++++------- misc/cronjobs/advance_notices.pl | 13 ++++++-- misc/cronjobs/overdue_notices.pl | 4 ++- tools/letter.pl | 6 ++++ 5 files changed, 65 insertions(+), 16 deletions(-) diff --git a/C4/Circulation.pm b/C4/Circulation.pm index f7846ac..a4ba88a 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -2523,6 +2523,7 @@ sub SendCirculationAlert { C4::Letters::parseletter($letter, 'biblioitems', $item->{biblionumber}); C4::Letters::parseletter($letter, 'borrowers', $borrower->{borrowernumber}); C4::Letters::parseletter($letter, 'branches', $branch); + C4::Letters::parseletter($letter, 'items', $item->{itemnumber}, $type); my @transports = @{ $borrower_preferences->{transports} }; # warn "no transports" unless @transports; for (@transports) { diff --git a/C4/Letters.pm b/C4/Letters.pm index d32b3cf..f4d463a 100644 --- a/C4/Letters.pm +++ b/C4/Letters.pm @@ -30,6 +30,7 @@ use C4::Log; use C4::SMS; use C4::Debug; use Date::Calc qw( Add_Delta_Days ); +use C4::Dates qw/format_date/; use Encode; use Carp; @@ -477,12 +478,17 @@ sub parseletter_sth { carp "ERROR: parseletter_sth() called without argument (table)"; return; } - # check cache first + my $itemselect = + 'SELECT barcode, itemcallnumber, location, holdingbranch, date_due, issuedate, author, title from items ' + . 'left join issues on issues.itemnumber = items.itemnumber ' + . 'LEFT JOIN biblio on items.biblionumber = biblio.biblionumber ' + . 'WHERE items.itemnumber = ? '; +# check cache first (defined $handles{$table}) and return $handles{$table}; my $query = ($table eq 'biblio' ) ? "SELECT * FROM $table WHERE biblionumber = ?" : ($table eq 'biblioitems' ) ? "SELECT * FROM $table WHERE biblionumber = ?" : - ($table eq 'items' ) ? "SELECT * FROM $table WHERE itemnumber = ?" : + ($table eq 'items' ) ? $itemselect : ($table eq 'reserves' ) ? "SELECT * FROM $table WHERE borrowernumber = ? and biblionumber = ?" : ($table eq 'borrowers' ) ? "SELECT * FROM $table WHERE borrowernumber = ?" : ($table eq 'branches' ) ? "SELECT * FROM $table WHERE branchcode = ?" : @@ -510,6 +516,13 @@ sub parseletter { warn "parseletter_sth('$table') failed to return a valid sth. No substitution will be done for that table."; return; } + my $check_in_notice; + if ($table eq 'items') { + if ($pk2 && $pk2 eq 'CHECKIN') { + $check_in_notice = 1; + } + $pk2 = undef; + } if ( $pk2 ) { $sth->execute($pk, $pk2); } else { @@ -531,17 +544,39 @@ sub parseletter { )->output(); } - # and get all fields from the table - my $columns = C4::Context->dbh->prepare("SHOW COLUMNS FROM $table"); - $columns->execute; - while ( ( my $field ) = $columns->fetchrow_array ) { - my $replacefield = "<<$table.$field>>"; - $values->{$field} =~ s/\p{P}(?=$)//g if $values->{$field}; - my $replacedby = $values->{$field} || ''; - ($letter->{title} ) and $letter->{title} =~ s/$replacefield/$replacedby/g; - ($letter->{content}) and $letter->{content} =~ s/$replacefield/$replacedby/g; + if ($table ne 'items' ) { + my $columns = C4::Context->dbh->prepare("SHOW COLUMNS FROM $table"); + $columns->execute; + while ( ( my $field ) = $columns->fetchrow_array ) { + my $replacefield = "<<$table.$field>>"; + $values->{$field} =~ s/\p{P}(?=$)//g if $values->{$field}; + my $replacedby = $values->{$field} || ''; + ($letter->{title} ) and $letter->{title} =~ s/$replacefield/$replacedby/g; + ($letter->{content}) and $letter->{content} =~ s/$replacefield/$replacedby/g; + } } + + if ($table eq 'items') { + if ($check_in_notice) { + # need to get dates from old_issues + my $dates = C4::Context->dbh->selectrow_arrayref( +'SELECT issuedate, date_due FROM old_issues where itemnumber = ? AND DATE(timestamp) = CURDATE() ORDER BY timestamp DESC LIMIT 1', + {}, $pk); + $values->{issuedate} = ${ $dates}[0]; + $values->{date_due} = ${ $dates}[1]; + } + $values->{issuedate} = format_date($values->{issuedate}); + $values->{date_due} = format_date($values->{date_due}); + $values->{content} = join "\t", $values->{issuedate}, $values->{title}, $values->{barcode}, $values->{author}; + for my $field ( qw( issuedate date_due barcode holdingbranch location itemcallnumber content)) { + my $replacefield = "<<$table.$field>>"; + my $replacedby = $values->{$field} || ''; + ($letter->{title} ) and $letter->{title} =~ s/$replacefield/$replacedby/g; + ($letter->{content}) and $letter->{content} =~ s/$replacefield/$replacedby/g; + } + } + return $letter; } diff --git a/misc/cronjobs/advance_notices.pl b/misc/cronjobs/advance_notices.pl index 6a408e4..d935ecd 100755 --- a/misc/cronjobs/advance_notices.pl +++ b/misc/cronjobs/advance_notices.pl @@ -55,6 +55,7 @@ use C4::Members; use C4::Members::Messaging; use C4::Overdues; use C4::Dates qw/format_date/; +use DBI; # These are defaults for command line options. @@ -150,7 +151,7 @@ UPCOMINGITEM: foreach my $upcoming ( @$upcoming_dues ) { if ( $borrower_preferences->{'wants_digest'} ) { # cache this one to process after we've run through all of the items. - $due_digest->{$upcoming->{'borrowernumber'}}++; + push @{$due_digest->{$upcoming->{borrowernumber}}}, $upcoming->{itemnumber}; } else { my $biblio = C4::Biblio::GetBiblioFromItemNumber( $upcoming->{'itemnumber'} ); my $letter_type = 'DUE'; @@ -179,7 +180,7 @@ UPCOMINGITEM: foreach my $upcoming ( @$upcoming_dues ) { if ( $borrower_preferences->{'wants_digest'} ) { # cache this one to process after we've run through all of the items. - $upcoming_digest->{$upcoming->{'borrowernumber'}}++; + push @{$due_digest->{$upcoming->{borrowernumber}}}, $upcoming->{itemnumber}; } else { my $biblio = C4::Biblio::GetBiblioFromItemNumber( $upcoming->{'itemnumber'} ); my $letter_type = 'PREDUE'; @@ -231,7 +232,9 @@ SELECT biblio.*, items.*, issues.* AND (TO_DAYS(date_due)-TO_DAYS(NOW()) = ?) END_SQL -PATRON: while ( my ( $borrowernumber, $count ) = each %$upcoming_digest ) { +PATRON: for my $borrowernumber ( keys %{ $upcoming_digest} ) { + my @items = @{$upcoming_digest->{$borrowernumber}}; + my $count = scalar @items; my $borrower_preferences = C4::Members::Messaging::GetMessagingPreferences( { borrowernumber => $borrowernumber, message_name => 'advance notice' } ); # warn( Data::Dumper->Dump( [ $borrower_preferences ], [ 'borrower_preferences' ] ) ); @@ -267,7 +270,9 @@ PATRON: while ( my ( $borrowernumber, $count ) = each %$upcoming_digest ) { } # Now, run through all the people that want digests and send them -PATRON: while ( my ( $borrowernumber, $count ) = each %$due_digest ) { +PATRON: for my $borrowernumber ( keys %{ $upcoming_digest} ) { + my @items = @{$upcoming_digest->{$borrowernumber}}; + my $count = scalar @items; my $borrower_preferences = C4::Members::Messaging::GetMessagingPreferences( { borrowernumber => $borrowernumber, message_name => 'item due' } ); # warn( Data::Dumper->Dump( [ $borrower_preferences ], [ 'borrower_preferences' ] ) ); diff --git a/misc/cronjobs/overdue_notices.pl b/misc/cronjobs/overdue_notices.pl index 671368e..d9a2e81 100755 --- a/misc/cronjobs/overdue_notices.pl +++ b/misc/cronjobs/overdue_notices.pl @@ -320,7 +320,9 @@ if (@branchcodes) { } # these are the fields that will be substituted into <> -my @item_content_fields = split( /,/, $itemscontent ); +$itemscontent=~s/^\s*//; +$itemscontent=~s/\s*$//; +my @item_content_fields = split( /\s*,\s*/, $itemscontent ); binmode( STDOUT, ":utf8" ); diff --git a/tools/letter.pl b/tools/letter.pl index ab6039c..aa5afb1 100755 --- a/tools/letter.pl +++ b/tools/letter.pl @@ -169,9 +169,15 @@ sub add_form { push @{$field_selection}, add_fields('suggestions', 'borrowers', 'biblio'); } else { + my @item_field_names = qw(barcode itemcallnumber date_due issuedate); + push @{$field_selection}, add_fields('biblio','biblioitems'), {value => q{}, text => '---ITEMS---' }, {value => 'items.content', text => 'items.content'}, + {value => 'items.barcode', text => 'items.barcode'}, + {value => 'items.itemcallnumber', text => 'items.itemcallnumber'}, + {value => 'items.date_due', text => 'items.date_due'}, + {value => 'items.issuedate', text => 'items.issuedate'}, add_fields('borrowers'); } -- 1.7.4