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

(-)a/C4/Acquisition.pm (+12 lines)
Lines 2282-2287 sub GetHistory { Link Here
2282
    my $ordernumber = $params{ordernumber};
2282
    my $ordernumber = $params{ordernumber};
2283
    my $search_children_too = $params{search_children_too} || 0;
2283
    my $search_children_too = $params{search_children_too} || 0;
2284
    my $created_by = $params{created_by} || [];
2284
    my $created_by = $params{created_by} || [];
2285
    my $additional_fields = $params{additional_fields} // [];
2285
2286
2286
    my @order_loop;
2287
    my @order_loop;
2287
    my $total_qty         = 0;
2288
    my $total_qty         = 0;
Lines 2423-2428 sub GetHistory { Link Here
2423
        push @query_params, @$created_by;
2424
        push @query_params, @$created_by;
2424
    }
2425
    }
2425
2426
2427
    if ( @$additional_fields ) {
2428
        my $matching_record_ids_for_additional_fields = Koha::AdditionalField->get_matching_record_ids( {
2429
            fields => $additional_fields,
2430
            tablename => 'aqbasket',
2431
            exact_match => 0,
2432
        } );
2433
        return [] unless @$matching_record_ids_for_additional_fields;
2434
2435
        # No parameterization because record IDs come directly from DB
2436
        $query .= ' AND aqbasket.basketno IN ( ' . join( ',', @$matching_record_ids_for_additional_fields ) . ' )';
2437
    }
2426
2438
2427
    if ( C4::Context->preference("IndependentBranches") ) {
2439
    if ( C4::Context->preference("IndependentBranches") ) {
2428
        unless ( C4::Context->IsSuperLibrarian() ) {
2440
        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 42-47 use Koha::EDI qw( create_edi_order get_edifact_ean ); Link Here
42
use Koha::CsvProfiles;
42
use Koha::CsvProfiles;
43
use Koha::Patrons;
43
use Koha::Patrons;
44
44
45
use Koha::AdditionalField;
46
45
=head1 NAME
47
=head1 NAME
46
48
47
basket.pl
49
basket.pl
Lines 429-434 if ( $op eq 'list' ) { Link Here
429
        has_budgets          => $has_budgets,
431
        has_budgets          => $has_budgets,
430
        duplinbatch          => $duplinbatch,
432
        duplinbatch          => $duplinbatch,
431
        csv_profiles         => [ Koha::CsvProfiles->search({ type => 'sql', used_for => 'export_basket' }) ],
433
        csv_profiles         => [ Koha::CsvProfiles->search({ type => 'sql', used_for => 'export_basket' }) ],
434
        available_additional_fields => Koha::AdditionalField->all( { tablename => 'aqbasket' } ),
435
        additional_field_values => Koha::AdditionalField->fetch_all_values( {
436
            tablename => 'aqbasket',
437
            record_id => $basketno,
438
        } )->{$basketno},
432
    );
439
    );
433
}
440
}
434
441
(-)a/acqui/basketheader.pl (+16 lines)
Lines 54-59 use C4::Acquisition qw/GetBasket NewBasket ModBasketHeader/; Link Here
54
use C4::Contract qw/GetContracts/;
54
use C4::Contract qw/GetContracts/;
55
55
56
use Koha::Acquisition::Booksellers;
56
use Koha::Acquisition::Booksellers;
57
use Koha::AdditionalField;
57
58
58
my $input = new CGI;
59
my $input = new CGI;
59
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
60
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
Lines 74-79 my $basket; Link Here
74
my $op = $input->param('op');
75
my $op = $input->param('op');
75
my $is_an_edit = $input->param('is_an_edit');
76
my $is_an_edit = $input->param('is_an_edit');
76
77
78
$template->param( available_additional_fields => scalar Koha::AdditionalField->all( { tablename => 'aqbasket' } ) );
79
77
if ( $op eq 'add_form' ) {
80
if ( $op eq 'add_form' ) {
78
    my @contractloop;
81
    my @contractloop;
79
    if ( $basketno ) {
82
    if ( $basketno ) {
Lines 94-99 if ( $op eq 'add_form' ) { Link Here
94
            }
97
            }
95
        }
98
        }
96
        $template->param( is_an_edit => 1);
99
        $template->param( is_an_edit => 1);
100
        $template->param(
101
            additional_field_values => Koha::AdditionalField->fetch_all_values( {
102
                tablename => 'aqbasket',
103
                record_id => $basketno,
104
            } )->{$basketno},
105
        );
97
    } else {
106
    } else {
98
    #new basket
107
    #new basket
99
        my $basket;
108
        my $basket;
Lines 160-165 if ( $op eq 'add_form' ) { Link Here
160
            scalar $input->param('create_items')
169
            scalar $input->param('create_items')
161
        );
170
        );
