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

(-)a/installer/data/mysql/updatedatabase.pl (+24 lines)
Lines 8551-8556 if (CheckVersion($DBversion)) { Link Here
8551
    SetVersion($DBversion);
8551
    SetVersion($DBversion);
8552
}
8552
}
8553
8553
8554
$DBversion = "3.17.00.XXX";
8555
if (CheckVersion($DBversion)) {
8556
    $dbh->do("alter table overduerules
8557
                add invoice1 int(1) default 0 after debarred1,
8558
                add invoice2 int(1) default 0 after debarred2,
8559
                add invoice3 int(1) default 0 after debarred3
8560
    ");
8561
    $dbh->do("insert into systempreferences values('InvoiceProcessingFee', 0, NULL, 'Invoice processing fee (charged once per item)', 'Float')"); 
8562
    $dbh->do("insert into systempreferences values('InvoiceBillingFee', 0, NULL, 'Invoice billing fee (charged once per bill)', 'Float')"); 
8563
    $dbh->do("insert into systempreferences values('DefaultReplacementPrice', 10.0, NULL,'Amount to use when the item has none associated to it.', 'Float')");
8564
    $dbh->do("insert into letter (module, code, name, is_html, title, message_transport_type, content) values ('circulation', 'INVOICE', 'Processing/Billing invoice', 1, 'Billing invoice', 'email', 
8565
           '<br>Dear <<borrowers.firstname>> <<borrowers.surname>>,
8566
            <br>The following items are now due and fines have been added:
8567
            <item><<biblio.title>>, <<items.itemcallnumber>>, Barcode: <<items.barcode>> Fine: <<items.fine>> Replacement cost:<<items.replacementprice>>, Processing fee:<<items.invoiceprocessingfee>><br>
8568
            </item><br>
8569
            Billing fee: <<billingfee>><br>
8570
            Total: <<totalfine>><br>
8571
            </body><html>
8572
            ')
8573
            ");
8574
    print "Upgrade to $DBversion done (Bug 11092 - Add a processing fee and billing fee on late notices)\n";
8575
    SetVersion($DBversion);
8576
}
8577
8554
=head1 FUNCTIONS
8578
=head1 FUNCTIONS
8555
8579
8556
=head2 TableExists($table)
8580
=head2 TableExists($table)
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/overduerules.tt (+8 lines)
Lines 92-97 $(document).ready(function() { Link Here
92
              <th scope="col">Delay</th>
92
              <th scope="col">Delay</th>
93
              <th scope="col">Letter</th>
93
              <th scope="col">Letter</th>
94
              <th scope="col">Restrict</th>
94
              <th scope="col">Restrict</th>
95
              <th scope="col">Issue an invoice</th>
95
              [% FOREACH mtt IN message_transport_types %]
96
              [% FOREACH mtt IN message_transport_types %]
96
                <th scpre="col">
97
                <th scpre="col">
97
                  [% SWITCH mtt %]
98
                  [% SWITCH mtt %]
Lines 142-147 $(document).ready(function() { Link Here
142
                <input type="checkbox" name="debarred[% tab.number %]-[% value.overduename %]" value="1" />
143
                <input type="checkbox" name="debarred[% tab.number %]-[% value.overduename %]" value="1" />
143
              [% END %]
144
              [% END %]
144
              </td>
145
              </td>
146
              <td>
147
              [% IF ( value.invoice ) %]
148
                <input type="checkbox" name="invoice[% tab.number %]-[% value.overduename %]" checked="checked" value="1" />
149
              [% ELSE %]
150
                <input type="checkbox" name="invoice[% tab.number %]-[% value.overduename %]" value="1" />
151
              [% END %]
152
              </td>
145
              [% FOREACH mtt IN value.message_transport_types %]
153
              [% FOREACH mtt IN value.message_transport_types %]
146
                <td>
154
                <td>
147
                  [% IF mtt.selected %]
155
                  [% IF mtt.selected %]
(-)a/misc/cronjobs/overdue_notices.pl (-3 / +9 lines)
Lines 34-40 use Pod::Usage; Link Here
34
use Text::CSV_XS;
34
use Text::CSV_XS;
35
use Locale::Currency::Format 1.28;
35
use Locale::Currency::Format 1.28;
36
use Encode;
36
use Encode;
37
37
use Data::Dumper;
38
use C4::Context;
38
use C4::Context;
39
use C4::Dates qw/format_date/;
39
use C4::Dates qw/format_date/;
40
use C4::Debug;
40
use C4::Debug;
Lines 526-532 END_SQL Link Here
526
                }
526
                }
527
527
528
                my $letter = C4::Letters::getletter( 'circulation', $overdue_rules->{"letter$i"}, $branchcode );
528
                my $letter = C4::Letters::getletter( 'circulation', $overdue_rules->{"letter$i"}, $branchcode );
529
530
                unless ($letter) {
529
                unless ($letter) {
531
                    $verbose and warn "Message '$overdue_rules->{letter$i}' content not found";
530
                    $verbose and warn "Message '$overdue_rules->{letter$i}' content not found";
532
531
Lines 554-560 END_SQL Link Here
554
                my $itemcount = 0;
553
                my $itemcount = 0;
555
                my $titles = "";
554
                my $titles = "";
556
                my @items = ();
555
                my @items = ();
557
                
556
                my $totalFine = 0;
558
                my $j = 0;
557
                my $j = 0;
559
                my $exceededPrintNoticesMaxLines = 0;
558
                my $exceededPrintNoticesMaxLines = 0;
560
                while ( my $item_info = $sth2->fetchrow_hashref() ) {
559
                while ( my $item_info = $sth2->fetchrow_hashref() ) {
Lines 566-571 END_SQL Link Here
566
                    my @item_info = map { $_ =~ /^date|date$/ ? format_date( $item_info->{$_} ) : $item_info->{$_} || '' } @item_content_fields;
565
                    my @item_info = map { $_ =~ /^date|date$/ ? format_date( $item_info->{$_} ) : $item_info->{$_} || '' } @item_content_fields;
567
                    $titles .= join("\t", @item_info) . "\n";
566
                    $titles .= join("\t", @item_info) . "\n";
568
                    $itemcount++;
567
                    $itemcount++;
568
                    if($overdue_rules->{"invoice$i"}){
569
                        $item_info->{invoiceprocessingfee} = C4::Context->preference("InvoiceProcessingFee");
570
                        $item_info->{replacementprice} ||= C4::Context->preference("DefaultReplacementPrice");
571
                        $totalFine += $item_info->{fine} + $item_info->{invoiceprocessingfee} + $item_info->{invoiceprocessingfee};
572
                    }
569
                    push @items, $item_info;
573
                    push @items, $item_info;
570
                }
574
                }
571
                $sth2->finish;
575
                $sth2->finish;
Lines 587-592 END_SQL Link Here
587
                                                bib             => $branch_details->{'branchname'}, # maybe 'bib' is a typo for 'lib<rary>'?
591
                                                bib             => $branch_details->{'branchname'}, # maybe 'bib' is a typo for 'lib<rary>'?
588
                                                'items.content' => $titles,
592
                                                'items.content' => $titles,
589
                                                'count'         => $itemcount,
593
                                                'count'         => $itemcount,
594
                                                'billingfee'    => C4::Context->preference("InvoiceBillingFee"),
595
                                                'totalfine'     => $totalFine + C4::Context->preference("InvoiceBillingFee"),
590
                                               },
596
                                               },
591
                            message_transport_type => $mtt,
597
                            message_transport_type => $mtt,
592
                        }
598
                        }
(-)a/tools/overduerules.pl (-12 / +19 lines)
Lines 31-43 use C4::Overdues; Link Here
31
31
32
our $input = new CGI;
32
our $input = new CGI;
33
my $dbh = C4::Context->dbh;
33
my $dbh = C4::Context->dbh;
34
34
warn "INLIBRO";
35
my @categories = @{$dbh->selectall_arrayref(
35
my @categories = @{$dbh->selectall_arrayref(
36
    'SELECT description, categorycode FROM categories WHERE overduenoticerequired > 0',
36
    'SELECT description, categorycode FROM categories WHERE overduenoticerequired > 0',
37
    { Slice => {} }
37
    { Slice => {} }
38
)};
38
)};
39
my @category_codes  = map { $_->{categorycode} } @categories;
39
my @category_codes  = map { $_->{categorycode} } @categories;
40
our @rule_params     = qw(delay letter debarred);
40
our @rule_params     = qw(delay letter debarred invoice);
41
41
42
# blank_row($category_code) - return true if the entire row is blank.
42
# blank_row($category_code) - return true if the entire row is blank.
43
sub blank_row {
43
sub blank_row {
Lines 74-89 my ($template, $loggedinuser, $cookie) Link Here
74
                            debug => 1,
74
                            debug => 1,
75
                            });
75
                            });
