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

(-)a/C4/Letters.pm (-18 / +42 lines)
Lines 42-48 BEGIN { Link Here
42
    $VERSION = 3.07.00.049;
42
    $VERSION = 3.07.00.049;
43
	@ISA = qw(Exporter);
43
	@ISA = qw(Exporter);
44
	@EXPORT = qw(
44
	@EXPORT = qw(
45
	&GetLetters &GetPreparedLetter &GetWrappedLetter &addalert &getalert &delalert &findrelatedto &SendAlerts &GetPrintMessages
45
        &GetLetters &GetPreparedLetter &GetWrappedLetter &addalert &getalert &delalert &findrelatedto &SendAlerts &GetPrintMessages &GetMessageTransportTypes
46
	);
46
	);
47
}
47
}
48
48
Lines 97-116 $template->param(LETTERLOOP => \@letterloop); Link Here
97
sub GetLetters {
97
sub GetLetters {
98
98
99
    # returns a reference to a hash of references to ALL letters...
99
    # returns a reference to a hash of references to ALL letters...
100
    my $cat = shift;
100
    my ( $cat, $message_transport_type ) = @_;
101
    $message_transport_type ||= 'email';
101
    my %letters;
102
    my %letters;
102
    my $dbh = C4::Context->dbh;
103
    my $dbh = C4::Context->dbh;
103
    my $sth;
104
    my $sth;
104
    if (defined $cat) {
105
    my $query = qq{
105
        my $query = "SELECT * FROM letter WHERE module = ? ORDER BY name";
106
        SELECT * FROM letter WHERE
106
        $sth = $dbh->prepare($query);
107
    };
107
        $sth->execute($cat);
108
    $query .= qq{ module = ? AND } if defined $cat;
108
    }
109
    $query .= qq{ message_transport_type = ? ORDER BY name};
109
    else {
110
    $sth = $dbh->prepare($query);
110
        my $query = "SELECT * FROM letter ORDER BY name";
111
    $sth->execute((defined $cat ? $cat : ()), $message_transport_type);
111
        $sth = $dbh->prepare($query);
112
112
        $sth->execute;
113
    }
114
    while ( my $letter = $sth->fetchrow_hashref ) {
113
    while ( my $letter = $sth->fetchrow_hashref ) {
115
        $letters{ $letter->{'code'} } = $letter->{'name'};
114
        $letters{ $letter->{'code'} } = $letter->{'name'};
116
    }
115
    }
Lines 146-152 sub GetLetter { Link Here
146
145
147
my %letter;
146
my %letter;
148
sub getletter {
147
sub getletter {
149
    my ( $module, $code, $branchcode ) = @_;
148
    my ( $module, $code, $branchcode, $message_transport_type ) = @_;
149
    $message_transport_type ||= 'email';
150
150
151
    $branchcode ||= '';
151
    $branchcode ||= '';
152
152
Lines 157-173 sub getletter { Link Here
157
        $branchcode = C4::Context->userenv->{'branch'};
157
        $branchcode = C4::Context->userenv->{'branch'};
158
    }
158
    }
159
159
160
    if ( my $l = $letter{$module}{$code}{$branchcode} ) {
160
    if ( my $l = $letter{$module}{$code}{$branchcode}{$message_transport_type} ) {
161
        return { %$l }; # deep copy
161
        return { %$l }; # deep copy
162
    }
162
    }
163
163
164
    my $dbh = C4::Context->dbh;
164
    my $dbh = C4::Context->dbh;
165
    my $sth = $dbh->prepare("select * from letter where module=? and code=? and (branchcode = ? or branchcode = '') order by branchcode desc limit 1");
165
    my $sth = $dbh->prepare(qq{
166
    $sth->execute( $module, $code, $branchcode );
166
        SELECT *
167
        FROM letter
168
        WHERE module=? AND code=? AND (branchcode = ? OR branchcode = '') AND message_transport_type = ?
169
        ORDER BY branchcode DESC LIMIT 1
170
    });
171
    $sth->execute( $module, $code, $branchcode, $message_transport_type );
167
    my $line = $sth->fetchrow_hashref
172
    my $line = $sth->fetchrow_hashref
168
      or return;
173
      or return;
169
    $line->{'content-type'} = 'text/html; charset="UTF-8"' if $line->{is_html};
174
    $line->{'content-type'} = 'text/html; charset="UTF-8"' if $line->{is_html};
170
    $letter{$module}{$code}{$branchcode} = $line;
175
    $letter{$module}{$code}{$branchcode}{$message_transport_type} = $line;
171
    return { %$line };
176
    return { %$line };
172
}
177
}
173
178
Lines 473-479 sub GetPreparedLetter { Link Here
473
    my $substitute = $params{substitute};
478
    my $substitute = $params{substitute};
474
    my $repeat = $params{repeat};
479
    my $repeat = $params{repeat};
475
480
476
    my $letter = getletter( $module, $letter_code, $branchcode )
481
    my $letter = getletter( $module, $letter_code, $branchcode, $params{message_transport_type} )
477
        or warn( "No $module $letter_code letter"),
482
        or warn( "No $module $letter_code letter"),
478
            return;
483
            return;
479
484
Lines 916-921 ENDSQL Link Here
916
    return $sth->fetchall_arrayref({});
921
    return $sth->fetchall_arrayref({});
917
}
922
}
918
923
924
=head2 GetMessageTransportTypes
925
926
  my @mtt = GetMessageTransportTypes();
927
928
  returns a list of hashes
929
930
=cut
931
932
sub GetMessageTransportTypes {
933
    my $dbh = C4::Context->dbh();
934
    my $sth = $dbh->prepare("
935
        SELECT message_transport_type
936
        FROM message_transport_types
937
        ORDER BY message_transport_type
938
    ");
939
    $sth->execute;
940
    return $sth->fetchall_arrayref({});
941
}
942
919
=head2 _add_attachements
943
=head2 _add_attachements
920
944
921
named parameters:
945
named parameters:
(-)a/C4/Overdues.pm (+24 lines)
Lines 60-65 BEGIN { Link Here
60
        &GetOverduesForBranch
60
        &GetOverduesForBranch
61
        &RemoveNotifyLine
61
        &RemoveNotifyLine
62
        &AddNotifyLine
62
        &AddNotifyLine
63
        &GetOverdueMessageTransportTypes
63
	);
64
	);
64
	# subs to remove
65
	# subs to remove
65
	push @EXPORT, qw(
66
	push @EXPORT, qw(
Lines 1331-1336 sub RemoveNotifyLine { Link Here
1331
    return 1;
1332
    return 1;
1332
}
1333
}
1333
1334
1335
=head2 GetOverdueMessageTransportTypes
1336
1337
    my $message_transport_types = GetOverdueMessageTransportTypes( $branchcode, $categorycode, $letternumber);
1338
1339
    return a arrayref with message_transport_type for given branchcode, categorycode and letternumber(1,2 or 3)
1340
1341
=cut
1342
1343
sub GetOverdueMessageTransportTypes {
1344
    my ( $branchcode, $categorycode, $letternumber ) = @_;
1345
    my $dbh = C4::Context->dbh;
1346
    my $sth = $dbh->prepare("
1347
        SELECT message_transport_type FROM overduerules_transport_types
1348
        WHERE branchcode = ? AND categorycode = ? AND letternumber = ?
1349
    ");
1350
    $sth->execute( $branchcode, $categorycode, $letternumber );
1351
    my @mtts;
1352
    while ( my $mtt = $sth->fetchrow ) {
1353
        push @mtts, $mtt;
1354
    }
1355
    return \@mtts;
1356
}
1357
1334
1;
1358
1;
1335
__END__
1359
__END__
1336
1360
(-)a/installer/data/mysql/updatedatabase.pl (+56 lines)
Lines 6020-6025 if (C4::Context->preference("Version") < TransformToNum($DBversion)) { Link Here
6020
   SetVersion ($DBversion);
6020
   SetVersion ($DBversion);
6021
}
6021
}
6022
6022
6023
6024
6025
6026
6027
$DBversion = "3.09.00.XXX";
6028
if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
6029
6030
    $dbh->do( qq{
6031
        ALTER TABLE letter ADD COLUMN message_transport_type VARCHAR(20) NOT NULL DEFAULT 'email'
6032
    } );
6033
6034
    $dbh->do( qq{
6035
        ALTER TABLE letter ADD CONSTRAINT message_transport_type_fk FOREIGN KEY (message_transport_type) REFERENCES message_transport_types(message_transport_type);
6036
    } );
6037
6038
    $dbh->do( qq{
6039
        ALTER TABLE letter DROP PRIMARY KEY, ADD PRIMARY KEY (`module`,`code`,`branchcode`, message_transport_type);
6040
    } );
6041
6042
    $dbh->do( qq{
6043
        CREATE TABLE overduerules_transport_types(
6044
            id INT(11) NOT NULL AUTO_INCREMENT,
6045
            branchcode varchar(10) NOT NULL DEFAULT '',
6046
            categorycode VARCHAR(10) NOT NULL DEFAULT '',
6047
            letternumber INT(1) NOT NULL DEFAULT 1,
6048
            message_transport_type VARCHAR(20) NOT NULL DEFAULT 'email',
6049
            PRIMARY KEY (id),
6050
            CONSTRAINT overduerules_fk FOREIGN KEY (branchcode, categorycode) REFERENCES overduerules (branchcode, categorycode) ON DELETE CASCADE ON UPDATE CASCADE,
6051
            CONSTRAINT mtt_fk FOREIGN KEY (message_transport_type) REFERENCES message_transport_types (message_transport_type) ON DELETE CASCADE ON UPDATE CASCADE
6052
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
6053
    } );
6054
6055
    my $sth = $dbh->prepare( qq{
6056
        SELECT * FROM overduerules;
6057
    } );
6058
6059
    $sth->execute;
6060
    my $sth_insert_mtt = $dbh->prepare( qq{
6061
        INSERT INTO overduerules_transport_types (branchcode, categorycode, letternumber, message_transport_type) VALUES ( ?, ?, ?, ? )
6062
    } );
6063
    while ( my $row = $sth->fetchrow_hashref ) {
6064
        my $branchcode = $row->{branchcode};
6065
        my $categorycode = $row->{categorycode};
6066
        for my $letternumber ( 1..3 ) {
6067
            next unless $row->{"letter$letternumber"};
6068
            $sth_insert_mtt->execute(
6069
                $branchcode, $categorycode, $letternumber, 'email'
6070
            );
6071
        }
6072
    }
6073
6074
    print "Upgrade done (Adds tables and/or fields between letters and messages_transport_types)\n";
6075
    SetVersion($DBversion);
6076
}
6077
6078
6023
=head1 FUNCTIONS
6079
=head1 FUNCTIONS
6024
6080
6025
=head2 TableExists($table)
6081
=head2 TableExists($table)
(-)a/koha-tmpl/intranet-tmpl/prog/en/lib/jquery/plugins/jquery.insertatcaret.js (+46 lines)
Line 0 Link Here
1
/*!
2
 * jQuery insertAtCaret
3
 * Allows inserting text where the caret is in a textarea
4
 * Copyright (c) 2003-2010 phpMyAdmin devel team
5
 * Version: 1.0
6
 * Developed by the phpMyAdmin devel team. Modified by Alex King and variaas
7
 * http://alexking.org/blog/2003/06/02/inserting-at-the-cursor-using-javascript
8
 * http://www.mail-archive.com/jquery-en@googlegroups.com/msg08708.html
9
 * Licensed under the GPL license:
10
 * http://www.gnu.org/licenses/gpl.html
11
 */
12
;(function($) {
13
14
$.fn.insertAtCaret = function (myValue) {
15
16
    return this.each(function() {
17
18
        //IE support
19
        if (document.selection) {
20
21
            this.focus();
22
            sel = document.selection.createRange();
23
            sel.text = myValue;
24
            this.focus();
25
26
        } else if (this.selectionStart || this.selectionStart == '0') {
27
28
            //MOZILLA / NETSCAPE support
29
            var startPos = this.selectionStart;
30
            var endPos = this.selectionEnd;
31
            var scrollTop = this.scrollTop;
32
            this.value = this.value.substring(0, startPos)+ myValue+ this.value.substring(endPos,this.value.length);
33
            this.focus();
34
            this.selectionStart = startPos + myValue.length;
35
            this.selectionEnd = startPos + myValue.length;
36
            this.scrollTop = scrollTop;
37
38
        } else {
39
40
            this.value += myValue;
41
            this.focus();
42
        }
43
    });
44
};
45
46
})(jQuery);
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/letter.tt (-157 / +172 lines)
Lines 1-15 Link Here
1
[% INCLUDE 'doc-head-open.inc' %]
1
[% INCLUDE 'doc-head-open.inc' %]
2
<title>Koha &rsaquo; Tools &rsaquo; Notices[% IF ( add_form ) %][% IF ( modify ) %] &rsaquo; Modify notice[% ELSE %] &rsaquo; Add notice[% END %][% END %][% IF ( add_validate ) %] &rsaquo; Notice added[% END %][% IF ( delete_confirm ) %] &rsaquo; Confirm deletion[% END %]</title>
2
<title>Koha &rsaquo; Tools &rsaquo; Notices[% IF ( add_form ) %][% IF ( modify ) %] &rsaquo; Modify notice[% ELSE %] &rsaquo; Add notice[% END %][% END %][% IF ( add_validate ) %] &rsaquo; Notice added[% END %][% IF ( delete_confirm ) %] &rsaquo; Confirm deletion[% END %]</title>
3
<link rel="stylesheet" type="text/css" href="[% themelang %]/css/datatables.css" />
3
[% INCLUDE 'doc-head-close.inc' %]
4
[% INCLUDE 'doc-head-close.inc' %]
4
<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.tablesorter.min.js"></script>
5
<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.insertatcaret.js"></script>
6
<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.dataTables.min.js"></script>
7
[% INCLUDE 'datatables-strings.inc' %]
8
<script type="text/javascript" src="[% themelang %]/js/datatables.js"></script>
5
	<script type="text/javascript">
9
	<script type="text/javascript">
6
	//<![CDATA[
10
	//<![CDATA[
7
$(document).ready(function() {
11
$(document).ready(function() {
8
	$("#lettert:has(tbody tr)").tablesorter({
12
    var table = $("table#lettert").dataTable($.extend(true, {}, dataTablesDefaults, {
9
		widgets : ['zebra'],
13
        'bPaginate': false,
10
		sortList: [[0,0]],
14
        'bFilter': false,
11
        headers: { 4: {sorter:false},5: { sorter: false },6: { sorter: false }}
15
        'bInfo': false,
12
	}); 
16
        "bAutoWidth": false,
17
        'aoColumns': [
18
            null,
19
            null,
20
            null,
21
            null,
22
            {'bSortable': false },
23
            {'bSortable': false },
24
            null,
25
        ],
26
    } ) );
13
27
14
    $('#branch').change(function() {
28
    $('#branch').change(function() {
15
            $('#op').val("");
29
            $('#op').val("");
Lines 19-24 $(document).ready(function() { Link Here
19
            $('#op').val("add_form");
33
            $('#op').val("add_form");
20
            return true;
34
            return true;
21
    });
35
    });
36
37
    $("#submit").click( function(event) {
38
        $("fieldset.mtt").each( function(){
39
            var title = $(this).find('input[name="title"]').val();
40
            var content = $(this).find('textarea[name="content"]').val();
41
            if (
42
                    ( title.length == 0 && content.length > 0 )
43
                 || ( title.length > 0 && content.length == 0 )
44
            ) {
45
                var mtt = $(this).find('input[name="message_transport_type"]').val();
46
                alert("You must specify a title and a content for " + mtt);
47
                event.preventDefault();
48
            }
49
        } );
50
        return true;
51
    });
52
22
}); 
53
}); 
23
[% IF ( add_form ) %]
54
[% IF ( add_form ) %]
24
	
55
	
Lines 59-118 $(document).ready(function() { Link Here
59
			}
90
			}
60
		}
91
		}
61
	
92
	
62
		function Check(f) {
93
        function insertValueQuery(mtt_id) {
63
			var ok=1;
94
            var fieldset = $("#" + mtt_id);
64
			var _alertString="";
95
            var myQuery = $(fieldset).find('textarea[name="content"]');
65
			var alertString2;
96
            var myListBox = $(fieldset).find('select[name="SQLfieldname"]');
66
/*			if (!(isNotNull(window.document.Aform.code))) {
97
67
				_alertString += "\n- " + _("Code missing");
98
            if($(myListBox).find('option').length > 0) {
68
			}*/
99
                var chaineAj = "";
69
/*			if (!(isNotNull(window.document.Aform.name))) {
100
                var NbSelect = 0;
70
				_alertString += "\n- " + _("Name missing");
101
                $(myListBox).find('option').each( function (){
71
			}*/
102
                    if ( $(this).attr('selected') ) {
72
			if (_alertString.length==0) {
103
                        NbSelect++;
73
				document.Aform.submit();
104
                        if (NbSelect > 1)
74
			} else {
105
                            chaineAj += ", ";
75
				alertString2  = _("Form not submitted because of the following problem(s)");
106
                        chaineAj += $(this).val();
76
				alertString2 += "\n------------------------------------------------------------------------------------\n";
107
                    }
77
				alertString2 += _alertString;
108
                } );
78
				alert(alertString2);
109
                $(myQuery).insertAtCaret(chaineAj);
79
			}
110
            }
80
		}
