start of BIB change -- introduce C4::Items
[wip/koha-chris_n.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 CGI;
67 use C4::Auth;
68 use C4::Dates qw/format_date format_date_in_iso/;
69 use C4::Biblio;
70 use C4::Items;
71 use C4::Koha;
72 use C4::Output;
73 use C4::Context;
74 use C4::Serials;
75
76 #use Smart::Comments;
77
78 my $query = new CGI;
79 my $dbh = C4::Context->dbh;
80 my @serialids = $query->param('serialid');
81 my @serialseqs = $query->param('serialseq');
82 my @planneddates = $query->param('planneddate');
83 my @publisheddates = $query->param('publisheddate');
84 my @status = $query->param('status');
85 my @notes = $query->param('notes');
86 my @subscriptionids = $query->param('subscriptionid');
87 my $op = $query->param('op');
88 # warn "op : $op";
89 if (scalar(@subscriptionids)==1 && index($subscriptionids[0],",")>0){
90   @subscriptionids =split /,/,$subscriptionids[0];
91 }
92 my $redirectstring;
93 # If user comes from subscription details
94 unless (@serialids){
95   foreach my $subscriptionid (@subscriptionids){
96     my $serstatus=$query->param('serstatus');
97     if ($serstatus){
98       my ($count,@tmpser)=GetSerials2($subscriptionid,$serstatus);
99       foreach (@tmpser) {
100         push @serialids, $_->{'serialid'};
101       }
102     }
103   }
104 }
105
106 unless (scalar(@serialids)){
107   my $string="serials-collection.pl?subscriptionid=".join(",",@subscriptionids);
108   $string=~s/,$//;
109 #  warn $string; 
110   print $query->redirect($string);
111 }
112 my ($template, $loggedinuser, $cookie)
113 = get_template_and_user({template_name => "serials/serials-edit.tmpl",
114                 query => $query,
115                 type => "intranet",
116                 authnotrequired => 0,
117                 flagsrequired => {serials => 1},
118                 debug => 1,
119                 });
120
121 my @serialdatalist;
122 foreach my $tmpserialid (@serialids){
123   my $data=GetSerialInformation($tmpserialid);
124   $data->{publisheddate}=format_date($data->{publisheddate});
125   $data->{planneddate}=format_date($data->{planneddate});
126   $data->{'editdisable'}=((HasSubscriptionExpired($data->{subscriptionid})&& $data->{'status1'})||$data->{'cannotedit'});
127   push @serialdatalist,$data;
128 }
129 my $bibdata=GetBiblioData($serialdatalist[0]->{'biblionumber'});
130
131 my @newserialloop;
132 my @subscriptionloop;
133 foreach my $subscriptionid (@subscriptionids){
134   my $cell;
135   if (C4::Context->preference("serialsadditems")){
136   #Create New empty item  
137     $cell =
138       PrepareItemrecordDisplay( $serialdatalist[0]->{'biblionumber'} );
139   }
140   $cell->{'subscriptionid'}=$subscriptionid;
141   $cell->{'itemid'}       = "NNEW";
142   $cell->{'serialid'}     = "NEW";
143   $cell->{'issuesatonce'}   = 1;
144   push @newserialloop,$cell;
145   push @subscriptionloop, {'subscriptionid'=>$subscriptionid,
146                            'abouttoexpire'=>abouttoexpire($subscriptionid),
147                            'subscriptionexpired'=>HasSubscriptionExpired($subscriptionid),
148   };
149 }
150 $template->param(newserialloop=>\@newserialloop);
151 $template->param(subscriptions=>\@subscriptionloop);
152
153 if ($op eq 'serialchangestatus') {
154 #     my $sth = $dbh->prepare("select status from serial where serialid=?");
155     my $newserial;
156     for (my $i=0;$i<=$#serialids;$i++) {
157 #         $sth->execute($serialids[$i]);
158 #         my ($oldstatus) = $sth->fetchrow;
159         if ($serialids[$i] && $serialids[$i] eq "NEW") {
160           if ($serialseqs[$i]){
161             #IF newserial was provided a name Then we have to create a newSerial
162             ### FIXME if NewIssue is modified to use subscription biblionumber, then biblionumber would not be useful.
163             $newserial = NewIssue( $serialseqs[$i],$subscriptionids[$i],$serialdatalist[0]->{'biblionumber'},
164                       $status[$i],
165                       format_date_in_iso($planneddates[$i]),
166                       format_date_in_iso($publisheddates[$i]),
167                       $notes[$i]);
168           }
169         }elsif ($serialids[$i]){
170             ModSerialStatus($serialids[$i],
171                             $serialseqs[$i],
172                             format_date_in_iso($planneddates[$i]),
173                             format_date_in_iso($publisheddates[$i]),
174                             $status[$i],
175                             $notes[$i]);
176         }
177     }
178     if (C4::Context->preference("serialsadditems")){
179       my @moditems = $query->param('moditem');
180       my @tags = $query->param('tag');
181       my @subfields = $query->param('subfield');
182       my @field_values = $query->param('field_value');
183       my @serials = $query->param('serial');
184       my @bibnums = $query->param('bibnum');
185       my @itemid = $query->param('itemid');
186       my @ind_tag = $query->param('ind_tag');
187       my @indicator = $query->param('indicator');
188       #Rebuilding ALL the data for items into a hash
189       # parting them on $itemid.
190       my %itemhash;
191       my $countdistinct;
192       my $range=scalar(@itemid);
193       for (my $i=0; $i<$range; $i++){
194         unless ($itemhash{$itemid[$i]}){
195           if ($serials[$countdistinct] && $serials[$countdistinct] ne "NEW"){
196             $itemhash{$itemid[$i]}->{'serial'}=$serials[$countdistinct];
197           } else {
198             $itemhash{$itemid[$i]}->{'serial'}=$newserial;
199           }
200           $itemhash{$itemid[$i]}->{'bibnum'}=$bibnums[$countdistinct];
201           $countdistinct++;
202         }
203         push @{$itemhash{$itemid[$i]}->{'tags'}},$tags[$i];
204         push @{$itemhash{$itemid[$i]}->{'subfields'}},$subfields[$i];
205         push @{$itemhash{$itemid[$i]}->{'field_values'}},$field_values[$i];
206         push @{$itemhash{$itemid[$i]}->{'ind_tag'}},$ind_tag[$i];
207         push @{$itemhash{$itemid[$i]}->{'indicator'}},$indicator[$i];
208       }
209       foreach my $item (keys %itemhash){
210         # Verify Itemization is "Valid", i.e. serial status is Arrived or Missing
211         my $index=-1;
212         for (my $i=0; $i<scalar(@serialids);$i++){
213           $index = $i if ($itemhash{$item}->{'serial'} eq $serialids[$i] || ($itemhash{$item}->{'serial'} == $newserial && $serialids[$i] eq "NEW"));
214         }
215         if ($index>=0 && $status[$index]==2){
216           my $xml = TransformHtmlToXml( $itemhash{$item}->{'tags'},
217                                   $itemhash{$item}->{'subfields'},
218                                   $itemhash{$item}->{'field_values'},
219                                   $itemhash{$item}->{'ind_tag'},
220                                   $itemhash{$item}->{'indicator'});
221   #           warn $xml;
222           my $record=MARC::Record::new_from_xml($xml, 'UTF-8');
223           if ($item=~/^N/){
224             #New Item
225             # if autoBarcode is ON, calculate barcode...
226             my ($tagfield,$tagsubfield) = &GetMarcFromKohaField("items.barcode");
227             if (C4::Context->preference("autoBarcode") ne  'OFF'  ) {
228               eval {    $record->field($tagfield)->subfield($tagsubfield) };
229               if ($@) {
230                 my $sth_barcode = $dbh->prepare("select max(abs(barcode)) from items");
231                 $sth_barcode->execute;
232                 my ($newbarcode) = $sth_barcode->fetchrow;
233                 $newbarcode++;
234                 # OK, we have the new barcode, now create the entry in MARC record
235                 $record->add_fields( $tagfield, "1", "0",
236                     $tagsubfield => $newbarcode );
237               }
238             }
239             # check for item barcode # being unique
240             my $exists = GetItemnumberFromBarcode($record->subfield($tagfield,$tagsubfield)) if ($record->subfield($tagfield,$tagsubfield));
241   #           push @errors,"barcode_not_unique" if($exists);
242             $template->param("barcode_not_unique" => 1,'errserialseq'=>$serialseqs[$index]);
243             # if barcode exists, don't create, but report The problem.
244             unless ($exists){
245               my ($biblionumber,$bibitemnum,$itemnumber) = AddItemFromMarc($record,$itemhash{$item}->{'bibnum'});
246               AddItem2Serial($itemhash{$item}->{'serial'},$itemnumber);
247             }
248           } else {
249             #modify item
250             my ($oldbiblionumber,$oldbibnum,$itemnumber) = ModItemFromMarc($record,$itemhash{$item}->{'bibnum'},$item);
251           }
252         }
253       }
254     }
255 #     ### 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.     
256 #     my $redirect ="serials-home.pl?";
257 #     $redirect.=join("&",map{"serialseq=".$_} @serialseqs);
258 #     $redirect.="&".join("&",map{"planneddate=".$_} @planneddates);
259 #     $redirect.="&".join("&",map{"publisheddate=".$_} @publisheddates);
260 #     $redirect.="&".join("&",map{"status=".$_} @status);
261 #     $redirect.="&".join("&",map{"notes=".$_} @notes);
262
263      my $redirect ="serials-collection.pl?";
264      my %hashsubscription;
265      map{$hashsubscription{$_}=1} @subscriptionids;       
266      $redirect.=join("&",map{"subscriptionid=".$_} sort keys %hashsubscription);
267     print $query->redirect("$redirect");
268 }
269
270 $template->param(serialsadditems =>C4::Context->preference("serialsadditems"));
271
272
273
274 $template->param(
275             bibliotitle => $bibdata->{'title'},
276             biblionumber =>$serialdatalist[0]->{'biblionumber'},
277             serialslist => \@serialdatalist,
278         );
279 output_html_with_http_headers $query, $cookie, $template->output;