3 # This file is part of Koha.
5 # Koha is free software; you can redistribute it and/or modify it
6 # under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 3 of the License, or
8 # (at your option) any later version.
10 # Koha is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with Koha; if not, see <http://www.gnu.org/licenses>.
21 use Test::More tests => 3;
23 use t::lib::TestBuilder;
30 use Koha::DateUtils qw( dt_from_string output_pref );
33 use DateTime::Duration;
37 my $schema = Koha::Database->schema;
38 $schema->storage->txn_begin;
39 my $dbh = C4::Context->dbh;
41 $dbh->do(q|DELETE FROM issues|);
42 $dbh->do(q|DELETE FROM borrowers|);
43 $dbh->do(q|DELETE FROM items|);
44 $dbh->do(q|DELETE FROM branches|);
45 $dbh->do(q|DELETE FROM biblio|);
46 $dbh->do(q|DELETE FROM categories|);
47 $dbh->do(q|DELETE FROM letter|);
49 my $builder = t::lib::TestBuilder->new;
51 my $branchcode = $builder->build({ source => 'Branch' })->{ branchcode };
52 my $categorycode = $builder->build({ source => 'Category' })->{ categorycode };
53 my $itemtype = $builder->build({ source => 'Itemtype' })->{ itemtype };
56 homebranch => $branchcode,
57 holdingbranch => $branchcode,
62 my $slip_content = <<EOS;
65 Title: <<biblio.title>>
66 Barcode: <<items.barcode>>
67 Date due: <<issues.date_due>>
72 Title: <<biblio.title>>
73 Barcode: <<items.barcode>>
74 Date due: <<issues.date_due>>
79 INSERT INTO letter( module, code, branchcode, name, is_html, title, content, message_transport_type) VALUES ('circulation', 'ISSUESLIP', '', 'Issue Slip', 0, 'Issue Slip', ?, 'email')
80 |, {}, $slip_content);
82 my $quick_slip_content = <<EOS;
85 Title: <<biblio.title>>
86 Barcode: <<items.barcode>>
87 Date due: <<issues.date_due>>
92 INSERT INTO letter( module, code, branchcode, name, is_html, title, content, message_transport_type) VALUES ('circulation', 'ISSUEQSLIP', '', 'Issue Quick Slip', 0, 'Issue Quick Slip', ?, 'email')
93 |, {}, $quick_slip_content);
95 my ( $title1, $title2 ) = ( 'My title 1', 'My title 2' );
96 my ( $barcode1, $barcode2 ) = ('BC0101', 'BC0202' );
97 my $record = MARC::Record->new;
98 $record->append_fields(
104 my ($biblionumber1) = AddBiblio( $record, '' );
106 AddItem( { barcode => $barcode1, %item_infos }, $biblionumber1 );
108 $record = MARC::Record->new;
109 $record->append_fields(
115 my ($biblionumber2) = AddBiblio( $record, '' );
117 AddItem( { barcode => $barcode2, %item_infos }, $biblionumber2 );
120 AddMember( categorycode => $categorycode, branchcode => $branchcode );
121 my $borrower = Koha::Patrons->find( $borrowernumber )->unblessed;
123 my $module = new Test::MockModule('C4::Context');
124 $module->mock( 'userenv', sub { { branch => $branchcode } } );
126 my $today = dt_from_string;
127 my $yesterday = dt_from_string->subtract_duration( DateTime::Duration->new( days => 1 ) );
129 subtest 'Issue slip' => sub {
132 subtest 'Empty slip' => sub {
134 my $slip = IssueSlip( $branchcode, $borrowernumber );
135 my $empty_slip = <<EOS;
142 is( $slip->{content}, $empty_slip, 'No checked out or overdues return an empty slip, it should return undef (FIXME)' );
145 subtest 'Daily loans' => sub {
147 skip "It's 23:59!", 2 if $today->hour == 23 and $today->minute == 59;
149 my $today_daily = $today->clone->set( hour => 23, minute => 59 );
150 my $today_daily_as_formatted = output_pref( $today_daily );
151 my $yesterday_daily = $yesterday->clone->set( hour => 23, minute => 59 );
152 my $yesterday_daily_as_formatted = output_pref( $yesterday_daily );
154 my ( $date_due, $issue_date, $slip, $expected_slip );
155 $date_due = $today_daily;
156 $issue_date = $today_daily->clone->subtract_duration( DateTime::Duration->new( minutes => 1 ) );
157 AddIssue( $borrower, $barcode1, $date_due, undef, $issue_date );
158 $date_due = $today_daily;
159 $issue_date = $yesterday_daily;
160 AddIssue( $borrower, $barcode2, $date_due, undef, $issue_date );
162 $expected_slip = <<EOS;
167 Date due: $today_daily_as_formatted
172 Date due: $today_daily_as_formatted
178 $slip = IssueSlip( $branchcode, $borrowernumber );
179 is( $slip->{content}, $expected_slip , 'IssueSlip should return a slip with 2 checkouts');
181 AddReturn( $barcode1, $branchcode );
182 AddReturn( $barcode2, $branchcode );
185 $date_due = $today_daily;
186 $issue_date = $today_daily->clone->subtract_duration( DateTime::Duration->new( minutes => 1 ) );
187 AddIssue( $borrower, $barcode1, $date_due, undef, $issue_date );
188 $date_due = $yesterday_daily;
189 $issue_date = $yesterday_daily;
190 AddIssue( $borrower, $barcode2, $date_due, undef, $issue_date );
192 $expected_slip = <<EOS;
197 Date due: $today_daily_as_formatted
204 Date due: $yesterday_daily_as_formatted
207 $slip = IssueSlip( $branchcode, $borrowernumber );
208 is( $slip->{content}, $expected_slip, 'IssueSlip should return a slip with 1 checkout and 1 overdue');
210 AddReturn( $barcode1, $branchcode );
211 AddReturn( $barcode2, $branchcode );
214 subtest 'Hourly loans' => sub {
216 skip "It's 23:59!", 2 if $today->hour == 23 and $today->minute == 59;
218 my ( $date_due_in_time, $date_due_in_time_as_formatted, $date_due_in_late, $date_due_in_late_as_formatted, $issue_date, $slip, $expected_slip );
219 # Assuming today is not hour = 23 and minute = 59
220 $date_due_in_time = $today->clone->set(hour => ($today->hour < 23 ? $today->hour + 1 : 23), minute => 59);
221 $date_due_in_time_as_formatted = output_pref( $date_due_in_time );
222 $issue_date = $date_due_in_time->clone->subtract_duration( DateTime::Duration->new( minutes => 1 ) );
223 AddIssue( $borrower, $barcode1, $date_due_in_time, undef, $issue_date );
224 $issue_date = $yesterday->clone;
225 AddIssue( $borrower, $barcode2, $date_due_in_time, undef, $issue_date );
227 $expected_slip = <<EOS;
232 Date due: $date_due_in_time_as_formatted
237 Date due: $date_due_in_time_as_formatted
243 $slip = IssueSlip( $branchcode, $borrowernumber );
244 is( $slip->{content}, $expected_slip, 'IssueSlip should return a slip with 2 checkouts' );
246 AddReturn( $barcode1, $branchcode );
247 AddReturn( $barcode2, $branchcode );
250 $date_due_in_time = $today->clone->set(hour => ($today->hour < 23 ? $today->hour + 1 : 23), minute => 59);
251 $date_due_in_time_as_formatted = output_pref( $date_due_in_time );
252 $issue_date = $date_due_in_time->clone->subtract_duration( DateTime::Duration->new( minutes => 1 ) );
253 AddIssue( $borrower, $barcode1, $date_due_in_time, undef, $issue_date );
254 $date_due_in_late = $today->clone->subtract( hours => 1 );
255 $date_due_in_late_as_formatted = output_pref( $date_due_in_late );
256 $issue_date = $yesterday->clone;
257 AddIssue( $borrower, $barcode2, $date_due_in_late, undef, $issue_date );
259 $expected_slip = <<EOS;
264 Date due: $date_due_in_time_as_formatted
271 Date due: $date_due_in_late_as_formatted
274 $slip = IssueSlip( $branchcode, $borrowernumber );
275 is( $slip->{content}, $expected_slip, 'IssueSlip should return a slip with 1 checkout and 1 overdue' );
277 AddReturn( $barcode1, $branchcode );
278 AddReturn( $barcode2, $branchcode );
283 subtest 'Quick slip' => sub {
286 subtest 'Empty slip' => sub {
288 my $slip = IssueSlip( $branchcode, $borrowernumber, 'quick slip' );
289 my $empty_slip = <<EOS;
293 is( $slip->{content}, $empty_slip, 'No checked out or overdues return an empty slip, it should return undef (FIXME)' );
296 subtest 'Daily loans' => sub {
298 skip "It's 23:59!", 2 if $today->hour == 23 and $today->minute == 59;
300 my $today_daily = $today->clone->set( hour => 23, minute => 59 );
301 my $today_daily_as_formatted = output_pref( $today_daily );
302 my $yesterday_daily = $yesterday->clone->set( hour => 23, minute => 59 );
303 my $yesterday_daily_as_formatted = output_pref( $yesterday_daily );
305 my ( $date_due, $issue_date, $slip, $expected_slip );
306 $date_due = $today_daily;
307 $issue_date = $today_daily->clone->subtract_duration( DateTime::Duration->new( minutes => 1 ) );
308 AddIssue( $borrower, $barcode1, $date_due, undef, $issue_date );
309 $date_due = $today_daily;
310 $issue_date = $yesterday_daily;
311 AddIssue( $borrower, $barcode2, $date_due, undef, $issue_date );
313 $expected_slip = <<EOS;
318 Date due: $today_daily_as_formatted
321 $slip = IssueSlip( $branchcode, $borrowernumber, 'quick slip' );
322 is( $slip->{content}, $expected_slip, 'IssueSlip should return 2 checkouts for today');
324 AddReturn( $barcode1, $branchcode );
325 AddReturn( $barcode2, $branchcode );
328 $date_due = $today_daily;
329 $issue_date = $today_daily->clone->subtract_duration( DateTime::Duration->new( minutes => 1 ) );
330 AddIssue( $borrower, $barcode1, $date_due, undef, $issue_date );
331 $date_due = $yesterday_daily;
332 $issue_date = $yesterday_daily;
333 AddIssue( $borrower, $barcode2, $date_due, undef, $issue_date );
335 $expected_slip = <<EOS;
340 Date due: $today_daily_as_formatted
343 $slip = IssueSlip( $branchcode, $borrowernumber, 'quickslip' );
344 is( $slip->{content}, $expected_slip );
347 subtest 'Hourly loans' => sub {
350 my ( $date_due_in_time, $date_due_in_time_as_formatted, $date_due_in_late, $date_due_in_late_as_formatted, $issue_date, $slip, $expected_slip );
351 # Assuming today is not hour = 23 and minute = 59
352 $date_due_in_time = $today->clone->set(hour => ($today->hour < 23 ? $today->hour + 1 : 23), minute => 59);
353 $date_due_in_time_as_formatted = output_pref( $date_due_in_time );
354 $issue_date = $date_due_in_time->clone->subtract_duration( DateTime::Duration->new( minutes => 1 ) );
355 AddIssue( $borrower, $barcode1, $date_due_in_time, undef, $issue_date );
356 $issue_date = $yesterday->clone;
357 AddIssue( $borrower, $barcode2, $date_due_in_time, undef, $issue_date );
359 $expected_slip = <<EOS;
364 Date due: $date_due_in_time_as_formatted
367 $slip = IssueSlip( $branchcode, $borrowernumber, 'quickslip' );
368 is( $slip->{content}, $expected_slip );
370 AddReturn( $barcode1, $branchcode );
371 AddReturn( $barcode2, $branchcode );
374 $date_due_in_time = $today->clone->set(hour => ($today->hour < 23 ? $today->hour + 1 : 23), minute => 59);
375 $date_due_in_time_as_formatted = output_pref( $date_due_in_time );
376 $issue_date = $date_due_in_time->clone->subtract_duration( DateTime::Duration->new( minutes => 1 ) );
377 AddIssue( $borrower, $barcode1, $date_due_in_time, undef, $issue_date );
378 $date_due_in_late = $today->clone->subtract( hours => 1 );
379 $date_due_in_late_as_formatted = output_pref( $date_due_in_late );
380 $issue_date = $yesterday->clone;
381 AddIssue( $borrower, $barcode2, $date_due_in_late, undef, $issue_date );
383 $expected_slip = <<EOS;
388 Date due: $date_due_in_time_as_formatted
391 $slip = IssueSlip( $branchcode, $borrowernumber, 'quickslip' );
392 is( $slip->{content}, $expected_slip );
394 AddReturn( $barcode1, $branchcode );
395 AddReturn( $barcode2, $branchcode );
400 subtest 'bad calls' => sub {
402 my $slip = IssueSlip();
403 is( $slip, undef, 'IssueSlip should return if no valid borrowernumber is passed' );
406 $schema->storage->txn_rollback;