View | Details | Raw Unified | Return to bug 23049
Collapse All | Expand All

(-)a/Koha/Account/Line.pm (+14 lines)
Lines 22-27 use Data::Dumper; Link Here
22
22
23
use C4::Log qw(logaction);
23
use C4::Log qw(logaction);
24
24
25
use Koha::Account::DebitType;
25
use Koha::Account::Offsets;
26
use Koha::Account::Offsets;
26
use Koha::Database;
27
use Koha::Database;
27
use Koha::Exceptions::Account;
28
use Koha::Exceptions::Account;
Lines 82-87 sub checkout { Link Here
82
    return $self->{_checkout};
83
    return $self->{_checkout};
83
}
84
}
84
85
86
=head3 debit_type
87
88
Return the debit_type linked to this account line
89
90
=cut
91
92
sub debit_type {
93
    my ( $self ) = @_;
94
    my $rs = $self->_result->debit_type;
95
    return unless $rs;
96
    return Koha::Account::DebitType->_new_from_dbic( $rs );
97
}
98
85
=head3 void
99
=head3 void
86
100
87
  $payment_accountline->void();
101
  $payment_accountline->void();
(-)a/admin/debit_types.pl (-1 / +4 lines)
Lines 23-28 use C4::Context; Link Here
23
use C4::Auth;
23
use C4::Auth;
24
use C4::Output;
24
use C4::Output;
25
25
26
use Koha::Account::DebitType;
26
use Koha::Account::DebitTypes;
27
use Koha::Account::DebitTypes;
27
28
28
my $input = new CGI;
29
my $input = new CGI;
Lines 134-140 elsif ( $op eq 'delete_confirmed' ) { Link Here
134
135
135
if ( $op eq 'list' ) {
136
if ( $op eq 'list' ) {
136
    my $debit_types = Koha::Account::DebitTypes->search();
137
    my $debit_types = Koha::Account::DebitTypes->search();
137
    $template->param( debit_types => $debit_types );
138
    $template->param(
139
        debit_types  => $debit_types,
140
    );
138
}
141
}
139
142
140
$template->param(
143
$template->param(
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/accounts.inc (-23 / +31 lines)
Lines 1-28 Link Here
1
[%- BLOCK account_type_description -%]
1
[%- BLOCK account_type_description -%]
2
    [%- SWITCH account.accounttype -%]
2
    <span>
3
        [%- CASE 'Pay'              -%]<span>Payment
3
    [%- IF account.accounttype -%]
4
        [%- CASE 'N'                -%]<span>New card
4
        [%- SWITCH account.accounttype -%]
5
        [%- CASE 'OVERDUE'          -%]<span>Fine
5
            [%- CASE 'Pay'              -%]Payment
6
        [%- CASE 'ACCOUNT'          -%]<span>Account creation fee
6
            [%- CASE 'W'                -%]Writeoff
7
        [%- CASE 'ACCOUNT_RENEW'    -%]<span>Account renewal fee
7
            [%- CASE 'FOR'              -%]Forgiven
8
        [%- CASE 'M'                -%]<span>Sundry
8
            [%- CASE 'PAY'              -%]Payment
9
        [%- CASE 'LOST'             -%]<span>Lost item
9
            [%- CASE 'WO'               -%]Writeoff
10
        [%- CASE 'W'                -%]<span>Writeoff
10
            [%- CASE 'C'                -%]Credit
11
        [%- CASE 'HE'               -%]<span>Hold waiting too long
11
            [%- CASE 'LOST_RETURN'      -%]Lost item fee refund
12
        [%- CASE 'RENT'             -%]<span>Rental fee
12
            [%- CASE                    -%][% account.accounttype | html %]
13
        [%- CASE 'RENT_DAILY'       -%]<span>Daily rental fee
13
        [%- END -%]
14
        [%- CASE 'RENT_RENEW'       -%]<span>Renewal of rental item
14
    [%- ELSIF account.debit_type -%]
15
        [%- CASE 'RENT_DAILY_RENEW' -%]<span>Rewewal of daily rental item
15
       [%- SWITCH account.debit_type -%]
16
        [%- CASE 'FOR'              -%]<span>Forgiven
16
           [%- CASE 'ACCOUNT'          -%]Account creation fee
17
        [%- CASE 'PF'               -%]<span>Lost item processing fee
17
           [%- CASE 'ACCOUNT_RENEW'    -%]Account renewal fee
18
        [%- CASE 'PAY'              -%]<span>Payment
18
           [%- CASE 'HE'               -%]Hold waiting too long
19
        [%- CASE 'WO'               -%]<span>Writeoff
19
           [%- CASE 'LOST'             -%]Lost item
20
        [%- CASE 'C'                -%]<span>Credit
20
           [%- CASE 'M'                -%]Sundry
21
        [%- CASE 'LOST_RETURN'      -%]<span>Lost item fee refund
21
           [%- CASE 'N'                -%]New card
22
        [%- CASE 'Res'              -%]<span>Hold fee
22
           [%- CASE 'OVERDUE'          -%]Fine
23
        [%- CASE                    -%]<span>[% account.accounttype | html %]
23
           [%- CASE 'PF'               -%]Lost item processing fee
24
           [%- CASE 'RENT'             -%]Rental fee
25
           [%- CASE 'RENT_DAILY'       -%]Daily rental fee
26
           [%- CASE 'RENT_RENEW'       -%]Renewal of rental item
27
           [%- CASE 'RENT_DAILY_RENEW' -%]Rewewal of daily rental item
28
           [%- CASE 'Res'              -%]Hold fee
29
           [%- CASE                    -%][% account.debit_type.description | html %]
30
       [%- END -%]
24
    [%- END -%]
31
    [%- END -%]
25
    [%- PROCESS account_status_description account=account -%]</span>
32
    [%- PROCESS account_status_description account=account -%]
33
    </span>
26
[%- END -%]
34
[%- END -%]
27
35
28
[%- BLOCK offset_type_description -%]
36
[%- BLOCK offset_type_description -%]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/members/maninvoice.tt (-46 / +56 lines)
Lines 1-6 Link Here
1
[% USE raw %]
1
[% USE raw %]
2
[% USE Asset %]
2
[% USE Asset %]
3
[% USE Koha %]
3
[% USE Koha %]
4
[% USE Price %]
4
[% USE Branches %]
5
[% USE Branches %]
5
[% SET footerjs = 1 %]
6
[% SET footerjs = 1 %]
6
[% INCLUDE 'doc-head-open.inc' %]
7
[% INCLUDE 'doc-head-open.inc' %]
Lines 12-69 Link Here
12
[% INCLUDE 'header.inc' %]
13
[% INCLUDE 'header.inc' %]
13
[% INCLUDE 'patron-search.inc' %]
14
[% INCLUDE 'patron-search.inc' %]
14
15
15
<div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> &rsaquo; <a href="/cgi-bin/koha/members/members-home.pl">Patrons</a>  &rsaquo; Manual invoice</div>
16
<div id="breadcrumbs">
17
    <a href="/cgi-bin/koha/mainpage.pl">Home</a> &rsaquo;
18
    <a href="/cgi-bin/koha/members/members-home.pl">Patrons</a> &rsaquo;
19
    Manual invoice
20
</div>
16
21
17
<div class="main container-fluid">
22
<div class="main container-fluid">
18
    <div class="row">
23
    <div class="row">
19
        <div class="col-sm-10 col-sm-push-2">
24
        <div class="col-sm-10 col-sm-push-2">
20
            <main>
25
            <main>
21
26
22
[% INCLUDE 'members-toolbar.inc' %]
27
            [% INCLUDE 'members-toolbar.inc' %]
23
28
24
<!-- The manual invoice and credit buttons -->
29
            <!-- The manual invoice and credit buttons -->
25
<div class="statictabs">
30
            <div class="statictabs">
26
<ul>
31
                <ul>
27
    <li><a href="/cgi-bin/koha/members/boraccount.pl?borrowernumber=[% patron.borrowernumber | uri %]">Transactions</a></li>
32
                    <li><a href="/cgi-bin/koha/members/boraccount.pl?borrowernumber=[% patron.borrowernumber | uri %]">Transactions</a></li>
28
    <li><a href="/cgi-bin/koha/members/pay.pl?borrowernumber=[% patron.borrowernumber | uri %]" >Make a payment</a></li>
33
                    <li><a href="/cgi-bin/koha/members/pay.pl?borrowernumber=[% patron.borrowernumber | uri %]" >Make a payment</a></li>
29
    <li class="active"><a href="/cgi-bin/koha/members/maninvoice.pl?borrowernumber=[% patron.borrowernumber | uri %]" >Create manual invoice</a></li>
34
                    <li class="active"><a href="/cgi-bin/koha/members/maninvoice.pl?borrowernumber=[% patron.borrowernumber | uri %]" >Create manual invoice</a></li>
30
    <li><a href="/cgi-bin/koha/members/mancredit.pl?borrowernumber=[% patron.borrowernumber | uri %]" >Create manual credit</a></li>
35
                    <li><a href="/cgi-bin/koha/members/mancredit.pl?borrowernumber=[% patron.borrowernumber | uri %]" >Create manual credit</a></li>
31
</ul>
36
                </ul>
32
<div class="tabs-container">
37
                <div class="tabs-container">
33
38
34
[% IF ( ERROR ) %]
39
                [% IF ( ERROR ) %]
35
[% IF ( ITEMNUMBER ) %]
40
                [% IF ( ITEMNUMBER ) %]
36
  ERROR an invalid itemnumber was entered, please hit back and try again
41
                  ERROR an invalid itemnumber was entered, please hit back and try again
37
[% END %]
42
                [% END %]
38
[% ELSE %]
43
                [% ELSE %]
39
<form action="/cgi-bin/koha/members/maninvoice.pl" method="post" id="maninvoice"><input type="hidden" name="borrowernumber" id="borrowernumber" value="[% patron.borrowernumber | html %]" />
44
                <form action="/cgi-bin/koha/members/maninvoice.pl" method="post" id="maninvoice"><input type="hidden" name="borrowernumber" id="borrowernumber" value="[% patron.borrowernumber | html %]" />
40
    <input type="hidden" name="csrf_token" value="[% csrf_token | html %]" />
45
                    <input type="hidden" name="csrf_token" value="[% csrf_token | html %]" />
41
	<fieldset class="rows">
46
            <fieldset class="rows">
42
	<legend>Manual invoice</legend>
47
            <legend>Manual invoice</legend>
43
	<ol>
48
            <ol>
44
      <li>
49
                      <li>
45
        <label for="type">Type: </label>
50
                        <label for="type">Type: </label>
46
        <select name="type" id="invoice_type">
51
                        <select name="type" id="type">
47
          <option value="LOST">Lost item</option>
52
                          [% FOREACH debit_type IN debit_types %]
48
          <option value="F">Fine</option>
53
                            <option value="[% debit_type.code | html %]">[% debit_type.description | html %]</option>
49
          <option value="A">Account management fee</option>
54
                          [% END %]
50
          <option value="N">New card</option>
55
                        </select>
51
          <option value="M">Sundry</option>
56
                      </li>
52
          [% FOREACH invoice_types_loo IN invoice_types_loop %]
57
              <li><label for="barcode">Barcode: </label><input type="text" name="barcode" id="barcode" /></li>
53
            <option value="[% invoice_types_loo.authorised_value | html %]">[% invoice_types_loo.authorised_value | html %]</option>
58
                      <li><label for="desc">Description: </label><input type="text" name="desc" id="desc" size="50" /></li>
54
          [% END %]
59
                      <li><label for="note">Note: </label><input type="text" name="note" size="50" id="note" /></li>
55
        </select>
60
                      <li><label for="amount">Amount: </label><input type="number" name="amount" id="amount" required="required" value="" step="any" min="0" /> Example: 5.00</li>
56
      </li>
61
            </ol>
57
	<li><label for="barcode">Barcode: </label><input type="text" name="barcode" id="barcode" /></li>
62
                    </fieldset>
58
	<li><label for="desc">Description: </label><input type="text" name="desc" id="desc" size="50" /></li>
63
                    <fieldset class="action">
59
    <li><label for="note">Note: </label><input type="text" name="note" size="50" id="note" /></li>
64
                        <input type="submit" name="add" value="Save" /> <a class="cancel" href="/cgi-bin/koha/members/boraccount.pl?borrowernumber=[% patron.borrowernumber | html %]">Cancel</a>
60
    <li><label for="amount">Amount: </label><input type="number" name="amount" id="amount" required="required" value="" step="any" min="0" /> Example: 5.00</li>
65
                    </fieldset>
61
	</ol></fieldset>
66
                </form>
62
<fieldset class="action"><input type="submit" name="add" value="Save" /> <a class="cancel" href="/cgi-bin/koha/members/boraccount.pl?borrowernumber=[% patron.borrowernumber | html %]">Cancel</a></fieldset>
63
</form>
64
67
65
[% END %]
68
                [% END %]
66
</div></div>
69
                </div>
70
            </div>
67
71
68
            </main>
72
            </main>
69
        </div> <!-- /.col-sm-10.col-sm-push-2 -->
73
        </div> <!-- /.col-sm-10.col-sm-push-2 -->
Lines 79-87 Link Here
79
    [% INCLUDE 'str/members-menu.inc' %]
83
    [% INCLUDE 'str/members-menu.inc' %]
80
    [% Asset.js("js/members-menu.js") | $raw %]
84
    [% Asset.js("js/members-menu.js") | $raw %]
81
    <script>
85
    <script>
82
        var type_fees = {'LOST':'','OVERDUE':'','ACCOUNT':'','ACCOUNT_RENEW':'','N':'','M':''};
86
        var type_fees = {};
83
        [% FOREACH invoice_types_loo IN invoice_types_loop %]
87
        [% FOREACH debit_type IN debit_types %]
84
            type_fees['[% invoice_types_loo.authorised_value | html %]'] = "[% invoice_types_loo.lib | html %]";
88
            type_fees['[% debit_type.code | html %]'] = "[% debit_type.default_amount | $Price %]";
85
        [% END %]
89
        [% END %]
86
        $(document).ready(function(){
90
        $(document).ready(function(){
87
            $('#maninvoice').preventDoubleFormSubmit();
91
            $('#maninvoice').preventDoubleFormSubmit();
Lines 90-95 Link Here
90
                this.form.desc.value = this.options[this.selectedIndex].value;
94
                this.form.desc.value = this.options[this.selectedIndex].value;
91
                this.form.amount.value = type_fees[this.options[this.selectedIndex].value];
95
                this.form.amount.value = type_fees[this.options[this.selectedIndex].value];
92
            });
96
            });
97
            $("#maninvoice #desc").val($("#maninvoice #type option:selected").text());
98
            $("#maninvoice #amount").val(type_fees[$("#maninvoice #type option:selected").val()]);
99
            $("#maninvoice #type").change(function(){
100
                $("#maninvoice #desc").val($(this).find("option:selected").text());
101
                $("#maninvoice #amount").val(type_fees[$(this).val()]);
102
            });
93
        });
103
        });
