Bug 19049: Fix regression on stage-marc-import with to_marc plugin
[koha.git] / acqui / parcel.pl
1 #!/usr/bin/perl
2
3 #script to receive orders
4
5
6 # Copyright 2000-2002 Katipo Communications
7 # Copyright 2008-2009 BibLibre SARL
8 #
9 # This file is part of Koha.
10 #
11 # Koha is free software; you can redistribute it and/or modify it
12 # under the terms of the GNU General Public License as published by
13 # the Free Software Foundation; either version 3 of the License, or
14 # (at your option) any later version.
15 #
16 # Koha is distributed in the hope that it will be useful, but
17 # WITHOUT ANY WARRANTY; without even the implied warranty of
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 # GNU General Public License for more details.
20 #
21 # You should have received a copy of the GNU General Public License
22 # along with Koha; if not, see <http://www.gnu.org/licenses>.
23
24 =head1 NAME
25
26 parcel.pl
27
28 =head1 DESCRIPTION
29
30 This script shows all orders receipt or pending for a given supplier.
31 It allows to write an order as 'received' when it arrives.
32
33 =head1 CGI PARAMETERS
34
35 =over 4
36
37 =item booksellerid
38
39 To know the supplier this script has to show orders.
40
41 =item code
42
43 is the bookseller invoice number.
44
45
46 =item gst
47
48
49 =item datereceived
50
51 To filter the results list on this given date.
52
53 =back
54
55 =cut
56
57 use strict;
58 use warnings;
59
60 use C4::Auth;
61 use C4::Acquisition;
62 use C4::Budgets;
63 use C4::Biblio;
64 use C4::Items;
65 use CGI qw ( -utf8 );
66 use C4::Output;
67 use C4::Suggestions;
68
69 use Koha::Acquisition::Bookseller;
70 use Koha::Biblios;
71 use Koha::DateUtils;
72 use Koha::Biblios;
73
74 use JSON;
75
76 my $input=new CGI;
77 my $sticky_filters = $input->param('sticky_filters') || 0;
78
79 my ($template, $loggedinuser, $cookie)
80     = get_template_and_user({template_name => "acqui/parcel.tt",
81                  query => $input,
82                  type => "intranet",
83                  authnotrequired => 0,
84                  flagsrequired => {acquisition => 'order_receive'},
85                  debug => 1,
86 });
87
88 my $op = $input->param('op') // '';
89
90 # process cancellation first so that list of
91 # orders to display is calculated after
92 if ($op eq 'cancelreceipt') {
93     my $ordernumber = $input->param('ordernumber');
94     my $parent_ordernumber = CancelReceipt($ordernumber);
95     unless($parent_ordernumber) {
96         $template->param(error_cancelling_receipt => 1);
97     }
98 }
99
100 my $invoiceid = $input->param('invoiceid');
101 my $invoice;
102 $invoice = GetInvoiceDetails($invoiceid) if $invoiceid;
103
104 unless( $invoiceid and $invoice->{invoiceid} ) {
105     $template->param(
106         error_invoice_not_known => 1,
107         no_orders_to_display    => 1
108     );
109     output_html_with_http_headers $input, $cookie, $template->output;
110     exit;
111 }
112
113 my $booksellerid = $invoice->{booksellerid};
114 my $bookseller = Koha::Acquisition::Booksellers->find( $booksellerid );
115
116 my @orders        = @{ $invoice->{orders} };
117 my $countlines    = scalar @orders;
118 my @loop_received = ();
119 my @book_foot_loop;
120 my %foot;
121 my $total_tax_excluded = 0;
122 my $total_tax_included = 0;
123
124 my $subtotal_for_funds;
125 for my $order ( @orders ) {
126     $order->{'unitprice'} += 0;
127
128     if ( $bookseller->invoiceincgst ) {
129         $order->{ecost}     = $order->{ecost_tax_included};
130         $order->{unitprice} = $order->{unitprice_tax_included};
131     }
132     else {
133         $order->{ecost}     = $order->{ecost_tax_excluded};
134         $order->{unitprice} = $order->{unitprice_tax_excluded};
135     }
136
137     $order->{total} = $order->{unitprice} * $order->{quantity};
138
139     my %line = %{ $order };
140     $line{invoice} = $invoice->{invoicenumber};
141     $line{holds} = 0;
142     my @itemnumbers = GetItemnumbersFromOrder( $order->{ordernumber} );
143     my $biblio = Koha::Biblios->find( $line{biblionumber} );
144     $line{holds} = $biblio ? $biblio->current_holds->search(
145         {
146             itemnumber => { -in => \@itemnumbers },
147         }
148     )->count : 0;
149     $line{budget} = GetBudgetByOrderNumber( $line{ordernumber} );
150
151     $line{tax_value} = $line{tax_value_on_receiving};
152     $line{tax_rate} = $line{tax_rate_on_receiving};
153     $foot{$line{tax_rate}}{tax_rate} = $line{tax_rate};
154     $foot{$line{tax_rate}}{tax_value} += $line{tax_value};
155     $total_tax_excluded += $line{unitprice_tax_excluded} * $line{quantity};
156     $total_tax_included += $line{unitprice_tax_included} * $line{quantity};
157
158     my $suggestion   = GetSuggestionInfoFromBiblionumber($line{biblionumber});
159     $line{suggestionid}         = $suggestion->{suggestionid};
160     $line{surnamesuggestedby}   = $suggestion->{surnamesuggestedby};
161     $line{firstnamesuggestedby} = $suggestion->{firstnamesuggestedby};
162
163     if ( $line{parent_ordernumber} != $line{ordernumber} ) {
164         if ( grep { $_->{ordernumber} == $line{parent_ordernumber} }
165             @orders
166             )
167         {
168             $line{cannot_cancel} = 1;
169         }
170     }
171
172     my $budget_name = GetBudgetName( $line{budget_id} );
173     $line{budget_name} = $budget_name;
174
175     $subtotal_for_funds->{ $line{budget_name} }{ecost} += $order->{ecost} * $order->{quantity};
176     $subtotal_for_funds->{ $line{budget_name} }{unitprice} += $order->{total};
177
178     push @loop_received, \%line;
179 }
180 push @book_foot_loop, map { $_ } values %foot;
181
182 my @loop_orders = ();
183 unless( defined $invoice->{closedate} ) {
184     my $pendingorders;
185     if ( $op eq "search" or $sticky_filters ) {
186         my ( $search, $ean, $basketname, $orderno, $basketgroupname );
187         if ( $sticky_filters ) {
188             $search = $input->cookie("filter_parcel_summary");
189             $ean = $input->cookie("filter_parcel_ean");
190             $basketname = $input->cookie("filter_parcel_basketname");
191             $orderno = $input->cookie("filter_parcel_orderno");
192             $basketgroupname = $input->cookie("filter_parcel_basketgroupname");
193         } else {
194             $search   = $input->param('summaryfilter') || '';
195             $ean      = $input->param('eanfilter') || '';
196             $basketname = $input->param('basketfilter') || '';
197             $orderno  = $input->param('orderfilter') || '';
198             $basketgroupname = $input->param('basketgroupnamefilter') || '';
199         }
200         $pendingorders = SearchOrders({
201             booksellerid => $booksellerid,
202             basketname => $basketname,
203             ordernumber => $orderno,
204             search => $search,
205             ean => $ean,
206             basketgroupname => $basketgroupname,
207             pending => 1,
208             ordered => 1,
209         });
210         $template->param(
211             summaryfilter => $search,
212             eanfilter => $ean,
213             basketfilter => $basketname,
214             orderfilter => $orderno,
215             basketgroupnamefilter => $basketgroupname,
216         );
217     }else{
218         $pendingorders = SearchOrders({
219             booksellerid => $booksellerid,
220             ordered => 1
221         });
222     }
223     my $countpendings = scalar @$pendingorders;
224
225     for (my $i = 0 ; $i < $countpendings ; $i++) {
226         my $order = $pendingorders->[$i];
227
228         if ( $bookseller->invoiceincgst ) {
229             $order->{ecost} = $order->{ecost_tax_included};
230         } else {
231             $order->{ecost} = $order->{ecost_tax_excluded};
232         }
233         $order->{total} = $order->{ecost} * $order->{quantity};
234
235         my %line = %$order;
236
237         $line{invoice} = $invoice;
238         $line{booksellerid} = $booksellerid;
239
240         my $biblionumber = $line{'biblionumber'};
241         my $biblio = Koha::Biblios->find( $biblionumber );
242         my $countbiblio = CountBiblioInOrders($biblionumber);
243         my $ordernumber = $line{'ordernumber'};
244         my $cnt_subscriptions = $biblio->subscriptions->count;
245         my $itemcount   = $biblio->items->count;
246         my $holds_count = $biblio->holds->count;
247         my @items = GetItemnumbersFromOrder( $ordernumber );
248         my $itemholds = $biblio ? $biblio->holds->search({ itemnumber => { -in => \@items } })->count : 0;
249
250         my $suggestion   = GetSuggestionInfoFromBiblionumber($line{biblionumber});
251         $line{suggestionid}         = $suggestion->{suggestionid};
252         $line{surnamesuggestedby}   = $suggestion->{surnamesuggestedby};
253         $line{firstnamesuggestedby} = $suggestion->{firstnamesuggestedby};
254
255         # if the biblio is not in other orders and if there is no items elsewhere and no subscriptions and no holds we can then show the link "Delete order and Biblio" see bug 5680
256         $line{can_del_bib}          = 1 if $countbiblio <= 1 && $itemcount == scalar @items && !($cnt_subscriptions) && !($holds_count);
257         $line{items}                = ($itemcount) - (scalar @items);
258         $line{left_item}            = 1 if $line{items} >= 1;
259         $line{left_biblio}          = 1 if $countbiblio > 1;
260         $line{biblios}              = $countbiblio - 1;
261         $line{left_subscription}    = 1 if $cnt_subscriptions;
262         $line{subscriptions}        = $cnt_subscriptions;
263         $line{left_holds}           = ($holds_count >= 1) ? 1 : 0;
264         $line{left_holds_on_order}  = 1 if $line{left_holds}==1 && ($line{items} == 0 || $itemholds );
265         $line{holds}                = $holds_count;
266         $line{holds_on_order}       = $itemholds?$itemholds:$holds_count if $line{left_holds_on_order};
267
268         my $budget_name = GetBudgetName( $line{budget_id} );
269         $line{budget_name} = $budget_name;
270
271         push @loop_orders, \%line;
272     }
273
274     $template->param(
275         loop_orders  => \@loop_orders,
276     );
277 }
278
279 $template->param(
280     invoiceid             => $invoice->{invoiceid},
281     invoice               => $invoice->{invoicenumber},
282     invoiceclosedate      => $invoice->{closedate},
283     datereceived          => dt_from_string,
284     name                  => $bookseller->name,
285     booksellerid          => $bookseller->id,
286     loop_received         => \@loop_received,
287     loop_orders           => \@loop_orders,
288     book_foot_loop        => \@book_foot_loop,
289     (uc(C4::Context->preference("marcflavour"))) => 1,
290     total_tax_excluded    => $total_tax_excluded,
291     total_tax_included    => $total_tax_included,
292     subtotal_for_funds    => $subtotal_for_funds,
293     sticky_filters       => $sticky_filters,
294 );
295 output_html_with_http_headers $input, $cookie, $template->output;