Serials planning: Update subscription edit to properly deal with date changes. (...
[koha.git] / serials / serials-edit.pl
index 4da3c76..d54912e 100755 (executable)
@@ -17,7 +17,6 @@
 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
 # Suite 330, Boston, MA  02111-1307 USA
 
-# $Id$
 
 =head1 NAME
 
@@ -66,14 +65,16 @@ op can be :
 use strict;
 use CGI;
 use C4::Auth;
-use C4::Date;
+use C4::Dates qw/format_date format_date_in_iso/;
 use C4::Biblio;
+use C4::Items;
 use C4::Koha;
 use C4::Output;
-use C4::Interface::CGI::Output;
 use C4::Context;
 use C4::Serials;
 
+#use Smart::Comments;
+
 my $query = new CGI;
 my $dbh = C4::Context->dbh;
 my @serialids = $query->param('serialid');
@@ -102,6 +103,12 @@ unless (@serialids){
   }
 }
 
+unless (scalar(@serialids)){
+  my $string="serials-collection.pl?subscriptionid=".join(",",@subscriptionids);
+  $string=~s/,$//;
+#  warn $string; 
+  print $query->redirect($string);
+}
 my ($template, $loggedinuser, $cookie)
 = get_template_and_user({template_name => "serials/serials-edit.tmpl",
                 query => $query,
@@ -116,25 +123,31 @@ foreach my $tmpserialid (@serialids){
   my $data=GetSerialInformation($tmpserialid);
   $data->{publisheddate}=format_date($data->{publisheddate});
   $data->{planneddate}=format_date($data->{planneddate});
+  $data->{'editdisable'}=((HasSubscriptionExpired($data->{subscriptionid})&& $data->{'status1'})||$data->{'cannotedit'});
   push @serialdatalist,$data;
 }
+my $bibdata=GetBiblioData($serialdatalist[0]->{'biblionumber'});
 
 my @newserialloop;
 my @subscriptionloop;
+# check, for each subscription edited, that we have an empty item line if applicable for the subscription
 foreach my $subscriptionid (@subscriptionids){
   my $cell;
-  if (C4::Context->preference("serialsadditems")){
+  if ($serialdatalist[0]->{'serialsadditems'}){
   #Create New empty item  
     $cell =
-      PrepareItemrecordDisplay( $serialdatalist[0]->{'biblionumber'} );
+    PrepareItemrecordDisplay( $serialdatalist[0]->{'biblionumber'} );
+    $cell->{serialsadditems} = 1;
   }
   $cell->{'subscriptionid'}=$subscriptionid;
-  $cell->{'subscriptionexpired'}=HasSubscriptionExpired($subscriptionid);
   $cell->{'itemid'}       = "NNEW";
   $cell->{'serialid'}     = "NEW";
   $cell->{'issuesatonce'}   = 1;
   push @newserialloop,$cell;
-  push @subscriptionloop, {'subscriptionid'=>$subscriptionid};
+  push @subscriptionloop, {'subscriptionid'=>$subscriptionid,
+                           'abouttoexpire'=>abouttoexpire($subscriptionid),
+                           'subscriptionexpired'=>HasSubscriptionExpired($subscriptionid),
+  };
 }
 $template->param(newserialloop=>\@newserialloop);
 $template->param(subscriptions=>\@subscriptionloop);
@@ -164,8 +177,8 @@ if ($op eq 'serialchangestatus') {
                             $notes[$i]);
         }
     }
-    if (C4::Context->preference("serialsadditems")){
-      my @moditems = $query->param('moditem');
+    my @moditems = $query->param('moditem');
+    if (scalar(@moditems)){
       my @tags = $query->param('tag');
       my @subfields = $query->param('subfield');
       my @field_values = $query->param('field_value');
@@ -197,63 +210,69 @@ if ($op eq 'serialchangestatus') {
       }
       foreach my $item (keys %itemhash){
         # Verify Itemization is "Valid", i.e. serial status is Arrived or Missing
-        my $index;
+        my $index=-1;
         for (my $i=0; $i<scalar(@serialids);$i++){
-          $index = $i if ($itemhash{$item}->{'serial'} eq $serialids[$i]);
+          $index = $i if ($itemhash{$item}->{'serial'} eq $serialids[$i] || ($itemhash{$item}->{'serial'} == $newserial && $serialids[$i] eq "NEW"));
         }
-        if ($status[$index]==2){
+        if ($index>=0 && $status[$index]==2){
           my $xml = TransformHtmlToXml( $itemhash{$item}->{'tags'},
                                   $itemhash{$item}->{'subfields'},
                                   $itemhash{$item}->{'field_values'},
                                   $itemhash{$item}->{'ind_tag'},
                                   $itemhash{$item}->{'indicator'});
-#           warn $xml;
+  #           warn $xml;
           my $record=MARC::Record::new_from_xml($xml, 'UTF-8');
           if ($item=~/^N/){
             #New Item
-            # if autoBarcode is ON, calculate barcode...
-            my ($tagfield,$tagsubfield) = &GetMarcFromKohaField($dbh,"items.barcode");
-            if (C4::Context->preference('autoBarcode')) {
-              unless ($record->field($tagfield)->subfield($tagsubfield)) {
+                       
+            # if autoBarcode is set to 'incremental', calculate barcode...
+            my ($tagfield,$tagsubfield) = &GetMarcFromKohaField("items.barcode");
+            if (C4::Context->preference("autoBarcode") eq 'incremental'  ) {
+              if (!$record->field($tagfield)->subfield($tagsubfield)) {
                 my $sth_barcode = $dbh->prepare("select max(abs(barcode)) from items");
                 $sth_barcode->execute;
                 my ($newbarcode) = $sth_barcode->fetchrow;
-                $newbarcode++;
-                # OK, we have the new barcode, now create the entry in MARC record
-                my $fieldItem = $record->field($tagfield);
-                $record->delete_field($fieldItem);
-                $fieldItem->add_subfields($tagsubfield => $newbarcode);
-                $record->insert_fields_ordered($fieldItem);
+                # OK, we have the new barcode, add the entry in MARC record # FIXME -> should be  using barcode plugin here.
+                $record->field($tagfield)->update( $tagsubfield => ++$newbarcode );
               }
             }
             # check for item barcode # being unique
-            my $exists = GetItemFromBarcode($record->subfield($tagfield,$tagsubfield)) if ($record->subfield($tagfield,$tagsubfield));
+            my $exists = GetItemnumberFromBarcode($record->subfield($tagfield,$tagsubfield)) if ($record->subfield($tagfield,$tagsubfield));
   #           push @errors,"barcode_not_unique" if($exists);
             $template->param("barcode_not_unique" => 1,'errserialseq'=>$serialseqs[$index]);
             # if barcode exists, don't create, but report The problem.
-            unless ($exists){
-              my ($biblionumber,$bibitemnum,$itemnumber) = AddItem($record,$itemhash{$item}->{'bibnum'});
+                       unless ($exists){
+              my ($biblionumber,$bibitemnum,$itemnumber) = AddItemFromMarc($record,$itemhash{$item}->{'bibnum'});
               AddItem2Serial($itemhash{$item}->{'serial'},$itemnumber);
             }
           } else {
             #modify item
-            my ($oldbiblionumber,$oldbibnum,$itemnumber) = ModItem($record,$itemhash{$item}->{'bibnum'},$item,0);
+            my ($oldbiblionumber,$oldbibnum,$itemnumber) = ModItemFromMarc($record,$itemhash{$item}->{'bibnum'},$item);
           }
         }
       }
     }
-    print $query->redirect("serials-collection.pl?biblionumber=".$serialdatalist[0]->{biblionumber});
+#     ### 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.     
+#     my $redirect ="serials-home.pl?";
+#     $redirect.=join("&",map{"serialseq=".$_} @serialseqs);
+#     $redirect.="&".join("&",map{"planneddate=".$_} @planneddates);
+#     $redirect.="&".join("&",map{"publisheddate=".$_} @publisheddates);
+#     $redirect.="&".join("&",map{"status=".$_} @status);
+#     $redirect.="&".join("&",map{"notes=".$_} @notes);
+
+     my $redirect ="serials-collection.pl?";
+     my %hashsubscription;
+        foreach (@subscriptionids) {
+       $hashsubscription{$_}=1;
+        }
+     $redirect.=join("&",map{"subscriptionid=".$_} sort keys %hashsubscription);
+    print $query->redirect("$redirect");
 }
 
-$template->param(serialsadditems =>C4::Context->preference("serialsadditems"));
-
-
-
 $template->param(
-            biblionumber =>$serialdatalist[0]->{'biblionumber'},
-            serialslist => \@serialdatalist,
-            intranetcolorstylesheet => C4::Context->preference("intranetcolorstylesheet"),
-            intranetstylesheet => C4::Context->preference("intranetstylesheet"),
-            IntranetNav => C4::Context->preference("IntranetNav"),
-        );
+       serialsadditems => $serialdatalist[0]->{'serialsadditems'},
+       bibliotitle  => $bibdata->{'title'},
+       biblionumber => $serialdatalist[0]->{'biblionumber'},
+       serialslist  => \@serialdatalist,
+);
 output_html_with_http_headers $query, $cookie, $template->output;