From 5624489942e4810cd12ad831c2434987de56faae Mon Sep 17 00:00:00 2001 From: Jonathan Druart Date: Tue, 17 Jan 2017 04:32:58 +0100 Subject: [PATCH] Bug 17966: TT syntax for notices - Prove that ISSUESLIP is compatible Here we go, you will notice at the dependency list that this one is a bit different. In our former syntax we have 2 custom tags and . These tags were allowed to permit loop on the checked out items and the overdue items. In this patch, we will use the "loops" parameter, introduced by bug 17971, to pass the list of checkouts and overdues to the template. Note that Kyle suggested another approach on bug 15283: all the checkouts were send into the same array and each element of this array calls the is_from_today method, to know if the checkout is an overdue. I don't think we should rely on the Koha API, that's why I suggest to pass 2 differents object list, 1 which contains the checkouts and another one with the overdues. Note that we do rely on the Koha API, we call the Koha::Checkout->item and Koha::Item->biblio to propose an equivalent TT notice. But I think we can accept that. Test plan: Define the ISSUESLIP and ISSUEQSLIP notice templates to generate the same notices you generated with the historical syntax. Signed-off-by: Kyle M Hall https://bugs.koha-community.org/show_bug.cgi?id=17969 --- C4/Letters.pm | 6 ++ C4/Members.pm | 58 +++++++------ t/db_dependent/Letters/TemplateToolkit.t | 138 ++++++++++++++++++++++++++++++- 3 files changed, 178 insertions(+), 24 deletions(-) diff --git a/C4/Letters.pm b/C4/Letters.pm index de8253b..e24d556 100644 --- a/C4/Letters.pm +++ b/C4/Letters.pm @@ -1566,6 +1566,12 @@ sub _get_tt_params { plural => 'old_checkouts', fk => 'itemnumber', }, + overdues => { + module => 'Koha::Checkouts', + singular => 'overdue', + plural => 'overdues', + fk => 'itemnumber', + }, borrower_modifications => { module => 'Koha::Patron::Modifications', singular => 'patron_modification', diff --git a/C4/Members.pm b/C4/Members.pm index 3726e00..166b051 100644 --- a/C4/Members.pm +++ b/C4/Members.pm @@ -1136,39 +1136,50 @@ sub IssueSlip { $b->{issuedate} <=> $a->{issuedate} : $s; } @issues; - my ($letter_code, %repeat); + my ($letter_code, %repeat, %loops); if ( $quickslip ) { $letter_code = 'ISSUEQSLIP'; - %repeat = ( - 'checkedout' => [ map { + my @checkouts = map { 'biblio' => $_, 'items' => $_, 'biblioitems' => $_, 'issues' => $_, - }, grep { $_->{'now'} } @issues ], + }, grep { $_->{'now'} } @issues; + %repeat = ( + checkedout => \@checkouts, # History syntax + ); + %loops = ( + issues => [ map { $_->{issues}{itemnumber} } @checkouts ], # TT syntax ); } else { + my @checkouts = map { + 'biblio' => $_, + 'items' => $_, + 'biblioitems' => $_, + 'issues' => $_, + }, grep { !$_->{'overdue'} } @issues; + my @overdues = map { + 'biblio' => $_, + 'items' => $_, + 'biblioitems' => $_, + 'issues' => $_, + }, grep { $_->{'overdue'} } @issues; + my $news = GetNewsToDisplay( "slip", $branch ); + my @news = map { + $_->{'timestamp'} = $_->{'newdate'}; + { opac_news => $_ } + } @$news; $letter_code = 'ISSUESLIP'; - %repeat = ( - 'checkedout' => [ map { - 'biblio' => $_, - 'items' => $_, - 'biblioitems' => $_, - 'issues' => $_, - }, grep { !$_->{'overdue'} } @issues ], - - 'overdue' => [ map { - 'biblio' => $_, - 'items' => $_, - 'biblioitems' => $_, - 'issues' => $_, - }, grep { $_->{'overdue'} } @issues ], - - 'news' => [ map { - $_->{'timestamp'} = $_->{'newdate'}; - { opac_news => $_ } - } @{ GetNewsToDisplay("slip",$branch) } ], + %repeat = ( + checkedout => \@checkouts, + overdue => \@overdues, + news => \@news, + ); + %loops = ( + issues => [ map { $_->{issues}{itemnumber} } @checkouts ], + overdues => [ map { $_->{issues}{itemnumber} } @overdues ], + opac_news => [ map { $_->{opac_news}{idnew} } @news ], ); } @@ -1182,6 +1193,7 @@ sub IssueSlip { 'borrowers' => $borrowernumber, }, repeat => \%repeat, + loops => \%loops, ); } diff --git a/t/db_dependent/Letters/TemplateToolkit.t b/t/db_dependent/Letters/TemplateToolkit.t index 075b6f4..95973ed 100644 --- a/t/db_dependent/Letters/TemplateToolkit.t +++ b/t/db_dependent/Letters/TemplateToolkit.t @@ -286,7 +286,7 @@ $prepared_letter = GetPreparedLetter( is( $prepared_letter->{content}, $modification->id(), 'Patron modification object used correctly' ); subtest 'regression tests' => sub { - plan tests => 5; + plan tests => 6; my $library = $builder->build( { source => 'Branch' } ); my $patron = $builder->build( { source => 'Borrower' } ); @@ -316,6 +316,19 @@ subtest 'regression tests' => sub { itemcallnumber => 'itemcallnumber2', } )->store->unblessed; + my $biblio3 = Koha::Biblio->new({title => 'Test Biblio 3'})->store->unblessed; + my $biblioitem3 = Koha::Biblioitem->new({biblionumber => $biblio3->{biblionumber}})->store()->unblessed; + my $item3 = Koha::Item->new( + { + biblionumber => $biblio3->{biblionumber}, + biblioitemnumber => $biblioitem3->{biblioitemnumber}, + barcode => 'another_t_barcode_3', + homebranch => $library->{branchcode}, + holdingbranch => $library->{branchcode}, + itype => 'BK', + itemcallnumber => 'itemcallnumber3', + } + )->store->unblessed; C4::Context->_new_userenv('xxx'); C4::Context->set_userenv(0,0,0,'firstname','surname', $library->{branchcode}, 'Midway Public Library', '', '', ''); @@ -582,6 +595,129 @@ EOF is( $tt_letter_for_item1->{content}, $letter_for_item1->{content}, ); is( $tt_letter_for_item2->{content}, $letter_for_item2->{content}, ); }; + + subtest 'ISSUESLIP|checkedout|repeat' => sub { + plan tests => 2; + + my $code = 'ISSUESLIP'; + + my $branchcode = $library->{branchcode}; + + Koha::News->delete; + my $news_item = Koha::NewsItem->new({ branchcode => $branchcode, title => "A wonderful news", content => "This is the wonderful news." })->store; + + # historic syntax + my $template = <<> +Checked out to <> <> <> <>
+(<>)
+ +<>
+ +

