View | Details | Raw Unified | Return to bug 8132
Collapse All | Expand All

(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/batchMod-del.tt (-3 / +20 lines)
Lines 120-126 Link Here
120
                        [% CASE "not_same_branch" %][% SET cannot_delete_reason = t("Item does not belongs to your library") %]
120
                        [% CASE "not_same_branch" %][% SET cannot_delete_reason = t("Item does not belongs to your library") %]
121
                        [% CASE "book_reserved" %][% SET cannot_delete_reason = t("Item has a waiting hold") %]
121
                        [% CASE "book_reserved" %][% SET cannot_delete_reason = t("Item has a waiting hold") %]
122
                        [% CASE "linked_analytics" %][% SET cannot_delete_reason = t("Item has linked analytics") %]
122
                        [% CASE "linked_analytics" %][% SET cannot_delete_reason = t("Item has linked analytics") %]
123
                        [% CASE %][% SET cannot_delete_reason = t("Unknown reason") %]
123
                        [% CASE "last_item_for_hold" %][% SET cannot_delete_reason = t("Last item for bibliographic record wich biblio-level hold on it") %]
124
                        [% CASE %][% SET cannot_delete_reason = t("Unknown reason") _ '(' _ can_be_deleted _ ')' %]
124
                        [% END %]
125
                        [% END %]
125
126
126
                        <td><input type="checkbox" name="itemnumber" value="[% item_loo.itemnumber | html %]" id="row[% item_loo.itemnumber | html %]" disabled="disabled" title="[% cannot_delete_reason %]"/></td>
127
                        <td><input type="checkbox" name="itemnumber" value="[% item_loo.itemnumber | html %]" id="row[% item_loo.itemnumber | html %]" disabled="disabled" title="[% cannot_delete_reason %]"/></td>
Lines 210-216 Link Here
210
    [% END %]
211
    [% END %]
211
212
212
[% IF ( action ) %]
213
[% IF ( action ) %]
213
    <div class="dialog message">
214
    [% IF deletion_failed %]
215
        <div class="dialog alert">
216
            At least one item blocked the deletion. The operation rolled back and nothing happened!
217
        </div>
218
    [% ELSE %]
219
        <div class="dialog message">
214
            <p>[% deleted_items | html %] item(s) deleted.</p>
220
            <p>[% deleted_items | html %] item(s) deleted.</p>
215
            [% IF delete_records %] <p>[% deleted_records | html %] record(s) deleted.</p> [% END %]
221
            [% IF delete_records %] <p>[% deleted_records | html %] record(s) deleted.</p> [% END %]
216
            [% IF src == 'CATALOGUING' # from catalogue/detail.pl > Delete items in a batch%]
222
            [% IF src == 'CATALOGUING' # from catalogue/detail.pl > Delete items in a batch%]
Lines 225-230 Link Here
225
                <a href="/cgi-bin/koha/tools/batchMod.pl?del=1">Return to batch item deletion</a>
231
                <a href="/cgi-bin/koha/tools/batchMod.pl?del=1">Return to batch item deletion</a>
226
            [% END %]
232
            [% END %]
227
        </div>
233
        </div>
234
    [% END %]
228
    [% IF ( not_deleted_items ) %]
235
    [% IF ( not_deleted_items ) %]
229
    <div style="width:55%;margin:auto;">
236
    <div style="width:55%;margin:auto;">
230
        <p>[% not_deleted_items | html %] item(s) could not be deleted: [% FOREACH not_deleted_itemnumber IN not_deleted_itemnumbers %][% not_deleted_itemnumber.itemnumber | html %][% END %]</p>
237
        <p>[% not_deleted_items | html %] item(s) could not be deleted: [% FOREACH not_deleted_itemnumber IN not_deleted_itemnumbers %][% not_deleted_itemnumber.itemnumber | html %][% END %]</p>
Lines 242-248 Link Here
242
            <tr>
249
            <tr>
243
                <td>[% not_deleted_loo.itemnumber | html %]</td>
250
                <td>[% not_deleted_loo.itemnumber | html %]</td>
244
                <td>[% IF ( CAN_user_editcatalogue_edit_items ) %]<a href="/cgi-bin/koha/cataloguing/additem.pl?op=edititem&amp;biblionumber=[% not_deleted_loo.biblionumber | uri %]&amp;itemnumber=[% not_deleted_loo.itemnumber | uri %]">[% not_deleted_loo.barcode | html %]</a>[% ELSE %][% not_deleted_loo.barcode | html %][% END %]</td>
251
                <td>[% IF ( CAN_user_editcatalogue_edit_items ) %]<a href="/cgi-bin/koha/cataloguing/additem.pl?op=edititem&amp;biblionumber=[% not_deleted_loo.biblionumber | uri %]&amp;itemnumber=[% not_deleted_loo.itemnumber | uri %]">[% not_deleted_loo.barcode | html %]</a>[% ELSE %][% not_deleted_loo.barcode | html %][% END %]</td>
245
                <td>[% IF ( not_deleted_loo.book_on_loan ) %]Item is checked out[% ELSIF ( not_deleted_loo.book_reserved ) %]Item has a waiting hold[% END %]</td>
252
                <td>
253
                    [% SWITCH not_deleted_loo.reason %]
254
                    [% CASE "book_on_loan" %][% SET cannot_delete_reason = t("Item is checked out") %]
255
                    [% CASE "not_same_branch" %][% SET cannot_delete_reason = t("Item does not belongs to your library") %]
256
                    [% CASE "book_reserved" %][% SET cannot_delete_reason = t("Item has a waiting hold") %]
257
                    [% CASE "linked_analytics" %][% SET cannot_delete_reason = t("Item has linked analytics") %]
258
                    [% CASE "last_item_for_hold" %][% SET cannot_delete_reason = t("Last item for bibliographic record wich biblio-level hold on it") %]
259
                    [% CASE %][% SET cannot_delete_reason = t("Unknown reason") _ '(' _ can_be_deleted _ ')' %]
260
                    [% END %]
261
                    [% cannot_delete_reason %]
262
                </td>
246
            </tr>
263
            </tr>
247
            [% END %]
264
            [% END %]
248
        </tbody>
265
        </tbody>
(-)a/tools/batchMod.pl (-96 / +132 lines)
Lines 20-25 Link Here
20
20
21
use CGI qw ( -utf8 );
21
use CGI qw ( -utf8 );
22
use Modern::Perl;
22
use Modern::Perl;
23
use Try::Tiny;
24
23
use C4::Auth;
25
use C4::Auth;
24
use C4::Output;
26
use C4::Output;
25
use C4::Biblio;
27
use C4::Biblio;
Lines 34-39 use C4::Members; Link Here
34
use MARC::File::XML;
36
use MARC::File::XML;
35
use List::MoreUtils qw/uniq/;
37
use List::MoreUtils qw/uniq/;
36
38
39
use Koha::Database;
40
use Koha::Exceptions::Exception;
37
use Koha::AuthorisedValues;
41
use Koha::AuthorisedValues;
38
use Koha::Biblios;
42
use Koha::Biblios;
39
use Koha::DateUtils;
43
use Koha::DateUtils;
Lines 181-287 if ($op eq "action") { Link Here
181
	    }
185
	    }
182
        }
186
        }
