X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=C4%2FSerials.pm;h=e0f260c687df13d6e374fd3d7f194a164b039a15;hb=3de59aba2776184a6fd2e9943d86a7c66e8f7648;hp=f4de27e77153de75f69fb1673f45600c7267da67;hpb=896d1cd5c801222d0fc436721fbc85207f66e2af;p=koha_gimpoz diff --git a/C4/Serials.pm b/C4/Serials.pm index f4de27e771..e0f260c687 100644 --- a/C4/Serials.pm +++ b/C4/Serials.pm @@ -17,47 +17,26 @@ package C4::Serials; #assumes C4/Serials.pm # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place, # Suite 330, Boston, MA 02111-1307 USA -# $Id$ use strict; -use C4::Date; +use C4::Dates qw(format_date format_date_in_iso); use Date::Calc qw(:all); use POSIX qw(strftime); use C4::Suggestions; use C4::Koha; use C4::Biblio; +use C4::Items; use C4::Search; use C4::Letters; use C4::Log; # logaction -require Exporter; - use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); -# set the version for version checking -$VERSION = do { my @v = '$Revision$' =~ /\d+/g; - shift(@v) . "." . join( "_", map { sprintf "%03d", $_ } @v ); -}; - -=head1 NAME - -C4::Serials - Give functions for serializing. - -=head1 SYNOPSIS - - use C4::Serials; - -=head1 DESCRIPTION - -Give all XYZ functions - -=head1 FUNCTIONS - -=cut - -@ISA = qw(Exporter); -@EXPORT = qw( - +BEGIN { + $VERSION = 3.01; # set version for version checking + require Exporter; + @ISA = qw(Exporter); + @EXPORT = qw( &NewSubscription &ModSubscription &DelSubscription &GetSubscriptions &GetSubscription &CountSubscriptionFromBiblionumber &GetSubscriptionsFromBiblionumber &GetFullSubscriptionsFromBiblionumber &GetFullSubscription &ModSubscriptionHistory @@ -77,10 +56,25 @@ Give all XYZ functions &check_routing &updateClaim &removeMissingIssue &old_newsubscription &old_modsubscription &old_getserials -); + ); +} =head2 GetSuppliersWithLateIssues +=head1 NAME + +C4::Serials - Give functions for serializing. + +=head1 SYNOPSIS + + use C4::Serials; + +=head1 DESCRIPTION + +Give all XYZ functions + +=head1 FUNCTIONS + =over 4 %supplierlist = &GetSuppliersWithLateIssues @@ -103,6 +97,7 @@ sub GetSuppliersWithLateIssues { LEFT JOIN aqbooksellers ON subscription.aqbooksellerid = aqbooksellers.id WHERE subscription.subscriptionid = serial.subscriptionid AND (planneddate < now() OR serial.STATUS = 3 OR serial.STATUS = 4) + ORDER BY name |; my $sth = $dbh->prepare($query); $sth->execute; @@ -139,12 +134,12 @@ sub GetLateIssues { if ($supplierid) { my $query = qq| SELECT name,title,planneddate,serialseq,serial.subscriptionid - FROM subscription, serial, biblio + FROM subscription + LEFT JOIN serial ON subscription.subscriptionid = serial.subscriptionid + LEFT JOIN biblio ON biblio.biblionumber = subscription.biblionumber LEFT JOIN aqbooksellers ON subscription.aqbooksellerid = aqbooksellers.id - WHERE subscription.subscriptionid = serial.subscriptionid - AND ((planneddate < now() AND serial.STATUS =1) OR serial.STATUS = 3) + WHERE ((planneddate < now() AND serial.STATUS =1) OR serial.STATUS = 3) AND subscription.aqbooksellerid=$supplierid - AND biblio.biblionumber = subscription.biblionumber ORDER BY title |; $sth = $dbh->prepare($query); @@ -152,11 +147,11 @@ sub GetLateIssues { else { my $query = qq| SELECT name,title,planneddate,serialseq,serial.subscriptionid - FROM subscription, serial, biblio + FROM subscription + LEFT JOIN serial ON subscription.subscriptionid = serial.subscriptionid + LEFT JOIN biblio ON biblio.biblionumber = subscription.biblionumber LEFT JOIN aqbooksellers ON subscription.aqbooksellerid = aqbooksellers.id - WHERE subscription.subscriptionid = serial.subscriptionid - AND ((planneddate < now() AND serial.STATUS =1) OR serial.STATUS = 3) - AND biblio.biblionumber = subscription.biblionumber + WHERE ((planneddate < now() AND serial.STATUS =1) OR serial.STATUS = 3) ORDER BY title |; $sth = $dbh->prepare($query); @@ -244,7 +239,14 @@ sub GetSerialInformation { my ($serialid) = @_; my $dbh = C4::Context->dbh; my $query = qq| - SELECT serial.*, serial.notes as sernotes, serial.status as serstatus,subscription.*,subscription.subscriptionid as subsid + SELECT serial.*, serial.notes as sernotes, serial.status as serstatus,subscription.*,subscription.subscriptionid as subsid|; + if (C4::Context->preference('IndependantBranches') && + C4::Context->userenv && + C4::Context->userenv->{'flags'} != 1 && C4::Context->userenv->{'branch'}){ + $query.=" + , ((subscription.branchcode <>\"".C4::Context->userenv->{'branch'}."\") and subscription.branchcode <>\"\" and subscription.branchcode IS NOT NULL) as cannotedit "; + } + $query .= qq| FROM serial LEFT JOIN subscription ON subscription.subscriptionid=serial.subscriptionid WHERE serialid = ? |; @@ -287,7 +289,7 @@ sub GetSerialInformation { return $data; } -=head2 GetSerialInformation +=head2 AddItem2Serial =over 4 @@ -357,7 +359,14 @@ sub GetSubscription { aqbudget.bookfundid, aqbooksellers.name AS aqbooksellername, biblio.title AS bibliotitle, - subscription.biblionumber as bibnum + subscription.biblionumber as bibnum); + if (C4::Context->preference('IndependantBranches') && + C4::Context->userenv && + C4::Context->userenv->{'flags'} != 1 && C4::Context->userenv->{'branch'}){ + $query.=" + , ((subscription.branchcode <>\"".C4::Context->userenv->{'branch'}."\") and subscription.branchcode <>\"\" and subscription.branchcode IS NOT NULL) as cannotedit "; + } + $query .= qq( FROM subscription LEFT JOIN subscriptionhistory ON subscription.subscriptionid=subscriptionhistory.subscriptionid LEFT JOIN aqbudget ON subscription.aqbudgetid=aqbudget.aqbudgetid @@ -365,13 +374,13 @@ sub GetSubscription { LEFT JOIN biblio ON biblio.biblionumber=subscription.biblionumber WHERE subscription.subscriptionid = ? ); - if (C4::Context->preference('IndependantBranches') && - C4::Context->userenv && - C4::Context->userenv->{'flags'} != 1){ -# warn "flags: ".C4::Context->userenv->{'flags'}; - $query.=" AND subscription.branchcode IN ('".C4::Context->userenv->{'branch'}."',\"\")"; - } -# warn "query : $query"; +# if (C4::Context->preference('IndependantBranches') && +# C4::Context->userenv && +# C4::Context->userenv->{'flags'} != 1){ +# # warn "flags: ".C4::Context->userenv->{'flags'}; +# $query.=" AND subscription.branchcode IN ('".C4::Context->userenv->{'branch'}."',\"\")"; +# } +# warn "query : $query"; my $sth = $dbh->prepare($query); # warn "subsid :$subscriptionid"; $sth->execute($subscriptionid); @@ -404,25 +413,26 @@ sub GetFullSubscription { aqbudget.bookfundid,aqbooksellers.name as aqbooksellername, biblio.title as bibliotitle, subscription.branchcode AS branchcode, - subscription.subscriptionid AS subscriptionid + subscription.subscriptionid AS subscriptionid |; + if (C4::Context->preference('IndependantBranches') && + C4::Context->userenv && + C4::Context->userenv->{'flags'} != 1 && C4::Context->userenv->{'branch'}){ + $query.=" + , ((subscription.branchcode <>\"".C4::Context->userenv->{'branch'}."\") and subscription.branchcode <>\"\" and subscription.branchcode IS NOT NULL) as cannotedit "; + } + $query.=qq| FROM serial LEFT JOIN subscription ON - (serial.subscriptionid=subscription.subscriptionid AND subscription.biblionumber=serial.biblionumber) + (serial.subscriptionid=subscription.subscriptionid ) LEFT JOIN aqbudget ON subscription.aqbudgetid=aqbudget.aqbudgetid LEFT JOIN aqbooksellers on subscription.aqbooksellerid=aqbooksellers.id LEFT JOIN biblio on biblio.biblionumber=subscription.biblionumber - WHERE serial.subscriptionid = ? |; - if (C4::Context->preference('IndependantBranches') && - C4::Context->userenv && - C4::Context->userenv->{'flags'} != 1){ - $query.=" - AND subscription.branchcode IN ('".C4::Context->userenv->{'branch'}."',\"''\")"; - } - $query .=qq| + WHERE serial.subscriptionid = ? ORDER BY year DESC, IF(serial.publisheddate="00-00-0000",serial.planneddate,serial.publisheddate) DESC, serial.subscriptionid |; +# warn $query; my $sth = $dbh->prepare($query); $sth->execute($subscriptionid); my $subs = $sth->fetchall_arrayref({}); @@ -480,8 +490,8 @@ sub PrepareSerialsData{ 'bibliotitle' => $subs->{'bibliotitle'}, 'serials' => [$subs], 'first' => $first, - 'branchcode' => $subs->{'branchcode'}, - 'subscriptionid' => $subs->{'subscriptionid'}, +# 'branchcode' => $subs->{'branchcode'}, +# 'subscriptionid' => $subs->{'subscriptionid'}, }; } @@ -523,11 +533,11 @@ sub GetSubscriptionsFromBiblionumber { LEFT JOIN branches ON branches.branchcode=subscription.branchcode WHERE subscription.biblionumber = ? ); - if (C4::Context->preference('IndependantBranches') && - C4::Context->userenv && - C4::Context->userenv->{'flags'} != 1){ - $query.=" AND subscription.branchcode IN ('".C4::Context->userenv->{'branch'}."',\"\")"; - } +# if (C4::Context->preference('IndependantBranches') && +# C4::Context->userenv && +# C4::Context->userenv->{'flags'} != 1){ +# $query.=" AND subscription.branchcode IN ('".C4::Context->userenv->{'branch'}."',\"\")"; +# } my $sth = $dbh->prepare($query); $sth->execute($biblionumber); my @res; @@ -540,6 +550,11 @@ sub GetSubscriptionsFromBiblionumber { $subs->{ "periodicity" . $subs->{periodicity} } = 1; $subs->{ "numberpattern" . $subs->{numberpattern} } = 1; $subs->{ "status" . $subs->{'status'} } = 1; + $subs->{'cannotedit'}=(C4::Context->preference('IndependantBranches') && + C4::Context->userenv && + C4::Context->userenv->{flags} !=1 && + C4::Context->userenv->{branch} && $subs->{branchcode} && + (C4::Context->userenv->{branch} ne $subs->{branchcode})); if ( $subs->{enddate} eq '0000-00-00' ) { $subs->{enddate} = ''; } @@ -578,21 +593,22 @@ sub GetFullSubscriptionsFromBiblionumber { aqbudget.bookfundid,aqbooksellers.name as aqbooksellername, biblio.title as bibliotitle, subscription.branchcode AS branchcode, - subscription.subscriptionid AS subscriptionid + subscription.subscriptionid AS subscriptionid|; + if (C4::Context->preference('IndependantBranches') && + C4::Context->userenv && + C4::Context->userenv->{'flags'} != 1 && C4::Context->userenv->{'branch'}){ + $query.=" + , ((subscription.branchcode <>\"".C4::Context->userenv->{'branch'}."\") and subscription.branchcode <>\"\" and subscription.branchcode IS NOT NULL) as cannotedit "; + } + + $query.=qq| FROM serial LEFT JOIN subscription ON - (serial.subscriptionid=subscription.subscriptionid AND subscription.biblionumber=serial.biblionumber) + (serial.subscriptionid=subscription.subscriptionid) LEFT JOIN aqbudget ON subscription.aqbudgetid=aqbudget.aqbudgetid LEFT JOIN aqbooksellers on subscription.aqbooksellerid=aqbooksellers.id LEFT JOIN biblio on biblio.biblionumber=subscription.biblionumber - WHERE subscription.biblionumber = ? |; - if (C4::Context->preference('IndependantBranches') && - C4::Context->userenv && - C4::Context->userenv->{'flags'} != 1){ - $query.=" - AND subscription.branchcode IN ('".C4::Context->userenv->{'branch'}."',\"''\")"; - } - $query .=qq| + WHERE subscription.biblionumber = ? ORDER BY year DESC, IF(serial.publisheddate="00-00-0000",serial.planneddate,serial.publisheddate) DESC, serial.subscriptionid @@ -623,17 +639,12 @@ sub GetSubscriptions { my $sth; if ($biblionumber) { my $query = qq( - SELECT subscription.subscriptionid,biblio.title,biblioitems.issn,subscription.notes,subscription.branchcode,biblio.biblionumber - FROM subscription,biblio,biblioitems - WHERE biblio.biblionumber = biblioitems.biblionumber - AND biblio.biblionumber = subscription.biblionumber - AND biblio.biblionumber=? + SELECT subscription.*,biblio.title,biblioitems.issn,biblio.biblionumber + FROM subscription + LEFT JOIN biblio ON biblio.biblionumber = subscription.biblionumber + LEFT JOIN biblioitems ON biblio.biblionumber = biblioitems.biblionumber + WHERE biblio.biblionumber=? ); - if (C4::Context->preference('IndependantBranches') && - C4::Context->userenv && - C4::Context->userenv->{'flags'} != 1){ - $query.=" AND subscription.branchcode IN ('".C4::Context->userenv->{'branch'}."',\"''\")"; - } $query.=" ORDER BY title"; # warn "query :$query"; $sth = $dbh->prepare($query); @@ -642,35 +653,24 @@ sub GetSubscriptions { else { if ( $ISSN and $title ) { my $query = qq| - SELECT subscription.subscriptionid,biblio.title,biblioitems.issn,subscription.notes,subscription.branchcode,biblio.biblionumber - FROM subscription,biblio,biblioitems - WHERE biblio.biblionumber = biblioitems.biblionumber - AND biblio.biblionumber= subscription.biblionumber - AND (biblio.title LIKE ? or biblioitems.issn = ?) - |; - if (C4::Context->preference('IndependantBranches') && - C4::Context->userenv && - C4::Context->userenv->{'flags'} != 1){ - $query.=" AND subscription.branchcode IN ('".C4::Context->userenv->{'branch'}."',\"''\")"; - } + SELECT subscription.*,biblio.title,biblioitems.issn,biblio.biblionumber + FROM subscription + LEFT JOIN biblio ON biblio.biblionumber = subscription.biblionumber + LEFT JOIN biblioitems ON biblio.biblionumber = biblioitems.biblionumber + WHERE (biblioitems.issn = ? or|. join('and ',map{"biblio.title LIKE \"%$_%\""}split (" ",$title))." )"; $query.=" ORDER BY title"; $sth = $dbh->prepare($query); - $sth->execute( "%$title%", $ISSN ); + $sth->execute( $ISSN ); } else { if ($ISSN) { my $query = qq( - SELECT subscription.subscriptionid,biblio.title,biblioitems.issn,subscription.notes,subscription.branchcode,biblio.biblionumber - FROM subscription,biblio,biblioitems - WHERE biblio.biblionumber = biblioitems.biblionumber - AND biblio.biblionumber=subscription.biblionumber - AND biblioitems.issn LIKE ? + SELECT subscription.*,biblio.title,biblioitems.issn,biblio.biblionumber + FROM subscription + LEFT JOIN biblio ON biblio.biblionumber = subscription.biblionumber + LEFT JOIN biblioitems ON biblio.biblionumber = biblioitems.biblionumber + WHERE biblioitems.issn LIKE ? ); - if (C4::Context->preference('IndependantBranches') && - C4::Context->userenv && - C4::Context->userenv->{'flags'} != 1){ - $query.=" AND subscription.branchcode IN ('".C4::Context->userenv->{'branch'}."',\"''\")"; - } $query.=" ORDER BY title"; # warn "query :$query"; $sth = $dbh->prepare($query); @@ -678,20 +678,17 @@ sub GetSubscriptions { } else { my $query = qq( - SELECT subscription.subscriptionid,biblio.title,biblioitems.issn,subscription.notes,subscription.branchcode,biblio.biblionumber - FROM subscription,biblio,biblioitems - WHERE biblio.biblionumber = biblioitems.biblionumber - AND biblio.biblionumber=subscription.biblionumber - AND biblio.title LIKE ? - ); - if (C4::Context->preference('IndependantBranches') && - C4::Context->userenv && - C4::Context->userenv->{'flags'} != 1){ - $query.=" AND subscription.branchcode IN ('".C4::Context->userenv->{'branch'}."',\"''\")"; - } + SELECT subscription.*,biblio.title,biblioitems.issn,biblio.biblionumber + FROM subscription + LEFT JOIN biblio ON biblio.biblionumber = subscription.biblionumber + LEFT JOIN biblioitems ON biblio.biblionumber = biblioitems.biblionumber + WHERE 1 + ).($title?" and ":""). join('and ',map{"biblio.title LIKE \"%$_%\""} split (" ",$title) ); + $query.=" ORDER BY title"; +# warn $query; $sth = $dbh->prepare($query); - $sth->execute( "%" . $title . "%" ); + $sth->execute; } } } @@ -709,6 +706,11 @@ sub GetSubscriptions { $odd = -$odd; $line->{toggle} = 1 if $odd == 1; } + $line->{'cannotedit'}=(C4::Context->preference('IndependantBranches') && + C4::Context->userenv && + C4::Context->userenv->{flags} !=1 && + C4::Context->userenv->{branch} && $line->{branchcode} && + (C4::Context->userenv->{branch} ne $line->{branchcode})); push @results, $line; } return @results; @@ -736,10 +738,10 @@ sub GetSerials { $count=5 unless ($count); my @serials; my $query = - "SELECT serialid,serialseq, status, publisheddate, planneddate,notes + "SELECT serialid,serialseq, status, publisheddate, planneddate,notes, routingnotes FROM serial WHERE subscriptionid = ? AND status NOT IN (2,4,5) - ORDER BY publisheddate,serialid DESC"; + ORDER BY IF(publisheddate<>'0000-00-00',publisheddate,planneddate) DESC"; my $sth = $dbh->prepare($query); $sth->execute($subscriptionid); while ( my $line = $sth->fetchrow_hashref ) { @@ -751,11 +753,11 @@ sub GetSerials { } # OK, now add the last 5 issues arrives/missing $query = - "SELECT serialid,serialseq, status, planneddate, publisheddate,notes + "SELECT serialid,serialseq, status, planneddate, publisheddate,notes, routingnotes FROM serial WHERE subscriptionid = ? AND (status in (2,4,5)) - ORDER BY publisheddate,serialid DESC + ORDER BY IF(publisheddate<>'0000-00-00',publisheddate,planneddate) DESC "; $sth = $dbh->prepare($query); $sth->execute($subscriptionid); @@ -791,7 +793,7 @@ sub GetSerials2 { my ($subscription,$status) = @_; my $dbh = C4::Context->dbh; my $query = qq| - SELECT serialid,serialseq, status, planneddate, publisheddate,notes + SELECT serialid,serialseq, status, planneddate, publisheddate,notes, routingnotes FROM serial WHERE subscriptionid=$subscription AND status IN ($status) ORDER BY publisheddate,serialid DESC @@ -934,10 +936,9 @@ sub GetNextSeq { $newlastvalue1 = $val->{lastvalue1}; $newlastvalue2 = $val->{lastvalue2}; $newlastvalue3 = $val->{lastvalue3}; - $newlastvalue1 = $val->{lastvalue1}; # check if we have to increase the new value. - $newinnerloop1 = $val->{innerloop1}+1; + $newinnerloop1 = $val->{innerloop1} + 1; $newinnerloop1=0 if ($newinnerloop1 >= $val->{every1}); $newlastvalue1 += $val->{add1} if ($newinnerloop1<1); # <1 to be true when 0 or empty. $newlastvalue1=$val->{setto1} if ($newlastvalue1>$val->{whenmorethan1}); # reset counter if needed. @@ -945,7 +946,7 @@ sub GetNextSeq { $newlastvalue2 = $val->{lastvalue2}; # check if we have to increase the new value. - $newinnerloop2 = $val->{innerloop2}+1; + $newinnerloop2 = $val->{innerloop2} + 1; $newinnerloop2=0 if ($newinnerloop2 >= $val->{every2}); $newlastvalue2 += $val->{add2} if ($newinnerloop2<1); # <1 to be true when 0 or empty. $newlastvalue2=$val->{setto2} if ($newlastvalue2>$val->{whenmorethan2}); # reset counter if needed. @@ -966,7 +967,7 @@ sub GetNextSeq { $newlastvalue3 = $val->{lastvalue3}; # check if we have to increase the new value. - $newinnerloop3 = $val->{innerloop3}+1; + $newinnerloop3 = $val->{innerloop3} + 1; $newinnerloop3=0 if ($newinnerloop3 >= $val->{every3}); $newlastvalue3 += $val->{add3} if ($newinnerloop3<1); # <1 to be true when 0 or empty. $newlastvalue3=$val->{setto3} if ($newlastvalue3>$val->{whenmorethan3}); # reset counter if needed. @@ -1035,18 +1036,12 @@ sub GetExpirationDate { my $enddate = $subscription->{startdate}; # we don't do the same test if the subscription is based on X numbers or on X weeks/months -# warn "SUBSCRIPTIONID :$subscriptionid"; -# use Data::Dumper; warn Dumper($subscription); - -# warn "dateCHECKRESERV :".$subscription->{startdate}; - if ($subscription->{periodicity}){ + if (($subscription->{periodicity} % 16) >0){ if ( $subscription->{numberlength} ) { #calculate the date of the last issue. my $length = $subscription->{numberlength}; - # warn "ENDDATE ".$enddate; for ( my $i = 1 ; $i <= $length ; $i++ ) { $enddate = GetNextDate( $enddate, $subscription ); - # warn "AFTER ENDDATE ".$enddate; } } elsif ( $subscription->{monthlength} ){ @@ -1055,20 +1050,9 @@ sub GetExpirationDate { $enddate=sprintf("%04d-%02d-%02d",$enddate[0],$enddate[1],$enddate[2]); } elsif ( $subscription->{weeklength} ){ my @date=split (/-/,$subscription->{startdate}); - # warn "dateCHECKRESERV :".$subscription->{startdate}; - #### An other way to do it - # if ( $subscription->{weeklength} ){ - # my ($weeknb,$year)=Week_of_Year(@startdate); - # $weeknb += $subscription->{weeklength}; - # my $weeknbcalc= $weeknb % 52; - # $year += int($weeknb/52); - # # warn "year : $year weeknb :$weeknb weeknbcalc $weeknbcalc"; - # @endofsubscriptiondate=Monday_of_Week($weeknbcalc,$year); - # } my @enddate = Add_Delta_Days($date[0],$date[1],$date[2],$subscription->{weeklength}*7); $enddate=sprintf("%04d-%02d-%02d",$enddate[0],$enddate[1],$enddate[2]); } - # warn "date de fin :$enddate"; return $enddate; } else { return 0; @@ -1159,7 +1143,7 @@ sub ModSerialStatus { # change status & update subscriptionhistory my $val; if ( $status eq 6 ) { - DelIssue( $serialseq, $subscriptionid ); + DelIssue( {'serialid'=>$serialid, 'subscriptionid'=>$subscriptionid,'serialseq'=>$serialseq} ); } else { my $query = @@ -1360,7 +1344,7 @@ sub NewSubscription { $lastvalue3, $innerloop3, $numberingmethod, "$status", $notes, $letter, - $firstacquidate, $irregularity, + format_date_in_iso($firstacquidate), $irregularity, $numberpattern, $callnumber, $hemisphere, $manualhistory, $internalnotes @@ -1370,13 +1354,13 @@ sub NewSubscription { my $subscriptionid = $dbh->{'mysql_insertid'}; $query = qq( INSERT INTO subscriptionhistory - (biblionumber, subscriptionid, histstartdate, enddate, missinglist, recievedlist, opacnote, librariannote) + (biblionumber, subscriptionid, histstartdate, opacnote, librariannote) VALUES (?,?,?,?,?,?,?,?) ); $sth = $dbh->prepare($query); $sth->execute( $biblionumber, $subscriptionid, format_date_in_iso($startdate), - 0, "", "", "", "$notes" ); + $notes,$internalnotes ); # reread subscription to get a hash (for calculation of the 1st issue number) $query = qq( @@ -1405,6 +1389,16 @@ sub NewSubscription { &logaction(C4::Context->userenv->{'number'},"SERIAL","ADD",$subscriptionid,"") if C4::Context->preference("SubscriptionLog"); +#set serial flag on biblio if not already set. + my ($null, ($bib)) = GetBiblio($biblionumber); + if( ! $bib->{'serial'} ) { + my $record = GetMarcBiblio($biblionumber); + my ($tag,$subf) = GetMarcFromKohaField('biblio.serial',$bib->{'frameworkcode'}); + if($tag) { + $record->field($tag)->update( $subf => 1 ); + } + ModBiblio($record,$biblionumber,$bib->{'frameworkcode'}); + } return $subscriptionid; } @@ -1428,9 +1422,9 @@ sub ReNewSubscription { my $subscription = GetSubscription($subscriptionid); my $query = qq| SELECT * - FROM biblio,biblioitems - WHERE biblio.biblionumber=biblioitems.biblionumber - AND biblio.biblionumber=? + FROM biblio + LEFT JOIN biblioitems ON biblio.biblionumber=biblioitems.biblionumber + WHERE biblio.biblionumber=? |; my $sth = $dbh->prepare($query); $sth->execute( $subscription->{biblionumber} ); @@ -1445,12 +1439,12 @@ sub ReNewSubscription { ); # renew subscription - my $query = qq| + $query = qq| UPDATE subscription SET startdate=?,numberlength=?,weeklength=?,monthlength=? WHERE subscriptionid=? |; - my $sth = $dbh->prepare($query); + $sth = $dbh->prepare($query); $sth->execute( format_date_in_iso($startdate), $numberlength, $weeklength, $monthlength, $subscriptionid ); @@ -1709,7 +1703,7 @@ sub ItemizeSerials { $marcrecord->insert_fields_ordered($newField); } } - AddItem( $marcrecord, $data->{'biblionumber'} ); + AddItemFromMarc( $marcrecord, $data->{'biblionumber'} ); return 1; } return ( 0, @errors ); @@ -1735,7 +1729,7 @@ sub HasSubscriptionExpired { my ($subscriptionid) = @_; my $dbh = C4::Context->dbh; my $subscription = GetSubscription($subscriptionid); - if ($subscription->{periodicity}>0){ + if (($subscription->{periodicity} % 16)>0){ my $expirationdate = GetExpirationDate($subscriptionid); my $query = qq| SELECT max(planneddate) @@ -1823,20 +1817,22 @@ this function delete an issue which has $serialseq and $subscriptionid given on =cut sub DelIssue { - my ( $serialseq, $subscriptionid ) = @_; + my ( $dataissue) = @_; my $dbh = C4::Context->dbh; + ### TODO Add itemdeletion. Would need to get itemnumbers. Should be in a pref ? + my $query = qq| DELETE FROM serial - WHERE serialseq= ? + WHERE serialid= ? AND subscriptionid= ? |; my $mainsth = $dbh->prepare($query); - $mainsth->execute( $serialseq, $subscriptionid ); + $mainsth->execute( $dataissue->{'serialid'}, $dataissue->{'subscriptionid'}); #Delete element from subscription history $query = "SELECT * FROM subscription WHERE subscriptionid = ?"; my $sth = $dbh->prepare($query); - $sth->execute($subscriptionid); + $sth->execute($dataissue->{'subscriptionid'}); my $val = $sth->fetchrow_hashref; unless ( $val->{manualhistory} ) { my $query = qq| @@ -1844,18 +1840,18 @@ sub DelIssue { WHERE subscriptionid= ? |; my $sth = $dbh->prepare($query); - $sth->execute($subscriptionid); + $sth->execute($dataissue->{'subscriptionid'}); my $data = $sth->fetchrow_hashref; - $data->{'missinglist'} =~ s/$serialseq//; - $data->{'recievedlist'} =~ s/$serialseq//; + my $serialseq= $dataissue->{'serialseq'}; + $data->{'missinglist'} =~ s/\b$serialseq\b//; + $data->{'recievedlist'} =~ s/\b$serialseq\b//; my $strsth = "UPDATE subscriptionhistory SET " . join( ",", map { join( "=", $_, $dbh->quote( $data->{$_} ) ) } keys %$data ) . " WHERE subscriptionid=?"; $sth = $dbh->prepare($strsth); - $sth->execute($subscriptionid); + $sth->execute($dataissue->{'subscriptionid'}); } - ### TODO Add itemdeletion. Should be in a pref ? return $mainsth->rows; } @@ -1904,7 +1900,7 @@ sub GetLateOrMissingIssues { claimdate FROM serial LEFT JOIN subscription ON serial.subscriptionid=subscription.subscriptionid -LEFT JOIN biblio ON serial.biblionumber=biblio.biblionumber +LEFT JOIN biblio ON subscription.biblionumber=biblio.biblionumber LEFT JOIN aqbooksellers ON subscription.aqbooksellerid = aqbooksellers.id WHERE subscription.subscriptionid = serial.subscriptionid AND (serial.STATUS = 4 OR ((planneddate < now() AND serial.STATUS =1) OR serial.STATUS = 3)) @@ -1929,13 +1925,12 @@ FROM serial LEFT JOIN subscription ON serial.subscriptionid=subscription.subscriptionid LEFT JOIN biblio -ON serial.biblionumber=biblio.biblionumber +ON subscription.biblionumber=biblio.biblionumber LEFT JOIN aqbooksellers ON subscription.aqbooksellerid = aqbooksellers.id WHERE subscription.subscriptionid = serial.subscriptionid AND (serial.STATUS = 4 OR ((planneddate < now() AND serial.STATUS =1) OR serial.STATUS = 3)) -AND biblio.biblionumber = subscription.biblionumber $byserial ORDER BY $order" ); @@ -2046,9 +2041,9 @@ sub getsupplierbyserialid { my $dbh = C4::Context->dbh; my $sth = $dbh->prepare( "SELECT serialid, serial.subscriptionid, aqbooksellerid - FROM serial, subscription - WHERE serial.subscriptionid = subscription.subscriptionid - AND serialid = ? + FROM serial + LEFT JOIN subscription ON serial.subscriptionid = subscription.subscriptionid + WHERE serialid = ? " ); $sth->execute($serialid); @@ -2073,9 +2068,9 @@ sub check_routing { my ($subscriptionid) = @_; my $dbh = C4::Context->dbh; my $sth = $dbh->prepare( -"SELECT count(routingid) routingids FROM subscriptionroutinglist, subscription - WHERE subscription.subscriptionid = subscriptionroutinglist.subscriptionid - AND subscription.subscriptionid = ? ORDER BY ranking ASC +"SELECT count(routingid) routingids FROM subscription LEFT JOIN subscriptionroutinglist + ON subscription.subscriptionid = subscriptionroutinglist.subscriptionid + WHERE subscription.subscriptionid = ? ORDER BY ranking ASC " ); $sth->execute($subscriptionid); @@ -2236,9 +2231,10 @@ sub getroutinglist { my $dbh = C4::Context->dbh; my $sth = $dbh->prepare( "SELECT routingid, borrowernumber, - ranking, biblionumber FROM subscriptionroutinglist, subscription - WHERE subscription.subscriptionid = subscriptionroutinglist.subscriptionid - AND subscription.subscriptionid = ? ORDER BY ranking ASC + ranking, biblionumber + FROM subscription + LEFT JOIN subscriptionroutinglist ON subscription.subscriptionid = subscriptionroutinglist.subscriptionid + WHERE subscription.subscriptionid = ? ORDER BY ranking ASC " ); $sth->execute($subscriptionid); @@ -2297,17 +2293,17 @@ sub abouttoexpire { my $dbh = C4::Context->dbh; my $subscription = GetSubscription($subscriptionid); my $per = $subscription->{'periodicity'}; - if ($per>0){ + if ($per % 16>0){ my $expirationdate = GetExpirationDate($subscriptionid); my $sth = $dbh->prepare( "select max(planneddate) from serial where subscriptionid=?"); $sth->execute($subscriptionid); my ($res) = $sth->fetchrow ; -# warn "date expiration : ".$expirationdate." date courante ".$res; +# warn "date expiration : ".$expirationdate." date courante ".$res; my @res=split /-/,$res; + @res=Date::Calc::Today if ($res[0]*$res[1]==0); my @endofsubscriptiondate=split/-/,$expirationdate; - my $per = $subscription->{'periodicity'}; my $x; if ( $per == 1 ) {$x=7;} if ( $per == 2 ) {$x=7; } @@ -2320,7 +2316,7 @@ sub abouttoexpire { if ( $per == 10 ) { $x = 365; } if ( $per == 11 ) { $x = 730; } my @datebeforeend=Add_Delta_Days( $endofsubscriptiondate[0],$endofsubscriptiondate[1],$endofsubscriptiondate[2], - - (3 * $x)) if (@endofsubscriptiondate); + - (3 * $x)) if (@endofsubscriptiondate && $endofsubscriptiondate[0]*$endofsubscriptiondate[1]*$endofsubscriptiondate[2]); # warn "DATE BEFORE END: $datebeforeend"; return 1 if ( @res && (@datebeforeend && @@ -2329,7 +2325,7 @@ sub abouttoexpire { (@endofsubscriptiondate && Delta_Days($res[0],$res[1],$res[2], $endofsubscriptiondate[0],$endofsubscriptiondate[1],$endofsubscriptiondate[2]) >= 0) ); - return 0; + return 0; } elsif ($subscription->{numberlength}>0) { return (countissuesfrom($subscriptionid,$subscription->{'startdate'}) >=$subscription->{numberlength}-1); } else {return 0} @@ -2600,69 +2596,82 @@ sub GetNextDate(@) { my @resultdate; # warn "DOW $dayofweek"; - if ( $subscription->{periodicity} == 0 ) { + if ( $subscription->{periodicity} % 16 == 0 ) { return 0; } if ( $subscription->{periodicity} == 1 ) { - my $dayofweek = Day_of_Week( $year,$month, $day ); - for ( my $i = 0 ; $i < @irreg ; $i++ ) { - $dayofweek = 0 if ( $dayofweek == 7 ); - if ( in_array( ($dayofweek + 1), @irreg ) ) { - ($year,$month,$day) = Add_Delta_Days($year,$month, $day , 1 ); - $dayofweek++; - } - } - @resultdate = Add_Delta_Days($year,$month, $day , 1 ); + my $dayofweek = eval{Day_of_Week( $year,$month, $day )}; + if ($@){warn "year month day : $year $month $day $subscription->{subscriptionid} : $@";} + else { + for ( my $i = 0 ; $i < @irreg ; $i++ ) { + $dayofweek = 0 if ( $dayofweek == 7 ); + if ( in_array( ($dayofweek + 1), @irreg ) ) { + ($year,$month,$day) = Add_Delta_Days($year,$month, $day , 1 ); + $dayofweek++; + } + } + @resultdate = Add_Delta_Days($year,$month, $day , 1 ); + } } if ( $subscription->{periodicity} == 2 ) { - my ($wkno,$year) = Week_of_Year( $year,$month, $day ); - for ( my $i = 0 ; $i < @irreg ; $i++ ) { - if ( $irreg[$i] == (($wkno!=51)?($wkno +1) % 52 :52)) { - ($year,$month,$day) = Add_Delta_Days($year,$month, $day , 7 ); - $wkno=(($wkno!=51)?($wkno +1) % 52 :52); - } - } - @resultdate = Add_Delta_Days( $year,$month, $day, 7); + my ($wkno,$year) = eval {Week_of_Year( $year,$month, $day )}; + if ($@){warn "year month day : $year $month $day $subscription->{subscriptionid} : $@";} + else { + for ( my $i = 0 ; $i < @irreg ; $i++ ) { + if ( $irreg[$i] == (($wkno!=51)?($wkno +1) % 52 :52)) { + ($year,$month,$day) = Add_Delta_Days($year,$month, $day , 7 ); + $wkno=(($wkno!=51)?($wkno +1) % 52 :52); + } + } + @resultdate = Add_Delta_Days( $year,$month, $day, 7); + } } - if ( $subscription->{periodicity} == 3 ) { - my ($wkno,$year) = Week_of_Year( $year,$month, $day ); - for ( my $i = 0 ; $i < @irreg ; $i++ ) { - if ( $irreg[$i] == (($wkno!=50)?($wkno +2) % 52 :52)) { - ### BUGFIX was previously +1 ^ - ($year,$month,$day) = Add_Delta_Days($year,$month, $day , 14 ); - $wkno=(($wkno!=50)?($wkno +2) % 52 :52); - } - } - @resultdate = Add_Delta_Days($year,$month, $day , 14 ); + if ( $subscription->{periodicity} == 3 ) { + my ($wkno,$year) = eval {Week_of_Year( $year,$month, $day )}; + if ($@){warn "year month day : $year $month $day $subscription->{subscriptionid} : $@";} + else { + for ( my $i = 0 ; $i < @irreg ; $i++ ) { + if ( $irreg[$i] == (($wkno!=50)?($wkno +2) % 52 :52)) { + ### BUGFIX was previously +1 ^ + ($year,$month,$day) = Add_Delta_Days($year,$month, $day , 14 ); + $wkno=(($wkno!=50)?($wkno +2) % 52 :52); + } + } + @resultdate = Add_Delta_Days($year,$month, $day , 14 ); + } } if ( $subscription->{periodicity} == 4 ) { - my ($wkno,$year) = Week_of_Year( $year,$month, $day ); - for ( my $i = 0 ; $i < @irreg ; $i++ ) { - if ( $irreg[$i] == (($wkno!=49)?($wkno +3) % 52 :52)) { - ($year,$month,$day) = Add_Delta_Days($year,$month, $day , 21 ); - $wkno=(($wkno!=49)?($wkno +3) % 52 :52); - } - } - @resultdate = Add_Delta_Days($year,$month, $day , 21 ); + my ($wkno,$year) = eval {Week_of_Year( $year,$month, $day )}; + if ($@){warn "année mois jour : $year $month $day $subscription->{subscriptionid} : $@";} + else { + for ( my $i = 0 ; $i < @irreg ; $i++ ) { + if ( $irreg[$i] == (($wkno!=49)?($wkno +3) % 52 :52)) { + ($year,$month,$day) = Add_Delta_Days($year,$month, $day , 21 ); + $wkno=(($wkno!=49)?($wkno +3) % 52 :52); + } + } + @resultdate = Add_Delta_Days($year,$month, $day , 21 ); + } } my $tmpmonth=$month; + if ($year && $month && $day){ if ( $subscription->{periodicity} == 5 ) { - for ( my $i = 0 ; $i < @irreg ; $i++ ) { - if ( $irreg[$i] == (($tmpmonth!=11)?($tmpmonth +1) % 12 :12)) { - ($year,$month,$day) = Add_Delta_YMD($year,$month, $day ,0,1,0 ); - $tmpmonth=(($tmpmonth!=11)?($tmpmonth +1) % 12 :12); - } - } - @resultdate = Add_Delta_YMD($year,$month, $day ,0,1,0 ); + for ( my $i = 0 ; $i < @irreg ; $i++ ) { + if ( $irreg[$i] == (($tmpmonth!=11)?($tmpmonth +1) % 12 :12)) { + ($year,$month,$day) = Add_Delta_YMD($year,$month, $day ,0,1,0 ); + $tmpmonth=(($tmpmonth!=11)?($tmpmonth +1) % 12 :12); + } + } + @resultdate = Add_Delta_YMD($year,$month, $day ,0,1,0 ); } if ( $subscription->{periodicity} == 6 ) { - for ( my $i = 0 ; $i < @irreg ; $i++ ) { - if ( $irreg[$i] == (($tmpmonth!=10)?($tmpmonth +2) % 12 :12)) { - ($year,$month,$day) = Add_Delta_YMD($year,$month, $day ,0,2,0 ); - $tmpmonth=(($tmpmonth!=10)?($tmpmonth + 2) % 12 :12); - } - } - @resultdate = Add_Delta_YMD($year,$month, $day, 0, 2,0 ); + for ( my $i = 0 ; $i < @irreg ; $i++ ) { + if ( $irreg[$i] == (($tmpmonth!=10)?($tmpmonth +2) % 12 :12)) { + ($year,$month,$day) = Add_Delta_YMD($year,$month, $day ,0,2,0 ); + $tmpmonth=(($tmpmonth!=10)?($tmpmonth + 2) % 12 :12); + } + } + @resultdate = Add_Delta_YMD($year,$month, $day, 0, 2,0 ); } if ( $subscription->{periodicity} == 7 ) { for ( my $i = 0 ; $i < @irreg ; $i++ ) { @@ -2698,7 +2707,9 @@ sub GetNextDate(@) { if ( $subscription->{periodicity} == 11 ) { @resultdate = Add_Delta_YM($year,$month, $day, 2, 0 ); } + } my $resultdate=sprintf("%04d-%02d-%02d",$resultdate[0],$resultdate[1],$resultdate[2]); + # warn "dateNEXTSEQ : ".$resultdate; return "$resultdate"; } @@ -2719,8 +2730,8 @@ sub itemdata { my ($barcode) = @_; my $dbh = C4::Context->dbh; my $sth = $dbh->prepare( - "Select * from items,biblioitems where barcode=? - and items.biblioitemnumber=biblioitems.biblioitemnumber" + "Select * from items LEFT JOIN biblioitems ON items.biblioitemnumber=biblioitems.biblioitemnumber + WHERE barcode=?" ); $sth->execute($barcode); my $data = $sth->fetchrow_hashref; @@ -2728,9 +2739,8 @@ sub itemdata { return ($data); } -END { } # module clean-up code here (global destructor) - 1; +__END__ =back