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

(-)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 %]">[% debit_type.description %]</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