From d10bf022ee0023b106ecb72580a4e63827297be5 Mon Sep 17 00:00:00 2001
From: Kyle M Hall <kyle@bywatersolutions.com>
Date: Thu, 29 Dec 2016 15:39:28 +0000
Subject: [PATCH] Bug 17826 - Allow extended patron attributes to be sent in
 arbitrary SIP2 fields

Some libraries need to be able to send additional patron data from the
extended patron attributes in made up SIP2 fields for the patron
information and patron status responses.

Test Plan:
1) Apply this patch
2) Create 3 new patron attributes with the codes CODE1, CODE2, CODE3.
   Make a least one repeatable.
3) Create a patron, add those attibutes for the patron, make sure there
   are at least two instances of the repeatable code
4) Edit your SIP2 config file, add the following within the login stanza:
   <patron_attribute field="XX" code="CODE1" />
   <patron_attribute field="XY" code="CODE2" />
   <patron_attribute field="XZ" code="CODE3" />
5) Using the sip cli emulator, run patron_information and
   patron_status_request messages for the patron
6) Note the values you set for the patron attributes are sent in the
   corrosponding fields!

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Daniel Mauchley <dmauchley@duchesne.utah.gov>
---
 C4/SIP/ILS/Patron.pm  | 31 +++++++++++++++++++++++++++++++
 C4/SIP/Sip/MsgType.pm |  6 ++++++
 etc/SIPconfig.xml     |  1 +
 3 files changed, 38 insertions(+)

diff --git a/C4/SIP/ILS/Patron.pm b/C4/SIP/ILS/Patron.pm
index 0012776..36bc898 100644
--- a/C4/SIP/ILS/Patron.pm
+++ b/C4/SIP/ILS/Patron.pm
@@ -15,6 +15,8 @@ use Carp;
 use Sys::Syslog qw(syslog);
 use Data::Dumper;
 
+use C4::SIP::Sip qw(add_field);
+
 use C4::Debug;
 use C4::Context;
 use C4::Koha;
@@ -447,6 +449,35 @@ sub _get_outstanding_holds {
     return \@hold_array;
 }
 
+sub build_patron_attributes_string {
+    my ( $self, $server ) = @_;
+
+    my $string = q{};
+
+    if ( $server->{account}->{patron_attribute} ) {
+        my @attributes_to_send =
+          ref $server->{account}->{patron_attribute} eq "ARRAY"
+          ? @{ $server->{account}->{patron_attribute} }
+          : $server->{account}->{patron_attribute};
+
+        foreach my $a ( @attributes_to_send ) {
+            my @attributes = Koha::Patron::Attributes->search(
+                {
+                    borrowernumber => $self->{borrowernumber},
+                    code           => $a->{code}
+                }
+            );
+
+            foreach my $attribute ( @attributes ) {
+                my $value = $attribute->attribute();
+                $string .= add_field( $a->{field}, $value );
+            }
+        }
+    }
+
+    return $string;
+}
+
 1;
 __END__
 
diff --git a/C4/SIP/Sip/MsgType.pm b/C4/SIP/Sip/MsgType.pm
index 4e406e2..464a8fc 100644
--- a/C4/SIP/Sip/MsgType.pm
+++ b/C4/SIP/Sip/MsgType.pm
@@ -19,6 +19,8 @@ use Data::Dumper;
 use CGI qw ( -utf8 );
 use C4::Auth qw(&check_api_auth);
 
+use Koha::Patron::Attributes;
+
 use UNIVERSAL::can;
 
 use vars qw(@ISA @EXPORT_OK);
@@ -443,6 +445,8 @@ sub build_patron_status {
           if ( $server->{account}->{send_patron_home_library_in_af} );
         $resp .= maybe_add( FID_PRINT_LINE, $patron->print_line );
 
+        $resp .= $patron->build_patron_attributes_string( $server );
+
     } else {
         # Invalid patron (cardnumber)
         # Report that the user has no privs.
@@ -1006,6 +1010,8 @@ sub handle_patron_info {
             $resp .= maybe_add( FID_SCREEN_MSG, $patron->{branchcode}, $server);
         }
         $resp .= maybe_add( FID_PRINT_LINE, $patron->print_line );
+
+        $resp .= $patron->build_patron_attributes_string( $server );
     } else {
 
         # Invalid patron ID:
diff --git a/etc/SIPconfig.xml b/etc/SIPconfig.xml
index 40e495e..45f9ec0 100644
--- a/etc/SIPconfig.xml
+++ b/etc/SIPconfig.xml
@@ -54,6 +54,7 @@
              av_field_template="[% accountline.description %] [% accountline.amountoutstanding | format('%.2f') %]" >
           <screen_msg_regex find="Greetings from Koha." replace="Welcome to your library!" />
           <screen_msg_regex find="Invalid patron barcode." replace="Barcode not found, are you sure this is your library card?" />
+          <patron_attribute field="XY" code="CODE" />
       </login>
   </accounts>
 
-- 
2.1.4