From 738e03d6a8f610f68949822d51b7272ed32cb9a8 Mon Sep 17 00:00:00 2001
From: Olli-Antti Kivilahti <olli-antti.kivilahti@jns.fi>
Date: Fri, 11 Sep 2015 17:18:04 +0300
Subject: [PATCH] Bug 14806 - Action Log for Modifying message_transport_types

This is a crude fix.
koha.action_logs-entries are generated when Borrower has been modified using
C4::Form::MessagingPreferences

log entries look like this:

| MEMBERS | MOD MTT | All message_transports removed
| MEMBERS | MOD MTT | [{'_name' => 'Advance_Notice','da' => '4','dig' => 1,'mtt' => ['email']},{'_name' => 'Item_Check_in','mtt' => ['email']},{'_name' => 'Item_Checkout','mtt' => ['email']}]

TEST PLAN:

0. Activate system preference "BorrowersLog".
1. In intra, edit a Borrowers messaging preferences.
2. In OPAC remove your messaging preferences.
3. SELECT * FROM action_logs ORDER BY timestamp DESC LIMIT 5;
3.1. You should see your new action logs entries.
---
 C4/Form/MessagingPreferences.pm | 41 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 40 insertions(+), 1 deletion(-)

diff --git a/C4/Form/MessagingPreferences.pm b/C4/Form/MessagingPreferences.pm
index bb981a6..6dc1634 100644
--- a/C4/Form/MessagingPreferences.pm
+++ b/C4/Form/MessagingPreferences.pm
@@ -20,6 +20,7 @@ package C4::Form::MessagingPreferences;
 use strict;
 use warnings;
 
+use Data::Dumper;
 use CGI qw ( -utf8 );
 use C4::Context;
 use C4::Members::Messaging;
@@ -76,13 +77,16 @@ sub handle_form_action {
     my $messaging_options = C4::Members::Messaging::GetMessagingOptions();
     # TODO: If a "NONE" box and another are checked somehow (javascript failed), we should pay attention to the "NONE" box
     my $prefs_set = 0;
+    my $borrowernumber;
+    my $logEntries = [];
     OPTION: foreach my $option ( @$messaging_options ) {
         my $updater = { %{ $target_params }, 
                         message_attribute_id    => $option->{'message_attribute_id'} };
+        $borrowernumber = $target_params->{borrowernumber} unless $borrowernumber;
         
         # find the desired transports
         @{$updater->{'message_transport_types'}} = $query->param( $option->{'message_attribute_id'} );
-        next OPTION unless $updater->{'message_transport_types'};
+        next OPTION unless $updater->{'message_transport_types'}; #Shouldn't this be "unless scalar(@{$updater->{'message_transport_types'}});" however this would never let existing message_preferences to be deleted :)
 
         if ( $option->{'has_digest'} ) {
             if ( List::Util::first { $_ == $option->{'message_attribute_id'} } $query->param( 'digest' ) ) {
@@ -98,6 +102,8 @@ sub handle_form_action {
 
         C4::Members::Messaging::SetMessagingPreference( $updater );
 
+        _pushToActionLogBuffer($logEntries, $updater, $option);
+
 	if ($query->param( $option->{'message_attribute_id'})){
 	    $prefs_set = 1;
 	}
@@ -109,6 +115,8 @@ sub handle_form_action {
     }
     # show the success message
     $template->param( settings_updated => 1 );
+
+    _writeActionLogBuffer($logEntries, $borrowernumber);
 }
 
 =head2 set_form_values
@@ -149,6 +157,37 @@ sub set_form_values {
     $template->param(messaging_preferences => $messaging_options);
 }
 
+sub _pushToActionLogBuffer {
+    return unless C4::Context->preference("BorrowersLog");
+    my ($logEntries, $updater, $option) = @_;
+
+    if ($updater->{message_transport_types} && scalar(@{$updater->{message_transport_types}})) {
+        my $entry = {};
+        $entry->{cc}   = $updater->{categorycode}    if $updater->{categorycode};
+        $entry->{dig}  = $updater->{wants_digest}    if $updater->{wants_digest};
+        $entry->{da}   = $updater->{days_in_advance} if $updater->{days_in_advance};
+        $entry->{mtt}  = $updater->{message_transport_types};
+        $entry->{_name} = $option->{message_name};
+        push(@$logEntries, $entry);
+    }
+}
+
+sub _writeActionLogBuffer {
+    return unless C4::Context->preference("BorrowersLog");
+    my ($logEntries, $borrowernumber) = @_;
+
+    if (scalar(@$logEntries)) {
+        my $d = Data::Dumper->new([$logEntries]);
+        $d->Indent(0);
+        $d->Purity(0);
+        $d->Terse(1);
+        C4::Log::logaction('MEMBERS', 'MOD MTT', $borrowernumber, $d->Dump($logEntries));
+    }
+    else {
+        C4::Log::logaction('MEMBERS', 'MOD MTT', $borrowernumber, 'All message_transports removed')
+    }
+}
+
 =head1 TODO
 
 =over 4
-- 
1.9.1