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

(-)a/Koha/AdditionalField.pm (-10 / +11 lines)
Lines 55-70 sub to_api { Link Here
55
    my ( $self, $params ) = @_;
55
    my ( $self, $params ) = @_;
56
56
57
    my $table_to_resource = {
57
    my $table_to_resource = {
58
        'accountlines:credit'  => 'credit',
58
        'accountlines:credit'   => 'credit',
59
        'accountlines:debit'   => 'debit',
59
        'accountlines:debit'    => 'debit',
60
        'aqbasket'             => 'basket',
60
        'aqbasket'              => 'basket',
61
        'aqinvoices'           => 'invoice',
61
        'aqinvoices'            => 'invoice',
62
        'erm_licenses'         => 'license',
62
        'erm_licenses'          => 'license',
63
        'erm_agreements'       => 'agreement',
63
        'erm_agreements'        => 'agreement',
64
        'erm_packages'         => 'package',
64
        'erm_packages'          => 'package',
65
        'aqorders'             => 'order',
65
        'aqorders'              => 'order',
66
        'aqbooksellers:vendor' => 'vendor',
66
        'aqbooksellers:vendor'  => 'vendor',
67
        'erm_titles'           => 'title'
67
        'erm_titles'            => 'title',
68
        'erm_agreement_periods' => 'agreement_period'
68
    };
69
    };
69
70
70
    my $json = $self->SUPER::to_api($params);
71
    my $json = $self->SUPER::to_api($params);
(-)a/Koha/ERM/Agreement.pm (-1 / +8 lines)
Lines 27-32 use Koha::Acquisition::Bookseller; Link Here
27
27
28
use base qw(Koha::Object::Mixin::AdditionalFields Koha::Object);
28
use base qw(Koha::Object::Mixin::AdditionalFields Koha::Object);
29
29
30
use Koha::ERM::Agreement::Period;
30
use Koha::ERM::Agreement::Periods;
31
use Koha::ERM::Agreement::Periods;
31
use Koha::ERM::Agreement::Licenses;
32
use Koha::ERM::Agreement::Licenses;
32
use Koha::ERM::Agreement::Relationships;
33
use Koha::ERM::Agreement::Relationships;
Lines 60-66 sub periods { Link Here
60
                $self->periods->delete;
61
                $self->periods->delete;
61
62
62
                for my $period (@$periods) {
63
                for my $period (@$periods) {
63
                    $self->_result->add_to_erm_agreement_periods($period);
64
                    my $extended_attributes = delete $period->{extended_attributes} // [];
65
                    my @extended_attributes =
66
                        map { { 'id' => $_->{field_id}, 'value' => $_->{value} } } @{$extended_attributes};
67
                    $period->{agreement_id} = $self->agreement_id;
68
69
                    my $stored_period = Koha::ERM::Agreement::Period->new($period)->store;
70
                    $stored_period->extended_attributes( \@extended_attributes );
64
                }
71
                }
65
            }
72
            }
66
        );
73
        );
