3 #script to group (closed) baskets into basket groups for easier order management
4 #written by john.soros@biblibre.com 01/10/2008
6 # Copyright 2008 - 2009 BibLibre SARL
8 # This file is part of Koha.
10 # Koha is free software; you can redistribute it and/or modify it under the
11 # terms of the GNU General Public License as published by the Free Software
12 # Foundation; either version 2 of the License, or (at your option) any later
15 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
16 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
17 # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
19 # You should have received a copy of the GNU General Public License along with
20 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
21 # Suite 330, Boston, MA 02111-1307 USA
30 This script lets the user group (closed) baskets into basket groups for easier order management. Note that the grouped baskets have to be from the same bookseller and
39 The bookseller who we want to display the baskets (and basketgroups) of.
53 use C4::Bookseller qw/GetBookSellerFromId/;
54 use C4::Acquisition qw/CloseBasketgroup ReOpenBasketgroup GetOrders GetBasketsByBasketgroup GetBasketsByBookseller ModBasketgroup NewBasketgroup DelBasketgroup GetBasketgroups ModBasket GetBasketgroup GetBasket/;
55 use C4::Bookseller qw/GetBookSellerFromId/;
56 use C4::Branch qw/GetBranches/;
57 use C4::Members qw/GetMember/;
61 my ($template, $loggedinuser, $cookie)
62 = get_template_and_user({template_name => "acqui/basketgroup.tmpl",
66 flagsrequired => {acquisition => 'group_manage'},
70 sub parseinputbaskets {
71 my $booksellerid = shift;
72 my $baskets = &GetBasketsByBookseller($booksellerid);
73 for(my $i=0; $i < scalar @$baskets; ++$i) {
74 if( @$baskets[$i] && ! @$baskets[$i]->{'closedate'} ) {
75 splice(@$baskets, $i, 1);
79 foreach my $basket (@$baskets){
80 #perl DBI uses value "undef" for the mysql "NULL" value, so i need to check everywhere where $basket->{'basketgroupid'} is used for undef ☹
81 $basket->{'basketgroupid'} = $input->param($basket->{'basketno'}.'-group') || undef;
88 sub parseinputbasketgroups {
89 my $booksellerid = shift;
91 my $basketgroups = &GetBasketgroups($booksellerid);
93 foreach my $basket (@$baskets){
97 if(! $basket->{'basketgroupid'} || $basket->{'basketgroupid'} == 0){
100 foreach my $basketgroup (@$basketgroups){
101 if($basket->{'basketgroupid'} == $basketgroup->{'id'}){
103 push(@{$basketgroup->{'basketlist'}}, $basket->{'basketno'});
109 #if the basketgroup doesn't exist yet
110 $basketgroup = $newbasketgroups->{$basket->{'basketgroupid'}} || undef;
111 $basketgroup->{'booksellerid'} = $booksellerid;
113 while($i < scalar @$basketgroups && @$basketgroups[$i]->{'id'} != $basket->{'basketgroupid'}){
116 $basketgroup = @$basketgroups[$i];
118 $basketgroup->{'id'}=$basket->{'basketgroupid'};
119 $basketgroup->{'name'}=$input->param('basketgroup-'.$basketgroup->{'id'}.'-name') || "";
120 $basketgroup->{'closed'}= $input->param('basketgroup-'.$basketgroup->{'id'}.'-closed');
121 push(@{$basketgroup->{'basketlist'}}, $basket->{'basketno'});
123 $newbasketgroups->{$basket->{'basketgroupid'}} = $basketgroup;
125 if($basketgroup->{'id'}){
126 @$basketgroups[$i] = $basketgroup;
130 return($basketgroups, $newbasketgroups);
134 my $basketno = shift;
135 my $bookseller = shift;
137 my @orders = GetOrders($basketno);
138 for my $order (@orders){
139 $total = $total + ( $order->{ecost} * $order->{quantity} );
140 if ($bookseller->{invoiceincgst} && ! $bookseller->{listincgst} && ( $bookseller->{gstrate} || C4::Context->preference("gist") )) {
141 my $gst = $bookseller->{gstrate} || C4::Context->preference("gist");
142 $total = $total * ( $gst / 100 +1);
145 $total .= $bookseller->{invoiceprice};
149 #displays all basketgroups and all closed baskets (in their respective groups)
150 sub displaybasketgroups {
151 my $basketgroups = shift;
152 my $bookseller = shift;
154 if (scalar @$basketgroups != 0) {
155 foreach my $basketgroup (@$basketgroups){
157 while($i < scalar(@$baskets)){
158 my $basket = @$baskets[$i];
159 if($basket->{'basketgroupid'} && $basket->{'basketgroupid'} == $basketgroup->{'id'}){
160 $basket->{total} = BasketTotal($basket->{basketno}, $bookseller);
161 push(@{$basketgroup->{'baskets'}}, $basket);
162 splice(@$baskets, $i, 1);
168 $template->param(basketgroups => $basketgroups);
170 for(my $i=0; $i < scalar @$baskets; ++$i) {
171 if( ! @$baskets[$i]->{'closedate'} ) {
172 splice(@$baskets, $i, 1);
175 @$baskets[$i]->{total} = BasketTotal(@$baskets[$i]->{basketno}, $bookseller);
178 $template->param(baskets => $baskets);
179 $template->param( booksellername => $bookseller ->{'name'});
182 sub printbasketgrouppdf{
183 my ($basketgroupid) = @_;
185 my $pdfformat = C4::Context->preference("OrderPdfFormat");
186 eval "use $pdfformat" ;
188 eval "use C4::Branch";
190 my $basketgroup = GetBasketgroup($basketgroupid);
191 my $bookseller = GetBookSellerFromId($basketgroup->{'booksellerid'});
192 my $baskets = GetBasketsByBasketgroup($basketgroupid);
195 for my $basket (@$baskets) {
197 my @ords = &GetOrders($basket->{basketno});
198 for my $ord (@ords) {
199 # ba_order is filled with :
200 # 0 1 2 3 4 5 6 7 8 9
201 #isbn, itemtype, author, title, publishercode, quantity, listprice ecost discount gstrate
203 if ( $ord->{biblionumber} && $ord->{quantity}> 0 ) {
204 eval "use C4::Biblio";
206 my $bib = GetBiblioData($ord->{biblionumber});
207 my $itemtypes = GetItemTypes();
209 push(@ba_order, $ord->{isbn});
211 push(@ba_order, undef);
213 if ($ord->{itemtype}){
214 push(@ba_order, $itemtypes->{$bib->{itemtype}}->{description}) if $bib->{itemtype};
216 push(@ba_order, undef);
219 # push(@ba_order, undef, undef);
220 for my $key (qw/author title publishercode quantity listprice ecost/) {
221 push(@ba_order, $ord->{$key}); #Order lines
223 push(@ba_order, $bookseller->{discount});
224 push(@ba_order, $bookseller->{gstrate}*100 || C4::Context->preference("gist") || 0);
225 push(@ba_orders, \@ba_order);
228 if (C4::Context->preference("marcflavour") eq 'UNIMARC') {
229 $en = MARC::Record::new_from_xml($ord->{marcxml},'UTF-8')->subfield('345',"b");
230 } elsif (C4::Context->preference("marcflavour") eq 'MARC21') {
231 $en = MARC::Record::new_from_xml($ord->{marcxml},'UTF-8')->subfield('037',"a");
234 push(@ba_order, $en);
236 push(@ba_order, undef);
240 %orders->{$basket->{basketno}}=\@ba_orders;
242 print $input->header( -type => 'application/pdf', -attachment => 'basketgroup.pdf' );
243 my $branch = GetBranchInfo(GetBranch($input, GetBranches()));
244 $branch = @$branch[0];
245 my $pdf = printpdf($basketgroup, $bookseller, $baskets, $branch, \%orders, $bookseller->{gstrate} || C4::Context->preference("gist")) || die "pdf generation failed";
250 my $op = $input->param('op');
251 my $booksellerid = $input->param('booksellerid');
252 $template->param(booksellerid => $booksellerid);
254 if ( $op eq "add" ) {
256 $template->param( ungroupedlist => 1);
257 my @booksellers = GetBookSeller('');
258 for (my $i=0; $i < scalar @booksellers; $i++) {
259 my $baskets = &GetBasketsByBookseller($booksellers[$i]->{id});
260 for (my $j=0; $j < scalar @$baskets; $j++) {
261 if(! @$baskets[$i]->{closedate} || @$baskets[$i]->{basketgroupid}) {
262 splice(@$baskets, $j, 1);
266 if (scalar @$baskets == 0){
267 splice(@booksellers, $i, 1);
272 my $basketgroupid = $input->param('basketgroupid');
274 if ( $basketgroupid ) {
275 # Get the selected baskets in the basketgroup to display them
276 my $selecteds = GetBasketsByBasketgroup($basketgroupid);
277 foreach (@{$selecteds}){
278 $_->{total} = BasketTotal($_->{basketno}, $_);
280 $template->param(basketgroupid => $basketgroupid,
281 selectedbaskets => $selecteds);
283 # Get general informations about the basket group to prefill the form
284 my $basketgroup = GetBasketgroup($basketgroupid);
286 name => $basketgroup->{name},
287 deliverycomment => $basketgroup->{deliverycomment},
289 $branchcode = $basketgroup->{deliveryplace};
292 # Build the combobox to select the delivery place
293 my $borrower = GetMember( ( 'borrowernumber' => $loggedinuser ) );
294 my $branch = $branchcode || $borrower->{'branchcode'};
295 my $branches = GetBranches;
297 foreach my $thisbranch (sort keys %$branches) {
298 my $selected = 1 if $thisbranch eq $branch;
300 value => $thisbranch,
301 selected => $selected,
302 branchname => $branches->{$thisbranch}->{branchname},
304 push @branchloop, \%row;
306 $template->param( branchloop => \@branchloop );
308 $template->param( booksellerid => $booksellerid );
310 $template->param(grouping => 1);
311 my $basketgroups = &GetBasketgroups($booksellerid);
312 my $bookseller = &GetBookSellerFromId($booksellerid);
313 my $baskets = &GetBasketsByBookseller($booksellerid);
315 displaybasketgroups($basketgroups, $bookseller, $baskets);
316 } elsif ($op eq 'mod_basket') {
317 #we want to modify an individual basket's group
318 my $basketno=$input->param('basketno');
319 my $basketgroupid=$input->param('basketgroupid');
320 ModBasket( { basketno => $basketno,
321 basketgroupid => $basketgroupid } );
322 print $input->redirect("basket.pl?basketno=" . $basketno);
323 } elsif ($op eq 'validate') {
325 $template->param( booksellererror => 1);
327 $template->param( booksellerid => $booksellerid );
329 my $baskets = parseinputbaskets($booksellerid);
330 my ($basketgroups, $newbasketgroups) = parseinputbasketgroups($booksellerid, $baskets);
331 foreach my $nbgid (keys %$newbasketgroups){
332 #javascript just picks an ID that's higher than anything else, the ID might not be correct..chenge it and change all the basket's basketgroupid as well
333 my $bgid = NewBasketgroup($newbasketgroups->{$nbgid});
334 ${$newbasketgroups->{$nbgid}}->{'id'} = $bgid;
335 ${$newbasketgroups->{$nbgid}}->{'oldid'} = $nbgid;
337 foreach my $basket (@$baskets){
338 #if the basket was added to a new basketgroup, first change the groupid to the groupid of the basket in mysql, because it contains the id from javascript otherwise.
339 if ( $basket->{'basketgroupid'} && $newbasketgroups->{$basket->{'basketgroupid'}} ){
340 $basket->{'basketgroupid'} = ${$newbasketgroups->{$basket->{'basketgroupid'}}}->{'id'};
344 foreach my $basketgroup (@$basketgroups){
345 if(! $basketgroup->{'id'}){
346 foreach my $basket (@{$basketgroup->{'baskets'}}){
347 if($input->param('basket'.$basket->{'basketno'}.'changed')){
351 } elsif ($input->param('basketgroup-'.$basketgroup->{'id'}.'-changed')){
352 ModBasketgroup($basketgroup);
355 $basketgroups = &GetBasketgroups($booksellerid);
356 my $bookseller = &GetBookSellerFromId($booksellerid);
357 $baskets = &GetBasketsByBookseller($booksellerid);
359 displaybasketgroups($basketgroups, $bookseller, $baskets);
360 } elsif ( $op eq 'closeandprint') {
361 my $basketgroupid = $input->param('basketgroupid');
363 CloseBasketgroup($basketgroupid);
365 printbasketgrouppdf($basketgroupid);
366 }elsif ($op eq 'print'){
367 my $basketgroupid = $input->param('basketgroupid');
369 printbasketgrouppdf($basketgroupid);
370 }elsif( $op eq "delete"){
371 my $basketgroupid = $input->param('basketgroupid');
373 DelBasketgroup($basketgroupid);
374 warn "---------------";
375 print $input->redirect('/cgi-bin/koha/acqui/basketgroup.pl?booksellerid=' . $booksellerid);
377 }elsif ( $op eq 'reopen'){
378 my $basketgroupid = $input->param('basketgroupid');
379 my $booksellerid = $input->param('booksellerid');
381 ReOpenBasketgroup($basketgroupid);
383 print $input->redirect('/cgi-bin/koha/acqui/basketgroup.pl?booksellerid=' . $booksellerid . '#closed');
385 } elsif ( $op eq 'attachbasket') {
388 my $basketgroup = {};
390 my @baskets = $input->param('basket');
391 my $basketgroupid = $input->param('basketgroupid');
392 my $basketgroupname = $input->param('basketgroupname');
393 my $booksellerid = $input->param('booksellerid');
394 my $deliveryplace = $input->param('deliveryplace');
395 my $deliverycomment = $input->param('deliverycomment');
396 my $close = $input->param('close') ? 1 : 0;
397 # If we got a basketgroupname, we create a basketgroup
398 if ($basketgroupid) {
400 name => $basketgroupname,
401 id => $basketgroupid,
402 basketlist => \@baskets,
403 deliveryplace => $deliveryplace,
404 deliverycomment => $deliverycomment,
407 ModBasketgroup($basketgroup);
413 name => $basketgroupname,
414 booksellerid => $booksellerid,
415 basketlist => \@baskets,
416 deliveryplace => $deliveryplace,
417 deliverycomment => $deliverycomment,
420 $basketgroupid = NewBasketgroup($basketgroup);
423 print $input->redirect('/cgi-bin/koha/acqui/basketgroup.pl?booksellerid=' . $booksellerid);
426 my $basketgroups = &GetBasketgroups($booksellerid);
427 my $bookseller = &GetBookSellerFromId($booksellerid);
428 my $baskets = &GetBasketsByBookseller($booksellerid);
430 displaybasketgroups($basketgroups, $bookseller, $baskets);
432 #prolly won't use all these, maybe just use print, the rest can be done inside validate
433 output_html_with_http_headers $input, $cookie, $template->output;