From d2c8bbd7cb3509ad088c884fced89659ce3013d2 Mon Sep 17 00:00:00 2001 From: Paul Derscheid Date: Wed, 28 Aug 2024 13:22:00 +0200 Subject: [PATCH] Bug 37204: Add a booking has changed notice to update a patron should a booking be updated MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This is a first draft. When reading your initial statement again I'm asking myself whether a changed itemnumber is relevant to the patron. The way I see it, the relevant fields are: - pickup_library_id - start_date - end_date But maybe I'm not seeing it. To test: 1) Apply the patch 2) Make an item bookable 3) Add a booking for a given patron 4) Check the patron notices tab, should not contain any notices 5) Change either start date, end date or pickup library and save 6) Check the patron notices tab, should contain a notice with the updated details 7) Run the tests under t/db_dependent/Koha/Booking.t 8) Sign off Signed-off-by: LEBSimonsen Signed-off-by: Martin Renvoize Sponsored-by: Büchereizentrale Schleswig-Holstein Signed-off-by: Katrin Fischer --- Koha/Booking.pm | 32 ++++++- .../mysql/en/mandatory/sample_notices.yml | 24 ++++++ t/db_dependent/Koha/Booking.t | 84 ++++++++++++++++++- 3 files changed, 138 insertions(+), 2 deletions(-) diff --git a/Koha/Booking.pm b/Koha/Booking.pm index e5297d8d17..c16ae91c4f 100644 --- a/Koha/Booking.pm +++ b/Koha/Booking.pm @@ -27,6 +27,8 @@ use Koha::Libraries; use C4::Letters; +use List::Util qw(any); + use base qw(Koha::Object); =head1 NAME @@ -149,7 +151,35 @@ sub store { $self->_assign_item_for_booking; } - $self = $self->SUPER::store; + my $is_modification = $self->in_storage; + my $old_booking = $self->get_from_storage; + if ( $self = + $self->SUPER::store + and $is_modification + and any { $old_booking->$_ ne $self->$_ } qw(pickup_library_id start_date end_date) ) + { + my $patron = $self->patron; + my $pickup_library = $self->pickup_library; + + my $letter = C4::Letters::GetPreparedLetter( + module => 'bookings', + letter_code => 'BOOKING_MODIFICATION', + message_transport_type => 'email', + branchcode => $pickup_library->branchcode, + lang => $patron->lang, + objects => { booking => $self }, + ); + + if ($letter) { + C4::Letters::EnqueueLetter( + { + letter => $letter, + borrowernumber => $patron->borrowernumber, + message_transport_type => 'email', + } + ); + } + } } ); diff --git a/installer/data/mysql/en/mandatory/sample_notices.yml b/installer/data/mysql/en/mandatory/sample_notices.yml index 8950c41e51..c7aa453037 100644 --- a/installer/data/mysql/en/mandatory/sample_notices.yml +++ b/installer/data/mysql/en/mandatory/sample_notices.yml @@ -66,6 +66,30 @@ tables: - "
" - "[% booking.pickup_library.branchname %]" + - module: bookings + code: BOOKING_MODIFICATION + branchcode: "" + name: "Booking modification notice" + is_html: 1 + title: "A library booking was modified" + message_transport_type: email + lang: default + content: + - "[%- PROCESS 'html_helpers.inc' -%]" + - "[%- USE KohaDates -%]" + - "Dear [%- INCLUDE 'patron-title.inc' patron => booking.patron -%],
" + - "
" + - "Your booking of [%- INCLUDE 'biblio-title.inc' biblio=booking.biblio link = 0 -%] has been modified.
" + - "
" + - "The new details are:
" + - "
" + - "Dates: [% booking.start_date | $KohaDates %] to [% booking.end_date | $KohaDates %]
" + - "
" + - "Pickup at: [% booking.pickup_library.branchname %]
" + - "Kind regards
" + - "
" + - "[% booking.pickup_library.branchname %]" + - module: catalogue code: TICKET_ACKNOWLEDGE branchcode: "" diff --git a/t/db_dependent/Koha/Booking.t b/t/db_dependent/Koha/Booking.t index a0805a6a14..9eef67069d 100755 --- a/t/db_dependent/Koha/Booking.t +++ b/t/db_dependent/Koha/Booking.t @@ -123,7 +123,7 @@ subtest 'Relation accessor tests' => sub { }; subtest 'store() tests' => sub { - plan tests => 13; + plan tests => 14; $schema->storage->txn_begin; my $patron = $builder->build_object( { class => "Koha::Patrons" } ); @@ -322,6 +322,88 @@ subtest 'store() tests' => sub { # ✓ Any (1) |--| }; + subtest 'notice trigger' => sub { + plan tests => 3; + + my $original_notices_count = Koha::Notice::Messages->search( + { + letter_code => 'BOOKING_MODIFICATION', + borrowernumber => $patron->borrowernumber, + } + )->count; + + $start_1 = dt_from_string->add( months => 1 )->truncate( to => 'day' ); + $end_1 = $start_1->clone()->add( days => 1 ); + + # Use datetime formatting so that we don't get DateTime objects + $booking = Koha::Booking->new( + { + patron_id => $patron->borrowernumber, + biblio_id => $biblio->biblionumber, + pickup_library_id => $item_2->homebranch, + start_date => $start_1->datetime(q{ }), + end_date => $end_1->datetime(q{ }), + } + )->store; + + my $post_notices_count = Koha::Notice::Messages->search( + { + letter_code => 'BOOKING_MODIFICATION', + borrowernumber => $patron->borrowernumber, + } + )->count; + is( + $post_notices_count, + $original_notices_count, + 'Koha::Booking->store should not have enqueued a BOOKING_MODIFICATION email for a new booking' + ); + + my $item_4 = $builder->build_sample_item( { biblionumber => $biblio->biblionumber, bookable => 1 } ); + + $booking->update( + { + item_id => $item_4->itemnumber, + } + ); + + $post_notices_count = Koha::Notice::Messages->search( + { + letter_code => 'BOOKING_MODIFICATION', + borrowernumber => $patron->borrowernumber, + } + )->count; + is( + $post_notices_count, + $original_notices_count, + 'Koha::Booking->store should not have enqueued a BOOKING_MODIFICATION email for a booking with modified item_id' + ); + + $booking->update( + { + start_date => $start_1->clone()->add( days => 1 )->datetime(q{ }), + } + ); + + # start_date, end_date and pickup_library_id should behave identical + $post_notices_count = Koha::Notice::Messages->search( + { + letter_code => 'BOOKING_MODIFICATION', + borrowernumber => $patron->borrowernumber, + } + )->count; + is( + $post_notices_count, + $original_notices_count + 1, + 'Koha::Booking->store should have enqueued a BOOKING_MODIFICATION email for a booking with modified start_date' + ); + + $booking->update( + { + end_date => $end_1->clone()->add( days => 1 )->datetime(q{ }), + } + ); + }; + $schema->storage->txn_rollback; }; -- 2.39.5