Bug 13407: Bumping required version of PDF::Reuse
[koha.git] / C4 / Serials.pm
index 380ec7d..d127066 100644 (file)
@@ -96,14 +96,14 @@ the array is in name order
 sub GetSuppliersWithLateIssues {
     my $dbh   = C4::Context->dbh;
     my $query = qq|
-        SELECT DISTINCT id, name
+    SELECT DISTINCT id, name
     FROM            subscription
     LEFT JOIN       serial ON serial.subscriptionid=subscription.subscriptionid
     LEFT JOIN aqbooksellers ON subscription.aqbooksellerid = aqbooksellers.id
     WHERE id > 0
         AND (
             (planneddate < now() AND serial.status=1)
-            OR serial.STATUS IN (3, 4, 41, 42, 43, 44)
+            OR serial.STATUS IN (3, 4, 41, 42, 43, 44, 7)
         )
         AND subscription.closed = 0
     ORDER BY name|;
@@ -310,8 +310,12 @@ sub UpdateClaimdateIssues {
     my $dbh = C4::Context->dbh;
     $date = strftime( "%Y-%m-%d", localtime ) unless ($date);
     my $query = "
-        UPDATE serial SET claimdate = ?, status = 7
-        WHERE  serialid in (" . join( ",", map { '?' } @$serialids ) . ")";
+        UPDATE serial
+        SET claimdate = ?,
+            status = 7,
+            claims_count = claims_count + 1
+        WHERE  serialid in (" . join( ",", map { '?' } @$serialids ) . ")
+    ";
     my $rq = $dbh->prepare($query);
     $rq->execute($date, @$serialids);
     return $rq->rows;
@@ -1157,50 +1161,6 @@ sub ModSubscriptionHistory {
     return $sth->rows;
 }
 
-# Update missinglist field, used by ModSerialStatus
-sub _update_missinglist {
-    my $subscriptionid = shift;
-
-    my $dbh = C4::Context->dbh;
-    my @missingserials = GetSerials2($subscriptionid, "4,41,42,43,44,5");
-    my $missinglist;
-    foreach my $missingserial (@missingserials) {
-        if ( grep { $_ == $missingserial->{status} } qw( 4 41 42 43 44 ) ) {
-            $missinglist .= $missingserial->{'serialseq'} . "; ";
-        } elsif($missingserial->{'status'} == 5) {
-            $missinglist .= "not issued " . $missingserial->{'serialseq'} . "; ";
-        }
-    }
-    $missinglist =~ s/; $//;
-    my $query = qq{
-        UPDATE subscriptionhistory
-        SET missinglist = ?
-        WHERE subscriptionid = ?
-    };
-    my $sth = $dbh->prepare($query);
-    $sth->execute($missinglist, $subscriptionid);
-}
-
-# Update recievedlist field, used by ModSerialStatus
-sub _update_receivedlist {
-    my $subscriptionid = shift;
-
-    my $dbh = C4::Context->dbh;
-    my @receivedserials = GetSerials2($subscriptionid, "2");
-    my $receivedlist;
-    foreach (@receivedserials) {
-        $receivedlist .= $_->{'serialseq'} . "; ";
-    }
-    $receivedlist =~ s/; $//;
-    my $query = qq{
-        UPDATE subscriptionhistory
-        SET recievedlist = ?
-        WHERE subscriptionid = ?
-    };
-    my $sth = $dbh->prepare($query);
-    $sth->execute($receivedlist, $subscriptionid);
-}
-
 =head2 ModSerialStatus
 
 ModSerialStatus($serialid,$serialseq, $planneddate,$publisheddate,$status,$notes)
@@ -1241,17 +1201,32 @@ sub ModSerialStatus {
         $sth->execute($subscriptionid);
         my $val = $sth->fetchrow_hashref;
         unless ( $val->{manualhistory} ) {
+            $query = "SELECT missinglist,recievedlist FROM subscriptionhistory WHERE  subscriptionid=?";
+            $sth   = $dbh->prepare($query);
+            $sth->execute($subscriptionid);
+            my ( $missinglist, $recievedlist ) = $sth->fetchrow;
+
             if ( $status == 2 || ($oldstatus == 2 && $status != 2) ) {
-                  _update_receivedlist($subscriptionid);
+                $recievedlist .= "; $serialseq"
+                    if ($recievedlist !~ /(^|;)\s*$serialseq(?=;|$)/);
             }
-            my @missing_statuses = qw( 4 41 42 43 44 );
-            if ( (  grep { $_ == $status } ( @missing_statuses, 5 ) )
-              || (
-                  ( grep { $_ == $oldstatus } @missing_statuses )
-                  && ! ( grep { $_ == $status } @missing_statuses ) )
-              || ($oldstatus == 5 && $status != 5)) {
-                _update_missinglist($subscriptionid);
+
+            # in case serial has been previously marked as missing
+            if (grep /$status/, (1,2,3,7)) {
+                $missinglist=~ s/(^|;)\s*$serialseq(?=;|$)//g;
             }
+
+            my @missing_statuses = qw( 4 41 42 43 44 );
+            $missinglist .= "; $serialseq"
+                if ( ( grep { $_ == $status } @missing_statuses ) && ( $missinglist !~/(^|;)\s*$serialseq(?=;|$)/ ) );
+            $missinglist .= "; not issued $serialseq"
+                if ( $status == 5 && $missinglist !~ /(^|;)\s*$serialseq(?=;|$)/ );
+
+            $query = "UPDATE subscriptionhistory SET recievedlist=?, missinglist=? WHERE  subscriptionid=?";
+            $sth   = $dbh->prepare($query);
+            $recievedlist =~ s/^; //;
+            $missinglist  =~ s/^; //;
+            $sth->execute( $recievedlist, $missinglist, $subscriptionid );
         }
     }
 
@@ -2022,14 +1997,14 @@ sub GetLateOrMissingIssues {
             "SELECT
                 serialid,      aqbooksellerid,        name,
                 biblio.title,  biblioitems.issn,      planneddate,    serialseq,
-                serial.status, serial.subscriptionid, claimdate,
+                serial.status, serial.subscriptionid, claimdate, claims_count,
                 subscription.branchcode
-            FROM      serial 
-                LEFT JOIN subscription  ON serial.subscriptionid=subscription.subscriptionid 
+            FROM      serial
+                LEFT JOIN subscription  ON serial.subscriptionid=subscription.subscriptionid
                 LEFT JOIN biblio        ON subscription.biblionumber=biblio.biblionumber
                 LEFT JOIN biblioitems   ON subscription.biblionumber=biblioitems.biblionumber
                 LEFT JOIN aqbooksellers ON subscription.aqbooksellerid = aqbooksellers.id
-                WHERE subscription.subscriptionid = serial.subscriptionid 
+                WHERE subscription.subscriptionid = serial.subscriptionid
                 AND (serial.STATUS IN (4, 41, 42, 43, 44) OR ((planneddate < now() AND serial.STATUS =1) OR serial.STATUS = 3 OR serial.STATUS = 7))
                 AND subscription.aqbooksellerid=$supplierid
                 $byserial
@@ -2037,16 +2012,16 @@ sub GetLateOrMissingIssues {
         );
     } else {
         $sth = $dbh->prepare(
-            "SELECT 
+            "SELECT
             serialid,      aqbooksellerid,         name,
             biblio.title,  planneddate,           serialseq,
-                serial.status, serial.subscriptionid, claimdate,
+                serial.status, serial.subscriptionid, claimdate, claims_count,
                 subscription.branchcode
-            FROM serial 
-                LEFT JOIN subscription ON serial.subscriptionid=subscription.subscriptionid 
+            FROM serial
+                LEFT JOIN subscription ON serial.subscriptionid=subscription.subscriptionid
                 LEFT JOIN biblio ON subscription.biblionumber=biblio.biblionumber
                 LEFT JOIN aqbooksellers ON subscription.aqbooksellerid = aqbooksellers.id
-                WHERE subscription.subscriptionid = serial.subscriptionid 
+                WHERE subscription.subscriptionid = serial.subscriptionid
                         AND (serial.STATUS IN (4, 41, 42, 43, 44) OR ((planneddate < now() AND serial.STATUS =1) OR serial.STATUS = 3 OR serial.STATUS = 7))
                 $byserial
                 ORDER BY $order"
@@ -2124,12 +2099,12 @@ called from claims.pl file
 sub updateClaim {
     my ($serialid) = @_;
     my $dbh        = C4::Context->dbh;
-    my $sth        = $dbh->prepare(
-        "UPDATE serial SET claimdate = now()
-                WHERE serialid = ?
-        "
-    );
-    $sth->execute($serialid);
+    $dbh->do(q|
+        UPDATE serial
+        SET claimdate = NOW(),
+            claims_count = claims_count + 1
+        WHERE serialid = ?
+    |, {}, $serialid );
     return;
 }
 
@@ -2697,36 +2672,32 @@ sub _numeration {
     $num_type //= '';
     $locale ||= 'en';
     my $string;
-    given ($num_type) {
-        when (/^dayname$/) {
-            # 1970-06-01 was a monday
-            $value = $value % 7;
-            my $dt = DateTime->new(
-                year    => 1970,
-                month   => 6,
-                day     => $value + 1,
-                locale  => $locale,
-            );
-            $string = $dt->strftime("%A");
-        }
-        when (/^monthname$/) {
-            $value = $value % 12;
-            my $dt = DateTime->new(
-                year    => 1970,
-                month   => $value + 1,
-                locale  => $locale,
-            );
-            $string = $dt->strftime("%B");
-        }
-        when (/^season$/) {
-              my @seasons= qw( Spring Summer Fall Winter );
-              $value = $value % 4;
-              $string = $seasons[$value];
-        }
-        default {
-            $string = $value;
-        }
+    if ( $num_type =~ /^dayname$/ ) {
+        # 1970-11-01 was a Sunday
+        $value = $value % 7;
+        my $dt = DateTime->new(
+            year    => 1970,
+            month   => 11,
+            day     => $value + 1,
+            locale  => $locale,
+        );
+        $string = $dt->strftime("%A");
+    } elsif ( $num_type =~ /^monthname$/ ) {
+        $value = $value % 12;
+        my $dt = DateTime->new(
+            year    => 1970,
+            month   => $value + 1,
+            locale  => $locale,
+        );
+        $string = $dt->strftime("%B");
+    } elsif ( $num_type =~ /^season$/ ) {
+        my @seasons= qw( Spring Summer Fall Winter );
+        $value = $value % 4;
+        $string = $seasons[$value];
+    } else {
+        $string = $value;
     }
+
     return $string;
 }