Bug 21986: Do not escape quotation marks when cataloguing
[koha.git] / members / housebound.pl
index f5ced86..574bacd 100755 (executable)
 use Modern::Perl;
 use CGI;
 use C4::Auth;
+use C4::Context;
+use C4::Members::Attributes qw(GetBorrowerAttributes);
 use C4::Output;
+use DateTime;
+use Koha::DateUtils;
 use Koha::Libraries;
 use Koha::Patrons;
 use Koha::Patron::Categories;
@@ -43,98 +47,129 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
         query           => $input,
         type            => 'intranet',
         authnotrequired => 0,
-        flagsrequired   => { borrowers => 1 },
+        flagsrequired   => { borrowers => 'edit_borrowers' },
     }
 );
 
-my $patron = Koha::Patrons->new->find($input->param('borrowernumber'));
+my @messages;                   # For error messages.
 my $method = $input->param('method') // q{};
 my $visit_id = $input->param('visit_id') // q{};
-my $branch = Koha::Libraries->new->find($patron->branchcode);
-my $category = Koha::Patron::Categories->new->find($patron->categorycode);
-my $houseboundprofile = $patron->housebound_profile;
 
-my ( $houseboundvisits, $deliverers, $choosers );
-my ( $houseboundvisit, $deliverer, $chooser );
+# Get patron
+my $borrowernumber = $input->param('borrowernumber');
+my $logged_in_user = Koha::Patrons->find( $loggedinuser ) or die "Not logged in";
+my $patron = Koha::Patrons->find($borrowernumber);
+output_and_exit_if_error( $input, $cookie, $template, { module => 'members', logged_in_user => $logged_in_user, current_patron => $patron } );
 
