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
69 use C4
::Dates qw
/format_date format_date_in_iso/;
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]);
94 # If user comes from subscription details
96 foreach my $subscriptionid (@subscriptionids){
97 my $serstatus=$query->param('serstatus');
99 my ($count,@tmpser)=GetSerials2
($subscriptionid,$serstatus);
101 push @serialids, $_->{'serialid'};
107 unless (scalar(@serialids)){
108 my $string="serials-collection.pl?subscriptionid=".join(",",@subscriptionids);
111 print $query->redirect($string);
113 my ($template, $loggedinuser, $cookie)
114 = get_template_and_user
({template_name
=> "serials/serials-edit.tmpl",
117 authnotrequired
=> 0,
118 flagsrequired
=> {serials
=> 1},
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;
135 my $bibdata=GetBiblioData
($serialdatalist[0]->{'biblionumber'});
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});
146 if ($serialdatalist[0]->{'serialsadditems'}){
147 #Create New empty item
149 PrepareItemrecordDisplay
( $serialdatalist[0]->{'biblionumber'},'', $subscriptiondetail);
150 $cell->{serialsadditems
} = 1;
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),
161 $processedsubscriptionid{$subscriptionid}=1;
162 $template->param(bibliotitle
=> $subscriptiondetail->{'bibliotitle'},
163 callnumber
=> $subscriptiondetail->{'callnumber'},
167 $template->param(newserialloop
=>\
@newserialloop);
168 $template->param(subscriptions
=>\
@subscriptionloop);
170 if ($op and $op eq 'serialchangestatus') {
171 # my $sth = $dbh->prepare("select status from serial where serialid=?");
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'},
182 format_date_in_iso
($planneddates[$i]),
183 format_date_in_iso
($publisheddates[$i]),
186 }elsif ($serialids[$i]){
187 ModSerialStatus
($serialids[$i],
189 format_date_in_iso
($planneddates[$i]),
190 format_date_in_iso
($publisheddates[$i]),
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.
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];
215 $itemhash{$itemid[$i]}->{'serial'}=$newserial;
217 $itemhash{$itemid[$i]}->{'bibnum'}=$bibnums[$countdistinct];
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];
226 foreach my $item (keys %itemhash){
227 # Verify Itemization is "Valid", i.e. serial status is Arrived or Missing
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"));
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'});
239 my $record=MARC
::Record
::new_from_xml
($xml, 'UTF-8');
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 );
254 # check for item barcode # being unique
256 if ($record->subfield($barcodetagfield,$barcodetagsubfield)) {
257 $exists = GetItemnumberFromBarcode
($record->subfield($barcodetagfield,$barcodetagsubfield));
259 # push @errors,"barcode_not_unique" if($exists);
260 # if barcode exists, don't create, but report The problem.
262 push @errors,"barcode_not_unique" if($exists);
263 push @errseq,{"serialseq"=>$serialseqs[$index]};
265 my ($biblionumber,$bibitemnum,$itemnumber) = AddItemFromMarc
($record,$itemhash{$item}->{'bibnum'});
266 AddItem2Serial
($itemhash{$item}->{'serial'},$itemnumber);
270 my ($oldbiblionumber,$oldbibnum,$itemnumber) = ModItemFromMarc
($record,$itemhash{$item}->{'bibnum'},$item);
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);
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);
290 my $redirect ="serials-collection.pl?";
291 my %hashsubscription;
292 foreach (@subscriptionids) {
293 $hashsubscription{$_}=1;
295 $redirect.=join("&",map{"subscriptionid=".$_} sort keys %hashsubscription);
296 print $query->redirect("$redirect");
301 serialsadditems
=> $serialdatalist[0]->{'serialsadditems'},
302 biblionumber
=> $serialdatalist[0]->{'biblionumber'},
303 serialslist
=> \
@serialdatalist,
305 output_html_with_http_headers
$query, $cookie, $template->output;