From dce3abd87d6287943d8b06a54a5797852dc199b4 Mon Sep 17 00:00:00 2001 From: Nick Clemens Date: Mon, 27 Feb 2023 17:57:22 +0000 Subject: [PATCH] Bug 31798: (follow-up) Handle all values of autoBarcode Signed-off-by: Martin Renvoize --- Koha/REST/V1/Biblios.pm | 72 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 67 insertions(+), 5 deletions(-) diff --git a/Koha/REST/V1/Biblios.pm b/Koha/REST/V1/Biblios.pm index 3e278fae52..06409d68b5 100644 --- a/Koha/REST/V1/Biblios.pm +++ b/Koha/REST/V1/Biblios.pm @@ -20,6 +20,7 @@ use Modern::Perl; use Mojo::Base 'Mojolicious::Controller'; use Koha::Biblios; +use Koha::DateUtils; use Koha::Ratings; use Koha::RecordProcessor; use C4::Biblio qw( DelBiblio ); @@ -287,7 +288,7 @@ sub add_item { try { my $biblio_id = $c->validation->param('biblio_id'); - my $biblio = Koha::Biblios->find( $biblio_id ); + my $biblio = Koha::Biblios->find($biblio_id); unless ($biblio) { return $c->render( @@ -305,15 +306,76 @@ sub add_item { my $item = Koha::Item->new_from_api($body); - if ( ! defined $item->barcode && C4::Context->preference('autoBarcode') eq 'incremental' ) { - my ( $barcode ) = C4::Barcodes::ValueBuilder::incremental::get_barcode; - $item->barcode($barcode); + if ( !defined $item->barcode ) { + + # FIXME This should be moved to Koha::Item->store + my $autoBarcode = C4::Context->preference('autoBarcode'); + my $barcode = ''; + + if ( !$autoBarcode || $autoBarcode eq 'OFF' ) { + #We do nothing + } + elsif ( $autoBarcode eq 'incremental' ) { + ($barcode) = + C4::Barcodes::ValueBuilder::incremental::get_barcode; + } + elsif ( $autoBarcode eq 'annual' ) { + my $year = Koha::DateUtils::dt_from_string()->year(); + ($barcode) = + C4::Barcodes::ValueBuilder::annual::get_barcode( + { year => $year } ); + } + elsif ( $autoBarcode eq 'hbyymmincr' ) { + + # Generates a barcode where + # hb = home branch Code, + # yymm = year/month catalogued, + # incr = incremental number, + # reset yearly -fbcit + my $now = Koha::DateUtils::dt_from_string(); + my $year = $now->year(); + my $month = $now->month(); + my $homebranch = $item->homebranch // ''; + ($barcode) = + C4::Barcodes::ValueBuilder::hbyymmincr::get_barcode( + { year => $year, mon => $month } ); + $barcode = $homebranch . $barcode; + } + elsif ( $autoBarcode eq 'EAN13' ) { + + # not the best, two catalogers could add the same + # barcode easily this way :/ + my $query = "select max(abs(barcode)) from items"; + my $dbh = C4::Context->dbh; + my $sth = $dbh->prepare($query); + $sth->execute(); + my $nextnum; + while ( my ($last) = $sth->fetchrow_array ) { + $nextnum = $last; + } + my $ean = CheckDigits('ean'); + if ( $ean->is_valid($nextnum) ) { + my $next = $ean->basenumber($nextnum) + 1; + $nextnum = $ean->complete($next); + $nextnum = + '0' x ( 13 - length($nextnum) ) . $nextnum; # pad zeros + } + else { + warn "ERROR: invalid EAN-13 $nextnum, using increment"; + $nextnum++; + } + $barcode = $nextnum; + } + else { + warn "ERROR: unknown autoBarcode: $autoBarcode"; + } + $item->barcode($barcode) if $barcode; } $item->store->discard_changes; $c->render( - status => 201, + status => 201, openapi => $item->to_api ); } -- 2.39.2