+my ( $template, $loggedinuser, $cookie ) = get_template_and_user({
+ template_name => $template_name,
+ query => $query,
+ type => "opac",
+ authnotrequired => ( C4::Context->preference("OpacPublic") ? 1 : 0 ),
+ });
+
+my $op = $query->param('op') || 'list';
+my $referer = $query->param('referer') || $op;
+my $category = $query->param('category') || 1;
+my ( $shelf, $shelfnumber, @messages );
+
+if ( $op eq 'add_form' ) {
+ # Nothing to do
+} elsif ( $op eq 'edit_form' ) {
+ $shelfnumber = $query->param('shelfnumber');
+ $shelf = Koha::Virtualshelves->find($shelfnumber);
+
+ if ( $shelf ) {
+ $category = $shelf->category;
+ my $patron = GetMember( 'borrowernumber' => $shelf->owner );
+ $template->param( owner => $patron, );
+ unless ( $shelf->can_be_managed( $loggedinuser ) ) {
+ push @messages, { type => 'error', code => 'unauthorized_on_update' };
+ $op = 'list';
+ }
+ } else {
+ push @messages, { type => 'error', code => 'does_not_exist' };
+ }
+} elsif ( $op eq 'add' ) {
+ if ( $loggedinuser ) {
+ eval {
+ $shelf = Koha::Virtualshelf->new(
+ { shelfname => scalar $query->param('shelfname'),
+ sortfield => scalar $query->param('sortfield'),
+ category => scalar $query->param('category') || 1,
+ allow_add => scalar $query->param('allow_add'),
+ allow_delete_own => scalar $query->param('allow_delete_own'),
+ allow_delete_other => scalar $query->param('allow_delete_other'),
+ owner => scalar $loggedinuser,
+ }
+ );
+ $shelf->store;
+ $shelfnumber = $shelf->shelfnumber;
+ };
+ if ($@) {
+ push @messages, { type => 'error', code => ref($@), msg => $@ };
+ } elsif ( not $shelf ) {
+ push @messages, { type => 'error', code => 'error_on_insert' };
+ } else {
+ push @messages, { type => 'message', code => 'success_on_insert' };
+ $op = 'view';
+ }
+ } else {
+ push @messages, { type => 'error', code => 'unauthorized_on_insert' };
+ $op = 'list';
+ }
+} elsif ( $op eq 'edit' ) {
+ $shelfnumber = $query->param('shelfnumber');
+ $shelf = Koha::Virtualshelves->find($shelfnumber);
+ if ( $shelf ) {
+ $op = $referer;
+ if ( $shelf->can_be_managed( $loggedinuser ) ) {
+ $shelf->shelfname( $query->param('shelfname') );
+ $shelf->sortfield( $query->param('sortfield') );
+ $shelf->allow_add( $query->param('allow_add') );
+ $shelf->allow_delete_own( $query->param('allow_delete_own') );
+ $shelf->allow_delete_other( $query->param('allow_delete_other') );
+ $shelf->category( $query->param('category') );
+ eval { $shelf->store };
+
+ if ($@) {
+ push @messages, { type => 'error', code => 'error_on_update' };
+ $op = 'edit_form';
+ } else {
+ push @messages, { type => 'message', code => 'success_on_update' };
+ }
+ } else {
+ push @messages, { type => 'error', code => 'unauthorized_on_update' };
+ }
+ } else {
+ push @messages, { type => 'error', code => 'does_not_exist' };
+ }
+} elsif ( $op eq 'delete' ) {
+ $shelfnumber = $query->param('shelfnumber');
+ $shelf = Koha::Virtualshelves->find($shelfnumber);
+ if ($shelf) {
+ if ( $shelf->can_be_deleted( $loggedinuser ) ) {
+ eval { $shelf->delete; };
+ if ($@) {
+ push @messages, { type => 'error', code => ref($@), msg => $@ };
+ } else {
+ push @messages, { type => 'message', code => 'success_on_delete' };
+ }
+ } else {
+ push @messages, { type => 'error', code => 'unauthorized_on_delete' };
+ }
+ } else {
+ push @messages, { type => 'error', code => 'does_not_exist' };
+ }
+ $op = $referer;
+} elsif ( $op eq 'remove_share' ) {
+ $shelfnumber = $query->param('shelfnumber');
+ $shelf = Koha::Virtualshelves->find($shelfnumber);
+ if ($shelf) {
+ my $removed = eval { $shelf->remove_share( $loggedinuser ); };
+ if ($@) {
+ push @messages, { type => 'error', code => ref($@), msg => $@ };
+ } elsif ( $removed ) {
+ push @messages, { type => 'message', code => 'success_on_remove_share' };
+ } else {
+ push @messages, { type => 'error', code => 'error_on_remove_share' };
+ }
+ } else {
+ push @messages, { type => 'error', code => 'does_not_exist' };
+ }
+ $op = $referer;
+
+} elsif ( $op eq 'add_biblio' ) {
+ $shelfnumber = $query->param('shelfnumber');
+ $shelf = Koha::Virtualshelves->find($shelfnumber);
+ if ($shelf) {
+ if( my $barcode = $query->param('barcode') ) {
+ my $item = GetItem( 0, $barcode);
+ if (defined $item && $item->{itemnumber}) {
+ my $biblio = GetBiblioFromItemNumber( $item->{itemnumber} );
+ if ( $shelf->can_biblios_be_added( $loggedinuser ) ) {
+ my $added = eval { $shelf->add_biblio( $biblio->{biblionumber}, $loggedinuser ); };
+ if ($@) {
+ push @messages, { type => 'error', code => ref($@), msg => $@ };
+ } elsif ( $added ) {
+ push @messages, { type => 'message', code => 'success_on_add_biblio' };
+ } else {
+ push @messages, { type => 'message', code => 'error_on_add_biblio' };
+ }
+ } else {
+ push @messages, { type => 'error', code => 'unauthorized_on_add_biblio' };
+ }
+ } else {
+ push @messages, { type => 'error', code => 'item_does_not_exist' };
+ }
+ }
+ } else {
+ push @messages, { type => 'error', code => 'does_not_exist' };
+ }
+ $op = $referer;
+} elsif ( $op eq 'remove_biblios' ) {
+ $shelfnumber = $query->param('shelfnumber');
+ $shelf = Koha::Virtualshelves->find($shelfnumber);
+ my @biblionumber = $query->multi_param('biblionumber');
+ if ($shelf) {
+ if ( $shelf->can_biblios_be_removed( $loggedinuser ) ) {
+ my $number_of_biblios_removed = eval {
+ $shelf->remove_biblios(
+ {
+ biblionumbers => \@biblionumber,
+ borrowernumber => $loggedinuser,
+ }
+ );
+ };
+ if ($@) {
+ push @messages, { type => 'error', code => ref($@), msg => $@ };
+ } elsif ( $number_of_biblios_removed ) {
+ push @messages, { type => 'message', code => 'success_on_remove_biblios' };
+ } else {
+ push @messages, { type => 'error', code => 'no_biblio_removed' };
+ }
+ } else {
+ push @messages, { type => 'error', code => 'unauthorized_on_remove_biblios' };
+ }
+ } else {
+ push @messages, { type => 'error', code => 'does_not_exist' };
+ }
+ $op = 'view';
+}