76
my $err=0;
76
my $err=0;
77
77
use Data::Dumper;
78
# save the values entered into tables
78
# save the values entered into tables
79
my %temphash;
79
my %temphash;
80
my $input_saved = 0;
80
my $input_saved = 0;
81
if ($op eq 'save') {
81
if ($op eq 'save') {
82
    my @names=$input->param();
82
    my @names=$input->param();
83
warn "INLIBRO" . join(',', @names);
83
    my $sth_search = $dbh->prepare("SELECT count(*) AS total FROM overduerules WHERE branchcode=? AND categorycode=?");
84
    my $sth_search = $dbh->prepare("SELECT count(*) AS total FROM overduerules WHERE branchcode=? AND categorycode=?");
84
85
85
    my $sth_insert = $dbh->prepare("INSERT INTO overduerules (branchcode,categorycode, delay1,letter1,debarred1, delay2,letter2,debarred2, delay3,letter3,debarred3) VALUES (?,?,?,?,?,?,?,?,?,?,?)");
86
    my $sth_insert = $dbh->prepare("INSERT INTO overduerules (branchcode,categorycode, delay1,letter1,debarred1,invoice1, delay2,letter2,debarred2,invoice2, delay3,letter3,debarred3,invoice3) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
86
    my $sth_update=$dbh->prepare("UPDATE overduerules SET delay1=?, letter1=?, debarred1=?, delay2=?, letter2=?, debarred2=?, delay3=?, letter3=?, debarred3=? WHERE branchcode=? AND categorycode=?");
87
    my $sth_update=$dbh->prepare("UPDATE overduerules SET delay1=?, letter1=?, debarred1=?, invoice1=?, delay2=?, letter2=?, debarred2=?, invoice2=?, delay3=?, letter3=?, debarred3=?, invoice3=? WHERE branchcode=? AND categorycode=?");
87
    my $sth_delete=$dbh->prepare("DELETE FROM overduerules WHERE branchcode=? AND categorycode=?");
88
    my $sth_delete=$dbh->prepare("DELETE FROM overduerules WHERE branchcode=? AND categorycode=?");
88
    my $sth_insert_mtt = $dbh->prepare("
89
    my $sth_insert_mtt = $dbh->prepare("
89
        INSERT INTO overduerules_transport_types(
90
        INSERT INTO overduerules_transport_types(
Lines 99-105 if ($op eq 'save') { Link Here
99
100
100
    foreach my $key (@names){
101
    foreach my $key (@names){
101
            # ISSUES
102
            # ISSUES
102
            if ($key =~ /(delay|letter|debarred)([1-3])-(.*)/) {
103
            if ($key =~ /(delay|letter|debarred|invoice)([1-3])-(.*)/) {
103
                    my $type = $1; # data type
104
                    my $type = $1; # data type
104
                    my $num = $2; # From 1 to 3
105
                    my $num = $2; # From 1 to 3
105
                    my $bor = $3; # borrower category
106
                    my $bor = $3; # borrower category
Lines 115-121 if ($op eq 'save') { Link Here
115
116
116
    # figure out which rows need to be deleted
117
    # figure out which rows need to be deleted
117
    my @rows_to_delete = grep { blank_row($_) } @category_codes;
118
    my @rows_to_delete = grep { blank_row($_) } @category_codes;
118
119
warn Dumper(%temphash);
119
    foreach my $bor (keys %temphash){
120
    foreach my $bor (keys %temphash){
120
        # get category name if we need it for an error message
121
        # get category name if we need it for an error message
121
        my $bor_category = GetBorrowercategory($bor);
122
        my $bor_category = GetBorrowercategory($bor);
Lines 148-156 if ($op eq 'save') { Link Here
148
                        $err=1;
149
                        $err=1;
149
        }
150
        }
150
        unless ($err){
151
        unless ($err){
151
            if (($temphash{$bor}->{delay1} and ($temphash{$bor}->{"letter1"} or $temphash{$bor}->{"debarred1"}))
152
            if (($temphash{$bor}->{delay1} and ($temphash{$bor}->{"letter1"} or $temphash{$bor}->{"debarred1"} or $temphash{$bor}->{"invoice1"}))
152
                or ($temphash{$bor}->{delay2} and ($temphash{$bor}->{"letter2"} or $temphash{$bor}->{"debarred2"}))
153
                or ($temphash{$bor}->{delay2} and ($temphash{$bor}->{"letter2"} or $temphash{$bor}->{"debarred2"} or $temphash{$bor}->{"invoice2"}))
153
                or ($temphash{$bor}->{delay3} and ($temphash{$bor}->{"letter3"} or $temphash{$bor}->{"debarred3"}))) {
154
                or ($temphash{$bor}->{delay3} and ($temphash{$bor}->{"letter3"} or $temphash{$bor}->{"debarred3"} or $temphash{$bor}->{"invoice3"}))) {
154
                    $sth_search->execute($branch,$bor);
155
                    $sth_search->execute($branch,$bor);
155
                    my $res = $sth_search->fetchrow_hashref();
156
                    my $res = $sth_search->fetchrow_hashref();
156
                    if ($res->{'total'}>0) {
157
                    if ($res->{'total'}>0) {
Lines 158-169 if ($op eq 'save') { Link Here
158
                            ($temphash{$bor}->{"delay1"}?$temphash{$bor}->{"delay1"}:undef),
159
                            ($temphash{$bor}->{"delay1"}?$temphash{$bor}->{"delay1"}:undef),
159
                            ($temphash{$bor}->{"letter1"}?$temphash{$bor}->{"letter1"}:""),
160
                            ($temphash{$bor}->{"letter1"}?$temphash{$bor}->{"letter1"}:""),
160
                            ($temphash{$bor}->{"debarred1"}?$temphash{$bor}->{"debarred1"}:0),
161
                            ($temphash{$bor}->{"debarred1"}?$temphash{$bor}->{"debarred1"}:0),
162
                            ($temphash{$bor}->{"invoice1"}?$temphash{$bor}->{"invoice1"}:0),
161
                            ($temphash{$bor}->{"delay2"}?$temphash{$bor}->{"delay2"}:undef),
163
                            ($temphash{$bor}->{"delay2"}?$temphash{$bor}->{"delay2"}:undef),
162
                            ($temphash{$bor}->{"letter2"}?$temphash{$bor}->{"letter2"}:""),
164
                            ($temphash{$bor}->{"letter2"}?$temphash{$bor}->{"letter2"}:""),
163
                            ($temphash{$bor}->{"debarred2"}?$temphash{$bor}->{"debarred2"}:0),
165
                            ($temphash{$bor}->{"debarred2"}?$temphash{$bor}->{"debarred2"}:0),
166
                            ($temphash{$bor}->{"invoice2"}?$temphash{$bor}->{"invoice2"}:0),
164
                            ($temphash{$bor}->{"delay3"}?$temphash{$bor}->{"delay3"}:undef),
167
                            ($temphash{$bor}->{"delay3"}?$temphash{$bor}->{"delay3"}:undef),
165
                            ($temphash{$bor}->{"letter3"}?$temphash{$bor}->{"letter3"}:""),
168
                            ($temphash{$bor}->{"letter3"}?$temphash{$bor}->{"letter3"}:""),
166
                            ($temphash{$bor}->{"debarred3"}?$temphash{$bor}->{"debarred3"}:0),
169
                            ($temphash{$bor}->{"debarred3"}?$temphash{$bor}->{"debarred3"}:0),
170
                            ($temphash{$bor}->{"invoice3"}?$temphash{$bor}->{"invoice3"}:0),
167
                            $branch ,$bor
171
                            $branch ,$bor
168
                            );
172
                            );
169
                    } else {
173
                    } else {
Lines 171-182 if ($op eq 'save') { Link Here
171
                            ($temphash{$bor}->{"delay1"}?$temphash{$bor}->{"delay1"}:0),
175
                            ($temphash{$bor}->{"delay1"}?$temphash{$bor}->{"delay1"}:0),
172
                            ($temphash{$bor}->{"letter1"}?$temphash{$bor}->{"letter1"}:""),
176
                            ($temphash{$bor}->{"letter1"}?$temphash{$bor}->{"letter1"}:""),
173
                            ($temphash{$bor}->{"debarred1"}?$temphash{$bor}->{"debarred1"}:0),
177
                            ($temphash{$bor}->{"debarred1"}?$temphash{$bor}->{"debarred1"}:0),
178
                            ($temphash{$bor}->{"invoice1"}?$temphash{$bor}->{"invoice1"}:0),
174
                            ($temphash{$bor}->{"delay2"}?$temphash{$bor}->{"delay2"}:0),
179
                            ($temphash{$bor}->{"delay2"}?$temphash{$bor}->{"delay2"}:0),
175
                            ($temphash{$bor}->{"letter2"}?$temphash{$bor}->{"letter2"}:""),
180
                            ($temphash{$bor}->{"letter2"}?$temphash{$bor}->{"letter2"}:""),
176
                            ($temphash{$bor}->{"debarred2"}?$temphash{$bor}->{"debarred2"}:0),
181
                            ($temphash{$bor}->{"debarred2"}?$temphash{$bor}->{"debarred2"}:0),
182
                            ($temphash{$bor}->{"invoice2"}?$temphash{$bor}->{"invoice2"}:0),
177
                            ($temphash{$bor}->{"delay3"}?$temphash{$bor}->{"delay3"}:0),
183
                            ($temphash{$bor}->{"delay3"}?$temphash{$bor}->{"delay3"}:0),
178
                            ($temphash{$bor}->{"letter3"}?$temphash{$bor}->{"letter3"}:""),
184
                            ($temphash{$bor}->{"letter3"}?$temphash{$bor}->{"letter3"}:""),
179
                            ($temphash{$bor}->{"debarred3"}?$temphash{$bor}->{"debarred3"}:0)
185
                            ($temphash{$bor}->{"debarred3"}?$temphash{$bor}->{"debarred3"}:0),
186
                            ($temphash{$bor}->{"invoice3"}?$temphash{$bor}->{"invoice3"}:0),
180
                            );
187
                            );
181
                    }
188
                    }
182
189
Lines 288-293 for my $data (@categories) { Link Here
288
            }
295
            }
289
            if ($dat->{"delay$i"}){$row{delay}=$dat->{"delay$i"};}
296
            if ($dat->{"delay$i"}){$row{delay}=$dat->{"delay$i"};}
290
            if ($dat->{"debarred$i"}){$row{debarred}=$dat->{"debarred$i"};}
297
            if ($dat->{"debarred$i"}){$row{debarred}=$dat->{"debarred$i"};}
298
            if ($dat->{"invoice$i"}){$row{invoice}=$dat->{"invoice$i"};}
291
            my @selected_mtts = @{ GetOverdueMessageTransportTypes( $branch, $data->{'categorycode'}, $i) };
299
            my @selected_mtts = @{ GetOverdueMessageTransportTypes( $branch, $data->{'categorycode'}, $i) };
292
            my @mtts;
300
            my @mtts;
293
            for my $mtt ( @$message_transport_types ) {
301
            for my $mtt ( @$message_transport_types ) {
294
- 

Return to bug 11092