Bug 30650: Be more flexible with opening slots
[koha.git] / admin / branches.pl
1 #!/usr/bin/perl
2
3 # Copyright 2000-2002 Katipo Communications
4 # Copyright 2015 Koha Development Team
5 #
6 # This file is part of Koha.
7 #
8 # Koha is free software; you can redistribute it and/or modify it
9 # under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 3 of the License, or
11 # (at your option) any later version.
12 #
13 # Koha is distributed in the hope that it will be useful, but
14 # WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
17 #
18 # You should have received a copy of the GNU General Public License
19 # along with Koha; if not, see <http://www.gnu.org/licenses>.
20
21 use Modern::Perl;
22
23 use CGI qw ( -utf8 );
24 use Try::Tiny qw( catch try );
25
26 use C4::Auth qw( get_template_and_user );
27 use C4::Context;
28 use C4::Output qw( output_html_with_http_headers );
29 use C4::Koha;
30
31 use Koha::Database;
32 use Koha::Patrons;
33 use Koha::Items;
34 use Koha::Libraries;
35 use Koha::SMTP::Servers;
36
37 my $input        = CGI->new;
38 my $branchcode   = $input->param('branchcode');
39 my $categorycode = $input->param('categorycode');
40 my $op           = $input->param('op') || 'list';
41 my @messages;
42
43 my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
44     {   template_name   => "admin/branches.tt",
45         query           => $input,
46         type            => "intranet",
47         flagsrequired   => { parameters => 'manage_libraries' },
48     }
49 );
50
51 if ( $op eq 'add_form' ) {
52     $template->param(
53         library      => Koha::Libraries->find($branchcode),
54         smtp_servers => Koha::SMTP::Servers->search,
55     );
56 } elsif ( $branchcode && $op eq 'view' ) {
57     my $library = Koha::Libraries->find($branchcode);
58     $template->param(
59         library      => $library,
60     );
61 } elsif ( $op eq 'add_validate' ) {
62     my @fields = qw(
63       branchname
64       branchaddress1
65       branchaddress2
66       branchaddress3
67       branchzip
68       branchcity
69       branchstate
70       branchcountry
71       branchphone
72       branchfax
73       branchemail
74       branchillemail
75       branchreplyto
76       branchreturnpath
77       branchurl
78       issuing
79       branchip
80       branchnotes
81       opac_info
82       marcorgcode
83       pickup_location
84       public
85     );
86     my $is_a_modif = $input->param('is_a_modif');
87
88     if ($is_a_modif) {
89         my $library = Koha::Libraries->find($branchcode);
90         for my $field (@fields) {
91             if ( $field eq 'pickup_location' ) {
92                 # Don't fallback to undef/NULL, default is 1 in DB
93                 $library->$field( scalar $input->param($field) );
94             } else {
95                 $library->$field( scalar $input->param($field) || undef );
96             }
97         }
98
99         try {
100             Koha::Database->new->schema->txn_do(
101                 sub {
102                     $library->store->discard_changes;
103                     # Deal with SMTP server
104                     my $smtp_server_id = $input->param('smtp_server');
105
106                     if ( $smtp_server_id ) {
107                         if ( $smtp_server_id eq '*' ) {
108                             $library->smtp_server({ smtp_server => undef });
109                         }
110                         else {
111                             my $smtp_server = Koha::SMTP::Servers->find( $smtp_server_id );
112                             Koha::Exceptions::BadParameter->throw( parameter => 'smtp_server' )
113                                 unless $smtp_server;
114                             $library->smtp_server({ smtp_server => $smtp_server });
115                         }
116                     }
117
118                     push @messages, { type => 'message', code => 'success_on_update' };
119                 }
120             );
121         }
122         catch {
123             push @messages, { type => 'alert', code => 'error_on_update' };
124         };
125     } else {
126         $branchcode =~ s|\s||g;
127         my $library = Koha::Library->new(
128             {
129                 branchcode => $branchcode,
130                 (
131                     map {
132                         $_ eq 'pickup_location' # Don't fallback to undef/NULL, default is 1 in DB
133                           ? ( $_ => scalar $input->param($_) )
134                           : ( $_ => scalar $input->param($_) || undef )
135                     } @fields
136                 )
137             }
138         );
139
140         try {
141             Koha::Database->new->schema->txn_do(
142                 sub {
143                     $library->store->discard_changes;
144
145                     my $smtp_server_id = $input->param('smtp_server');
146
147                     if ( $smtp_server_id ) {
148                         if ( $smtp_server_id ne '*' ) {
149                             my $smtp_server = Koha::SMTP::Servers->find( $smtp_server_id );
150                             Koha::Exceptions::BadParameter->throw( parameter => 'smtp_server' )
151                                 unless $smtp_server;
152                             $library->smtp_server({ smtp_server => $smtp_server });
153                         }
154                     }
155
156                     push @messages, { type => 'message', code => 'success_on_insert' };
157                 }
158             );
159         }
160         catch {
161             push @messages, { type => 'alert', code => 'error_on_insert' };
162         };
163     }
164     $op = 'list';
165 } elsif ( $op eq 'delete_confirm' ) {
166     my $library       = Koha::Libraries->find($branchcode);
167     my $items_count = Koha::Items->search(
168         {   -or => {
169                 holdingbranch => $branchcode,
170                 homebranch    => $branchcode
171             },
172         }
173     )->count;
174     my $patrons_count = Koha::Patrons->search( { branchcode => $branchcode, } )->count;
175
176     if ( $items_count or $patrons_count ) {
177         push @messages,
178           { type => 'alert',
179             code => 'cannot_delete_library',
180             data => {
181                 items_count   => $items_count,
182                 patrons_count => $patrons_count,
183             },
184           };
185         $op = 'list';
186     } else {
187         $template->param(
188             library       => $library,
189             items_count   => $items_count,
190             patrons_count => $patrons_count,
191         );
192     }
193 } elsif ( $op eq 'delete_confirmed' ) {
194     my $library = Koha::Libraries->find($branchcode);
195
196     my $deleted = eval { $library->delete; };
197
198     if ( $@ or not $deleted ) {
199         push @messages, { type => 'alert', code => 'error_on_delete' };
200     } else {
201         push @messages, { type => 'message', code => 'success_on_delete' };
202     }
203     $op = 'list';
204 } else {
205     $op = 'list';
206 }
207
208 $template->param( libraries_count => Koha::Libraries->search->count )
209     if $op eq 'list';
210
211 $template->param(
212     messages => \@messages,
213     op       => $op,
214 );
215
216 output_html_with_http_headers $input, $cookie, $template->output;