From 0c963a2d9c01e28bb2968edb4274cf5cf130293e Mon Sep 17 00:00:00 2001 From: Julian Maurice <julian.maurice@biblibre.com> Date: Thu, 12 Jul 2012 10:31:49 +0530 Subject: [PATCH 3/3] Bug 8415 - Link Serial with Acquisition To Test: 1) Create a basket. 2) Click on From a Subscription link under Add order to basket section. 3) A filter box appear on the left hand side (Search by ISSN, Title, Publisher, Supplier) 4) Search a subscription and click on order to add the order on the basket. 5) If already subscription add to the basket it shows "only one order per subscription is allowed". Signed-off-by: Amit Gupta <amit.gupta@osslabs.biz> --- C4/Serials.pm | 100 +++++++++++++++++- acqui/neworderempty.pl | 2 + acqui/newordersubscription.pl | 108 ++++++++++++++++++ installer/data/mysql/kohastructure.sql | 1 + installer/data/mysql/updatedatabase.pl | 8 ++ .../en/includes/acquisitions-add-to-basket.inc | 1 + .../prog/en/includes/subscriptions-search.inc | 61 +++++++++++ .../intranet-tmpl/prog/en/modules/acqui/basket.tt | 1 + .../prog/en/modules/acqui/neworderempty.tt | 1 + .../prog/en/modules/acqui/newordersubscription.tt | 115 ++++++++++++++++++++ 10 files changed, 397 insertions(+), 1 deletions(-) create mode 100755 acqui/newordersubscription.pl create mode 100644 koha-tmpl/intranet-tmpl/prog/en/includes/subscriptions-search.inc create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/acqui/newordersubscription.tt diff --git a/C4/Serials.pm b/C4/Serials.pm index 58b6078..283afc0 100644 --- a/C4/Serials.pm +++ b/C4/Serials.pm @@ -51,7 +51,8 @@ BEGIN { &getroutinglist &delroutingmember &addroutingmember &reorder_members &check_routing &updateClaim &removeMissingIssue - &CountIssues + &CountIssues &SearchSubscriptions + &subscriptionCurrentlyOnOrder HasItems ); @@ -150,6 +151,103 @@ sub GetLateIssues { return @issuelist; } +=head2 SearchSubscriptions + +@results = SearchSubscriptions($biblionumber, $title, $issn, $ean, $publisher, $supplier, $branch, $minold, $maxold); + +this function gets all subscriptions which have biblionumber eq $biblionumber, title like $title, ISSN like $issn, EAN like $ean, publisher like $publisher, supplier like $supplier AND branchcode eq $branch. +$minold and $maxold are values in days. It allows to get active and inactive subscription apart. + +return: +a table of hashref. Each hash containt the subscription. + +=cut + +sub SearchSubscriptions { + my ($biblionumber, $title, $issn, $ean, $publisher, $supplier, $branch, $minold, $maxold) = @_; + + my $query = qq{ + SELECT subscription.*, subscriptionhistory.*, biblio.*, biblioitems.issn, + subscription.notes AS notes + FROM subscription + LEFT JOIN subscriptionhistory USING(subscriptionid) + LEFT JOIN biblio ON biblio.biblionumber = subscription.biblionumber + LEFT JOIN biblioitems ON biblioitems.biblionumber = subscription.biblionumber + LEFT JOIN aqbooksellers ON subscription.aqbooksellerid = aqbooksellers.id + }; + my @where_strs; + my @where_args; + if($biblionumber){ + push @where_strs, "subscription.biblionumber = ?"; + push @where_args, "$biblionumber"; + } + if($title){ + push @where_strs, "biblio.title LIKE ?"; + push @where_args, "%$title%"; + } + if($issn){ + push @where_strs, "biblioitems.issn LIKE ?"; + push @where_args, "%$issn%"; + } + if($ean){ + push @where_strs, "biblioitems.ean LIKE ?"; + push @where_args, "%$ean%"; + } + if($publisher){ + push @where_strs, "biblioitems.publishercode LIKE ?"; + push @where_args, "%$publisher%"; + } + if($supplier){ + push @where_strs, "aqbooksellers.name LIKE ?"; + push @where_args, "%$supplier%"; + } + if($branch){ + push @where_strs, "subscription.branchcode = ?"; + push @where_args, "$branch"; + } + if ($minold) { + push @where_strs, "TO_DAYS(NOW()) - TO_DAYS(subscription.enddate) > ?" if ($minold); + push @where_args, "$minold" if ($minold); + } + if ($maxold) { + push @where_strs, "(TO_DAYS(NOW()) - TO_DAYS(subscription.enddate) <= ? OR subscription.enddate IS NULL OR subscription.enddate = '0000-00-00')"; + push @where_args, "$maxold"; + } + + if(@where_strs){ + $query .= " WHERE " . join(" AND ", @where_strs); + } + warn $query; + warn join(",", @where_args) if @where_args; + my $dbh = C4::Context->dbh; + my $sth = $dbh->prepare($query); + $sth->execute(@where_args); + my $results = $sth->fetchall_arrayref( {} ); + $sth->finish; + + return @$results; +} + +=head2 + $bool = subscriptionCurrentlyOnOrder( $subscriptionid ); + Return 1 if subscription is already on order + else 0 +=cut + +sub subscriptionCurrentlyOnOrder { + my ( $subscriptionid ) = @_; + my $dbh = C4::Context->dbh; + my $query = qq| + SELECT COUNT(*) FROM aqorders + WHERE subscriptionid = ? + AND datereceived IS NULL + |; + my $sth = $dbh->prepare( $query ); + $sth->execute($subscriptionid); + return $sth->fetchrow_array; +} + + =head2 GetSubscriptionHistoryFromSubscriptionId $sth = GetSubscriptionHistoryFromSubscriptionId() diff --git a/acqui/neworderempty.pl b/acqui/neworderempty.pl index a461a1b..85d9739 100755 --- a/acqui/neworderempty.pl +++ b/acqui/neworderempty.pl @@ -100,6 +100,7 @@ my $publicationyear = $input->param('publicationyear'); my $bookseller = GetBookSellerFromId($booksellerid); # FIXME: else ERROR! my $ordernumber = $input->param('ordernumber') || ''; my $biblionumber = $input->param('biblionumber'); +my $subscriptionid = $input->param('subscriptionid'); my $basketno = $input->param('basketno'); my $suggestionid = $input->param('suggestionid'); my $close = $input->param('close'); @@ -355,6 +356,7 @@ $template->param( surnamesuggestedby => $suggestion->{surnamesuggestedby}, firstnamesuggestedby => $suggestion->{firstnamesuggestedby}, biblionumber => $biblionumber, + subscriptionid => $subscriptionid, uncertainprice => $data->{'uncertainprice'}, authorisedbyname => $borrower->{'firstname'} . " " . $borrower->{'surname'}, biblioitemnumber => $data->{'biblioitemnumber'}, diff --git a/acqui/newordersubscription.pl b/acqui/newordersubscription.pl new file mode 100755 index 0000000..425aa45 --- /dev/null +++ b/acqui/newordersubscription.pl @@ -0,0 +1,108 @@ +#!/usr/bin/perl + +# Copyright 2011 BibLibre +# Copyright 2012 Nucsoft osslabs +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +use warnings; +use strict; +use CGI; +use C4::Acquisition; +use C4::Auth; +use C4::Branch; +use C4::Context; +use C4::Bookseller; +use C4::Output; +use C4::Serials; + +my $query = new CGI; +my $title = $query->param('title_filter'); +my $ISSN = $query->param('ISSN_filter'); +my $EAN = $query->param('EAN_filter'); +my $publisher = $query->param('publisher_filter'); +my $supplier = $query->param('supplier_filter'); +my $branch = $query->param('branch_filter'); +my $routing = $query->param('routing') || C4::Context->preference("RoutingSerials"); +my $searched = $query->param('searched'); +my $biblionumber = $query->param('biblionumber'); +my $basketno = $query->param('basketno'); +my $booksellerid = $query->param('booksellerid'); + +my ( $template, $loggedinuser, $cookie, $flags ) = get_template_and_user( + { + template_name => "acqui/newordersubscription.tmpl", + query => $query, + type => "intranet", + authnotrequired => 0, + flagsrequired => { acquisition => 'order_manage' }, + } +); + +my $basket = GetBasket($basketno); +$booksellerid = $basket->{booksellerid} unless $booksellerid; +my ($bookseller) = C4::Bookseller::GetBookSellerFromId( $booksellerid); + +my @subscriptions; +my $sub; +if ($searched) { + @subscriptions = SearchSubscriptions($biblionumber, $title, $ISSN, $EAN, $publisher, $supplier, $branch); +} + + +foreach $sub (@subscriptions) { + my $enddate = C4::Dates->new($$sub{'enddate'}, "iso"); + $$sub{'enddate'} = $enddate->output(); + $$sub{alreadyOnOrder} = subscriptionCurrentlyOnOrder($$sub{subscriptionid}); + + # to toggle between create or edit routing list options + if ($routing) { + $$sub{routingedit} = check_routing( $$sub{subscriptionid} ); + } +} + +my $branches = GetBranches(); +my @branches_loop; +foreach (sort keys %$branches){ + my $selected = 0; + $selected = 1 if defined $branch && $branch eq $_; + push @branches_loop, { + branchcode => $_, + branchname => $branches->{$_}->{'branchname'}, + selected => $selected, + }; +} + +$template->param( + subs_loop => \@subscriptions, + booksellerid => $booksellerid, + basketno => $basketno, + title_filter => $title, + ISSN_filter => $ISSN, + EAN_filter => $EAN, + publisher_filter => $publisher, + supplier_filter => $supplier, + branch_filter => $branch, + branches_loop => \@branches_loop, + done_searched => $searched, + routing => $routing, + booksellerid => $booksellerid, + basketno => $basket->{'basketno'}, + basketname => $basket->{'basketname'}, + booksellername => $bookseller->{'name'}, + unfolded_search => 1, +); +output_html_with_http_headers $query, $cookie, $template->output; diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql index 0dd2396..a83ca4b 100644 --- a/installer/data/mysql/kohastructure.sql +++ b/installer/data/mysql/kohastructure.sql @@ -2770,6 +2770,7 @@ CREATE TABLE `aqorders` ( `uncertainprice` tinyint(1), `claims_count` int(11) default 0, `claimed_date` date default NULL, + `subscriptionid` int(11) default NULL, PRIMARY KEY (`ordernumber`), KEY `basketno` (`basketno`), KEY `biblionumber` (`biblionumber`), diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl index 2e67daa..ae9ca76 100755 --- a/installer/data/mysql/updatedatabase.pl +++ b/installer/data/mysql/updatedatabase.pl @@ -5536,6 +5536,7 @@ if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) { SetVersion($DBversion); } +<<<<<<< HEAD $DBversion = "3.09.00.027"; if (C4::Context->preference("Version") < TransformToNum($DBversion)) { $dbh->do(" @@ -5596,6 +5597,13 @@ if (C4::Context->preference("Version") < TransformToNum($DBversion)) { } +$DBversion = "3.09.00.XXX"; +if (C4::Context->preference("Version") < TransformToNum($DBversion)) { + $dbh->do("ALTER TABLE `aqorders` ADD `subscriptionid` int(11) default NULL"); + print "Upgrade to $DBversion done (Alter table aqorders done)\n"; + SetVersion ($DBversion); +} + =head1 FUNCTIONS =head2 TableExists($table) diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/acquisitions-add-to-basket.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/acquisitions-add-to-basket.inc index c36698d..0391df7 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/acquisitions-add-to-basket.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/acquisitions-add-to-basket.inc @@ -6,6 +6,7 @@ <input type="hidden" name="basketno" value="[% basketno %]" /> <ul><li><label for="q">From an existing record: </label><input id="q" type="text" size="25" name="q" /> <input type="submit" class="submit" value="Search" /></li> + <li><a href="/cgi-bin/koha/acqui/newordersubscription.pl?booksellerid=[% booksellerid %]&basketno=[% basketno %]">From a Subscription</a></li> <li><a href="/cgi-bin/koha/acqui/newordersuggestion.pl?booksellerid=[% booksellerid %]&basketno=[% basketno %]">From a suggestion</a></li> <li><a href="/cgi-bin/koha/acqui/neworderempty.pl?booksellerid=[% booksellerid %]&basketno=[% basketno %]">From a new (empty) record</a></li> <li><a href="/cgi-bin/koha/acqui/z3950_search.pl?booksellerid=[% booksellerid %]&basketno=[% basketno %]">From an external source</a></li> diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/subscriptions-search.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/subscriptions-search.inc new file mode 100644 index 0000000..c61fbc7 --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/subscriptions-search.inc @@ -0,0 +1,61 @@ + +<div id="advsearch"> + <form action="[% searchform_action %]" method="get"> + <fieldset class="brief"> + [% IF ( unfolded_search ) %] + <div> + [% ELSE %] + <a id="unfold_advsearch" style="cursor:pointer" onclick="$('#advsearch_form').slideToggle(400);">Advanced search</a> + <div id="advsearch_form" style="display:none"> + [% END %] + <ol> + <li> + <label for="issn">ISSN:</label> + <input type="text" id="issn" name="ISSN_filter" value="[% ISSN_filter %]" /> + </li> + <li> + <label for="title">Title:</label> + <input type="text" id="title" name="title_filter" value="[% title_filter %]" /> + </li> + <li> + <label for="ean">EAN:</label> + <input type="text" id="ean" name="EAN_filter" value="[% EAN_filter %]" /> + </li> + <li> + <label for="publisher">Publisher:</label> + <input type="text" id="publisher" name="publisher_filter" value="[% publisher_filter %]" /> + </li> + <li> + <label for="supplier">Supplier:</label> + <input type="text" id="supplier" name="supplier_filter" value="[% supplier_filter %]" /> + </li> + <li> + <label for="branch">Branch:</label> + <select id="branch" name="branch_filter"> + <option value="">All</option> + [% FOREACH branches_loo IN branches_loop %] + [% IF ( branches_loo.selected ) %] + <option selected="selected" value="[% branches_loo.branchcode %]">[% branches_loo.branchname %]</option> + [% ELSE %] + <option value="[% branches_loo.branchcode %]">[% branches_loo.branchname %]</option> + [% END %] + [% END %] + </select> + </li> + </ol> + <input type="hidden" name="searched" value="1" /> + <input type="hidden" name="advsearched" value="1" /> + [% IF ( booksellerid ) %] + <input type="hidden" name="booksellerid" value="[% booksellerid %]" /> + [% END %] + [% IF ( basketno ) %] + <input type="hidden" name="basketno" value="[% basketno %]" /> + [% END %] + <fieldset class="action"> + <input type="submit" value="Search" /> + </fieldset> + </div> + </fieldset> + </form> +</div> + diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basket.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basket.tt index dcd6ccb..c8c9a20 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basket.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basket.tt @@ -311,6 +311,7 @@ [% ELSE %] [<a href="/cgi-bin/koha/acqui/modordernotes.pl?ordernumber=[% books_loo.ordernumber %]">Add note</a>] [% END %] + [% IF books_loo.subscriptionid %]<a href="/cgi-bin/koha/serials/subscription-detail.pl?subscriptionid=[% books_loo.subscriptionid %]">Subscription Details</a>[% END %] </p> </td> <td class="number [% IF books_loo.rrp.search('^0') %]error[% END %]">[% books_loo.rrp %]</td> diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/neworderempty.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/neworderempty.tt index 566318f..fd1a93f 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/neworderempty.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/neworderempty.tt @@ -221,6 +221,7 @@ $(document).ready(function() <input type="hidden" name="basketno" value="[% basketno %]" /> <input type="hidden" name="booksellerid" value="[% booksellerid %]" /> <input type="hidden" name="biblionumber" value="[% biblionumber %]" /> + <input type="hidden" name="subscriptionid" value="[% subscriptionid %]" /> <input type="hidden" name="biblioitemnumber" value="[% biblioitemnumber %]" /> <input type="hidden" name="discount" value="[% discount %]" /> <input type="hidden" name="listinc" value="[% listincgst %]" /> diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/newordersubscription.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/newordersubscription.tt new file mode 100644 index 0000000..0046d43 --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/newordersubscription.tt @@ -0,0 +1,115 @@ +[% INCLUDE 'doc-head-open.inc' %] +<title>Koha › Serials [% biblionumber %]</title> +[% INCLUDE 'doc-head-close.inc' %] +<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.tablesorter.min.js"></script> +<script type="text/javascript"> +//<![CDATA[ + function updateRowsVisibility(show_only_renewed) { + if ( show_only_renewed ) { + $("#srlt [data-reneweddate='']").hide(); + } else { + $("#srlt > tbody > tr").show(); + } + $("#srlt").trigger("sorton", [$("#srlt")[0].config.sortList]); + } + $(document).ready(function() { + $("#srlt").tablesorter({ + widgets : ['zebra'], + headers: { + 2: { sorter: false }, + 6: { sorter: false }, + 7: { sorter: false } + } + }); + + $("#show_only_renewed").click(function(){ + updateRowsVisibility($(this+":checked").val()); + }); + $("#show_only_renewed").attr('checked', false); + updateRowsVisibility(false); + }); + //]]> +</script> +</head> +<body> +[% INCLUDE 'header.inc' %] +[% INCLUDE 'acquisitions-search.inc' %] + +<div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> › <a href="/cgi-bin/koha/acqui/acqui-home.pl">Acquisitions</a> › <a href="/cgi-bin/koha/acqui/supplier.pl?supplierid=[% supplierid %]">[% booksellername %]</a> › <a href="/cgi-bin/koha/acqui/basket.pl?basketno=[% basketno %]">Shopping Basket [% basketno %]</a> › Add order from a subscription</div> + +<div id="doc3" class="yui-t2"> + <div id="bd"> + <div id="yui-main"> + <div class="yui-b"> + <h2>Serials subscriptions</h2> + [% IF ( routing ) %] + <h3>Search for Serial Routing List</h3> + [% END %] + [% IF ( done_searched ) %] + <label for="show_only_renewed"> + <input type="checkbox" style="vertical-align: middle;" id="show_only_renewed" /> + Show only renewed + </label> + [% IF ( subs_loop ) %] + <table id="srlt"> + <thead> + <tr> + <th>Id</th> + <th>ISSN</th> + <th>Title</th> + <th> Notes </th> + <th>Library</th> + <th>Call number</th> + <th>Expiration date</th> + <th></th> + </tr> + </thead> + <tbody> + [% FOREACH subs_loo IN subs_loop %] + <tr data-reneweddate="[% subs_loo.reneweddate %]" > + <td>[% subs_loo.subscriptionid %]</td> + <td>[% subs_loo.issn %]</td> + <td><a href="/cgi-bin/koha/serials/subscription-detail.pl?subscriptionid=[% subs_loo.subscriptionid %]" class="button" title="subscription detail">[% IF ( subs_loo.title ) %][% subs_loo.title |html %][% ELSE %] + --- + [% END %][% IF ( subs_loo.unititle ) %], [% subs_loo.unititle %][% END %]</a> + </td> + <td>[% subs_loo.notes %] + [% IF ( subs_loo.internalnotes ) %]([% subs_loo.internalnotes %])[% END %] + </td> + <td> + [% IF ( subs_loo.branchcode ) %][% subs_loo.branchcode %][% END %] + </td> + <td> + [% IF ( subs_loo.callnumber ) %][% subs_loo.callnumber %][% END %] + </td> + <td> + [% IF ( subs_loo.enddate ) %][% subs_loo.enddate %][% END %] + </td> + <td> + [% IF ( subs_loo.alreadyOnOrder ) %] + Outstanding order (only one order per subscription is allowed) + [% ELSE %] + <a href="/cgi-bin/koha/acqui/neworderempty.pl?booksellerid=[% booksellerid %]&basketno=[% basketno %]&biblionumber=[% subs_loo.biblionumber %]&subscriptionid=[% subs_loo.subscriptionid %]" title="Order this one"> + Order + </a> + [% END %] + </td> + </tr> + [% END %] + </tbody> + </table> + [% ELSE %] + <p>Sorry, there is no result for your search.</p> + [% END %] + [% ELSE %] + <p>Please fill in the form to the left to make a search.</p> + [% END %] + </div> + </div> + + <div class="yui-b"> + [% INCLUDE 'subscriptions-search.inc' %] + [% INCLUDE 'acquisitions-menu.inc' %] + </div> +</div> +[% INCLUDE 'intranet-bottom.inc' %] -- 1.6.4.2