94
    </script>
104
    </script>
95
[% END %]
105
[% END %]
(-)a/members/maninvoice.pl (-72 / +82 lines)
Lines 3-11 Link Here
3
#written 11/1/2000 by chris@katipo.oc.nz
3
#written 11/1/2000 by chris@katipo.oc.nz
4
#script to display borrowers account details
4
#script to display borrowers account details
5
5
6
7
# Copyright 2000-2002 Katipo Communications
6
# Copyright 2000-2002 Katipo Communications
8
# Copyright 2010 BibLibre
7
# Copyright 2010 BibLibre
8
# Copyright 2019 PTFS Europe
9
#
9
#
10
# This file is part of Koha.
10
# This file is part of Koha.
11
#
11
#
Lines 36-129 use Koha::Items; Link Here
36
use Koha::Patrons;
36
use Koha::Patrons;
37
37
38
use Koha::Patron::Categories;
38
use Koha::Patron::Categories;
39
use Koha::Account::DebitTypes;
39
40
40
my $input=new CGI;
41
my $input = new CGI;
41
my $flagsrequired = { borrowers => 'edit_borrowers' };
42
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
42
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
43
    {   template_name   => "members/maninvoice.tt",
43
    {
44
        template_name   => "members/maninvoice.tt",
44
        query           => $input,
45
        query           => $input,
45
        type            => "intranet",
46
        type            => "intranet",
46
        authnotrequired => 0,
47
        authnotrequired => 0,
47
        flagsrequired   => $flagsrequired,
48
        flagsrequired   => {
48
        debug           => 1,
49
            borrowers     => 'edit_borrowers',
50
            updatecharges => 'remaining_permissions'
51
        }
49
    }
52
    }
