Bug 9978: Replace license header with the correct license (GPLv3+)
[koha.git] / cataloguing / value_builder / marc21_linking_section.pl
1 #!/usr/bin/perl
2
3 # Copyright Biblibre 2007 - CILEA 2011
4 #
5 # This file is part of Koha.
6 #
7 # Koha is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # Koha is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with Koha; if not, see <http://www.gnu.org/licenses>.
19
20 use strict;
21 use warnings;
22
23 use CGI qw ( -utf8 );
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;
34 use C4::ItemType;
35
36 sub plugin_javascript {
37   my ( $dbh, $record, $tagslib, $field_number, $tabloop ) = @_;
38   my $function_name = $field_number;
39      my $res           = "
40   <script type='text/javascript'>
41              function Clic$function_name(i) {
42                        defaultvalue=document.getElementById(\"$field_number\").value;
43                  window.open(\"/cgi-bin/koha/cataloguing/plugin_launcher.pl?plugin_name=marc21_linking_section.pl&index=\" + i + \"&result=\"+defaultvalue,\"marc21_field_7\"+i+\"\",'width=900,height=700,toolbar=false,scrollbars=yes');
44
45              }
46       </script>
47       ";
48
49     return ( $function_name, $res );
50 }
51
52 # sub plugin
53 #
54 # input arg :
55 # -- op could be equals to
56 # * fillinput :
57 # * do_search :
58 #
59
60 sub plugin {
61     my ($input)   = @_;
62     my $dbh       = C4::Context->dbh;
63       my $query     = new CGI;
64        my $op        = $query->param('op');
65    my $type      = $query->param('type');
66  my $startfrom = $query->param('startfrom');
67     $startfrom = 0 if ( !defined $startfrom );
68      my ( $template, $loggedinuser, $cookie );
69       my $resultsperpage;
70     my $searchdesc;
71
72        if ( $op eq "fillinput" ) {
73             my $biblionumber = $query->param('biblionumber');
74               my $index        = $query->param('index');
75              my $marcrecord;
76
77                # open template
78                 ( $template, $loggedinuser, $cookie ) = get_template_and_user(
79                  {
80                               template_name =>
81                                  "cataloguing/value_builder/marc21_linking_section.tt",
82                                query           => $query,
83                              type            => "intranet",
84                          authnotrequired => 0,
85                           flagsrequired   => { editcatalogue => '*' },
86                            debug           => 1,
87                   }
88               );
89
90             #get marc record
91                $marcrecord = GetMarcBiblio($biblionumber);
92
93            my $subfield_value_9 = $biblionumber;
94           my $subfield_value_0 = $biblionumber;
95
96          #my $subfield_value_0;
97          #$subfield_value_0 = $marcrecord->field('001')->data
98            #  if $marcrecord->field('001');
99                my $subfield_value_w;
100           if ( $marcrecord->field('001') ) {
101                      $subfield_value_w = $marcrecord->field('001')->data;
102            }
103               else {
104                  $subfield_value_w = $biblionumber;
105              }
106
107              my $subfield_value_a;
108           my $subfield_value_c;
109           my $subfield_value_d;
110           my $subfield_value_e;
111
112          my $subfield_value_h;
113
114          my $subfield_value_i;
115
116          my $subfield_value_p;
117
118          my $subfield_value_t;
119           if ( $marcrecord->field('245') ) {
120                      $subfield_value_t = $marcrecord->title();
121               }
122
123              my $subfield_value_u;
124           my $subfield_value_v;
125           my $subfield_value_x;
126           my $subfield_value_y;
127           my $subfield_value_z;
128
129          $subfield_value_x = $marcrecord->field('022')->subfield("a")
130              if ( $marcrecord->field('022') );
131             $subfield_value_z = $marcrecord->field('020')->subfield("a")
132              if ( $marcrecord->field('020') );
133
134            # escape the 's
135                 $subfield_value_9 =~ s/'/\\'/g;
136                 $subfield_value_0 =~ s/'/\\'/g;
137                 $subfield_value_a =~ s/'/\\'/g;
138                 $subfield_value_c =~ s/'/\\'/g;
139                 $subfield_value_d =~ s/'/\\'/g;
140                 $subfield_value_e =~ s/'/\\'/g;
141                 $subfield_value_h =~ s/'/\\'/g;
142                 $subfield_value_i =~ s/'/\\'/g;
143                 $subfield_value_p =~ s/'/\\'/g;
144                 $subfield_value_t =~ s/'/\\'/g;
145                 $subfield_value_u =~ s/'/\\'/g;
146                 $subfield_value_v =~ s/'/\\'/g;
147                 $subfield_value_w =~ s/'/\\'/g;
148                 $subfield_value_x =~ s/'/\\'/g;
149                 $subfield_value_y =~ s/'/\\'/g;
150                 $subfield_value_z =~ s/'/\\'/g;
151                 $template->param(
152                       fillinput        => 1,
153                  index            => $query->param('index') . "",
154                        biblionumber     => $biblionumber ? $biblionumber : "",
155                         subfield_value_9 => "$subfield_value_9",
156                        subfield_value_0 => "$subfield_value_0",
157                        subfield_value_a => "$subfield_value_a",
158                        subfield_value_c => "$subfield_value_c",
159                        subfield_value_d => "$subfield_value_d",
160                        subfield_value_e => "$subfield_value_e",
161                        subfield_value_h => "$subfield_value_h",
162                        subfield_value_i => "$subfield_value_i",
163                        subfield_value_p => "$subfield_value_p",
164                        subfield_value_t => "$subfield_value_t",
165                        subfield_value_u => "$subfield_value_u",
166                        subfield_value_v => "$subfield_value_v",
167                        subfield_value_w => "$subfield_value_w",
168                        subfield_value_x => "$subfield_value_x",
169                        subfield_value_y => "$subfield_value_y",
170                        subfield_value_z => "$subfield_value_z",
171                );
172 ###############################################################
173      }
174       elsif ( $op eq "do_search" ) {
175          my $search         = $query->param('search');
176           my $itype          = $query->param('itype');
177            my $startfrom      = $query->param('startfrom');
178                my $resultsperpage = $query->param('resultsperpage') || 20;
179             my $orderby;
180             my $QParser;
181             $QParser = C4::Context->queryparser if (C4::Context->preference('UseQueryParser'));
182             my $op;
183             if ($QParser) {
184                 $op = '&&';
185             } else {
186                 $op = 'and';
187             }
188            $search = 'kw:' . $search . " $op mc-itemtype:" . $itype if $itype;
189                my ( $errors, $results, $total_hits ) =
190                   SimpleSearch( $search, $startfrom * $resultsperpage,
191                  $resultsperpage );
192              if ( defined $errors ) {
193                        $results = [];
194          }
195               my $total = @{$results};
196
197               #        warn " biblio count : ".$total;
198
199               ( $template, $loggedinuser, $cookie ) = get_template_and_user(
200                  {
201                               template_name =>
202                                  "cataloguing/value_builder/marc21_linking_section.tt",
203                                query           => $query,
204                              type            => 'intranet',
205                          authnotrequired => 0,
206                           debug           => 1,
207                   }
208               );
209
210             # multi page display gestion
211            my $displaynext = 0;
212            my $displayprev = $startfrom;
213
214          if ( ( $total_hits - ( ( $startfrom + 1 ) * ($resultsperpage) ) ) > 0 )
215                 {
216                       $displaynext = 1;
217               }
218               my @arrayresults;
219               my @field_data = ($search);
220             for ( my $i = 0 ; $i < $resultsperpage ; $i++ ) {
221                   my $record = C4::Search::new_record_from_zebra( 'biblioserver', $results->[$i] );
222                   my $rechash = TransformMarcToKoha( $dbh, $record );
223                     my $pos;
224                        my $countitems = $rechash->{itembumber} ? 1 : 0;
225                       while ( index( $rechash->{itemnumber}, '|', $pos ) > 0 ) {
226                              $countitems += 1;
227                               $pos = index( $rechash->{itemnumber}, '|', $pos ) + 1;
228                  }
229                       $rechash->{totitem} = $countitems;
230                      my @holdingbranches = split /\|/, $rechash->{holdingbranch};
231                    my @itemcallnumbers = split /\|/, $rechash->{itemcallnumber};
232                   my $CN;
233                         for ( my $i = 0 ; $i < @holdingbranches ; $i++ ) {
234                              $CN .=
235                            $holdingbranches[$i] . " ( " . $itemcallnumbers[$i] . " ) |";
236                         }
237                       $CN =~ s/ \|$//;
238                        $rechash->{CN} = $CN;
239                   push @arrayresults, $rechash;
240           }
241
242    #         for(my $i = 0 ; $i <= $#marclist ; $i++)
243    #         {
244    #             push @field_data, { term => "marclist", val=>$marclist[$i] };
245    #             push @field_data, { term => "and_or", val=>$and_or[$i] };
246    #             push @field_data, { term => "excluding", val=>$excluding[$i] };
247    #             push @field_data, { term => "operator", val=>$operator[$i] };
248    #             push @field_data, { term => "value", val=>$value[$i] };
249    #         }
250
251              my @numbers = ();
252
253              if ( $total > $resultsperpage ) {
254                       for ( my $i = 1 ; $i < $total / $resultsperpage + 1 ; $i++ ) {
255                          if ( $i < 16 ) {
256                                        my $highlight = 0;
257                                      ( $startfrom == ( $i - 1 ) ) && ( $highlight = 1 );
258                                     push @numbers,
259                                    {
260                                             number     => $i,
261                                               highlight  => $highlight,
262                                               searchdata => \@field_data,
263                                             startfrom  => ( $i - 1 )
264                                          };
265                            }
266                       }
267               }
268
269              my $from = $startfrom * $resultsperpage + 1;
270            my $to;
271
272                if ( $total_hits < $from + $resultsperpage ) {
273                  $to = $total_hits;
274              }
275               else {
276                  $to = $from + $resultsperpage;
277          }
278               my $defaultview =
279                 'BiblioDefaultView' . C4::Context->preference('BiblioDefaultView');
280
281 #         my $link="/cgi-bin/koha/cataloguing/value_builder/unimarc4XX.pl?op=do_search&q=$search_desc&resultsperpage=$resultsperpage&startfrom=$startfrom&search=$search";
282 #           foreach my $sort (@sort_by){
283 #             $link.="&sort_by=".$sort."&";
284 #           }
285 #           $template->param(
286 #             pagination_bar => pagination_bar(
287 #                     $link,
288 #                     getnbpages($hits, $results_per_page),
289 #                     $page,
290 #                     'page'
291 #             ),
292 #           );
293           $template->param(
294                       result         => \@arrayresults,
295                       index          => $query->param('index') . "",
296                  startfrom      => $startfrom,
297                   displaynext    => $displaynext,
298                         displayprev    => $displayprev,
299                         resultsperpage => $resultsperpage,
300                      orderby        => $orderby,
301                     startfromnext  => $startfrom + 1,
302                       startfromprev  => $startfrom - 1,
303                       searchdata     => \@field_data,
304                         total          => $total_hits,
305                  from           => $from,
306                        to             => $to,
307                  numbers        => \@numbers,
308                    search         => $search,
309                      $defaultview   => 1,
310                    Search         => 0
311             );
312
313     }
314       else {
315          ( $template, $loggedinuser, $cookie ) = get_template_and_user(
316                  {
317                               template_name =>
318                                  "cataloguing/value_builder/marc21_linking_section.tt",
319                                query           => $query,
320                              type            => "intranet",
321                          authnotrequired => 0,
322                   }
323               );
324
325             my @itemtypes = C4::ItemType->all;
326
327             $template->param(
328                         itypeloop    => \@itemtypes,
329                         index        => $query->param('index'),
330                         Search       => 1,
331             );
332      }
333       output_html_with_http_headers $query, $cookie, $template->output;
334 }