-if ( $method eq 'updateconfirm' ) {
+# Get supporting cast
+my ( $houseboundprofile, $visit );
+if ( $patron ) { # FIXME This test is not needed - output_and_exit_if_error handles it
+    $houseboundprofile = $patron->housebound_profile;
+}
+if ( $visit_id ) {
+    $visit = eval {
+        return Koha::Patron::HouseboundVisits->find($visit_id);
+    };
+    push @messages, { type => 'error', code => 'error_on_visit_load' }
+        if ( $@ or !$visit );
+}
+
+# Main processing
+my ( $deliverers, $choosers, $houseboundvisit );
+
+if ( $method eq 'updateconfirm' and $houseboundprofile ) {
     # We have received the input from the profile edit form.  We must save the
     # changes, and return to simple display.
     $houseboundprofile->set({
-        day           => $input->param('day')           // q{},
-        frequency     => $input->param('frequency')     // q{},
-        fav_itemtypes => $input->param('fav_itemtypes') // q{},
-        fav_subjects  => $input->param('fav_subjects')  // q{},
-        fav_authors   => $input->param('fav_authors')   // q{},
-        referral      => $input->param('referral')      // q{},
-        notes         => $input->param('notes')         // q{},
+        day           => scalar $input->param('day')           // q{},
+        frequency     => scalar $input->param('frequency')     // q{},
+        fav_itemtypes => scalar $input->param('fav_itemtypes') // q{},
+        fav_subjects  => scalar $input->param('fav_subjects')  // q{},
+        fav_authors   => scalar $input->param('fav_authors')   // q{},
+        referral      => scalar $input->param('referral')      // q{},
+        notes         => scalar $input->param('notes')         // q{},
     });
-    die("Unable to store edited profile")
-        unless ( $houseboundprofile->store );
+    my $success = eval { return $houseboundprofile->store };
+    push @messages, { type => 'error', code => 'error_on_profile_store' }
+        if ( $@ or !$success );
     $method = undef;
 } elsif ( $method eq 'createconfirm' ) {
     # We have received the input necessary to create a new profile.  We must
     # save it, and return to simple display.
     $houseboundprofile = Koha::Patron::HouseboundProfile->new({
         borrowernumber => $patron->borrowernumber,
-        day            => $input->param('day')           // q{},
-        frequency      => $input->param('frequency')     // q{},
-        fav_itemtypes  => $input->param('fav_itemtypes') // q{},
-        fav_subjects   => $input->param('fav_subjects')  // q{},
-        fav_authors    => $input->param('fav_authors')   // q{},
-        referral       => $input->param('referral')      // q{},
-        notes          => $input->param('notes')         // q{},
+        day            => scalar $input->param('day')           // q{},
+        frequency      => scalar $input->param('frequency')     // q{},
+        fav_itemtypes  => scalar $input->param('fav_itemtypes') // q{},
+        fav_subjects   => scalar $input->param('fav_subjects')  // q{},
+        fav_authors    => scalar $input->param('fav_authors')   // q{},
+        referral       => scalar $input->param('referral')      // q{},
+        notes          => scalar $input->param('notes')         // q{},
     });
-    die("Unable to store new profile")
-        unless ( $houseboundprofile->store );
+    my $success = eval { return $houseboundprofile->store };
+    push @messages, { type => 'error', code => 'error_on_profile_create' }
+        if ( $@ or !$success );
     $method = undef;
 } elsif ( $method eq 'visit_update_or_create' ) {
     # We want to edit, edit a visit, so we must pass its details.
-    $deliverers = Koha::Patrons->new->housebound_deliverers;
-    $choosers = Koha::Patrons->new->housebound_choosers;
-    $houseboundvisit = Koha::Patron::HouseboundVisits->find($visit_id)
-        if ( $visit_id );
-} elsif ( $method eq 'visit_delete' ) {
+    $deliverers = Koha::Patrons->search_housebound_deliverers;
+    $choosers = Koha::Patrons->search_housebound_choosers;
+    $houseboundvisit = $visit;
+} elsif ( $method eq 'visit_delete' and $visit ) {
     # We want ot delete a specific visit.
-    my $visit = Koha::Patron::HouseboundVisits->find($visit_id);
-    die("Unable to delete visit") unless ( $visit->delete );
+    my $success = eval { return $visit->delete };
+    push @messages, { type => 'error', code => 'error_on_visit_delete' }
+        if ( $@ or !$success );
     $method = undef;
-} elsif ( $method eq 'editvisitconfirm' ) {
+} elsif ( $method eq 'editvisitconfirm' and $visit ) {
     # We have received input for editing a visit.  We must store and return to
     # simple display.
-    my $visit = Koha::Patron::HouseboundVisits->find($visit_id);
     $visit->set({
-        borrowernumber      => $input->param('borrowernumber') // q{},
-        appointment_date    => $input->param('date')           // q{},
-        day_segment         => $input->param('segment')        // q{},
-        chooser_brwnumber   => $input->param('chooser')        // q{},
-        deliverer_brwnumber => $input->param('deliverer')      // q{},
+        borrowernumber      => scalar $input->param('borrowernumber')      // q{},
+        appointment_date    => dt_from_string($input->param('date') // q{}),
+        day_segment         => scalar $input->param('segment')             // q{},
+        chooser_brwnumber   => scalar $input->param('chooser')             // q{},
+        deliverer_brwnumber => scalar $input->param('deliverer')           // q{},
     });
-    die("Unable to store edited visit") unless ( $visit->store );
+    my $success = eval { return $visit->store };
+    push @messages, { type => 'error', code => 'error_on_visit_store' }
+        if ( $@ or !$success );
     $method = undef;
-} elsif ( $method eq 'addvisitconfirm' ) {
+} elsif ( $method eq 'addvisitconfirm' and !$visit ) {
     # We have received input for creating a visit.  We must store and return
     # to simple display.
     my $visit = Koha::Patron::HouseboundVisit->new({
-        borrowernumber      => $input->param('borrowernumber') // q{},
-        appointment_date    => $input->param('date')           // q{},
-        day_segment         => $input->param('segment')        // q{},
-        chooser_brwnumber   => $input->param('chooser')        // q{},
-        deliverer_brwnumber => $input->param('deliverer')      // q{},
+        borrowernumber      => scalar $input->param('borrowernumber')      // q{},
+        appointment_date    => dt_from_string($input->param('date') // q{}),
+        day_segment         => scalar $input->param('segment')             // q{},
+        chooser_brwnumber   => scalar $input->param('chooser')             // q{},
+        deliverer_brwnumber => scalar $input->param('deliverer')           // q{},
     });
-    die("Unable to store new visit") unless ( $visit->store );
+    my $success = eval { return $visit->store };
+    push @messages, { type => 'error', code => 'error_on_visit_create' }
+        if ( $@ or !$success );
     $method = undef;
 }
 
 # We don't have any profile information, so we must display a creation form.
 $method = 'update_or_create' if ( !$houseboundprofile );
 
+# Ensure template has all patron details.
+$template->param( patron => $patron );
+
+# Load extended patron attributes if necessary (taken from members/files.pl).
+if ( C4::Context->preference('ExtendedPatronAttributes') and $patron ) {
+    my $attributes = GetBorrowerAttributes($patron->borrowernumber);
+    $template->param(
+        ExtendedPatronAttributes => 1,
+        extendedattributes => $attributes
+    );
+}
+
 $template->param(
-    patron             => $patron,
     housebound_profile => $houseboundprofile,
     visit              => $houseboundvisit,
-    branch             => $branch,
-    category           => $category,
+    messages           => \@messages,
     method             => $method,
     choosers           => $choosers,
     deliverers         => $deliverers,