Bug 32030: Link agreements to a package
authorJonathan Druart <jonathan.druart@bugs.koha-community.org>
Mon, 23 May 2022 12:29:20 +0000 (14:29 +0200)
committerTomas Cohen Arazi <tomascohen@theke.io>
Tue, 8 Nov 2022 12:43:58 +0000 (09:43 -0300)
Signed-off-by: Jonathan Field <jonathan.field@ptfs-europe.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
Koha/ERM/Package.pm
Koha/ERM/Package/Agreement.pm [new file with mode: 0644]
Koha/ERM/Package/Agreements.pm [new file with mode: 0644]
Koha/REST/V1/ERM/Packages.pm
api/v1/swagger/definitions/erm_package.yaml
api/v1/swagger/definitions/erm_package_agreement.yaml [new file with mode: 0644]
api/v1/swagger/paths/erm_packages.yaml
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/PackageAgreements.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/PackagesFormAdd.vue
koha-tmpl/intranet-tmpl/prog/js/vue/fetch.js

index 359e090..52680c5 100644 (file)
@@ -21,6 +21,8 @@ use Koha::Database;
 
 use base qw(Koha::Object);
 
+use Koha::ERM::Package::Agreements;
+
 =head1 NAME
 
 Koha::ERM::Package - Koha ERM Package Object class
@@ -29,8 +31,32 @@ Koha::ERM::Package - Koha ERM Package Object class
 
 =head2 Class Methods
 
+=head3 package_agreements
+
+Returns the package agreements link for this package
+
 =cut
 
+sub package_agreements {
+    my ( $self, $package_agreements ) = @_;
+
+    if ( $package_agreements ) {
+        my $schema = $self->_result->result_source->schema;
+        $schema->txn_do(
+            sub {
+                $self->package_agreements->delete;
+
+                for my $package_agreement (@$package_agreements) {
+                    $self->_result->add_to_erm_packages_agreements($package_agreement);
+                }
+            }
+        );
+    }
+
+    my $agreements_rs = $self->_result->erm_packages_agreements;
+    return Koha::ERM::Package::Agreements->_new_from_dbic($agreements_rs);
+}
+
 =head2 Internal methods
 
 =head3 _type
