View | Details | Raw Unified | Return to bug 15774
Collapse All | Expand All

(-)a/C4/Acquisition.pm (+12 lines)
Lines 2172-2177 sub GetHistory { Link Here
2172
    my $ordernumber = $params{ordernumber};
2172
    my $ordernumber = $params{ordernumber};
2173
    my $search_children_too = $params{search_children_too} || 0;
2173
    my $search_children_too = $params{search_children_too} || 0;
2174
    my $created_by = $params{created_by} || [];
2174
    my $created_by = $params{created_by} || [];
2175
    my $additional_fields = $params{additional_fields} // [];
2175
2176
2176
    my @order_loop;
2177
    my @order_loop;
2177
    my $total_qty         = 0;
2178
    my $total_qty         = 0;
Lines 2313-2318 sub GetHistory { Link Here
2313
        push @query_params, @$created_by;
2314
        push @query_params, @$created_by;
2314
    }
2315
    }
2315
2316
2317
    if ( @$additional_fields ) {
2318
        my $matching_record_ids_for_additional_fields = Koha::AdditionalField->get_matching_record_ids( {
2319
            fields => $additional_fields,
2320
            tablename => 'aqbasket',
2321
            exact_match => 0,
2322
        } );
2323
        return [] unless @$matching_record_ids_for_additional_fields;
2324
2325
        # No parameterization because record IDs come directly from DB
2326
        $query .= ' AND aqbasket.basketno IN ( ' . join( ',', @$matching_record_ids_for_additional_fields ) . ' )';
2327
    }
2316
2328
2317
    if ( C4::Context->preference("IndependentBranches") ) {
2329
    if ( C4::Context->preference("IndependentBranches") ) {
2318
        unless ( C4::Context->IsSuperLibrarian() ) {
2330
        unless ( C4::Context->IsSuperLibrarian() ) {
(-)a/Koha/AdditionalField.pm (+98 lines)
Lines 265-270 sub get_matching_record_ids { Link Here
265
    ]
265
    ]
266
}
266
}
267
267
268
sub update_fields_from_query {
269
    my ( $class, $args ) = @_;
270
    die "BAD CALL: Don't use update_fields_from_query as an instance method"
271
        if ref $class and UNIVERSAL::can($class,'can');
272
273
    my $query = $args->{query};
274
    my $additional_fields = Koha::AdditionalField->all( { tablename => $args->{tablename} } );
275
    for my $field ( @$additional_fields ) {
276
        my $af = Koha::AdditionalField->new({ id => $field->{id} })->fetch;
277
        if ( $af->{marcfield} ) {
278
            my ( $field, $subfield ) = split /\$/, $af->{marcfield};
279
            $af->{values} = undef;
280
            if ( $args->{marc_record} and $field and $subfield ) {
281
                my $value = $args->{marc_record}->subfield( $field, $subfield );
282
                $af->{values} = {
283
                    $args->{record_id} => $value
284
                };
285
            }
286
        } else {
287
            $af->{values} = {
288
                $args->{record_id} => $query->param( 'additional_field_' . $field->{id} )
289
            } if defined $query->param( 'additional_field_' . $field->{id} );
290
        }
291
        $af->insert_values;
292
    }
293
}
294
295
sub get_filters_from_query {
296
    my ( $class, $args ) = @_;
297
    die "BAD CALL: Don't use get_filters_from_query as an instance method"
298
        if ref $class and UNIVERSAL::can($class,'can');
299
300
    my $query = $args->{query};
301
    my $additional_fields = Koha::AdditionalField->all( { tablename => $args->{tablename}, searchable => 1 } );
302
    my @additional_field_filters;
303
    for my $field ( @$additional_fields ) {
304
        my $filter_value = $query->param( 'additional_field_' . $field->{id} );
305
        if ( defined $filter_value and $filter_value ne q|| ) {
306
            push @additional_field_filters, {
307
                name => $field->{name},
308
                value => $filter_value,
309
                authorised_value_category => $field->{authorised_value_category},
310
            };
311
        }
312
    }
313
314
    return \@additional_field_filters;
315
}
316
317
sub get_filters_as_values {
318
    my ( $class, $filters ) = @_;
319
    die "BAD CALL: Don't use get_filters_as_values as an instance method"
320
        if ref $class and UNIVERSAL::can($class,'can');
321
322
    return { map { $_->{name} => $_->{value} } @$filters };
323
}
324
268
1;
325
1;
269
326
270
__END__
327
__END__
Lines 414-419 This is a static method. Link Here
414
        }
471
        }
415
    );
472
    );
416
473
474
=head2 update_fields_from_query
475
476
Updates fields based on user input (best paired with additional-fields-entry.pl) and optionally a MARC record.
477
478
This is a static method.
479
480
    Koha::AdditionalField->update_fields_from_query( {
481
        tablename => 'aqbasket',
482
        input => $input,
483
        record_id => $basketno,
484
        marc_record => GetBiblio( $biblionumber ),
485
    } );
486
487
=head2 get_filters_from_query
488
489
Extracts a list of search filters from user input, to be used with C<get_matching_record_ids> and
490
C<get_filters_as_values>.
491
492
This is a static method.
493
494
    my $filters = Koha::AdditionalField->get_filters_from_query( {
495
        tablename => 'aqbasket',
496
        input => $input,
497
    } );
498
499
=head2 get_filters_as_values
500
501
Transforms the result of C<get_filters_from_query> into a hashref of C<name> => C<value>, so
502
user-entered filters can be redisplayed.
503
504
    $template->param(
505
        additional_field_values => Koha::AdditionalField->get_filters_as_values(
506
            $filters
507
        ),
508
    );
509
510
    [% INCLUDE 'additional-field-entry.inc'
511
        values=additional_field_values
512
        available=available_additional_fields
513
    %]
