Bug 19258: Prevent warns when writing off an individual fine
[koha.git] / acqui / parcels.pl
blobd0e6e2b099d0c5769f2819c826a61d28507d7c8a
1 #!/usr/bin/perl
4 #script to show display basket of orders
7 # Copyright 2000-2002 Katipo Communications
8 # Copyright 2008-2009 BibLibre SARL
10 # This file is part of Koha.
12 # Koha is free software; you can redistribute it and/or modify it
13 # under the terms of the GNU General Public License as published by
14 # the Free Software Foundation; either version 3 of the License, or
15 # (at your option) any later version.
17 # Koha is distributed in the hope that it will be useful, but
18 # WITHOUT ANY WARRANTY; without even the implied warranty of
19 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 # GNU General Public License for more details.
22 # You should have received a copy of the GNU General Public License
23 # along with Koha; if not, see <http://www.gnu.org/licenses>.
25 =head1 NAME
27 parcels.pl
29 =head1 DESCRIPTION
31 This script shows all orders/parcels receipt or pending for a given supplier.
32 It allows to write an order/parcels as 'received' when it arrives.
34 =head1 CGI PARAMETERS
36 =over 4
38 =item booksellerid
40 To know the supplier this script has to show orders.
42 =item orderby
44 sort list of order by 'orderby'.
45 Orderby can be equals to
46 * datereceived desc (default value)
47 * invoicenumber
48 * datereceived
49 * invoicenumber desc
51 =item filter
53 =item datefrom
55 To filter on date
57 =item dateto
59 To filter on date
61 =item resultsperpage
63 To know how many results have to be display / page.
65 =back
67 =cut
69 use strict;
70 use warnings;
71 use CGI qw ( -utf8 );
72 use C4::Auth;
73 use C4::Output;
75 use C4::Acquisition;
76 use C4::Budgets;
78 use Koha::Acquisition::Booksellers;
79 use Koha::DateUtils qw( output_pref dt_from_string );
81 my $input = CGI->new;
82 my $booksellerid = $input->param('booksellerid');
83 my $order = $input->param('orderby') || 'shipmentdate desc';
84 my $startfrom = $input->param('startfrom');
85 my $code = $input->param('filter');
86 my $datefrom = $input->param('datefrom');
87 my $dateto = $input->param('dateto');
88 my $resultsperpage = $input->param('resultsperpage');
89 my $op = $input->param('op');
90 $resultsperpage ||= 20;
92 our ( $template, $loggedinuser, $cookie, $flags ) = get_template_and_user(
93 { template_name => 'acqui/parcels.tt',
94 query => $input,
95 type => 'intranet',
96 authnotrequired => 0,
97 flagsrequired => { acquisition => 'order_receive' },
98 debug => 1,
102 my $invoicenumber = $input->param('invoice');
103 my $shipmentcost = $input->param('shipmentcost');
104 my $shipmentcost_budgetid = $input->param('shipmentcost_budgetid');
105 my $shipmentdate = $input->param('shipmentdate');
106 $shipmentdate and $shipmentdate = output_pref({ str => $shipmentdate, dateformat => 'iso', dateonly => 1 });
108 if ( $op and $op eq 'new' ) {
109 if ( C4::Context->preference('AcqWarnOnDuplicateInvoice') ) {
110 my @invoices = GetInvoices(
111 supplierid => $booksellerid,
112 invoicenumber => $invoicenumber,
114 if ( scalar @invoices > 0 ) {
115 $template->{'VARS'}->{'duplicate_invoices'} = \@invoices;
116 $template->{'VARS'}->{'invoicenumber'} = $invoicenumber;
117 $template->{'VARS'}->{'shipmentdate'} = $shipmentdate;
118 $template->{'VARS'}->{'shipmentcost'} = $shipmentcost;
119 $template->{'VARS'}->{'shipmentcost_budgetid'} =
120 $shipmentcost_budgetid;
123 $op = 'confirm' unless $template->{'VARS'}->{'duplicate_invoices'};
125 if ($op and $op eq 'confirm') {
126 my $invoiceid = AddInvoice(
127 invoicenumber => $invoicenumber,
128 booksellerid => $booksellerid,
129 shipmentdate => $shipmentdate,
130 shipmentcost => $shipmentcost,
131 shipmentcost_budgetid => $shipmentcost_budgetid,
133 if(defined $invoiceid) {
134 # Successful 'Add'
135 print $input->redirect("/cgi-bin/koha/acqui/parcel.pl?invoiceid=$invoiceid");
136 exit 0;
137 } else {
138 $template->param(error_failed_to_create_invoice => 1);
142 my $bookseller = Koha::Acquisition::Booksellers->find( $booksellerid );
143 my @parcels = GetInvoices(
144 supplierid => $booksellerid,
145 invoicenumber => $code,
146 ( $datefrom ? ( shipmentdatefrom => output_pref({ dt => dt_from_string($datefrom), dateformat => 'iso' }) ) : () ),
147 ( $dateto ? ( shipmentdateto => output_pref({ dt => dt_from_string($dateto), dateformat => 'iso' }) ) : () ),
148 order_by => $order
150 my $count_parcels = @parcels;
152 # multi page display gestion
153 $startfrom ||= 0;
154 if ( $count_parcels > $resultsperpage ) {
155 set_page_navigation( $count_parcels, $startfrom, $resultsperpage );
157 my $loopres = [];
159 my $next_page_start = $startfrom + $resultsperpage;
160 my $last_row = ( $next_page_start < $count_parcels ) ? $next_page_start - 1 : $count_parcels - 1;
161 for my $i ( $startfrom .. $last_row) {
162 my $p = $parcels[$i];
164 push @{$loopres},
165 { number => $i + 1,
166 invoiceid => $p->{invoiceid},
167 code => $p->{invoicenumber},
168 nullcode => $p->{invoicenumber} eq 'NULL',
169 emptycode => $p->{invoicenumber} eq q{},
170 raw_datereceived => $p->{shipmentdate},
171 datereceived => $p->{shipmentdate},
172 bibcount => $p->{receivedbiblios} || 0,
173 reccount => $p->{receiveditems} || 0,
174 itemcount => $p->{itemsexpected} || 0,
177 if ($count_parcels) {
178 $template->param( searchresults => $loopres, count => $count_parcels );
181 # build budget list
182 my $budget_loop = [];
183 my $budgets = GetBudgetHierarchy;
184 foreach my $r (@{$budgets}) {
185 next unless (CanUserUseBudget($loggedinuser, $r, $flags));
186 if (!defined $r->{budget_amount} || $r->{budget_amount} == 0) {
187 next;
189 push @{$budget_loop}, {
190 b_id => $r->{budget_id},
191 b_txt => $r->{budget_name},
192 b_active => $r->{budget_period_active},
196 @{$budget_loop} =
197 sort { uc( $a->{b_txt}) cmp uc( $b->{b_txt}) } @{$budget_loop};
200 $template->param(
201 orderby => $order,
202 filter => $code,
203 datefrom => $datefrom,
204 dateto => $dateto,
205 resultsperpage => $resultsperpage,
206 name => $bookseller->name,
207 shipmentdate_today => dt_from_string,
208 booksellerid => $booksellerid,
209 GST => C4::Context->preference('gist'),
210 budgets => $budget_loop,
213 output_html_with_http_headers $input, $cookie, $template->output;
215 sub set_page_navigation {
216 my ( $total_rows, $startfrom, $resultsperpage ) = @_;
217 my $displaynext = 0;
218 my $displayprev = $startfrom;
219 my $next_row = $startfrom + $resultsperpage;
220 my $prev_row = $startfrom - $resultsperpage;
222 if ( $total_rows - $next_row > 0 ) {
223 $displaynext = 1;
226 # set up index numbers for paging
227 my $numbers = [];
228 if ( $total_rows > $resultsperpage ) {
229 my $pages = $total_rows / $resultsperpage;
230 if ( $total_rows % $resultsperpage ) {
231 ++$pages;
234 # set up page indexes for at max 15 pages
235 my $max_idx = ( $pages < 15 ) ? $pages : 15;
236 my $current_page = ( $startfrom / $resultsperpage ) - 1;
237 for my $idx ( 1 .. $max_idx ) {
238 push @{$numbers},
239 { number => $idx,
240 startfrom => ( $idx - 1 ) * $resultsperpage,
241 highlight => ( $idx == $current_page ),
246 $template->param(
247 numbers => $numbers,
248 displaynext => $displaynext,
249 displayprev => $displayprev,
250 nextstartfrom => ( ( $next_row < $total_rows ) ? $next_row : $total_rows ),
251 prevstartfrom => ( ( $prev_row > 0 ) ? $prev_row : 0 )
253 return;