Bug 15531: Add support for standing orders
[koha.git] / t / db_dependent / Acquisition / StandingOrders.t
1 #!/usr/bin/perl
2
3 use Modern::Perl;
4
5 use Test::More tests => 14;
6 use C4::Context;
7 use C4::Acquisition;
8 use C4::Biblio;
9 use C4::Items;
10 use C4::Bookseller;
11 use C4::Budgets;
12 use Koha::Acquisition::Order;
13 use t::lib::Mocks;
14 use t::lib::TestBuilder;
15
16 my $schema = Koha::Database->schema;
17 $schema->storage->txn_begin;
18 my $builder = t::lib::TestBuilder->new;
19
20 # Set up configuration data
21
22 my $branch = $builder->build( { source => 'Branch' } );
23 my $bookseller = $builder->build( { source => 'Aqbookseller' } );
24 my $budget = $builder->build( { source => 'Aqbudget' } );
25 my $staffmember = $builder->build( { source => 'Borrower' } );
26
27 # Create baskets and orders
28
29 my $basketno = NewBasket(
30     $bookseller->{id},
31     $staffmember->{borrowernumber},
32     'Standing order basket', # basketname
33     '', # basketnote
34     '', # basketbooksellernote
35     undef, # basketcontractnumber
36     $branch->{branchcode}, # deliveryplace
37     $branch->{branchcode}, # billingplace
38     1 # is_standing
39 );
40
41 my $nonstandingbasketno = NewBasket(
42     $bookseller->{id},
43     $staffmember->{borrowernumber},
44     'Non-standing order basket', # basketname
45     '', # basketnote
46     '', # basketbooksellernote
47     undef, # basketcontractnumber
48     $branch->{branchcode}, # deliveryplace
49     $branch->{branchcode}, # billingplace
50     0 # is_standing
51 );
52
53 my $basket = GetBasket($basketno);
54
55 is( $basket->{is_standing}, 1, 'basket correctly created as standing order basket' );
56
57 my ( $biblionumber, $biblioitemnumber ) = C4::Biblio::AddBiblio( MARC::Record->new, '' );
58
59 my $ordernumber = Koha::Acquisition::Order->new(
60     {
61         basketno         => $basketno,
62         biblionumber     => $biblionumber,
63         budget_id        => $budget->{budget_id},
64         currency         => 'USD',
65         quantity         => 0,
66     }
67 )->insert->{ordernumber};
68
69 isnt( $ordernumber, undef, 'standing order successfully created' );
70
71 eval {
72     Koha::Acquisition::Order->new(
73         {
74             basketno         => $nonstandingbasketno,
75             biblionumber     => $biblionumber,
76             budget_id        => $budget->{budget_id},
77             currency         => 'USD',
78             quantity         => 0,
79         }
80     )->insert;
81 };
82
83 like( $@, qr/quantity/im, 'normal orders cannot be created without quantity' );
84
85 my $search_orders = SearchOrders( {
86     basketno => $basketno,
87     pending => 1,
88     ordered => 1,
89 } );
90
91 ok(
92     scalar @$search_orders == 1 && $search_orders->[0]->{ordernumber} == $ordernumber,
93     'standing order counts as a pending/ordered order'
94 );
95
96 my $invoiceid = AddInvoice(
97     invoicenumber => 'invoice',
98     booksellerid  => $bookseller->{id},
99     unknown       => "unknown"
100 );
101
102 my ( $datereceived, $new_ordernumber ) = ModReceiveOrder(
103     {
104         biblionumber     => $biblionumber,
105         ordernumber      => $ordernumber,
106         quantityreceived => 2,
107         cost             => 12,
108         ecost            => 22,
109         invoiceid        => $invoiceid,
110         rrp              => 42,
111     }
112 );
113
114 isnt( $ordernumber, $new_ordernumber, "standing order split on receive" );
115
116 my $order = Koha::Acquisition::Order->fetch( { ordernumber => $ordernumber } );
117 my $neworder = Koha::Acquisition::Order->fetch( { ordernumber => $new_ordernumber } );
118
119 is( $order->{orderstatus}, 'partial', 'original order set to partially received' );
120 is( $order->{quantity}, 0, 'original order quantity unchanged' );
121 is( $order->{quantityreceived}, 0, 'original order has no received items' );
122 isnt( $order->{unitprice}, 12, 'original order does not get cost' );
123 is( $neworder->{orderstatus}, 'complete', 'new order set to complete' );
124 is( $neworder->{quantityreceived}, 2, 'new order has received items' );
125 cmp_ok( $neworder->{unitprice}, '==', 12, 'new order does get cost' );
126
127 $search_orders = SearchOrders( {
128     basketno => $basketno,
129     pending => 1,
130     ordered => 1,
131 } );
132
133 is( scalar @$search_orders, 1, 'only one pending order after receive' );
134 is( $search_orders->[0]->{ordernumber}, $ordernumber, 'original order is only pending order' );
135
136 $schema->storage->txn_rollback();