Checked Out

+ +

+<>
+Barcode: <>
+Date due: <>
+

+
+ +

Overdues

+ +

+<>
+Barcode: <>
+Date due: <>
+

+
+ +
+ +

News

+ +
+
<>
+

<>

+

Posted on <>

+
+
+
+EOF + + reset_template( { template => $template, code => $code, module => 'circulation' } ); + + C4::Circulation::AddIssue( $patron, $item1->{barcode} ); # Add a first checkout + my $first_slip = C4::Members::IssueSlip( $branchcode, $patron->{borrowernumber} ); + + C4::Circulation::AddIssue( $patron, $item2->{barcode} ); # Add a second checkout + my $yesterday = dt_from_string->subtract( days => 1 ); + C4::Circulation::AddIssue( $patron, $item3->{barcode}, $yesterday ); # Add an overdue + my $second_slip = C4::Members::IssueSlip( $branchcode, $patron->{borrowernumber} ); + + # Cleanup + AddReturn( $item1->{barcode} ); + AddReturn( $item2->{barcode} ); + AddReturn( $item3->{barcode} ); + + # TT syntax + my $tt_template = <[% branch.branchname %] +Checked out to [% borrower.title %] [% borrower.firstname %] [% borrower.initials %] [% borrower.surname %]
+([% borrower.cardnumber %])
+ +[% today | \$KohaDates with_hours => 1 %]
+ +

Checked Out

+[% FOREACH checkout IN checkouts %] +[%~ SET item = checkout.item %] +[%~ SET biblio = checkout.item.biblio %] +

+[% biblio.title %]
+Barcode: [% item.barcode %]
+Date due: [% checkout.date_due | \$KohaDates %]
+

+[% END %] + +

Overdues

+[% FOREACH overdue IN overdues %] +[%~ SET item = overdue.item %] +[%~ SET biblio = overdue.item.biblio %] +

+[% biblio.title %]
+Barcode: [% item.barcode %]
+Date due: [% overdue.date_due | \$KohaDates %]
+

+[% END %] + +
+ +

News

+[% FOREACH n IN news %] +
+
[% n.title %]
+

[% n.content %]

+

Posted on [% n.timestamp | \$KohaDates %]

+
+
+[% END %] +EOF + + reset_template( { template => $tt_template, code => $code, module => 'circulation' } ); + + C4::Circulation::AddIssue( $patron, $item1->{barcode} ); # Add a first checkout + my $first_tt_slip = C4::Members::IssueSlip( $branchcode, $patron->{borrowernumber} ); + + C4::Circulation::AddIssue( $patron, $item2->{barcode} ); # Add a second checkout + C4::Circulation::AddIssue( $patron, $item3->{barcode}, $yesterday ); # Add an overdue + my $second_tt_slip = C4::Members::IssueSlip( $branchcode, $patron->{borrowernumber} ); + + # There is too many line breaks generated by the historic syntax + $second_slip->{content} =~ s|

\n\n\n

|

\n\n

|s; + + is( $first_tt_slip->{content}, $first_slip->{content}, ); + is( $second_tt_slip->{content}, $second_slip->{content}, ); + }; }; subtest 'loops' => sub { -- 2.1.4