50
);
53
);
51
54
52
my $borrowernumber=$input->param('borrowernumber');
55
my $borrowernumber = $input->param('borrowernumber');
53
56
my $patron         = Koha::Patrons->find($borrowernumber);
54
my $patron = Koha::Patrons->find( $borrowernumber );
57
unless ($patron) {
55
unless ( $patron ) {
58
    print $input->redirect(
56
    print $input->redirect("/cgi-bin/koha/circ/circulation.pl?borrowernumber=$borrowernumber");
59
        "/cgi-bin/koha/circ/circulation.pl?borrowernumber=$borrowernumber");
57
    exit;
60
    exit;
58
}
61
}
59
62
60
my $add=$input->param('add');
63
my $library_id = C4::Context->userenv->{'branch'};
61
if ($add){
62
    if ( checkauth( $input, 0, $flagsrequired, 'intranet' ) ) {
63
        output_and_exit( $input, $cookie, $template,  'wrong_csrf_token' )
64
            unless Koha::Token->new->check_csrf( {
65
                session_id => scalar $input->cookie('CGISESSID'),
66
                token => scalar $input->param('csrf_token'),
67
            });
68
        # Note: If the logged in user is not allowed to see this patron an invoice can be forced
69
        # Here we are trusting librarians not to hack the system
70
        my $barcode=$input->param('barcode');
71
        my $itemnum;
72
        if ($barcode) {
73
            my $item = Koha::Items->find({barcode => $barcode});
74
            $itemnum = $item->itemnumber if $item;
75
        }
76
        my $desc=$input->param('desc');
77
        my $amount=$input->param('amount');
78
        my $type=$input->param('type');
79
        my $note    = $input->param('note');
80
        my $error   = C4::Accounts::manualinvoice( $borrowernumber, $itemnum, $desc, $type, $amount, $note );
81
        if ($error) {
82
            if ( $error =~ /FOREIGN KEY/ && $error =~ /itemnumber/ ) {
83
                $template->param( 'ITEMNUMBER' => 1 );
84
            }
85
            $template->param( csrf_token => Koha::Token->new->generate_csrf({ session_id => scalar $input->cookie('CGISESSID') }) );
86
            $template->param( 'ERROR' => $error );
87
            output_html_with_http_headers $input, $cookie, $template->output;
88
        } else {
89
64
90
            if ( C4::Context->preference('AccountAutoReconcile') ) {
65
my $add = $input->param('add');
91
                $patron->account->reconcile_balance;
66
if ($add) {
92
            }
67
    output_and_exit( $input, $cookie, $template, 'wrong_csrf_token' )
93
68
      unless Koha::Token->new->check_csrf(
94
            print $input->redirect("/cgi-bin/koha/members/boraccount.pl?borrowernumber=$borrowernumber");
69
        {
95
            exit;
70
            session_id => scalar $input->cookie('CGISESSID'),
71
            token      => scalar $input->param('csrf_token'),
96
        }
72
        }
73
      );
74
75
# Note: If the logged in user is not allowed to see this patron an invoice can be forced
76
# Here we are trusting librarians not to hack the system
77
    my $barcode = $input->param('barcode');
78
    my $itemnum;
79
    if ($barcode) {
80
        my $item = Koha::Items->find( { barcode => $barcode } );
81
        $itemnum = $item->itemnumber if $item;
97
    }
82
    }
98
} else {
83
    my $desc   = $input->param('desc');
99
84
    my $amount = $input->param('amount');
100
    my ($template, $loggedinuser, $cookie) = get_template_and_user({
85
    my $type   = $input->param('type');
101
        template_name   => "members/maninvoice.tt",
86
    my $note   = $input->param('note');
102
        query           => $input,
87
    my $error =
103
        type            => "intranet",
88
      C4::Accounts::manualinvoice( $borrowernumber, $itemnum, $desc, $type,
104
        authnotrequired => 0,
89
        $amount, $note );
105
        flagsrequired   => { borrowers => 'edit_borrowers',
90
    if ($error) {
106
                             updatecharges => 'remaining_permissions' },
91
        if ( $error =~ /FOREIGN KEY/ && $error =~ /itemnumber/ ) {
107
        debug           => 1,
92
            $template->param( 'ITEMNUMBER' => 1 );
108
    });
93
        }
94
        $template->param(
95
            csrf_token => Koha::Token->new->generate_csrf(
96
                { session_id => scalar $input->cookie('CGISESSID') }
97
            )
98
        );
99
        $template->param( 'ERROR' => $error );
100
        output_html_with_http_headers $input, $cookie, $template->output;
101
    }
102
    else {
109
103
110
    my $logged_in_user = Koha::Patrons->find( $loggedinuser ) or die "Not logged in";
104
        if ( C4::Context->preference('AccountAutoReconcile') ) {
111
    output_and_exit_if_error( $input, $cookie, $template, { module => 'members', logged_in_user => $logged_in_user, current_patron => $patron } );
105
            $patron->account->reconcile_balance;
106
        }
112
107
113
  # get authorised values with type of MANUAL_INV
108
        print $input->redirect(
114
  my @invoice_types;
109
            "/cgi-bin/koha/members/boraccount.pl?borrowernumber=$borrowernumber"
115
  my $dbh = C4::Context->dbh;
110
        );
116
  my $sth = $dbh->prepare('SELECT * FROM authorised_values WHERE category = "MANUAL_INV"');
111
        exit;
117
  $sth->execute();
112
    }
118
  while ( my $row = $sth->fetchrow_hashref() ) {
113
}
119
    push @invoice_types, $row;
114
else {
120
  }
115
121
  $template->param( invoice_types_loop => \@invoice_types );
116
    my $logged_in_user = Koha::Patrons->find($loggedinuser)
117
      or die "Not logged in";
118
    output_and_exit_if_error(
119
        $input, $cookie,
120
        $template,
121
        {
122
            module         => 'members',
123
            logged_in_user => $logged_in_user,
124
            current_patron => $patron
125
        }
126
    );
122
127
128
    my @debit_types = Koha::Account::DebitTypes->search_with_library_limits(
129
        { can_be_added_manually => 1 },
130
        {}, $library_id );
131
    $template->param( debit_types => \@debit_types );
123
    $template->param(
132
    $template->param(
124
        csrf_token => Koha::Token->new->generate_csrf({ session_id => scalar $input->cookie('CGISESSID') }),
133
        csrf_token => Koha::Token->new->generate_csrf(
125
        patron         => $patron,
134
            { session_id => scalar $input->cookie('CGISESSID') }
126
        finesview      => 1,
135
        ),
136
        patron    => $patron,
137
        finesview => 1,
127
    );
138
    );
128
    output_html_with_http_headers $input, $cookie, $template->output;
139
    output_html_with_http_headers $input, $cookie, $template->output;
129
}
140
}
130
- 

Return to bug 23049