Bug 10855: Squash several fixes
[koha.git] / C4 / Serials.pm
index b203c32..0e4e71b 100644 (file)
@@ -31,6 +31,7 @@ use C4::Log;    # logaction
 use C4::Debug;
 use C4::Serials::Frequency;
 use C4::Serials::Numberpattern;
+use Koha::AdditionalField;
 
 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
 
@@ -79,7 +80,7 @@ BEGIN {
       &GetDistributedTo   &SetDistributedTo
       &getroutinglist     &delroutingmember   &addroutingmember
       &reorder_members
-      &check_routing &updateClaim &removeMissingIssue
+      &check_routing &updateClaim
       &CountIssues
       HasItems
       &GetSubscriptionsFromBorrower
@@ -316,7 +317,16 @@ sub GetSubscription {
     my $sth = $dbh->prepare($query);
     $sth->execute($subscriptionid);
     my $subscription = $sth->fetchrow_hashref;
+
     $subscription->{cannotedit} = not can_edit_subscription( $subscription );
+
+    # Add additional fields to the subscription into a new key "additional_fields"
+    my $additional_field_values = Koha::AdditionalField->fetch_all_values({
+            tablename => 'subscription',
+            record_id => $subscriptionid,
+    });
+    $subscription->{additional_fields} = $additional_field_values->{$subscriptionid};
+
     return $subscription;
 }
 
@@ -548,7 +558,18 @@ subscription expiration date.
 sub SearchSubscriptions {
     my ( $args ) = @_;
 
-    my $query = q{
+    my $additional_fields = $args->{additional_fields} // [];
+    my $matching_record_ids_for_additional_fields = [];
+    if ( @$additional_fields ) {
+        $matching_record_ids_for_additional_fields = Koha::AdditionalField->get_matching_record_ids({
+                fields => $additional_fields,
+                tablename => 'subscription',
+                exact_match => 0,
+        });
+        return () unless @$matching_record_ids_for_additional_fields;
+    }
+
+    my $query = q|
         SELECT
             subscription.notes AS publicnotes,
             subscriptionhistory.*,
@@ -563,13 +584,15 @@ sub SearchSubscriptions {
             LEFT JOIN biblio ON biblio.biblionumber = subscription.biblionumber
             LEFT JOIN biblioitems ON biblioitems.biblionumber = subscription.biblionumber
             LEFT JOIN aqbooksellers ON subscription.aqbooksellerid = aqbooksellers.id
-    };
+    |;
+    $query .= q| WHERE 1|;
     my @where_strs;
     my @where_args;
     if( $args->{biblionumber} ) {
         push @where_strs, "biblio.biblionumber = ?";
         push @where_args, $args->{biblionumber};
     }
+
     if( $args->{title} ){
         my @words = split / /, $args->{title};
         my (@strs, @args);
@@ -618,8 +641,14 @@ sub SearchSubscriptions {
         push @where_strs, "subscription.closed = ?";
         push @where_args, "$args->{closed}";
     }
+
     if(@where_strs){
-        $query .= " WHERE " . join(" AND ", @where_strs);
+        $query .= ' AND ' . join(' AND ', @where_strs);
+    }
+    if ( @$additional_fields ) {
+        $query .= ' AND subscriptionid IN ('
+            . join( ', ', @$matching_record_ids_for_additional_fields )
+        . ')';
     }
 
     $query .= " ORDER BY " . $args->{orderby} if $args->{orderby};
@@ -627,12 +656,17 @@ sub SearchSubscriptions {
     my $dbh = C4::Context->dbh;
     my $sth = $dbh->prepare($query);
     $sth->execute(@where_args);
-    my $results = $sth->fetchall_arrayref( {} );
-    $sth->finish;
+    my $results =  $sth->fetchall_arrayref( {} );
 
     for my $subscription ( @$results ) {
         $subscription->{cannotedit} = not can_edit_subscription( $subscription );
         $subscription->{cannotdisplay} = not can_show_subscription( $subscription );
+
+        my $additional_field_values = Koha::AdditionalField->fetch_all_values({
+            record_id => $subscription->{subscriptionid},
+            tablename => 'subscription'
+        });
+        $subscription->{additional_fields} = $additional_field_values->{$subscription->{subscriptionid}};
     }
 
     return @$results;
@@ -1149,7 +1183,7 @@ sub ModSerialStatus {
         # check if an alert must be sent... (= a letter is defined & status became "arrived"
         if ( $subscription->{letter} && $status == ARRIVED && $oldstatus != ARRIVED ) {
             require C4::Letters;
-            C4::Letters::SendAlerts( 'issue', $subscription->{subscriptionid}, $subscription->{letter} );
+            C4::Letters::SendAlerts( 'issue', $serialid, $subscription->{letter} );
         }
     }
 
@@ -1877,6 +1911,7 @@ sub GetLateOrMissingIssues {
     return unless ( $supplierid or $serialid );
 
     my $dbh = C4::Context->dbh;
+
     my $sth;
     my $byserial = '';
     if ($serialid) {
@@ -1936,50 +1971,16 @@ sub GetLateOrMissingIssues {
             $line->{claimdate}   = format_date( $line->{claimdate} );
         }
         $line->{"status".$line->{status}}   = 1;
-        push @issuelist, $line;
-    }
-    return @issuelist;
-}
-
-=head2 removeMissingIssue
-
-removeMissingIssue($subscriptionid)
-
-this function removes an issue from being part of the missing string in 
-subscriptionlist.missinglist column
-
-called when a missing issue is found from the serials-recieve.pl file
-
-=cut
 
-sub removeMissingIssue {
-    my ( $sequence, $subscriptionid ) = @_;
+        my $additional_field_values = Koha::AdditionalField->fetch_all_values({
+            record_id => $line->{subscriptionid},
+            tablename => 'subscription'
+        });
+        %$line = ( %$line, additional_fields => $additional_field_values->{$line->{subscriptionid}} );
 
-    return unless ($sequence and $subscriptionid);
-
-    my $dbh = C4::Context->dbh;
-    my $sth = $dbh->prepare("SELECT * FROM subscriptionhistory WHERE subscriptionid = ?");
-    $sth->execute($subscriptionid);
-    my $data              = $sth->fetchrow_hashref;
-    my $missinglist       = $data->{'missinglist'};
-    my $missinglistbefore = $missinglist;
-
-    # warn $missinglist." before";
-    $missinglist =~ s/($sequence)//;
-
-    # warn $missinglist." after";
-    if ( $missinglist ne $missinglistbefore ) {
-        $missinglist =~ s/\|\s\|/\|/g;
-        $missinglist =~ s/^\| //g;
-        $missinglist =~ s/\|$//g;
-        my $sth2 = $dbh->prepare(
-            "UPDATE subscriptionhistory
-                    SET missinglist = ?
-                    WHERE subscriptionid = ?"
-        );
-        $sth2->execute( $missinglist, $subscriptionid );
+        push @issuelist, $line;
     }
-    return;
+    return @issuelist;
 }
 
 =head2 updateClaim
@@ -2444,7 +2445,8 @@ sub _get_next_date_month {
         $day = $fa_day <= $days_in_month ? $fa_day : $days_in_month;
     } else {
         # Try to guess the next day in month
-        my $delta_days = int((28 - ($fa_day - 1)) / $freqdata->{issuesperunit});
+        my $days_in_month = Days_in_Month($year, $month);
+        my $delta_days = int(($days_in_month - ($fa_day - 1)) / $freqdata->{issuesperunit});
         ($year,$month,$day) = Add_Delta_Days($year, $month, $day, $delta_days);
         $subscription->{countissuesperunit}++;
     }
@@ -2465,7 +2467,8 @@ sub _get_next_date_year {
         $day = $fa_day <= $days_in_month ? $fa_day : $days_in_month;
     } else {
         # Try to guess the next day in year
-        my $delta_days = int((365 - ($fa_day - 1)) / $freqdata->{issuesperunit});
+        my $days_in_year = Days_in_Year($year,12); #Sum the days of all the months of this year
+        my $delta_days = int(($days_in_year - ($fa_day - 1)) / $freqdata->{issuesperunit});
         ($year,$month,$day) = Add_Delta_Days($year, $month, $day, $delta_days);
         $subscription->{countissuesperunit}++;
     }
@@ -2623,7 +2626,7 @@ sub _numeration {
 
 =head2 is_barcode_in_use
 
-Returns number of occurence of the barcode in the items table
+Returns number of occurrences of the barcode in the items table
 Can be used as a boolean test of whether the barcode has
 been deployed as yet
 
@@ -2632,13 +2635,13 @@ been deployed as yet
 sub is_barcode_in_use {
     my $barcode = shift;
     my $dbh       = C4::Context->dbh;
-    my $occurences = $dbh->selectall_arrayref(
+    my $occurrences = $dbh->selectall_arrayref(
         'SELECT itemnumber from items where barcode = ?',
         {}, $barcode
 
     );
 
-    return @{$occurences};
+    return @{$occurrences};
 }
 
 =head2 CloseSubscription