don't escape '-' in regexp.
[koha.git] / serials / serials-edit.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 =head1 NAME
23
24 serials-recieve.pl
25
26 =head1 Parameters
27
28 =over 4
29
30 =item op
31 op can be :
32     * modsubscriptionhistory :to modify the subscription history 
33     * serialchangestatus     :to modify the status of this subscription
34
35 =item subscriptionid
36
37 =item user
38
39 =item histstartdate
40
41 =item enddate
42
43 =item recievedlist
44
45 =item missinglist
46
47 =item opacnote
48
49 =item librariannote
50
51 =item serialid
52
53 =item serialseq
54
55 =item planneddate
56
57 =item notes
58
59 =item status
60
61 =back
62
63 =cut
64
65
66 use strict;
67 use CGI;
68 use C4::Auth;
69 use C4::Date;
70 use C4::Biblio;
71 use C4::Koha;
72 use C4::Output;
73 use C4::Context;
74 use C4::Serials;
75
76 my $query = new CGI;
77 my $dbh = C4::Context->dbh;
78 my @serialids = $query->param('serialid');
79 my @serialseqs = $query->param('serialseq');
80 my @planneddates = $query->param('planneddate');
81 my @publisheddates = $query->param('publisheddate');
82 my @status = $query->param('status');
83 my @notes = $query->param('notes');
84 my @subscriptionids = $query->param('subscriptionid');
85 my $op = $query->param('op');
86 # warn "op : $op";
87 if (scalar(@subscriptionids)==1 && index($subscriptionids[0],",")>0){
88   @subscriptionids =split /,/,$subscriptionids[0];
89 }
90 my $redirectstring;
91 # If user comes from subscription details
92 unless (@serialids){
93   foreach my $subscriptionid (@subscriptionids){
94     my $serstatus=$query->param('serstatus');
95     if ($serstatus){
96       my ($count,@tmpser)=GetSerials2($subscriptionid,$serstatus);
97       foreach (@tmpser) {
98         push @serialids, $_->{'serialid'};
99       }
100     }
101   }
102 }
103
104 unless (scalar(@serialids)){
105   my $string="serials-collection.pl?subscriptionid=".join(",",@subscriptionids);
106   $string=~s/,$//;
107  warn $string; 
108   print $query->redirect($string);
109 }
110 my ($template, $loggedinuser, $cookie)
111 = get_template_and_user({template_name => "serials/serials-edit.tmpl",
112                 query => $query,
113                 type => "intranet",
114                 authnotrequired => 0,
115                 flagsrequired => {serials => 1},
116                 debug => 1,
117                 });
118
119 my @serialdatalist;
120 foreach my $tmpserialid (@serialids){
121   my $data=GetSerialInformation($tmpserialid);
122   $data->{publisheddate}=format_date($data->{publisheddate});
123   $data->{planneddate}=format_date($data->{planneddate});
124   push @serialdatalist,$data;
125 }
126 my $bibdata=GetBiblioData($serialdatalist[0]->{'biblionumber'});
127
128 my @newserialloop;
129 my @subscriptionloop;
130 foreach my $subscriptionid (@subscriptionids){
131   my $cell;
132   if (C4::Context->preference("serialsadditems")){
133   #Create New empty item  
134     $cell =
135       PrepareItemrecordDisplay( $serialdatalist[0]->{'biblionumber'} );
136   }
137   $cell->{'subscriptionid'}=$subscriptionid;
138   $cell->{'subscriptionexpired'}=HasSubscriptionExpired($subscriptionid);
139   $cell->{'itemid'}       = "NNEW";
140   $cell->{'serialid'}     = "NEW";
141   $cell->{'issuesatonce'}   = 1;
142   push @newserialloop,$cell;
143   push @subscriptionloop, {'subscriptionid'=>$subscriptionid};
144 }
145 $template->param(newserialloop=>\@newserialloop);
146 $template->param(subscriptions=>\@subscriptionloop);
147
148 if ($op eq 'serialchangestatus') {
149 #     my $sth = $dbh->prepare("select status from serial where serialid=?");
150     my $newserial;
151     for (my $i=0;$i<=$#serialids;$i++) {
152 #         $sth->execute($serialids[$i]);
153 #         my ($oldstatus) = $sth->fetchrow;
154         if ($serialids[$i] && $serialids[$i] eq "NEW") {
155           if ($serialseqs[$i]){
156             #IF newserial was provided a name Then we have to create a newSerial
157             ### FIXME if NewIssue is modified to use subscription biblionumber, then biblionumber would not be useful.
158             $newserial = NewIssue( $serialseqs[$i],$subscriptionids[$i],$serialdatalist[0]->{'biblionumber'},
159                       $status[$i],
160                       format_date_in_iso($planneddates[$i]),
161                       format_date_in_iso($publisheddates[$i]),
162                       $notes[$i]);
163           }
164         }elsif ($serialids[$i]){
165             ModSerialStatus($serialids[$i],
166                             $serialseqs[$i],
167                             format_date_in_iso($planneddates[$i]),
168                             format_date_in_iso($publisheddates[$i]),
169                             $status[$i],
170                             $notes[$i]);
171         }
172     }
173     if (C4::Context->preference("serialsadditems")){
174       my @moditems = $query->param('moditem');
175       my @tags = $query->param('tag');
176       my @subfields = $query->param('subfield');
177       my @field_values = $query->param('field_value');
178       my @serials = $query->param('serial');
179       my @bibnums = $query->param('bibnum');
180       my @itemid = $query->param('itemid');
181       my @ind_tag = $query->param('ind_tag');
182       my @indicator = $query->param('indicator');
183       #Rebuilding ALL the data for items into a hash
184       # parting them on $itemid.
185       my %itemhash;
186       my $countdistinct;
187       my $range=scalar(@itemid);
188       for (my $i=0; $i<$range; $i++){
189         unless ($itemhash{$itemid[$i]}){
190           if ($serials[$countdistinct] && $serials[$countdistinct] ne "NEW"){
191             $itemhash{$itemid[$i]}->{'serial'}=$serials[$countdistinct];
192           } else {
193             $itemhash{$itemid[$i]}->{'serial'}=$newserial;
194           }
195           $itemhash{$itemid[$i]}->{'bibnum'}=$bibnums[$countdistinct];
196           $countdistinct++;
197         }
198         push @{$itemhash{$itemid[$i]}->{'tags'}},$tags[$i];
199         push @{$itemhash{$itemid[$i]}->{'subfields'}},$subfields[$i];
200         push @{$itemhash{$itemid[$i]}->{'field_values'}},$field_values[$i];
201         push @{$itemhash{$itemid[$i]}->{'ind_tag'}},$ind_tag[$i];
202         push @{$itemhash{$itemid[$i]}->{'indicator'}},$indicator[$i];
203       }
204       foreach my $item (keys %itemhash){
205         # Verify Itemization is "Valid", i.e. serial status is Arrived or Missing
206         my $index;
207         for (my $i=0; $i<scalar(@serialids);$i++){
208           $index = $i if ($itemhash{$item}->{'serial'} eq $serialids[$i]);
209         }
210         if ($status[$index]==2){
211           my $xml = TransformHtmlToXml( $itemhash{$item}->{'tags'},
212                                   $itemhash{$item}->{'subfields'},
213                                   $itemhash{$item}->{'field_values'},
214                                   $itemhash{$item}->{'ind_tag'},
215                                   $itemhash{$item}->{'indicator'});
216 #           warn $xml;
217           my $record=MARC::Record::new_from_xml($xml, 'UTF-8');
218           if ($item=~/^N/){
219             #New Item
220             # if autoBarcode is ON, calculate barcode...
221             my ($tagfield,$tagsubfield) = &GetMarcFromKohaField("items.barcode");
222             if (C4::Context->preference('autoBarcode')) {
223               unless ($record->field($tagfield)->subfield($tagsubfield)) {
224                 my $sth_barcode = $dbh->prepare("select max(abs(barcode)) from items");
225                 $sth_barcode->execute;
226                 my ($newbarcode) = $sth_barcode->fetchrow;
227                 $newbarcode++;
228                 # OK, we have the new barcode, now create the entry in MARC record
229                 my $fieldItem = $record->field($tagfield);
230                 $record->delete_field($fieldItem);
231                 $fieldItem->add_subfields($tagsubfield => $newbarcode);
232                 $record->insert_fields_ordered($fieldItem);
233               }
234             }
235             # check for item barcode # being unique
236             my $exists = GetItemnumberFromBarcode($record->subfield($tagfield,$tagsubfield)) if ($record->subfield($tagfield,$tagsubfield));
237   #           push @errors,"barcode_not_unique" if($exists);
238             $template->param("barcode_not_unique" => 1,'errserialseq'=>$serialseqs[$index]);
239             # if barcode exists, don't create, but report The problem.
240             unless ($exists){
241               my ($biblionumber,$bibitemnum,$itemnumber) = AddItem($record,$itemhash{$item}->{'bibnum'});
242               AddItem2Serial($itemhash{$item}->{'serial'},$itemnumber);
243             }
244           } else {
245             #modify item
246             my ($oldbiblionumber,$oldbibnum,$itemnumber) = ModItem($record,$itemhash{$item}->{'bibnum'},$item,0);
247           }
248         }
249       }
250     }
251     print $query->redirect("serials-collection.pl?biblionumber=".$serialdatalist[0]->{biblionumber});
252 }
253
254 $template->param(serialsadditems =>C4::Context->preference("serialsadditems"));
255
256
257
258 $template->param(
259             bibliotitle => $bibdata->{'title'},
260             biblionumber =>$serialdatalist[0]->{'biblionumber'},
261             serialslist => \@serialdatalist,
262             intranetcolorstylesheet => C4::Context->preference("intranetcolorstylesheet"),
263             intranetstylesheet => C4::Context->preference("intranetstylesheet"),
264             IntranetNav => C4::Context->preference("IntranetNav"),
265         );
266 output_html_with_http_headers $query, $cookie, $template->output;