[MT2343] Select in budget add forum
[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
21 =head1 NAME
22
23 serials-recieve.pl
24
25 =head1 Parameters
26
27 =over 4
28
29 =item op
30 op can be :
31     * modsubscriptionhistory :to modify the subscription history
32     * serialchangestatus     :to modify the status of this subscription
33
34 =item subscriptionid
35
36 =item user
37
38 =item histstartdate
39
40 =item enddate
41
42 =item recievedlist
43
44 =item missinglist
45
46 =item opacnote
47
48 =item librariannote
49
50 =item serialid
51
52 =item serialseq
53
54 =item planneddate
55
56 =item notes
57
58 =item status
59
60 =back
61
62 =cut
63
64
65 use strict;
66 use warnings;
67 use CGI;
68 use C4::Auth;
69 use C4::Dates qw/format_date format_date_in_iso/;
70 use C4::Biblio;
71 use C4::Items;
72 use C4::Koha;
73 use C4::Output;
74 use C4::Context;
75 use C4::Serials;
76
77 #use Smart::Comments;
78
79 my $query = new CGI;
80 my $dbh = C4::Context->dbh;
81 my @serialids = $query->param('serialid');
82 my @serialseqs = $query->param('serialseq');
83 my @planneddates = $query->param('planneddate');
84 my @publisheddates = $query->param('publisheddate');
85 my @status = $query->param('status');
86 my @notes = $query->param('notes');
87 my @subscriptionids = $query->param('subscriptionid');
88 my $op = $query->param('op');
89 if (scalar(@subscriptionids)==1 && index($subscriptionids[0],",")>0){
90   @subscriptionids =split (/,/,$subscriptionids[0]);
91 }
92 my @errors;
93 my @errseq;
94 # If user comes from subscription details
95 unless (@serialids){
96   foreach my $subscriptionid (@subscriptionids){
97     my $serstatus=$query->param('serstatus');
98     if ($serstatus){
99       my ($count,@tmpser)=GetSerials2($subscriptionid,$serstatus);
100       foreach (@tmpser) {
101         push @serialids, $_->{'serialid'};
102       }
103     }
104   }
105 }
106
107 unless (scalar(@serialids)){
108   my $string="serials-collection.pl?subscriptionid=".join(",",@subscriptionids);
109   $string=~s/,$//;
110 #  warn $string;
111   print $query->redirect($string);
112 }
113 my ($template, $loggedinuser, $cookie)
114 = get_template_and_user({template_name => "serials/serials-edit.tmpl",
115                 query => $query,
116                 type => "intranet",
117                 authnotrequired => 0,
118                 flagsrequired => {serials => 1},
119                 debug => 1,
120                 });
121
122 my @serialdatalist;
123 my %processedserialid;
124 foreach my $tmpserialid (@serialids){
125     #filtering serialid for duplication
126     #NEW serial should appear only once and are created afterwards
127     next unless (defined($tmpserialid) && $tmpserialid =~/^[0-9]+$/ && !$processedserialid{$tmpserialid});
128     my $data=GetSerialInformation($tmpserialid);
129     $data->{publisheddate}=format_date($data->{publisheddate});
130     $data->{planneddate}=format_date($data->{planneddate});
131     $data->{'editdisable'}=((HasSubscriptionExpired($data->{subscriptionid})&& $data->{'status1'})||$data->{'cannotedit'});
132     push @serialdatalist,$data;
133     $processedserialid{$tmpserialid}=1;
134 }
135 my $bibdata=GetBiblioData($serialdatalist[0]->{'biblionumber'});
136
137 my @newserialloop;
138 my @subscriptionloop;
139 # check, for each subscription edited, that we have an empty item line if applicable for the subscription
140 my %processedsubscriptionid;
141 foreach my $subscriptionid (@subscriptionids){
142     #Donot process subscriptionid twice if it was already processed.
143     my $subscriptiondetail = GetSubscription($subscriptionid);
144     next unless (defined($subscriptionid) && !$processedsubscriptionid{$subscriptionid});
145     my $cell;
146     if ($serialdatalist[0]->{'serialsadditems'}){
147     #Create New empty item
148         $cell =
149         PrepareItemrecordDisplay( $serialdatalist[0]->{'biblionumber'},'', $subscriptiondetail);
150         $cell->{serialsadditems} = 1;
151     }
152     $cell->{'subscriptionid'}=$subscriptionid;
153     $cell->{'itemid'}       = "NNEW";
154     $cell->{'serialid'}     = "NEW";
155     $cell->{'issuesatonce'}   = 1;
156     push @newserialloop,$cell;
157     push @subscriptionloop, {'subscriptionid'=>$subscriptionid,
158                             'abouttoexpire'=>abouttoexpire($subscriptionid),
159                             'subscriptionexpired'=>HasSubscriptionExpired($subscriptionid),
160     };
161     $processedsubscriptionid{$subscriptionid}=1;
162     $template->param(bibliotitle  => $subscriptiondetail->{'bibliotitle'},
163                         callnumber => $subscriptiondetail->{'callnumber'},
164                 );
165
166 }
167 $template->param(newserialloop=>\@newserialloop);
168 $template->param(subscriptions=>\@subscriptionloop);
169
170 if ($op and $op eq 'serialchangestatus') {
171 #     my $sth = $dbh->prepare("select status from serial where serialid=?");
172     my $newserial;
173     for (my $i=0;$i<=$#serialids;$i++) {
174 #         $sth->execute($serialids[$i]);
175 #         my ($oldstatus) = $sth->fetchrow;
176         if ($serialids[$i] && $serialids[$i] eq "NEW") {
177           if ($serialseqs[$i]){
178             #IF newserial was provided a name Then we have to create a newSerial
179             ### FIXME if NewIssue is modified to use subscription biblionumber, then biblionumber would not be useful.
180             $newserial = NewIssue( $serialseqs[$i],$subscriptionids[$i],$serialdatalist[0]->{'biblionumber'},
181                       $status[$i],
182                       format_date_in_iso($planneddates[$i]),
183                       format_date_in_iso($publisheddates[$i]),
184                       $notes[$i]);
185           }
186         }elsif ($serialids[$i]){
187             ModSerialStatus($serialids[$i],
188                             $serialseqs[$i],
189                             format_date_in_iso($planneddates[$i]),
190                             format_date_in_iso($publisheddates[$i]),
191                             $status[$i],
192                             $notes[$i]);
193         }
194     }
195     my @moditems = $query->param('moditem');
196     if (scalar(@moditems)){
197       my @tags = $query->param('tag');
198       my @subfields = $query->param('subfield');
199       my @field_values = $query->param('field_value');
200       my @serials = $query->param('serial');
201       my @bibnums = $query->param('bibnum');
202       my @itemid = $query->param('itemid');
203       my @ind_tag = $query->param('ind_tag');
204       my @indicator = $query->param('indicator');
205       #Rebuilding ALL the data for items into a hash
206       # parting them on $itemid.
207       my %itemhash;
208       my $countdistinct;
209       my $range=scalar(@itemid);
210       for (my $i=0; $i<$range; $i++){
211         unless ($itemhash{$itemid[$i]}){
212           if ($serials[$countdistinct] && $serials[$countdistinct] ne "NEW"){
213             $itemhash{$itemid[$i]}->{'serial'}=$serials[$countdistinct];
214           } else {
215             $itemhash{$itemid[$i]}->{'serial'}=$newserial;
216           }
217           $itemhash{$itemid[$i]}->{'bibnum'}=$bibnums[$countdistinct];
218           $countdistinct++;
219         }
220         push @{$itemhash{$itemid[$i]}->{'tags'}},$tags[$i];
221         push @{$itemhash{$itemid[$i]}->{'subfields'}},$subfields[$i];
222         push @{$itemhash{$itemid[$i]}->{'field_values'}},$field_values[$i];
223         push @{$itemhash{$itemid[$i]}->{'ind_tag'}},$ind_tag[$i];
224         push @{$itemhash{$itemid[$i]}->{'indicator'}},$indicator[$i];
225       }
226       foreach my $item (keys %itemhash){
227         # Verify Itemization is "Valid", i.e. serial status is Arrived or Missing
228         my $index=-1;
229         for (my $i=0; $i<scalar(@serialids);$i++){
230           $index = $i if ($itemhash{$item}->{'serial'} eq $serialids[$i] || ($itemhash{$item}->{'serial'} == $newserial && $serialids[$i] eq "NEW"));
231         }
232         if ($index>=0 && $status[$index]==2){
233           my $xml = TransformHtmlToXml( $itemhash{$item}->{'tags'},
234                                   $itemhash{$item}->{'subfields'},
235                                   $itemhash{$item}->{'field_values'},
236                                   $itemhash{$item}->{'ind_tag'},
237                                   $itemhash{$item}->{'indicator'});
238   #           warn $xml;
239           my $record=MARC::Record::new_from_xml($xml, 'UTF-8');
240           if ($item=~/^N/){
241             #New Item
242                         
243             # if autoBarcode is set to 'incremental', calculate barcode...
244             my ($barcodetagfield,$barcodetagsubfield) = &GetMarcFromKohaField("items.barcode", GetFrameworkCode($serialdatalist[0]->{'biblionumber'}));
245             if (C4::Context->preference("autoBarcode") eq 'incremental'  ) {
246               if (!$record->field($barcodetagfield)->subfield($barcodetagsubfield)) {
247                 my $sth_barcode = $dbh->prepare("select max(abs(barcode)) from items");
248                 $sth_barcode->execute;
249                 my ($newbarcode) = $sth_barcode->fetchrow;
250                 # OK, we have the new barcode, add the entry in MARC record # FIXME -> should be  using barcode plugin here.
251                 $record->field($barcodetagfield)->update( $barcodetagsubfield => ++$newbarcode );
252               }
253             }
254             # check for item barcode # being unique
255             my $exists;
256             if ($record->subfield($barcodetagfield,$barcodetagsubfield)) {
257                 $exists = GetItemnumberFromBarcode($record->subfield($barcodetagfield,$barcodetagsubfield));
258             }
259             #           push @errors,"barcode_not_unique" if($exists);
260             # if barcode exists, don't create, but report The problem.
261             if ($exists){
262                 push @errors,"barcode_not_unique" if($exists);
263                 push @errseq,{"serialseq"=>$serialseqs[$index]};
264             } else {
265                 my ($biblionumber,$bibitemnum,$itemnumber) = AddItemFromMarc($record,$itemhash{$item}->{'bibnum'});
266                 AddItem2Serial($itemhash{$item}->{'serial'},$itemnumber);
267             }
268           } else {
269             #modify item
270             my ($oldbiblionumber,$oldbibnum,$itemnumber) = ModItemFromMarc($record,$itemhash{$item}->{'bibnum'},$item);
271           }
272         }
273       }
274     }
275 #     ### FIXME this part of code is not very pretty. Nor is it very efficient... There MUST be a more perlish way to write it. But it works.
276 #     my $redirect ="serials-home.pl?";
277 #     $redirect.=join("&",map{"serialseq=".$_} @serialseqs);
278 #     $redirect.="&".join("&",map{"planneddate=".$_} @planneddates);
279 #     $redirect.="&".join("&",map{"publisheddate=".$_} @publisheddates);
280 #     $redirect.="&".join("&",map{"status=".$_} @status);
281 #     $redirect.="&".join("&",map{"notes=".$_} @notes);
282
283    if (scalar(@errors)>0){
284         $template->param("Errors" => 1);
285         if (scalar(@errseq)>0){
286             $template->param("barcode_not_unique" => 1);
287             $template->param('errseq'=>\@errseq);
288         }
289    } else {
290         my $redirect ="serials-collection.pl?";
291         my %hashsubscription;
292               foreach (@subscriptionids) {
293             $hashsubscription{$_}=1;
294               }
295         $redirect.=join("&",map{"subscriptionid=".$_} sort keys %hashsubscription);
296         print $query->redirect("$redirect");
297    }
298 }
299
300 $template->param(
301     serialsadditems => $serialdatalist[0]->{'serialsadditems'},
302     biblionumber => $serialdatalist[0]->{'biblionumber'},
303     serialslist  => \@serialdatalist,
304 );
305 output_html_with_http_headers $query, $cookie, $template->output;