+=head2 GetMemberAccountBalance
+
+ ($total_balance, $non_issue_balance, $other_charges) = &GetMemberAccountBalance($borrowernumber);
+
+Calculates amount immediately owing by the patron - non-issue charges.
+Based on GetMemberAccountRecords.
+Charges exempt from non-issue are:
+* Res (reserves)
+* Rent (rental) if RentalsInNoissuesCharge syspref is set to false
+* Manual invoices if ManInvInNoissuesCharge syspref is set to false
+
+=cut
+
+sub GetMemberAccountBalance {
+ my ($borrowernumber) = @_;
+
+ my $ACCOUNT_TYPE_LENGTH = 5; # this is plain ridiculous...
+
+ my @not_fines = ('Res');
+ push @not_fines, 'Rent' unless C4::Context->preference('RentalsInNoissuesCharge');
+ unless ( C4::Context->preference('ManInvInNoissuesCharge') ) {
+ my $dbh = C4::Context->dbh;
+ my $man_inv_types = $dbh->selectcol_arrayref(qq{SELECT authorised_value FROM authorised_values WHERE category = 'MANUAL_INV'});
+ push @not_fines, map substr($_, 0, $ACCOUNT_TYPE_LENGTH), @$man_inv_types;
+ }
+ my %not_fine = map {$_ => 1} @not_fines;
+
+ my ($total, $acctlines) = GetMemberAccountRecords($borrowernumber);
+ my $other_charges = 0;
+ foreach (@$acctlines) {
+ $other_charges += $_->{amountoutstanding} if $not_fine{ substr($_->{accounttype}, 0, $ACCOUNT_TYPE_LENGTH) };
+ }
+
+ return ( $total, $total - $other_charges, $other_charges);
+}
+