5 use Test::More tests => 3;
15 use Koha::DateUtils qw( dt_from_string output_pref );
16 use DateTime::Duration;
20 my $dbh = C4::Context->dbh;
21 $dbh->{AutoCommit} = 0;
22 $dbh->{RaiseError} = 1;
24 $dbh->do(q|DELETE FROM issues|);
25 $dbh->do(q|DELETE FROM borrowers|);
26 $dbh->do(q|DELETE FROM items|);
27 $dbh->do(q|DELETE FROM branches|);
28 $dbh->do(q|DELETE FROM biblio|);
29 $dbh->do(q|DELETE FROM categories|);
30 $dbh->do(q|DELETE FROM letter|);
33 ModBranch( { add => 1, branchcode => $branchcode, branchname => 'Branch' } );
35 my $categorycode = 'C';
36 $dbh->do( "INSERT INTO categories(categorycode) VALUES(?)",
37 undef, $categorycode );
39 my %item_branch_infos = (
40 homebranch => $branchcode,
41 holdingbranch => $branchcode,
44 my $slip_content = <<EOS;
47 Title: <<biblio.title>>
48 Barcode: <<items.barcode>>
49 Date due: <<issues.date_due>>
54 Title: <<biblio.title>>
55 Barcode: <<items.barcode>>
56 Date due: <<issues.date_due>>
61 INSERT INTO letter( module, code, branchcode, name, is_html, title, content, message_transport_type) VALUES ('circulation', 'ISSUESLIP', '', 'Issue Slip', 0, 'Issue Slip', ?, 'email')
62 |, {}, $slip_content);
64 my $quick_slip_content = <<EOS;
67 Title: <<biblio.title>>
68 Barcode: <<items.barcode>>
69 Date due: <<issues.date_due>>
74 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')
75 |, {}, $quick_slip_content);
77 my ( $title1, $title2 ) = ( 'My title 1', 'My title 2' );
78 my ( $barcode1, $barcode2 ) = ('BC0101', 'BC0202' );
79 my $record = MARC::Record->new;
80 $record->append_fields(
86 my ($biblionumber1) = AddBiblio( $record, '' );
88 AddItem( { barcode => $barcode1, %item_branch_infos }, $biblionumber1 );
90 $record = MARC::Record->new;
91 $record->append_fields(
97 my ($biblionumber2) = AddBiblio( $record, '' );
99 AddItem( { barcode => $barcode2, %item_branch_infos }, $biblionumber2 );
102 AddMember( categorycode => $categorycode, branchcode => $branchcode );
103 my $borrower = GetMember( borrowernumber => $borrowernumber );
105 my $module = new Test::MockModule('C4::Context');
106 $module->mock( 'userenv', sub { { branch => $branchcode } } );
108 my $today = dt_from_string;
109 my $yesterday = dt_from_string->subtract_duration( DateTime::Duration->new( days => 1 ) );
111 subtest 'Issue slip' => sub {
114 subtest 'Empty slip' => sub {
116 my $slip = IssueSlip( $branchcode, $borrowernumber );
117 my $empty_slip = <<EOS;
124 is( $slip->{content}, $empty_slip, 'No checked out or overdues return an empty slip, it should return undef (FIXME)' );
127 subtest 'Daily loans' => sub {
129 skip "It's 23:59!", 2 if $today->hour == 23 and $today->minute == 59;
131 my $today_daily = $today->clone->set( hour => 23, minute => 59 );
132 my $today_daily_as_formatted = output_pref( $today_daily );
133 my $yesterday_daily = $yesterday->clone->set( hour => 23, minute => 59 );
134 my $yesterday_daily_as_formatted = output_pref( $yesterday_daily );
136 my ( $date_due, $issue_date, $slip, $expected_slip );
137 $date_due = $today_daily;
138 $issue_date = $today_daily->clone->subtract_duration( DateTime::Duration->new( minutes => 1 ) );
139 AddIssue( $borrower, $barcode1, $date_due, undef, $issue_date );
140 $date_due = $today_daily;
141 $issue_date = $yesterday_daily;
142 AddIssue( $borrower, $barcode2, $date_due, undef, $issue_date );
144 $expected_slip = <<EOS;
149 Date due: $today_daily_as_formatted
154 Date due: $today_daily_as_formatted
160 $slip = IssueSlip( $branchcode, $borrowernumber );
161 is( $slip->{content}, $expected_slip , 'IssueSlip should return a slip with 2 checkouts');
163 AddReturn( $barcode1, $branchcode );
164 AddReturn( $barcode2, $branchcode );
167 $date_due = $today_daily;
168 $issue_date = $today_daily->clone->subtract_duration( DateTime::Duration->new( minutes => 1 ) );
169 AddIssue( $borrower, $barcode1, $date_due, undef, $issue_date );
170 $date_due = $yesterday_daily;
171 $issue_date = $yesterday_daily;
172 AddIssue( $borrower, $barcode2, $date_due, undef, $issue_date );
174 $expected_slip = <<EOS;
179 Date due: $today_daily_as_formatted
186 Date due: $yesterday_daily_as_formatted
189 $slip = IssueSlip( $branchcode, $borrowernumber );
190 is( $slip->{content}, $expected_slip, 'IssueSlip should return a slip with 1 checkout and 1 overdue');
192 AddReturn( $barcode1, $branchcode );
193 AddReturn( $barcode2, $branchcode );
196 subtest 'Hourly loans' => sub {
198 skip "It's 23:59!", 2 if $today->hour == 23 and $today->minute == 59;
200 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 );
201 # Assuming today is not hour = 23 and minute = 59
202 $date_due_in_time = $today->clone->set(hour => ($today->hour < 23 ? $today->hour + 1 : 23), minute => 59);
203 $date_due_in_time_as_formatted = output_pref( $date_due_in_time );
204 $issue_date = $date_due_in_time->clone->subtract_duration( DateTime::Duration->new( minutes => 1 ) );
205 AddIssue( $borrower, $barcode1, $date_due_in_time, undef, $issue_date );
206 $issue_date = $yesterday->clone;
207 AddIssue( $borrower, $barcode2, $date_due_in_time, undef, $issue_date );
209 $expected_slip = <<EOS;
214 Date due: $date_due_in_time_as_formatted
219 Date due: $date_due_in_time_as_formatted
225 $slip = IssueSlip( $branchcode, $borrowernumber );
226 is( $slip->{content}, $expected_slip, 'IssueSlip should return a slip with 2 checkouts' );
228 AddReturn( $barcode1, $branchcode );
229 AddReturn( $barcode2, $branchcode );
232 $date_due_in_time = $today->clone->set(hour => ($today->hour < 23 ? $today->hour + 1 : 23), minute => 59);
233 $date_due_in_time_as_formatted = output_pref( $date_due_in_time );
234 $issue_date = $date_due_in_time->clone->subtract_duration( DateTime::Duration->new( minutes => 1 ) );
235 AddIssue( $borrower, $barcode1, $date_due_in_time, undef, $issue_date );
236 $date_due_in_late = $today->clone->set(hour => $today->hour - 1);
237 $date_due_in_late_as_formatted = output_pref( $date_due_in_late );
238 $issue_date = $yesterday->clone;
239 AddIssue( $borrower, $barcode2, $date_due_in_late, undef, $issue_date );
241 $expected_slip = <<EOS;
246 Date due: $date_due_in_time_as_formatted
253 Date due: $date_due_in_late_as_formatted
256 $slip = IssueSlip( $branchcode, $borrowernumber );
257 is( $slip->{content}, $expected_slip, 'IssueSlip should return a slip with 1 checkout and 1 overdue' );
259 AddReturn( $barcode1, $branchcode );
260 AddReturn( $barcode2, $branchcode );
265 subtest 'Quick slip' => sub {
268 subtest 'Empty slip' => sub {
270 my $slip = IssueSlip( $branchcode, $borrowernumber, 'quick slip' );
271 my $empty_slip = <<EOS;
275 is( $slip->{content}, $empty_slip, 'No checked out or overdues return an empty slip, it should return undef (FIXME)' );
278 subtest 'Daily loans' => sub {
280 skip "It's 23:59!", 2 if $today->hour == 23 and $today->minute == 59;
282 my $today_daily = $today->clone->set( hour => 23, minute => 59 );
283 my $today_daily_as_formatted = output_pref( $today_daily );
284 my $yesterday_daily = $yesterday->clone->set( hour => 23, minute => 59 );
285 my $yesterday_daily_as_formatted = output_pref( $yesterday_daily );
287 my ( $date_due, $issue_date, $slip, $expected_slip );
288 $date_due = $today_daily;
289 $issue_date = $today_daily->clone->subtract_duration( DateTime::Duration->new( minutes => 1 ) );
290 AddIssue( $borrower, $barcode1, $date_due, undef, $issue_date );
291 $date_due = $today_daily;
292 $issue_date = $yesterday_daily;
293 AddIssue( $borrower, $barcode2, $date_due, undef, $issue_date );
295 $expected_slip = <<EOS;
300 Date due: $today_daily_as_formatted
303 $slip = IssueSlip( $branchcode, $borrowernumber, 'quick slip' );
304 is( $slip->{content}, $expected_slip, 'IssueSlip should return 2 checkouts for today');
306 AddReturn( $barcode1, $branchcode );
307 AddReturn( $barcode2, $branchcode );
310 $date_due = $today_daily;
311 $issue_date = $today_daily->clone->subtract_duration( DateTime::Duration->new( minutes => 1 ) );
312 AddIssue( $borrower, $barcode1, $date_due, undef, $issue_date );
313 $date_due = $yesterday_daily;
314 $issue_date = $yesterday_daily;
315 AddIssue( $borrower, $barcode2, $date_due, undef, $issue_date );
317 $expected_slip = <<EOS;
322 Date due: $today_daily_as_formatted
325 $slip = IssueSlip( $branchcode, $borrowernumber, 'quickslip' );
326 is( $slip->{content}, $expected_slip );
329 subtest 'Hourly loans' => sub {
332 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 );
333 # Assuming today is not hour = 23 and minute = 59
334 $date_due_in_time = $today->clone->set(hour => ($today->hour < 23 ? $today->hour + 1 : 23), minute => 59);
335 $date_due_in_time_as_formatted = output_pref( $date_due_in_time );
336 $issue_date = $date_due_in_time->clone->subtract_duration( DateTime::Duration->new( minutes => 1 ) );
337 AddIssue( $borrower, $barcode1, $date_due_in_time, undef, $issue_date );
338 $issue_date = $yesterday->clone;
339 AddIssue( $borrower, $barcode2, $date_due_in_time, undef, $issue_date );
341 $expected_slip = <<EOS;
346 Date due: $date_due_in_time_as_formatted
349 $slip = IssueSlip( $branchcode, $borrowernumber, 'quickslip' );
350 is( $slip->{content}, $expected_slip );
352 AddReturn( $barcode1, $branchcode );
353 AddReturn( $barcode2, $branchcode );
356 $date_due_in_time = $today->clone->set(hour => ($today->hour < 23 ? $today->hour + 1 : 23), minute => 59);
357 $date_due_in_time_as_formatted = output_pref( $date_due_in_time );
358 $issue_date = $date_due_in_time->clone->subtract_duration( DateTime::Duration->new( minutes => 1 ) );
359 AddIssue( $borrower, $barcode1, $date_due_in_time, undef, $issue_date );
360 $date_due_in_late = $today->clone->set(hour => $today->hour - 1);
361 $date_due_in_late_as_formatted = output_pref( $date_due_in_late );
362 $issue_date = $yesterday->clone;
363 AddIssue( $borrower, $barcode2, $date_due_in_late, undef, $issue_date );
365 $expected_slip = <<EOS;
370 Date due: $date_due_in_time_as_formatted
373 $slip = IssueSlip( $branchcode, $borrowernumber, 'quickslip' );
374 is( $slip->{content}, $expected_slip );
376 AddReturn( $barcode1, $branchcode );
377 AddReturn( $barcode2, $branchcode );
382 subtest 'bad calls' => sub {
384 AddIssue( $borrower, $barcode1, $today, undef, $yesterday );
385 my $slip = IssueSlip();
386 isnt( $slip, undef, 'IssueSlip should return if no param passed FIXME, should return undef' );
387 my $empty_slip = <<EOS;
395 $slip = IssueSlip(undef, $borrowernumber+1);
396 is( $slip->{content}, $empty_slip, 'IssueSlip should not return an empty slip if the borrowernumber passed in param does not exist. But it is what it does for now (FIXME)' );