From 5d0d278de67ccce8e523f52e18f29119537c8cae 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 | 66 +++++++++++++++++++++- serials/serials-search.pl | 17 ++++++ 4 files changed, 110 insertions(+), 7 deletions(-) diff --git a/C4/Serials.pm b/C4/Serials.pm index d24fa04..312b329 100644 --- a/C4/Serials.pm +++ b/C4/Serials.pm @@ -668,7 +668,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.*, @@ -682,13 +692,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); @@ -737,19 +749,30 @@ 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 ); $subscription->{cannotdisplay} = not can_show_subscription( $subscription ); + + 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 561e032..47d4adf 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 @@ -28,6 +28,7 @@ } ) ); var csrlt = $("#csrlt").dataTable($.extend(true, {}, dataTablesDefaults, { + // FIXME sort function of additional_fields! "aoColumnDefs": [ { "aTargets": [ -1, -2 ], "bSortable": false, "bSearchable": false }, ], @@ -125,6 +126,21 @@ + [% FOR field IN additional_fields_for_subscription %] +
  • + + [% IF field.authorised_value_choices %] + + [% ELSE %] + + [% END %] +
  • + [% END %]
    @@ -153,6 +169,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 %] @@ -169,6 +188,9 @@ + [% FOR field IN additional_fields_for_subscription %] + + [% END %] [% IF ( routing && CAN_user_serials_routing ) %][% END %] @@ -203,6 +225,15 @@ [% 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 ) %] @@ -217,8 +248,6 @@ [% END %] [% END %] - Issue history - [% IF ( CAN_user_serials_receive_serials ) %] Serial receive @@ -238,6 +267,7 @@
    [% IF closedsubscriptions %] + @@ -246,6 +276,9 @@ + [% FOR field IN additional_fields_for_subscription %] + + [% END %] @@ -258,6 +291,9 @@ + [% FOR field IN additional_fields_for_subscription %] + + [% END %] @@ -287,6 +323,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 @@ -385,6 +428,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 b8a4007..96437f4 100755 --- a/serials/serials-search.pl +++ b/serials/serials-search.pl @@ -33,8 +33,10 @@ use CGI qw ( -utf8 ); 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"))) ); -- 2.0.0.rc2