ffzg/recall_notices.pl: added --interval and --dedup
[koha.git] / admin / item_circulation_alerts.pl
index f8c1227..9ea89a5 100755 (executable)
@@ -2,67 +2,37 @@
 
 # This file is part of Koha.
 #
-# Koha is free software; you can redistribute it and/or modify it under the
-# terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 2 of the License, or (at your option) any later
-# version.
+# Koha is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
 #
-# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+# Koha is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
 #
-# You should have received a copy of the GNU General Public License along with
-# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
-# Suite 330, Boston, MA  02111-1307 USA
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
 
-use strict;
-use warnings;
+use Modern::Perl;
 
-use CGI;
+use CGI qw ( -utf8 );
 use File::Basename;
 use Encode;
-use URI::Escape 'uri_escape_utf8';
+use JSON;
 #use Data::Dump 'pp';
 
 use C4::Auth;
 use C4::Context;
-use C4::Branch;
-use C4::Category;
-use C4::ItemType;
 use C4::ItemCirculationAlertPreference;
 use C4::Output;
 
-# shortcut for long package name
-my $preferences = 'C4::ItemCirculationAlertPreference';
-
-# common redirect code
-sub redirect {
-    my ($input) = @_;
-    my $path = defined($input->param('redirect_to'))
-        ? $input->param('redirect_to')
-        : basename($0);
-    print $input->redirect($path);
-}
-
-# utf8 filter
-sub utf8 {
-    my ($data, @keys) = @_;
-    for (@keys) {
-        $data->{$_} = decode('utf8', $data->{$_});
-    }
-    $data;
-}
+use Koha::ItemTypes;
+use Koha::Patron::Categories;
 
