|
Lines 26-32
use CGI qw ( -utf8 );
Link Here
|
| 26 |
use C4::Auth qw( get_template_and_user haspermission ); |
26 |
use C4::Auth qw( get_template_and_user haspermission ); |
| 27 |
use C4::Barcodes::ValueBuilder; |
27 |
use C4::Barcodes::ValueBuilder; |
| 28 |
use C4::Barcodes; |
28 |
use C4::Barcodes; |
| 29 |
use C4::Biblio qw( GetFrameworkCode GetMarcFromKohaField GetMarcStructure IsMarcStructureInternal ModBiblio ); |
29 |
use C4::Biblio qw( GetFrameworkCode GetMarcFromKohaField GetMarcStructure IsMarcStructureInternal ModBiblio ); |
| 30 |
use C4::Circulation qw( barcodedecode LostItem ); |
30 |
use C4::Circulation qw( barcodedecode LostItem ); |
| 31 |
use C4::Context; |
31 |
use C4::Context; |
| 32 |
use C4::Members; |
32 |
use C4::Members; |
|
Lines 43-55
use Koha::SearchEngine::Indexer;
Link Here
|
| 43 |
use Koha::UI::Form::Builder::Item; |
43 |
use Koha::UI::Form::Builder::Item; |
| 44 |
use Koha::Result::Boolean; |
44 |
use Koha::Result::Boolean; |
| 45 |
|
45 |
|
| 46 |
use Encode qw( encode_utf8 ); |
46 |
use Encode qw( encode_utf8 ); |
| 47 |
use List::MoreUtils qw( any uniq ); |
47 |
use List::MoreUtils qw( any uniq ); |
| 48 |
use List::Util qw( first min ); |
48 |
use List::Util qw( first min ); |
| 49 |
use MARC::File::XML; |
49 |
use MARC::File::XML; |
| 50 |
use MIME::Base64 qw( decode_base64url encode_base64url ); |
50 |
use MIME::Base64 qw( decode_base64url encode_base64url ); |
| 51 |
use Storable qw( freeze thaw ); |
51 |
use Storable qw( freeze thaw ); |
| 52 |
use URI::Escape qw( uri_escape_utf8 ); |
52 |
use URI::Escape qw( uri_escape_utf8 ); |
| 53 |
|
53 |
|
| 54 |
our $dbh = C4::Context->dbh; |
54 |
our $dbh = C4::Context->dbh; |
| 55 |
|
55 |
|
|
Lines 62-76
sub add_item_to_item_group {
Link Here
|
| 62 |
if ( $item_group eq 'create' ) { |
62 |
if ( $item_group eq 'create' ) { |
| 63 |
my $item_group = Koha::Biblio::ItemGroup->new( |
63 |
my $item_group = Koha::Biblio::ItemGroup->new( |
| 64 |
{ |
64 |
{ |
| 65 |
biblio_id => $biblionumber, |
65 |
biblio_id => $biblionumber, |
| 66 |
description => $item_group_description, |
66 |
description => $item_group_description, |
| 67 |
display_order => $display_order, |
67 |
display_order => $display_order, |
| 68 |
} |
68 |
} |
| 69 |
)->store(); |
69 |
)->store(); |
| 70 |
|
70 |
|
| 71 |
$item_group_id = $item_group->id; |
71 |
$item_group_id = $item_group->id; |
| 72 |
} |
72 |
} else { |
| 73 |
else { |
|
|
| 74 |
$item_group_id = $item_group; |
73 |
$item_group_id = $item_group; |
| 75 |
} |
74 |
} |
| 76 |
|
75 |
|
|
Lines 83-89
sub add_item_to_item_group {
Link Here
|
| 83 |
} |
82 |
} |
| 84 |
|
83 |
|
| 85 |
sub get_item_from_template { |
84 |
sub get_item_from_template { |
| 86 |
my ( $template_id ) = @_; |
85 |
my ($template_id) = @_; |
| 87 |
|
86 |
|
| 88 |
my $template = Koha::Item::Templates->find($template_id); |
87 |
my $template = Koha::Item::Templates->find($template_id); |
| 89 |
|
88 |
|
|
Lines 91-97
sub get_item_from_template {
Link Here
|
| 91 |
} |
90 |
} |
| 92 |
|
91 |
|
| 93 |
sub get_item_from_cookie { |
92 |
sub get_item_from_cookie { |
| 94 |
my ( $input ) = @_; |
93 |
my ($input) = @_; |
| 95 |
|
94 |
|
| 96 |
my $item_from_cookie; |
95 |
my $item_from_cookie; |
| 97 |
my $lastitemcookie = $input->cookie('LastCreatedItem'); |
96 |
my $lastitemcookie = $input->cookie('LastCreatedItem'); |
|
Lines 104-134
sub get_item_from_cookie {
Link Here
|
| 104 |
}; |
103 |
}; |
| 105 |
if ($@) { |
104 |
if ($@) { |
| 106 |
$lastitemcookie ||= 'undef'; |
105 |
$lastitemcookie ||= 'undef'; |
| 107 |
warn "Storable::thaw failed to thaw LastCreatedItem-cookie. Cookie value '".encode_base64url($lastitemcookie)."'. Caught error follows: '$@'"; |
106 |
warn "Storable::thaw failed to thaw LastCreatedItem-cookie. Cookie value '" |
|
|
107 |
. encode_base64url($lastitemcookie) |
| 108 |
. "'. Caught error follows: '$@'"; |
| 108 |
} |
109 |
} |
| 109 |
} |
110 |
} |
| 110 |
return $item_from_cookie; |
111 |
return $item_from_cookie; |
| 111 |
} |
112 |
} |
| 112 |
|
113 |
|
| 113 |
my $input = CGI->new; |
114 |
my $input = CGI->new; |
| 114 |
|
115 |
|
| 115 |
my $biblionumber; |
116 |
my $biblionumber; |
| 116 |
my $itemnumber; |
117 |
my $itemnumber; |
| 117 |
if( $input->param('itemnumber') && !$input->param('biblionumber') ){ |
118 |
if ( $input->param('itemnumber') && !$input->param('biblionumber') ) { |
| 118 |
$itemnumber = $input->param('itemnumber'); |
119 |
$itemnumber = $input->param('itemnumber'); |
| 119 |
my $item = Koha::Items->find( $itemnumber ); |
120 |
my $item = Koha::Items->find($itemnumber); |
| 120 |
$biblionumber = $item->biblionumber; |
121 |
$biblionumber = $item->biblionumber; |
| 121 |
} else { |
122 |
} else { |
| 122 |
$biblionumber = $input->param('biblionumber'); |
123 |
$biblionumber = $input->param('biblionumber'); |
| 123 |
$itemnumber = $input->param('itemnumber'); |
124 |
$itemnumber = $input->param('itemnumber'); |
| 124 |
} |
125 |
} |
| 125 |
|
126 |
|
| 126 |
my $biblio = Koha::Biblios->find($biblionumber); |
127 |
my $biblio = Koha::Biblios->find($biblionumber); |
| 127 |
|
128 |
|
| 128 |
my $op = $input->param('op') || q{}; |
129 |
my $op = $input->param('op') || q{}; |
| 129 |
my $hostitemnumber = $input->param('hostitemnumber'); |
130 |
my $hostitemnumber = $input->param('hostitemnumber'); |
| 130 |
my $marcflavour = C4::Context->preference("marcflavour"); |
131 |
my $marcflavour = C4::Context->preference("marcflavour"); |
| 131 |
my $searchid = $input->param('searchid'); |
132 |
my $searchid = $input->param('searchid'); |
|
|
133 |
|
| 132 |
# fast cataloguing datas |
134 |
# fast cataloguing datas |
| 133 |
my $fa_circborrowernumber = $input->param('circborrowernumber'); |
135 |
my $fa_circborrowernumber = $input->param('circborrowernumber'); |
| 134 |
my $fa_barcode = $input->param('barcode'); |
136 |
my $fa_barcode = $input->param('barcode'); |
|
Lines 143-162
our $frameworkcode = &GetFrameworkCode($biblionumber);
Link Here
|
| 143 |
|
145 |
|
| 144 |
# Defining which userflag is needing according to the framework currently used |
146 |
# Defining which userflag is needing according to the framework currently used |
| 145 |
my $userflags; |
147 |
my $userflags; |
| 146 |
if (defined $input->param('frameworkcode')) { |
148 |
if ( defined $input->param('frameworkcode') ) { |
| 147 |
$userflags = ($input->param('frameworkcode') eq 'FA') ? "fast_cataloging" : "edit_items"; |
149 |
$userflags = ( $input->param('frameworkcode') eq 'FA' ) ? "fast_cataloging" : "edit_items"; |
| 148 |
} |
150 |
} |
| 149 |
|
151 |
|
| 150 |
if (not defined $userflags) { |
152 |
if ( not defined $userflags ) { |
| 151 |
$userflags = ($frameworkcode eq 'FA') ? "fast_cataloging" : "edit_items"; |
153 |
$userflags = ( $frameworkcode eq 'FA' ) ? "fast_cataloging" : "edit_items"; |
| 152 |
} |
154 |
} |
| 153 |
|
155 |
|
| 154 |
my ($template, $loggedinuser, $cookie) |
156 |
my ( $template, $loggedinuser, $cookie ) = get_template_and_user( |
| 155 |
= get_template_and_user({template_name => "cataloguing/additem.tt", |
157 |
{ |
| 156 |
query => $input, |
158 |
template_name => "cataloguing/additem.tt", |
| 157 |
type => "intranet", |
159 |
query => $input, |
| 158 |
flagsrequired => {editcatalogue => $userflags}, |
160 |
type => "intranet", |
| 159 |
}); |
161 |
flagsrequired => { editcatalogue => $userflags }, |
|
|
162 |
} |
| 163 |
); |
| 160 |
|
164 |
|
| 161 |
if ( $op eq 'edititem' || $op eq 'dupeitem' ) { |
165 |
if ( $op eq 'edititem' || $op eq 'dupeitem' ) { |
| 162 |
my $item = Koha::Items->find($itemnumber); |
166 |
my $item = Koha::Items->find($itemnumber); |
|
Lines 167-212
if ( $op eq 'edititem' || $op eq 'dupeitem' ) {
Link Here
|
| 167 |
} |
171 |
} |
| 168 |
|
172 |
|
| 169 |
# Does the user have a restricted item editing permission? |
173 |
# Does the user have a restricted item editing permission? |
| 170 |
my $patron = Koha::Patrons->find( $loggedinuser ); |
174 |
my $patron = Koha::Patrons->find($loggedinuser); |
| 171 |
|
175 |
|
| 172 |
my $item = $itemnumber ? Koha::Items->find( $itemnumber ) : undef; |
176 |
my $item = $itemnumber ? Koha::Items->find($itemnumber) : undef; |
| 173 |
if ( $item && !$patron->can_edit_items_from( $item->homebranch ) ) { |
177 |
if ( $item && !$patron->can_edit_items_from( $item->homebranch ) ) { |
| 174 |
print $input->redirect("/cgi-bin/koha/catalogue/detail.pl?biblionumber=$biblionumber"); |
178 |
print $input->redirect("/cgi-bin/koha/catalogue/detail.pl?biblionumber=$biblionumber"); |
| 175 |
exit; |
179 |
exit; |
| 176 |
} |
180 |
} |
| 177 |
|
181 |
|
| 178 |
my $uid = $patron->userid; |
182 |
my $uid = $patron->userid; |
| 179 |
my $restrictededition = $uid ? haspermission($uid, {'editcatalogue' => 'edit_items_restricted'}) : undef; |
183 |
my $restrictededition = $uid ? haspermission( $uid, { 'editcatalogue' => 'edit_items_restricted' } ) : undef; |
|
|
184 |
|
| 180 |
# In case user is a superlibrarian, editing is not restricted |
185 |
# In case user is a superlibrarian, editing is not restricted |
| 181 |
$restrictededition = 0 if ($restrictededition != 0 && C4::Context->IsSuperLibrarian()); |
186 |
$restrictededition = 0 if ( $restrictededition != 0 && C4::Context->IsSuperLibrarian() ); |
|
|
187 |
|
| 182 |
# In case user has fast cataloging permission (and we're in fast cataloging), editing is not restricted |
188 |
# In case user has fast cataloging permission (and we're in fast cataloging), editing is not restricted |
| 183 |
$restrictededition = 0 if ($restrictededition != 0 && $frameworkcode eq 'FA' && haspermission($uid, {'editcatalogue' => 'fast_cataloging'})); |
189 |
$restrictededition = 0 |
|
|
190 |
if ( $restrictededition != 0 |
| 191 |
&& $frameworkcode eq 'FA' |
| 192 |
&& haspermission( $uid, { 'editcatalogue' => 'fast_cataloging' } ) ); |
| 184 |
|
193 |
|
| 185 |
our $tagslib = &GetMarcStructure(1,$frameworkcode); |
194 |
our $tagslib = &GetMarcStructure( 1, $frameworkcode ); |
| 186 |
my $record = $biblio->metadata->record; |
195 |
my $record = $biblio->metadata->record; |
| 187 |
|
196 |
|
| 188 |
output_and_exit_if_error( $input, $cookie, $template, |
197 |
output_and_exit_if_error( |
| 189 |
{ module => 'cataloguing', record => $record } ); |
198 |
$input, $cookie, $template, |
|
|
199 |
{ module => 'cataloguing', record => $record } |
| 200 |
); |
| 190 |
|
201 |
|
| 191 |
my $current_item; |
202 |
my $current_item; |
| 192 |
my $nextop="cud-additem"; |
203 |
my $nextop = "cud-additem"; |
| 193 |
my @errors; # store errors found while checking data BEFORE saving item. |
204 |
my @errors; # store errors found while checking data BEFORE saving item. |
| 194 |
|
205 |
|
| 195 |
# Getting last created item cookie |
206 |
# Getting last created item cookie |
| 196 |
my $prefillitem = C4::Context->preference('PrefillItem'); |
207 |
my $prefillitem = C4::Context->preference('PrefillItem'); |
| 197 |
|
208 |
|
| 198 |
my $load_template_submit = $input->param('load_template_submit'); |
209 |
my $load_template_submit = $input->param('load_template_submit'); |
| 199 |
my $delete_template_submit = $input->param('delete_template_submit'); |
210 |
my $delete_template_submit = $input->param('delete_template_submit'); |
| 200 |
my $unload_template_submit = $input->param('unload_template_submit'); |
211 |
my $unload_template_submit = $input->param('unload_template_submit'); |
| 201 |
my $use_template_for_session = $input->param('use_template_for_session') || $input->cookie('ItemEditorSessionTemplateId'); |
212 |
my $use_template_for_session = |
|
|
213 |
$input->param('use_template_for_session') || $input->cookie('ItemEditorSessionTemplateId'); |
| 202 |
my $template_id = $input->param('template_id') || $input->cookie('ItemEditorSessionTemplateId'); |
214 |
my $template_id = $input->param('template_id') || $input->cookie('ItemEditorSessionTemplateId'); |
| 203 |
if ( $delete_template_submit ) { |
215 |
if ($delete_template_submit) { |
| 204 |
my $t = Koha::Item::Templates->find($template_id); |
216 |
my $t = Koha::Item::Templates->find($template_id); |
| 205 |
$t->delete if $t && ( $t->patron_id eq $loggedinuser || haspermission( $uid, { 'editcatalogue' => 'manage_item_editor_templates' } ) ); |
217 |
$t->delete |
| 206 |
$template_id = undef; |
218 |
if $t |
|
|
219 |
&& ( $t->patron_id eq $loggedinuser |
| 220 |
|| haspermission( $uid, { 'editcatalogue' => 'manage_item_editor_templates' } ) ); |
| 221 |
$template_id = undef; |
| 207 |
$use_template_for_session = undef; |
222 |
$use_template_for_session = undef; |
| 208 |
} |
223 |
} |
| 209 |
if ($load_template_submit || $unload_template_submit) { |
224 |
if ( $load_template_submit || $unload_template_submit ) { |
| 210 |
$op = q{} if $template_id; |
225 |
$op = q{} if $template_id; |
| 211 |
|
226 |
|
| 212 |
$template_id = undef if !$input->param('template_id'); |
227 |
$template_id = undef if !$input->param('template_id'); |
|
Lines 228-291
if ($load_template_submit || $unload_template_submit) {
Link Here
|
| 228 |
$cookie = [ $cookie, $template_cookie ]; |
243 |
$cookie = [ $cookie, $template_cookie ]; |
| 229 |
} |
244 |
} |
| 230 |
$template->param( |
245 |
$template->param( |
| 231 |
template_id => $template_id, |
246 |
template_id => $template_id, |
| 232 |
item_templates => Koha::Item::Templates->get_available($loggedinuser), |
247 |
item_templates => Koha::Item::Templates->get_available($loggedinuser), |
| 233 |
use_template_for_session => $use_template_for_session, |
248 |
use_template_for_session => $use_template_for_session, |
| 234 |
); |
249 |
); |
| 235 |
|
250 |
|
| 236 |
#------------------------------------------------------------------------------- |
251 |
#------------------------------------------------------------------------------- |
| 237 |
if ($op eq "cud-additem") { |
252 |
if ( $op eq "cud-additem" ) { |
| 238 |
|
253 |
|
| 239 |
my $add_submit = $input->param('add_submit'); |
254 |
my $add_submit = $input->param('add_submit'); |
| 240 |
my $add_duplicate_submit = $input->param('add_duplicate_submit'); |
255 |
my $add_duplicate_submit = $input->param('add_duplicate_submit'); |
| 241 |
my $add_multiple_copies_submit = $input->param('add_multiple_copies_submit'); |
256 |
my $add_multiple_copies_submit = $input->param('add_multiple_copies_submit'); |
| 242 |
my $save_as_template_submit = $input->param('save_as_template_submit'); |
257 |
my $save_as_template_submit = $input->param('save_as_template_submit'); |
| 243 |
my $number_of_copies = min( scalar $input->param('number_of_copies') || 0, 1000 ); # TODO refine hardcoded maximum? |
258 |
my $number_of_copies = min( scalar $input->param('number_of_copies') || 0, 1000 ); # TODO refine hardcoded maximum? |
| 244 |
|
259 |
|
| 245 |
my @columns = Koha::Items->columns; |
260 |
my @columns = Koha::Items->columns; |
| 246 |
my $item = Koha::Item->new; |
261 |
my $item = Koha::Item->new; |
| 247 |
$item->biblionumber($biblio->biblionumber); |
262 |
$item->biblionumber( $biblio->biblionumber ); |
| 248 |
for my $c ( @columns ) { |
263 |
for my $c (@columns) { |
| 249 |
if ( $c eq 'more_subfields_xml' ) { |
264 |
if ( $c eq 'more_subfields_xml' ) { |
| 250 |
my @more_subfields_xml = $input->multi_param("items.more_subfields_xml"); |
265 |
my @more_subfields_xml = $input->multi_param("items.more_subfields_xml"); |
| 251 |
my @unlinked_item_subfields; |
266 |
my @unlinked_item_subfields; |
| 252 |
for my $subfield ( @more_subfields_xml ) { |
267 |
for my $subfield (@more_subfields_xml) { |
| 253 |
my $v = $input->param('items.more_subfields_xml_' . $subfield); |
268 |
my $v = $input->param( 'items.more_subfields_xml_' . $subfield ); |
| 254 |
push @unlinked_item_subfields, $subfield, $v; |
269 |
push @unlinked_item_subfields, $subfield, $v; |
| 255 |
} |
270 |
} |
| 256 |
if ( @unlinked_item_subfields ) { |
271 |
if (@unlinked_item_subfields) { |
| 257 |
my $marc = MARC::Record->new(); |
272 |
my $marc = MARC::Record->new(); |
|
|
273 |
|
| 258 |
# use of tag 999 is arbitrary, and doesn't need to match the item tag |
274 |
# use of tag 999 is arbitrary, and doesn't need to match the item tag |
| 259 |
# used in the framework |
275 |
# used in the framework |
| 260 |
$marc->append_fields(MARC::Field->new('999', ' ', ' ', @unlinked_item_subfields)); |
276 |
$marc->append_fields( MARC::Field->new( '999', ' ', ' ', @unlinked_item_subfields ) ); |
| 261 |
$marc->encoding("UTF-8"); |
277 |
$marc->encoding("UTF-8"); |
| 262 |
$item->more_subfields_xml($marc->as_xml("USMARC")); |
278 |
$item->more_subfields_xml( $marc->as_xml("USMARC") ); |
| 263 |
next; |
279 |
next; |
| 264 |
} |
280 |
} |
| 265 |
$item->more_subfields_xml(undef); |
281 |
$item->more_subfields_xml(undef); |
| 266 |
} else { |
282 |
} else { |
| 267 |
next if $c eq 'itemnumber'; |
283 |
next if $c eq 'itemnumber'; |
| 268 |
my @v = grep { $_ ne "" } |
284 |
my @v = grep { $_ ne "" } uniq $input->multi_param( "items." . $c ); |
| 269 |
uniq $input->multi_param( "items." . $c ); |
|
|
| 270 |
|
285 |
|
| 271 |
next unless @v; |
286 |
next unless @v; |
| 272 |
|
287 |
|
| 273 |
if ( $c eq 'permanent_location' ) { # See 27837 |
288 |
if ( $c eq 'permanent_location' ) { # See 27837 |
| 274 |
$item->make_column_dirty('permanent_location'); |
289 |
$item->make_column_dirty('permanent_location'); |
| 275 |
} |
290 |
} |
| 276 |
|
291 |
|
| 277 |
$item->$c(join ' | ', @v); |
292 |
$item->$c( join ' | ', @v ); |
| 278 |
} |
293 |
} |
| 279 |
} |
294 |
} |
| 280 |
|
295 |
|
| 281 |
# if autoBarcode is set to 'incremental', calculate barcode... |
296 |
# if autoBarcode is set to 'incremental', calculate barcode... |
| 282 |
my $submitted_barcode = $item->barcode; |
297 |
my $submitted_barcode = $item->barcode; |
| 283 |
if ( ! defined $item->barcode && C4::Context->preference('autoBarcode') eq 'incremental' ) { |
298 |
if ( !defined $item->barcode && C4::Context->preference('autoBarcode') eq 'incremental' ) { |
| 284 |
my ( $barcode ) = C4::Barcodes::ValueBuilder::incremental::get_barcode; |
299 |
my ($barcode) = C4::Barcodes::ValueBuilder::incremental::get_barcode; |
| 285 |
$item->barcode($barcode); |
300 |
$item->barcode($barcode); |
| 286 |
} |
301 |
} |
| 287 |
|
302 |
|
| 288 |
$item->barcode(barcodedecode($item->barcode)); |
303 |
$item->barcode( barcodedecode( $item->barcode ) ); |
| 289 |
|
304 |
|
| 290 |
if ($save_as_template_submit) { |
305 |
if ($save_as_template_submit) { |
| 291 |
my $template_name = $input->param('template_name'); |
306 |
my $template_name = $input->param('template_name'); |
|
Lines 293-315
if ($op eq "cud-additem") {
Link Here
|
| 293 |
my $replace_template_id = $input->param('replace_template_id'); |
308 |
my $replace_template_id = $input->param('replace_template_id'); |
| 294 |
|
309 |
|
| 295 |
my $contents = $item->unblessed; |
310 |
my $contents = $item->unblessed; |
| 296 |
$contents->{barcode} = $submitted_barcode; # Don't save the autobarcode in the template |
311 |
$contents->{barcode} = $submitted_barcode; # Don't save the autobarcode in the template |
| 297 |
|
312 |
|
| 298 |
if ($replace_template_id) { |
313 |
if ($replace_template_id) { |
| 299 |
my $template = Koha::Item::Templates->find($replace_template_id); |
314 |
my $template = Koha::Item::Templates->find($replace_template_id); |
| 300 |
$template->update( |
315 |
$template->update( |
| 301 |
{ |
316 |
{ |
| 302 |
id => $replace_template_id, |
317 |
id => $replace_template_id, |
| 303 |
is_shared => $template_is_shared ? 1 : 0, |
318 |
is_shared => $template_is_shared ? 1 : 0, |
| 304 |
contents => $contents, |
319 |
contents => $contents, |
| 305 |
} |
320 |
} |
| 306 |
) if $template && ( |
321 |
) |
| 307 |
$template->patron_id eq $loggedinuser |
322 |
if $template |
| 308 |
|| |
323 |
&& ( $template->patron_id eq $loggedinuser |
| 309 |
haspermission( $uid, { 'editcatalogue' => 'manage_item_editor_templates' } ) |
324 |
|| haspermission( $uid, { 'editcatalogue' => 'manage_item_editor_templates' } ) ); |
| 310 |
); |
325 |
} else { |
| 311 |
} |
|
|
| 312 |
else { |
| 313 |
my $template = Koha::Item::Template->new( |
326 |
my $template = Koha::Item::Template->new( |
| 314 |
{ |
327 |
{ |
| 315 |
name => $template_name, |
328 |
name => $template_name, |
|
Lines 320-327
if ($op eq "cud-additem") {
Link Here
|
| 320 |
)->store(); |
333 |
)->store(); |
| 321 |
} |
334 |
} |
| 322 |
} |
335 |
} |
|
|
336 |
|
| 323 |
# If we have to add or add & duplicate, we add the item |
337 |
# If we have to add or add & duplicate, we add the item |
| 324 |
elsif ( $add_submit || $add_duplicate_submit || $prefillitem) { |
338 |
elsif ( $add_submit || $add_duplicate_submit || $prefillitem ) { |
| 325 |
|
339 |
|
| 326 |
# check for item barcode # being unique |
340 |
# check for item barcode # being unique |
| 327 |
if ( defined $item->barcode |
341 |
if ( defined $item->barcode |
|
Lines 330-340
if ($op eq "cud-additem") {
Link Here
|
| 330 |
# if barcode exists, don't create, but report The problem. |
344 |
# if barcode exists, don't create, but report The problem. |
| 331 |
push @errors, "barcode_not_unique"; |
345 |
push @errors, "barcode_not_unique"; |
| 332 |
|
346 |
|
| 333 |
$current_item = $item->unblessed; # Restore edit form for the same item |
347 |
$current_item = $item->unblessed; # Restore edit form for the same item |
| 334 |
} |
348 |
} |
| 335 |
unless ( @errors ) { |
349 |
unless (@errors) { |
| 336 |
$item->store->discard_changes; |
350 |
$item->store->discard_changes; |
| 337 |
add_item_to_item_group( $item->biblionumber, $item->itemnumber, $item_group, $item_group_description, $display_order ); |
351 |
add_item_to_item_group( |
|
|
352 |
$item->biblionumber, $item->itemnumber, $item_group, $item_group_description, |
| 353 |
$display_order |
| 354 |
); |
| 338 |
|
355 |
|
| 339 |
# This is a bit tricky : if there is a cookie for the last created item and |
356 |
# This is a bit tricky : if there is a cookie for the last created item and |
| 340 |
# we just added an item, the cookie value is not correct yet (it will be updated |
357 |
# we just added an item, the cookie value is not correct yet (it will be updated |
|
Lines 343-355
if ($op eq "cud-additem") {
Link Here
|
| 343 |
# correct values. |
360 |
# correct values. |
| 344 |
|
361 |
|
| 345 |
# Pushing the last created item cookie back |
362 |
# Pushing the last created item cookie back |
| 346 |
if ( $prefillitem ) { |
363 |
if ($prefillitem) { |
| 347 |
my $last_created_item_cookie = $input->cookie( |
364 |
my $last_created_item_cookie = $input->cookie( |
| 348 |
-name => 'LastCreatedItem', |
365 |
-name => 'LastCreatedItem', |
|
|
366 |
|
| 349 |
# We encode_base64url the whole freezed structure so we're sure we won't have any encoding problems |
367 |
# We encode_base64url the whole freezed structure so we're sure we won't have any encoding problems |
| 350 |
-value => encode_base64url( freeze( { %{$item->unblessed}, itemnumber => undef } ) ), |
368 |
-value => encode_base64url( freeze( { %{ $item->unblessed }, itemnumber => undef } ) ), |
| 351 |
-HttpOnly => 1, |
369 |
-HttpOnly => 1, |
| 352 |
-expires => '', |
370 |
-expires => '', |
| 353 |
-sameSite => 'Lax' |
371 |
-sameSite => 'Lax' |
| 354 |
); |
372 |
); |
| 355 |
|
373 |
|
|
Lines 362-378
if ($op eq "cud-additem") {
Link Here
|
| 362 |
} |
380 |
} |
| 363 |
|
381 |
|
| 364 |
# If we have to add & duplicate |
382 |
# If we have to add & duplicate |
| 365 |
if ($prefillitem || $add_duplicate_submit) { |
383 |
if ( $prefillitem || $add_duplicate_submit ) { |
| 366 |
|
384 |
|
| 367 |
$current_item = $item->unblessed; |
385 |
$current_item = $item->unblessed; |
| 368 |
|
386 |
|
| 369 |
if (C4::Context->preference('autoBarcode') eq 'incremental') { |
387 |
if ( C4::Context->preference('autoBarcode') eq 'incremental' ) { |
| 370 |
my ( $barcode ) = C4::Barcodes::ValueBuilder::incremental::get_barcode; |
388 |
my ($barcode) = C4::Barcodes::ValueBuilder::incremental::get_barcode; |
| 371 |
$current_item->{barcode} = $barcode; |
389 |
$current_item->{barcode} = $barcode; |
| 372 |
} |
390 |
} else { |
| 373 |
else { |
391 |
|
| 374 |
# we have to clear the barcode field in the duplicate item record to make way for the new one generated by the javascript plugin |
392 |
# we have to clear the barcode field in the duplicate item record to make way for the new one generated by the javascript plugin |
| 375 |
$current_item->{barcode} = undef; # FIXME or delete? |
393 |
$current_item->{barcode} = undef; # FIXME or delete? |
| 376 |
} |
394 |
} |
| 377 |
|
395 |
|
| 378 |
# Don't use the "prefill" feature if we want to generate the form with all the info from this item |
396 |
# Don't use the "prefill" feature if we want to generate the form with all the info from this item |
|
Lines 396-403
if ($op eq "cud-additem") {
Link Here
|
| 396 |
|
414 |
|
| 397 |
push @errors, "no_next_barcode"; |
415 |
push @errors, "no_next_barcode"; |
| 398 |
|
416 |
|
| 399 |
} |
417 |
} else { |
| 400 |
else { |
418 |
|
| 401 |
# We add each item |
419 |
# We add each item |
| 402 |
|
420 |
|
| 403 |
# For the first iteration |
421 |
# For the first iteration |
|
Lines 409-423
if ($op eq "cud-additem") {
Link Here
|
| 409 |
# If there is a barcode |
427 |
# If there is a barcode |
| 410 |
if ($barcodevalue) { |
428 |
if ($barcodevalue) { |
| 411 |
|
429 |
|
| 412 |
# Getting a new barcode (if it is not the first iteration or the barcode we tried already exists) |
430 |
# Getting a new barcode (if it is not the first iteration or the barcode we tried already exists) |
| 413 |
$barcodevalue = $barcodeobj->next_value($oldbarcode) |
431 |
$barcodevalue = $barcodeobj->next_value($oldbarcode) |
| 414 |
if ( $i > 0 || $exist_itemnumber ); |
432 |
if ( $i > 0 || $exist_itemnumber ); |
| 415 |
|
433 |
|
| 416 |
# Putting it into the record |
434 |
# Putting it into the record |
| 417 |
if ($barcodevalue) { |
435 |
if ($barcodevalue) { |
| 418 |
if ( C4::Context->preference("autoBarcode") eq |
436 |
if ( C4::Context->preference("autoBarcode") eq 'hbyymmincr' && $i > 0 ) |
| 419 |
'hbyymmincr' && $i > 0 ) |
437 |
{ # The first copy already contains the homebranch prefix |
| 420 |
{ # The first copy already contains the homebranch prefix |
|
|
| 421 |
# This is terribly hacky but the easiest way to fix the way hbyymmincr is working |
438 |
# This is terribly hacky but the easiest way to fix the way hbyymmincr is working |
| 422 |
# Contrary to what one might think, the barcode plugin does not prefix the returned string with the homebranch |
439 |
# Contrary to what one might think, the barcode plugin does not prefix the returned string with the homebranch |
| 423 |
# For a single item, it is handled with some JS code (see cataloguing/value_builder/barcode.pl) |
440 |
# For a single item, it is handled with some JS code (see cataloguing/value_builder/barcode.pl) |
|
Lines 430-436
if ($op eq "cud-additem") {
Link Here
|
| 430 |
} |
447 |
} |
| 431 |
|
448 |
|
| 432 |
# Checking if the barcode already exists |
449 |
# Checking if the barcode already exists |
| 433 |
$exist_itemnumber = Koha::Items->search({ barcode => $barcodevalue })->count; |
450 |
$exist_itemnumber = Koha::Items->search( { barcode => $barcodevalue } )->count; |
| 434 |
} |
451 |
} |
| 435 |
|
452 |
|
| 436 |
# Updating record with the new copynumber |
453 |
# Updating record with the new copynumber |
|
Lines 441-458
if ($op eq "cud-additem") {
Link Here
|
| 441 |
# Adding the item |
458 |
# Adding the item |
| 442 |
if ( !$exist_itemnumber ) { |
459 |
if ( !$exist_itemnumber ) { |
| 443 |
delete $current_item->{itemnumber}; |
460 |
delete $current_item->{itemnumber}; |
| 444 |
$current_item = Koha::Item->new($current_item)->store( |
461 |
$current_item = Koha::Item->new($current_item)->store( { skip_record_index => 1 } ); |
| 445 |
{ skip_record_index => 1 } ); |
462 |
$current_item->discard_changes; # Cannot chain discard_changes |
| 446 |
$current_item->discard_changes; # Cannot chain discard_changes |
|
|
| 447 |
$current_item = $current_item->unblessed; |
463 |
$current_item = $current_item->unblessed; |
| 448 |
add_item_to_item_group( |
464 |
add_item_to_item_group( |
| 449 |
$item->biblionumber, $item->itemnumber, $item_group, |
465 |
$item->biblionumber, $item->itemnumber, $item_group, |
| 450 |
$item_group_description, $display_order |
466 |
$item_group_description, $display_order |
| 451 |
); |
467 |
); |
| 452 |
|
468 |
|
| 453 |
# We count the item only if it was really added |
469 |
# We count the item only if it was really added |
| 454 |
# That way, all items are added, even if there was some already existing barcodes |
470 |
# That way, all items are added, even if there was some already existing barcodes |
| 455 |
# FIXME : Please note that there is a risk of infinite loop here if we never find a suitable barcode |
471 |
# FIXME : Please note that there is a risk of infinite loop here if we never find a suitable barcode |
| 456 |
$i++; |
472 |
$i++; |
| 457 |
|
473 |
|
| 458 |
# Only increment copynumber if item was really added |
474 |
# Only increment copynumber if item was really added |
|
Lines 463-579
if ($op eq "cud-additem") {
Link Here
|
| 463 |
$oldbarcode = $barcodevalue; |
479 |
$oldbarcode = $barcodevalue; |
| 464 |
} |
480 |
} |
| 465 |
|
481 |
|
| 466 |
my $indexer = Koha::SearchEngine::Indexer->new( |
482 |
my $indexer = Koha::SearchEngine::Indexer->new( { index => $Koha::SearchEngine::BIBLIOS_INDEX } ); |
| 467 |
{ index => $Koha::SearchEngine::BIBLIOS_INDEX } ); |
483 |
$indexer->index_records( |
| 468 |
$indexer->index_records( $biblionumber, "specialUpdate", |
484 |
$biblionumber, "specialUpdate", |
| 469 |
"biblioserver" ); |
485 |
"biblioserver" |
|
|
486 |
); |
| 470 |
|
487 |
|
| 471 |
undef($current_item); |
488 |
undef($current_item); |
| 472 |
} |
489 |
} |
| 473 |
} |
490 |
} |
| 474 |
if ($frameworkcode eq 'FA' && $fa_circborrowernumber){ |
491 |
if ( $frameworkcode eq 'FA' && $fa_circborrowernumber ) { |
| 475 |
print $input->redirect( |
492 |
print $input->redirect( '/cgi-bin/koha/circ/circulation.pl?' |
| 476 |
'/cgi-bin/koha/circ/circulation.pl?' |
493 |
. 'borrowernumber=' |
| 477 |
.'borrowernumber='.$fa_circborrowernumber |
494 |
. $fa_circborrowernumber |
| 478 |
.'&barcode='.uri_escape_utf8($fa_barcode) |
495 |
. '&barcode=' |
| 479 |
.'&duedatespec='.$fa_duedatespec |
496 |
. uri_escape_utf8($fa_barcode) |
| 480 |
.'&stickyduedate='.$fa_stickyduedate |
497 |
. '&duedatespec=' |
| 481 |
); |
498 |
. $fa_duedatespec |
|
|
499 |
. '&stickyduedate=' |
| 500 |
. $fa_stickyduedate ); |
| 482 |
exit; |
501 |
exit; |
| 483 |
} |
502 |
} |
| 484 |
|
503 |
|
|
|
504 |
#------------------------------------------------------------------------------- |
| 505 |
} elsif ( $op eq "edititem" ) { |
| 485 |
|
506 |
|
| 486 |
#------------------------------------------------------------------------------- |
507 |
#------------------------------------------------------------------------------- |
| 487 |
} elsif ($op eq "edititem") { |
508 |
# retrieve item if exist => then, it's a modif |
| 488 |
#------------------------------------------------------------------------------- |
|
|
| 489 |
# retrieve item if exist => then, it's a modif |
| 490 |
$current_item = Koha::Items->find($itemnumber)->unblessed; |
509 |
$current_item = Koha::Items->find($itemnumber)->unblessed; |
| 491 |
$nextop = "cud-saveitem"; |
510 |
$nextop = "cud-saveitem"; |
| 492 |
#------------------------------------------------------------------------------- |
511 |
|
| 493 |
} elsif ($op eq "dupeitem") { |
512 |
#------------------------------------------------------------------------------- |
| 494 |
#------------------------------------------------------------------------------- |
513 |
} elsif ( $op eq "dupeitem" ) { |
| 495 |
# retrieve item if exist => then, it's a modif |
514 |
|
|
|
515 |
#------------------------------------------------------------------------------- |
| 516 |
# retrieve item if exist => then, it's a modif |
| 496 |
$current_item = Koha::Items->find($itemnumber)->unblessed; |
517 |
$current_item = Koha::Items->find($itemnumber)->unblessed; |
| 497 |
if ( C4::Context->preference('autoBarcode') eq 'incremental' ) { |
518 |
if ( C4::Context->preference('autoBarcode') eq 'incremental' ) { |
| 498 |
my ($barcode) = C4::Barcodes::ValueBuilder::incremental::get_barcode; |
519 |
my ($barcode) = C4::Barcodes::ValueBuilder::incremental::get_barcode; |
| 499 |
$current_item->{barcode} = $barcode; |
520 |
$current_item->{barcode} = $barcode; |
| 500 |
} |
521 |
} else { |
| 501 |
else { |
|
|
| 502 |
$current_item->{barcode} = undef; # Don't save it! |
522 |
$current_item->{barcode} = undef; # Don't save it! |
| 503 |
} |
523 |
} |
| 504 |
|
524 |
|
| 505 |
$nextop = "cud-additem"; |
525 |
$nextop = "cud-additem"; |
| 506 |
#------------------------------------------------------------------------------- |
526 |
|
| 507 |
} elsif ($op eq "cud-delitem") { |
527 |
#------------------------------------------------------------------------------- |
| 508 |
#------------------------------------------------------------------------------- |
528 |
} elsif ( $op eq "cud-delitem" ) { |
|
|
529 |
|
| 530 |
#------------------------------------------------------------------------------- |
| 509 |
# check that there is no issue on this item before deletion. |
531 |
# check that there is no issue on this item before deletion. |
| 510 |
my $item = Koha::Items->find($itemnumber); |
532 |
my $item = Koha::Items->find($itemnumber); |
| 511 |
my $deleted; |
533 |
my $deleted; |
| 512 |
if( $item ) { |
534 |
if ($item) { |
| 513 |
$deleted = $item->safe_delete; |
535 |
$deleted = $item->safe_delete; |
| 514 |
} else { |
536 |
} else { |
| 515 |
$deleted = Koha::Result::Boolean->new(0)->add_message({ message => 'item_not_found' }); |
537 |
$deleted = Koha::Result::Boolean->new(0)->add_message( { message => 'item_not_found' } ); |
| 516 |
} |
538 |
} |
| 517 |
if ( $deleted ) { |
539 |
if ($deleted) { |
| 518 |
print $input->redirect("additem.pl?biblionumber=$biblionumber&frameworkcode=$frameworkcode&searchid=$searchid"); |
540 |
print $input->redirect("additem.pl?biblionumber=$biblionumber&frameworkcode=$frameworkcode&searchid=$searchid"); |
| 519 |
exit; |
541 |
exit; |
| 520 |
} |
542 |
} else { |
| 521 |
else { |
|
|
| 522 |
push @errors, @{ $deleted->messages }[0]->message; |
543 |
push @errors, @{ $deleted->messages }[0]->message; |
| 523 |
$nextop = "cud-additem"; |
544 |
$nextop = "cud-additem"; |
| 524 |
} |
545 |
} |
| 525 |
#------------------------------------------------------------------------------- |
546 |
|
| 526 |
} elsif ($op eq "cud-delallitems") { |
547 |
#------------------------------------------------------------------------------- |
| 527 |
#------------------------------------------------------------------------------- |
548 |
} elsif ( $op eq "cud-delallitems" ) { |
| 528 |
my $items = Koha::Items->search({ biblionumber => $biblionumber }); |
549 |
|
|
|
550 |
#------------------------------------------------------------------------------- |
| 551 |
my $items = Koha::Items->search( { biblionumber => $biblionumber } ); |
| 529 |
while ( my $item = $items->next ) { |
552 |
while ( my $item = $items->next ) { |
| 530 |
my $deleted = $item->safe_delete({ skip_record_index => 1 }); |
553 |
my $deleted = $item->safe_delete( { skip_record_index => 1 } ); |
| 531 |
push @errors, @{$deleted->messages}[0]->message unless $deleted; |
554 |
push @errors, @{ $deleted->messages }[0]->message unless $deleted; |
| 532 |
} |
555 |
} |
| 533 |
my $indexer = Koha::SearchEngine::Indexer->new({ index => $Koha::SearchEngine::BIBLIOS_INDEX }); |
556 |
my $indexer = Koha::SearchEngine::Indexer->new( { index => $Koha::SearchEngine::BIBLIOS_INDEX } ); |
| 534 |
$indexer->index_records( $biblionumber, "specialUpdate", "biblioserver" ); |
557 |
$indexer->index_records( $biblionumber, "specialUpdate", "biblioserver" ); |
| 535 |
if ( @errors ) { |
558 |
if (@errors) { |
| 536 |
$nextop="cud-additem"; |
559 |
$nextop = "cud-additem"; |
| 537 |
} else { |
560 |
} else { |
| 538 |
my $defaultview = C4::Context->preference('IntranetBiblioDefaultView'); |
561 |
my $defaultview = C4::Context->preference('IntranetBiblioDefaultView'); |
| 539 |
my $views = { C4::Search::enabled_staff_search_views }; |
562 |
my $views = {C4::Search::enabled_staff_search_views}; |
| 540 |
if ($defaultview eq 'isbd' && $views->{can_view_ISBD}) { |
563 |
if ( $defaultview eq 'isbd' && $views->{can_view_ISBD} ) { |
| 541 |
print $input->redirect("/cgi-bin/koha/catalogue/ISBDdetail.pl?biblionumber=$biblionumber&searchid=$searchid"); |
564 |
print $input->redirect( |
| 542 |
} elsif ($defaultview eq 'marc' && $views->{can_view_MARC}) { |
565 |
"/cgi-bin/koha/catalogue/ISBDdetail.pl?biblionumber=$biblionumber&searchid=$searchid"); |
| 543 |
print $input->redirect("/cgi-bin/koha/catalogue/MARCdetail.pl?biblionumber=$biblionumber&searchid=$searchid"); |
566 |
} elsif ( $defaultview eq 'marc' && $views->{can_view_MARC} ) { |
| 544 |
} elsif ($defaultview eq 'labeled_marc' && $views->{can_view_labeledMARC}) { |
567 |
print $input->redirect( |
| 545 |
print $input->redirect("/cgi-bin/koha/catalogue/labeledMARCdetail.pl?biblionumber=$biblionumber&searchid=$searchid"); |
568 |
"/cgi-bin/koha/catalogue/MARCdetail.pl?biblionumber=$biblionumber&searchid=$searchid"); |
|
|
569 |
} elsif ( $defaultview eq 'labeled_marc' && $views->{can_view_labeledMARC} ) { |
| 570 |
print $input->redirect( |
| 571 |
"/cgi-bin/koha/catalogue/labeledMARCdetail.pl?biblionumber=$biblionumber&searchid=$searchid"); |
| 546 |
} else { |
572 |
} else { |
| 547 |
print $input->redirect("/cgi-bin/koha/catalogue/detail.pl?biblionumber=$biblionumber&searchid=$searchid"); |
573 |
print $input->redirect("/cgi-bin/koha/catalogue/detail.pl?biblionumber=$biblionumber&searchid=$searchid"); |
| 548 |
} |
574 |
} |
| 549 |
exit; |
575 |
exit; |
| 550 |
} |
576 |
} |
| 551 |
#------------------------------------------------------------------------------- |
577 |
|
| 552 |
} elsif ($op eq "cud-saveitem") { |
578 |
#------------------------------------------------------------------------------- |
| 553 |
#------------------------------------------------------------------------------- |
579 |
} elsif ( $op eq "cud-saveitem" ) { |
|
|
580 |
|
| 581 |
#------------------------------------------------------------------------------- |
| 554 |
|
582 |
|
| 555 |
my $itemnumber = $input->param('itemnumber'); |
583 |
my $itemnumber = $input->param('itemnumber'); |
| 556 |
my $item = Koha::Items->find($itemnumber); |
584 |
my $item = Koha::Items->find($itemnumber); |
| 557 |
unless ($item) { |
585 |
unless ($item) { |
| 558 |
C4::Output::output_error( $input, '404' ); |
586 |
C4::Output::output_error( $input, '404' ); |
| 559 |
exit; |
587 |
exit; |
| 560 |
} |
588 |
} |
| 561 |
my $olditemlost = $item->itemlost; |
589 |
my $olditemlost = $item->itemlost; |
| 562 |
my @columns = Koha::Items->columns; |
590 |
my @columns = Koha::Items->columns; |
| 563 |
my $new_values = $item->unblessed; |
591 |
my $new_values = $item->unblessed; |
| 564 |
for my $c ( @columns ) { |
592 |
for my $c (@columns) { |
| 565 |
if ( $c eq 'more_subfields_xml' ) { |
593 |
if ( $c eq 'more_subfields_xml' ) { |
| 566 |
my @more_subfields_xml = $input->multi_param("items.more_subfields_xml"); |
594 |
my @more_subfields_xml = $input->multi_param("items.more_subfields_xml"); |
| 567 |
my @unlinked_item_subfields; |
595 |
my @unlinked_item_subfields; |
| 568 |
for my $subfield ( uniq @more_subfields_xml ) { |
596 |
for my $subfield ( uniq @more_subfields_xml ) { |
| 569 |
my @v = $input->multi_param('items.more_subfields_xml_' . encode_utf8($subfield)); |
597 |
my @v = $input->multi_param( 'items.more_subfields_xml_' . encode_utf8($subfield) ); |
| 570 |
push @unlinked_item_subfields, $subfield, $_ for @v; |
598 |
push @unlinked_item_subfields, $subfield, $_ for @v; |
| 571 |
} |
599 |
} |
| 572 |
if ( @unlinked_item_subfields ) { |
600 |
if (@unlinked_item_subfields) { |
| 573 |
my $marc = MARC::Record->new(); |
601 |
my $marc = MARC::Record->new(); |
|
|
602 |
|
| 574 |
# use of tag 999 is arbitrary, and doesn't need to match the item tag |
603 |
# use of tag 999 is arbitrary, and doesn't need to match the item tag |
| 575 |
# used in the framework |
604 |
# used in the framework |
| 576 |
$marc->append_fields(MARC::Field->new('999', ' ', ' ', @unlinked_item_subfields)); |
605 |
$marc->append_fields( MARC::Field->new( '999', ' ', ' ', @unlinked_item_subfields ) ); |
| 577 |
$marc->encoding("UTF-8"); |
606 |
$marc->encoding("UTF-8"); |
| 578 |
$new_values->{more_subfields_xml} = $marc->as_xml("USMARC"); |
607 |
$new_values->{more_subfields_xml} = $marc->as_xml("USMARC"); |
| 579 |
next; |
608 |
next; |
|
Lines 583-589
if ($op eq "cud-additem") {
Link Here
|
| 583 |
my @v = map { ( defined $_ && $_ eq '' ) ? undef : $_ } $input->multi_param( "items." . $c ); |
612 |
my @v = map { ( defined $_ && $_ eq '' ) ? undef : $_ } $input->multi_param( "items." . $c ); |
| 584 |
next unless @v; |
613 |
next unless @v; |
| 585 |
|
614 |
|
| 586 |
if ( $c eq 'permanent_location' ) { # See 27837 |
615 |
if ( $c eq 'permanent_location' ) { # See 27837 |
| 587 |
$item->make_column_dirty('permanent_location'); |
616 |
$item->make_column_dirty('permanent_location'); |
| 588 |
} |
617 |
} |
| 589 |
|
618 |
|
|
Lines 605-615
if ($op eq "cud-additem") {
Link Here
|
| 605 |
itemnumber => { '!=' => $item->itemnumber } |
634 |
itemnumber => { '!=' => $item->itemnumber } |
| 606 |
} |
635 |
} |
| 607 |
)->count |
636 |
)->count |
| 608 |
) |
637 |
) |
| 609 |
{ |
638 |
{ |
| 610 |
# FIXME We shouldn't need that, ->store would explode as there is a unique constraint on items.barcode |
639 |
# FIXME We shouldn't need that, ->store would explode as there is a unique constraint on items.barcode |
| 611 |
push @errors,"barcode_not_unique"; |
640 |
push @errors, "barcode_not_unique"; |
| 612 |
$current_item = $item->unblessed; # Restore edit form for the same item |
641 |
$current_item = $item->unblessed; # Restore edit form for the same item |
| 613 |
} else { |
642 |
} else { |
| 614 |
my $newitemlost = $item->itemlost; |
643 |
my $newitemlost = $item->itemlost; |
| 615 |
if ( $newitemlost && $newitemlost ge '1' && !$olditemlost ) { |
644 |
if ( $newitemlost && $newitemlost ge '1' && !$olditemlost ) { |
|
Lines 618-645
if ($op eq "cud-additem") {
Link Here
|
| 618 |
$item->store; |
647 |
$item->store; |
| 619 |
} |
648 |
} |
| 620 |
|
649 |
|
| 621 |
$nextop="cud-additem"; |
650 |
$nextop = "cud-additem"; |
| 622 |
} elsif ($op eq "delinkitem"){ |
651 |
} elsif ( $op eq "delinkitem" ) { |
| 623 |
|
652 |
|
| 624 |
my $analyticfield = '773'; |
653 |
my $analyticfield = '773'; |
| 625 |
if ($marcflavour eq 'MARC21'){ |
654 |
if ( $marcflavour eq 'MARC21' ) { |
| 626 |
$analyticfield = '773'; |
655 |
$analyticfield = '773'; |
| 627 |
} elsif ($marcflavour eq 'UNIMARC') { |
656 |
} elsif ( $marcflavour eq 'UNIMARC' ) { |
| 628 |
$analyticfield = '461'; |
657 |
$analyticfield = '461'; |
| 629 |
} |
658 |
} |
| 630 |
foreach my $field ($record->field($analyticfield)){ |
659 |
foreach my $field ( $record->field($analyticfield) ) { |
| 631 |
if ($field->subfield('9') eq $hostitemnumber){ |
660 |
if ( $field->subfield('9') eq $hostitemnumber ) { |
| 632 |
$record->delete_field($field); |
661 |
$record->delete_field($field); |
| 633 |
last; |
662 |
last; |
| 634 |
} |
663 |
} |
| 635 |
} |
664 |
} |
| 636 |
my $modbibresult = ModBiblio($record, $biblionumber,''); |
665 |
my $modbibresult = ModBiblio( $record, $biblionumber, '' ); |
| 637 |
} |
666 |
} |
| 638 |
|
667 |
|
| 639 |
# update OAI-PMH sets |
668 |
# update OAI-PMH sets |
| 640 |
if ($op) { |
669 |
if ($op) { |
| 641 |
if (C4::Context->preference("OAI-PMH:AutoUpdateSets")) { |
670 |
if ( C4::Context->preference("OAI-PMH:AutoUpdateSets") ) { |
| 642 |
C4::OAI::Sets::UpdateOAISetsBiblio($biblionumber, $record); |
671 |
C4::OAI::Sets::UpdateOAISetsBiblio( $biblionumber, $record ); |
| 643 |
} |
672 |
} |
| 644 |
} |
673 |
} |
| 645 |
|
674 |
|
|
Lines 653-659
if ($op) {
Link Here
|
| 653 |
my @items; |
682 |
my @items; |
| 654 |
for my $item ( $biblio->items->as_list, $biblio->host_items->as_list ) { |
683 |
for my $item ( $biblio->items->as_list, $biblio->host_items->as_list ) { |
| 655 |
my $i = $item->columns_to_str; |
684 |
my $i = $item->columns_to_str; |
| 656 |
$i->{nomod} = 1 unless $patron->can_edit_items_from($item->homebranch); |
685 |
$i->{nomod} = 1 unless $patron->can_edit_items_from( $item->homebranch ); |
| 657 |
push @items, $i; |
686 |
push @items, $i; |
| 658 |
} |
687 |
} |
| 659 |
|
688 |
|
|
Lines 669-682
for my $subfield_code ( keys %{ $tagslib->{$itemtagfield} } ) {
Link Here
|
| 669 |
|
698 |
|
| 670 |
my $subfield = $tagslib->{$itemtagfield}->{$subfield_code}; |
699 |
my $subfield = $tagslib->{$itemtagfield}->{$subfield_code}; |
| 671 |
|
700 |
|
| 672 |
next if IsMarcStructureInternal( $subfield ); |
701 |
next if IsMarcStructureInternal($subfield); |
| 673 |
next unless $subfield->{tab} eq 10; # Is this really needed? |
702 |
next unless $subfield->{tab} eq 10; # Is this really needed? |
| 674 |
|
703 |
|
| 675 |
my $attribute; |
704 |
my $attribute; |
| 676 |
if ( $subfield->{kohafield} ) { |
705 |
if ( $subfield->{kohafield} ) { |
| 677 |
( $attribute = $subfield->{kohafield} ) =~ s|^items\.||; |
706 |
( $attribute = $subfield->{kohafield} ) =~ s|^items\.||; |
| 678 |
} else { |
707 |
} else { |
| 679 |
$attribute = $subfield_code; # It's in more_subfields_xml |
708 |
$attribute = $subfield_code; # It's in more_subfields_xml |
| 680 |
} |
709 |
} |
| 681 |
next unless grep { $attribute eq $_ } @witness_attributes; |
710 |
next unless grep { $attribute eq $_ } @witness_attributes; |
| 682 |
$subfieldcode_attribute_mappings->{$subfield_code} = $attribute; |
711 |
$subfieldcode_attribute_mappings->{$subfield_code} = $attribute; |
|
Lines 691-714
my @header_value_loop = map {
Link Here
|
| 691 |
} sort keys %$subfieldcode_attribute_mappings; |
720 |
} sort keys %$subfieldcode_attribute_mappings; |
| 692 |
|
721 |
|
| 693 |
# Using last created item if it exists |
722 |
# Using last created item if it exists |
| 694 |
if ( |
723 |
if ( $op ne "cud-additem" |
| 695 |
$op ne "cud-additem" |
|
|
| 696 |
&& $op ne "edititem" |
724 |
&& $op ne "edititem" |
| 697 |
&& $op ne "dupeitem" ) |
725 |
&& $op ne "dupeitem" ) |
| 698 |
{ |
726 |
{ |
| 699 |
if ( $template_id ) { |
727 |
if ($template_id) { |
| 700 |
my $item_from_template = get_item_from_template($template_id); |
728 |
my $item_from_template = get_item_from_template($template_id); |
| 701 |
$current_item = $item_from_template if $item_from_template; |
729 |
$current_item = $item_from_template if $item_from_template; |
| 702 |
} |
730 |
} elsif ($prefillitem) { |
| 703 |
elsif ( $prefillitem ) { |
|
|
| 704 |
my $item_from_cookie = get_item_from_cookie($input); |
731 |
my $item_from_cookie = get_item_from_cookie($input); |
| 705 |
$current_item = $item_from_cookie if $item_from_cookie; |
732 |
$current_item = $item_from_cookie if $item_from_cookie; |
| 706 |
} |
733 |
} |
| 707 |
} |
734 |
} |
| 708 |
|
735 |
|
| 709 |
if ( $current_item->{more_subfields_xml} ) { |
736 |
if ( $current_item->{more_subfields_xml} ) { |
|
|
737 |
|
| 710 |
# FIXME Use Maybe MARC::Record::new_from_xml if encoding issues on subfield (??) |
738 |
# FIXME Use Maybe MARC::Record::new_from_xml if encoding issues on subfield (??) |
| 711 |
$current_item->{marc_more_subfields_xml} = MARC::Record->new_from_xml($current_item->{more_subfields_xml}, 'UTF-8'); |
739 |
$current_item->{marc_more_subfields_xml} = |
|
|
740 |
MARC::Record->new_from_xml( $current_item->{more_subfields_xml}, 'UTF-8' ); |
| 712 |
} |
741 |
} |
| 713 |
|
742 |
|
| 714 |
my $branchcode = $input->param('branch') || C4::Context->userenv->{branch}; |
743 |
my $branchcode = $input->param('branch') || C4::Context->userenv->{branch}; |
|
Lines 718-732
my $branchcode = $input->param('branch') || C4::Context->userenv->{branch};
Link Here
|
| 718 |
# If the subfield must be prefilled with last catalogued item |
747 |
# If the subfield must be prefilled with last catalogued item |
| 719 |
my @subfields_to_prefill; |
748 |
my @subfields_to_prefill; |
| 720 |
if ( $nextop eq 'cud-additem' && $op ne 'dupeitem' && $prefillitem ) { |
749 |
if ( $nextop eq 'cud-additem' && $op ne 'dupeitem' && $prefillitem ) { |
| 721 |
@subfields_to_prefill = split(' ', C4::Context->preference('SubfieldsToUseWhenPrefill')); |
750 |
@subfields_to_prefill = split( ' ', C4::Context->preference('SubfieldsToUseWhenPrefill') ); |
| 722 |
} |
751 |
} |
| 723 |
|
752 |
|
| 724 |
# Getting list of subfields to keep when restricted editing is enabled |
753 |
# Getting list of subfields to keep when restricted editing is enabled |
| 725 |
my @subfields_to_allow = $restrictededition ? split ' ', C4::Context->preference('SubfieldsToAllowForRestrictedEditing') : (); |
754 |
my @subfields_to_allow = |
|
|
755 |
$restrictededition |
| 756 |
? split ' ', C4::Context->preference('SubfieldsToAllowForRestrictedEditing') |
| 757 |
: (); |
| 726 |
|
758 |
|
| 727 |
my $subfields = |
759 |
my $subfields = |
| 728 |
Koha::UI::Form::Builder::Item->new( |
760 |
Koha::UI::Form::Builder::Item->new( { biblionumber => $biblionumber, item => $current_item } )->edit_form( |
| 729 |
{ biblionumber => $biblionumber, item => $current_item } )->edit_form( |
|
|
| 730 |
{ |
761 |
{ |
| 731 |
branchcode => $branchcode, |
762 |
branchcode => $branchcode, |
| 732 |
restricted_editition => $restrictededition, |
763 |
restricted_editition => $restrictededition, |
|
Lines 741-784
my $subfields =
Link Here
|
| 741 |
: () |
772 |
: () |
| 742 |
), |
773 |
), |
| 743 |
prefill_with_default_values => 1, |
774 |
prefill_with_default_values => 1, |
| 744 |
branch_limit => C4::Context->userenv->{"branch"}, |
775 |
branch_limit => C4::Context->userenv->{"branch"}, |
| 745 |
( |
776 |
( |
| 746 |
$op eq 'dupeitem' |
777 |
$op eq 'dupeitem' |
| 747 |
? ( ignore_invisible_subfields => 1 ) |
778 |
? ( ignore_invisible_subfields => 1 ) |
| 748 |
: () |
779 |
: () |
| 749 |
), |
780 |
), |
| 750 |
} |
781 |
} |
| 751 |
); |
782 |
); |
| 752 |
|
783 |
|
| 753 |
if ( $frameworkcode eq 'FA' ) { |
784 |
if ( $frameworkcode eq 'FA' ) { |
| 754 |
my ( $barcode_field ) = grep {$_->{kohafield} eq 'items.barcode'} @$subfields; |
785 |
my ($barcode_field) = grep { $_->{kohafield} eq 'items.barcode' } @$subfields; |
| 755 |
$barcode_field->{marc_value}->{value} ||= $input->param('barcode'); |
786 |
$barcode_field->{marc_value}->{value} ||= $input->param('barcode'); |
| 756 |
} |
787 |
} |
| 757 |
|
788 |
|
| 758 |
if( my $default_location = C4::Context->preference('NewItemsDefaultLocation') ) { |
789 |
if ( my $default_location = C4::Context->preference('NewItemsDefaultLocation') ) { |
| 759 |
my ( $location_field ) = grep {$_->{kohafield} eq 'items.location'} @$subfields; |
790 |
my ($location_field) = grep { $_->{kohafield} eq 'items.location' } @$subfields; |
| 760 |
$location_field->{marc_value}->{value} ||= $default_location; |
791 |
$location_field->{marc_value}->{value} ||= $default_location; |
| 761 |
} |
792 |
} |
| 762 |
|
793 |
|
| 763 |
my @ig = Koha::Biblio::ItemGroups->search({ biblio_id => $biblionumber })->as_list(); |
794 |
my @ig = Koha::Biblio::ItemGroups->search( { biblio_id => $biblionumber } )->as_list(); |
|
|
795 |
|
| 764 |
#sort by display order |
796 |
#sort by display order |
| 765 |
my @sorted_ig = sort { $a->display_order <=> $b->display_order } @ig; |
797 |
my @sorted_ig = sort { $a->display_order <=> $b->display_order } @ig; |
|
|
798 |
|
| 766 |
# what's the next op ? it's what we are not in : an add if we're editing, otherwise, and edit. |
799 |
# what's the next op ? it's what we are not in : an add if we're editing, otherwise, and edit. |
| 767 |
$template->param( |
800 |
$template->param( |
| 768 |
biblio => $biblio, |
801 |
biblio => $biblio, |
| 769 |
items => \@items, |
802 |
items => \@items, |
| 770 |
item_groups => \@sorted_ig, |
803 |
item_groups => \@sorted_ig, |
| 771 |
item_header_loop => \@header_value_loop, |
804 |
item_header_loop => \@header_value_loop, |
| 772 |
subfields => $subfields, |
805 |
subfields => $subfields, |
| 773 |
itemnumber => $itemnumber, |
806 |
itemnumber => $itemnumber, |
| 774 |
barcode => $current_item->{barcode}, |
807 |
barcode => $current_item->{barcode}, |
| 775 |
op => $nextop, |
808 |
op => $nextop, |
| 776 |
popup => scalar $input->param('popup') ? 1: 0, |
809 |
popup => scalar $input->param('popup') ? 1 : 0, |
| 777 |
C4::Search::enabled_staff_search_views, |
810 |
C4::Search::enabled_staff_search_views, |
| 778 |
); |
811 |
); |
| 779 |
$template->{'VARS'}->{'searchid'} = $searchid; |
812 |
$template->{'VARS'}->{'searchid'} = $searchid; |
| 780 |
|
813 |
|
| 781 |
if ($frameworkcode eq 'FA'){ |
814 |
if ( $frameworkcode eq 'FA' ) { |
|
|
815 |
|
| 782 |
# fast cataloguing datas |
816 |
# fast cataloguing datas |
| 783 |
$template->param( |
817 |
$template->param( |
| 784 |
'circborrowernumber' => $fa_circborrowernumber, |
818 |
'circborrowernumber' => $fa_circborrowernumber, |
|
Lines 790-795
if ($frameworkcode eq 'FA'){
Link Here
|
| 790 |
} |
824 |
} |
| 791 |
|
825 |
|
| 792 |
foreach my $error (@errors) { |
826 |
foreach my $error (@errors) { |
| 793 |
$template->param($error => 1); |
827 |
$template->param( $error => 1 ); |
| 794 |
} |
828 |
} |
| 795 |
output_html_with_http_headers $input, $cookie, $template->output; |
829 |
output_html_with_http_headers $input, $cookie, $template->output; |
| 796 |
- |
|
|