To test:
1 - You will need to enable SIP on your testing instance
cp etc/SIPconfig.xml /etc/koha/sites/kohadev/
sudo koha-start-sip
add a user listed in the SIPconfig to your system and give them permissions (superlibrarian works)
on koha-testing-docker you should be able to start sip with user koha/koha without any adjustments
2 - If you copied the above file you should be set to get custom field DE with dateexpiry
Otherwise edit the sip login for the user to have a custom section like:
<login id="koha" password="koha" delimiter="|" error-detect="enabled" institution="kohalibrary" encoding="utf8" >
<custom_patron_field field="DE" template="[% patron.dateexpiry %]" />
</login>
3 - send a status test using the sip cli tester:
perl misc/sip_cli_emulator.pl -a 127.0.0.1 -p 6001 -su koha -sp koha -l kohalibrary --patron
23529001000463 -m patron_status_request
4 - send an information test using the sip cli tester:
perl misc/sip_cli_emulator.pl -a 127.0.0.1 -p 6001 -su koha -sp koha -l kohalibrary --patron
23529001000463 -m patron_information
5 - confirm you receive the DE field with a dateexpiry
6 - Add your own custom fields and confirm it works with several
<custom_patron_field field="EW" template="Phone: [% patron.phone %] Email: [% patron.email %]" />
7 - prove -v t/db_dependent/SIP/Patron.t
8 - prove -v t/db_dependent/SIP/
Signed-off-by: Andrew Fuerste-Henry <andrew@bywatersolutions.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
use Sys::Syslog qw(syslog);
use Data::Dumper;
-use C4::SIP::Sip qw(add_field);
+use C4::SIP::Sip qw(add_field maybe_add);
use C4::Debug;
use C4::Context;
}
}
-sub name {
+=head2 format
+
+This method uses a template to build a string from a Koha::Patron object
+If errors are encountered in processing template we log them and return nothing
+
+=cut
+
+sub format {
my ( $self, $template ) = @_;
if ($template) {
my $patron = Koha::Patrons->find( $self->{borrowernumber} );
my $output;
- $tt->process( \$template, { patron => $patron }, \$output );
+ eval {
+ $tt->process( \$template, { patron => $patron }, \$output );
+ };
+ if ( $@ ){
+ syslog("LOG_DEBUG", "Error processing template: $template");
+ return "";
+ }
return $output;
}
- else {
- return $self->{name};
- }
}
sub check_password {
my ( $self, $server ) = @_;
my $string = q{};
-
if ( $server->{account}->{patron_attribute} ) {
my @attributes_to_send =
ref $server->{account}->{patron_attribute} eq "ARRAY"
return $string;
}
+
+=head2 build_custom_field_string
+
+This method builds the part of the sip message for custom patron fields as defined in the sip config
+
+=cut
+
+sub build_custom_field_string {
+ my ( $self, $server ) = @_;
+
+ my $string = q{};
+
+ if ( $server->{account}->{custom_patron_field} ) {
+ my @custom_fields =
+ ref $server->{account}->{custom_patron_field} eq "ARRAY"
+ ? @{ $server->{account}->{custom_patron_field} }
+ : $server->{account}->{custom_patron_field};
+ foreach my $custom_field ( @custom_fields ) {
+ $string .= maybe_add( $custom_field->{field}, $self->format( $custom_field->{template} ) ) if defined $custom_field->{field};
+ }
+ }
+ return $string;
+}
+
1;
__END__
$value =~ s/$regex->{find}/$regex->{replace}/g;
}
}
-
return (defined($value) && $value) ? add_field($fid, $value) : '';
}
$resp .= patron_status_string($patron);
$resp .= $lang . timestamp();
- $resp .= add_field( FID_PERSONAL_NAME, $patron->name( $server->{account}->{ae_field_template} ), $server );
+ if ( defined $server->{account}->{ae_field_template} ) {
+ $resp .= add_field( FID_PERSONAL_NAME, $patron->format( $server->{account}->{ae_field_template}, $server ) );
+ } else {
+ $resp .= add_field( FID_PERSONAL_NAME, $patron->name, $server );
+ }
+
# while the patron ID we got from the SC is valid, let's
# use the one returned from the ILS, just in case...
if ( $server->{account}->{send_patron_home_library_in_af} );
$resp .= maybe_add( FID_PRINT_LINE, $patron->print_line, $server );
+ $resp .= $patron->build_custom_field_string( $server );
$resp .= $patron->build_patron_attributes_string( $server );
} else {
# while the patron ID we got from the SC is valid, let's
# use the one returned from the ILS, just in case...
$resp .= add_field( FID_PATRON_ID, $patron->id, $server );
- $resp .= add_field( FID_PERSONAL_NAME, $patron->name( $server->{account}->{ae_field_template} ), $server );
+ if ( defined $server->{account}->{ae_field_template} ) {
+ $resp .= add_field( FID_PERSONAL_NAME, $patron->format( $server->{account}->{ae_field_template} ), $server );
+ } else {
+ $resp .= add_field( FID_PERSONAL_NAME, $patron->name, $server );
+ }
# TODO: add code for the fields
# hold items limit
}
$resp .= maybe_add( FID_PRINT_LINE, $patron->print_line, $server );
+ $resp .= $patron->build_custom_field_string( $server );
$resp .= $patron->build_patron_attributes_string( $server );
} else {
$resp .= $patron->language . timestamp();
$resp .= add_field( FID_PATRON_ID, $patron->id, $server );
- $resp .= add_field( FID_PERSONAL_NAME, $patron->name( $server->{account}->{ae_field_template} ), $server );
+ $resp .= add_field( FID_PERSONAL_NAME, $patron->format( $server->{account}->{ae_field_template} ), $server );
if ( defined($patron_pwd) ) {
$resp .= add_field( FID_VALID_PATRON_PWD, sipbool( $patron->check_password($patron_pwd) ), $server );
}
<syspref_overrides>
<AllFinesNeedOverride>0</AllFinesNeedOverride>
</syspref_overrides>
+ <custom_patron_field field="DE" template="[% patron.dateexpiry %]" />
</login>
</accounts>
# This needs to be extended! Your help is appreciated..
use Modern::Perl;
-use Test::More tests => 5;
+use Test::More tests => 6;
use Koha::Database;
use Koha::Patrons;
is( $attribute_string, "XYTest Attribute|YZAnother Test Attribute|", 'Attribute field generated correctly with multiple params' );
};
+subtest "Test build_custom_field_string" => sub {
+
+ plan tests => 5;
+
+ my $patron = $builder->build_object( { class => 'Koha::Patrons',value=>{surname => "Duck", firstname => "Darkwing"} } );
+
+
+ my $ils_patron = C4::SIP::ILS::Patron->new( $patron->cardnumber );
+
+ my $server = {};
+ $server->{account}->{custom_patron_field}->{field} = "DW";
+ my $attribute_string = $ils_patron->build_custom_field_string( $server );
+ is( $attribute_string, "", 'Custom field not generated if no value passed' );
+
+ $server = {};
+ $server->{account}->{custom_patron_field}->{template} = "[% patron.surname %]";
+ $attribute_string = $ils_patron->build_custom_field_string( $server );
+ is( $attribute_string, "", 'Custom field not generated if no field passed' );
+
+
+ $server = {};
+ $server->{account}->{custom_patron_field}->{field} = "DW";
+ $server->{account}->{custom_patron_field}->{template} = "[% patron.firstname %] [% patron.surname %], let's get dangerous!";
+ $attribute_string = $ils_patron->build_custom_field_string( $server );
+ is( $attribute_string, "DWDarkwing Duck, let's get dangerous!|", 'Custom field processed correctly' );
+
+ $server = {};
+ $server->{account}->{custom_patron_field}->[0]->{field} = "DW";
+ $server->{account}->{custom_patron_field}->[0]->{template} = "[% patron.firstname %] [% patron.surname %], let's get dangerous!";
+ $server->{account}->{custom_patron_field}->[1]->{field} = "LM";
+ $server->{account}->{custom_patron_field}->[1]->{template} = "Launchpad McQuack crashed on [% patron.dateexpiry %]";
+ $attribute_string = $ils_patron->build_custom_field_string( $server );
+ is( $attribute_string, "DWDarkwing Duck, let's get dangerous!|LMLaunchpad McQuack crashed on ".$patron->dateexpiry."|", 'Custom fields processed correctly when multiple exist' );
+
+ $server = {};
+ $server->{account}->{custom_patron_field}->[0]->{field} = "DW";
+ $server->{account}->{custom_patron_field}->[0]->{template} = "[% IF (patron.firstname) %] patron.surname, let's get dangerous!";
+ $server->{account}->{custom_patron_field}->[1]->{field} = "LM";
+ $server->{account}->{custom_patron_field}->[1]->{template} = "Launchpad McQuack crashed on [% patron.dateexpiry %]";
+ $attribute_string = $ils_patron->build_custom_field_string( $server );
+ is( $attribute_string, "LMLaunchpad McQuack crashed on ".$patron->dateexpiry."|", 'Custom fields processed correctly, bad template generate no text' );
+
+};
+
subtest "update_lastseen tests" => sub {
plan tests => 2;