From 26a094e5716b22b5d33435dd643386adb8f58275 Mon Sep 17 00:00:00 2001 From: Jonathan Druart Date: Thu, 29 Aug 2013 13:58:34 +0200 Subject: [PATCH] Bug 10855: Search subscriptions by additional fields Now you will abble to search subscriptions by additional fields. The additional field values will be displayed in the table results. Test plan: - go on the subscriptions advanced search page (serials/serials-search.pl). - verify all searchable additional fields are displayed on the form. - combine 1 or more values and verify results are consistent. - verify the values are displayed in new columns of the table. - for field linked to an authorised value category, the description is displayed (not the code). --- C4/Serials.pm | 33 ++++++++-- .../prog/en/includes/serials-menu.inc | 1 + .../prog/en/modules/serials/serials-search.tt | 67 +++++++++++++++++++- serials/serials-search.pl | 17 +++++ 4 files changed, 111 insertions(+), 7 deletions(-) diff --git a/C4/Serials.pm b/C4/Serials.pm index e58aaec..47519b1 100644 --- a/C4/Serials.pm +++ b/C4/Serials.pm @@ -665,7 +665,17 @@ subscription expiration date. sub SearchSubscriptions { my ( $args ) = @_; - my $query = qq{ + 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 => $args->{additional_fields}, + tablename => 'subscription', + }); + return () unless @$matching_record_ids_for_additional_fields; + } + + my $query = q| SELECT subscription.notes AS publicnotes, subscription.*, @@ -679,13 +689,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); @@ -734,15 +746,20 @@ 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 ) + . ')'; } 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 ); @@ -750,6 +767,12 @@ sub SearchSubscriptions { ( C4::Context->preference("IndependentBranches") && C4::Context->userenv && $subscription->{branchcode} ne C4::Context->userenv->{'branch'} ) ? 1 : 0; + + my $additional_field_values = Koha::AdditionalField->fetch_all_values({ + record_id => $subscription->{subscriptionid}, + tablename => 'subscription' + }); + $subscription->{addition_fields} = $additional_field_values->{$subscription->{subscriptionid}}; } return @$results; diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/serials-menu.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/serials-menu.inc index b6c4b32..21dff3a 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/serials-menu.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/serials-menu.inc @@ -30,4 +30,5 @@ Manage numbering patterns +
  • Add subscription fields
  • diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/serials/serials-search.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/serials/serials-search.tt index f570669..ee2fc74 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/serials/serials-search.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/serials/serials-search.tt @@ -17,6 +17,7 @@ [% END %] var osrlt = $("#osrlt").dataTable($.extend(true, {}, dataTablesDefaults, { + // FIXME sort function of additional_fields! "aoColumnDefs": [ { "aTargets": [ -1, -2, -3 ], "bSortable": false, "bSearchable": false }, ], @@ -24,6 +25,7 @@ } ) ); var csrlt = $("#csrlt").dataTable($.extend(true, {}, dataTablesDefaults, { + // FIXME sort function of additional_fields! "aoColumnDefs": [ { "aTargets": [ -1, -2 ], "bSortable": false, "bSearchable": false }, ], @@ -118,6 +120,21 @@ + [% FOR field IN additional_fields_for_subscription %] +
  • + + [% IF field.authorised_value_choices %] + + [% ELSE %] + + [% END %] +
  • + [% END %]
    @@ -146,6 +163,9 @@ Location Call number Expiration date + [% FOR field IN additional_fields_for_subscription %] + [% field.name %] + [% END %] [% IF ( routing && CAN_user_serials_routing ) %] Routing list [% END %] @@ -162,6 +182,9 @@ + [% FOR field IN additional_fields_for_subscription %] + + [% END %] [% IF ( routing && CAN_user_serials_routing ) %][% END %] @@ -192,6 +215,15 @@ [% IF ( subscription.enddate ) %][% subscription.enddate | $KohaDates %][% END %] + [% FOR field IN additional_fields_for_subscription %] + [% IF field.authorised_value_category %] + [% AuthorisedValues.GetByCode( field.authorised_value_category, subscription.additional_fields.${field.name} ) %] + [% ELSE %] + [% subscription.additional_fields.${field.name} %] + [% END %] + [% END %] + Issue history + [% IF ( routing && CAN_user_serials_routing ) %] [% IF ( subscription.cannotedit ) %] @@ -206,8 +238,6 @@ [% END %] [% END %] - Issue history - [% IF ( CAN_user_serials_receive_serials ) %] Serial receive @@ -227,6 +257,7 @@
    [% IF closedsubscriptions %] + @@ -235,6 +266,9 @@ + [% FOR field IN additional_fields_for_subscription %] + + [% END %] @@ -247,6 +281,9 @@ + [% FOR field IN additional_fields_for_subscription %] + + [% END %] @@ -276,6 +313,13 @@ + [% FOR field IN additional_fields_for_subscription %] + [% IF field.authorised_value_category %] + + [% ELSE %] + + [% END %] + [% END %]
    ISSNLibrary Location Call number[% field.name %]   
    [% IF ( subscription.callnumber ) %][% subscription.callnumber %][% END %] [% KohaAuthorisedValues.GetByCode( field.authorised_value_category, subscription.additional_fields.${field.name} ) %][% subscription.additional_fields.${field.name} %] [% UNLESS subscription.cannotedit %] Reopen @@ -374,6 +418,25 @@ + [% FOR field IN additional_fields_for_subscription %] +
  • + + [% IF field.authorised_value_choices %] + + [% ELSE %] + + [% END %] +
  • + [% END %]
    diff --git a/serials/serials-search.pl b/serials/serials-search.pl index b4e7715..199eee2 100755 --- a/serials/serials-search.pl +++ b/serials/serials-search.pl @@ -33,8 +33,10 @@ use CGI; use C4::Auth; use C4::Branch; use C4::Context; +use C4::Koha qw( GetAuthorisedValues ); use C4::Output; use C4::Serials; +use Koha::AdditionalField; use Koha::DateUtils; @@ -75,6 +77,18 @@ if ( $op and $op eq "close" ) { } } + +my $additional_fields = Koha::AdditionalField->all( { table => 'subscription', searchable => 1 } ); +my $additional_field_filters; +for my $field ( @$additional_fields ) { + if ( my $filter_value = $query->param('additional_field_' . $field->{name} . '_filter') ) { + $additional_field_filters->{ $field->{name} } = $filter_value; + } + if ( $field->{authorised_value_category} ) { + $field->{authorised_value_choices} = GetAuthorisedValues( $field->{authorised_value_category} ); + } +} + my $expiration_date_dt = $expiration_date ? dt_from_string( $expiration_date ) : undef; my @subscriptions; if ($searched){ @@ -88,6 +102,7 @@ if ($searched){ publisher => $publisher, bookseller => $bookseller, branch => $branch, + additional_fields => [ map{ { name => $_, value => $additional_field_filters->{$_}} } keys %$additional_field_filters ], location => $location, expiration_date => $expiration_date_dt, } @@ -141,6 +156,8 @@ $template->param( branches_loop => \@branches_loop, done_searched => $searched, routing => $routing, + additional_field_filters => $additional_field_filters, + additional_fields_for_subscription => $additional_fields, marcflavour => (uc(C4::Context->preference("marcflavour"))) ); -- 1.7.10.4