162
    }
171
    }
172
173
    Koha::AdditionalField->update_fields_from_query( {
174
        tablename => 'aqbasket',
175
        record_id => $basketno,
176
        query => $input,
177
    } );
178
163
    print $input->redirect('basket.pl?basketno='.$basketno);
179
    print $input->redirect('basket.pl?basketno='.$basketno);
164
    exit 0;
180
    exit 0;
165
}
181
}
(-)a/acqui/histsearch.pl (+9 lines)
Lines 56-61 use C4::Output; Link Here
56
use C4::Acquisition;
56
use C4::Acquisition;
57
use C4::Debug;
57
use C4::Debug;
58
use C4::Koha;
58
use C4::Koha;
59
use Koha::AdditionalField;
59
use Koha::DateUtils;
60
use Koha::DateUtils;
60
61
61
my $input = new CGI;
62
my $input = new CGI;
Lines 93-98 my ( $template, $loggedinuser, $cookie ) = get_template_and_user( Link Here
93
    }
94
    }
94
);
95
);
95
96
97
$template->param( available_additional_fields => scalar Koha::AdditionalField->all( { tablename => 'aqbasket', searchable => 1 } ) );
98
my $additional_field_filters = Koha::AdditionalField->get_filters_from_query( {
99
    tablename => 'aqbasket',
100
    query => $input,
101
} );
102
96
my $order_loop;
103
my $order_loop;
97
# If we're supplied any value then we do a search. Otherwise we don't.
104
# If we're supplied any value then we do a search. Otherwise we don't.
98
if ($do_search) {
105
if ($do_search) {
Lines 112-117 if ($do_search) { Link Here
112
        ordernumber => $ordernumber,
119
        ordernumber => $ordernumber,
113
        search_children_too => $search_children_too,
120
        search_children_too => $search_children_too,
114
        created_by => \@created_by,
121
        created_by => \@created_by,
122
        additional_fields => $additional_field_filters,
115
    );
123
    );
116
}
124
}
117
125
Lines 144-149 $template->param( Link Here
144
    budget_id               => $budget,
152
    budget_id               => $budget,
145
    bp_loop                 => $bp_loop,
153
    bp_loop                 => $bp_loop,
146
    search_done             => $do_search,
154
    search_done             => $do_search,
155
    additional_field_filters => Koha::AdditionalField->get_filters_as_values( $additional_field_filters ),
147
    debug                   => $debug || $input->param('debug') || 0,
156
    debug                   => $debug || $input->param('debug') || 0,
148
    uc(C4::Context->preference("marcflavour")) => 1
157
    uc(C4::Context->preference("marcflavour")) => 1
149
);
158
);
(-)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 106-123 if ( $op eq 'add_form' ) { Link Here
106
        $field = Koha::AdditionalField->new( { id => $field_id } )->fetch;
107
        $field = Koha::AdditionalField->new( { id => $field_id } )->fetch;
107
    }
108
    }
108
109
110
    $tablename = $field->{tablename};
111
109
    $template->param(
112
    $template->param(
110
        field => $field,
113
        field => $field,
111
    );
114
    );
112
}
115
}
113
116
114
if ( $op eq 'list' ) {
117
if ( $op eq 'list' ) {
115
    my $fields = Koha::AdditionalField->all( { tablename => 'subscription' } );
118
    my $fields = Koha::AdditionalField->all( { tablename => $tablename } );
116
    $template->param( fields => $fields );
119
    $template->param( fields => $fields );
117
}
120
}
118
121
119
$template->param(
122
$template->param(
120
    op => $op,
123
    op => $op,
124
    tablename => $tablename,
121
    messages => \@messages,
125
    messages => \@messages,
122
);
126
);
123
127
(-)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 65-70 Link Here
65
    <li><a href="/cgi-bin/koha/admin/didyoumean.pl">Did you mean?</a></li>