514
417
=head1 AUTHOR
515
=head1 AUTHOR
418
516
419
Jonathan Druart <jonathan.druart at biblibre.com>
517
Jonathan Druart <jonathan.druart at biblibre.com>
(-)a/acqui/basket.pl (+7 lines)
Lines 39-44 use Date::Calc qw/Add_Delta_Days/; Link Here
39
use Koha::Database;
39
use Koha::Database;
40
use Koha::EDI qw( create_edi_order get_edifact_ean );
40
use Koha::EDI qw( create_edi_order get_edifact_ean );
41
41
42
use Koha::AdditionalField;
43
42
=head1 NAME
44
=head1 NAME
43
45
44
basket.pl
46
basket.pl
Lines 407-412 elsif ( $op eq 'ediorder' ) { Link Here
407
        unclosable           => @orders ? $basket->{is_standing} : 1,
409
        unclosable           => @orders ? $basket->{is_standing} : 1,
408
        has_budgets          => $has_budgets,
410
        has_budgets          => $has_budgets,
409
        duplinbatch          => $duplinbatch,
411
        duplinbatch          => $duplinbatch,
412
        available_additional_fields => Koha::AdditionalField->all( { tablename => 'aqbasket' } ),
413
        additional_field_values => Koha::AdditionalField->fetch_all_values( {
414
            tablename => 'aqbasket',
415
            record_id => $basketno,
416
        } )->{$basketno},
410
    );
417
    );
411
}
418
}
412
419
(-)a/acqui/basketheader.pl (+16 lines)
Lines 56-61 use C4::Acquisition qw/GetBasket NewBasket ModBasketHeader/; Link Here
56
use C4::Contract qw/GetContracts/;
56
use C4::Contract qw/GetContracts/;
57
57
58
use Koha::Acquisition::Bookseller;
58
use Koha::Acquisition::Bookseller;
59
use Koha::AdditionalField;
59
60
60
my $input = new CGI;
61
my $input = new CGI;
61
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
62
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
Lines 77-82 my $basket; Link Here
77
my $op = $input ->param('op');
78
my $op = $input ->param('op');
78
my $is_an_edit= $input ->param('is_an_edit');
79
my $is_an_edit= $input ->param('is_an_edit');
79
80
81
$template->param( available_additional_fields => scalar Koha::AdditionalField->all( { tablename => 'aqbasket' } ) );
82
80
if ( $op eq 'add_form' ) {
83
if ( $op eq 'add_form' ) {
81
    my @contractloop;
84
    my @contractloop;
82
    if ( $basketno ) {
85
    if ( $basketno ) {
Lines 97-102 if ( $op eq 'add_form' ) { Link Here
97
            }
100
            }
98
        }
101
        }
99
        $template->param( is_an_edit => 1);
102
        $template->param( is_an_edit => 1);
103
        $template->param(
104
            additional_field_values => Koha::AdditionalField->fetch_all_values( {
105
                tablename => 'aqbasket',
106
                record_id => $basketno,
107
            } )->{$basketno},
108
        );
100
    } else {
109
    } else {
101
    #new basket
110
    #new basket
102
        my $basket;
111
        my $basket;
Lines 164-169 if ( $op eq 'add_form' ) { Link Here
164
            $input->param('is_standing') ? 1 : undef,
173
            $input->param('is_standing') ? 1 : undef,
165
        );
174
        );
166
    }
175
    }
176
177
    Koha::AdditionalField->update_fields_from_query( {
178
        tablename => 'aqbasket',
179
        record_id => $basketno,
180
        query => $input,
181
    } );
182
167
    print $input->redirect('basket.pl?basketno='.$basketno);
183
    print $input->redirect('basket.pl?basketno='.$basketno);
168
    exit 0;
184
    exit 0;
169
}
185
}
(-)a/acqui/histsearch.pl (+9 lines)
Lines 58-63 use C4::Acquisition; Link Here
58
use C4::Debug;
58
use C4::Debug;
59
use C4::Branch;
59
use C4::Branch;
60
use C4::Koha;
60
use C4::Koha;
61
use Koha::AdditionalField;
61
use Koha::DateUtils;
62
use Koha::DateUtils;
62
63
63
my $input = new CGI;
64
my $input = new CGI;
Lines 95-100 my ( $template, $loggedinuser, $cookie ) = get_template_and_user( Link Here
95
    }
96
    }
96
);
97
);
97
98
99
$template->param( available_additional_fields => scalar Koha::AdditionalField->all( { tablename => 'aqbasket', searchable => 1 } ) );
100
my $additional_field_filters = Koha::AdditionalField->get_filters_from_query( {
101
    tablename => 'aqbasket',
102
    query => $input,
103
} );
104
98
my $order_loop;
105
my $order_loop;
99
# If we're supplied any value then we do a search. Otherwise we don't.
106
# If we're supplied any value then we do a search. Otherwise we don't.
100
if ($do_search) {
107
if ($do_search) {
Lines 114-119 if ($do_search) { Link Here
114
        ordernumber => $ordernumber,
121
        ordernumber => $ordernumber,
115
        search_children_too => $search_children_too,
122
        search_children_too => $search_children_too,
116
        created_by => \@created_by,
123
        created_by => \@created_by,
124
        additional_fields => $additional_field_filters,
117
    );
125
    );
118
}
126
}
119
127
Lines 146-151 $template->param( Link Here
146
    budget_id               => $budget,
154
    budget_id               => $budget,
147
    bp_loop                 => $bp_loop,
155
    bp_loop                 => $bp_loop,
148
    search_done             => $do_search,
156
    search_done             => $do_search,
157
    additional_field_filters => Koha::AdditionalField->get_filters_as_values( $additional_field_filters ),
149
    debug                   => $debug || $input->param('debug') || 0,
158
    debug                   => $debug || $input->param('debug') || 0,
150
    uc(C4::Context->preference("marcflavour")) => 1
159
    uc(C4::Context->preference("marcflavour")) => 1
151
);
160
);
(-)a/serials/add_fields.pl (-5 / +9 lines)
Lines 27-42 my $input = new CGI; Link Here
27
27
28
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
28
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
29
    {
29
    {
30
        template_name   => "serials/add_fields.tt",
30
        template_name   => "admin/additional-fields.tt",
31
        query           => $input,
31
        query           => $input,
32
        type            => "intranet",
32
        type            => "intranet",
33
        authnotrequired => 0,
33
        authnotrequired => 0,
34
        flagsrequired   => { serials => '*' },
34
        flagsrequired   => { parameters => 1 },
35
        debug           => 1,
35
        debug           => 1,
36
    }
36
    }