-# add long category and itemtype descriptions to preferences
-sub category_and_itemtype {
-    my ($categories, $item_types, @prefs) = @_;
-    my %c = map { $_->{categorycode} => $_->{description} } @$categories;
-    my %i = map { $_->{itemtype}     => $_->{description} } @$item_types;
-    for (@prefs) {
-        $_->{category_description} = $c{$_->{categorycode}} || 'Default';
-        $_->{item_type_description} = $i{$_->{item_type}} || 'Default';
-    }
-}
+# shortcut for long package name
+our $preferences = 'C4::ItemCirculationAlertPreference';
 
 # display item circulation alerts
 sub show {
@@ -70,85 +40,77 @@ sub show {
     my $dbh = C4::Context->dbh;
     my ($template, $user, $cookie) = get_template_and_user(
         {
-            template_name   => "admin/item_circulation_alerts.tmpl",
+            template_name   => "admin/item_circulation_alerts.tt",
             query           => $input,
             type            => "intranet",
             authnotrequired => 0,
-            flagsrequired   => { admin => 1 },
+            flagsrequired   => { parameters => 'item_circ_alerts' },
             debug           => defined($input->param('debug')),
         }
     );
 
-    my $br       = GetBranches;
     my $branch   = $input->param('branch') || '*';
-    my @branches = map { utf8($_, 'branchname') } (
-        {
-            branchcode => '*',
-            branchname => 'Default',
-        },
-        sort { $a->{branchname} cmp $b->{branchname} } values %$br,
-    );
-    for (@branches) {
-        $_->{selected} = "selected" if ($branch eq $_->{branchcode});
-    }
-    my $branch_name = exists($br->{$branch}) && $br->{$branch}->{branchname};
-
-    my @categories = map { utf8($_, 'description') }  (
-        C4::Category->new({ categorycode => '*', description => 'Default' }),
-        C4::Category->all
-    );
-    my @item_types = map { utf8($_, 'description') }  (
-        C4::ItemType->new({ itemtype => '*', description => 'Default' }),
-        C4::ItemType->all
-    );
-    my @default_prefs = $preferences->find({ branchcode => '*' });
-    my @branch_prefs;
-    my $redirect_to = "?branch=$branch";
+    my @categories = Koha::Patron::Categories->search_limited;
+    my @item_types = Koha::ItemTypes->search;
+    my $grid_checkout = $preferences->grid({ branchcode => $branch, notification => 'CHECKOUT' });
+    my $grid_checkin  = $preferences->grid({ branchcode => $branch, notification => 'CHECKIN' });
 
-    $template->param(redirect_to        => $redirect_to);
-    $template->param(redirect_to_x      => uri_escape_utf8($redirect_to));
     $template->param(branch             => $branch);
-    $template->param(branch_name        => $branch_name);
-    $template->param(branches           => \@branches);
     $template->param(categories         => \@categories);
     $template->param(item_types         => \@item_types);
-    $template->param(default_prefs      => \@default_prefs);
-    if ($branch ne '*') {
-        @branch_prefs = $preferences->find({ branchcode => $branch });
-        $template->param(branch_prefs => \@branch_prefs);
-    }
-    category_and_itemtype(\@categories, \@item_types, (@default_prefs, @branch_prefs));
+    $template->param(grid_checkout      => $grid_checkout);
+    $template->param(grid_checkin       => $grid_checkin);
+
     output_html_with_http_headers $input, $cookie, $template->output;
 }
 
-# create item circulation alert preference and redirect
-sub create {
+# toggle a preference via ajax
+sub toggle {
     my ($input) = @_;
-    my $branchcode   = $input->param('branchcode');
-    my $categorycode = $input->param('categorycode');
-    my $item_type    = $input->param('item_type');
-    $preferences->create({
-        branchcode   => $branchcode,
-        categorycode => $categorycode,
+    my $id = $input->param('id');
+    my $branch = $input->param('branch');
+    my ($category, $item_type, $notification) = split('-', $id);
+    $category  =~ s/_/*/;
+    $item_type =~ s/_/*/;
+
+    my $settings = {
+        branchcode   => $branch,
+        categorycode => $category,
         item_type    => $item_type,
-    });
-    redirect($input);
-}
+        notification => $notification,
+    };
+
+    my $restrictions = $preferences;  # all the same thing...
+    my $notifications = $preferences; #
+    if ($notifications->is_enabled_for($settings)) {
+        # toggle by adding a restriction
+        $restrictions->create($settings);
+    } else {
+        # toggle by removing the restriction
+        $restrictions->delete($settings);
+    }
 
-# delete preference and redirect
-sub delete {
-    my ($input) = @_;
-    my $id = $input->param('id');
-    $preferences->delete({ id => $id });
-    redirect($input);
+    my $response = { success => 1 };
+    my @reasons  = $notifications->is_disabled_for($settings);
+    if (@reasons == 0) {
+        $response->{classes} = '';
+    } else {
+        my $default_exists   = grep { $_->{branchcode} eq '*' } @reasons;
+        my $non_default_also = grep { $_->{branchcode} ne '*' } @reasons;
+        my @classes;
+        push @classes, 'default'  if $default_exists;
+        push @classes, 'disabled' if $non_default_also;
+        $response->{classes} = join(' ', @classes);
+    }
+    print $input->header;
+    print encode_json($response);
 }
 
 # dispatch to various actions based on CGI parameter 'action'
 sub dispatch {
     my %handler = (
         show   => \&show,
-        create => \&create,
-        delete => \&delete,
+        toggle => \&toggle,
     );
     my $input  = new CGI;
     my $action = $input->param('action') || 'show';
@@ -192,7 +154,7 @@ Display a branches item circulation alert preferences.
 
 Parameters:
 
-=over 4
+=over 2
 
 =item branch
 
@@ -203,58 +165,23 @@ branch '*' is used.
 
 
 
+=head3 ?action=toggle
 
-=head3 ?action=create
-
-Create an item circulation alert preference.
-
-Parameters:
-
-=over 4
-
-=item branchcode
-
-Branch code
-
-=item categorycode
-
-Patron category
-
-=item item_type
-
-Item type
-
-=back
-
-
-
-
-=head3 ?action=delete
-
-Delete an item circulation alert preference.
+Toggle a preference via AJAX
 
 Parameters:
 
-=over 4
+=over 2
 
 =item id
 
-The id of the preference to delete.
-
-=back
+The id should be string that can be split on "-" which contains:
+"$categorycode-$item_type-$notification".
 
+=item branch
 
+Branch code to apply this preference to
 
+=back
 
 =cut
-
-# Local Variables: ***
-# mode: cperl ***
-# indent-tabs-mode: nil ***
-# cperl-close-paren-offset: -4 ***
-# cperl-continued-statement-offset: 4 ***
-# cperl-indent-level: 4 ***
-# cperl-indent-parens-as-block: t ***
-# cperl-tab-always-indent: nil ***
-# End: ***
-# vim:tabstop=8 softtabstop=4 shiftwidth=4 shiftround expandtab