1 package Koha::ERM::Agreement;
3 # This file is part of Koha.
5 # Koha is free software; you can redistribute it and/or modify it
6 # under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 3 of the License, or
8 # (at your option) any later version.
10 # Koha is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with Koha; if not, see <http://www.gnu.org/licenses>.
20 use MIME::Base64 qw( decode_base64 );
24 use Koha::DateUtils qw( dt_from_string );
27 use base qw(Koha::Object);
29 use Koha::ERM::Agreement::Periods;
30 use Koha::ERM::Agreement::UserRoles;
31 use Koha::ERM::Agreement::Licenses;
32 use Koha::ERM::Agreement::Relationships;
33 use Koha::ERM::Agreement::Documents;
34 use Koha::ERM::EHoldings::Package::Agreements;
38 Koha::ERM::Agreement - Koha ErmAgreement Object class
48 Returns the periods for this agreement
53 my ( $self, $periods ) = @_;
56 my $schema = $self->_result->result_source->schema;
59 $self->periods->delete;
61 for my $period (@$periods) {
62 $self->_result->add_to_erm_agreement_periods($period);
68 my $periods_rs = $self->_result->erm_agreement_periods;
69 return Koha::ERM::Agreement::Periods->_new_from_dbic($periods_rs);
74 Returns the user roles for this agreement
79 my ( $self, $user_roles ) = @_;
82 my $schema = $self->_result->result_source->schema;
85 $self->user_roles->delete;
87 for my $user_role (@$user_roles) {
88 $self->_result->add_to_erm_agreement_user_roles($user_role);
93 my $user_roles_rs = $self->_result->erm_agreement_user_roles;
94 return Koha::ERM::Agreement::UserRoles->_new_from_dbic($user_roles_rs);
97 =head3 agreement_licenses
99 Returns the agreement_licenses for this agreement
103 sub agreement_licenses {
104 my ( $self, $agreement_licenses ) = @_;
106 if ( $agreement_licenses ) {
107 my $controlling = grep { $_->{status} eq 'controlling' } @$agreement_licenses;
108 if ( $controlling > 1 ) {
109 Koha::Exceptions::DuplicateObject->throw(
110 "Only one controlling license can exist for a given agreement");
113 my $schema = $self->_result->result_source->schema;
116 $self->agreement_licenses->delete;
118 for my $agreement_license (@$agreement_licenses) {
119 $self->_result->add_to_erm_agreement_licenses($agreement_license);
124 my $agreement_licenses_rs = $self->_result->erm_agreement_licenses;
125 return Koha::ERM::Agreement::Licenses->_new_from_dbic($agreement_licenses_rs);
128 =head3 agreement_relationships
130 Returns the agreement relationships of this agreement
134 sub agreement_relationships {
135 my ( $self, $relationships ) = @_;
137 if ( $relationships ) {
138 my $schema = $self->_result->result_source->schema;
139 # FIXME naming - is "back link" ok?
141 'supersedes' => 'is-superseded-by',
142 'is-superseded-by' => 'supersedes',
143 'provides_post-cancellation_access_for' => 'has-post-cancellation-access-in',
144 'has-post-cancellation-access-in' => 'provides_post-cancellation_access_for',
145 'tracks_demand-driven_acquisitions_for' => 'has-demand-driven-acquisitions-in',
146 'has-demand-driven-acquisitions-in' => 'tracks_demand-driven_acquisitions_for',
147 'has_backfile_in' => 'has_frontfile_in',
148 'has_frontfile_in' => 'has_backfile_in',
149 'related_to' => 'related_to',
153 $self->agreement_relationships->delete;
154 $self->agreement_back_relationships->delete;
156 for my $relationship (@$relationships) {
157 $self->_result->add_to_erm_agreement_relationships_agreements($relationship);
159 agreement_id => $relationship->{related_agreement_id},
160 related_agreement_id => $self->agreement_id,
161 relationship => $back_links->{$relationship->{relationship}},
162 notes => $relationship->{notes}, # FIXME Is it correct, do we keep the note here?
164 $self->_result->add_to_erm_agreement_relationships_related_agreements($back_link);
169 my $related_agreements_rs = $self->_result->erm_agreement_relationships_agreements;
170 return Koha::ERM::Agreement::Relationships->_new_from_dbic($related_agreements_rs);
173 =head3 agreement_back_relationships
175 # FIXME Naming - how is it called?
176 Returns the reverse relationship
180 sub agreement_back_relationships {
182 my $rs = $self->_result->erm_agreement_relationships_related_agreements;
183 return Koha::ERM::Agreement::Relationships->_new_from_dbic($rs);
188 Returns the documents for this agreement
193 my ( $self, $documents ) = @_;
196 my $schema = $self->_result->result_source->schema;
199 my $existing_documents = $self->documents;
201 # FIXME Here we are not deleting all the documents before recreating them, like we do for other related resources.
202 # As we do not want the content of the documents to transit over the network we need to use the document_id (and allow it in the API spec)
203 # to distinguish from each other
204 # Delete all the documents that are not part of the PUT request
205 my $modified_document_ids = [ map { $_->{document_id} || () } @$documents ];
206 $self->documents->search(
208 @$modified_document_ids
211 '-not_in' => $modified_document_ids
218 for my $document (@$documents) {
219 if ( $document->{document_id} ) {
220 # The document already exists in DB
221 $existing_documents->find( $document->{document_id} )
224 file_description => $document->{file_description},
225 physical_location => $document->{physical_location},
226 uri => $document->{uri},
227 notes => $document->{notes},
232 # Creating a whole new document
233 my $file_content = decode_base64( $document->{file_content} );
234 my $mt = MIME::Types->new();
235 $document->{file_type} = $mt->mimeTypeOf( $document->{file_name} );
236 $document->{uploaded_on} //= dt_from_string;
237 $document->{file_content} = $file_content;
238 $self->_result->add_to_erm_agreement_documents( $document);
244 my $documents_rs = $self->_result->erm_agreement_documents;
245 return Koha::ERM::Agreement::Documents->_new_from_dbic($documents_rs);
248 =head3 agreement_packages
250 Return the local packages for this agreement (and the other ones that have an entry locally)
254 sub agreement_packages {
256 my $packages_agreements_rs = $self->_result->erm_eholdings_packages_agreements;
257 return Koha::ERM::EHoldings::Package::Agreements->_new_from_dbic($packages_agreements_rs);
260 =head2 Internal methods
267 return 'ErmAgreement';