3 # Copyright 2000-2002 Katipo Communications
5 # This file is part of Koha.
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
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.
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
31 * modsubscriptionhistory :to modify the subscription history
32 * serialchangestatus :to modify the status of this subscription
68 use C4::Dates qw/format_date format_date_in_iso/;
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');
89 if (scalar(@subscriptionids)==1 && index($subscriptionids[0],",")>0){
90 @subscriptionids =split /,/,$subscriptionids[0];
93 # If user comes from subscription details
95 foreach my $subscriptionid (@subscriptionids){
96 my $serstatus=$query->param('serstatus');
98 my ($count,@tmpser)=GetSerials2($subscriptionid,$serstatus);
100 push @serialids, $_->{'serialid'};
106 unless (scalar(@serialids)){
107 my $string="serials-collection.pl?subscriptionid=".join(",",@subscriptionids);
110 print $query->redirect($string);
112 my ($template, $loggedinuser, $cookie)
113 = get_template_and_user({template_name => "serials/serials-edit.tmpl",
116 authnotrequired => 0,
117 flagsrequired => {serials => 1},
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;
129 my $bibdata=GetBiblioData($serialdatalist[0]->{'biblionumber'});
132 my @subscriptionloop;
133 foreach my $subscriptionid (@subscriptionids){
135 if (C4::Context->preference("serialsadditems")){
136 #Create New empty item
138 PrepareItemrecordDisplay( $serialdatalist[0]->{'biblionumber'} );
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),
150 $template->param(newserialloop=>\@newserialloop);
151 $template->param(subscriptions=>\@subscriptionloop);
153 if ($op eq 'serialchangestatus') {
154 # my $sth = $dbh->prepare("select status from serial where serialid=?");
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'},
165 format_date_in_iso($planneddates[$i]),
166 format_date_in_iso($publisheddates[$i]),
169 }elsif ($serialids[$i]){
170 ModSerialStatus($serialids[$i],
172 format_date_in_iso($planneddates[$i]),
173 format_date_in_iso($publisheddates[$i]),
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.
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];
198 $itemhash{$itemid[$i]}->{'serial'}=$newserial;
200 $itemhash{$itemid[$i]}->{'bibnum'}=$bibnums[$countdistinct];
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];
209 foreach my $item (keys %itemhash){
210 # Verify Itemization is "Valid", i.e. serial status is Arrived or Missing
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"));
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'});
222 my $record=MARC::Record::new_from_xml($xml, 'UTF-8');
225 # add serialid to item record
226 my ($tagfield,$tagsubfield) = &GetMarcFromKohaField("items.itemnumber");
227 my $field = $record->field($tagfield);
228 my ($tagfield,$tagsubfield) = &GetMarcFromKohaField("items.serialid");
230 $field->update($tagsubfield => $itemhash{$item}->{'serial'});
233 # if autoBarcode is ON, calculate barcode...
234 my ($tagfield,$tagsubfield) = &GetMarcFromKohaField("items.barcode");
235 if (C4::Context->preference("autoBarcode") ne 'OFF' ) {
236 eval { $record->field($tagfield)->subfield($tagsubfield) };
238 my $sth_barcode = $dbh->prepare("select max(abs(barcode)) from items");
239 $sth_barcode->execute;
240 my ($newbarcode) = $sth_barcode->fetchrow;
241 # OK, we have the new barcode, add the entry in MARC record # FIXME -> should be using barcode plugin here.
242 $field->update( $tagsubfield => ++$newbarcode );
245 # check for item barcode # being unique
246 my $exists = GetItemnumberFromBarcode($record->subfield($tagfield,$tagsubfield)) if ($record->subfield($tagfield,$tagsubfield));
247 # push @errors,"barcode_not_unique" if($exists);
248 $template->param("barcode_not_unique" => 1,'errserialseq'=>$serialseqs[$index]);
249 # if barcode exists, don't create, but report The problem.
251 my ($biblionumber,$bibitemnum,$itemnumber) = AddItemFromMarc($record,$itemhash{$item}->{'bibnum'});
252 AddItem2Serial($itemhash{$item}->{'serial'},$itemnumber);
256 my ($oldbiblionumber,$oldbibnum,$itemnumber) = ModItemFromMarc($record,$itemhash{$item}->{'bibnum'},$item);
261 # ### 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.
262 # my $redirect ="serials-home.pl?";
263 # $redirect.=join("&",map{"serialseq=".$_} @serialseqs);
264 # $redirect.="&".join("&",map{"planneddate=".$_} @planneddates);
265 # $redirect.="&".join("&",map{"publisheddate=".$_} @publisheddates);
266 # $redirect.="&".join("&",map{"status=".$_} @status);
267 # $redirect.="&".join("&",map{"notes=".$_} @notes);
269 my $redirect ="serials-collection.pl?";
270 my %hashsubscription;
271 map{$hashsubscription{$_}=1} @subscriptionids;
272 $redirect.=join("&",map{"subscriptionid=".$_} sort keys %hashsubscription);
273 print $query->redirect("$redirect");
276 $template->param(serialsadditems =>C4::Context->preference("serialsadditems"));
281 bibliotitle => $bibdata->{'title'},
282 biblionumber =>$serialdatalist[0]->{'biblionumber'},
283 serialslist => \@serialdatalist,
285 output_html_with_http_headers $query, $cookie, $template->output;