65
    <li><a href="/cgi-bin/koha/admin/didyoumean.pl">Did you mean?</a></li>
66
    <li><a href="/cgi-bin/koha/admin/columns_settings.pl">Columns settings</a></li>
66
    <li><a href="/cgi-bin/koha/admin/columns_settings.pl">Columns settings</a></li>
67
    <li><a href="/cgi-bin/koha/admin/audio_alerts.pl">Audio alerts</a></li>
67
    <li><a href="/cgi-bin/koha/admin/audio_alerts.pl">Audio alerts</a></li>
68
    <li><a href="/cgi-bin/koha/admin/additional-fields.pl">Additional fields</a></li>
68
    [% IF Koha.Preference('SMSSendDriver') == 'Email' %]
69
    [% IF Koha.Preference('SMSSendDriver') == 'Email' %]
69
        <li><a href="/cgi-bin/koha/admin/sms_providers.pl">SMS cellular providers</a></li>
70
        <li><a href="/cgi-bin/koha/admin/sms_providers.pl">SMS cellular providers</a></li>
70
    [% END %]
71
    [% 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 (+2 lines)
Lines 277-282 Link Here
277
                    </li>
277
                    </li>
278
                [% END %]
278
                [% END %]
279
279
280
                [% INCLUDE 'additional-fields-display.inc' available=available_additional_fields values=additional_field_values %]
281
280
                </ol>
282
                </ol>
281
                </div>
283
                </div>
282
                [% IF ( closedate ) %]
284
                [% IF ( closedate ) %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basketheader.tt (+5 lines)
Lines 125-130 Link Here
125
                [% END %]
125
                [% END %]
126
            </ol>
126
            </ol>
127
        </fieldset>
127
        </fieldset>
128
129
        [% IF available_additional_fields %]
130
            [% INCLUDE 'additional-fields-entry.inc' available=available_additional_fields values=additional_field_values %]
131
        [% END %]
132
128
        <fieldset class="action">
133
        <fieldset class="action">
129
            <input type="hidden" name="op" value="add_validate" />
134
            <input type="hidden" name="op" value="add_validate" />
130
            <input type="submit" value="Save" />
135
            <input type="submit" value="Save" />
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/histsearch.tt (+3 lines)
Lines 42-47 Link Here
42
            <label for="basketgroupname">Basket group:</label>
42
            <label for="basketgroupname">Basket group:</label>
43
            <input type="text" name="basketgroupname" id="basketgroupname" value="[% basketgroupname %]" />
43
            <input type="text" name="basketgroupname" id="basketgroupname" value="[% basketgroupname %]" />
44
        </li>
44
        </li>
45
46
        [% INCLUDE 'additional-fields-entry.inc' available=available_additional_fields values=additional_field_filters wrap_fieldset=0 %]
47
45
        <li>
48
        <li>
46
          <label for="ordernumber">Order line:</label>
49
          <label for="ordernumber">Order line:</label>
47
          <input type="text" name="ordernumber" id="ordernumber" value="[% ordernumber %]" />
50
          <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 129-134 Link Here
129
                    [% END %]
129
                    [% END %]
130
                    <dt><a href="/cgi-bin/koha/admin/usage_statistics.pl">Share your usage statistics</a></dt>
130
                    <dt><a href="/cgi-bin/koha/admin/usage_statistics.pl">Share your usage statistics</a></dt>
131
                    <dd>Share with the Koha community the usage statistics of your Koha installation.</dd>
131
                    <dd>Share with the Koha community the usage statistics of your Koha installation.</dd>
132
                    <dt><a href="/cgi-bin/koha/admin/additional-fields.pl">Additional fields</a></dt>
133
                    <dd>Add additional fields to certain tables</dd>
132
                </dl>
134
                </dl>
133
            </div>
135
            </div>
134
        </div>
136
        </div>
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/serials/add_fields.tt (-178 lines)
Lines 1-178 Link Here
1
[% USE AuthorisedValues %]
2
[% SET footerjs = 1 %]
3
[% INCLUDE 'doc-head-open.inc' %]
4
<title>Koha &rsaquo; Serials &rsaquo; Manage new fields for subscriptions
5
  [% IF op == "list" %] &rsaquo; List of fields
6
  [% ELSIF op == "add_form" %]
7
    [% IF field %] &rsaquo; Modify field
8
    [% ELSE %] &rsaquo; Add field
9
    [% END %]
10
  [% END %]
11
</title>
12
[% INCLUDE 'doc-head-close.inc' %]
13
<link rel="stylesheet" type="text/css" href="[% interface %]/[% theme %]/css/datatables_[% KOHA_VERSION %].css" />
14
</head>
15
16
<body id="ser_add_fields" class="ser">
17
  [% INCLUDE 'header.inc' %]
18
  [% INCLUDE 'serials-search.inc' %]
19
20
  <div id="breadcrumbs">
21
    <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
22
  </div>
23
24
  <div id="doc3" class="yui-t2">
25
  <div id="bd">
26
  <div id="yui-main">
27
  <div class="yui-b">
28
  [% IF op == 'list' %]
29
    <div id="toolbar" class="btn-toolbar">
30
      <a class="btn btn-default btn-sm" id="newfields" href="/cgi-bin/koha/serials/add_fields.pl?op=add_form"><i class="fa fa-plus"></i> New fields</a>
31
    </div>
32
  [% END %]
33
34
  [% IF messages %]
35
    [% FOR message IN messages %]
36
      [% IF message.code == 'insert' %]
37
        [% IF message.number > 0 %]
38
          <div class="dialog message">Field created.</div>
39
        [% ELSE %]
40
          <div class="dialog alert">The field could not be created. Perhaps the name already exists?</div>
41
        [% END %]
42
      [% ELSIF message.code == 'update' %]
43
        [% IF message.number > 0 %]
44
          <div class="dialog message">Field updated.</div>
45
        [% ELSE %]
46
          <div class="dialog alert">The field could not be updated. Perhaps the name already exists?</div>
47
        [% END %]
48
      [% ELSIF message.code == 'delete' %]
49
        [% IF message.number > 0 %]
50
          <div class="dialog message">Field deleted.</div>
51
        [% ELSE %]
52
          <div class="dialog alert">The field could not be deleted. Check the log for errors.</div>
53
        [% END %]
54
      [% END %]
55
    [% END %]
56
  [% END %]
57
58
  [% IF op == 'list' %]
59
    <h3>Additional fields for subscriptions</h3>
60
    [% IF fields %]
61
      <table id="fieldst">
62
        <thead>
63
          <tr>
64
            <th>Name</th>
65
            <th>Authorised value category</th>
66
            <th>Marc field</th>
67
            <th>Searchable</th>
68
            <th>Actions</th>
69
          </tr>
70
        </thead>
71
        <tbody>
72
          [% FOR field IN fields %]
73
            <tr>
74
              <td>[% field.name %]</td>
75
              <td>[% field.authorised_value_category %]</td>
76
              <td>[% field.marcfield %]</td>
77
              <td>
78
                [% IF field.searchable %]Yes[% ELSE %]No[% END %]
79
              </td>
80
              <td class="actions">
81
                <a class="btn btn-default btn-xs" href="/cgi-bin/koha/serials/add_fields.pl?op=add_form&amp;field_id=[% field.id %]"><i class="fa fa-pencil"></i> Edit</a>
82
                <a class="confirmdelete btn btn-default btn-xs" href="/cgi-bin/koha/serials/add_fields.pl?op=delete&amp;field_id=[% field.id %]"><i class="fa fa-trash"></i> Delete</a>
83
              </td>
84
            </tr>
85
          [% END %]
86
        </tbody>
87
      </table>
88
    [% ELSE %]
89
      There is no field defined.
90
    [% END %]
91
  [% ELSIF op == 'add_form' %]
92
    [% IF field %]
93
      <h3>Modify field</h3>
94
    [% ELSE %]
95
      <h3>Add field</h3>
96
    [% END %]
97
    <form action="/cgi-bin/koha/serials/add_fields.pl" name="add_form" id="add_field" method="post">
98
      <fieldset class="rows">
99
        <ol>
100
          <li>
101
            <label for="name" class="required">Name: </label>
102
            <input type="text" name="name" id="name" value="[% field.name | html %]" class="required" required="required" />
103
            <span class="required">Required</span>
104
          </li>
105
          <li>
106
            <label for="av">Authorised value category: </label>
107
            <select name="authorised_value_category">
108
              <option value="">None</option>
109
              [% PROCESS options_for_authorised_value_categories authorised_value_categories => AuthorisedValues.GetCategories( selected => field.authorised_value_category ) %]
110
            </select>
111
          </li>
112
          <li>
113
            <label for="marcfield">Marc field: </label>
114
            <input type="text" name="marcfield" id="marcfield" value="[% field.marcfield| html %]" />
115
          </li>
116
          <li>
117
            <label for="searchable">Searchable: </label>
118
            [% IF field.searchable %]
119
              <input type="checkbox" name="searchable" id="searchable" checked="checked" />
120
            [% ELSE %]
121
              <input type="checkbox" name="searchable" id="searchable" />
122
            [% END %]
123
          </li>
124
        </ol>
125
      </fieldset>
126
      <fieldset class="action">
127
        [% IF field %]
128
          <input type="hidden" name="field_id" value="[% field.id %]" />
129
        [% END %]
130
        <input type="hidden" name="op" value="add" />
131
        <input type="submit" value="Save" />
132
        <a href="/cgi-bin/koha/serials/add_fields.pl" class="cancel">Cancel</a>
133
      </fieldset>
134
    </form>
135
  [% END %]
136
137
  </div>
138
  </div>
139
140
<div class="yui-b">
141
[% INCLUDE 'serials-menu.inc' %]
142
</div>
143
</div>
144
145
[% MACRO jsinclude BLOCK %]
146
    [% INCLUDE "datatables.inc" %]
147
    <script type="text/javascript">
148
        $(document).ready(function(){
149
150
            $("#fieldst").dataTable($.extend(true, {}, dataTablesDefaults, {
151
                'bAutoWidth': false,
152
                'sDom': 't<"bottom pager"ilpf>',
153
                'sPaginationType': 'four_button',
154
                'aLengthMenu': [[10, 20, 50, 100, -1], [10, 20, 50, 100, "All"]],
155
                'iDisplayLength': 20,
156
                'aaSorting': [[ 0, "asc" ]],
157
                "aoColumnDefs": [
158
                    { "aTargets": [ -1 ], "bSortable": false, "bSearchable": false },
159
                ]
160
            }));
161
162
            $(".confirmdelete").click(function(){
163
                return confirm(_("Are you sure you want to delete this field?"));
164
            });
165
166
            $("#add_field").on('submit', function(){
167
                if ( $("#marcfield").val().length > 0
168
                    && $("select[name='authorised_value_category']" ).val().length > 0 ) {
169
                    alert("You cannot select an authorised value category and a marcfield");
170
                    return false;
171
                }
172
                return true;
173
            });
174
        });
175
    </script>
176
[% END %]
177
178
[% INCLUDE 'intranet-bottom.inc' %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/serials/serials-search.tt (-15 / +1 lines)
Lines 75-95 Link Here
75
                  <label for="to">Expires before:</label>
75
                  <label for="to">Expires before:</label>
76
                  <input type="text" id="to" name="expiration_date_filter" value="[% expiration_date_filter | $KohaDates %]" size="10" maxlength="10" class="datepickerto" />
76
                  <input type="text" id="to" name="expiration_date_filter" value="[% expiration_date_filter | $KohaDates %]" size="10" maxlength="10" class="datepickerto" />
77
                </li>
77
                </li>
78
                [% FOR field IN additional_fields_for_subscription %]
78
                [% INCLUDE 'additional-fields-entry.inc' available=additional_fields_for_subscription values=additional_field_filters wrap_fieldset=0 %]
79
                  <li>
80
                    <label for="additional_field_[% field.id %]"> [% field.name %]: </label>
81
                    [% IF field.authorised_value_choices %]
82
                      <select id="additional_field_[% field.id %]" name="additional_field_[% field.id %]_filter">
83
                        <option value="">All</option>
84
                        [% FOREACH av IN field.authorised_value_choices %]
85
                          <option value="[% av.authorised_value %]">[% av.lib %]</option>
86
                        [% END %]
87
                      </select>
88
                    [% ELSE %]
89
                      <input id="additional_field_[% field.id %]" type="text" value="[% additional_fields.${field.name} %]" name="additional_field_[% field.id %]_filter" />
90
                    [% END %]
91
                  </li>
92
                [% END %]
93
              </ol>
79
              </ol>
94
              <input type="hidden" name="searched" value="1" />
80
              <input type="hidden" name="searched" value="1" />
95
              <fieldset class="action">
81
              <fieldset class="action">
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/serials/subscription-add.tt (-30 / +3 lines)
Lines 436-471 fieldset.rows li.radio { width: 100%; } /* override staff-global.css */ Link Here
436
                            </fieldset>
436
                            </fieldset>
437
437
438
                            [% IF additional_fields_for_subscription %]
438
                            [% IF additional_fields_for_subscription %]
439
                              <div id="subscription_additional_fields">
439
                                <div id="subscription_additional_fields">
440
                                <fieldset class="rows">
440
                                    [% INCLUDE 'additional-fields-entry.inc' available=additional_fields_for_subscription values=additional_fields %]
441
                                  <legend>Additional fields</legend>
441
                                </div>
442
                                  <ol>
443
                                    [% FOR field IN additional_fields_for_subscription %]
444
                                      <li>
445
                                        <label for="additional_field_[% field.id %]"> [% field.name %]: </label>
446
                                        [% IF field.authorised_value_choices %]
447
                                          <select name="additional_field_[% field.id %]" id="additional_field_[% field.id %]">
448
                                            [% FOREACH av IN field.authorised_value_choices %]
449
                                              [% IF av.authorised_value == additional_fields.${field.name} %]
450
                                                <option value="[% av.authorised_value %]" selected="selected">[% av.lib %]</option>
451
                                              [% ELSE %]
452
                                                <option value="[% av.authorised_value %]">[% av.lib %]</option>
453
                                              [% END %]
454
                                            [% END %]
455
                                          </select> (Authorised values for [% field.authorised_value_category %])
456
                                        [% ELSE %]
457
                                          [% IF field.marcfield %]
458
                                            <input type="text" value="[% additional_fields.${field.name} %]" id="additional_field_[% field.id %]" name="additional_field_[% field.id %]" readonly="readonly" />
459
                                            This value will be filled with the [% field.marcfield %] subfield of the selected biblio.
460
                                          [% ELSE %]
461
                                            <input type="text" value="[% additional_fields.${field.name} %]" id="additional_field_[% field.id %]" name="additional_field_[% field.id %]" />
462
                                          [% END %]
463
                                        [% END %]
464
                                      </li>
465
                                    [% END %]
466
                                  </ol>
467
                                </fieldset>
468
                              </div>
469
                            [% END %]
442
                            [% END %]
470
443
471
                            <fieldset class="action">
444
                            <fieldset class="action">
(-)a/serials/serials-search.pl (-15 / +6 lines)
Lines 78-96 if ( $op and $op eq "close" ) { Link Here
78
78
79
79
80
my $additional_fields = Koha::AdditionalField->all( { tablename => 'subscription', searchable => 1 } );
80
my $additional_fields = Koha::AdditionalField->all( { tablename => 'subscription', searchable => 1 } );
81
my $additional_field_filters;
81
my $additional_field_filters = Koha::AdditionalField->get_filters_from_query( {
82
for my $field ( @$additional_fields ) {
82
    tablename => 'subscription',
83
    my $filter_value = $query->param('additional_field_' . $field->{id} . '_filter');
83
    query => $query,
84
    if ( defined $filter_value and $filter_value ne q|| ) {
84
} );
85
        $additional_field_filters->{ $field->{name} } = {
86
            value => $filter_value,
87
            authorised_value_category => $field->{authorised_value_category},
88
        };
89
    }
90
    if ( $field->{authorised_value_category} ) {
91
        $field->{authorised_value_choices} = GetAuthorisedValues( $field->{authorised_value_category} );
92
    }
93
}
94
85
95
my $expiration_date_dt = $expiration_date ? dt_from_string( $expiration_date ) : undef;
86
my $expiration_date_dt = $expiration_date ? dt_from_string( $expiration_date ) : undef;
96
my @subscriptions;
87
my @subscriptions;
Lines 105-111 if ($searched){ Link Here
105
            publisher    => $publisher,
96
            publisher    => $publisher,
106
            bookseller   => $bookseller,
97
            bookseller   => $bookseller,
107
            branch       => $branch,
98
            branch       => $branch,
108
            additional_fields => [ map{ { name => $_, value => $additional_field_filters->{$_}{value}, authorised_value_category => $additional_field_filters->{$_}{authorised_value_category} } } keys %$additional_field_filters ],
99
            additional_fields => $additional_field_filters,
109
            location     => $location,
100
            location     => $location,
110
            expiration_date => $expiration_date_dt,
101
            expiration_date => $expiration_date_dt,
111
        }
102
        }
Lines 145-151 $template->param( Link Here
145
    expiration_date_filter => $expiration_date_dt,
136
    expiration_date_filter => $expiration_date_dt,
146
    done_searched => $searched,
137
    done_searched => $searched,
147
    routing       => $routing,
138
    routing       => $routing,
148
    additional_field_filters => $additional_field_filters,
139
    additional_field_filters => Koha::AdditionalField->get_filters_as_values( $additional_field_filters ),
149
    additional_fields_for_subscription => $additional_fields,
140
    additional_fields_for_subscription => $additional_fields,
150
    marcflavour   => (uc(C4::Context->preference("marcflavour")))
141
    marcflavour   => (uc(C4::Context->preference("marcflavour")))
151
);
142
);
(-)a/serials/subscription-add.pl (-38 / +13 lines)
Lines 134-147 $template->param( Link Here
134
    locations_loop=>$locations_loop,
134
    locations_loop=>$locations_loop,
135
);
135
);
136
136
137
137
$template->param( additional_fields_for_subscription => scalar Koha::AdditionalField->all( { tablename => 'subscription' } ) );
138
my $additional_fields = Koha::AdditionalField->all( { tablename => 'subscription' } );
139
for my $field ( @$additional_fields ) {
140
    if ( $field->{authorised_value_category} ) {
141
        $field->{authorised_value_choices} = GetAuthorisedValues( $field->{authorised_value_category} );
142
    }
143
}
144
$template->param( additional_fields_for_subscription => $additional_fields );
145
138
146
my $typeloop = { map { $_->{itemtype} => $_ } @{ Koha::ItemTypes->search_with_localization->unblessed } };
139
my $typeloop = { map { $_->{itemtype} => $_ } @{ Koha::ItemTypes->search_with_localization->unblessed } };
147
140
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 => $biblionumber, embed_items => 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 430-463 sub redirect_mod_subscription { Link Here
430
        $skip_serialseq, $itemtype, $previousitemtype
427
        $skip_serialseq, $itemtype, $previousitemtype
431
    );
428
    );