183
187
184
	# For each item
188
        try {
185
	my $i = 1; 
189
            my $schema = Koha::Database->new->schema;
186
	foreach my $itemnumber(@itemnumbers){
190
            $schema->txn_do(
187
191
                sub {
188
		$job->progress($i) if $runinbackground;
192
                    # For each item
189
        my $item = Koha::Items->find($itemnumber);
193
                    my $i = 1;
190
        next unless $item; # Should have been tested earlier, but just in case...
194
                    foreach my $itemnumber (@itemnumbers) {
191
        my $itemdata = $item->unblessed;
195
                        $job->progress($i) if $runinbackground;
192
        if ( $del ){
196
                        my $item = Koha::Items->find($itemnumber);
193
            my $return = $item->safe_delete;
197
                        next
194
            if (ref($return)) {
198
                          unless $item
195
			    $deleted_items++;
199
                          ; # Should have been tested earlier, but just in case...
196
			} else {
200
                        my $itemdata = $item->unblessed;
197
			    $not_deleted_items++;
201
                        if ($del) {
198
			    push @not_deleted,
202
                            my $return = $item->safe_delete;
199
				{ biblionumber => $itemdata->{'biblionumber'},
203
                            if ( ref( $return ) ) {
200
				  itemnumber => $itemdata->{'itemnumber'},
204
                                $deleted_items++;
201
				  barcode => $itemdata->{'barcode'},
205
                            }
202
				  title => $itemdata->{'title'},
206
                            else {
203
				  $return => 1
207
                                $not_deleted_items++;
204
				};
208
                                push @not_deleted,
205
			}
209
                                  {
210
                                    biblionumber => $itemdata->{'biblionumber'},
211
                                    itemnumber   => $itemdata->{'itemnumber'},
212
                                    barcode      => $itemdata->{'barcode'},
213
                                    title        => $itemdata->{'title'},
214
                                    reason       => $return,
215
                                  };
216
                            }
206
217
207
                # If there are no items left, delete the biblio
218
                            # If there are no items left, delete the biblio
208
                if ($del_records) {
219
                            if ($del_records) {
209
                    my $itemscount = Koha::Biblios->find( $itemdata->{'biblionumber'} )->items->count;
220
                                my $itemscount = Koha::Biblios->find( $itemdata->{'biblionumber'} )->items->count;
210
                    if ( $itemscount == 0 ) {
221
                                if ( $itemscount == 0 ) {
211
                        my $error = DelBiblio( $itemdata->{'biblionumber'} );
222
                                    my $error = DelBiblio( $itemdata->{'biblionumber'} );
212
                        unless ($error) {
223
                                    unless ($error) {
213
                            $deleted_records++;
224
                                        $deleted_records++;
214
                            if ( $src eq 'CATALOGUING' ) {
225
                                        if ( $src eq 'CATALOGUING' ) {
215
                                # We are coming catalogue/detail.pl, there were items from a single bib record
226
                                            # We are coming catalogue/detail.pl, there were items from a single bib record
216
                                $template->param( biblio_deleted => 1 );
227
                                            $template->param( biblio_deleted => 1 );
228
                                        }
229
                                    }
230
                                }
217
                            }
231
                            }
218
                        }
232
                        }
219
                    }
233
                        else {
220
                }
234
                            if ( $values_to_modify || $values_to_blank ) {
221
		} else {
235
                                my $localmarcitem = Item2Marc($itemdata);
222
            if ($values_to_modify || $values_to_blank) {
236
                                my $modified = 0;
223
                my $localmarcitem = Item2Marc($itemdata);
237
224
                my $modified = 0;
238
                                for ( my $i = 0 ; $i < @tags ; $i++ ) {
225
239
                                    my $search = $searches[$i];
226
                for ( my $i = 0 ; $i < @tags ; $i++ ) {
240
                                    next unless $search;
227
                    my $search = $searches[$i];
241
228
                    next unless $search;
242
                                    my $tag = $tags[$i];
229
243
                                    my $subfield = $subfields[$i];
230
                    my $tag = $tags[$i];
244
                                    my $replace = $replaces[$i];
231
                    my $subfield = $subfields[$i];
245
232
                    my $replace = $replaces[$i];
246
                                    my $value = $localmarcitem->field( $tag )->subfield( $subfield );
233
247
                                    my $old_value = $value;
234
                    my $value = $localmarcitem->field( $tag )->subfield( $subfield );
248
235
                    my $old_value = $value;
249
                                    my @available_modifiers = qw( i g );
236
250
                                    my $retained_modifiers = q||;
237
                    my @available_modifiers = qw( i g );
251
                                    for my $modifier ( split //, $modifiers[$i] ) {
238
                    my $retained_modifiers = q||;
252
                                        $retained_modifiers .= $modifier
239
                    for my $modifier ( split //, $modifiers[$i] ) {
253
                                            if grep {/$modifier/} @available_modifiers;
240
                        $retained_modifiers .= $modifier
254
                                    }
241
                            if grep {/$modifier/} @available_modifiers;
255
                                    if ( $retained_modifiers =~ m/^(ig|gi)$/ ) {
242
                    }
256
                                        $value =~ s/$search/$replace/ig;
243
                    if ( $retained_modifiers =~ m/^(ig|gi)$/ ) {
257
                                    }
244
                        $value =~ s/$search/$replace/ig;
258
                                    elsif ( $retained_modifiers eq 'i' ) {
245
                    }
259
                                        $value =~ s/$search/$replace/i;
246
                    elsif ( $retained_modifiers eq 'i' ) {
260
                                    }
247
                        $value =~ s/$search/$replace/i;
261
                                    elsif ( $retained_modifiers eq 'g' ) {
248
                    }
262
                                        $value =~ s/$search/$replace/g;
249
                    elsif ( $retained_modifiers eq 'g' ) {
263
                                    }
250
                        $value =~ s/$search/$replace/g;
264
                                    else {
251
                    }
265
                                        $value =~ s/$search/$replace/;
252
                    else {
266
                                    }
253
                        $value =~ s/$search/$replace/;
267
254
                    }
268
                                    my @fields_to = $localmarcitem->field($tag);
255
269
                                    foreach my $field_to_update ( @fields_to ) {
256
                    my @fields_to = $localmarcitem->field($tag);
270
                                        unless ( $old_value eq $value ) {
257
                    foreach my $field_to_update ( @fields_to ) {
271
                                            $modified++;
258
                        unless ( $old_value eq $value ) {
272
                                            $field_to_update->update( $subfield => $value );
259
                            $modified++;
273
                                        }
260
                            $field_to_update->update( $subfield => $value );
274
                                    }
275
                                }
276
277
                                $modified += UpdateMarcWith( $marcitem, $localmarcitem );
278
                                if ($modified) {
279
                                    eval {
280
                                        if (
281
                                            my $item = ModItemFromMarc(
282
                                                $localmarcitem,
283
                                                $itemdata->{biblionumber},
284
                                                $itemnumber
285
                                            )
286
                                          )
287
                                        {
288
                                            LostItem( $itemnumber, 'batchmod' )
289
                                              if $item->{itemlost}
290
                                              and not $itemdata->{itemlost};
291
                                        }
292
                                    };
293
                                }
294
                                if ($runinbackground) {
295
                                    $modified_items++ if $modified;
296
                                    $modified_fields += $modified;
297
                                    $job->set(
298
                                        {
299
                                            modified_items  => $modified_items,
300
                                            modified_fields => $modified_fields,
301
                                        }
302
                                    );
303
                                }
304
                            }
261
                        }
305
                        }
306
                        $i++;
307
                    }
308
                    if (@not_deleted) {
309
                        Koha::Exceptions::Exception->throw(
310
                            'Some items have not been deleted, rolling back');
262
                    }
311
                    }
263
                }
312
                }
264
313
            );
265
                $modified += UpdateMarcWith( $marcitem, $localmarcitem );
314
        }
266
                if ( $modified ) {
315
        catch {
267
                    eval {
316
            if ( $_->isa('Koha::Exceptions::Exception') ) {
268
                        if ( my $item = ModItemFromMarc( $localmarcitem, $itemdata->{biblionumber}, $itemnumber ) ) {
317
                $template->param( deletion_failed => 1 );
269
                            LostItem($itemnumber, 'batchmod') if $item->{itemlost} and not $itemdata->{itemlost};
318
            }
270
                        }
319
            die "Something terrible has happened!"
271
                    };
320
                if ($_ =~ /Rollback failed/); # Rollback failed
272
                }
321
        }
273
                if ( $runinbackground ) {
274
                    $modified_items++ if $modified;
275
                    $modified_fields += $modified;
276
                    $job->set({
277
                        modified_items  => $modified_items,
278
                        modified_fields => $modified_fields,
279
                    });
280
                }
281
		    }
282
		}
283
		$i++;
284
	}
285
    }
322
    }
286
}
323
}
287
#
324
#
288
- 

Return to bug 8132