(-)a/Koha/ERM/Agreement/Period.pm (-1 / +1 lines)
Lines 19-25 use Modern::Perl; Link Here
19
19
20
use Koha::Database;
20
use Koha::Database;
21
21
22
use base qw(Koha::Object);
22
use base qw(Koha::Object::Mixin::AdditionalFields Koha::Object);
23
23
24
=head1 NAME
24
=head1 NAME
25
25
(-)a/Koha/ERM/Agreement/Periods.pm (-1 / +1 lines)
Lines 21-27 use Koha::Database; Link Here
21
21
22
use Koha::ERM::Agreement::Period;
22
use Koha::ERM::Agreement::Period;
23
23
24
use base qw(Koha::Objects);
24
use base qw(Koha::Objects::Mixin::AdditionalFields Koha::Objects);
25
25
26
=head1 NAME
26
=head1 NAME
27
27
(-)a/Koha/REST/V1/ExtendedAttributeTypes.pm (-10 / +11 lines)
Lines 46-61 sub list { Link Here
46
46
47
    # FIXME: Maybe not the best place for this mapping
47
    # FIXME: Maybe not the best place for this mapping
48
    my $resource_to_table = {
48
    my $resource_to_table = {
49
        basket    => 'aqbasket',
49
        basket           => 'aqbasket',
50
        credit    => 'accountlines:credit',
50
        credit           => 'accountlines:credit',
51
        debit     => 'accountlines:debit',
51
        debit            => 'accountlines:debit',
52
        invoice   => 'aqinvoices',
52
        invoice          => 'aqinvoices',
53
        license   => 'erm_licenses',
53
        license          => 'erm_licenses',
54
        agreement => 'erm_agreements',
54
        agreement        => 'erm_agreements',
55
        package   => 'erm_packages',
55
        package          => 'erm_packages',
56
        order     => 'aqorders',
56
        order            => 'aqorders',
57
        vendor    => 'aqbooksellers:vendor',
57
        vendor           => 'aqbooksellers:vendor',
58
        title     => 'erm_titles'
58
        title            => 'erm_titles',
59
        agreement_period => 'erm_agreement_periods'
59
    };
60
    };
60
61
61
    return try {
62
    return try {
(-)a/Koha/Schema/Result/ErmAgreementPeriod.pm (+33 lines)
Lines 120-125 __PACKAGE__->belongs_to( Link Here
120
# Created by DBIx::Class::Schema::Loader v0.07049 @ 2022-05-25 11:46:59
120
# Created by DBIx::Class::Schema::Loader v0.07049 @ 2022-05-25 11:46:59
121
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:NCQpSw+rp/9B/yOrtLtK6g
121
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:NCQpSw+rp/9B/yOrtLtK6g
122
122
123
__PACKAGE__->has_many(
124
    "additional_field_values",
125
    "Koha::Schema::Result::AdditionalFieldValue",
126
    sub {
127
        my ($args) = @_;
128
129
        return {
130
            "$args->{foreign_alias}.record_id" => { -ident => "$args->{self_alias}.agreement_period_id" },
131
132
            "$args->{foreign_alias}.field_id" =>
133
                { -in => \'(SELECT id FROM additional_fields WHERE tablename="erm_agreement_periods")' },
134
        };
135
    },
136
    { cascade_copy => 0, cascade_delete => 0 },
137
);
138
139
__PACKAGE__->has_many(
140
    "extended_attributes",
141
    "Koha::Schema::Result::AdditionalFieldValue",
142
    sub {
143
        my ($args) = @_;
144
145
        return {
146
            "$args->{foreign_alias}.record_id" => { -ident => "$args->{self_alias}.agreement_period_id" },
147
148
            "$args->{foreign_alias}.field_id" =>
149
                { -in => \'(SELECT id FROM additional_fields WHERE tablename="erm_agreement_periods")' },
150
        };
151
    },
152
    { cascade_copy => 0, cascade_delete => 0 },
153
);
154
155
123
=head2 koha_object_class
156
=head2 koha_object_class
124
157
125
Missing POD for koha_object_class.
158
Missing POD for koha_object_class.
(-)a/api/v1/swagger/definitions/erm_agreement_period.yaml (+10 lines)
Lines 28-33 properties: Link Here
28
    type:
28
    type:
29
      - string
29
      - string
30
      - "null"
30
      - "null"
31
  extended_attributes:
32
    description: Related additional field values
33
    type:
34
      - array
35
    items:
36
      $ref: extended_attribute_value.yaml
37
  _strings:
38
    type:
39
      - object
40
      - "null"
31
additionalProperties: false
41
additionalProperties: false
32
required:
42
required:
33
  - started_on
43
  - started_on
(-)a/api/v1/swagger/paths/erm_agreements.yaml (+2 lines)
Lines 189-194 Link Here
189
          type: string
189
          type: string
190
          enum:
190
          enum:
191
            - periods
191
            - periods
192
            - periods.extended_attributes
193
            - periods+strings
192
            - user_roles
194
            - user_roles
193
            - user_roles.patron
195
            - user_roles.patron
194
            - agreement_licenses
196
            - agreement_licenses
(-)a/api/v1/swagger/paths/extended_attribute_types.yaml (+1 lines)
Lines 25-30 Link Here
25
          - subscription
25
          - subscription
26
          - vendor
26
          - vendor
27
          - title
27
          - title
28
          - agreement_period
28
      - $ref: "../swagger.yaml#/parameters/match"
29
      - $ref: "../swagger.yaml#/parameters/match"
29
      - $ref: "../swagger.yaml#/parameters/order_by"
30
      - $ref: "../swagger.yaml#/parameters/order_by"
30
      - $ref: "../swagger.yaml#/parameters/page"
31
      - $ref: "../swagger.yaml#/parameters/page"
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/additional-fields.tt (-1 / +2 lines)
Lines 30-36 Link Here
30
</head>
30
</head>
31
31
32
[% marcfield_tables = ['subscription', 'aqorders'] %]
32
[% marcfield_tables = ['subscription', 'aqorders'] %]
33
[% searchable_tables = ['subscription', 'aqbasket', 'aqinvoices', 'erm_licenses', 'erm_agreements', 'erm_packages', 'aqbooksellers', 'erm_titles'] %]
33
[% searchable_tables = ['subscription', 'aqbasket', 'aqinvoices', 'erm_licenses', 'erm_agreements', 'erm_packages', 'aqbooksellers', 'erm_titles', 'erm_agreement_periods'] %]
34
[% show_marcfield = marcfield_tables.grep('^' _ tablename _ '$').size ? 1 : 0 %]
34
[% show_marcfield = marcfield_tables.grep('^' _ tablename _ '$').size ? 1 : 0 %]
35
[% show_searchable = searchable_tables.grep('^' _ tablename _ '$').size ? 1 : 0 %]
35
[% show_searchable = searchable_tables.grep('^' _ tablename _ '$').size ? 1 : 0 %]
36
36
Lines 147-152 Link Here
147
                        [% WRAPPER table_option value="erm_licenses" %]Licenses[% END %]
147
                        [% WRAPPER table_option value="erm_licenses" %]Licenses[% END %]
148
                        [% WRAPPER table_option value="erm_packages" %]Packages[% END %]
148
                        [% WRAPPER table_option value="erm_packages" %]Packages[% END %]
149
                        [% WRAPPER table_option value="erm_titles" %]Titles[% END %]
149
                        [% WRAPPER table_option value="erm_titles" %]Titles[% END %]
150
                        [% WRAPPER table_option value="erm_agreement_periods" %]Agreement periods[% END %]
150
                    </ul>
151
                    </ul>
151
                [% END %]
152
                [% END %]
152
                [% IF CAN_user_updatecharges_remaining_permissions || CAN_user_parameters_manage_accounts %]
153
                [% IF CAN_user_updatecharges_remaining_permissions || CAN_user_parameters_manage_accounts %]
(-)a/koha-tmpl/intranet-tmpl/prog/js/fetch/erm-api-client.js (-1 / +1 lines)
Lines 21-27 export class ERMAPIClient { Link Here
21
                    endpoint: "agreements/" + id,
21
                    endpoint: "agreements/" + id,
22
                    headers: {
22
                    headers: {
23
                        "x-koha-embed":
23
                        "x-koha-embed":
24
                            "periods,user_roles,user_roles.patron,agreement_licenses,agreement_licenses.license,agreement_relationships,agreement_relationships.related_agreement,documents,agreement_packages,agreement_packages.package,vendor,extended_attributes,+strings",
24
                            "periods,periods.extended_attributes,periods+strings,user_roles,user_roles.patron,agreement_licenses,agreement_licenses.license,agreement_relationships,agreement_relationships.related_agreement,documents,agreement_packages,agreement_packages.package,vendor,extended_attributes,+strings",
25
                    },
25
                    },
26
                }),
26
                }),
27
            getAll: (query, params) =>
27
            getAll: (query, params) =>
(-)a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/AgreementResource.vue (-10 / +24 lines)
Lines 169-174 export default { Link Here
169
                        type: "table",
169
                        type: "table",
170
                        columnData: "periods",
170
                        columnData: "periods",
171
                        hidden: agreement => !!agreement.periods?.length,
171
                        hidden: agreement => !!agreement.periods?.length,
172
                        includeAdditionalFields: true,
172
                        columns: [
173
                        columns: [
173
                            {
174
                            {
174
                                name: $__("Period start"),
175
                                name: $__("Period start"),
Lines 208-213 export default { Link Here
208
                                ended_on: null,
209
                                ended_on: null,
209
                                cancellation_deadline: null,
210
                                cancellation_deadline: null,
210
                                notes: null,
211
                                notes: null,
212
                                extended_attributes: [],
211
                            },
213
                            },
212
                        },
214
                        },
213
                    },
215
                    },
Lines 251-256 export default { Link Here
251
                            label: $__("Notes"),
253
                            label: $__("Notes"),
252
                            indexRequired: true,
254
                            indexRequired: true,
253
                        },
255
                        },
