Merge branch 'master' of /home/jmf/repos/koha-rm-root.git/
[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 # $Id$
21
22 use strict;
23 require Exporter;
24 use CGI;
25 use C4::Output;
26 use C4::Context;
27 use C4::Search;
28 use C4::Auth;
29 use C4::Output;
30
31 use C4::Biblio;
32 use C4::Koha;
33 use MARC::Record;
34 use C4::Branch;    # GetBranches
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=$field_number&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 $bibnum = $query->param('bibnum');
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 => 1 },
99                 debug           => 1,
100             }
101         );
102
103         #get marc record
104         $marcrecord = GetMarcBiblio($bibnum);
105
106         my $subfield_value_9 = $bibnum;
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         $template->param(
294             fillinput        => 1,
295             index            => $query->param('index') . "",
296             biblionumber     => $bibnum ? $bibnum : "",
297             subfield_value_9 => $subfield_value_9,
298             subfield_value_0 => $subfield_value_0,
299             subfield_value_a => $subfield_value_a,
300             subfield_value_c => $subfield_value_c,
301             subfield_value_d => $subfield_value_d,
302             subfield_value_e => $subfield_value_e,
303             subfield_value_h => $subfield_value_h,
304             subfield_value_i => $subfield_value_i,
305             subfield_value_p => $subfield_value_p,
306             subfield_value_t => $subfield_value_t,
307             subfield_value_u => $subfield_value_u,
308             subfield_value_v => $subfield_value_v,
309             subfield_value_x => $subfield_value_x,
310             subfield_value_y => $subfield_value_y,
311         );
312 ###############################################################
313     }
314     elsif ( $op eq "do_search" ) {
315         my $search         = $query->param('search');
316         my $startfrom      = $query->param('startfrom');
317         my $resultsperpage = $query->param('resultsperpage');
318         my $orderby;
319         my ( $errors, $results ) = SimpleSearch($search);
320         my $total = scalar(@$results);
321         $resultsperpage = 20 unless $resultsperpage;
322
323         #        warn " biblio count : ".$total;
324
325         ( $template, $loggedinuser, $cookie ) = get_template_and_user(
326             {
327                 template_name =>
328                   "cataloguing/value_builder/unimarc_field_4XX.tmpl",
329                 query           => $query,
330                 type            => 'intranet',
331                 authnotrequired => 1,
332                 debug           => 1,
333             }
334         );
335
336         # multi page display gestion
337         my $displaynext = 0;
338         my $displayprev = $startfrom;
339         if ( ( $total - ( ( $startfrom + 1 ) * ($resultsperpage) ) ) > 0 ) {
340             $displaynext = 1;
341         }
342         my @arrayresults;
343         my @field_data = ($search);
344         for (
345             my $i = $startfrom ;
346             $i <= (
347                   ( $startfrom + $resultsperpage ) < scalar(@$results)
348                 ? ( $startfrom + $resultsperpage )
349                 : scalar(@$results)
350             ) ;
351             $i++
352           )
353         {
354             my $record = MARC::Record::new_from_usmarc( $results->[$i] );
355             my $rechash = TransformMarcToKoha( $dbh, $record );
356             my $pos;
357             my $countitems = 1 if ( $rechash->{itemnumber} );
358             while ( index( $rechash->{itemnumber}, '|', $pos ) > 0 ) {
359                 $countitems += 1;
360                 $pos = index( $rechash->{itemnumber}, '|', $pos ) + 1;
361             }
362             $rechash->{totitem} = $countitems;
363             my @holdingbranches = split /\|/, $rechash->{holdingbranch};
364             my @itemcallnumbers = split /\|/, $rechash->{itemcallnumber};
365             my $CN;
366             for ( my $i = 0 ; $i < @holdingbranches ; $i++ ) {
367                 $CN .=
368                   $holdingbranches[$i] . " ( " . $itemcallnumbers[$i] . " ) |";
369             }
370             $CN =~ s/ \|$//;
371             $rechash->{CN} = $CN;
372             push @arrayresults, $rechash;
373         }
374
375    #         for(my $i = 0 ; $i <= $#marclist ; $i++)
376    #         {
377    #             push @field_data, { term => "marclist", val=>$marclist[$i] };
378    #             push @field_data, { term => "and_or", val=>$and_or[$i] };
379    #             push @field_data, { term => "excluding", val=>$excluding[$i] };
380    #             push @field_data, { term => "operator", val=>$operator[$i] };
381    #             push @field_data, { term => "value", val=>$value[$i] };
382    #         }
383
384         my @numbers = ();
385
386         if ( $total > $resultsperpage ) {
387             for ( my $i = 1 ; $i < $total / $resultsperpage + 1 ; $i++ ) {
388                 if ( $i < 16 ) {
389                     my $highlight = 0;
390                     ( $startfrom == ( $i - 1 ) ) && ( $highlight = 1 );
391                     push @numbers,
392                       {
393                         number     => $i,
394                         highlight  => $highlight,
395                         searchdata => \@field_data,
396                         startfrom  => ( $i - 1 )
397                       };
398                 }
399             }
400         }
401
402         my $from = $startfrom * $resultsperpage + 1;
403         my $to;
404
405         if ( $total < ( ( $startfrom + 1 ) * $resultsperpage ) ) {
406             $to = $total;
407         }
408         else {
409             $to = ( ( $startfrom + 1 ) * $resultsperpage );
410         }
411         my $defaultview =
412           'BiblioDefaultView' . C4::Context->preference('BiblioDefaultView');
413         $template->param(
414             result         => \@arrayresults,
415             index          => $query->param('index') . "",
416             startfrom      => $startfrom,
417             displaynext    => $displaynext,
418             displayprev    => $displayprev,
419             resultsperpage => $resultsperpage,
420             orderby        => $orderby,
421             startfromnext  => $startfrom + 1,
422             startfromprev  => $startfrom - 1,
423             searchdata     => \@field_data,
424             total          => $total,
425             from           => $from,
426             to             => $to,
427             numbers        => \@numbers,
428             search         => $search,
429             $defaultview   => 1,
430             Search         => 0
431         );
432
433     }
434     else {
435         ( $template, $loggedinuser, $cookie ) = get_template_and_user(
436             {
437                 template_name =>
438                   "cataloguing/value_builder/unimarc_field_4XX.tmpl",
439                 query           => $query,
440                 type            => "intranet",
441                 authnotrequired => 1,
442             }
443         );
444
445         my $sth =
446           $dbh->prepare(
447             "Select itemtype,description from itemtypes order by description");
448         $sth->execute;
449         my @itemtype;
450         my %itemtypes;
451         push @itemtype, "";
452         $itemtypes{''} = "";
453         while ( my ( $value, $lib ) = $sth->fetchrow_array ) {
454             push @itemtype, $value;
455             $itemtypes{$value} = $lib;
456         }
457
458         my $CGIitemtype = CGI::scrolling_list(
459             -name     => 'value',
460             -values   => \@itemtype,
461             -labels   => \%itemtypes,
462             -size     => 1,
463             -multiple => 0
464         );
465         $sth->finish;
466
467         my @branchloop;
468         my @select_branch;
469         my %select_branches;
470         my $branches = GetBranches;
471         push @select_branch, "";
472         $select_branches{''} = "";
473         foreach my $thisbranch ( keys %$branches ) {
474             push @select_branch, $branches->{$thisbranch}->{'branchcode'};
475             $select_branches{ $branches->{$thisbranch}->{'branchcode'} } =
476               $branches->{$thisbranch}->{'branchname'};
477         }
478         my $CGIbranch = CGI::scrolling_list(
479             -name     => 'value',
480             -values   => \@select_branch,
481             -labels   => \%select_branches,
482             -size     => 1,
483             -multiple => 0
484         );
485         $sth->finish;
486
487         my $req =
488           $dbh->prepare(
489 "select distinctrow left(publishercode,45) from biblioitems order by publishercode"
490           );
491         $req->execute;
492         my @select;
493         push @select, "";
494         while ( my ($value) = $req->fetchrow ) {
495             push @select, $value;
496         }
497         my $CGIpublisher = CGI::scrolling_list(
498             -name     => 'value',
499             -id       => 'publisher',
500             -values   => \@select,
501             -size     => 1,
502             -multiple => 0
503         );
504
505 #         my $sth=$dbh->prepare("select description,itemtype from itemtypes order by description");
506 #         $sth->execute;
507 #         while (my ($description,$itemtype) = $sth->fetchrow) {
508 #             $classlist.="<option value=\"$itemtype\">$description</option>\n";
509 #         }
510 #         $sth->finish;
511
512         $template->param(    #classlist => $classlist,
513             CGIitemtype  => $CGIitemtype,
514             CGIbranch    => $CGIbranch,
515             CGIPublisher => $CGIpublisher,
516             index        => $query->param('index'),
517             Search       => 1,
518         );
519     }
520     output_html_with_http_headers $query, $cookie, $template->output;
521 }
522
523 1;