111
        }
81
		// GPL code coming from PhpMyAdmin
82
		function insertValueQuery() {
83
			var myQuery = document.Aform.content;
84
			var myListBox = document.Aform.SQLfieldname;
85
		
86
			if(myListBox.options.length > 0) {
87
				var chaineAj = "";
88
				var NbSelect = 0;
89
				for(var i=0; i<myListBox.options.length; i++) {
90
					if (myListBox.options[i].selected){
91
						NbSelect++;
92
						if (NbSelect > 1)
93
							chaineAj += ", ";
94
						chaineAj += myListBox.options[i].value;
95
					}
96
				}
97
		
98
				//IE support
99
				if (document.selection) {
100
					myQuery.focus();
101
					sel = document.selection.createRange();
102
					sel.text = chaineAj;
103
					document.Aform.insert.focus();
104
				}
105
				//MOZILLA/NETSCAPE support
106
				else if (document.Aform.content.selectionStart || document.Aform.content.selectionStart == "0") {
107
					var startPos = document.Aform.content.selectionStart;
108
					var endPos = document.Aform.content.selectionEnd;
109
					var chaineSql = document.Aform.content.value;
110
					myQuery.value = chaineSql.substring(0, startPos) +'<<'+ chaineAj+'>>' + chaineSql.substring(endPos, chaineSql.length);
111
				} else {
112
					myQuery.value += chaineAj;
113
				}
114
			}
115
		}
116
	[% END %]
112
	[% END %]
117
		//]]>
113
		//]]>
118
		</script>
114
		</script>
