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 2442-2447 sub GetHistory { Link Here
2442
        push @query_params, @$created_by;
2443
        push @query_params, @$created_by;
2443
    }
2444
    }
2444
2445
2446
    if ( @$additional_fields ) {
2447
        my $matching_record_ids_for_additional_fields = Koha::AdditionalField->get_matching_record_ids( {
2448
            fields => $additional_fields,
2449
            tablename => 'aqbasket',
2450
            exact_match => 0,
2451
        } );
2452
        return [] unless @$matching_record_ids_for_additional_fields;
2453
2454
        # No parameterization because record IDs come directly from DB
2455
        $query .= ' AND aqbasket.basketno IN ( ' . join( ',', @$matching_record_ids_for_additional_fields ) . ' )';
2456
    }
2445
2457
2446
    if ( C4::Context->preference("IndependentBranches") ) {
2458
    if ( C4::Context->preference("IndependentBranches") ) {
2447
        unless ( C4::Context->IsSuperLibrarian() ) {
2459
        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 68-73 Link Here
68
    <li><a href="/cgi-bin/koha/admin/didyoumean.pl">Did you mean?</a></li>
68
    <li><a href="/cgi-bin/koha/admin/didyoumean.pl">Did you mean?</a></li>
69
    <li><a href="/cgi-bin/koha/admin/columns_settings.pl">Columns settings</a></li>
69
    <li><a href="/cgi-bin/koha/admin/columns_settings.pl">Columns settings</a></li>
70
    <li><a href="/cgi-bin/koha/admin/audio_alerts.pl">Audio alerts</a></li>
70
    <li><a href="/cgi-bin/koha/admin/audio_alerts.pl">Audio alerts</a></li>
71
    <li><a href="/cgi-bin/koha/admin/additional-fields.pl">Additional fields</a></li>
71
    [% IF Koha.Preference('SMSSendDriver') == 'Email' %]
72
    [% IF Koha.Preference('SMSSendDriver') == 'Email' %]
72
        <li><a href="/cgi-bin/koha/admin/sms_providers.pl">SMS cellular providers</a></li>
73
        <li><a href="/cgi-bin/koha/admin/sms_providers.pl">SMS cellular providers</a></li>
73
    [% END %]
74
    [% 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 278-283 Link Here
278
                    </li>
278
                    </li>
279
                [% END %]
279
                [% END %]
280
280
281
                [% INCLUDE 'additional-fields-display.inc' available=available_additional_fields values=additional_field_values %]
282
281
                </ol>
283
                </ol>
282
                </div>
284
                </div>
283
                [% IF ( closedate ) %]
285
                [% IF ( closedate ) %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basketheader.tt (+5 lines)
Lines 126-131 Link Here
126
                [% END %]
126
                [% END %]
127
            </ol>
127
            </ol>
128
        </fieldset>
128
        </fieldset>
129
130
        [% IF available_additional_fields %]
131
            [% INCLUDE 'additional-fields-entry.inc' available=available_additional_fields values=additional_field_values %]
132
        [% END %]
133
129
        <fieldset class="action">
134
        <fieldset class="action">
130
            <input type="hidden" name="op" value="add_validate" />
135
            <input type="hidden" name="op" value="add_validate" />
131
            <input type="submit" value="Save" />
136
            <input type="submit" value="Save" />
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/histsearch.tt (+3 lines)
Lines 43-48 Link Here
43
            <label for="basketgroupname">Basket group:</label>
43
            <label for="basketgroupname">Basket group:</label>
44
            <input type="text" name="basketgroupname" id="basketgroupname" value="[% basketgroupname %]" />
44
            <input type="text" name="basketgroupname" id="basketgroupname" value="[% basketgroupname %]" />
45
        </li>
45
        </li>
46
47
        [% INCLUDE 'additional-fields-entry.inc' available=available_additional_fields values=additional_field_filters wrap_fieldset=0 %]
48
46
        <li>
49
        <li>
47
          <label for="ordernumber">Order line:</label>
50
          <label for="ordernumber">Order line:</label>
48
          <input type="text" name="ordernumber" id="ordernumber" value="[% ordernumber %]" />
51
          <input type="text" name="ordernumber" id="ordernumber" value="[% ordernumber %]" />
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/additional-fields.tt (+198 lines)
Line 0 Link Here
1
[% USE Asset %]
2
[% USE AuthorisedValues %]
3
[% SET footerjs = 1 %]
4
[% INCLUDE 'doc-head-open.inc' %]
5
<title>Koha &rsaquo; Administration &rsaquo;
6
    [% SWITCH op %]
7
        [% CASE 'add_form' %][% IF field %]Modify additional field '[% field.name %]'[% ELSE %]Add additional field[% END %]
8
        [% CASE %]Manage additional fields
9
    [% END %]
10
</title>
11
[% INCLUDE 'doc-head-close.inc' %]
12
[% Asset.css('css/datatables.css') %]
13
</head>
14
15
<body id="ser_add_fields" class="ser">
16
    [% INCLUDE 'header.inc' %]
17
    [% INCLUDE 'cat-search.inc' %]
18
19
    <div id="breadcrumbs">
20
        <a href="/cgi-bin/koha/mainpage.pl">Home</a> &rsaquo; <a href="/cgi-bin/koha/admin/admin-home.pl">Administration</a> &rsaquo;
21
        [% SWITCH op %]
22
            [% 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 %]
23
            [% CASE 'list' %]<a href="/cgi-bin/koha/admin/additional-fields.pl">Manage additional fields</a> &rsaquo; Modify fields for '[% tablename %]'
24
            [% CASE %]Manage additional fields
25
        [% END %]
26
    </div>
27
28
    <div id="doc3" class="yui-t2">
29
    <div id="bd">
30
    <div id="yui-main">
31
    <div class="yui-b">
32
    [% IF op == 'list' %]
33
        <div id="toolbar" class="btn-toolbar">
34
            <a class="btn btn-default btn-sm" id="newfields" href="?op=add_form&amp;tablename=[% tablename %]"><i class="fa fa-plus"></i> Create field</a>
35
        </div>
36
    [% END %]
37
38
    [% IF messages %]
39
        [% FOR message IN messages %]
40
            [% IF message.code == 'insert' %]
41
                [% IF message.number > 0 %]
42
                    <div class="dialog message">The field has been inserted</div>
43
                [% ELSE %]
44
                    <div class="dialog alert">The field could not be inserted. Perhaps the name already exists?</div>
45
                [% END %]
46
            [% ELSIF message.code == 'update' %]
47
                [% IF message.number > 0 %]
48
                    <div class="dialog message">The field has been updated</div>
49
                [% ELSE %]
50
                    <div class="dialog alert">The field could not be updated. Perhaps the name already exists?</div>
51
                [% END %]
52
            [% ELSIF message.code == 'delete' %]
53
                [% IF message.number > 0 %]
54
                    <div class="dialog message">The field has been deleted</div>
55
                [% ELSE %]
56
                    <div class="dialog alert">The field could not be deleted. Check the log for errors.</div>
57
                [% END %]
58
            [% END %]
59
        [% END %]
60
    [% END %]
61
62
    [% IF op == 'list_tables' %]
63
        <h3>Additional fields</h3>
64
        <p>Select a table:</p>
65
        [% BLOCK table_option %]
66
            <li><a href="?tablename=[% value %]">[% content %] (<tt>[% value %]</tt>)</a></li>
67
        [% END %]
68
        <ul>
69
            [% WRAPPER table_option value="aqbasket" %]Order baskets[% END %]
70
            [% WRAPPER table_option value="subscription" %]Subscriptions[% END %]
71
        </ul>
72
    [% ELSIF op == 'list' %]
73
        <h3>Additional fields for '[% tablename %]'</h3>
74
        [% IF fields %]
75
            <table id="fieldst">
76
                <thead>
77
                    <tr>
78
                        <th>Name</th>
79
                        <th>Authorised value category</th>
80
                        <th>MARC field</th>
81
                        <th>Searchable</th>
82
                        <th>Actions</th>
83
                    </tr>
84
                </thead>
85
                <tbody>
86
                    [% FOR field IN fields %]
87
                        <tr>
88
                            <td>[% field.name %]</td>
89
                            <td>[% field.authorised_value_category %]</td>
90
                            <td>[% field.marcfield %]</td>
91
                            <td>
92
                                [% IF field.searchable %]Yes[% ELSE %]No[% END %]
93
                            </td>
94
                            <td class="actions">
95
                                <a class="btn btn-default btn-xs" href="?op=add_form&amp;field_id=[% field.id %]"><i class="fa fa-pencil"></i> Edit</a>
96
                                <a class="confirmdelete btn btn-default btn-xs" href="?op=delete&amp;field_id=[% field.id %]"><i class="fa fa-trash"></i> Delete</a>
97
                            </td>
98
                        </tr>
99
                    [% END %]
100
                </tbody>
101
            </table>
102
        [% ELSE %]
103
            [% IF tablename %]There are no additional fields defined for this table.[% END %]
104
        [% END %]
105
    [% ELSIF op == 'add_form' %]
106
        [% IF field %]
107
            <h3>Modify field</h3>
108
        [% ELSE %]
109
            <h3>Add field</h3>
110
        [% END %]
111
        <form action="" name="add_form" id="add_field" method="post">
112
            <fieldset class="rows">
113
                <ol>
114
                    <li>
115
                        <label for="name" class="required">Name: </label>
116
                        <input type="text" name="name" id="name" value="[% field.name | html %]" class="required" required="required" />
117
                        <span class="required">Required</span>
118
                    </li>
119
                    <li>
120
                        <label for="av">Authorised value category: </label>
121
                        <select name="authorised_value_category">
122
                            <option value="">None</option>
123
                            [% PROCESS options_for_authorised_value_categories
124
                                authorised_value_categories = AuthorisedValues.GetCategories({
125
                                    selected => field.authorised_value_category
126
                                })
127
                            %]
128
                        </select>
129
                    </li>
130
                    <li>
131
                        <label for="marcfield">MARC field: </label>
132
                        <input type="text" name="marcfield" id="marcfield" value="[% field.marcfield %]" />
133
                    </li>
134
                    <li>
135
                        <label for="searchable">Searchable: </label>
136
                        [% IF field.searchable %]
137
                            <input type="checkbox" name="searchable" id="searchable" checked="checked" />
138
                        [% ELSE %]
139
                            <input type="checkbox" name="searchable" id="searchable" />
140
                        [% END %]
141
                    </li>
142
                </ol>
143
            </fieldset>
144
            <fieldset class="action">
145
                [% IF field %]
146
                    <input type="hidden" name="field_id" value="[% field.id %]" />
147
                [% END %]
148
                <input type="hidden" name="tablename" value="[% tablename %]" />
149
                <input type="hidden" name="op" value="add" />
150
                <input type="submit" value="Save" />
151
                <a href="?tablename=[% tablename %]" class="cancel">Cancel</a>
152
            </fieldset>
153
        </form>
154
    [% END %]
155
156
    </div>
157
    </div>
158
159
<div class="yui-b">
160
[% INCLUDE 'admin-menu.inc' %]
161
</div>
162
</div>
163
164
[% MACRO jsinclude BLOCK %]
165
    [% INCLUDE "datatables.inc" %]
166
    <script type="text/javascript">
167
        $(document).ready(function(){
168
            $('#selecttable').find(":submit").hide();
169
            $('#selecttable select').change(function() {
170
                $('#selecttable').submit();
171
            });
172
173
            $("#fieldst").dataTable($.extend(true, {}, dataTablesDefaults, {
174
                'bAutoWidth': false,
175
                'sDom': 't<"bottom pager"ilpf>',
176
                'sPaginationType': 'four_button',
177
                'aLengthMenu': [[10, 20, 50, 100, -1], [10, 20, 50, 100, "All"]],
178
                'iDisplayLength': 20,
179
                'aaSorting': [[ 0, "asc" ]],
180
            }));
181
182
            $(".confirmdelete").click(function(){
183
                return confirm(_("Are you sure you want to delete this field?"));
184
            });
185
186
            $("#add_field").on('submit', function(){
187
                if ( $("#marcfield").val().length > 0
188
                    && $("select[name='authorised_value_category']" ).val().length > 0 ) {
189
                    alert("You cannot select an authorised value category and a marcfield");
190
                    return false;
191
                }
192
                return true;
193
            });
194
        });
195
    </script>
196
[% END %]
197
198
[% INCLUDE 'intranet-bottom.inc' %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt (+2 lines)
Lines 130-135 Link Here
130
                    [% END %]
130
                    [% END %]
131
                    <dt><a href="/cgi-bin/koha/admin/usage_statistics.pl">Share your usage statistics</a></dt>
131
                    <dt><a href="/cgi-bin/koha/admin/usage_statistics.pl">Share your usage statistics</a></dt>
132
                    <dd>Share with the Koha community the usage statistics of your Koha installation.</dd>
132
                    <dd>Share with the Koha community the usage statistics of your Koha installation.</dd>
133
                    <dt><a href="/cgi-bin/koha/admin/additional-fields.pl">Additional fields</a></dt>
134
                    <dd>Add additional fields to certain tables</dd>
133
                </dl>
135
                </dl>
134
            </div>
136
            </div>
135
        </div>
137
        </div>
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/serials/add_fields.tt (-179 lines)
Lines 1-179 Link Here
1
[% USE Asset %]
2
[% USE AuthorisedValues %]
3
[% SET footerjs = 1 %]
4
[% INCLUDE 'doc-head-open.inc' %]
5
<title>Koha &rsaquo; Serials &rsaquo; Manage new fields for subscriptions
6
  [% IF op == "list" %] &rsaquo; List of fields
7
  [% ELSIF op == "add_form" %]
8
    [% IF field %] &rsaquo; Modify field
9
    [% ELSE %] &rsaquo; Add field
10
    [% END %]
11
  [% END %]
12
</title>
13
[% INCLUDE 'doc-head-close.inc' %]
14
[% Asset.css("css/datatables.css") %]
15
</head>
16
17
<body id="ser_add_fields" class="ser">
18
  [% INCLUDE 'header.inc' %]
19
  [% INCLUDE 'serials-search.inc' %]
20
21
  <div id="breadcrumbs">
22
    <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
23
  </div>
24
25
  <div id="doc3" class="yui-t2">
26
  <div id="bd">
27
  <div id="yui-main">
28
  <div class="yui-b">
29
  [% IF op == 'list' %]
30
    <div id="toolbar" class="btn-toolbar">
31
      <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>
32
    </div>
33
  [% END %]
34
35
  [% IF messages %]
36
    [% FOR message IN messages %]
37
      [% IF message.code == 'insert' %]
38
        [% IF message.number > 0 %]
39
          <div class="dialog message">Field created.</div>
40
        [% ELSE %]
41
          <div class="dialog alert">The field could not be created. Perhaps the name already exists?</div>
42
        [% END %]
43
      [% ELSIF message.code == 'update' %]
44
        [% IF message.number > 0 %]
45
          <div class="dialog message">Field updated.</div>
46
        [% ELSE %]
47
          <div class="dialog alert">The field could not be updated. Perhaps the name already exists?</div>
48
        [% END %]
49
      [% ELSIF message.code == 'delete' %]
50
        [% IF message.number > 0 %]
51
          <div class="dialog message">Field deleted.</div>
52
        [% ELSE %]
53
          <div class="dialog alert">The field could not be deleted. Check the log for errors.</div>
54
        [% END %]
55
      [% END %]
56
    [% END %]
57
  [% END %]
58
59
  [% IF op == 'list' %]
60
    <h3>Additional fields for subscriptions</h3>
61
    [% IF fields %]
62
      <table id="fieldst">
63
        <thead>
64
          <tr>
65
            <th>Name</th>
66
            <th>Authorised value category</th>
67
            <th>Marc field</th>
68
            <th>Searchable</th>
69
            <th>Actions</th>
70
          </tr>
71
        </thead>
72
        <tbody>
73
          [% FOR field IN fields %]
74
            <tr>
75
              <td>[% field.name %]</td>
76
              <td>[% field.authorised_value_category %]</td>
77
              <td>[% field.marcfield %]</td>
78
              <td>
79
                [% IF field.searchable %]Yes[% ELSE %]No[% END %]
80
              </td>
81
              <td class="actions">
82
                <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>
83
                <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>
84
              </td>
85
            </tr>
86
          [% END %]
87
        </tbody>
88
      </table>
89
    [% ELSE %]
90
      There is no field defined.
91
    [% END %]
92
  [% ELSIF op == 'add_form' %]
93
    [% IF field %]
94
      <h3>Modify field</h3>
95
    [% ELSE %]
96
      <h3>Add field</h3>
97
    [% END %]
98
    <form action="/cgi-bin/koha/serials/add_fields.pl" name="add_form" id="add_field" method="post">
99
      <fieldset class="rows">
100
        <ol>
101
          <li>
102
            <label for="name" class="required">Name: </label>
103
            <input type="text" name="name" id="name" value="[% field.name | html %]" class="required" required="required" />
104
            <span class="required">Required</span>
105
          </li>
106
          <li>
107
            <label for="av">Authorised value category: </label>
108
            <select name="authorised_value_category">
109
              <option value="">None</option>
110
              [% PROCESS options_for_authorised_value_categories authorised_value_categories => AuthorisedValues.GetCategories( selected => field.authorised_value_category ) %]
111
            </select>
112
          </li>
113
          <li>
114
            <label for="marcfield">Marc field: </label>
115
            <input type="text" name="marcfield" id="marcfield" value="[% field.marcfield| html %]" />
116
          </li>
117
          <li>
118
            <label for="searchable">Searchable: </label>
119
            [% IF field.searchable %]
120
              <input type="checkbox" name="searchable" id="searchable" checked="checked" />
121
            [% ELSE %]
122
              <input type="checkbox" name="searchable" id="searchable" />
123
            [% END %]
124
          </li>
125
        </ol>
126
      </fieldset>
127
      <fieldset class="action">
128
        [% IF field %]
129
          <input type="hidden" name="field_id" value="[% field.id %]" />
130
        [% END %]
131
        <input type="hidden" name="op" value="add" />
132
        <input type="submit" value="Save" />
133
        <a href="/cgi-bin/koha/serials/add_fields.pl" class="cancel">Cancel</a>
134
      </fieldset>
135
    </form>
136
  [% END %]
137
138
  </div>
139
  </div>
140
141
<div class="yui-b">
142
[% INCLUDE 'serials-menu.inc' %]
143
</div>
144
</div>
145
146
[% MACRO jsinclude BLOCK %]
147
    [% INCLUDE "datatables.inc" %]
148
    <script type="text/javascript">
149
        $(document).ready(function(){
150
151
            $("#fieldst").dataTable($.extend(true, {}, dataTablesDefaults, {
152
                'bAutoWidth': false,
153
                'sDom': 't<"bottom pager"ilpf>',
154
                'sPaginationType': 'four_button',
155
                'aLengthMenu': [[10, 20, 50, 100, -1], [10, 20, 50, 100, "All"]],
156
                'iDisplayLength': 20,
157
                'aaSorting': [[ 0, "asc" ]],
158
                "aoColumnDefs": [
159
                    { "aTargets": [ -1 ], "bSortable": false, "bSearchable": false },
160
                ]
161
            }));
162
163
            $(".confirmdelete").click(function(){
164
                return confirm(_("Are you sure you want to delete this field?"));
165
            });
166
167
            $("#add_field").on('submit', function(){
168
                if ( $("#marcfield").val().length > 0
169
                    && $("select[name='authorised_value_category']" ).val().length > 0 ) {
170
                    alert("You cannot select an authorised value category and a marcfield");
171
                    return false;
172
                }
173
                return true;
174
            });
175
        });
176
    </script>
177
[% END %]
178
179
[% INCLUDE 'intranet-bottom.inc' %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/serials/serials-search.tt (-15 / +1 lines)
Lines 256-276 Link Here
256
                  <label for="to">Expires before:</label>
256
                  <label for="to">Expires before:</label>
257
                  <input type="text" id="to" name="expiration_date_filter" value="[% expiration_date_filter | $KohaDates %]" size="10" maxlength="10" class="datepickerto" />
257
                  <input type="text" id="to" name="expiration_date_filter" value="[% expiration_date_filter | $KohaDates %]" size="10" maxlength="10" class="datepickerto" />
258
                </li>
258
                </li>
259
                [% FOR field IN additional_fields_for_subscription %]
259
                [% INCLUDE 'additional-fields-entry.inc' available=additional_fields_for_subscription values=additional_field_filters wrap_fieldset=0 %]
260
                  <li>
261
                    <label for="additional_field_[% field.id %]"> [% field.name %]: </label>
262
                    [% IF field.authorised_value_choices %]
263
                      <select id="additional_field_[% field.id %]" name="additional_field_[% field.id %]_filter">
264
                        <option value="">All</option>
265
                        [% FOREACH av IN field.authorised_value_choices %]
266
                          <option value="[% av.authorised_value %]">[% av.lib %]</option>
267
                        [% END %]
268
                      </select>
269
                    [% ELSE %]
270
                      <input id="additional_field_[% field.id %]" type="text" value="[% additional_fields.${field.name} %]" name="additional_field_[% field.id %]_filter" />
271
                    [% END %]
272
                  </li>
273
                [% END %]
274
              </ol>
260
              </ol>
275
              <input type="hidden" name="searched" value="1" />
261
              <input type="hidden" name="searched" value="1" />
276
              <fieldset class="action">
262
              <fieldset class="action">
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/serials/subscription-add.tt (-30 / +3 lines)
Lines 437-472 fieldset.rows li.radio { width: 100%; } /* override staff-global.css */ Link Here
437
                            </fieldset>
437
                            </fieldset>
438
438
439
                            [% IF additional_fields_for_subscription %]
439
                            [% IF additional_fields_for_subscription %]
440
                              <div id="subscription_additional_fields">
440
                                <div id="subscription_additional_fields">
441
                                <fieldset class="rows">
441
                                    [% INCLUDE 'additional-fields-entry.inc' available=additional_fields_for_subscription values=additional_fields %]
442
                                  <legend>Additional fields</legend>
442
                                </div>
443
                                  <ol>
444
                                    [% FOR field IN additional_fields_for_subscription %]
445
                                      <li>
446
                                        <label for="additional_field_[% field.id %]"> [% field.name %]: </label>
447
                                        [% IF field.authorised_value_choices %]
448
                                          <select name="additional_field_[% field.id %]" id="additional_field_[% field.id %]">
449
                                            [% FOREACH av IN field.authorised_value_choices %]
450
                                              [% IF av.authorised_value == additional_fields.${field.name} %]
451
                                                <option value="[% av.authorised_value %]" selected="selected">[% av.lib %]</option>
452
                                              [% ELSE %]
453
                                                <option value="[% av.authorised_value %]">[% av.lib %]</option>
454
                                              [% END %]
455
                                            [% END %]
456
                                          </select> (Authorised values for [% field.authorised_value_category %])
457
                                        [% ELSE %]
458
                                          [% IF field.marcfield %]
459
                                            <input type="text" value="[% additional_fields.${field.name} %]" id="additional_field_[% field.id %]" name="additional_field_[% field.id %]" readonly="readonly" />
460
                                            This value will be filled with the [% field.marcfield %] subfield of the selected biblio.
461
                                          [% ELSE %]
462
                                            <input type="text" value="[% additional_fields.${field.name} %]" id="additional_field_[% field.id %]" name="additional_field_[% field.id %]" />
463
                                          [% END %]
464
                                        [% END %]
465
                                      </li>
466
                                    [% END %]
467
                                  </ol>
468
                                </fieldset>
469
                              </div>
470
                            [% END %]
443
                            [% END %]
471
444
472
                            <fieldset class="action">
445
                            <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, $itemtype, $previousitemtype
339
        $skip_serialseq, $itemtype, $previousitemtype
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