Bug 10636 - patronimage should have borrowernumber as PK, not cardnumber
[koha.git] / members / member-flags.pl
index 8522f3e..7b08108 100755 (executable)
 # July 26, 2002 (my birthday!)
 
 use strict;
+use warnings;
 
-use C4::Search;
 use CGI;
 use C4::Output;
-use C4::Auth;
+use C4::Auth qw(:DEFAULT :EditPermissions);
 use C4::Context;
-use C4::Circulation::Circ2;
+use C4::Members;
+use C4::Branch;
+use C4::Members::Attributes qw(GetBorrowerAttributes);
 #use C4::Acquisitions;
-use HTML::Template;
-use C4::Interface::CGI::Output;
 
-my $input = new CGI;
+use C4::Output;
 
-my $flagsrequired;
-$flagsrequired->{borrowers}=1;
-$flagsrequired->{permissions}=1;
+my $input = new CGI;
 
+my $flagsrequired = { permissions => 1 };
+my $member=$input->param('member');
+my $bor = GetMemberDetails( $member,'');
+if( $bor->{'category_type'} eq 'S' )  {
+       $flagsrequired->{'staffaccess'} = 1;
+}
 my ($template, $loggedinuser, $cookie)
        = get_template_and_user({template_name => "members/member-flags.tmpl",
                                query => $input,
                                type => "intranet",
                                authnotrequired => 0,
-                               flagsrequired => {borrowers => 1},
+                               flagsrequired => $flagsrequired,
                                debug => 1,
                                });
 
 
-
-
-my $member=$input->param('member');
-my %env;
-$env{'nottodayissues'}=1;
 my %member2;
 $member2{'borrowernumber'}=$member;