Lines 162-225 $(document).ready(function() { Link Here
162
            </select>
158
            </select>
163
            [% END %]
159
            [% END %]
164
        [% END %]
160
        [% END %]
165
        <table id="lettert">
161
        [% IF letter %]
166
		<thead><tr>
162
          <table id="lettert">
167
			<th>Library</th>
163
            <thead>
168
			<th>Module</th>
164
              <tr>
169
			<th>Code</th>
165
                <th>Library</th>
170
			<th>Name</th>
166
                <th>Module</th>
171
            <th>Copy notice</th>
167
                <th>Code</th>
172
			<th>&nbsp;</th>
168
                <th>Name</th>
173
			<th>&nbsp;</th>
169
                <th>Copy notice</th>
174
		</tr></thead>
170
                <th>&nbsp;</th>
175
		<tbody>
171
                <th>&nbsp;</th>
176
    [% FOREACH lette IN letter %]
172
              </tr>
177
        [% can_edit = lette.branchcode || !independant_branch %]
173
            </thead>
178
        [% UNLESS ( loop.odd ) %]
174
            <tbody>
179
			<tr class="highlight">
175
              [% FOREACH lette IN letter %]
180
        [% ELSE %]
176
                [% can_edit = lette.branchcode || !independant_branch %]
181
			<tr>
177
                <tr>
182
        [% END %]
178
                  <td>[% lette.branchname || "(All libraries)" %]</td>
183
				<td>[% lette.branchname || "(All libraries)" %]</td>
179
                  <td>[% lette.module %]</td>
184
				<td>[% lette.module %]</td>
180
                  <td>[% lette.code %]</td>
185
				<td>[% lette.code %]</td>
181
                  <td>[% lette.name %]</td>
186
				<td>[% lette.name %]</td>
182
                  <td>
187
				<td>
183
                    [% IF !independant_branch || !lette.branchcode %]
188
        [% IF !independant_branch || !lette.branchcode %]
184
                      <form method="post" action="/cgi-bin/koha/tools/letter.pl">
189
                    <form method="post" action="/cgi-bin/koha/tools/letter.pl">
190
                        <input type="hidden" name="op" value="copy" />
185
                        <input type="hidden" name="op" value="copy" />
191
				        <input type="hidden" name="oldbranchcode" value="[% lette.branchcode %]" />
186
                        <input type="hidden" name="oldbranchcode" value="[% lette.branchcode %]" />
192
                        <input type="hidden" name="module" value="[% lette.module %]" />
187
                        <input type="hidden" name="module" value="[% lette.module %]" />
193
                        <input type="hidden" name="code" value="[% lette.code %]" />
188
                        <input type="hidden" name="code" value="[% lette.code %]" />
194
            [% IF independant_branch %]
189
                        [% IF independant_branch %]
195
                        <input type="hidden" name="branchcode" value="[% independant_branch %]" />
190
                          <input type="hidden" name="branchcode" value="[% independant_branch %]" />
196
            [% ELSE %]
191
                        [% ELSE %]
197
                        [% select_for_copy %]
192
                          [% select_for_copy %]
198
            [% END %]
193
                        [% END %]
199
                        <input type="submit" value="Copy" />
194
                        <input type="submit" value="Copy" />
200
                    </form>
195
                      </form>
201
        [% END %]
196
                    [% END %]
202
                </td>
197
                  </td>
203
                <td>
198
                  <td>
204
        [% IF can_edit %]
199
                    [% IF can_edit %]
205
                    <a href="/cgi-bin/koha/tools/letter.pl?op=add_form&amp;branchcode=[% lette.branchcode %]&amp;module=[% lette.module %]&amp;code=[% lette.code %]">Edit</a>
200
                      <a href="/cgi-bin/koha/tools/letter.pl?op=add_form&amp;branchcode=[% lette.branchcode %]&amp;module=[% lette.module %]&amp;code=[% lette.code %]">Edit</a>
206
        [% END %]
201
                    [% END %]
207
				</td>
202
                  </td>
208
				<td>
203
                  <td>
209
        [% IF !lette.protected && can_edit %]
204
                    [% IF !lette.protected && can_edit %]
210
					<a href="/cgi-bin/koha/tools/letter.pl?op=delete_confirm&amp;branchcode=[%lette.branchcode %]&amp;module=[% lette.module %]&amp;code=[% lette.code %]">Delete</a>
205
                      <a href="/cgi-bin/koha/tools/letter.pl?op=delete_confirm&amp;branchcode=[%lette.branchcode %]&amp;module=[% lette.module %]&amp;code=[% lette.code %]">Delete</a>
206
                    [% END %]
207
                  </td>
208
                </tr>
209
              [% END %]
210
            </tbody>
211
          </table>
212
        [% ELSE %]
213
          There are no notice or slip for this library.
211
        [% END %]
214
        [% END %]
212
				</td>
213
			</tr>
214
    [% END %]
215
        </tbody>
216
		</table>
217
[% END %]
215
[% END %]
218
216
219
	
217
	
220
[% IF ( add_form ) %]
218
[% IF ( add_form ) %]
221
<h1>[% IF ( modify ) %]Modify notice[% ELSE %]Add notice[% END %]</h1>
219
<h1>[% IF ( modify ) %]Modify notice[% ELSE %]Add notice[% END %]</h1>
222
		<form action="?" name="Aform" method="post">
220
		<form name="Aform" method="post" enctype="multipart/form-data">
223
		<input type="hidden" name="op" id="op" value="add_validate" />
221
		<input type="hidden" name="op" id="op" value="add_validate" />
224
		<input type="hidden" name="checked" value="0" />
222
		<input type="hidden" name="checked" value="0" />
225
		[% IF ( modify ) %]
223
		[% IF ( modify ) %]
Lines 247-291 $(document).ready(function() { Link Here
247
				<label for="module">Koha module:</label>
245
				<label for="module">Koha module:</label>
248
				<input type="hidden" name="oldmodule" value="[% module %]" />
246
				<input type="hidden" name="oldmodule" value="[% module %]" />
249
		[% IF ( modify ) %]<select name="module" id="module">[% END %] [% IF ( adding ) %] <select name="module" id="module" onchange="javascript:window.location.href = unescape(window.location.pathname)+'?op=add_form&amp;module='+this.value+'&amp;content='+window.document.forms['Aform'].elements['content'].value;">[% END %]
247
		[% IF ( modify ) %]<select name="module" id="module">[% END %] [% IF ( adding ) %] <select name="module" id="module" onchange="javascript:window.location.href = unescape(window.location.pathname)+'?op=add_form&amp;module='+this.value+'&amp;content='+window.document.forms['Aform'].elements['content'].value;">[% END %]
250
                                    [% IF ( catalogue ) %]
248
                                    [% IF ( module == "catalogue" ) %]
251
                                    <option value="catalogue" selected="selected">Catalog</option>
249
                                      <option value="catalogue" selected="selected">Catalog</option>
252
                                    [% ELSE %]
250
                                    [% ELSE %]
253
                                    <option value="catalogue" >Catalog</option>
251
                                      <option value="catalogue" >Catalog</option>
254
                                    [% END %]
252
                                    [% END %]
255
                                    [% IF ( circulation ) %]
253
                                    [% IF ( module == "circulation" ) %]
256
                                    <option value="circulation" selected="selected">Circulation</option>
254
                                      <option value="circulation" selected="selected">Circulation</option>
257
                                    [% ELSE %]
255
                                    [% ELSE %]
258
                                    <option value="circulation">Circulation</option>
256
                                      <option value="circulation">Circulation</option>
259
                                    [% END %]
257
                                    [% END %]
260
                                    [% IF ( claimacquisition ) %]
258
                                    [% IF ( module == "claimacquisition" ) %]
261
                                    <option value="claimacquisition" selected="selected">Claim acquisition</option>
259
                                      <option value="claimacquisition" selected="selected">Claim acquisition</option>
262
                                    [% ELSE %]
260
                                    [% ELSE %]
263
                                    <option value="claimacquisition">Claim acquisition</option>
261
                                      <option value="claimacquisition">Claim acquisition</option>
264
                                    [% END %]
262
                                    [% END %]
265
                                    [% IF ( claimissues ) %]
263
                                    [% IF ( module == "claimissues" ) %]
266
                                    <option value="claimissues" selected="selected">Claim serial issue</option>
264
                                      <option value="claimissues" selected="selected">Claim serial issue</option>
267
                                    [% ELSE %]
265
                                    [% ELSE %]
268
                                    <option value="claimissues">Claim serial issue</option>
266
                                      <option value="claimissues">Claim serial issue</option>
269
                                    [% END %]
267
                                    [% END %]
270
                                    [% IF ( reserves ) %]
268
                                    [% IF ( module == "reserves" ) %]
271
                                    <option value="reserves" selected="selected">Holds</option>
269
                                      <option value="reserves" selected="selected">Holds</option>
272
                                    [% ELSE %]
270
                                    [% ELSE %]
273
                                    <option value="reserves">Holds</option>
271
                                      <option value="reserves">Holds</option>
274
                                    [% END %]
272
                                    [% END %]
275
                                    [% IF ( members ) %]
273
                                    [% IF ( module == "members" ) %]
276
                                    <option value="members" selected="selected">Members</option>
274
                                      <option value="members" selected="selected">Members</option>
277
                                    [% ELSE %]
275
                                    [% ELSE %]
278
                                    <option value="members">Members</option>
276
                                      <option value="members">Members</option>
279
                                    [% END %]
277
                                    [% END %]
280
                                    [% IF ( serial ) %]
278
                                    [% IF ( module == "serial" ) %]
281
                                    <option value="serial" selected="selected">Serials (routing list)</option>
279
                                      <option value="serial" selected="selected">Serials (routing list)</option>
282
                                    [% ELSE %]
280
                                    [% ELSE %]
283
                                    <option value="serial">Serials (routing list)</option>
281
                                      <option value="serial">Serials (routing list)</option>
284
                                    [% END %]
282
                                    [% END %]
285
                                    [% IF ( suggestions ) %]
283
                                    [% IF ( module == "suggestions" ) %]
286
                                    <option value="suggestions" selected="selected">Suggestions</option>
284
                                      <option value="suggestions" selected="selected">Suggestions</option>
287
                                    [% ELSE %]
285
                                    [% ELSE %]
288
                                    <option value="suggestions">Suggestions</option>
286
                                      <option value="suggestions">Suggestions</option>
289
                                    [% END %]
287
                                    [% END %]
290
				</select>
288
				</select>
291
			</li>
289
			</li>
Lines 295-327 $(document).ready(function() { Link Here
295
		<li>
293
		<li>
296
			<label for="name">Name:</label><input type="text" id="name" name="name" size="60" value="[% name %]" />
294
			<label for="name">Name:</label><input type="text" id="name" name="name" size="60" value="[% name %]" />
297
		</li>
295
		</li>
298
		<li>
299
            <label for="is_html">HTML message:</label>
300
      [% IF is_html %]
301
      <input type="checkbox" id="is_html" name="is_html" value="1" checked />
302
      [% ELSE %]
303
      <input type="checkbox" id="is_html" name="is_html" value="1" />
304
      [% END %]
305
		</li>
306
		<li>
307
            <label for="title">Message subject:</label><input type="text" id="title" name="title" size="60" value="[% title %]" />
308
		</li>
309
		<li>
310
            <label for="SQLfieldname">Message body:</label>
311
		</li>
312
		<li>
313
		<table>
314
		<tr><td><select name="SQLfieldname" id="SQLfieldname" size="9">
315
			[% FOREACH SQLfieldnam IN SQLfieldname %]
316
				<option value="[% SQLfieldnam.value %]">[% SQLfieldnam.text %]</option>
317
			[% END %]
318
		</select></td><td><input type="button" name="insert" value="&gt;&gt;" onclick="insertValueQuery()" title="Insert" /></td><td><textarea name="content" cols="80" rows="15">[% content %]</textarea></td></tr></table>
319
296
320
		</li>
297
        [% FOREACH letter IN letters %]
321
		</ol>
298
          <li>
322
                [% IF code.search('DGST') %] <span class="overdue">Warning, this is a template for a Digest, as such, any references to branch data ( e.g. branches.branchname ) will refer to the borrower's home branch.</span> [% END %]
299
            <fieldset class="rows mtt" id="[% letter.message_transport_type %]">
300
              <legend>[% letter.message_transport_type %]</legend>
301
              <ol>
302
                <li>
303
                  <input type="hidden" name="message_transport_type" value="[% letter.message_transport_type %]" />
304
                  <label for="is_html_[% letter.message_transport_type %]">HTML message:</label>
305
                  [% IF letter.is_html %]
306
                    <input type="checkbox" name="is_html_[% letter.message_transport_type %]" id="is_html_[% letter.message_transport_type %]" value="1" checked="checked" />
307
                  [% ELSE %]
308
                    <input type="checkbox" name="is_html_[% letter.message_transport_type %]" id="is_html_[% letter.message_transport_type %]" value="1" />
309
                  [% END %]
310
                </li>
311
                <li>
312
                  <label for="title">Message subject:</label><input type="text" id="title" name="title" size="60" value="[% letter.title %]" />
313
                </li>
314
                <li>
315
                  <label for="SQLfieldname">Message body:</label>
316
                  <table>
317
                    <tr>
318
                      <td>
319
                        <select name="SQLfieldname" multiple="multiple" size="9">
320
                          [% FOREACH SQLfieldnam IN SQLfieldname %]
321
                            <option value="[% SQLfieldnam.value %]">[% SQLfieldnam.text %]</option>
322
                          [% END %]
323
                        </select>
324
                      </td>
325
                      <td><input type="button" name="insert" value="&gt;&gt;" onclick="insertValueQuery('[% letter.message_transport_type %]')" title="Insert" /></td>
326
                      <td><textarea name="content" cols="80" rows="15">[% letter.content %]</textarea></td>
327
                    </tr>
328
                  </table>
329
                </li>
330
              </ol>
331
            </fieldset>
332
          </li>
333
        [% END %]
334
        </ol>
335
336
        [% IF code.search('DGST') %] <span class="overdue">Warning, this is a template for a Digest, as such, any references to branch data ( e.g. branches.branchname ) will refer to the borrower's home branch.</span> [% END %]
323
		</fieldset>
337
		</fieldset>
324
		<fieldset class="action"><input type="button" value="Submit" onclick="Check(this.form)" class="button" /> <a class="cancel" href="/cgi-bin/koha/tools/letter.pl">Cancel</a></fieldset>
338
		<fieldset class="action"><input type="submit" id="submit" value="Submit" class="button" /> <a class="cancel" href="/cgi-bin/koha/tools/letter.pl">Cancel</a></fieldset>
325
      <input type="hidden" name="searchfield" value="[% searchfield %]" />
339
      <input type="hidden" name="searchfield" value="[% searchfield %]" />
326
		</form>
340
		</form>
327
[% END %]
341
[% END %]
Lines 356-361 $(document).ready(function() { Link Here
356
		<input type="hidden" name="branchcode" value="[% branchcode %]" />
370
		<input type="hidden" name="branchcode" value="[% branchcode %]" />
357
		<input type="hidden" name="code" value="[% code %]" />
371
		<input type="hidden" name="code" value="[% code %]" />
358
		<input type="hidden" name="module" value="[% module %]" />
372
		<input type="hidden" name="module" value="[% module %]" />
373
        <input type="hidden" name="message_transport_type" value="*" />
359
                <input type="submit" value="Yes, delete" class="approve" />
374
                <input type="submit" value="Yes, delete" class="approve" />
360
				</form>
375
				</form>
361
376
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/overduerules.tt (-128 / +74 lines)
Lines 4-15 Link Here
4
4
5
<script type="text/javascript">
5
<script type="text/javascript">
6
//<![CDATA[
6
//<![CDATA[
7
var tab_map = { "1" : _("First"), "2" : _("Second"), "3" : _("Third")};
7
$(document).ready(function() {
8
$(document).ready(function() {
8
        $('#selectlibrary').find("input:submit").hide();
9
    $('#selectlibrary').find("input:submit").hide();
9
        $('#branch').change(function() {
10
    $('#branch').change(function() {
10
                $('#selectlibrary').submit();
11
            $('#selectlibrary').submit();
11
        });
12
    });
12
        $('#rulestabs').tabs();
13
    $("li>a.tab").each( function(){
14
        var id = $(this).attr("data-number");
15
        $(this).html(tab_map[id]);
16
    } );
17
    $('#rulestabs').tabs();
13
});
18
});
14
//]]>
19
//]]>
15
</script>
20
</script>
Lines 72-202 $(document).ready(function() { Link Here
72
                    [% IF ( datasaved ) %]<div class="dialog message">INPUT SAVED</div> [% END %]
77
                    [% IF ( datasaved ) %]<div class="dialog message">INPUT SAVED</div> [% END %]
73
78
74
  <div id="rulestabs" class="toptabs">
79
  <div id="rulestabs" class="toptabs">
75
	<ul class="ui-tabs-nav">
80
    <ul class="ui-tabs-nav">
76
      <li><a href="#first">First</a></li>
81
      [% FOR tab IN tabs %]
77
      <li><a href="#second">Second</a></li>
82
          <li><a href="#[% tab.id %]" class="tab [% tab.id %]" data-number="[% tab.number %]"></a></li>
78
      <li><a href="#third">Third</a></li>
83
      [% END %]
79
	</ul>
84
    </ul>
85
    [% FOR tab IN tabs %]
86
      <div id="[% tab.id %]">
87
        <table>
88
          <thead>
89
            <tr>
90
              <th>&nbsp;</th>
91
              <th scope="col">Delay</th>
92
              <th scope="col">Letter</th>
93
              <th scope="col">Restrict</th>
94
              [% FOREACH mtt IN message_transport_types %]
95
                <th scpre="col">[% mtt.message_transport_type %]</th>
96
              [% END %]
97
            </tr>
98
          </thead>
99
          <tbody>
100
          [% FOREACH value IN tab.values %]
101
            <tr>
102
              <th scope="row">[% value.line %]</th>
103
              <td>
104
              <input type="text" name="delay[% tab.number %]-[% value.overduename %]" size="5" value="[% value.delay %]" />
105
              </td>
106
              <td>
107
              [% IF ( value.noletter ) %]
108
                <input type="text" name="letter[% tab.number %]-[% value.overduename %]" value="[% value.letter %]" />
109
              [% ELSE %]
110
                <select name="letter[% tab.number %]-[% value.overduename %]">
111
                  <option value="">No notice</option>
112
                  [% FOREACH letterloop IN value.letterloop %]
113
                    [% IF ( letterloop.selected ) %]
114
                      <option value="[% letterloop.value %]" selected="selected">[% letterloop.lettername %]</option>
115
                    [% ELSE %]
116
                      <option value="[% letterloop.value %]">[% letterloop.lettername %]</option>
117
                    [% END %]
118
                  [% END %]
119
                </select>
120
              [% END %]
121
              </td>
122
              <td>
123
              [% IF ( value.debarred ) %]
124
                <input type="checkbox" name="debarred[% tab.number %]-[% value.overduename %]" checked="checked" value="1" />
125
              [% ELSE %]
126
                <input type="checkbox" name="debarred[% tab.number %]-[% value.overduename %]" value="1" />
127
              [% END %]
128
              </td>
129
              [% FOREACH mtt IN value.message_transport_types %]
130
                <td>
131
                  [% IF mtt.selected %]
132
                    <input type="checkbox" name="mtt[% tab.number %]-[% value.overduename %]" value="[% mtt.value %]" checked="checked" />
133
                  [% ELSE %]
134
                    <input type="checkbox" name="mtt[% tab.number %]-[% value.overduename %]" value="[% mtt.value %]" />
135
                  [% END %]
136
                </td>
137
              [% END %]
138
            </tr>
139
          [% END %]
140
          </tbody>
141
        </table>
142
      </div>
143
    [% END %]
80
144
81
<div id="first"><table>
82
                    <tr><th>&nbsp;</th><th scope="col">Delay</th><th scope="col">First letter</th><th scope="col">Restrict</th></tr>
83
                    [% FOREACH tabl IN table %]
84
                     [% UNLESS ( loop.odd ) %]
85
                                <tr class="highlight">
86
                            [% ELSE %]
87
                                <tr>
88
                            [% END %]
89
                            <th scope="row">[% tabl.line %]</th>
90
<td>
91
                                <input type="text" name="delay1-[% tabl.overduename %]" size="5" value="[% tabl.delay1 %]" />
92
                            </td>
93
<td>
94
                            [% IF ( tabl.noletter ) %]
95
                                <input type="text" name="letter1-[% tabl.overduename %]" value="[% tabl.letter1 %]" />
96
                            [% ELSE %]
97
                                <select name="letter1-[% tabl.overduename %]">
98
                                    <option value="">No notice</option>
99
                                    [% FOREACH letterloop IN tabl.letterloop1 %]
100
                                        [% IF ( letterloop.selected ) %]
101
                                            <option value="[% letterloop.value %]" selected="selected">[% letterloop.lettername %]</option>
102
                                        [% ELSE %]
103
                                            <option value="[% letterloop.value %]">[% letterloop.lettername %]</option>
104
                                        [% END %]
105
                                    [% END %]
106
                                </select>
107
                            [% END %]
108
                            </td>
109
<td>
110
                                [% IF ( tabl.debarred1 ) %]
111
                                    <input type="checkbox" name="debarred1-[% tabl.overduename %]" checked="checked" value="1" />
112
                                [% ELSE %]
113
                                    <input type="checkbox" name="debarred1-[% tabl.overduename %]" value="1" />
114
                                [% END %]
115
                            </td>
116
							</tr>
117
							[% END %]
118
							</table>
119
</div>
120
145
121
<div id="second"><table>
122
                    <tr><th>&nbsp;</th><th scope="col">Delay</th><th scope="col">Second letter</th><th scope="col">Restrict</th></tr>
123
                    [% FOREACH tabl IN table %]
124
                     [% UNLESS ( loop.odd ) %]
125
                                <tr class="highlight">
126
                            [% ELSE %]
127
                                <tr>
128
                            [% END %]
129
                            <th scope="row">[% tabl.line %]</th>
130
<td>
131
                                <input type="text" name="delay2-[% tabl.overduename %]" size="5" value="[% tabl.delay2 %]" />
132
                            </td>
133
<td>
134
                            [% IF ( tabl.noletter ) %]
135
                                <input type="text" name="letter2-[% tabl.overduename %]" value="[% tabl.letter2 %]" />
136
                            [% ELSE %]
137
                                <select name="letter2-[% tabl.overduename %]">
138
                                    <option value="">No notice</option>
139
                                        [% FOREACH letterloop IN tabl.letterloop2 %]
140
                                            [% IF ( letterloop.selected ) %]
141
                                                <option value="[% letterloop.value %]" selected="selected">[% letterloop.lettername %]</option>
142
                                            [% ELSE %]
143
                                                <option value="[% letterloop.value %]">[% letterloop.lettername %]</option>
144
                                            [% END %]
145
                                        [% END %]
146
                                </select>
147
                            [% END %]
148
                            </td>
149
<td>
150
                                [% IF ( tabl.debarred2 ) %]
151
                                    <input type="checkbox" name="debarred2-[% tabl.overduename %]" checked="checked" value="1" />
152
                                [% ELSE %]
153
                                    <input type="checkbox" name="debarred2-[% tabl.overduename %]" value="1" />
154
                                [% END %]
155
                            </td>
156
							</tr>
157
							[% END %]
158
							</table>
159
</div>
160
161
<div id="third"><table>
162
                    <tr><th>&nbsp;</th><th scope="col">Delay</th><th scope="col">Third letter</th><th scope="col">Restrict</th></tr>
163
                    [% FOREACH tabl IN table %]
164
                     [% UNLESS ( loop.odd ) %]
165
                                <tr class="highlight">
166
                            [% ELSE %]
167
                                <tr>
168
                            [% END %]
169
                            <th scope="row">[% tabl.line %]</th>
170
<td>
171
                                <input type="text" name="delay3-[% tabl.overduename %]" size="5" value="[% tabl.delay3 %]" />
172
                            </td>
173
<td>
174
                            [% IF ( tabl.noletter ) %]
175
                                <input type="text" name="letter3-[% tabl.overduename %]" value="[% tabl.letter3 %]" />
176
                            [% ELSE %]
177
                                <select name="letter3-[% tabl.overduename %]">
178
                                    <option value="">No notice</option>
179
                                    [% FOREACH letterloop IN tabl.letterloop3 %]
180
                                        [% IF ( letterloop.selected ) %]
181
                                            <option value="[% letterloop.value %]" selected="selected">[% letterloop.lettername %]</option>
182
                                        [% ELSE %]
183
                                            <option value="[% letterloop.value %]">[% letterloop.lettername %]</option>
184
                                        [% END %]
185
                                    [% END %]
186
                                </select>
187
                            [% END %]
188
                            </td>
189
<td>
190
                                [% IF ( tabl.debarred3 ) %]
191
                                    <input type="checkbox" name="debarred3-[% tabl.overduename %]" checked="checked" value="1" />
192
                                [% ELSE %]
193
                                    <input type="checkbox" name="debarred3-[% tabl.overduename %]" value="1" />
194
                                [% END %]
195
                            </td>
196
                        </tr>
197
                    [% END %]
198
                </table>
199
</div>
200
</div>
146
</div>
201
147
202
                <fieldset class="action"><input type="submit" value="Save changes" /></fieldset>
148
                <fieldset class="action"><input type="submit" value="Save changes" /></fieldset>
(-)a/misc/cronjobs/overdue_notices.pl (-62 / +70 lines)
Lines 39-45 use C4::Context; Link Here
39
use C4::Dates qw/format_date/;
39
use C4::Dates qw/format_date/;
40
use C4::Debug;
40
use C4::Debug;
41
use C4::Letters;
41
use C4::Letters;
42
use C4::Overdues qw(GetFine);
42
use C4::Overdues qw(GetFine GetOverdueMessageTransportTypes);
43
43
44
=head1 NAME
44
=head1 NAME
45
45
Lines 417-423 END_SQL Link Here
417
417
418
    # my $outfile = 'overdues_' . ( $mybranch || $branchcode || 'default' );
418
    # my $outfile = 'overdues_' . ( $mybranch || $branchcode || 'default' );
419
    while ( my $overdue_rules = $rqoverduerules->fetchrow_hashref ) {
419
    while ( my $overdue_rules = $rqoverduerules->fetchrow_hashref ) {
420
      PERIOD: foreach my $i ( 1 .. 3 ) {
420
      PERIOD: foreach my $i ( 1..3 ) {
421
421
422
            $verbose and warn "branch '$branchcode', pass $i\n";
422
            $verbose and warn "branch '$branchcode', pass $i\n";
423
            my $mindays = $overdue_rules->{"delay$i"};    # the notice will be sent after mindays days (grace period)
423
            my $mindays = $overdue_rules->{"delay$i"};    # the notice will be sent after mindays days (grace period)
Lines 507-574 END_SQL Link Here
507
                }
507
                }
508
                $sth2->finish;
508
                $sth2->finish;
509
509
510
                my $letter = parse_letter(
510
                my @message_transport_types = @{ GetOverdueMessageTransportTypes( $branchcode, $overdue_rules->{categorycode}, $i) };
511
                    {   letter_code     => $overdue_rules->{"letter$i"},
511
512
                        letter          => $letter_template,
512
                for my $mtt ( @message_transport_types ) {
513
                        borrowernumber  => $borrowernumber,
513
514
                        branchcode      => $branchcode,
514
                    my $letter = parse_letter(
515
                        items           => \@items,
515
                        {   letter_code     => $overdue_rules->{"letter$i"},
516
                        substitute      => {    # this appears to be a hack to overcome incomplete features in this code.
516
                            letter          => $letter_template,
517
                                            bib             => $branch_details->{'branchname'}, # maybe 'bib' is a typo for 'lib<rary>'?
517
                            borrowernumber  => $borrowernumber,
518
                                            'items.content' => $titles,
518
                            branchcode      => $branchcode,
519
                                            'count'         => $itemcount,
519
                            items           => \@items,
520
                                           }
520
                            substitute      => {    # this appears to be a hack to overcome incomplete features in this code.
521
                                                bib             => $branch_details->{'branchname'}, # maybe 'bib' is a typo for 'lib<rary>'?
522
                                                'items.content' => $titles,
523
                                                'count'         => $itemcount,
524
                                               },
525
                            message_transport_type => $mtt,
526
                        }
527
                    );
528
                    unless ($letter) {
529
                        $verbose and warn "Message '$overdue_rules->{letter$i}' content not found";
530
531
                        # might as well skip while PERIOD, no other borrowers are going to work.
532
                        # FIXME : Does this mean a letter must be defined in order to trigger a debar ?
533
                        next PERIOD;
521
                    }
534
                    }
522
                );
523
                unless ($letter) {
524
                    $verbose and warn "Message '$overdue_rules->{letter$i}' content not found";
525
535
526
                    # might as well skip while PERIOD, no other borrowers are going to work.
536
                    if ( $exceededPrintNoticesMaxLines ) {
527
                    # FIXME : Does this mean a letter must be defined in order to trigger a debar ?
537
                      $letter->{'content'} .= "List too long for form; please check your account online for a complete list of your overdue items.";
528
                    next PERIOD;
538
                    }
529
                }
539
530
                
540
                    my @misses = grep { /./ } map { /^([^>]*)[>]+/; ( $1 || '' ); } split /\</, $letter->{'content'};
531
                if ( $exceededPrintNoticesMaxLines ) {
541
                    if (@misses) {
532
                  $letter->{'content'} .= "List too long for form; please check your account online for a complete list of your overdue items.";
542
                        $verbose and warn "The following terms were not matched and replaced: \n\t" . join "\n\t", @misses;
533
                }
543
                    }
544
                    $letter->{'content'} =~ s/\<[^<>]*?\>//g;    # Now that we've warned about them, remove them.
545
                    $letter->{'content'} =~ s/\<[^<>]*?\>//g;    # 2nd pass for the double nesting.
546
547
                    if ($nomail) {
534
548
535
                my @misses = grep { /./ } map { /^([^>]*)[>]+/; ( $1 || '' ); } split /\</, $letter->{'content'};
536
                if (@misses) {
537
                    $verbose and warn "The following terms were not matched and replaced: \n\t" . join "\n\t", @misses;
538
                }
539
                $letter->{'content'} =~ s/\<[^<>]*?\>//g;    # Now that we've warned about them, remove them.
540
                $letter->{'content'} =~ s/\<[^<>]*?\>//g;    # 2nd pass for the double nesting.
541
    
542
                if ($nomail) {
543
    
544
                    push @output_chunks,
545
                      prepare_letter_for_printing(
546
                        {   letter         => $letter,
547
                            borrowernumber => $borrowernumber,
548
                            firstname      => $firstname,
549
                            lastname       => $lastname,
550
                            address1       => $address1,
551
                            address2       => $address2,
552
                            city           => $city,
553
                            postcode       => $postcode,
554
                            email          => $email,
555
                            itemcount      => $itemcount,
556
                            titles         => $titles,
557
                            outputformat   => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : '',
558
                        }
559
                      );
560
                } else {
561
                    if ($email) {
562
                        C4::Letters::EnqueueLetter(
563
                            {   letter                 => $letter,
564
                                borrowernumber         => $borrowernumber,
565
                                message_transport_type => 'email',
566
                                from_address           => $admin_email_address,
567
                            }
568
                        );
569
                    } else {
570
    
571
                        # If we don't have an email address for this patron, send it to the admin to deal with.
572
                        push @output_chunks,
549
                        push @output_chunks,
573
                          prepare_letter_for_printing(
550
                          prepare_letter_for_printing(
574
                            {   letter         => $letter,
551
                            {   letter         => $letter,
Lines 585-590 END_SQL Link Here
585
                                outputformat   => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : '',
562
                                outputformat   => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : '',
586
                            }
563
                            }
587
                          );
564
                          );
565
                    } else {
566
                        if ( ( $email and $mtt eq 'email' )
567
                                or $mtt eq 'sms' ) {
568
                            C4::Letters::EnqueueLetter(
569
                                {   letter                 => $letter,
570
                                    borrowernumber         => $borrowernumber,
571
                                    message_transport_type => $mtt,
572
                                    from_address           => $admin_email_address,
573
                                }
574
                            );
575
                        } else {
576
577
                            # If we don't have an email address for this patron, send it to the admin to deal with.
578
                            push @output_chunks,
579
                              prepare_letter_for_printing(
580
                                {   letter         => $letter,
581
                                    borrowernumber => $borrowernumber,
582
                                    firstname      => $firstname,
583
                                    lastname       => $lastname,
584
                                    address1       => $address1,
585
                                    address2       => $address2,
586
                                    city           => $city,
587
                                    postcode       => $postcode,
588
                                    email          => $email,
589
                                    itemcount      => $itemcount,
590
                                    titles         => $titles,
591
                                    outputformat   => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : '',
592
                                }
593
                              );
594
                        }
588
                    }
595
                    }
589
                }
596
                }
590
            }
597
            }
Lines 711-717 sub parse_letter { Link Here
711
        branchcode => $params->{'branchcode'},
718
        branchcode => $params->{'branchcode'},
712
        tables => \%tables,
719
        tables => \%tables,
713
        substitute => $substitute,
720
        substitute => $substitute,
714
        repeat => { item => \@item_tables }
721
        repeat => { item => \@item_tables },
722
        message_transport_type => $params->{message_transport_type},
715
    );
723
    );
716
}
724
}
717
725
(-)a/tools/letter.pl (-55 / +110 lines)
Lines 47-60 use C4::Auth; Link Here
47
use C4::Context;
47
use C4::Context;
48
use C4::Output;
48
use C4::Output;
49
use C4::Branch; # GetBranches
49
use C4::Branch; # GetBranches
50
use C4::Letters;
50
use C4::Members::Attributes;
51
use C4::Members::Attributes;
51
52
52
# _letter_from_where($branchcode,$module, $code)
53
# _letter_from_where($branchcode,$module, $code, $mtt)
53
# - return FROM WHERE clause and bind args for a letter
54
# - return FROM WHERE clause and bind args for a letter
54
sub _letter_from_where {
55
sub _letter_from_where {
55
    my ($branchcode, $module, $code) = @_;
56
    my ($branchcode, $module, $code, $mtt) = @_;
56
    my $sql = q{FROM letter WHERE branchcode = ? AND module = ? AND code = ?};
57
    my $sql = q{FROM letter WHERE branchcode = ? AND module = ? AND code = ?};
57
    my @args = ($branchcode || '', $module, $code);
58
    $sql .= q{ AND message_transport_type = ?} if $mtt ne '*';
59
    my @args = ( $branchcode || '', $module, $code, ($mtt ne '*' ? $mtt : ()) );
58
# Mysql is retarded. cause branchcode is part of the primary key it cannot be null. How does that
60
# Mysql is retarded. cause branchcode is part of the primary key it cannot be null. How does that
59
# work with foreign key constraint I wonder...
61
# work with foreign key constraint I wonder...
60
62
Lines 68-79 sub _letter_from_where { Link Here
68
    return ($sql, \@args);
70
    return ($sql, \@args);
69
}
71
}
70
72
71
# letter_exists($branchcode,$module, $code)
73
# get_letters($branchcode,$module, $code, $mtt)
72
# - return true if a letter with the given $branchcode, $module and $code exists
74
# - return letters with the given $branchcode, $module, $code and $mtt exists
73
sub letter_exists {
75
sub get_letters {
74
    my ($sql, $args) = _letter_from_where(@_);
76
    my ($sql, $args) = _letter_from_where(@_);
75
    my $dbh = C4::Context->dbh;
77
    my $dbh = C4::Context->dbh;
76
    my $letter = $dbh->selectrow_hashref("SELECT * $sql", undef, @$args);
78
    my $letter = $dbh->selectall_hashref("SELECT * $sql", 'message_transport_type', undef, @$args);
77
    return $letter;
79
    return $letter;
78
}
80
}
79
81
Lines 90-96 my $searchfield = $input->param('searchfield'); Link Here
90
my $script_name = '/cgi-bin/koha/tools/letter.pl';
92
my $script_name = '/cgi-bin/koha/tools/letter.pl';
91
our $branchcode  = $input->param('branchcode');
93
our $branchcode  = $input->param('branchcode');
92
my $code        = $input->param('code');
94
my $code        = $input->param('code');
93
my $module      = $input->param('module');
95
my $module      = $input->param('module') || '';
94
my $content     = $input->param('content');
96
my $content     = $input->param('content');
95
my $op          = $input->param('op') || '';
97
my $op          = $input->param('op') || '';
96
my $dbh = C4::Context->dbh;
98
my $dbh = C4::Context->dbh;
Lines 134-140 elsif ( $op eq 'delete_confirm' ) { Link Here
134
    delete_confirm($branchcode, $module, $code);
136
    delete_confirm($branchcode, $module, $code);
135
}
137
}
136
elsif ( $op eq 'delete_confirmed' ) {
138
elsif ( $op eq 'delete_confirmed' ) {
137
    delete_confirmed($branchcode, $module, $code);
139
    my $mtt = $input->param('message_transport_type');
140
    delete_confirmed($branchcode, $module, $code, $mtt);
138
    $op = q{}; # next operation is to return to default screen
141
    $op = q{}; # next operation is to return to default screen
139
}
142
}
140
else {
143
else {
Lines 151-175 if ($op) { Link Here
151
output_html_with_http_headers $input, $cookie, $template->output;
154
output_html_with_http_headers $input, $cookie, $template->output;
152
155
153
sub add_form {
156
sub add_form {
154
    my ($branchcode,$module, $code ) = @_;
157
    my ( $branchcode,$module, $code ) = @_;
155
158
156
    my $letter;
159
    my $letters;
157
    # if code has been passed we can identify letter and its an update action
160
    # if code has been passed we can identify letter and its an update action
158
    if ($code) {
161
    if ($code) {
159
        $letter = letter_exists($branchcode,$module, $code);
162
        $letters = get_letters($branchcode,$module, $code, '*');
160
    }
163
    }
161
    if ($letter) {
164
162
        $template->param( modify => 1 );
165
    my $message_transport_types = GetMessageTransportTypes();
163
        $template->param( code   => $letter->{code} );
166
    my @letter_loop;
167
    if ($letters) {
168
        my $first_flag = 1;
169
        for my $mtt ( @$message_transport_types ) {
170
            $mtt = $mtt->{message_transport_type};
171
            if ( $first_flag ) {
172
                $template->param(
173
                    modify     => 1,
174
                    code       => $code,
175
                    branchcode => $branchcode,
176
                    name       => $letters->{$mtt}{name},
177
                );
178
                $first_flag = 0;
179
            }
180
181
            push @letter_loop, {
182
                message_transport_type => $mtt,
183
                is_html    => $letters->{$mtt}{is_html},
184
                title      => $letters->{$mtt}{title},
185
                content    => $letters->{$mtt}{content},
186
            };
187
        }
164
    }
188
    }
165
    else { # initialize the new fields
189
    else { # initialize the new fields
166
        $letter = {
190
        for my $mtt ( @$message_transport_types ) {
191
            $mtt = $mtt->{message_transport_type};
192
            push @letter_loop, {
193
                message_transport_type => $mtt,
194
            }
195
        }
196
        $template->param(
167
            branchcode => $branchcode,
197
            branchcode => $branchcode,
168
            module     => $module,
198
            module     => $module,
169
        };
199
        );
170
        $template->param( adding => 1 );
200
        $template->param( adding => 1 );
171
    }
201
    }
172
202
203
    $template->param(
204
        letters => \@letter_loop,
205
    );
206
173
    my $field_selection;
207
    my $field_selection;
174
    push @{$field_selection}, add_fields('branches');
208
    push @{$field_selection}, add_fields('branches');
175
    if ($module eq 'reserves') {
209
    if ($module eq 'reserves') {
Lines 210-222 sub add_form { Link Here
210
    }
244
    }
211
245
212
    $template->param(
246
    $template->param(
213
        branchcode => $letter->{branchcode},
214
        name       => $letter->{name},
215
        is_html    => $letter->{is_html},
216
        title      => $letter->{title},
217
        content    => $letter->{content},
218
        module     => $module,
247
        module     => $module,
219
        $module    => 1,
220
        branchloop => _branchloop($branchcode),
248
        branchloop => _branchloop($branchcode),
221
        SQLfieldname => $field_selection,
249
        SQLfieldname => $field_selection,
222
    );
250
    );
Lines 231-252 sub add_validate { Link Here
231
    my $oldmodule     = $input->param('oldmodule');
259
    my $oldmodule     = $input->param('oldmodule');
232
    my $code          = $input->param('code');
260
    my $code          = $input->param('code');
233
    my $name          = $input->param('name');
261
    my $name          = $input->param('name');
234
    my $is_html       = $input->param('is_html');
262
    my @mtt           = $input->param('message_transport_type');
235
    my $title         = $input->param('title');
263
    my @title         = $input->param('title');
236
    my $content       = $input->param('content');
264
    my @content       = $input->param('content');
237
    if (letter_exists($oldbranchcode,$oldmodule, $code)) {
265
    for my $mtt ( @mtt ) {
238
        $dbh->do(
266
        my $is_html = $input->param("is_html_$mtt");
239
            q{UPDATE letter SET branchcode = ?, module = ?, name = ?, is_html = ?, title = ?, content = ? WHERE branchcode = ? AND module = ? AND code = ?},
267
        my $title   = shift @title;
240
            undef,
268
        my $content = shift @content;
241
            $branchcode, $module, $name, $is_html || 0, $title, $content,
269
        my $letter = get_letters($oldbranchcode,$oldmodule, $code, $mtt);
242
            $oldbranchcode, $oldmodule, $code
270
        unless ( $title and $content ) {
243
        );
271
            delete_confirmed( $oldbranchcode, $oldmodule, $code, $mtt );
244
    } else {
272
            next;
245
        $dbh->do(
273
        }
246
            q{INSERT INTO letter (branchcode,module,code,name,is_html,title,content) VALUES (?,?,?,?,?,?,?)},
274
        if ( exists $letter->{$mtt} ) {
247
            undef,
275
            $dbh->do(
248
            $branchcode, $module, $code, $name, $is_html || 0, $title, $content
276
                q{
249
        );
277
                    UPDATE letter
278
                    SET branchcode = ?, module = ?, name = ?, is_html = ?, title = ?, content = ?
279
                    WHERE branchcode = ? AND module = ? AND code = ? AND message_transport_type = ?
280
                },
281
                undef,
282
                $branchcode, $module, $name, $is_html || 0, $title, $content,
283
                $oldbranchcode, $oldmodule, $code, $mtt
284
            );
285
        } else {
286
            $dbh->do(
287
                q{INSERT INTO letter (branchcode,module,code,name,is_html,title,content,message_transport_type) VALUES (?,?,?,?,?,?,?,?)},
288
                undef,
289
                $branchcode, $module, $code, $name, $is_html || 0, $title, $content, $mtt
290
            );
291
        }
250
    }
292
    }
251
    # set up default display
293
    # set up default display
252
    default_display($branchcode);
294
    default_display($branchcode);
Lines 259-289 sub add_copy { Link Here
259
    my $module        = $input->param('module');
301
    my $module        = $input->param('module');
260
    my $code          = $input->param('code');
302
    my $code          = $input->param('code');
261
303
262
    return if letter_exists($branchcode,$module, $code);
304
    return if keys %{ get_letters($branchcode,$module, $code, '*') };
263
305
264
    my $old_letter = letter_exists($oldbranchcode,$module, $code);
306
    my $old_letters = get_letters($oldbranchcode,$module, $code, '*');
265
307
266
    $dbh->do(
308
    my $message_transport_types = GetMessageTransportTypes();
267
        q{INSERT INTO letter (branchcode,module,code,name,is_html,title,content) VALUES (?,?,?,?,?,?,?)},
309
    for my $mtt ( @$message_transport_types ) {
268
        undef,
310
        my $mtt = $mtt->{message_transport_type};
269
        $branchcode, $module, $code, $old_letter->{name}, $old_letter->{is_html}, $old_letter->{title}, $old_letter->{content}
311
        next unless exists $old_letters->{$mtt};
270
    );
312
        my $old_letter = $old_letters->{$mtt};
313
314
        $dbh->do(
315
            q{INSERT INTO letter (branchcode,module,code,name,is_html,title,content,message_transport_type) VALUES (?,?,?,?,?,?,?,?)},
316
            undef,
317
            $branchcode, $module, $code, $old_letter->{name}, $old_letter->{is_html}, $old_letter->{title}, $old_letter->{content}, $mtt
318
        );
319
    }
271
}
320
}
272
321
273
sub delete_confirm {
322
sub delete_confirm {
274
    my ($branchcode, $module, $code) = @_;
323
    my ($branchcode, $module, $code) = @_;
275
    my $dbh = C4::Context->dbh;
324
    my $dbh = C4::Context->dbh;
276
    my $letter = letter_exists($branchcode, $module, $code);
325
    my $letter = get_letters($branchcode, $module, $code, '*');
277
    $template->param( branchcode => $branchcode, branchname => GetBranchName($branchcode) );
326
    my @values = values %$letter;
278
    $template->param( code => $code );
327
    $template->param(
279
    $template->param( module => $module);
328
        branchcode => $branchcode,
280
    $template->param( name => $letter->{name});
329
        branchname => GetBranchName($branchcode),
330
        code => $code,
331
        module => $module,
332
        name => $values[0]->{name},
333
    );
281
    return;
334
    return;
282
}
335
}
283
336
284
sub delete_confirmed {
337
sub delete_confirmed {
285
    my ($branchcode, $module, $code) = @_;
338
    my ($branchcode, $module, $code, $mtt) = @_;
286
    my ($sql, $args) = _letter_from_where($branchcode, $module, $code);
339
    my ($sql, $args) = _letter_from_where($branchcode, $module, $code, $mtt);
287
    my $dbh    = C4::Context->dbh;
340
    my $dbh    = C4::Context->dbh;
288
    $dbh->do("DELETE $sql", undef, @$args);
341
    $dbh->do("DELETE $sql", undef, @$args);
289
    # setup default display for screen
342
    # setup default display for screen
Lines 300-306 sub retrieve_letters { Link Here
300
    my ($sql, @where, @args);
353
    my ($sql, @where, @args);
301
    $sql = "SELECT branchcode, module, code, name, branchname
354
    $sql = "SELECT branchcode, module, code, name, branchname
302
            FROM letter
355
            FROM letter
303
            LEFT OUTER JOIN branches USING (branchcode)";
356
            LEFT OUTER JOIN branches USING (branchcode)
357
    ";
304
    if ($searchstring && $searchstring=~m/(\S+)/) {
358
    if ($searchstring && $searchstring=~m/(\S+)/) {
305
        $searchstring = $1 . q{%};
359
        $searchstring = $1 . q{%};
306
        push @where, 'code LIKE ?';
360
        push @where, 'code LIKE ?';
Lines 316-323 sub retrieve_letters { Link Here
316
    }
370
    }
317
371
318
    $sql .= " WHERE ".join(" AND ", @where) if @where;
372
    $sql .= " WHERE ".join(" AND ", @where) if @where;
373
    $sql .= " GROUP BY branchcode,module,code";
319
    $sql .= " ORDER BY module, code, branchcode";
374
    $sql .= " ORDER BY module, code, branchcode";
320
#   use Data::Dumper; die Dumper($sql, \@args);
375
321
    return $dbh->selectall_arrayref($sql, { Slice => {} }, @args);
376
    return $dbh->selectall_arrayref($sql, { Slice => {} }, @args);
322
}
377
}
323
378
(-)a/tools/overduerules.pl (-23 / +104 lines)
Lines 27-32 use C4::Koha; Link Here
27
use C4::Branch;
27
use C4::Branch;
28
use C4::Letters;
28
use C4::Letters;
29
use C4::Members;
29
use C4::Members;
30
use C4::Overdues;
30
31
31
our $input = new CGI;
32
our $input = new CGI;
32
my $dbh = C4::Context->dbh;
33
my $dbh = C4::Context->dbh;
Lines 44-54 sub blank_row { Link Here
44
    for my $rp (@rule_params) {
45
    for my $rp (@rule_params) {
45
        for my $n (1 .. 3) {
46
        for my $n (1 .. 3) {
46
            my $key   = "${rp}${n}-$category_code";
47
            my $key   = "${rp}${n}-$category_code";
47
            
48
48
            if (utf8::is_utf8($key)) {
49
            if (utf8::is_utf8($key)) {
49
              utf8::encode($key);
50
              utf8::encode($key);
50
            }
51
            }
51
            
52
52
            my $value = $input->param($key);
53
            my $value = $input->param($key);
53
            if ($value) {
54
            if ($value) {
54
                return 0;
55
                return 0;
Lines 84-89 if ($op eq 'save') { Link Here
84
    my $sth_insert = $dbh->prepare("INSERT INTO overduerules (branchcode,categorycode, delay1,letter1,debarred1, delay2,letter2,debarred2, delay3,letter3,debarred3) VALUES (?,?,?,?,?,?,?,?,?,?,?)");
85
    my $sth_insert = $dbh->prepare("INSERT INTO overduerules (branchcode,categorycode, delay1,letter1,debarred1, delay2,letter2,debarred2, delay3,letter3,debarred3) VALUES (?,?,?,?,?,?,?,?,?,?,?)");
85
    my $sth_update=$dbh->prepare("UPDATE overduerules SET delay1=?, letter1=?, debarred1=?, delay2=?, letter2=?, debarred2=?, delay3=?, letter3=?, debarred3=? WHERE branchcode=? AND categorycode=?");
86
    my $sth_update=$dbh->prepare("UPDATE overduerules SET delay1=?, letter1=?, debarred1=?, delay2=?, letter2=?, debarred2=?, delay3=?, letter3=?, debarred3=? WHERE branchcode=? AND categorycode=?");
86
    my $sth_delete=$dbh->prepare("DELETE FROM overduerules WHERE branchcode=? AND categorycode=?");
87
    my $sth_delete=$dbh->prepare("DELETE FROM overduerules WHERE branchcode=? AND categorycode=?");
88
    my $sth_insert_mtt = $dbh->prepare("
89
        INSERT INTO overduerules_transport_types(
90
            branchcode, categorycode, letternumber, message_transport_type
91
        ) VALUES (
92
            ?, ?, ?, ?
93
        )
94
    ");
95
    my $sth_delete_mtt = $dbh->prepare("
96
        DELETE FROM overduerules_transport_types
97
        WHERE branchcode = ? AND categorycode = ?
98
    ");
99
87
    foreach my $key (@names){
100
    foreach my $key (@names){
88
            # ISSUES
101
            # ISSUES
89
            if ($key =~ /(delay|letter|debarred)([1-3])-(.*)/) {
102
            if ($key =~ /(delay|letter|debarred)([1-3])-(.*)/) {
Lines 166-171 if ($op eq 'save') { Link Here
166
                            ($temphash{$bor}->{"debarred3"}?$temphash{$bor}->{"debarred3"}:0)
179
                            ($temphash{$bor}->{"debarred3"}?$temphash{$bor}->{"debarred3"}:0)
167
                            );
180
                            );
168
                    }
181
                    }
182
183
                    $sth_delete_mtt->execute( $branch, $bor );
184
                    for my $letternumber ( 1..3 ) {
185
                        my @mtt = $input->param( "mtt${letternumber}-$bor" );
186
                        next unless @mtt;
187
                        for my $mtt ( @mtt ) {
188
                            $sth_insert_mtt->execute( $branch, $bor, $letternumber, $mtt);
189
                        }
190
                    }
169
                }
191
                }
170
        }
192
        }
171
    }
193
    }
Lines 185-203 my $countletters = keys %{$letters}; Link Here
185
207
186
my @line_loop;
208
my @line_loop;
187
209
210
my $message_transport_types = GetMessageTransportTypes();
211
my ( @first, @second, @third );
188
for my $data (@categories) {
212
for my $data (@categories) {
189
    my %row = (
190
        overduename => $data->{'categorycode'},
191
        line        => $data->{'description'}
192
    );
193
    if (%temphash and not $input_saved){
213
    if (%temphash and not $input_saved){
194
        # if we managed to save the form submission, don't
214
        # if we managed to save the form submission, don't
195
        # reuse %temphash, but take the values from the
215
        # reuse %temphash, but take the values from the
196
        # database - this makes it easier to identify
216
        # database - this makes it easier to identify
197
        # bugs where the form submission was not correctly saved
217
        # bugs where the form submission was not correctly saved
198
        for (my $i=1;$i<=3;$i++){
218
        for my $i ( 1..3 ){
199
            $row{"delay$i"}=$temphash{$data->{'categorycode'}}->{"delay$i"};
219
            my %row = (
200
            $row{"debarred$i"}=$temphash{$data->{'categorycode'}}->{"debarred$i"};
220
                overduename => $data->{'categorycode'},
221
                line        => $data->{'description'}
222
            );
223
            $row{delay}=$temphash{$data->{'categorycode'}}->{"delay$i"};
224
            $row{debarred}=$temphash{$data->{'categorycode'}}->{"debarred$i"};
201
            if ($countletters){
225
            if ($countletters){
202
                my @letterloop;
226
                my @letterloop;
203
                foreach my $thisletter (sort { $letters->{$a} cmp $letters->{$b} } keys %$letters) {
227
                foreach my $thisletter (sort { $letters->{$a} cmp $letters->{$b} } keys %$letters) {
Lines 212-221 for my $data (@categories) { Link Here
212
                                    );
236
                                    );
213
                    push @letterloop, \%letterrow;
237
                    push @letterloop, \%letterrow;
214
                }
238
                }
215
                $row{"letterloop$i"}=\@letterloop;
239
                $row{letterloop}=\@letterloop;
216
            } else {
240
            } else {
217
                $row{"noletter"}=1;
241
                $row{noletter}=1;
218
                $row{"letter$i"}=$temphash{$data->{'categorycode'}}->{"letter$i"};
242
                $row{letter}=$temphash{$data->{'categorycode'}}->{"letter$i"};
243
            }
244
            my @selected_mtts = @{ GetOverdueMessageTransportTypes( $branch, $data->{'categorycode'}, $i) };
245
            my @mtts;
246
            for my $mtt ( @$message_transport_types ) {
247
                push @mtts, {
248
                    value => $mtt->{message_transport_type},
249
                    selected => ( grep {$mtt->{message_transport_type} eq $_} @selected_mtts ) ? 1 : 0 ,
250
                }
251
            }
252
            $row{message_transport_types} = \@mtts;
253
            if ( $i == 1 ) {
254
                push @first, \%row;
255
            } elsif ( $i == 2 ) {
256
                push @second, \%row;
257
            } else {
258
                push @third, \%row;
219
            }
259
            }
220
        }
260
        }
221
    } else {
261
    } else {
Lines 223-229 for my $data (@categories) { Link Here
223
        my $sth2=$dbh->prepare("SELECT * from overduerules WHERE branchcode=? AND categorycode=?");
263
        my $sth2=$dbh->prepare("SELECT * from overduerules WHERE branchcode=? AND categorycode=?");
224
        $sth2->execute($branch,$data->{'categorycode'});
264
        $sth2->execute($branch,$data->{'categorycode'});
225
        my $dat=$sth2->fetchrow_hashref;
265
        my $dat=$sth2->fetchrow_hashref;
226
        for (my $i=1;$i<=3;$i++){
266
        for my $i ( 1..3 ){
267
            my %row = (
268
                overduename => $data->{'categorycode'},
269
                line        => $data->{'description'}
270
            );
227
            if ($countletters){
271
            if ($countletters){
228
                my @letterloop;
272
                my @letterloop;
229
                foreach my $thisletter (sort { $letters->{$a} cmp $letters->{$b} } keys %$letters) {
273
                foreach my $thisletter (sort { $letters->{$a} cmp $letters->{$b} } keys %$letters) {
Lines 237-255 for my $data (@categories) { Link Here
237
                                    );
281
                                    );
238
                    push @letterloop, \%letterrow;
282
                    push @letterloop, \%letterrow;
239
                }
283
                }
240
                $row{"letterloop$i"}=\@letterloop;
284
                $row{letterloop}=\@letterloop;
241
            } else {
285
            } else {
242
                $row{"noletter"}=1;
286
                $row{noletter}=1;
243
                if ($dat->{"letter$i"}){$row{"letter$i"}=$dat->{"letter$i"};}
287
                if ($dat->{"letter$i"}){$row{letter}=$dat->{"letter$i"};}
288
            }
289
            if ($dat->{"delay$i"}){$row{delay}=$dat->{"delay$i"};}
290
            if ($dat->{"debarred$i"}){$row{debarred}=$dat->{"debarred$i"};}
291
            my @selected_mtts = @{ GetOverdueMessageTransportTypes( $branch, $data->{'categorycode'}, $i) };
292
            my @mtts;
293
            for my $mtt ( @$message_transport_types ) {
294
                push @mtts, {
295
                    value => $mtt->{message_transport_type},
296
                    selected => ( grep {$mtt->{message_transport_type} eq $_} @selected_mtts ) ? 1 : 0 ,
297
                }
244
            }
298
            }
245
            if ($dat->{"delay$i"}){$row{"delay$i"}=$dat->{"delay$i"};}
299
            $row{message_transport_types} = \@mtts;
246
            if ($dat->{"debarred$i"}){$row{"debarred$i"}=$dat->{"debarred$i"};}
300
            if ( $i == 1 ) {
301
                push @first, \%row;
302
            } elsif ( $i == 2 ) {
303
                push @second, \%row;
304
            } else {
305
                push @third, \%row;
306
            }
307
247
        }
308
        }
248
    }
309
    }
249
    push @line_loop,\%row;
250
}
310
}
251
311
252
$template->param(table=> \@line_loop,
312
my @tabs = (
253
                branchloop => $branchloop,
313
    {
254
                branch => $branch);
314
        id => 'first',
315
        number => 1,
316
        values => \@first,
317
    },
318
    {
319
        id => 'second',
320
        number => 2,
321
        values => \@second,
322
    },
323
    {
324
        id => 'third',
325
        number => 3,
326
        values => \@third,
327
    },
328
);
329
330
$template->param(
331
    table => ( @first or @second or @third ? 1 : 0 ),
332
    branchloop => $branchloop,
333
    branch => $branch,
334
    tabs => \@tabs,
335
    message_transport_types => $message_transport_types,
336
);
255
output_html_with_http_headers $input, $cookie, $template->output;
337
output_html_with_http_headers $input, $cookie, $template->output;
256
- 

Return to bug 9016