diff --git a/Koha/ERM/Package/Agreement.pm b/Koha/ERM/Package/Agreement.pm
new file mode 100644 (file)
index 0000000..8b421ed
--- /dev/null
@@ -0,0 +1,58 @@
+package Koha::ERM::Package::Agreement;
+
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# Koha is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
+
+use Modern::Perl;
+
+use Koha::Database;
+
+use Koha::ERM::Agreement;
+
+use base qw(Koha::Object);
+
+=head1 NAME
+
+Koha::ERM::Package::Agreement - Koha Package Agreement Object class
+
+=head1 API
+
+=head2 Class Methods
+
+=cut
+
+=head3 agreement
+
+Return the agreement linked to this package agreement
+
+=cut
+
+sub agreement {
+    my ( $self ) = @_;
+    my $agreement_rs = $self->_result->agreement;
+    return Koha::ERM::Agreement->_new_from_dbic($agreement_rs);
+}
+
+=head2 Internal methods
+
+=head3 _type
+
+=cut
+
+sub _type {
+    return 'ErmPackagesAgreement';
+}
+
+1;
diff --git a/Koha/ERM/Package/Agreements.pm b/Koha/ERM/Package/Agreements.pm
new file mode 100644 (file)
index 0000000..62dbacc
--- /dev/null
@@ -0,0 +1,49 @@
+package Koha::ERM::Package::Agreements;
+
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# Koha is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
+
+use Modern::Perl;
+
+
+use Koha::Database;
+
+use Koha::ERM::Package::Agreement;
+
+use base qw(Koha::Objects);
+
+=head1 NAME
+
+Koha::ERM::Package::Agreements - Koha Package Agreement Object set class
+
+=head1 API
+
+=head2 Class Methods
+
+=cut
+
+=head3 type
+
+=cut
+
+sub _type {
+    return 'ErmPackageAgreement';
+}
+
+sub object_class {
+    return 'Koha::ERM::Package::Agreement';
+}
+
+1;
index 3e16a92..721994b 100644 (file)
@@ -91,7 +91,10 @@ sub add {
 
                 my $body = $c->validation->param('body');
 
+                my $package_agreements = delete $body->{package_agreements} // [];
+
                 my $package = Koha::ERM::Package->new_from_api($body)->store;
+                $package->package_agreements($package_agreements);
 
                 $c->res->headers->location($c->req->url->to_string . '/' . $package->package_id);
                 return $c->render(
@@ -163,7 +166,10 @@ sub update {
 
                 my $body = $c->validation->param('body');
 
+                my $package_agreements = delete $body->{package_agreements} // [];
+
                 $package->set_from_api($body)->store;
+                $package->package_agreements($package_agreements);
 
                 $c->res->headers->location($c->req->url->to_string . '/' . $package->package_id);
                 return $c->render(
index 629b72a..2ce6417 100644 (file)
@@ -33,6 +33,11 @@ properties:
     type:
       - string
       - "null"
+  package_agreements:
+    type: array
+    description: agreements
+    items:
+      $ref: erm_package_agreement.yaml
 
 additionalProperties: false
 required:
diff --git a/api/v1/swagger/definitions/erm_package_agreement.yaml b/api/v1/swagger/definitions/erm_package_agreement.yaml
new file mode 100644 (file)
index 0000000..73233b5
--- /dev/null
@@ -0,0 +1,14 @@
+---
+type: object
+properties:
+  package_id:
+    type: integer
+    description: foreign key to package
+    readOnly: true
+  agreement_id:
+    description: foreign key to agreement
+    type: integer
+
+additionalProperties: false
+required:
+  - agreement_id
index 8ec0ef0..cbea401 100644 (file)
     x-koha-authorization:
       permissions:
         erm: 1
+    x-koha-embed:
+      - agreements
   put:
     x-mojo-to: ERM::Packages#update
     operationId: updateErmPackages
         required: true
         schema:
           $ref: "../swagger.yaml#/definitions/erm_package"
-
     responses:
       200:
         description: A successfully updated package
     x-koha-authorization:
       permissions:
         erm: 1
+    x-koha-embed:
+      - agreements
   delete:
     x-mojo-to: ERM::Packages#delete
     operationId: deleteErmPackages
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/PackageAgreements.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/PackageAgreements.vue
new file mode 100644 (file)
index 0000000..544c874
--- /dev/null
@@ -0,0 +1,87 @@
+<template>
+    <fieldset class="rows" id="package_agreements">
+        <legend>{{ $t("Agreements") }}</legend>
+        <fieldset
+            class="rows"
+            v-for="(package_agreement, counter) in package_agreements"
+            v-bind:key="counter"
+        >
+            <legend>
+                {{ $t("Agreement.counter", { counter: counter + 1 }) }}
+                <a href="#" @click.prevent="deleteAgreement(counter)"
+                    ><i class="fa fa-trash"></i>
+                    {{ $t("Remove this agreement") }}</a
+                >
+            </legend>
+            <ol>
+                <li>
+                    <label :for="`agreement_id_${counter}`"
+                        >{{ $t("Agreement:") }}
+                    </label>
+                    <select
+                        v-model="package_agreement.agreement_id"
+                        :id="`agreement_id_${counter}`"
+                        required
+                    >
+                        <option value=""></option>
+                        <option
+                            v-for="agreement in agreements"
+                            :key="agreement.agreement_id"
+                            :value="agreement.agreement_id"
+                            :selected="
+                                agreement.agreement_id ==
+                                package_agreement.agreement_id
+                                    ? true
+                                    : false
+                            "
+                        >
+                            {{ agreement.name }}
+                        </option>
+                    </select>
+                    <span class="required">{{ $t("Required") }}</span>
+                </li>
+            </ol>
+        </fieldset>
+        <a
+            v-if="agreements.length"
+            class="btn btn-default"
+            @click="addAgreement"
+            ><font-awesome-icon icon="plus" />
+            {{ $t("Add new agreement") }}</a
+        >
+        <span v-else>{{
+            $t("There are no agreements created yet")
+        }}</span>
+    </fieldset>
+</template>
+
+<script>
+import { fetchAgreements } from "../../fetch"
+
+export default {
+    data() {
+        return {
+            agreements: [],
+        }
+    },
+    beforeCreate() {
+        fetchAgreements().then((agreements) => {
+            this.agreements = agreements
+        })
+    },
+    methods: {
+        addAgreement() {
+            this.package_agreements.push({
+                agreement_id: null,
+            })
+        },
+        deleteAgreement(counter) {
+            this.package_agreements.splice(counter, 1)
+        },
+    },
+    props: {
+        package_agreements: Array,
+    },
+    name: 'PackageAgreements',
+}
+</script>
\ No newline at end of file
index 09a52c3..43a7131 100644 (file)
@@ -92,7 +92,7 @@
                         </li>
 
                         <PackageAgreements
-                            :package_agreements="erm_package.agreements"
+                            :package_agreements="erm_package.package_agreements"
                         />
                     </ol>
                 </fieldset>
@@ -142,6 +142,7 @@ export default {
                 external_package_id: null,
                 package_type: '',
                 content_type: '',
+                package_agreements: [],
             },
             initialized: false,
         }
@@ -174,6 +175,8 @@ export default {
             }
             delete erm_package.package_id
 
+            erm_package.package_agreements = erm_package.package_agreements.map(({ package_id, agreement, ...keepAttrs }) => keepAttrs)
+
             const options = {
                 method: method,
                 body: JSON.stringify(erm_package),
@@ -198,9 +201,9 @@ export default {
                 }).catch(e => { console.log(e) })
         },
     },
-    components: [
+    components: {
         PackageAgreements,
-    ],
+    },
     name: "PackagesFormAdd",
 }
 </script>
\ No newline at end of file
index a321c5b..07ab02a 100644 (file)
@@ -108,7 +108,11 @@ export const fetchPackage = async function (package_id) {
     if (!package_id) return;
     const apiUrl = "/api/v1/erm/packages/" + package_id;
     let erm_package;
-    await fetch(apiUrl)
+    await fetch(apiUrl, {
+        headers: {
+            "x-koha-embed": "package_agreements,package_agreements.agreement",
+        },
+    })
         .then((res) => res.json())
         .then(
             (result) => {