-my $issues=currentissues(\%env,\%member2);
-my $i=0;
-foreach (sort keys %$issues) {
-    $i++;
-}
 
 if ($input->param('newflags')) {
     my $dbh=C4::Context->dbh();
-    my $flags=0;
-    foreach ($input->param) {
-       if (/flag-(\d+)/) {
-           my $flag=$1;
-           $flags=$flags+2**$flag;
-       }
+
+    my @perms = $input->param('flag');
+    my %all_module_perms = ();
+    my %sub_perms = ();
+    foreach my $perm (@perms) {
+        if ($perm !~ /:/) {
+            $all_module_perms{$perm} = 1;
+        } else {
+            my ($module, $sub_perm) = split /:/, $perm, 2;
+            push @{ $sub_perms{$module} }, $sub_perm;
+        }
     }
-    my $sth=$dbh->prepare("update borrowers set flags=? where borrowernumber=?");
-    $sth->execute($flags, $member);
-    print $input->redirect("/cgi-bin/koha/moremember.pl?bornum=$member");
-} else {
-    my ($bor,$flags,$accessflags)=getpatroninformation(\%env, $member,'');
 
+    # construct flags
+    my $module_flags = 0;
+    my $sth=$dbh->prepare("SELECT bit,flag FROM userflags ORDER BY bit");
+    $sth->execute();
+    while (my ($bit, $flag) = $sth->fetchrow_array) {
+        if (exists $all_module_perms{$flag}) {
+            $module_flags += 2**$bit;
+        }
+    }
+    
+    $sth = $dbh->prepare("UPDATE borrowers SET flags=? WHERE borrowernumber=?");
+    $sth->execute($module_flags, $member);
+    
+    # deal with subpermissions
+    $sth = $dbh->prepare("DELETE FROM user_permissions WHERE borrowernumber = ?");
+    $sth->execute($member); 
+    $sth = $dbh->prepare("INSERT INTO user_permissions (borrowernumber, module_bit, code)
+                        SELECT ?, bit, ?
+                        FROM userflags
+                        WHERE flag = ?");
+    foreach my $module (keys %sub_perms) {
+        next if exists $all_module_perms{$module};
+        foreach my $sub_perm (@{ $sub_perms{$module} }) {
+            $sth->execute($member, $sub_perm, $module);
+        }
+    }
+    
+    print $input->redirect("/cgi-bin/koha/members/moremember.pl?borrowernumber=$member");
+} else {
+#     my ($bor,$flags,$accessflags)=GetMemberDetails($member,'');
+    my $flags = $bor->{'flags'};
+    my $accessflags = $bor->{'authflags'};
     my $dbh=C4::Context->dbh();
-    my $sth=$dbh->prepare("select bit,flag,flagdesc from userflags order by bit");
+    my $all_perms  = get_all_subpermissions();
+    my $user_perms = get_user_subpermissions($bor->{'userid'});
+    my $sth=$dbh->prepare("SELECT bit,flag,flagdesc FROM userflags ORDER BY bit");
     $sth->execute;
     my @loop;
     while (my ($bit, $flag, $flagdesc) = $sth->fetchrow) {
-       my $checked='';
-       if ($accessflags->{$flag}) {
-           $checked='checked';
-       }
-       my %row = ( bit => $bit,
-                flag => $flag,
-                checked => $checked,
-                flagdesc => $flagdesc );
-       push @loop, \%row;
+           my $checked='';
+           if ($accessflags->{$flag}) {
+               $checked= 1;
+           }
+
+           my %row = ( bit => $bit,
+                   flag => $flag,
+                   checked => $checked,
+                   flagdesc => $flagdesc );
+
+        my @sub_perm_loop = ();
+        my $expand_parent = 0;
+        if ($checked) {
+            if (exists $all_perms->{$flag}) {
+                $expand_parent = 1;
+                foreach my $sub_perm (sort keys %{ $all_perms->{$flag} }) {
+                    push @sub_perm_loop, {
+                        id => "${flag}_$sub_perm",
+                        perm => "$flag:$sub_perm",
+                        code => $sub_perm,
+                        description => $all_perms->{$flag}->{$sub_perm},
+                        checked => 1
+                    };
+                }
+            }
+        } else {
+            if (exists $user_perms->{$flag}) {
+                $expand_parent = 1;
+                # put selected ones first
+                foreach my $sub_perm (sort keys %{ $user_perms->{$flag} }) {
+                    push @sub_perm_loop, {
+                        id => "${flag}_$sub_perm",
+                        perm => "$flag:$sub_perm",
+                        code => $sub_perm,
+                        description => $all_perms->{$flag}->{$sub_perm},
+                        checked => 1
+                    };
+                }
+            }
+            # then ones not selected
+            if (exists $all_perms->{$flag}) {
+                foreach my $sub_perm (sort keys %{ $all_perms->{$flag} }) {
+                    push @sub_perm_loop, {
+                        id => "${flag}_$sub_perm",
+                        perm => "$flag:$sub_perm",
+                        code => $sub_perm,
+                        description => $all_perms->{$flag}->{$sub_perm},
+                        checked => 0
+                    } unless exists $user_perms->{$flag} and exists $user_perms->{$flag}->{$sub_perm};
+                }
+            }
+        }
+        $row{expand} = $expand_parent;
+        if ($#sub_perm_loop > -1) {
+            $row{sub_perm_loop} = \@sub_perm_loop;
+        }
+           push @loop, \%row;
+    }
+
+    if ( $bor->{'category_type'} eq 'C') {
+        my  ( $catcodes, $labels ) =  GetborCatFromCatType( 'A', 'WHERE category_type = ?' );
+        my $cnt = scalar(@$catcodes);
+        $template->param( 'CATCODE_MULTI' => 1) if $cnt > 1;
+        $template->param( 'catcode' =>    $catcodes->[0])  if $cnt == 1;
     }
+       
+$template->param( adultborrower => 1 ) if ( $bor->{'category_type'} eq 'A' );
+    my ($picture, $dberror) = GetPatronImage($bor->{'borrowernumber'});
+    $template->param( picture => 1 ) if $picture;
+
+if (C4::Context->preference('ExtendedPatronAttributes')) {
+    my $attributes = GetBorrowerAttributes($bor->{'borrowernumber'});
+    $template->param(
+        ExtendedPatronAttributes => 1,
+        extendedattributes => $attributes
+    );
+}
 
-    $template->param(member => $member,
-                       surname => $bor->{'surname'},
-                       firstname => $bor->{'firstname'},
-                       loop => \@loop);
+$template->param(
+               borrowernumber => $bor->{'borrowernumber'},
+    cardnumber => $bor->{'cardnumber'},
+               surname => $bor->{'surname'},
+               firstname => $bor->{'firstname'},
+               categorycode => $bor->{'categorycode'},
+               category_type => $bor->{'category_type'},
+               categoryname => $bor->{'description'},
+               address => $bor->{'address'},
+               address2 => $bor->{'address2'},
+               city => $bor->{'city'},
+        state => $bor->{'state'},
+               zipcode => $bor->{'zipcode'},
+               country => $bor->{'country'},
+               phone => $bor->{'phone'},
+               email => $bor->{'email'},
+               branchcode => $bor->{'branchcode'},
+               branchname => GetBranchName($bor->{'branchcode'}),
+               loop => \@loop,
+               is_child        => ($bor->{'category_type'} eq 'C'),
+               activeBorrowerRelationship => (C4::Context->preference('borrowerRelationship') ne ''),
+        RoutingSerials => C4::Context->preference('RoutingSerials'),
+               );
 
     output_html_with_http_headers $input, $cookie, $template->output;