256
                        {
257
                            name: "additional_fields",
258
                            type: "additional_fields",
259
                            extended_attributes_resource_type:
260
                                "agreement_period",
261
                        },
254
                    ],
262
                    ],
255
                    hideIn: ["List"],
263
                    hideIn: ["List"],
256
                },
264
                },
Lines 781-788 export default { Link Here
781
            }
789
            }
782
790
783
            agreement.periods = agreement.periods.map(
791
            agreement.periods = agreement.periods.map(
784
                ({ agreement_id, agreement_period_id, ...keepAttrs }) =>
792
                ({
785
                    keepAttrs
793
                    agreement_id,
794
                    agreement_period_id,
795
                    _strings,
796
                    ...keepAttrs
797
                }) => keepAttrs
786
            );
798
            );
787
799
788
            agreement.user_roles = agreement.user_roles.map(
800
            agreement.user_roles = agreement.user_roles.map(
Lines 810-827 export default { Link Here
810
            delete agreement.agreement_packages;
822
            delete agreement.agreement_packages;
811
823
812
            if (agreement_id) {
824
            if (agreement_id) {
813
                return baseResource.apiClient.update(agreement, agreement_id).then(
825
                return baseResource.apiClient
814
                    agreement => {
826
                    .update(agreement, agreement_id)
815
                        baseResource.setMessage($__("Agreement updated"));
827
                    .then(
816
                        return agreement
828
                        agreement => {
817
                    },
829
                            baseResource.setMessage($__("Agreement updated"));
818
                    error => {}
830
                            return agreement;
819
                );
831
                        },
832
                        error => {}
833
                    );
820
            } else {
834
            } else {
821
                return baseResource.apiClient.create(agreement).then(
835
                return baseResource.apiClient.create(agreement).then(
822
                    agreement => {
836
                    agreement => {
823
                        baseResource.setMessage($__("Agreement created"));
837
                        baseResource.setMessage($__("Agreement created"));
824
                        return agreement
838
                        return agreement;
825
                    },
839
                    },
826
                    error => {}
840
                    error => {}
827
                );
841
                );
(-)a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ShowElement.vue (-3 / +27 lines)
Lines 55-61 Link Here
55
            <table>
55
            <table>
56
                <thead>
56
                <thead>
57
                    <th
57
                    <th
58
                        v-for="column in attribute.columns"
58
                        v-for="column in tableColumns"
59
                        :key="column.name + 'head'"
59
                        :key="column.name + 'head'"
60
                    >
60
                    >
61
                        {{ column.name }}
61
                        {{ column.name }}
Lines 67-73 Link Here
67
                        v-bind:key="counter"
67
                        v-bind:key="counter"
68
                    >
68
                    >
69
                        <td
69
                        <td
70
                            v-for="dataColumn in attribute.columns"
70
                            v-for="dataColumn in tableColumns"
71
                            :key="dataColumn.name + 'data'"
71
                            :key="dataColumn.name + 'data'"
72
                        >
72
                        >
73
                            <template
73
                            <template
Lines 196-201 export default { Link Here
196
            );
196
            );
197
            return option.description;
197
            return option.description;
198
        });
198
        });
199
        const tableColumns = computed(() => {
200
            const tableData = props.resource[attribute.value.columnData];
201
            const columns = attribute.value.columns;
202
            if (attribute.value.includeAdditionalFields && tableData?.length) {
203
                const additionalFieldColumns = tableData.reduce((acc, curr) => {
204
                    if (curr._strings?.additional_field_values.length) {
205
                        curr._strings.additional_field_values.forEach(av => {
206
                            if (!acc.includes(av.field_label)) {
207
                                acc.push(av.field_label);
208
                            }
209
                            curr[av.field_label] = av.value_str;
210
                        });
211
                    }
212
                    return acc;
213
                }, []);
214
                additionalFieldColumns.forEach(col => {
215
                    columns.push({
216
                        name: col,
217
                        value: col,
218
                    });
219
                });
220
            }
221
            return columns;
222
        });
199
223
200
        return {
224
        return {
201
            ...baseElement,
225
            ...baseElement,
Lines 203-208 export default { Link Here
203
            attribute,
227
            attribute,
204
            formatValue,
228
            formatValue,
205
            radioOptionText,
229
            radioOptionText,
230
            tableColumns,
206
        };
231
        };
207
    },
232
    },
208
    props: {
233
    props: {
209
- 

Return to bug 39438