2 <div v-if="!initialized">{{ $__("Loading") }}</div>
3 <div v-else id="agreements_add">
4 <h2 v-if="agreement.agreement_id">
5 {{ $__("Edit agreement #%s").format(agreement.agreement_id) }}
7 <h2 v-else>{{ $__("New agreement") }}</h2>
9 <form @submit="onSubmit($event)">
10 <div class="page-section">
11 <fieldset class="rows">
14 <label class="required" for="agreement_name"
15 >{{ $__("Agreement name") }}:</label
19 v-model="agreement.name"
20 :placeholder="$__('Agreement name')"
23 <span class="required">{{
28 <label for="agreement_vendor_id"
29 >{{ $__("Vendor") }}:</label
32 id="agreement_vendor_id"
33 v-model="agreement.vendor_id"
35 :reduce="(vendor) => vendor.id"
40 <label for="agreement_description"
41 >{{ $__("Description") }}:
44 id="agreement_description"
45 v-model="agreement.description"
46 :placeholder="$__('Description')"
51 <span class="required">{{
56 <label for="agreement_status"
57 >{{ $__("Status") }}:</label
61 v-model="agreement.status"
63 :reduce="(av) => av.authorised_value"
64 :options="av_agreement_statuses"
65 @option:selected="onStatusChanged"
66 :required="!agreement.status"
68 <template #search="{ attributes, events }">
70 :required="!agreement.status"
77 <span class="required">{{
82 <label for="agreement_closure_reason"
83 >{{ $__("Closure reason") }}:</label
86 id="agreement_closure_reason"
87 v-model="agreement.closure_reason"
89 :reduce="(av) => av.authorised_value"
90 :options="av_agreement_closure_reasons"
92 agreement.status == 'closed'
100 for="agreement_is_perpetual"
102 >{{ $__("Is perpetual") }}:</label
104 <label for="agreement_is_perpetual_yes">
108 id="agreement_is_perpetual_yes"
110 v-model="agreement.is_perpetual"
114 <label for="agreement_is_perpetual_no">
118 id="agreement_is_perpetual_no"
120 v-model="agreement.is_perpetual"
126 <label for="agreement_renewal_priority"
127 >{{ $__("Renewal priority") }}:</label
130 id="agreement_renewal_priority"
131 v-model="agreement.renewal_priority"
133 :reduce="(av) => av.authorised_value"
134 :options="av_agreement_renewal_priorities"
138 <label for="agreement_license_info"
139 >{{ $__("License info") }}:
142 id="agreement_license_info"
143 v-model="agreement.license_info"
144 placeholder="License info"
150 <AgreementPeriods :periods="agreement.periods" />
152 :user_roles="agreement.user_roles"
153 :av_agreement_user_roles="av_agreement_user_roles"
156 :agreement_licenses="agreement.agreement_licenses"
157 :av_agreement_license_statuses="
158 av_agreement_license_statuses
160 :av_agreement_license_location="
161 av_agreement_license_location
164 <AgreementRelationships
165 :agreement_id="agreement.agreement_id"
166 :relationships="agreement.agreement_relationships"
167 :av_agreement_relationships="av_agreement_relationships"
169 <Documents :documents="agreement.documents" />
170 <fieldset class="action">
171 <input type="submit" value="Submit" />
173 to="/cgi-bin/koha/erm/agreements"
176 >{{ $__("Cancel") }}</router-link
185 import { inject } from 'vue'
186 import AgreementPeriods from './AgreementPeriods.vue'
187 import AgreementUserRoles from './AgreementUserRoles.vue'
188 import AgreementLicenses from './AgreementLicenses.vue'
189 import AgreementRelationships from './AgreementRelationships.vue'
190 import Documents from './Documents.vue'
191 import { setMessage, setError, setWarning } from "../../messages"
192 import { fetchAgreement } from '../../fetch'
193 import { storeToRefs } from "pinia"
197 const vendorStore = inject('vendorStore')
198 const { vendors } = storeToRefs(vendorStore)
200 const AVStore = inject('AVStore')
202 av_agreement_statuses,
203 av_agreement_closure_reasons,
204 av_agreement_renewal_priorities,
205 av_agreement_user_roles,
206 av_agreement_license_statuses,
207 av_agreement_license_location,
208 av_agreement_relationships,
209 } = storeToRefs(AVStore)
213 av_agreement_statuses,
214 av_agreement_closure_reasons,
215 av_agreement_renewal_priorities,
216 av_agreement_user_roles,
217 av_agreement_license_statuses,
218 av_agreement_license_location,
219 av_agreement_relationships,
232 renewal_priority: '',
236 agreement_licenses: [],
237 agreement_relationships: [],
243 beforeRouteEnter(to, from, next) {
245 if (to.params.agreement_id) {
246 vm.agreement = vm.getAgreement(to.params.agreement_id)
248 vm.initialized = true
253 async getAgreement(agreement_id) {
254 const agreement = await fetchAgreement(agreement_id)
255 this.agreement = agreement
256 this.initialized = true
258 checkForm(agreement) {
261 let agreement_licenses = agreement.agreement_licenses
262 // Do not use al.license.name here! Its name is not the one linked with al.license_id
263 // At this point al.license is meaningless, form/template only modified al.license_id
264 const license_ids = agreement_licenses.map(al => al.license_id)
265 const duplicate_license_ids = license_ids.filter((id, i) => license_ids.indexOf(id) !== i)
267 if (duplicate_license_ids.length) {
268 errors.push(this.$__("A license is used several times"))
271 const related_agreement_ids = agreement.agreement_relationships.map(rs => rs.related_agreement_id)
272 const duplicate_related_agreement_ids = related_agreement_ids.filter((id, i) => related_agreement_ids.indexOf(id) !== i)
274 if (duplicate_related_agreement_ids.length) {
275 errors.push(this.$__("An agreement is used as relationship several times"))
278 if (agreement_licenses.filter(al => al.status == 'controlling').length > 1) {
279 errors.push(this.$__("Only one controlling license is allowed"))
282 if (agreement_licenses.filter(al => al.status == 'controlling').length > 1) {
283 errors.push(this.$__("Only one controlling license is allowed"))
286 errors.forEach(function (e) {
289 return !errors.length
294 //let agreement= Object.assign( {} ,this.agreement); // copy
295 let agreement = JSON.parse(JSON.stringify(this.agreement)) // copy
297 if (!this.checkForm(agreement)) {
301 let apiUrl = '/api/v1/erm/agreements'
304 if (agreement.agreement_id) {
306 apiUrl += '/' + agreement.agreement_id
308 delete agreement.agreement_id
309 delete agreement.vendor
310 agreement.is_perpetual = agreement.is_perpetual ? true : false
312 if (agreement.vendor_id == "") {
313 agreement.vendor_id = null
316 agreement.periods = agreement.periods.map(({ agreement_id, agreement_period_id, ...keepAttrs }) => keepAttrs)
318 agreement.user_roles = agreement.user_roles.map(({ patron, patron_str, ...keepAttrs }) => keepAttrs)
320 agreement.agreement_licenses = agreement.agreement_licenses.map(({ license, agreement_id, agreement_license_id, ...keepAttrs }) => keepAttrs)
322 agreement.agreement_relationships = agreement.agreement_relationships.map(({ related_agreement, ...keepAttrs }) => keepAttrs)
324 agreement.documents = agreement.documents.map(({ file_type, uploaded_on, ...keepAttrs }) => keepAttrs)
326 delete agreement.agreement_packages
330 body: JSON.stringify(agreement),
332 'Content-Type': 'application/json;charset=utf-8'
336 fetch(apiUrl, options)
338 if (response.status == 200) {
339 this.$router.push("/cgi-bin/koha/erm/agreements")
340 setMessage(this.$__("Agreement updated"))
341 } else if (response.status == 201) {
342 this.$router.push("/cgi-bin/koha/erm/agreements")
343 setMessage(this.$__("Agreement created"))
345 setError(response.message || response.statusText)
354 if (e.authorised_value != 'closed') {
355 this.agreement.closure_reason = ''
363 AgreementRelationships,
366 name: "AgreementsFormAdd",