MT 2050, Follow-up, Fast Cataloging
[koha.git] / cataloguing / value_builder / unimarc_field_4XX.pl
1 #!/usr/bin/perl
2
3 # Copyright 2000-2002 Katipo Communications
4 #
5 # This file is part of Koha.
6 #
7 # Koha is free software; you can redistribute it and/or modify it under the
8 # terms of the GNU General Public License as published by the Free Software
9 # Foundation; either version 2 of the License, or (at your option) any later
10 # version.
11 #
12 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License along with
17 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
18 # Suite 330, Boston, MA  02111-1307 USA
19
20
21 use strict;
22
23 use CGI;
24 use C4::Output;
25 use C4::Context;
26 use C4::Search;
27 use C4::Auth;
28 use C4::Output;
29
30 use C4::Biblio;
31 use C4::Koha;
32 use MARC::Record;
33 use C4::Branch;    # GetBranches
34 use C4::ItemType;
35
36 sub plugin_parameters {
37     my ( $dbh, $record, $tagslib, $i, $tabloop ) = @_;
38     return "";
39 }
40
41 sub plugin_javascript {
42     my ( $dbh, $record, $tagslib, $field_number, $tabloop ) = @_;
43     my $function_name = $field_number;
44     my $res           = "
45     <script type='text/javascript'>
46         function Focus$function_name(subfield_managed) {
47             return 1;
48         }
49
50         function Blur$function_name(subfield_managed) {
51             return 1;
52         }
53
54         function Clic$function_name(i) {
55             defaultvalue=document.getElementById(\"$field_number\").value;
56             window.open(\"/cgi-bin/koha/cataloguing/plugin_launcher.pl?plugin_name=unimarc_field_4XX.pl&index=\" + i + \"&result=\"+defaultvalue,\"unimarc field 4\"+i+\"\",'width=900,height=700,toolbar=false,scrollbars=yes');
57
58         }
59     </script>
60     ";
61
62     return ( $function_name, $res );
63 }
64
65 # sub plugin
66 #
67 # input arg : 
68 # -- op could be equals to
69 # * fillinput : 
70 # * do_search : 
71
72
73 sub plugin {
74     my ($input)   = @_;
75     my $dbh       = C4::Context->dbh;
76     my $query     = new CGI;
77     my $op        = $query->param('op');
78     my $type      = $query->param('type');
79     my $startfrom = $query->param('startfrom');
80     $startfrom = 0 if ( !defined $startfrom );
81     my ( $template, $loggedinuser, $cookie );
82     my $resultsperpage;
83     my $searchdesc;
84
85     if ( $op eq "fillinput" ) {
86         my $biblionumber = $query->param('biblionumber');
87         my $index  = $query->param('index');
88         my $marcrecord;
89
90         # open template
91         ( $template, $loggedinuser, $cookie ) = get_template_and_user(
92             {
93                 template_name =>
94                   "cataloguing/value_builder/unimarc_field_4XX.tmpl",
95                 query           => $query,
96                 type            => "intranet",
97                 authnotrequired => 0,
98                 flagsrequired   => { editcatalogue => '*' },
99                 debug           => 1,
100             }
101         );
102
103         #get marc record
104         $marcrecord = GetMarcBiblio($biblionumber);
105
106         my $subfield_value_9 = $biblionumber;
107         my $subfield_value_0;
108         $subfield_value_0 = $marcrecord->field('001')->data
109           if $marcrecord->field('001');
110         my $subfield_value_a;
111         if ( $marcrecord->field('700') ) {
112             $subfield_value_a = $marcrecord->field('700')->subfield("a");
113             $subfield_value_a .= ", " . $marcrecord->subfield( '700', "b" )
114               if $marcrecord->subfield( '700', 'b' );
115             $subfield_value_a .= " " . $marcrecord->subfield( '700', "d" )
116               if $marcrecord->subfield( '700', 'd' );
117             $subfield_value_a .=
118               " (" . $marcrecord->subfield( '700', 'c' ) . " - "
119               if $marcrecord->subfield( '700',     'c' );
120             $subfield_value_a .= " ("
121               if ( $marcrecord->subfield( '700', 'f' )
122                 and not( $marcrecord->subfield( '700', 'c' ) ) );
123             $subfield_value_a .= $marcrecord->subfield( '700', 'f' )
124               if ( $marcrecord->subfield( '700', 'f' ) );
125             $subfield_value_a .= ")"
126               if ( $marcrecord->subfield( '701', 'f' )
127                 or $marcrecord->subfield( '701', 'c' ) );
128         }
129         elsif ( $marcrecord->field('702') ) {
130             $subfield_value_a = $marcrecord->subfield( '702', 'a' );
131             $subfield_value_a .= ", " . $marcrecord->subfield( '702', 'b' )
132               if $marcrecord->subfield( '702', 'b' );
133             $subfield_value_a .= " " . $marcrecord->subfield( '702', 'd' )
134               if $marcrecord->subfield( '702', 'd' );
135             $subfield_value_a .=
136               " (" . $marcrecord->subfield( '702', 'c' ) . "; "
137               if $marcrecord->subfield( '702',     'c' );
138             $subfield_value_a .= " ("
139               if $marcrecord->subfield( '702', 'f' )
140               and not $marcrecord->subfield( '702', 'c' );
141             $subfield_value_a .= $marcrecord->subfield( '702', 'f' )
142               if $marcrecord->subfield( '702', 'f' );
143             $subfield_value_a .= ")"
144               if $marcrecord->subfield( '702', 'f' )
145               or $marcrecord->subfield( '702', 'c' );
146         }
147         elsif ( $marcrecord->field('710') ) {
148             $subfield_value_a = $marcrecord->subfield( '710', 'd' ) . " "
149               if $marcrecord->subfield( '710', 'd' );
150             $subfield_value_a .= $marcrecord->subfield( '710', 'a' )
151               if $marcrecord->subfield( '710', 'a' );
152             $subfield_value_a .= ", " . $marcrecord->subfield( '710', 'b' )
153               if $marcrecord->subfield('710');
154             $subfield_value_a .=
155               " (" . $marcrecord->subfield( '710', 'f' ) . " - "
156               if $marcrecord->subfield( '710',     'f' );
157             $subfield_value_a .= " ("
158               if $marcrecord->subfield( '710', 'e' )
159               and not $marcrecord->subfield( '710', 'f' );
160             $subfield_value_a .= $marcrecord->subfield( '710', 'e' )
161               if $marcrecord->subfield( '710', 'e' );
162             $subfield_value_a .= ")"
163               if $marcrecord->subfield( '710', 'e' )
164               or $marcrecord->subfield( '710', 'f' );
165         }
166         elsif ( $marcrecord->field('701') ) {
167             $subfield_value_a = $marcrecord->subfield( '701', 'a' );
168             $subfield_value_a .= ", " . $marcrecord->subfield( '701', 'b' )
169               if $marcrecord->subfield( '701', 'b' );
170             $subfield_value_a .= " " . $marcrecord->subfield( '701', 'd', )
171               if $marcrecord->subfield( '701', 'd' );
172             $subfield_value_a .=
173               " (" . $marcrecord->subfield( '701', 'c' ) . " - "
174               if $marcrecord->subfield( '701',     'c' );
175             $subfield_value_a .= " ("
176               if $marcrecord->subfield( '701', 'f' )
177               and not( $marcrecord->subfield( '701', 'c' ) );
178             $subfield_value_a .= $marcrecord->subfield( '701', 'f' )
179               if $marcrecord->subfield( '701', 'f' );
180             $subfield_value_a .= ")"
181               if $marcrecord->subfield( '701', 'f' )
182               or $marcrecord->subfield( '701', 'c' );
183         }
184         elsif ( $marcrecord->field('712') ) {
185             $subfield_value_a = $marcrecord->subfield( '712', 'd' ) . " "
186               if $marcrecord->subfield( '712', 'd' );
187             $subfield_value_a .= $marcrecord->subfield( '712', 'a' )
188               if $marcrecord->subfield( '712', 'a' );
189             $subfield_value_a .= ", " . $marcrecord->subfield( '712', 'b' )
190               if $marcrecord->subfield( '712', 'b' );
191             $subfield_value_a .=
192               " (" . $marcrecord->subfield( '712', 'f' ) . " - "
193               if $marcrecord->subfield( '712',     'f' );
194             $subfield_value_a .= " ("
195               if $marcrecord->field( '712', "e" )
196               and not $marcrecord->subfield( '712', 'f' );
197             $subfield_value_a .= $marcrecord->subfield( '712', 'e' )
198               if $marcrecord->subfield( '712', 'e' );
199             $subfield_value_a .= ")"
200               if $marcrecord->subfield( '712', 'e' )
201               or $marcrecord->subfield( '712', 'f' );
202         }
203         elsif ( $marcrecord->field('200') ) {
204             $subfield_value_a = $marcrecord->subfield( '200', 'f' );
205         }
206         my $subfield_value_c = $marcrecord->field('210')->subfield("a")
207           if ( $marcrecord->field('210') );
208         my $subfield_value_d = $marcrecord->field('210')->subfield("d")
209           if ( $marcrecord->field('210') );
210
211         my $subfield_value_e = $marcrecord->field('205')->subfield("a")
212           if ( $marcrecord->field('205') );
213
214         my $subfield_value_h;
215         if (   ( $marcrecord->field('200') )
216             && ( $marcrecord->field('200')->subfield("h") ) )
217         {
218             $subfield_value_h = $marcrecord->field('200')->subfield("h");
219         }
220         elsif (( $marcrecord->field('225') )
221             && ( $marcrecord->field('225')->subfield("h") ) )
222         {
223             $subfield_value_h = $marcrecord->field('225')->subfield("h");
224         }
225         elsif (( $marcrecord->field('500') )
226             && ( $marcrecord->field('500')->subfield("h") ) )
227         {
228             $subfield_value_h = $marcrecord->field('500')->subfield("h");
229         }
230
231         my $subfield_value_i;
232         if (   ( $marcrecord->field('200') )
233             && ( $marcrecord->field('200')->subfield("i") ) )
234         {
235             $subfield_value_i = $marcrecord->field('200')->subfield("i");
236         }
237         elsif (( $marcrecord->field('225') )
238             && ( $marcrecord->field('225')->subfield("i") ) )
239         {
240             $subfield_value_i = $marcrecord->field('225')->subfield("i");
241         }
242         elsif (( $marcrecord->field('500') )
243             && ( $marcrecord->field('500')->subfield("i") ) )
244         {
245             $subfield_value_i = $marcrecord->field('500')->subfield("i");
246         }
247
248         my $subfield_value_p = $marcrecord->field('215')->subfield("a")
249           if ( $marcrecord->field('215') );
250
251         my $subfield_value_t;
252         if (   ( $marcrecord->field('200') )
253             && ( $marcrecord->field('200')->subfield("a") ) )
254         {
255             $subfield_value_t = $marcrecord->field('200')->subfield("a");
256         }
257         elsif (( $marcrecord->field('225') )
258             && ( $marcrecord->field('225')->subfield("a") ) )
259         {
260             $subfield_value_t = $marcrecord->field('225')->subfield("a");
261         }
262         elsif (( $marcrecord->field('500') )
263             && ( $marcrecord->field('500')->subfield("a") ) )
264         {
265             $subfield_value_t = $marcrecord->field('500')->subfield("a");
266         }
267
268         my $subfield_value_u = $marcrecord->field('856')->subfield("u")
269           if ( $marcrecord->field('856') );
270
271         my $subfield_value_v;
272         if (   ( $marcrecord->field('225') )
273             && ( $marcrecord->field('225')->subfield("v") ) )
274         {
275             $subfield_value_v = $marcrecord->field('225')->subfield("v");
276         }
277         elsif (( $marcrecord->field('200') )
278             && ( $marcrecord->field('200')->subfield("h") ) )
279         {
280             $subfield_value_v = $marcrecord->field('200')->subfield("h");
281         }
282         my $subfield_value_x = $marcrecord->field('011')->subfield("a")
283           if (
284             $marcrecord->field('011')
285             and not( ( $marcrecord->field('011')->subfield("y") )
286                 or ( $marcrecord->field('011')->subfield("z") ) )
287           );
288         my $subfield_value_y = $marcrecord->field('013')->subfield("a")
289           if ( $marcrecord->field('013') );
290         if   ( $marcrecord->field('010') ) {
291             $subfield_value_y = $marcrecord->field('010')->subfield("a");
292         }
293         # escape the 's
294         $subfield_value_9 =~ s/'/\\'/g;
295         $subfield_value_0 =~ s/'/\\'/g;
296         $subfield_value_a =~ s/'/\\'/g;
297         $subfield_value_c =~ s/'/\\'/g;
298         $subfield_value_d =~ s/'/\\'/g;
299         $subfield_value_e =~ s/'/\\'/g;
300         $subfield_value_h =~ s/'/\\'/g;
301         $subfield_value_i =~ s/'/\\'/g;
302         $subfield_value_p =~ s/'/\\'/g;
303         $subfield_value_t =~ s/'/\\'/g;
304         $subfield_value_u =~ s/'/\\'/g;
305         $subfield_value_v =~ s/'/\\'/g;
306         $subfield_value_x =~ s/'/\\'/g;
307         $subfield_value_y =~ s/'/\\'/g;
308         $template->param(
309             fillinput        => 1,
310             index            => $query->param('index') . "",
311             biblionumber     => $biblionumber ? $biblionumber : "",
312             subfield_value_9 => "$subfield_value_9",
313             subfield_value_0 => "$subfield_value_0",
314             subfield_value_a => "$subfield_value_a",
315             subfield_value_c => "$subfield_value_c",
316             subfield_value_d => "$subfield_value_d",
317             subfield_value_e => "$subfield_value_e",
318             subfield_value_h => "$subfield_value_h",
319             subfield_value_i => "$subfield_value_i",
320             subfield_value_p => "$subfield_value_p",
321             subfield_value_t => "$subfield_value_t",
322             subfield_value_u => "$subfield_value_u",
323             subfield_value_v => "$subfield_value_v",
324             subfield_value_x => "$subfield_value_x",
325             subfield_value_y => "$subfield_value_y",
326         );
327 ###############################################################
328     }
329     elsif ( $op eq "do_search" ) {
330         my $search         = $query->param('search');
331         my $itype          = $query->param('itype');
332         my $startfrom      = $query->param('startfrom');
333         my $resultsperpage = $query->param('resultsperpage') || 20;
334         my $orderby;
335         $search = 'kw,wrdl='.$search.' and mc-itemtype='.$itype if $itype;
336         my ( $errors, $results, $total_hits ) = SimpleSearch($search, $startfrom * $resultsperpage, $resultsperpage );
337         my $total = scalar(@$results);
338
339         #        warn " biblio count : ".$total;
340
341         ( $template, $loggedinuser, $cookie ) = get_template_and_user(
342             {
343                 template_name =>
344                   "cataloguing/value_builder/unimarc_field_4XX.tmpl",
345                 query           => $query,
346                 type            => 'intranet',
347                 authnotrequired => 1,
348                 debug           => 1,
349             }
350         );
351
352         # multi page display gestion
353         my $displaynext = 0;
354         my $displayprev = $startfrom;
355
356         if( ( $total_hits - ( ( $startfrom + 1 ) * ($resultsperpage) ) ) > 0 ) {
357             $displaynext = 1;
358         }
359         my @arrayresults;
360         my @field_data = ($search);
361          for (
362              my $i = 0 ;
363              $i < $resultsperpage ;
364              $i++
365            )
366          {
367             my $record = MARC::Record::new_from_usmarc( $results->[$i] );
368             my $rechash = TransformMarcToKoha( $dbh, $record );
369             my $pos;
370             my $countitems = 1 if ( $rechash->{itemnumber} );
371             while ( index( $rechash->{itemnumber}, '|', $pos ) > 0 ) {
372                 $countitems += 1;
373                 $pos = index( $rechash->{itemnumber}, '|', $pos ) + 1;
374             }
375             $rechash->{totitem} = $countitems;
376             my @holdingbranches = split /\|/, $rechash->{holdingbranch};
377             my @itemcallnumbers = split /\|/, $rechash->{itemcallnumber};
378             my $CN;
379             for ( my $i = 0 ; $i < @holdingbranches ; $i++ ) {
380                 $CN .=
381                   $holdingbranches[$i] . " ( " . $itemcallnumbers[$i] . " ) |";
382             }
383             $CN =~ s/ \|$//;
384             $rechash->{CN} = $CN;
385             push @arrayresults, $rechash;
386          }
387
388    #         for(my $i = 0 ; $i <= $#marclist ; $i++)
389    #         {
390    #             push @field_data, { term => "marclist", val=>$marclist[$i] };
391    #             push @field_data, { term => "and_or", val=>$and_or[$i] };
392    #             push @field_data, { term => "excluding", val=>$excluding[$i] };
393    #             push @field_data, { term => "operator", val=>$operator[$i] };
394    #             push @field_data, { term => "value", val=>$value[$i] };
395    #         }
396
397         my @numbers = ();
398
399         if ( $total > $resultsperpage ) {
400             for ( my $i = 1 ; $i < $total / $resultsperpage + 1 ; $i++ ) {
401                 if ( $i < 16 ) {
402                     my $highlight = 0;
403                     ( $startfrom == ( $i - 1 ) ) && ( $highlight = 1 );
404                     push @numbers,
405                       {
406                         number     => $i,
407                         highlight  => $highlight,
408                         searchdata => \@field_data,
409                         startfrom  => ( $i - 1 )
410                       };
411                 }
412             }
413         }
414
415         my $from = $startfrom * $resultsperpage + 1;
416         my $to;
417
418         if ( $total_hits < $from + $resultsperpage ) {
419             $to = $total_hits;
420         }else{
421             $to = $from + $resultsperpage ;
422         }
423         my $defaultview =
424           'BiblioDefaultView' . C4::Context->preference('BiblioDefaultView');
425 #         my $link="/cgi-bin/koha/cataloguing/value_builder/unimarc4XX.pl?op=do_search&q=$search_desc&resultsperpage=$resultsperpage&startfrom=$startfrom&search=$search";
426 #           foreach my $sort (@sort_by){      
427 #             $link.="&sort_by=".$sort."&";
428 #           }        
429 #           $template->param(
430 #             pagination_bar => pagination_bar(
431 #                     $link,
432 #                     getnbpages($hits, $results_per_page),
433 #                     $page,
434 #                     'page'
435 #             ),
436 #           );     
437         $template->param(
438             result         => \@arrayresults,
439             index          => $query->param('index') . "",
440             startfrom      => $startfrom,
441             displaynext    => $displaynext,
442             displayprev    => $displayprev,
443             resultsperpage => $resultsperpage,
444             orderby        => $orderby,
445             startfromnext  => $startfrom + 1,
446             startfromprev  => $startfrom - 1,
447             searchdata     => \@field_data,
448             total          => $total_hits,
449             from           => $from,
450             to             => $to,
451             numbers        => \@numbers,
452             search         => $search,
453             $defaultview   => 1,
454             Search         => 0
455         );
456
457     }
458     else {
459         ( $template, $loggedinuser, $cookie ) = get_template_and_user(
460             {
461                 template_name =>
462                   "cataloguing/value_builder/unimarc_field_4XX.tmpl",
463                 query           => $query,
464                 type            => "intranet",
465                 authnotrequired => 1,
466             }
467         );
468
469         my $sth =
470           $dbh->prepare(
471             "Select itemtype,description from itemtypes order by description");
472         $sth->execute;
473         my @itemtype;
474         my %itemtypes;
475         push @itemtype, "";
476         $itemtypes{''} = "";
477         while ( my ( $value, $lib ) = $sth->fetchrow_array ) {
478             push @itemtype, $value;
479             $itemtypes{$value} = $lib;
480         }
481
482         my $CGIitemtype = CGI::scrolling_list(
483             -name     => 'value',
484             -values   => \@itemtype,
485             -labels   => \%itemtypes,
486             -size     => 1,
487             -multiple => 0
488         );
489         $sth->finish;
490
491         my @branchloop;
492         my @select_branch;
493         my %select_branches;
494         my $branches = GetBranches;
495         push @select_branch, "";
496         $select_branches{''} = "";
497         foreach my $thisbranch ( keys %$branches ) {
498             push @select_branch, $branches->{$thisbranch}->{'branchcode'};
499             $select_branches{ $branches->{$thisbranch}->{'branchcode'} } =
500               $branches->{$thisbranch}->{'branchname'};
501         }
502         my $CGIbranch = CGI::scrolling_list(
503             -name     => 'value',
504             -values   => \@select_branch,
505             -labels   => \%select_branches,
506             -size     => 1,
507             -multiple => 0
508         );
509         $sth->finish;
510
511         my $req =
512           $dbh->prepare(
513 "select distinctrow left(publishercode,45) from biblioitems order by publishercode"
514           );
515         $req->execute;
516         my @select;
517         push @select, "";
518         while ( my ($value) = $req->fetchrow ) {
519             push @select, $value;
520         }
521         my $CGIpublisher = CGI::scrolling_list(
522             -name     => 'value',
523             -id       => 'publisher',
524             -values   => \@select,
525             -size     => 1,
526             -multiple => 0
527         );
528
529 #         my $sth=$dbh->prepare("select description,itemtype from itemtypes order by description");
530 #         $sth->execute;
531 #         while (my ($description,$itemtype) = $sth->fetchrow) {
532 #             $classlist.="<option value=\"$itemtype\">$description</option>\n";
533 #         }
534 #         $sth->finish;
535
536         my @itemtypes = C4::ItemType->all;
537
538         $template->param(    #classlist => $classlist,
539             CGIitemtype  => $CGIitemtype,
540             CGIbranch    => $CGIbranch,
541             CGIPublisher => $CGIpublisher,
542             itypeloop    => \@itemtypes,
543             index        => $query->param('index'),
544             Search       => 1,
545         );
546     }
547     output_html_with_http_headers $query, $cookie, $template->output;
548 }
549
550 1;