Bug 10641 - GetBooksellerWithLateOrders in C4::Bookseller.pm has some incoherences
[koha.git] / t / db_dependent / Bookseller.t
1 #!/usr/bin/perl
2
3 use Modern::Perl;
4
5 use Test::More tests => 63;
6 use C4::Context;
7 use Koha::DateUtils;
8 use DateTime::Duration;
9 use C4::Acquisition;
10 use C4::Serials;
11 use C4::Budgets;
12 use C4::Biblio;
13
14 BEGIN {
15     use_ok('C4::Bookseller');
16 }
17
18 can_ok(
19
20     'C4::Bookseller', qw(
21       AddBookseller
22       DelBookseller
23       GetBookSeller
24       GetBookSellerFromId
25       GetBooksellersWithLateOrders
26       ModBookseller )
27 );
28
29 #Start transaction
30 my $dbh = C4::Context->dbh;
31 $dbh->{RaiseError} = 1;
32 $dbh->{AutoCommit} = 0;
33
34 #Start tests
35 $dbh->do(q|DELETE FROM aqorders|);
36 $dbh->do(q|DELETE FROM aqbasket|);
37 $dbh->do(q|DELETE FROM aqbooksellers|);
38 #Test AddBookseller
39 my $count            = scalar( C4::Bookseller::GetBookSeller('') );
40 my $sample_supplier1 = {
41     name          => 'Name1',
42     address1      => 'address1_1',
43     address2      => 'address1-2',
44     address3      => 'address1_2',
45     address4      => 'address1_2',
46     postal        => 'postal1',
47     phone         => 'phone1',
48     accountnumber => 'accountnumber1',
49     fax           => 'fax1',
50     url           => 'url1',
51     contact       => 'contact1',
52     contpos       => 'contpos1',
53     contphone     => 'contphone1',
54     contfax       => 'contefax1',
55     contaltphone  => 'contaltphone1',
56     contemail     => 'contemail1',
57     contnotes     => 'contnotes1',
58     active        => 1,
59     gstreg        => 1,
60     listincgst    => 1,
61     invoiceincgst => 1,
62     gstrate       => '1.0000',
63     discount      => '1.0000',
64     notes         => 'notes1',
65     deliverytime  => undef
66 };
67 my $sample_supplier2 = {
68     name          => 'Name2',
69     address1      => 'address1_2',
70     address2      => 'address2-2',
71     address3      => 'address3_2',
72     address4      => 'address4_2',
73     postal        => 'postal2',
74     phone         => 'phone2',
75     accountnumber => 'accountnumber2',
76     fax           => 'fax2',
77     url           => 'url2',
78     contact       => 'contact2',
79     contpos       => 'contpos2',
80     contphone     => 'contphone2',
81     contfax       => 'contefax2',
82     contaltphone  => 'contaltphone2',
83     contemail     => 'contemail2',
84     contnotes     => 'contnotes2',
85     active        => 1,
86     gstreg        => 1,
87     listincgst    => 1,
88     invoiceincgst => 1,
89     gstrate       => '2.0000',
90     discount      => '2.0000',
91     notes         => 'notes2',
92     deliverytime  => 2,
93 };
94
95 my $id_supplier1 = C4::Bookseller::AddBookseller($sample_supplier1);
96 my $id_supplier2 = C4::Bookseller::AddBookseller($sample_supplier2);
97
98 #my $id_bookseller3 = C4::Bookseller::AddBookseller();# NOTE : Doesn't work because the field name cannot be null
99
100 like( $id_supplier1, '/^\d+$/', "AddBookseller for supplier1 return an id" );
101 like( $id_supplier2, '/^\d+$/', "AddBookseller for supplier2 return an id" );
102 is( scalar( C4::Bookseller::GetBookSeller('') ),
103     $count + 2, "Supplier1 and Supplier2 have been added" );
104
105 #Test DelBookseller
106 my $del = C4::Bookseller::DelBookseller($id_supplier1);
107 is( $del, 1, "DelBookseller returns 1 - 1 supplier has been deleted " );
108 is( C4::Bookseller::GetBookSellerFromId($id_supplier1),
109     undef, "Supplier1  has been deleted - id_supplier1 doesnt exist anymore" );
110
111 #Test GetBookSeller
112 my @bookseller2 = C4::Bookseller::GetBookSeller( $sample_supplier2->{name} );
113 is( scalar(@bookseller2), 1, "Get only  Supplier2" );
114 $bookseller2[0] = field_filter( $bookseller2[0] );
115 delete $bookseller2[0]->{basketcount};
116
117 $sample_supplier2->{id} = $id_supplier2;
118 is_deeply( $bookseller2[0], $sample_supplier2,
119     "GetBookSeller returns the right informations about $sample_supplier2" );
120
121 $id_supplier1 = C4::Bookseller::AddBookseller($sample_supplier1);
122 my @booksellers = C4::Bookseller::GetBookSeller('')
123   ;    #NOTE :without params, it returns all the booksellers
124 for my $i ( 0 .. scalar(@booksellers) - 1 ) {
125     $booksellers[$i] = field_filter( $booksellers[$i] );
126     delete $booksellers[$i]->{basketcount};
127 }
128
129 $sample_supplier1->{id} = $id_supplier1;
130 is( scalar(@booksellers), $count + 2, "Get  Supplier1 and Supplier2" );
131 my @tab = ( $sample_supplier1, $sample_supplier2 );
132 is_deeply( \@booksellers, \@tab,
133     "Returns right fields of Supplier1 and Supplier2" );
134
135 #Test basketcount
136 my @bookseller1 = C4::Bookseller::GetBookSeller( $sample_supplier1->{name} );
137 #FIXME : if there is 0 basket, GetBookSeller returns 1 as basketcount
138 #is( $bookseller1[0]->{basketcount}, 0, 'Supplier1 has 0 basket' );
139 my $sample_basket1 =
140   C4::Acquisition::NewBasket( $id_supplier1, 'authorisedby1', 'basketname1' );
141 my $sample_basket2 =
142   C4::Acquisition::NewBasket( $id_supplier1, 'authorisedby2', 'basketname2' );
143 @bookseller1 = C4::Bookseller::GetBookSeller( $sample_supplier1->{name} );
144 is( $bookseller1[0]->{basketcount}, 2, 'Supplier1 has 2 baskets' );
145
146 #Test GetBookSellerFromId
147 my $bookseller1fromid = C4::Bookseller::GetBookSellerFromId();
148 is( $bookseller1fromid, undef,
149     "GetBookSellerFromId returns undef if no id given" );
150 $bookseller1fromid = C4::Bookseller::GetBookSellerFromId($id_supplier1);
151 $bookseller1fromid = field_filter($bookseller1fromid);
152 delete $bookseller1fromid->{basketcount};
153 delete $bookseller1fromid->{subscriptioncount};
154 is_deeply( $bookseller1fromid, $sample_supplier1,
155     "Get Supplier1 (GetBookSellerFromId)" );
156
157 #Test basketcount
158 $bookseller1fromid = C4::Bookseller::GetBookSellerFromId($id_supplier1);
159 is( $bookseller1fromid->{basketcount}, 2, 'Supplier1 has 2 baskets' );
160
161 #Test subscriptioncount
162 my $dt_today    = dt_from_string;
163 my $today       = output_pref( $dt_today, 'iso', '24hr', 1 );
164
165 my $dt_today1 = dt_from_string;
166 my $dur5 = DateTime::Duration->new( days => -5 );
167 $dt_today1->add_duration($dur5);
168 my $daysago5 = output_pref( $dt_today1, 'iso', '24hr', 1 );
169
170 my $budgetperiod = C4::Budgets::AddBudgetPeriod({
171     budget_period_startdate => $daysago5,
172     budget_period_enddate   => $today,
173     budget_description      => "budget desc"
174 });
175 my $id_budget = AddBudget({
176     budget_code        => "CODE",
177     budget_amount      => "123.132",
178     budget_name        => "Budgetname",
179     budget_notes       => "This is a note",
180     budget_description => "BudgetDescription",
181     budget_active      => 1,
182     budget_period_id   => $budgetperiod
183 });
184 my ($biblionumber, $biblioitemnumber) = AddBiblio(MARC::Record->new, '');
185 $bookseller1fromid = C4::Bookseller::GetBookSellerFromId($id_supplier1);
186 is( $bookseller1fromid->{subscriptioncount},
187     0, 'Supplier1 has 0 subscription' );
188 my $id_subscription1 = C4::Serials::NewSubscription(
189     undef,      "",            $id_supplier1, undef,
190     $id_budget, $biblionumber, '01-01-2013',  undef,
191     undef,      undef,         undef,         undef,
192     undef,      undef,         undef,         undef,
193     undef,      undef,         undef,         undef,
194     undef,      undef,         undef,         undef,
195     undef,      undef,         undef,         undef,
196     undef,      undef,         undef,         1,
197     "notes",    undef,         undef,         undef,
198     undef,      undef,         undef,         0,
199     "intnotes", 0,             undef,         undef,
200     0,          undef,         '31-12-2013',
201 );
202 my $id_subscription2 = C4::Serials::NewSubscription(
203     undef,      "",            $id_supplier1, undef,
204     $id_budget, $biblionumber, '01-01-2013',  undef,
205     undef,      undef,         undef,         undef,
206     undef,      undef,         undef,         undef,
207     undef,      undef,         undef,         undef,
208     undef,      undef,         undef,         undef,
209     undef,      undef,         undef,         undef,
210     undef,      undef,         undef,         1,
211     "notes",    undef,         undef,         undef,
212     undef,      undef,         undef,         0,
213     "intnotes", 0,             undef,         undef,
214     0,          undef,         '31-12-2013',
215 );
216 $bookseller1fromid = C4::Bookseller::GetBookSellerFromId($id_supplier1);
217 is( $bookseller1fromid->{subscriptioncount},
218     2, 'Supplier1 has 2 subscriptions' );
219
220 #Test ModBookseller
221 $sample_supplier2 = {
222     id            => $id_supplier2,
223     name          => 'Name2 modified',
224     address1      => 'address1_2 modified',
225     address2      => 'address2-2 modified',
226     address3      => 'address3_2 modified',
227     address4      => 'address4_2 modified',
228     postal        => 'postal2 modified',
229     phone         => 'phone2 modified',
230     accountnumber => 'accountnumber2 modified',
231     fax           => 'fax2 modified',
232     url           => 'url2 modified',
233     contact       => 'contact2 modified',
234     contpos       => 'contpos2 modified',
235     contphone     => 'contphone2 modified',
236     contfax       => 'contefax2 modified',
237     contaltphone  => 'contaltphone2 modified',
238     contemail     => 'contemail2 modified',
239     contnotes     => 'contnotes2 modified',
240     active        => 1,
241     gstreg        => 1,
242     listincgst    => 1,
243     invoiceincgst => 1,
244     gstrate       => '2.0000 ',
245     discount      => '2.0000',
246     notes         => 'notes2 modified',
247     deliverytime  => 2,
248 };
249
250 my $modif1 = C4::Bookseller::ModBookseller();
251 is( $modif1, undef,
252     "ModBookseller returns undef if no params given - Nothing happened" );
253 $modif1 = C4::Bookseller::ModBookseller($sample_supplier2);
254 is( $modif1, 1, "ModBookseller modifies only the supplier2" );
255 is( scalar( C4::Bookseller::GetBookSeller('') ),
256     $count + 2, "Supplier2 has been modified - Nothing added" );
257
258 $modif1 = C4::Bookseller::ModBookseller(
259     {
260         id   => -1,
261         name => 'name3'
262     }
263 );
264 #is( $modif1, '0E0',
265 #    "ModBookseller returns OEO if the id doesnt exist - Nothing modified" );
266
267 #Test GetBooksellersWithLateOrders
268 #Add 2 suppliers
269 my $sample_supplier3 = {
270     name          => 'Name3',
271     address1      => 'address1_3',
272     address2      => 'address1-3',
273     address3      => 'address1_3',
274     address4      => 'address1_3',
275     postal        => 'postal3',
276     phone         => 'phone3',
277     accountnumber => 'accountnumber3',
278     fax           => 'fax3',
279     url           => 'url3',
280     contact       => 'contact3',
281     contpos       => 'contpos3',
282     contphone     => 'contphone3',
283     contfax       => 'contefax3',
284     contaltphone  => 'contaltphone3',
285     contemail     => 'contemail3',
286     contnotes     => 'contnotes3',
287     active        => 1,
288     gstreg        => 1,
289     listincgst    => 1,
290     invoiceincgst => 1,
291     gstrate       => '3.0000',
292     discount      => '3.0000',
293     notes         => 'notes3',
294     deliverytime  => 3
295 };
296 my $sample_supplier4 = {
297     name          => 'Name4',
298     address1      => 'address1_4',
299     address2      => 'address1-4',
300     address3      => 'address1_4',
301     address4      => 'address1_4',
302     postal        => 'postal4',
303     phone         => 'phone4',
304     accountnumber => 'accountnumber4',
305     fax           => 'fax4',
306     url           => 'url4',
307     contact       => 'contact4',
308     contpos       => 'contpos4',
309     contphone     => 'contphone4',
310     contfax       => 'contefax4',
311     contaltphone  => 'contaltphone4',
312     contemail     => 'contemail4',
313     contnotes     => 'contnotes4',
314     active        => 1,
315     gstreg        => 1,
316     listincgst    => 1,
317     invoiceincgst => 1,
318     gstrate       => '3.0000',
319     discount      => '3.0000',
320     notes         => 'notes3',
321 };
322 my $id_supplier3 = C4::Bookseller::AddBookseller($sample_supplier3);
323 my $id_supplier4 = C4::Bookseller::AddBookseller($sample_supplier4);
324
325 #Add 2 baskets
326 my $sample_basket3 =
327   C4::Acquisition::NewBasket( $id_supplier3, 'authorisedby3', 'basketname3',
328     'basketnote3' );
329 my $sample_basket4 =
330   C4::Acquisition::NewBasket( $id_supplier4, 'authorisedby4', 'basketname4',
331     'basketnote4' );
332
333 #Modify the basket to add a close date
334 my $basket1info = {
335     basketno     => $sample_basket1,
336     closedate    => $today,
337     booksellerid => $id_supplier1
338 };
339
340 my $basket2info = {
341     basketno     => $sample_basket2,
342     closedate    => $daysago5,
343     booksellerid => $id_supplier2
344 };
345
346 my $dt_today2 = dt_from_string;
347 my $dur10 = DateTime::Duration->new( days => -10 );
348 $dt_today2->add_duration($dur10);
349 my $daysago10 = output_pref( $dt_today2, 'iso', '24hr', 1 );
350 my $basket3info = {
351     basketno  => $sample_basket3,
352     closedate => $daysago10,
353 };
354
355 my $basket4info = {
356     basketno  => $sample_basket4,
357     closedate => $today,
358 };
359 ModBasket($basket1info);
360 ModBasket($basket2info);
361 ModBasket($basket3info);
362 ModBasket($basket4info);
363
364 #Add 1 subscription
365 my $id_subscription3 = C4::Serials::NewSubscription(
366     undef,      "",            $id_supplier3, undef,
367     $id_budget, $biblionumber, '01-01-2013',  undef,
368     undef,      undef,         undef,         undef,
369     undef,      undef,         undef,         undef,
370     undef,      undef,         undef,         undef,
371     undef,      undef,         undef,         undef,
372     undef,      undef,         undef,         undef,
373     undef,      undef,         undef,         1,
374     "notes",    undef,         undef,         undef,
375     undef,      undef,         undef,         0,
376     "intnotes", 0,             undef,         undef,
377     0,          undef,         '31-12-2013',
378 );
379
380 #Add 4 orders
381 my ( $ordernumber1, $ordernumber2, $ordernumber3, $ordernumber4 );
382 my ( $basketno1,    $basketno2,    $basketno3,    $basketno4 );
383 ( $basketno1, $ordernumber1 ) = C4::Acquisition::NewOrder(
384     {
385         basketno         => $sample_basket1,
386         quantity         => 24,
387         biblionumber     => $biblionumber,
388         budget_id        => $id_budget,
389         entrydate        => '01-01-2013',
390         currency         => 'EUR',
391         notes            => "This is a note1",
392         gstrate          => 0.0500,
393         orderstatus      => 1,
394         subscriptionid   => $id_subscription1,
395         quantityreceived => 2,
396         rrp              => 10,
397         ecost            => 10,
398         datereceived     => '01-06-2013'
399     }
400 );
401 ( $basketno2, $ordernumber2 ) = C4::Acquisition::NewOrder(
402     {
403         basketno       => $sample_basket2,
404         quantity       => 20,
405         biblionumber   => $biblionumber,
406         budget_id      => $id_budget,
407         entrydate      => '01-01-2013',
408         currency       => 'EUR',
409         notes          => "This is a note2",
410         gstrate        => 0.0500,
411         orderstatus    => 1,
412         subscriptionid => $id_subscription2,
413         rrp            => 10,
414         ecost          => 10,
415     }
416 );
417 ( $basketno3, $ordernumber3 ) = C4::Acquisition::NewOrder(
418     {
419         basketno       => $sample_basket3,
420         quantity       => 20,
421         biblionumber   => $biblionumber,
422         budget_id      => $id_budget,
423         entrydate      => '02-02-2013',
424         currency       => 'EUR',
425         notes          => "This is a note3",
426         gstrate        => 0.0500,
427         orderstatus    => 2,
428         subscriptionid => $id_subscription3,
429         rrp            => 11,
430         ecost          => 11,
431     }
432 );
433 ( $basketno4, $ordernumber4 ) = C4::Acquisition::NewOrder(
434     {
435         basketno         => $sample_basket4,
436         quantity         => 20,
437         biblionumber     => $biblionumber,
438         budget_id        => $id_budget,
439         entrydate        => '02-02-2013',
440         currency         => 'EUR',
441         notes            => "This is a note3",
442         gstrate          => 0.0500,
443         orderstatus      => 2,
444         subscriptionid   => $id_subscription3,
445         rrp              => 11,
446         ecost            => 11,
447         quantityreceived => 20
448     }
449 );
450
451 #Test cases:
452 # Sample datas :
453 #   Supplier1: delivery -> undef Basket1 : closedate -> today
454 #   Supplier2: delivery -> 2     Basket2 : closedate -> $daysago5
455 #   Supplier3: delivery -> 3     Basket3 : closedate -> $daysago10
456 #Case 1 : Without parameters:
457 #   quantityreceived < quantity AND rrp <> 0 AND ecost <> 0 AND quantity - COALESCE(quantityreceived,0) <> 0 AND closedate IS NOT NULL -LATE-
458 #   datereceived !null AND rrp <> 0 AND ecost <> 0 AND quantity - COALESCE(quantityreceived,0) <> 0 AND closedate IS NOT NULL -LATE-
459 #   datereceived !null AND rrp <> 0 AND ecost <> 0 AND quantity - COALESCE(quantityreceived,0) <> 0 AND closedate IS NOT NULL -LATE-
460 #   quantityreceived = quantity -NOT LATE-
461 my %suppliers = C4::Bookseller::GetBooksellersWithLateOrders();
462 ok( exists( $suppliers{$id_supplier1} ), "Supplier1 has late orders" );
463 ok( exists( $suppliers{$id_supplier2} ), "Supplier2 has late orders" );
464 ok( exists( $suppliers{$id_supplier3} ), "Supplier3 has late orders" );
465 isnt( exists( $suppliers{$id_supplier4} ), 1, "Supplier4 hasnt late orders" )
466   ;    # Quantity = quantityreceived
467
468 #Case 2: With $delay = 4
469 #    today + 0 > now-$delay -NOT LATE-
470 #    (today-5) + 2   <= now() - $delay -NOT LATE-
471 #    (today-10) + 3  <= now() - $delay -LATE-
472 #    quantityreceived = quantity -NOT LATE-
473 %suppliers = C4::Bookseller::GetBooksellersWithLateOrders( 4, undef, undef );
474 isnt( exists( $suppliers{$id_supplier1} ),
475     1, "Supplier1 has late orders but  today  > now() - 4 days" );
476 isnt( exists( $suppliers{$id_supplier2} ),
477     1, "Supplier2 has late orders and $daysago5 <= now() - (4 days+2)" );
478 ok( exists( $suppliers{$id_supplier3} ),
479     "Supplier3 has late orders and $daysago10  <= now() - (4 days+3)" );
480 isnt( exists( $suppliers{$id_supplier4} ), 1, "Supplier4 hasnt late orders" );
481
482 #Case 3: With $delay = -1
483 is( C4::Bookseller::GetBooksellersWithLateOrders( -1, undef, undef ),
484     undef, "-1 is a wrong value for a delay" );
485
486 #Case 4: With $delay = 0
487 #    today  == now-0 -LATE- (if no deliverytime or deliverytime == 0)
488 #    today-5   <= now() - $delay+2 -LATE-
489 #    today-10  <= now() - $delay+3 -LATE-
490 #    quantityreceived = quantity -NOT LATE-
491 %suppliers = C4::Bookseller::GetBooksellersWithLateOrders( 0, undef, undef );
492
493 ok( exists( $suppliers{$id_supplier1} ),
494     "Supplier1 has late orders but $today == now() - 0 days" )
495   ;
496 ok( exists( $suppliers{$id_supplier2} ),
497     "Supplier2 has late orders and $daysago5 <= now() - 2" );
498 ok( exists( $suppliers{$id_supplier3} ),
499     "Supplier3 has late orders and $daysago10 <= now() - 3" );
500 isnt( exists( $suppliers{$id_supplier4} ), 1, "Supplier4 hasnt late orders" );
501
502 #Case 5 : With $estimateddeliverydatefrom = today-4
503 #    today >= today-4 -NOT LATE-
504 #    (today-5)+ 2 days >= today-4  -LATE-
505 #    (today-10) + 3 days < today-4   -NOT LATE-
506 #    quantityreceived = quantity -NOT LATE-
507 my $dt_today3 = dt_from_string;
508 my $dur4 = DateTime::Duration->new( days => -4 );
509 $dt_today3->add_duration($dur4);
510 my $daysago4 = output_pref( $dt_today3, 'iso', '24hr', 1 );
511 %suppliers =
512   C4::Bookseller::GetBooksellersWithLateOrders( undef, $daysago4, undef );
513
514 ok( exists( $suppliers{$id_supplier1} ),
515     "Supplier1 has late orders and $today >= $daysago4 -deliverytime undef" );
516 ok( exists( $suppliers{$id_supplier2} ),
517     "Supplier2 has late orders and $daysago5 + 2 days >= $daysago4 " );
518 isnt( exists( $suppliers{$id_supplier3} ),
519     1, "Supplier3 has late orders and $daysago10 + 5 days < $daysago4 " );
520 isnt( exists( $suppliers{$id_supplier4} ), 1, "Supplier4 hasnt late orders" );
521
522 #Case 6: With $estimateddeliverydatefrom =today-10 and $estimateddeliverydateto = today - 5
523 #    $daysago10<$daysago5<today -NOT LATE-
524 #    $daysago10<$daysago5<$daysago5 +2 -NOT lATE-
525 #    $daysago10<$daysago10 +3 <$daysago5 -LATE-
526 #    quantityreceived = quantity -NOT LATE-
527 %suppliers = C4::Bookseller::GetBooksellersWithLateOrders( undef, $daysago10,
528     $daysago5 );
529 isnt( exists( $suppliers{$id_supplier1} ),
530     1, "Supplier1 has late orders but $daysago10 < $daysago5 < $today" );
531 isnt(
532     exists( $suppliers{$id_supplier2} ),
533     1,
534     "Supplier2 has late orders but $daysago10 < $daysago5 < $daysago5+2"
535 );
536 ok(
537     exists( $suppliers{$id_supplier3} ),
538 "Supplier3 has late orders and $daysago10 <= $daysago10 +3 <= $daysago5"
539 );
540 isnt( exists( $suppliers{$id_supplier4} ), 1, "Supplier4 hasnt late orders" );
541
542 #Case 7: With $estimateddeliverydateto = today-5
543 #    $today >= $daysago5  -NOT LATE-
544 #    $daysago5 + 2 days  > $daysago5 -NOT LATE-
545 #    $daysago10 + 3  <+ $daysago5  -LATE-
546 #    quantityreceived = quantity -NOT LATE-
547 %suppliers =
548   C4::Bookseller::GetBooksellersWithLateOrders( undef, undef, $daysago5 );
549 isnt( exists( $suppliers{$id_supplier1} ),
550     1,
551     "Supplier1 has late orders but $today >= $daysago5 - deliverytime undef" );
552 isnt( exists( $suppliers{$id_supplier2} ),
553     1, "Supplier2 has late orders but  $daysago5 + 2 days  > $daysago5 " );
554 ok( exists( $suppliers{$id_supplier3} ),
555     "Supplier3 has late orders and $daysago10 + 3  <= $daysago5" );
556 isnt( exists( $suppliers{$id_supplier4} ), 1, "Supplier4 hasnt late orders" );
557
558 #Test with $estimateddeliverydatefrom and  $estimateddeliverydateto and $delay
559 #Case 8 :With $estimateddeliverydatefrom = 2013-07-05 and  $estimateddeliverydateto = 2013-07-08 and $delay =5
560 #    $daysago4<today<=$today and $today<now()-3  -NOT LATE-
561 #    $daysago4 < $daysago5 + 2days <= today and $daysago5 <= now()-3+2 days -LATE-
562 #    $daysago4 > $daysago10 + 3days < today and $daysago10 <= now()-3+3 days -NOT LATE-
563 #    quantityreceived = quantity -NOT LATE-
564 %suppliers =
565   C4::Bookseller::GetBooksellersWithLateOrders( 3, $daysago4, $today );
566 isnt(
567     exists( $suppliers{$id_supplier1} ),
568     1,
569     "Supplier1 has late orders but $daysago4<today<=$today and $today<now()-3"
570 );
571 ok(
572     exists( $suppliers{$id_supplier2} ),
573 "Supplier2 has late orders and $daysago4 < $daysago5 + 2days <= today and $daysago5 <= now()-3+2 days"
574 );
575 isnt(
576     exists( $suppliers{$id_supplier3} ),
577 "Supplier3 has late orders but $daysago4 > $daysago10 + 3days < today and $daysago10 <= now()-3+3 days"
578 );
579 isnt( exists( $suppliers{$id_supplier4} ), 1, "Supplier4 hasnt late orders" );
580
581 #Case 9 :With $estimateddeliverydatefrom = $daysago5  and $delay = 3
582 #   $today < $daysago5 and $today > $today-5 -NOT LATE-
583 #   $daysago5 + 2 days >= $daysago5  and $daysago5 < today - 3+2 -LATE-
584 #   $daysago10 + 3 days < $daysago5 and $daysago10 < today -3+2-NOT LATE-
585 #   quantityreceived = quantity -NOT LATE-
586 %suppliers =
587   C4::Bookseller::GetBooksellersWithLateOrders( 3, $daysago5, undef );
588 isnt( exists( $suppliers{$id_supplier1} ),
589     1, "$today < $daysago10 and $today > $today-3" );
590 ok(
591     exists( $suppliers{$id_supplier2} ),
592 "Supplier2 has late orders and $daysago5 + 2 days >= $daysago5  and $daysago5 < today - 3+2"
593 );
594 isnt(
595     exists( $suppliers{$id_supplier3} ),
596     1,
597 "Supplier2 has late orders but $daysago10 + 3 days < $daysago5 and $daysago10 < today -3+2 "
598 );
599 isnt( exists( $suppliers{$id_supplier4} ), 1, "Supplier4 hasnt late orders" );
600
601 #Test with $estimateddeliverydateto  and $delay
602 #Case 10:With $estimateddeliverydateto = $daysago5 and $delay = 5
603 #    today > $daysago5 today > now() -5 -NOT LATE-
604 #    $daysago5 + 2 days > $daysago5  and $daysago5 > now() - 2+5 days -NOT LATE-
605 #    $daysago10 + 3 days <= $daysago5 and $daysago10 <= now() - 3+5 days -LATE-
606 #    quantityreceived = quantity -NOT LATE-
607 %suppliers =
608   C4::Bookseller::GetBooksellersWithLateOrders( 5, undef, $daysago5 );
609 isnt( exists( $suppliers{$id_supplier1} ),
610     1, "Supplier2 has late orders but today > $daysago5 today > now() -5" );
611 isnt(
612     exists( $suppliers{$id_supplier2} ),
613     1,
614 "Supplier2 has late orders but $daysago5 + 2 days > $daysago5  and $daysago5 > now() - 2+5 days"
615 );
616 ok(
617     exists( $suppliers{$id_supplier3} ),
618 "Supplier2 has late orders and $daysago10 + 3 days <= $daysago5 and $daysago10 <= now() - 3+5 days "
619 );
620 isnt( exists( $suppliers{$id_supplier4} ), 1, "Supplier4 hasnt late orders" );
621
622 #Case 11: With $estimateddeliverydatefrom =today-10 and $estimateddeliverydateto = today - 10
623 #    $daysago10==$daysago10==$daysago10 -NOT LATE-
624 #    $daysago10==$daysago10<$daysago5+2-NOT lATE-
625 #    $daysago10==$daysago10 <$daysago10+3-LATE-
626 #    quantityreceived = quantity -NOT LATE-
627
628 #Basket1 closedate -> $daysago10
629 $basket1info = {
630     basketno  => $sample_basket1,
631     closedate => $daysago10,
632 };
633 ModBasket($basket1info);
634 %suppliers = C4::Bookseller::GetBooksellersWithLateOrders( undef, $daysago10,
635     $daysago10 );
636 ok( exists( $suppliers{$id_supplier1} ),
637     "Supplier1 has late orders and $daysago10==$daysago10==$daysago10 " )
638   ;
639 isnt( exists( $suppliers{$id_supplier2} ),
640     1,
641     "Supplier2 has late orders but $daysago10==$daysago10<$daysago5+2" );
642 isnt( exists( $suppliers{$id_supplier3} ),
643     1,
644     "Supplier3 has late orders but $daysago10==$daysago10 <$daysago10+3" );
645 isnt( exists( $suppliers{$id_supplier4} ), 1, "Supplier4 hasnt late orders" );
646
647 #Case 12: closedate == $estimateddeliverydatefrom =today-10
648 %suppliers =
649   C4::Bookseller::GetBooksellersWithLateOrders( undef, $daysago10, undef );
650 ok( exists( $suppliers{$id_supplier1} ),
651     "Supplier1 has late orders and $daysago10==$daysago10 " );
652
653 #Case 13: closedate == $estimateddeliverydateto =today-10
654 %suppliers =
655   C4::Bookseller::GetBooksellersWithLateOrders( undef, undef, $daysago10 );
656 ok( exists( $suppliers{$id_supplier1} ),
657     "Supplier1 has late orders and $daysago10==$daysago10 " )
658   ;
659
660 #End transaction
661 $dbh->rollback;
662
663 #field_filter filters the useless fields or foreign keys
664 #NOTE: all the fields of aqbookseller arent considered
665 #returns a cleaned structure
666 sub field_filter {
667     my ($struct) = @_;
668
669     for my $field (
670         'bookselleremail', 'booksellerfax',
671         'booksellerurl',   'othersupplier',
672         'currency',        'invoiceprice',
673         'listprice'
674       )
675     {
676
677         if ( grep { /^$field$/ } keys %$struct ) {
678             delete $struct->{$field};
679         }
680     }
681     return $struct;
682 }