X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=members%2Fpaycollect.pl;h=b189107f25baaeb224d947e2766a0bffbdb7b2d8;hb=d7c1d52051a3cb5f6ae3be9abb0e9e7aa1f9ece5;hp=f105c8e398eae548a96f3517a036b40f688e25f1;hpb=3034c028264f072fc1a447a11a518255282fc990;p=koha-ffzg.git diff --git a/members/paycollect.pl b/members/paycollect.pl index f105c8e398..b189107f25 100755 --- a/members/paycollect.pl +++ b/members/paycollect.pl @@ -18,99 +18,136 @@ # along with Koha; if not, see . use Modern::Perl; -use URI::Escape; +use URI::Escape qw( uri_escape uri_unescape ); use CGI qw ( -utf8 ); use C4::Context; -use C4::Auth; -use C4::Output; -use C4::Members; +use C4::Auth qw( get_template_and_user ); +use C4::Output qw( output_and_exit_if_error output_and_exit output_html_with_http_headers ); use C4::Accounts; use C4::Koha; +use Koha::Cash::Registers; use Koha::Patrons; use Koha::Patron::Categories; use Koha::AuthorisedValues; use Koha::Account; +use Koha::Account::Lines; +use Koha::AdditionalFields; use Koha::Token; +use Koha::DateUtils qw( output_pref ); my $input = CGI->new(); -my $writeoff_individual = $input->param('writeoff_individual'); -my $type = scalar $input->param('type') || 'payment'; +my $payment_id = $input->param('payment_id'); +my $writeoff_individual = $input->param('writeoff_individual'); +my $change_given = $input->param('change_given'); +my $type = scalar $input->param('type') || 'PAYMENT'; -my $updatecharges_permissions = ($writeoff_individual || $type eq 'writeoff') ? 'writeoff' : 'remaining_permissions'; +my $updatecharges_permissions = ($writeoff_individual || $type eq 'WRITEOFF') ? 'writeoff' : 'remaining_permissions'; my ( $template, $loggedinuser, $cookie ) = get_template_and_user( { template_name => 'members/paycollect.tt', query => $input, type => 'intranet', - authnotrequired => 0, flagsrequired => { borrowers => 'edit_borrowers', updatecharges => $updatecharges_permissions }, - debug => 1, } ); # get borrower details my $borrowernumber = $input->param('borrowernumber'); -my $logged_in_user = Koha::Patrons->find( $loggedinuser ) or die "Not logged in"; +my $logged_in_user = Koha::Patrons->find( $loggedinuser ); 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 } ); -my $borrower = $patron->unblessed; +my $account = $patron->account; my $category = $patron->category; my $user = $input->remote_user; -my $branch = C4::Context->userenv->{'branch'}; -my $total_due = $patron->account->outstanding_debits->total_outstanding; +my $library_id = C4::Context->userenv->{'branch'}; +my $total_due = $account->outstanding_debits->total_outstanding; -my $total_paid = $input->param('paid'); +my $total_paid = $input->param('paid'); +my $total_collected = $input->param('collected'); -my $select_lines = $input->param('selected'); +my $selected_lines = $input->param('selected'); # comes from pay.pl my $pay_individual = $input->param('pay_individual'); -my $select = $input->param('selected_accts'); +my $selected_accts = $input->param('selected_accts'); # comes from paycollect.pl my $payment_note = uri_unescape scalar $input->param('payment_note'); my $payment_type = scalar $input->param('payment_type'); my $accountlines_id; +my $cash_register_id = $input->param('cash_register'); if ( $pay_individual || $writeoff_individual ) { if ($pay_individual) { $template->param( pay_individual => 1 ); } elsif ($writeoff_individual) { $template->param( writeoff_individual => 1 ); } - my $accounttype = $input->param('accounttype'); - $accountlines_id = $input->param('accountlines_id'); + my $debit_type_code = $input->param('debit_type_code'); + $accountlines_id = $input->param('accountlines_id'); my $amount = $input->param('amount'); my $amountoutstanding = $input->param('amountoutstanding'); my $itemnumber = $input->param('itemnumber'); my $description = $input->param('description'); - my $title = $input->param('title'); $total_due = $amountoutstanding; $template->param( - accounttype => $accounttype, + debit_type_code => $debit_type_code, accountlines_id => $accountlines_id, amount => $amount, amountoutstanding => $amountoutstanding, - title => $title, itemnumber => $itemnumber, individual_description => $description, payment_note => $payment_note, ); -} elsif ($select_lines) { +} elsif ($selected_lines) { $total_due = $input->param('amt'); $template->param( - selected_accts => $select_lines, + selected_accts => $selected_lines, amt => $total_due, selected_accts_notes => scalar $input->param('notes'), ); } +my @selected_accountlines; +if ( $selected_accts ) { + if ( $selected_accts =~ /^([\d,]*).*/ ) { + $selected_accts = $1; # ensure passing no junk + } + my @acc = split /,/, $selected_accts; + + my $search_params = { + borrowernumber => $borrowernumber, + amountoutstanding => { '<>' => 0 }, + accountlines_id => { 'in' => \@acc }, + }; + + @selected_accountlines = Koha::Account::Lines->search( + $search_params, + { order_by => 'date' } + )->as_list; + + my $sum = Koha::Account::Lines->search( + $search_params, + { + select => [ { sum => 'amountoutstanding' } ], + as => [ 'total_amountoutstanding'], + } + ); + $total_due = $sum->_resultset->first->get_column('total_amountoutstanding'); +} + if ( $total_paid and $total_paid ne '0.00' ) { + $total_paid = $total_due if (abs($total_paid - $total_due) < 0.01) && C4::Context->preference('RoundFinesAtPayment'); if ( $total_paid < 0 or $total_paid > $total_due ) { $template->param( error_over => 1, total_due => $total_due ); + } elsif ( $total_collected < $total_paid && !( $writeoff_individual || $type eq 'WRITEOFF' ) ) { + $template->param( + error_under => 1, + total_paid => $total_paid + ); } else { output_and_exit( $input, $cookie, $template, 'wrong_csrf_token' ) unless Koha::Token->new->check_csrf( { @@ -118,84 +155,136 @@ if ( $total_paid and $total_paid ne '0.00' ) { token => scalar $input->param('csrf_token'), }); + my $url; + my $pay_result; if ($pay_individual) { my $line = Koha::Account::Lines->find($accountlines_id); - Koha::Account->new( { patron_id => $borrowernumber } )->pay( + $pay_result = $account->pay( { lines => [$line], amount => $total_paid, - library_id => $branch, + library_id => $library_id, note => $payment_note, interface => C4::Context->interface, payment_type => $payment_type, + cash_register => $cash_register_id } ); - print $input->redirect( - "/cgi-bin/koha/members/pay.pl?borrowernumber=$borrowernumber"); - } else { - if ($select) { - if ( $select =~ /^([\d,]*).*/ ) { - $select = $1; # ensure passing no junk + $payment_id = $pay_result->{payment_id}; + + my @additional_fields; + my $accountline_fields = Koha::AdditionalFields->search({ tablename => 'accountlines:credit' }); + while ( my $field = $accountline_fields->next ) { + my $value = $input->param('additional_field_' . $field->id); + if (defined $value) { + push @additional_fields, { + id => $field->id, + value => $value, + }; } - my @acc = split /,/, $select; - my $note = $input->param('selected_accts_notes'); + } + if (@additional_fields) { + my $payment = Koha::Account::Lines->find($payment_id); + $payment->set_additional_fields(\@additional_fields); + } - my @lines = Koha::Account::Lines->search( - { - borrowernumber => $borrowernumber, - amountoutstanding => { '<>' => 0 }, - accountlines_id => { 'IN' => \@acc }, - }, - { order_by => 'date' } - ); - Koha::Account->new( - { - patron_id => $borrowernumber, - } - )->pay( - { - type => $type, - amount => $total_paid, - lines => \@lines, - note => $note, - interface => C4::Context->interface, - payment_type => $payment_type, - } - ); + $url = "/cgi-bin/koha/members/pay.pl"; + } else { + if ($selected_accts) { + if ( $total_paid > $total_due ) { + $template->param( + error_over => 1, + total_due => $total_due + ); + } else { + my $note = $input->param('selected_accts_notes'); + + $pay_result = $account->pay( + { + type => $type, + amount => $total_paid, + library_id => $library_id, + lines => \@selected_accountlines, + note => $note, + interface => C4::Context->interface, + payment_type => $payment_type, + cash_register => $cash_register_id + } + ); + } + $payment_id = $pay_result->{payment_id}; } else { my $note = $input->param('selected_accts_notes'); - Koha::Account->new( { patron_id => $borrowernumber } )->pay( + $pay_result = $account->pay( { amount => $total_paid, + library_id => $library_id, note => $note, payment_type => $payment_type, - interface => C4::Context->interface + interface => C4::Context->interface, + payment_type => $payment_type, + cash_register => $cash_register_id } ); + $payment_id = $pay_result->{payment_id}; } + $payment_id = $pay_result->{payment_id}; - print $input->redirect("/cgi-bin/koha/members/boraccount.pl?borrowernumber=$borrowernumber"); + my @additional_fields; + my $accountline_fields = Koha::AdditionalFields->search({ tablename => 'accountlines:credit' }); + while ( my $field = $accountline_fields->next ) { + my $value = $input->param('additional_field_' . $field->id); + if (defined $value) { + push @additional_fields, { + id => $field->id, + value => $value, + }; + } + } + if (@additional_fields) { + my $payment = Koha::Account::Lines->find($payment_id); + $payment->set_additional_fields(\@additional_fields); + } + + $url = "/cgi-bin/koha/members/boraccount.pl"; + } + # It's possible renewals took place, parse any renew results + # and pass on + my @renew_result = (); + foreach my $ren( @{$pay_result->{renew_result}} ) { + my $str = "renew_result=$ren->{itemnumber},$ren->{success},"; + my $app = $ren->{success} ? + uri_escape( + output_pref({ dt => $ren->{due_date}, as_due_date => 1 }) + ) : $ren->{error}; + push @renew_result, "${str}${app}"; } + my $append = scalar @renew_result ? '&' . join('&', @renew_result) : ''; + + $url .= "?borrowernumber=$borrowernumber&payment_id=$payment_id&change_given=${change_given}${append}"; + + print $input->redirect($url); } } else { $total_paid = '0.00'; #TODO not right with pay_individual } -$template->param(%$borrower); - if ( $input->param('error_over') ) { $template->param( error_over => 1, total_due => scalar $input->param('amountoutstanding') ); } $template->param( + payment_id => $payment_id, + type => $type, borrowernumber => $borrowernumber, # some templates require global - patron => $patron, - total => $total_due, + patron => $patron, + total => $total_due, - csrf_token => Koha::Token->new->generate_csrf({ session_id => scalar $input->cookie('CGISESSID') }), + csrf_token => Koha::Token->new->generate_csrf( { session_id => scalar $input->cookie('CGISESSID') } ), + available_additional_fields => [ Koha::AdditionalFields->search({ tablename => 'accountlines:credit' })->as_list ], ); output_html_with_http_headers $input, $cookie, $template->output;