use C4::Auth qw(haspermission);
use C4::Context;
-use C4::Dates qw(format_date format_date_in_iso);
use DateTime;
use Date::Calc qw(:all);
use POSIX qw(strftime);
use C4::Serials::Frequency;
use C4::Serials::Numberpattern;
use Koha::AdditionalField;
+use Koha::DateUtils;
+use Koha::Serial;
+use Koha::Subscriptions;
+use Koha::Subscription::Histories;
-use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
+use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
# Define statuses
use constant {
);
BEGIN {
- $VERSION = 3.07.00.049; # set version for version checking
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(
&HasSubscriptionStrictlyExpired &HasSubscriptionExpired &GetExpirationDate &abouttoexpire
&GetSubscriptionHistoryFromSubscriptionId
- &GetNextSeq &GetSeq &NewIssue &ItemizeSerials &GetSerials
+ &GetNextSeq &GetSeq &NewIssue &GetSerials
&GetLatestSerials &ModSerialStatus &GetNextDate &GetSerials2
&ReNewSubscription &GetLateOrMissingIssues
&GetSerialInformation &AddItem2Serial
&PrepareSerialsData &GetNextExpected &ModNextExpected
- &UpdateClaimdateIssues
&GetSuppliersWithLateIssues &getsupplierbyserialid
&GetDistributedTo &SetDistributedTo
&getroutinglist &delroutingmember &addroutingmember
return $rq->rows;
}
-=head2 UpdateClaimdateIssues
-
-UpdateClaimdateIssues($serialids,[$date]);
-
-Update Claimdate for issues in @$serialids list with date $date
-(Take Today if none)
-
-=cut
-
-sub UpdateClaimdateIssues {
- my ( $serialids, $date ) = @_;
-
- return unless ($serialids);
-
- my $dbh = C4::Context->dbh;
- $date = strftime( "%Y-%m-%d", localtime ) unless ($date);
- my $query = "
- UPDATE serial
- SET claimdate = ?,
- status = ?,
- claims_count = claims_count + 1
- WHERE serialid in (" . join( ",", map { '?' } @$serialids ) . ")
- ";
- my $rq = $dbh->prepare($query);
- $rq->execute($date, CLAIMED, @$serialids);
- return $rq->rows;
-}
-
=head2 GetSubscription
$subs = GetSubscription($subscriptionid)
$sth->execute($biblionumber);
my @res;
while ( my $subs = $sth->fetchrow_hashref ) {
- $subs->{startdate} = format_date( $subs->{startdate} );
- $subs->{histstartdate} = format_date( $subs->{histstartdate} );
- $subs->{histenddate} = format_date( $subs->{histenddate} );
+ $subs->{startdate} = output_pref( { dt => dt_from_string( $subs->{startdate} ), dateonly => 1 } );
+ $subs->{histstartdate} = output_pref( { dt => dt_from_string( $subs->{histstartdate} ), dateonly => 1 } );
+ $subs->{histenddate} = output_pref( { dt => dt_from_string( $subs->{histenddate} ), dateonly => 1 } );
$subs->{opacnote} =~ s/\n/\<br\/\>/g;
$subs->{missinglist} =~ s/\n/\<br\/\>/g;
$subs->{recievedlist} =~ s/\n/\<br\/\>/g;
if ( $subs->{enddate} eq '0000-00-00' ) {
$subs->{enddate} = '';
} else {
- $subs->{enddate} = format_date( $subs->{enddate} );
+ $subs->{enddate} = output_pref( { dt => dt_from_string( $subs->{enddate}), dateonly => 1 } );
}
$subs->{'abouttoexpire'} = abouttoexpire( $subs->{'subscriptionid'} );
$subs->{'subscriptionexpired'} = HasSubscriptionExpired( $subs->{'subscriptionid'} );
$line->{ "status" . $line->{status} } = 1; # fills a "statusX" value, used for template status select list
for my $datefield ( qw( planneddate publisheddate) ) {
if ($line->{$datefield} && $line->{$datefield}!~m/^00/) {
- $line->{$datefield} = format_date( $line->{$datefield});
+ $line->{$datefield} = output_pref( { dt => dt_from_string( $line->{$datefield} ), dateonly => 1 } );
} else {
$line->{$datefield} = q{};
}
$line->{ "status" . $line->{status} } = 1; # fills a "statusX" value, used for template status select list
for my $datefield ( qw( planneddate publisheddate) ) {
if ($line->{$datefield} && $line->{$datefield}!~m/^00/) {
- $line->{$datefield} = format_date( $line->{$datefield});
+ $line->{$datefield} = output_pref( { dt => dt_from_string( $line->{$datefield} ), dateonly => 1 } );
} else {
$line->{$datefield} = q{};
}
$line->{$datefield} = q{};
}
else {
- $line->{$datefield} = format_date( $line->{$datefield} );
+ $line->{$datefield} = output_pref( { dt => dt_from_string( $line->{$datefield} ), dateonly => 1 } );
}
}
push @serials, $line;
my @serials;
while ( my $line = $sth->fetchrow_hashref ) {
$line->{ "status" . $line->{status} } = 1; # fills a "statusX" value, used for template status select list
- $line->{"planneddate"} = format_date( $line->{"planneddate"} );
- $line->{"publisheddate"} = format_date( $line->{"publisheddate"} );
+ $line->{planneddate} = output_pref( { dt => dt_from_string( $line->{planneddate} ), dateonly => 1 } );
+ $line->{publisheddate} = output_pref( { dt => dt_from_string( $line->{publisheddate} ), dateonly => 1 } );
push @serials, $line;
}
'subscription'.
$pattern is a hashref containing all the attributes of the table
'subscription_numberpatterns'.
-$planneddate is a C4::Dates object.
+$planneddate is a date string in iso format.
This function get the next issue for the subscription given on input arg
=cut
}
}
- # create new waited entry if needed (ie : was a "waited" and has changed)
- if ( $oldstatus == EXPECTED && $status != EXPECTED ) {
+ # create new expected entry if needed (ie : was "expected" and has changed)
+ my $otherIssueExpected = scalar findSerialsByStatus(EXPECTED, $subscriptionid);
+ if ( !$otherIssueExpected && $oldstatus == EXPECTED && $status != EXPECTED ) {
my $subscription = GetSubscription($subscriptionid);
my $pattern = C4::Serials::Numberpattern::GetSubscriptionNumberpattern($subscription->{numberpattern});
# next date (calculated from actual date & frequency parameters)
my $nextpublisheddate = GetNextDate($subscription, $publisheddate, 1);
my $nextpubdate = $nextpublisheddate;
- NewIssue( $newserialseq, $subscriptionid, $subscription->{'biblionumber'}, 1, $nextpubdate, $nextpubdate );
$query = "UPDATE subscription SET lastvalue1=?, lastvalue2=?, lastvalue3=?, innerloop1=?, innerloop2=?, innerloop3=?
WHERE subscriptionid = ?";
$sth = $dbh->prepare($query);
$sth->execute( $newlastvalue1, $newlastvalue2, $newlastvalue3, $newinnerloop1, $newinnerloop2, $newinnerloop3, $subscriptionid );
+ NewIssue( $newserialseq, $subscriptionid, $subscription->{'biblionumber'}, 1, $nextpubdate, $nextpubdate );
+
# check if an alert must be sent... (= a letter is defined & status became "arrived"
if ( $subscription->{letter} && $status == ARRIVED && $oldstatus != ARRIVED ) {
require C4::Letters;
# calculate issue number
my $serialseq = GetSeq($subscription, $pattern) || q{};
- $query = qq|
- INSERT INTO serial
- (serialseq,subscriptionid,biblionumber,status, planneddate, publisheddate)
- VALUES (?,?,?,?,?,?)
- |;
- $sth = $dbh->prepare($query);
- $sth->execute( $serialseq, $subscriptionid, $biblionumber, EXPECTED, $firstacquidate, $firstacquidate );
+
+ Koha::Serial->new(
+ {
+ serialseq => $serialseq,
+ serialseq_x => $subscription->{'lastvalue1'},
+ serialseq_y => $subscription->{'lastvalue2'},
+ serialseq_z => $subscription->{'lastvalue3'},
+ subscriptionid => $subscriptionid,
+ biblionumber => $biblionumber,
+ status => EXPECTED,
+ planneddate => $firstacquidate,
+ publisheddate => $firstacquidate,
+ }
+ )->store();
logaction( "SERIAL", "ADD", $subscriptionid, "" ) if C4::Context->preference("SubscriptionLog");
return unless ($subscriptionid);
- my $dbh = C4::Context->dbh;
- my $query = qq|
- INSERT INTO serial (serialseq, subscriptionid, biblionumber, status,
- publisheddate, publisheddatetext, planneddate, notes)
- VALUES (?,?,?,?,?,?,?,?)
- |;
- my $sth = $dbh->prepare($query);
- $sth->execute( $serialseq, $subscriptionid, $biblionumber, $status,
- $publisheddate, $publisheddatetext, $planneddate, $notes );
- my $serialid = $dbh->{'mysql_insertid'};
- $query = qq|
- SELECT missinglist,recievedlist
- FROM subscriptionhistory
- WHERE subscriptionid=?
- |;
- $sth = $dbh->prepare($query);
- $sth->execute($subscriptionid);
- my ( $missinglist, $recievedlist ) = $sth->fetchrow;
+ my $schema = Koha::Database->new()->schema();
+
+ my $subscription = Koha::Subscriptions->find( $subscriptionid );
+
+ my $serial = Koha::Serial->new(
+ {
+ serialseq => $serialseq,
+ serialseq_x => $subscription->lastvalue1(),
+ serialseq_y => $subscription->lastvalue2(),
+ serialseq_z => $subscription->lastvalue3(),
+ subscriptionid => $subscriptionid,
+ biblionumber => $biblionumber,
+ status => $status,
+ planneddate => $planneddate,
+ publisheddate => $publisheddate,
+ publisheddatetext => $publisheddatetext,
+ notes => $notes,
+ }
+ )->store();
+
+ my $serialid = $serial->id();
+
+ my $subscription_history = Koha::Subscription::Histories->find($subscriptionid);
+ my $missinglist = $subscription_history->missinglist();
+ my $recievedlist = $subscription_history->recievedlist();
if ( $status == ARRIVED ) {
- ### TODO Add a feature that improves recognition and description.
- ### As such count (serialseq) i.e. : N18,2(N19),N20
- ### Would use substr and index But be careful to previous presence of ()
- $recievedlist .= "; $serialseq" unless (index($recievedlist,$serialseq)>0);
+ ### TODO Add a feature that improves recognition and description.
+ ### As such count (serialseq) i.e. : N18,2(N19),N20
+ ### Would use substr and index But be careful to previous presence of ()
+ $recievedlist .= "; $serialseq" unless ( index( $recievedlist, $serialseq ) > 0 );
}
- if ( grep {/^$status$/} ( MISSING_STATUSES ) ) {
- $missinglist .= "; $serialseq" unless (index($missinglist,$serialseq)>0);
+ if ( grep { /^$status$/ } (MISSING_STATUSES) ) {
+ $missinglist .= "; $serialseq" unless ( index( $missinglist, $serialseq ) > 0 );
}
- $query = qq|
- UPDATE subscriptionhistory
- SET recievedlist=?, missinglist=?
- WHERE subscriptionid=?
- |;
- $sth = $dbh->prepare($query);
+
$recievedlist =~ s/^; //;
$missinglist =~ s/^; //;
- $sth->execute( $recievedlist, $missinglist, $subscriptionid );
- return $serialid;
-}
-
-=head2 ItemizeSerials
-
-ItemizeSerials($serialid, $info);
-$info is a hashref containing barcode branch, itemcallnumber, status, location
-$serialid the serialid
-return :
-1 if the itemize is a succes.
-0 and @error otherwise. @error containts the list of errors found.
-
-=cut
-sub ItemizeSerials {
- my ( $serialid, $info ) = @_;
+ $subscription_history->recievedlist($recievedlist);
+ $subscription_history->missinglist($missinglist);
+ $subscription_history->store();
- return unless ($serialid);
-
- my $now = POSIX::strftime( "%Y-%m-%d", localtime );
-
- my $dbh = C4::Context->dbh;
- my $query = qq|
- SELECT *
- FROM serial
- WHERE serialid=?
- |;
- my $sth = $dbh->prepare($query);
- $sth->execute($serialid);
- my $data = $sth->fetchrow_hashref;
- if ( C4::Context->preference("RoutingSerials") ) {
-
- # check for existing biblioitem relating to serial issue
- my ( $count, @results ) = GetBiblioItemByBiblioNumber( $data->{'biblionumber'} );
- my $bibitemno = 0;
- for ( my $i = 0 ; $i < $count ; $i++ ) {
- if ( $results[$i]->{'volumeddesc'} eq $data->{'serialseq'} . ' (' . $data->{'planneddate'} . ')' ) {
- $bibitemno = $results[$i]->{'biblioitemnumber'};
- last;
- }
- }
- if ( $bibitemno == 0 ) {
- my $sth = $dbh->prepare( "SELECT * FROM biblioitems WHERE biblionumber = ? ORDER BY biblioitemnumber DESC" );
- $sth->execute( $data->{'biblionumber'} );
- my $biblioitem = $sth->fetchrow_hashref;
- $biblioitem->{'volumedate'} = $data->{planneddate};
- $biblioitem->{'volumeddesc'} = $data->{serialseq} . ' (' . format_date( $data->{'planneddate'} ) . ')';
- $biblioitem->{'dewey'} = $info->{itemcallnumber};
- }
- }
-
- my $fwk = GetFrameworkCode( $data->{'biblionumber'} );
- if ( $info->{barcode} ) {
- my @errors;
- if ( is_barcode_in_use( $info->{barcode} ) ) {
- push @errors, 'barcode_not_unique';
- } else {
- my $marcrecord = MARC::Record->new();
- my ( $tag, $subfield ) = GetMarcFromKohaField( "items.barcode", $fwk );
- my $newField = MARC::Field->new( "$tag", '', '', "$subfield" => $info->{barcode} );
- $marcrecord->insert_fields_ordered($newField);
- if ( $info->{branch} ) {
- my ( $tag, $subfield ) = GetMarcFromKohaField( "items.homebranch", $fwk );
-
- #warn "items.homebranch : $tag , $subfield";
- if ( $marcrecord->field($tag) ) {
- $marcrecord->field($tag)->add_subfields( "$subfield" => $info->{branch} );
- } else {
- my $newField = MARC::Field->new( "$tag", '', '', "$subfield" => $info->{branch} );
- $marcrecord->insert_fields_ordered($newField);
- }
- ( $tag, $subfield ) = GetMarcFromKohaField( "items.holdingbranch", $fwk );
-
- #warn "items.holdingbranch : $tag , $subfield";
- if ( $marcrecord->field($tag) ) {
- $marcrecord->field($tag)->add_subfields( "$subfield" => $info->{branch} );
- } else {
- my $newField = MARC::Field->new( "$tag", '', '', "$subfield" => $info->{branch} );
- $marcrecord->insert_fields_ordered($newField);
- }
- }
- if ( $info->{itemcallnumber} ) {
- my ( $tag, $subfield ) = GetMarcFromKohaField( "items.itemcallnumber", $fwk );
-
- if ( $marcrecord->field($tag) ) {
- $marcrecord->field($tag)->add_subfields( "$subfield" => $info->{itemcallnumber} );
- } else {
- my $newField = MARC::Field->new( "$tag", '', '', "$subfield" => $info->{itemcallnumber} );
- $marcrecord->insert_fields_ordered($newField);
- }
- }
- if ( $info->{notes} ) {
- my ( $tag, $subfield ) = GetMarcFromKohaField( "items.itemnotes", $fwk );
-
- if ( $marcrecord->field($tag) ) {
- $marcrecord->field($tag)->add_subfields( "$subfield" => $info->{notes} );
- } else {
- my $newField = MARC::Field->new( "$tag", '', '', "$subfield" => $info->{notes} );
- $marcrecord->insert_fields_ordered($newField);
- }
- }
- if ( $info->{location} ) {
- my ( $tag, $subfield ) = GetMarcFromKohaField( "items.location", $fwk );
-
- if ( $marcrecord->field($tag) ) {
- $marcrecord->field($tag)->add_subfields( "$subfield" => $info->{location} );
- } else {
- my $newField = MARC::Field->new( "$tag", '', '', "$subfield" => $info->{location} );
- $marcrecord->insert_fields_ordered($newField);
- }
- }
- if ( $info->{status} ) {
- my ( $tag, $subfield ) = GetMarcFromKohaField( "items.notforloan", $fwk );
-
- if ( $marcrecord->field($tag) ) {
- $marcrecord->field($tag)->add_subfields( "$subfield" => $info->{status} );
- } else {
- my $newField = MARC::Field->new( "$tag", '', '', "$subfield" => $info->{status} );
- $marcrecord->insert_fields_ordered($newField);
- }
- }
- if ( C4::Context->preference("RoutingSerials") ) {
- my ( $tag, $subfield ) = GetMarcFromKohaField( "items.dateaccessioned", $fwk );
- if ( $marcrecord->field($tag) ) {
- $marcrecord->field($tag)->add_subfields( "$subfield" => $now );
- } else {
- my $newField = MARC::Field->new( "$tag", '', '', "$subfield" => $now );
- $marcrecord->insert_fields_ordered($newField);
- }
- }
- require C4::Items;
- C4::Items::AddItemFromMarc( $marcrecord, $data->{'biblionumber'} );
- return 1;
- }
- return ( 0, @errors );
- }
+ return $serialid;
}
=head2 HasSubscriptionStrictlyExpired
if ($line->{planneddate} && $line->{planneddate} !~/^0+\-/) {
$line->{planneddateISO} = $line->{planneddate};
- $line->{planneddate} = format_date( $line->{planneddate} );
+ $line->{planneddate} = output_pref( { dt => dt_from_string( $line->{"planneddate"} ), dateonly => 1 } );
}
if ($line->{claimdate} && $line->{claimdate} !~/^0+\-/) {
$line->{claimdateISO} = $line->{claimdate};
- $line->{claimdate} = format_date( $line->{claimdate} );
+ $line->{claimdate} = output_pref( { dt => dt_from_string( $line->{"claimdate"} ), dateonly => 1 } );
}
$line->{"status".$line->{status}} = 1;
=cut
sub updateClaim {
- my ($serialid) = @_;
- my $dbh = C4::Context->dbh;
- $dbh->do(q|
+ my ($serialids) = @_;
+ return unless $serialids;
+ unless ( ref $serialids ) {
+ $serialids = [ $serialids ];
+ }
+ my $dbh = C4::Context->dbh;
+ return $dbh->do(q|
UPDATE serial
SET claimdate = NOW(),
- claims_count = claims_count + 1
- WHERE serialid = ?
- |, {}, $serialid );
- return;
+ claims_count = claims_count + 1,
+ status = ?
+ WHERE serialid in (| . join( q|,|, (q|?|) x @$serialids ) . q|)|,
+ {}, CLAIMED, @$serialids );
}
=head2 getsupplierbyserialid
_numeration returns the string corresponding to $value in the num_type
num_type can take :
-dayname
+ -dayabrv
-monthname
+ -monthabrv
-season
+ -seasonabrv
=cut
#'
$num_type //= '';
$locale ||= 'en';
my $string;
- if ( $num_type =~ /^dayname$/ ) {
+ if ( $num_type =~ /^dayname$/ or $num_type =~ /^dayabrv$/ ) {
# 1970-11-01 was a Sunday
$value = $value % 7;
my $dt = DateTime->new(
day => $value + 1,
locale => $locale,
);
- $string = $dt->strftime("%A");
- } elsif ( $num_type =~ /^monthname$/ ) {
+ $string = $num_type =~ /^dayname$/
+ ? $dt->strftime("%A")
+ : $dt->strftime("%a");
+ } elsif ( $num_type =~ /^monthname$/ or $num_type =~ /^monthabrv$/ ) {
$value = $value % 12;
my $dt = DateTime->new(
year => 1970,
month => $value + 1,
locale => $locale,
);
- $string = $dt->strftime("%B");
+ $string = $num_type =~ /^monthname$/
+ ? $dt->strftime("%B")
+ : $dt->strftime("%b");
} elsif ( $num_type =~ /^season$/ ) {
my @seasons= qw( Spring Summer Fall Winter );
$value = $value % 4;
$string = $seasons[$value];
+ } elsif ( $num_type =~ /^seasonabrv$/ ) {
+ my @seasonsabrv= qw( Spr Sum Fal Win );
+ $value = $value % 4;
+ $string = $seasonsabrv[$value];
} else {
$string = $value;
}
return 0;
}
+=head2 findSerialsByStatus
+
+ @serials = findSerialsByStatus($status, $subscriptionid);
+
+ Returns an array of serials matching a given status and subscription id.
+
+=cut
+
+sub findSerialsByStatus {
+ my ( $status, $subscriptionid ) = @_;
+ my $dbh = C4::Context->dbh;
+ my $query = q| SELECT * from serial
+ WHERE status = ?
+ AND subscriptionid = ?
+ |;
+ my $serials = $dbh->selectall_arrayref( $query, { Slice => {} }, $status, $subscriptionid );
+ return @$serials;
+}
+
1;
__END__