432
429
433
    my $additional_fields = Koha::AdditionalField->all( { tablename => 'subscription' } );
430
    Koha::AdditionalField->update_fields_from_query( {
434
    insert_additional_fields( $additional_fields, $biblionumber, $subscriptionid );
431
        tablename => 'subscription',
432
        record_id => $subscriptionid,
433
        query => $query,
434
        marc_record => GetMarcBiblio({ biblionumber => $biblionumber, embed_items => 1 })
435
    } );
435
436
436
    print $query->redirect("/cgi-bin/koha/serials/subscription-detail.pl?subscriptionid=$subscriptionid");
437
    print $query->redirect("/cgi-bin/koha/serials/subscription-detail.pl?subscriptionid=$subscriptionid");
437
    return;
438
    return;
438
}
439
}
439
440
sub insert_additional_fields {
441
    my ( $additional_fields, $biblionumber, $subscriptionid ) = @_;
442
    my $record = GetMarcBiblio({
443
        biblionumber => $biblionumber,
444
        embed_items  => 1 });
445
    for my $field ( @$additional_fields ) {
446
        my $af = Koha::AdditionalField->new({ id => $field->{id} })->fetch;
447
        if ( $af->{marcfield} ) {
448
            my ( $field, $subfield ) = split /\$/, $af->{marcfield};
449
            $af->{values} = undef;
450
            if ( $field and $subfield ) {
451
                my $value = $record->subfield( $field, $subfield );
452
                $af->{values} = {
453
                    $subscriptionid => $value
454
                };
455
            }
456
        } else {
457
            $af->{values} = {
458
                $subscriptionid => scalar $query->param('additional_field_' . $field->{id})
459
            } if defined $query->param('additional_field_' . $field->{id});
460
        }
461
        $af->insert_values;
462
    }
463
}
464
- 

Return to bug 15774