37
);
37
);
38
38
39
my $op = $input->param('op') // 'list';
39
my $tablename = $input->param('tablename');
40
my $op = $input->param('op') // ( $tablename ? 'list' : 'list_tables' );
40
my $field_id = $input->param('field_id');
41
my $field_id = $input->param('field_id');
41
my @messages;
42
my @messages;
42
43
Lines 65-71 if ( $op eq 'add' ) { Link Here
65
        my $inserted = 0;
66
        my $inserted = 0;
66
        eval {
67
        eval {
67
            my $af = Koha::AdditionalField->new({
68
            my $af = Koha::AdditionalField->new({
68
                tablename => 'subscription',
69
                tablename => $tablename,
69
                name => $name,
70
                name => $name,
70
                authorised_value_category => $authorised_value_category,
71
                authorised_value_category => $authorised_value_category,
71
                marcfield => $marcfield,
72
                marcfield => $marcfield,
Lines 107-112 if ( $op eq 'add_form' ) { Link Here
107
        $field = Koha::AdditionalField->new( { id => $field_id } )->fetch;
108
        $field = Koha::AdditionalField->new( { id => $field_id } )->fetch;
108
    }
109
    }
109
110
111
    $tablename = $field->{tablename};
112
110
    $template->param(
113
    $template->param(
111
        field => $field,
114
        field => $field,
112
        categories => $categories,
115
        categories => $categories,
Lines 114-125 if ( $op eq 'add_form' ) { Link Here
114
}
117
}
115
118
116
if ( $op eq 'list' ) {
119
if ( $op eq 'list' ) {
117
    my $fields = Koha::AdditionalField->all( { tablename => 'subscription' } );
120
    my $fields = Koha::AdditionalField->all( { tablename => $tablename } );
118
    $template->param( fields => $fields );
121
    $template->param( fields => $fields );
119
}
122
}
120
123
121
$template->param(
124
$template->param(
122
    op => $op,
125
    op => $op,
126
    tablename => $tablename,
123
    messages => \@messages,
127
    messages => \@messages,
124
);
128
);
125
129
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/additional-fields-display.inc (+11 lines)
Line 0 Link Here
1
[% USE AuthorisedValues %]
2
[% FOR field IN available %]
3
    <li>
4
        <span class="label"> [% field.name %]: </span>
5
        [% IF field.authorised_value_category %]
6
            [% AuthorisedValues.GetByCode( field.authorised_value_category, values.${field.name} ) %]
7
        [% ELSE %]
8
            [% values.${field.name} %]
9
        [% END %]
10
    </li>
11
[% END %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/additional-fields-entry.inc (+33 lines)
Line 0 Link Here
1
[% USE AuthorisedValues %]
2
[% IF wrap_fieldset != 0 %]
3
<fieldset class="rows">
4
    <legend>Additional fields</legend>
5
    <ol>
6
[% END %]
7
        [% FOR field IN available %]
8
            <li>
9
                <label for="additional_field_[% field.id %]"> [% field.name %]: </label>
10
                [% IF field.authorised_value_category %]
11
                    <select name="additional_field_[% field.id %]" id="additional_field_[% field.id %]">
12
                        [% FOREACH av IN AuthorisedValues.Get( field.authorised_value_category, values.${field.name} ) %]
13
                            [% IF av.selected %]
14
                                <option value="[% av.authorised_value %]" selected="selected">[% av.lib %]</option>
15
                            [% ELSE %]
16
                                <option value="[% av.authorised_value %]">[% av.lib %]</option>
17
                            [% END %]
18
                        [% END %]
19
                    </select> (Authorised values for [% field.authorised_value_category %])
20
                [% ELSE %]
21
                    [% IF field.marcfield %]
22
                        <input type="text" value="[% values.${field.name} %]" id="additional_field_[% field.id %]" name="additional_field_[% field.id %]" readonly="readonly" />
23
                        This value will be filled with the [% field.marcfield %] subfield of the selected biblio.
24
                    [% ELSE %]
25
                        <input type="text" value="[% values.${field.name} %]" id="additional_field_[% field.id %]" name="additional_field_[% field.id %]" />
26
                    [% END %]
27
                [% END %]
28
            </li>
29
        [% END %]
30
[% IF wrap_fieldset != 0 %]
31
    </ol>
32
</fieldset>
33
[% END %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/admin-menu.inc (+1 lines)
Lines 75-80 Link Here
75
    <li><a href="/cgi-bin/koha/admin/didyoumean.pl">Did you mean?</a></li>
75
    <li><a href="/cgi-bin/koha/admin/didyoumean.pl">Did you mean?</a></li>
76
    <li><a href="/cgi-bin/koha/admin/columns_settings.pl">Columns settings</a></li>
76
    <li><a href="/cgi-bin/koha/admin/columns_settings.pl">Columns settings</a></li>
77
    <li><a href="/cgi-bin/koha/admin/audio_alerts.pl">Audio alerts</a></li>
77
    <li><a href="/cgi-bin/koha/admin/audio_alerts.pl">Audio alerts</a></li>
78
    <li><a href="/cgi-bin/koha/admin/additional-fields.pl">Additional fields</a></li>
78
    [% IF Koha.Preference('SMSSendDriver') == 'Email' %]
79
    [% IF Koha.Preference('SMSSendDriver') == 'Email' %]
79
        <li><a href="/cgi-bin/koha/admin/sms_providers.pl">SMS cellular providers</a></li>
80
        <li><a href="/cgi-bin/koha/admin/sms_providers.pl">SMS cellular providers</a></li>
80
    [% END %]
81
    [% END %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/serials-menu.inc (-1 lines)
Lines 30-34 Link Here
30
            Manage numbering patterns
30
            Manage numbering patterns
31
        </a>
31
        </a>
32
    </li>
32
    </li>
33
    <li><a href="/cgi-bin/koha/serials/add_fields.pl">Add subscription fields</a></li>
34
</ul>
33
</ul>
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basket.tt (+1 lines)
Lines 355-360 Link Here
355
                [% IF ( estimateddeliverydate ) %]<li><span class="label">Estimated delivery date:</span> [% estimateddeliverydate | $KohaDates  %]</li>[% END %]
355
                [% IF ( estimateddeliverydate ) %]<li><span class="label">Estimated delivery date:</span> [% estimateddeliverydate | $KohaDates  %]</li>[% END %]
356
                <li><span class="label">Orders are standing:</span> [% IF is_standing %]Yes[% ELSE %]No[% END %]</li>
356
                <li><span class="label">Orders are standing:</span> [% IF is_standing %]Yes[% ELSE %]No[% END %]</li>
357
357
358
                [% INCLUDE 'additional-fields-display.inc' available=available_additional_fields values=additional_field_values %]
358
359
359
                </ol>
360
                </ol>
360
                </div>
361
                </div>
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basketheader.tt (+5 lines)
Lines 124-129 Link Here
124
                </li>
124
                </li>
125
            </ol>
125
            </ol>
126
        </fieldset>
126
        </fieldset>
127
128
        [% IF available_additional_fields %]
129
            [% INCLUDE 'additional-fields-entry.inc' available=available_additional_fields values=additional_field_values %]
130
        [% END %]
131
127
        <fieldset class="action">
132
        <fieldset class="action">
128
            <input type="hidden" name="op" value="add_validate" />
133
            <input type="hidden" name="op" value="add_validate" />
129
            <input type="submit" value="Save" />
134
            <input type="submit" value="Save" />
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/histsearch.tt (+3 lines)
Lines 70-75 var MSG_REMOVE_PATRON = _("Remove"); Link Here
70
            <label for="basketgroupname">Basket group:</label>
70
            <label for="basketgroupname">Basket group:</label>
71
            <input type="text" name="basketgroupname" id="basketgroupname" value="[% basketgroupname %]" />
71
            <input type="text" name="basketgroupname" id="basketgroupname" value="[% basketgroupname %]" />
72
        </li>
72
        </li>
73
74
        [% INCLUDE 'additional-fields-entry.inc' available=available_additional_fields values=additional_field_filters wrap_fieldset=0 %]
75
73
        <li>
76
        <li>
74
          <label for="ordernumber">Order line:</label>
77
          <label for="ordernumber">Order line:</label>
75
          <input type="text" name="ordernumber" id="ordernumber" value="[% ordernumber %]" />
78
          <input type="text" name="ordernumber" id="ordernumber" value="[% ordernumber %]" />
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/additional-fields.tt (+195 lines)
Line 0 Link Here
1
[% INCLUDE 'doc-head-open.inc' %]
2
<title>Koha &rsaquo; Administration &rsaquo;
3
    [% SWITCH op %]
4
        [% CASE 'add_form' %][% IF field %]Modify additional field '[% field.name %]'[% ELSE %]Add additional field[% END %]
5
        [% CASE %]Manage additional fields
6
    [% END %]
7
</title>
8
[% INCLUDE 'doc-head-close.inc' %]
9
<link rel="stylesheet" type="text/css" href="[% interface %]/[% theme %]/css/datatables.css" />
10
[% INCLUDE "datatables.inc" %]
11
<script type="text/javascript">
12
//<![CDATA[
13
    $(document).ready(function(){
14
        $('#selecttable').find(":submit").hide();
15
        $('#selecttable select').change(function() {
16
            $('#selecttable').submit();
17
        });
18
19
        $("#fieldst").dataTable($.extend(true, {}, dataTablesDefaults, {
20
            'bAutoWidth': false,
21
            'sDom': 't<"bottom pager"ilpf>',
22
            'sPaginationType': 'four_button',
23
            'aLengthMenu': [[10, 20, 50, 100, -1], [10, 20, 50, 100, "All"]],
24
            'iDisplayLength': 20,
25
            'aaSorting': [[ 0, "asc" ]],
26
        }));
27
28
        $(".confirmdelete").click(function(){
29
            return confirm(_("Are you sure you want to delete this field?"));
30
        });
31
32
        $("#add_field").on('submit', function(){
33
            if ( $("#marcfield").val().length > 0
34
                && $("select[name='authorised_value_category']" ).val().length > 0 ) {
35
                alert("You cannot select an authorised value category and a marcfield");
36
                return false;
37
            }
38
            return true;
39
        });
40
    });
41
//]]>
42
</script>
43
</head>
44
45
<body id="ser_add_fields" class="ser">
46
    [% INCLUDE 'header.inc' %]
47
    [% INCLUDE 'cat-search.inc' %]
48
49
    <div id="breadcrumbs">
50
        <a href="/cgi-bin/koha/mainpage.pl">Home</a> &rsaquo; <a href="/cgi-bin/koha/admin/admin-home.pl">Administration</a> &rsaquo;
51
        [% SWITCH op %]
52
            [% CASE 'add_form' %]<a href="/cgi-bin/koha/admin/additional-fields.pl">Manage additional fields</a> &rsaquo; [% IF field %]Modify field '[% field.name %]'[% ELSE %]Add field[% END %]
53
            [% CASE 'list' %]<a href="/cgi-bin/koha/admin/additional-fields.pl">Manage additional fields</a> &rsaquo; Modify fields for '[% tablename %]'
54
            [% CASE %]Manage additional fields
55
        [% END %]
56
    </div>
57
58
    <div id="doc3" class="yui-t2">
59
    <div id="bd">
60
    <div id="yui-main">
61
    <div class="yui-b">
62
    [% IF op == 'list' %]
63
        <div id="toolbar" class="btn-toolbar">
64
            <a class="btn btn-small" id="newfields" href="?op=add_form&amp;tablename=[% tablename %]"><i class="fa fa-plus"></i> Create field</a>
65
        </div>
66
    [% END %]
67
68
    [% IF messages %]
69
        [% FOR message IN messages %]
70
            [% IF message.code == 'insert' %]
71
                [% IF message.number > 0 %]
72
                    <div class="dialog message">The field has been inserted</div>
73
                [% ELSE %]
74
                    <div class="dialog alert">The field could not be inserted. Perhaps the name already exists?</div>
75
                [% END %]
76
            [% ELSIF message.code == 'update' %]
77
                [% IF message.number > 0 %]
78
                    <div class="dialog message">The field has been updated</div>
79
                [% ELSE %]
80
                    <div class="dialog alert">The field could not be updated. Perhaps the name already exists?</div>
81
                [% END %]
82
            [% ELSIF message.code == 'delete' %]
83
                [% IF message.number > 0 %]
84
                    <div class="dialog message">The field has been deleted</div>
85
                [% ELSE %]
86
                    <div class="dialog alert">The field could not be deleted. Check the log for errors.</div>
87
                [% END %]
88
            [% END %]
89
        [% END %]
90
    [% END %]
91
92
    [% IF op == 'list_tables' %]
93
        <h3>Additional fields</h3>
94
        <p>Select a table:</p>
95
        [% BLOCK table_option %]
96
            <li><a href="?tablename=[% value %]">[% content %] (<tt>[% value %]</tt>)</a></li>
97
        [% END %]
98
        <ul>
99
            [% WRAPPER table_option value="aqbasket" %]Order baskets[% END %]
100
            [% WRAPPER table_option value="subscription" %]Subscriptions[% END %]
101
        </ul>
102
    [% ELSIF op == 'list' %]
103
        <h3>Additional fields for '[% tablename %]'</h3>
104
        [% IF fields %]
105
            <table id="fieldst">
106
                <thead>
107
                    <tr>
108
                        <th>Name</th>
109
                        <th>Authorised value category</th>
110
                        <th>MARC field</th>
111
                        <th>Searchable</th>
112
                        <th>Actions</th>
113
                    </tr>
114
                </thead>
115
                <tbody>
116
                    [% FOR field IN fields %]
117
                        <tr>
118
                            <td>[% field.name %]</td>
119
                            <td>[% field.authorised_value_category %]</td>
120
                            <td>[% field.marcfield %]</td>
121
                            <td>
122
                                [% IF field.searchable %]Yes[% ELSE %]No[% END %]
123
                            </td>
124
                            <td class="actions">
125
                                <a class="btn btn-mini" href="?op=add_form&amp;field_id=[% field.id %]"><i class="fa fa-pencil"></i> Edit</a>
126
                                <a class="confirmdelete btn btn-mini" href="?op=delete&amp;field_id=[% field.id %]"><i class="fa fa-trash"></i> Delete</a>
127
                            </td>
128
                        </tr>
129
                    [% END %]
130
                </tbody>
131
            </table>
132
        [% ELSE %]
133
            [% IF tablename %]There are no additional fields defined for this table.[% END %]
134
        [% END %]
135
    [% ELSIF op == 'add_form' %]
136
        [% IF field %]
137
            <h3>Modify field</h3>
138
        [% ELSE %]
139
            <h3>Add field</h3>
140
        [% END %]
141
        <form action="" name="add_form" id="add_field" method="post">
142
            <fieldset class="rows">
143
                <ol>
144
                    <li>
145
                        <label for="name" class="required">Name: </label>
146
                        <input type="text" name="name" id="name" value="[% field.name | html %]" class="required" required="required" />
147
                        <span class="required">Required</span>
148
                    </li>
149
                    <li>
150
                        <label for="av">Authorised value category: </label>
151
                        <select name="authorised_value_category">
152
                            <option value="">None</option>
153
                            [% FOR category IN categories %]
154
                                [% IF field.authorised_value_category == category %]
155
                                    <option value="[% category %]" selected="selected">[% category %]</option>
156
                                [% ELSE %]
157
                                    <option value="[% category %]">[% category %]</option>
158
                                [% END %]
159
                            [% END %]
160
                        </select>
161
                    </li>
162
                    <li>
163
                        <label for="marcfield">MARC field: </label>
164
                        <input type="text" name="marcfield" id="marcfield" value="[% field.marcfield %]" />
165
                    </li>
166
                    <li>
167
                        <label for="searchable">Searchable: </label>
168
                        [% IF field.searchable %]
169
                            <input type="checkbox" name="searchable" id="searchable" checked="checked" />
170
                        [% ELSE %]
171
                            <input type="checkbox" name="searchable" id="searchable" />
172
                        [% END %]
173
                    </li>
174
                </ol>
175
            </fieldset>
176
            <fieldset class="action">
177
                [% IF field %]
178
                    <input type="hidden" name="field_id" value="[% field.id %]" />
179
                [% END %]
180
                <input type="hidden" name="tablename" value="[% tablename %]" />
181
                <input type="hidden" name="op" value="add" />
182
                <input type="submit" value="Save" />
183
                <a href="?tablename=[% tablename %]" class="cancel">Cancel</a>
184
            </fieldset>
185
        </form>
186
    [% END %]
187
188
    </div>
189
    </div>
190
191
<div class="yui-b">
192
[% INCLUDE 'admin-menu.inc' %]
193
</div>
194
</div>
195
[% INCLUDE 'intranet-bottom.inc' %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt (+2 lines)
Lines 120-125 Link Here
120
                        <dt><a href="/cgi-bin/koha/admin/sms_providers.pl">SMS cellular providers</a></dt>
120
                        <dt><a href="/cgi-bin/koha/admin/sms_providers.pl">SMS cellular providers</a></dt>
121
                        <dd>Define a list of cellular providers for sending SMS messages via email.</dd>
121
                        <dd>Define a list of cellular providers for sending SMS messages via email.</dd>
122
                    [% END %]
122
                    [% END %]
123
                    <dt><a href="/cgi-bin/koha/admin/additional-fields.pl">Additional fields</a></dt>
124
                    <dd>Add additional fields to certain tables</dd>
123
                </dl>
125
                </dl>
124
            </div>
126
            </div>
125
        </div>
127
        </div>
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/serials/add_fields.tt (-180 lines)
Lines 1-180 Link Here
1
[% INCLUDE 'doc-head-open.inc' %]
2
<title>Koha &rsaquo; Serials &rsaquo; Manage new fields for subscriptions
3
  [% IF op == "list" %] &rsaquo; List of fields
4
  [% ELSIF op == "add_form" %]
5
    [% IF field %] &rsaquo; Modify field
6
    [% ELSE %] &rsaquo; Add field
7
    [% END %]
8
  [% END %]
9
</title>
10
[% INCLUDE 'doc-head-close.inc' %]
11
<link rel="stylesheet" type="text/css" href="[% interface %]/[% theme %]/css/datatables.css" />
12
[% INCLUDE "datatables.inc" %]
13
<script type="text/javascript">
14
//<![CDATA[
15
  $(document).ready(function(){
16
17
    $("#fieldst").dataTable($.extend(true, {}, dataTablesDefaults, {
18
        'bAutoWidth': false,
19
        'sDom': 't<"bottom pager"ilpf>',
20
        'sPaginationType': 'four_button',
21
        'aLengthMenu': [[10, 20, 50, 100, -1], [10, 20, 50, 100, "All"]],
22
        'iDisplayLength': 20,
23
        'aaSorting': [[ 0, "asc" ]],
24
        "aoColumnDefs": [
25
            { "aTargets": [ -1 ], "bSortable": false, "bSearchable": false },
26
        ]
27
    }));
28
29
    $(".confirmdelete").click(function(){
30
      return confirm(_("Are you sure you want to delete this field?"));
31
    });
32
33
    $("#add_field").on('submit', function(){
34
        if ( $("#marcfield").val().length > 0
35
            && $("select[name='authorised_value_category']" ).val().length > 0 ) {
36
            alert("You cannot select an authorised value category and a marcfield");
37
            return false;
38
        }
39
        return true;
40
    });
41
  });
42
//]]>
43
</script>
44
</head>
45
46
<body id="ser_add_fields" class="ser">
47
  [% INCLUDE 'header.inc' %]
48
  [% INCLUDE 'serials-search.inc' %]
49
50
  <div id="breadcrumbs">
51
    <a href="/cgi-bin/koha/mainpage.pl">Home</a> &rsaquo; <a href="/cgi-bin/koha/serials/serials-home.pl">Serials</a> &rsaquo; Manage new fields for subscriptions
52
  </div>
53
54
  <div id="doc3" class="yui-t2">
55
  <div id="bd">
56
  <div id="yui-main">
57
  <div class="yui-b">
58
  [% IF op == 'list' %]
59
    <div id="toolbar" class="btn-toolbar">
60
      <a class="btn btn-small" id="newfields" href="/cgi-bin/koha/serials/add_fields.pl?op=add_form"><i class="fa fa-plus"></i> New fields</a>
61
    </div>
62
  [% END %]
63
64
  [% IF messages %]
65
    [% FOR message IN messages %]
66
      [% IF message.code == 'insert' %]
67
        [% IF message.number > 0 %]
68
          <div class="dialog message">Field created.</div>
69
        [% ELSE %]
70
          <div class="dialog alert">The field could not be created. Perhaps the name already exists?</div>
71
        [% END %]
72
      [% ELSIF message.code == 'update' %]
73
        [% IF message.number > 0 %]
74
          <div class="dialog message">Field updated.</div>
75
        [% ELSE %]
76
          <div class="dialog alert">The field could not be updated. Perhaps the name already exists?</div>
77
        [% END %]
78
      [% ELSIF message.code == 'delete' %]
79
        [% IF message.number > 0 %]
80
          <div class="dialog message">Field deleted.</div>
81
        [% ELSE %]
82
          <div class="dialog alert">The field could not be deleted. Check the log for errors.</div>
83
        [% END %]
84
      [% END %]
85
    [% END %]
86
  [% END %]
87
88
  [% IF op == 'list' %]
89
    <h3>Additional fields for subscriptions</h3>
90
    [% IF fields %]
91
      <table id="fieldst">
92
        <thead>
93
          <tr>
94
            <th>Name</th>
95
            <th>Authorised value category</th>
96
            <th>Marc field</th>
97
            <th>Searchable</th>
98
            <th>Actions</th>
99
          </tr>
100
        </thead>
101
        <tbody>
102
          [% FOR field IN fields %]
103
            <tr>
104
              <td>[% field.name %]</td>
105
              <td>[% field.authorised_value_category %]</td>
106
              <td>[% field.marcfield %]</td>
107
              <td>
108
                [% IF field.searchable %]Yes[% ELSE %]No[% END %]
109
              </td>
110
              <td class="actions">
111
                <a class="btn btn-mini" href="/cgi-bin/koha/serials/add_fields.pl?op=add_form&amp;field_id=[% field.id %]"><i class="fa fa-pencil"></i> Edit</a>
112
                <a class="confirmdelete btn btn-mini" href="/cgi-bin/koha/serials/add_fields.pl?op=delete&amp;field_id=[% field.id %]"><i class="fa fa-trash"></i> Delete</a>
113
              </td>
114
            </tr>
115
          [% END %]
116
        </tbody>
117
      </table>
118
    [% ELSE %]
119
      There is no field defined.
120
    [% END %]
121
  [% ELSIF op == 'add_form' %]
122
    [% IF field %]
123
      <h3>Modify field</h3>
124
    [% ELSE %]
125
      <h3>Add field</h3>
126
    [% END %]
127
    <form action="/cgi-bin/koha/serials/add_fields.pl" name="add_form" id="add_field" method="post">
128
      <fieldset class="rows">
129
        <ol>
130
          <li>
131
            <label for="name" class="required">Name: </label>
132
            <input type="text" name="name" id="name" value="[% field.name | html %]" class="required" required="required" />
133
            <span class="required">Required</span>
134
          </li>
135
          <li>
136
            <label for="av">Authorised value category: </label>
137
            <select name="authorised_value_category">
138
              <option value="">None</option>
139
              [% FOR category IN categories %]
140
                [% IF field.authorised_value_category == category %]
141
                  <option value="[% category %]" selected="selected">[% category %]</option>
142
                [% ELSE %]
143
                  <option value="[% category %]">[% category %]</option>
144
                [% END %]
145
              [% END %]
146
            </select>
147
          </li>
148
          <li>
149
            <label for="marcfield">Marc field: </label>
150
            <input type="text" name="marcfield" id="marcfield" value="[% field.marcfield| html %]" />
151
          </li>
152
          <li>
153
            <label for="searchable">Searchable: </label>
154
            [% IF field.searchable %]
155
              <input type="checkbox" name="searchable" id="searchable" checked="checked" />
156
            [% ELSE %]
157
              <input type="checkbox" name="searchable" id="searchable" />
158
            [% END %]
159
          </li>
160
        </ol>
161
      </fieldset>
162
      <fieldset class="action">
163
        [% IF field %]
164
          <input type="hidden" name="field_id" value="[% field.id %]" />
165
        [% END %]
166
        <input type="hidden" name="op" value="add" />
167
        <input type="submit" value="Save" />
168
        <a href="/cgi-bin/koha/serials/add_fields.pl" class="cancel">Cancel</a>
169
      </fieldset>
170
    </form>
171
  [% END %]
172
173
  </div>
174
  </div>
175
176
<div class="yui-b">
177
[% INCLUDE 'serials-menu.inc' %]
178
</div>
179
</div>
180
[% INCLUDE 'intranet-bottom.inc' %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/serials/serials-search.tt (-15 / +1 lines)
Lines 106-126 Link Here
106
                  <label for="to">Expires before:</label>
106
                  <label for="to">Expires before:</label>
107
                  <input type="text" id="to" name="expiration_date_filter" value="[% expiration_date_filter | $KohaDates %]" size="10" maxlength="10" class="datepickerto" />
107
                  <input type="text" id="to" name="expiration_date_filter" value="[% expiration_date_filter | $KohaDates %]" size="10" maxlength="10" class="datepickerto" />
108
                </li>
108
                </li>
109
                [% FOR field IN additional_fields_for_subscription %]
109
                [% INCLUDE 'additional-fields-entry.inc' available=additional_fields_for_subscription values=additional_field_filters wrap_fieldset=0 %]
110
                  <li>
111
                    <label for="additional_field_[% field.id %]"> [% field.name %]: </label>
112
                    [% IF field.authorised_value_choices %]
113
                      <select id="additional_field_[% field.id %]" name="additional_field_[% field.id %]_filter">
114
                        <option value="">All</option>
115
                        [% FOREACH av IN field.authorised_value_choices %]
116
                          <option value="[% av.authorised_value %]">[% av.lib %]</option>
117
                        [% END %]
118
                      </select>
119
                    [% ELSE %]
120
                      <input id="additional_field_[% field.id %]" type="text" value="[% additional_fields.${field.name} %]" name="additional_field_[% field.id %]_filter" />
121
                    [% END %]
122
                  </li>
123
                [% END %]
124
              </ol>
110
              </ol>
125
              <input type="hidden" name="searched" value="1" />
111
              <input type="hidden" name="searched" value="1" />
126
              <fieldset class="action">
112
              <fieldset class="action">
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/serials/subscription-add.tt (-30 / +3 lines)
Lines 856-891 $(document).ready(function() { Link Here
856
                            </fieldset>
856
                            </fieldset>
857
857
858
                            [% IF additional_fields_for_subscription %]
858
                            [% IF additional_fields_for_subscription %]
859
                              <div id="subscription_additional_fields">
859
                                <div id="subscription_additional_fields">
860
                                <fieldset class="rows">
860
                                    [% INCLUDE 'additional-fields-entry.inc' available=additional_fields_for_subscription values=additional_fields %]
861
                                  <legend>Additional fields</legend>
861
                                </div>
862
                                  <ol>
863
                                    [% FOR field IN additional_fields_for_subscription %]
864
                                      <li>
865
                                        <label for="additional_field_[% field.id %]"> [% field.name %]: </label>
866
                                        [% IF field.authorised_value_choices %]
867
                                          <select name="additional_field_[% field.id %]" id="additional_field_[% field.id %]">
868
                                            [% FOREACH av IN field.authorised_value_choices %]
869
                                              [% IF av.authorised_value == additional_fields.${field.name} %]
870
                                                <option value="[% av.authorised_value %]" selected="selected">[% av.lib %]</option>
871
                                              [% ELSE %]
872
                                                <option value="[% av.authorised_value %]">[% av.lib %]</option>
873
                                              [% END %]
874
                                            [% END %]
875
                                          </select> (Authorised values for [% field.authorised_value_category %])
876
                                        [% ELSE %]
877
                                          [% IF field.marcfield %]
878
                                            <input type="text" value="[% additional_fields.${field.name} %]" id="additional_field_[% field.id %]" name="additional_field_[% field.id %]" readonly="readonly" />
879
                                            This value will be filled with the [% field.marcfield %] subfield of the selected biblio.
880
                                          [% ELSE %]
881
                                            <input type="text" value="[% additional_fields.${field.name} %]" id="additional_field_[% field.id %]" name="additional_field_[% field.id %]" />
882
                                          [% END %]
883
                                        [% END %]
884
                                      </li>
885
                                    [% END %]
886
                                  </ol>
887
                                </fieldset>
888
                              </div>
889
                            [% END %]
862
                            [% END %]
890
863
891
                            <fieldset class="action">
864
                            <fieldset class="action">
(-)a/serials/serials-search.pl (-15 / +6 lines)
Lines 79-97 if ( $op and $op eq "close" ) { Link Here
79
79
80
80
81
my $additional_fields = Koha::AdditionalField->all( { tablename => 'subscription', searchable => 1 } );
81
my $additional_fields = Koha::AdditionalField->all( { tablename => 'subscription', searchable => 1 } );
82
my $additional_field_filters;
82
my $additional_field_filters = Koha::AdditionalField->get_filters_from_query( {
83
for my $field ( @$additional_fields ) {
83
    tablename => 'subscription',
84
    my $filter_value = $query->param('additional_field_' . $field->{id} . '_filter');
84
    query => $query,
85
    if ( defined $filter_value and $filter_value ne q|| ) {
85
} );
86
        $additional_field_filters->{ $field->{name} } = {
87
            value => $filter_value,
88
            authorised_value_category => $field->{authorised_value_category},
89
        };
90
    }
91
    if ( $field->{authorised_value_category} ) {
92
        $field->{authorised_value_choices} = GetAuthorisedValues( $field->{authorised_value_category} );
93
    }
94
}
95
86
96
my $expiration_date_dt = $expiration_date ? dt_from_string( $expiration_date ) : undef;
87
my $expiration_date_dt = $expiration_date ? dt_from_string( $expiration_date ) : undef;
97
my @subscriptions;
88
my @subscriptions;
Lines 106-112 if ($searched){ Link Here
106
            publisher    => $publisher,
97
            publisher    => $publisher,
107
            bookseller   => $bookseller,
98
            bookseller   => $bookseller,
108
            branch       => $branch,
99
            branch       => $branch,
109
            additional_fields => [ map{ { name => $_, value => $additional_field_filters->{$_}{value}, authorised_value_category => $additional_field_filters->{$_}{authorised_value_category} } } keys %$additional_field_filters ],
100
            additional_fields => $additional_field_filters,
110
            location     => $location,
101
            location     => $location,
111
            expiration_date => $expiration_date_dt,
102
            expiration_date => $expiration_date_dt,
112
        }
103
        }
Lines 160-166 $template->param( Link Here
160
    branches_loop => \@branches_loop,
151
    branches_loop => \@branches_loop,
161
    done_searched => $searched,
152
    done_searched => $searched,
162
    routing       => $routing,
153
    routing       => $routing,
163
    additional_field_filters => $additional_field_filters,
154
    additional_field_filters => Koha::AdditionalField->get_filters_as_values( $additional_field_filters ),
164
    additional_fields_for_subscription => $additional_fields,
155
    additional_fields_for_subscription => $additional_fields,
165
    marcflavour   => (uc(C4::Context->preference("marcflavour")))
156
    marcflavour   => (uc(C4::Context->preference("marcflavour")))
166
);
157
);
(-)a/serials/subscription-add.pl (-36 / +13 lines)
Lines 152-165 $template->param(branchloop => $branchloop, Link Here
152
    locations_loop=>$locations_loop,
152
    locations_loop=>$locations_loop,
153
);
153
);
154
154
155
155
$template->param( additional_fields_for_subscription => scalar Koha::AdditionalField->all( { tablename => 'subscription' } ) );
156
my $additional_fields = Koha::AdditionalField->all( { tablename => 'subscription' } );
157
for my $field ( @$additional_fields ) {
158
    if ( $field->{authorised_value_category} ) {
159
        $field->{authorised_value_choices} = GetAuthorisedValues( $field->{authorised_value_category} );
160
    }
161
}
162
$template->param( additional_fields_for_subscription => $additional_fields );
163
156
164
# prepare template variables common to all $op conditions:
157
# prepare template variables common to all $op conditions:
165
if ($op!~/^mod/) {
158
if ($op!~/^mod/) {
Lines 346-353 sub redirect_add_subscription { Link Here
346
        $skip_serialseq
339
        $skip_serialseq
347
    );
340
    );
348
341
349
    my $additional_fields = Koha::AdditionalField->all( { tablename => 'subscription' } );
342
    Koha::AdditionalField->update_fields_from_query( {
350
    insert_additional_fields( $additional_fields, $biblionumber, $subscriptionid );
343
        tablename => 'subscription',
344
        record_id => $subscriptionid,
345
        query => $query,
346
        marc_record => GetMarcBiblio( $biblionumber, 1 )
347
    } );
351
348
352
    print $query->redirect("/cgi-bin/koha/serials/subscription-detail.pl?subscriptionid=$subscriptionid");
349
    print $query->redirect("/cgi-bin/koha/serials/subscription-detail.pl?subscriptionid=$subscriptionid");
353
    return;
350
    return;
Lines 428-459 sub redirect_mod_subscription { Link Here
428
        $skip_serialseq
425
        $skip_serialseq
429
    );
426
    );
430
427
431
    my $additional_fields = Koha::AdditionalField->all( { tablename => 'subscription' } );
428
    Koha::AdditionalField->update_fields_from_query( {
432
    insert_additional_fields( $additional_fields, $biblionumber, $subscriptionid );
429
        tablename => 'subscription',
430
        record_id => $subscriptionid,
431
        query => $query,
432
        marc_record => GetMarcBiblio( $biblionumber, 1 )
433
    } );
433
434
434
    print $query->redirect("/cgi-bin/koha/serials/subscription-detail.pl?subscriptionid=$subscriptionid");
435
    print $query->redirect("/cgi-bin/koha/serials/subscription-detail.pl?subscriptionid=$subscriptionid");
435
    return;
436
    return;
436
}
437
}
437
438
sub insert_additional_fields {
439
    my ( $additional_fields, $biblionumber, $subscriptionid ) = @_;
440
    my $record = GetMarcBiblio( $biblionumber, 1 );
441
    for my $field ( @$additional_fields ) {
442
        my $af = Koha::AdditionalField->new({ id => $field->{id} })->fetch;
443
        if ( $af->{marcfield} ) {
444
            my ( $field, $subfield ) = split /\$/, $af->{marcfield};
445
            $af->{values} = undef;
446
            if ( $field and $subfield ) {
447
                my $value = $record->subfield( $field, $subfield );
448
                $af->{values} = {
449
                    $subscriptionid => $value
450
                };
451
            }
452
        } else {
453
            $af->{values} = {
454
                $subscriptionid => scalar $query->param('additional_field_' . $field->{id})
455
            } if defined $query->param('additional_field_' . $field->{id});
456
        }
457
        $af->insert_values;
458
    }
459
}
460
- 

Return to bug 15774