Line 0
Link Here
|
|
|
1 |
[% SET accounts_view = 1 %] |
2 |
[% USE KohaDates %] |
3 |
[% USE Currency %] |
4 |
[% INCLUDE 'doc-head-open.inc' %] |
5 |
<title>Koha › Patrons › Account for [% INCLUDE 'patron-title.inc' %]</title> |
6 |
[% INCLUDE 'doc-head-close.inc' %] |
7 |
|
8 |
<link rel="stylesheet" type="text/css" href="[% interface %]/[% theme %]/en/css/datatables.css" /> |
9 |
[% INCLUDE 'datatables.inc' %] |
10 |
[% INCLUDE 'browser-strings.inc' %] |
11 |
|
12 |
<script type="text/javascript"> |
13 |
//<![CDATA[ |
14 |
$(document).ready(function() { |
15 |
void_compare = "[% 0 FILTER $Currency highlight => highlight %]"; |
16 |
|
17 |
[% IF credit_id %] |
18 |
accountPrint( 'credit', [% credit_id %] ); |
19 |
[% ELSIF debit_id %] |
20 |
accountPrint( 'debit', [% debit_id %] ); |
21 |
[% END %] |
22 |
|
23 |
$('#account-credits').hide(); |
24 |
|
25 |
var anOpen = []; |
26 |
var sImageUrl = "[% interface %]/[% theme %]/img/"; |
27 |
|
28 |
var debitsTable = $('#debits-table').dataTable( { |
29 |
"sDom": "<'row-fluid'<'span6'T><'span6'>r>t<'row-fluid'><'top pager'ilpf>t<'bottom pager'ip>", |
30 |
"oTableTools": { |
31 |
"sSwfPath": "[% interface %]/lib/jquery/plugins/TableTools/media/swf/copy_csv_xls_pdf.swf", |
32 |
"aButtons": [ |
33 |
{ |
34 |
"sExtends": "text", |
35 |
"sButtonText": _("View payments"), |
36 |
"fnClick": function ( nButton, oConfig, oFlash ) { |
37 |
$('#account-debits').slideUp(); |
38 |
$('#account-credits').slideDown(); |
39 |
} |
40 |
}, |
41 |
{ |
42 |
"sExtends": "text", |
43 |
"sButtonText": [% IF show_all %] "<i class='icon-eye-close'></i> " + _("Hide fees & payments with no balance") [% ELSE %] "<i class='icon-eye-open'></i> " + _("Show all fees & payments") [% END %], |
44 |
"fnClick": function ( nButton, oConfig, oFlash ) { |
45 |
[% IF show_all %] |
46 |
window.location = "/cgi-bin/koha/members/account.pl?borrowernumber=[% borrowernumber %]&show_all=0"; |
47 |
[% ELSE %] |
48 |
window.location = "/cgi-bin/koha/members/account.pl?borrowernumber=[% borrowernumber %]&show_all=1"; |
49 |
[% END %] |
50 |
} |
51 |
}, |
52 |
{ |
53 |
"sExtends": "print", |
54 |
"sButtonText": "<i class='icon-print'></i> " + _("Print") |
55 |
}, |
56 |
{ |
57 |
"sExtends": "collection", |
58 |
"sButtonText": "<i class='icon-download'></i> " + _("Download") + " <span class='caret' />", |
59 |
"aButtons": [ |
60 |
{ |
61 |
"sExtends": "csv", |
62 |
"sButtonText": "<i class='icon-file'></i> " + _("CSV") |
63 |
} |
64 |
] |
65 |
} |
66 |
] |
67 |
}, |
68 |
"oLanguage": { |
69 |
"sEmptyTable": [% IF show_all %] _("Patron has no fees!") [% ELSE %] _("Patron has no outstanding fees!") [% END %] |
70 |
}, |
71 |
"bProcessing": true, |
72 |
"aoColumns": [ |
73 |
{ |
74 |
"mDataProp": null, |
75 |
"sClass": "control center", |
76 |
"sDefaultContent": '<img src="'+sImageUrl+'details_open.png'+'">' |
77 |
}, |
78 |
{ "mDataProp": "debit_id" }, |
79 |
{ "mDataProp": "description" }, |
80 |
{ |
81 |
"mDataProp": "type", |
82 |
"render": function ( data, type, full, meta ) { |
83 |
return STRINGS['DebitTypes'][data] || val; |
84 |
}, |
85 |
}, |
86 |
{ "mDataProp": "amount_original" }, |
87 |
{ "mDataProp": "amount_outstanding" }, |
88 |
{ "mDataProp": "created_on" }, |
89 |
{ "mDataProp": "updated_on" } |
90 |
], |
91 |
"aaData": [ |
92 |
[% FOREACH d IN debits %] |
93 |
{ |
94 |
[% PROCESS format_data data=d highlight='debit' %] |
95 |
|
96 |
// Data for related item if there is one linked |
97 |
"title": "[% d.item.biblio.title || d.deleted_item.biblio.title || d.deleted_item.deleted_biblio.title | replace('"', '\"') %]", |
98 |
"biblionumber": "[% d.item.biblio.biblionumber || d.deleted_item.biblio.biblionumber %]", |
99 |
"barcode": "[% d.item.barcode || d.deleted_item.barcode %]", |
100 |
"itemnumber": "[% d.item.itemnumber %]", //This way itemnumber will be undef if deleted |
101 |
|
102 |
|
103 |
// Data for related issue if there is one linked |
104 |
[% IF d.issue %] |
105 |
[% SET table = 'issue' %] |
106 |
[% ELSIF d.old_issue %] |
107 |
[% SET table = 'old_issue' %] |
108 |
[% END %] |
109 |
|
110 |
[% IF table %] |
111 |
"issue": { |
112 |
[% PROCESS format_data data=d.$table %] |
113 |
}, |
114 |
[% END %] |
115 |
|
116 |
|
117 |
"account_offsets": [ |
118 |
[% FOREACH ao IN d.account_offsets %] |
119 |
[% IF ao.credit %] |
120 |
{ |
121 |
[% PROCESS format_data data=ao highlight='offset'%] |
122 |
|
123 |
"credit": { |
124 |
[% PROCESS format_data data=ao.credit highlight='credit' %] |
125 |
} |
126 |
}, |
127 |
[% END %] |
128 |
[% END %] |
129 |
] |
130 |
|
131 |
}, |
132 |
[% END %] |
133 |
] |
134 |
} ); |
135 |
|
136 |
$('#debits-table td.control').live( 'click', function () { |
137 |
var nTr = this.parentNode; |
138 |
var i = $.inArray( nTr, anOpen ); |
139 |
|
140 |
if ( i === -1 ) { |
141 |
$('img', this).attr( 'src', sImageUrl+"details_close.png" ); |
142 |
var nDetailsRow = debitsTable.fnOpen( nTr, fnFormatDebitDetails(debitsTable, nTr), 'details' ); |
143 |
$('div.innerDetails', nDetailsRow).slideDown(); |
144 |
anOpen.push( nTr ); |
145 |
} |
146 |
else { |
147 |
$('img', this).attr( 'src', sImageUrl+"details_open.png" ); |
148 |
$('div.innerDetails', $(nTr).next()[0]).slideUp( function () { |
149 |
debitsTable.fnClose( nTr ); |
150 |
anOpen.splice( i, 1 ); |
151 |
} ); |
152 |
} |
153 |
} ); |
154 |
|
155 |
var creditsTable = $('#credits-table').dataTable( { |
156 |
"sDom": "<'row-fluid'<'span6'T><'span6'>r>t<'row-fluid'><'top pager'ilpf>t<'bottom pager'ip>", |
157 |
"oTableTools": { |
158 |
"sSwfPath": "[% interface %]/lib/jquery/plugins/TableTools/media/swf/copy_csv_xls_pdf.swf", |
159 |
"aButtons": [ |
160 |
{ |
161 |
"sExtends": "text", |
162 |
"sButtonText": _("View fees"), |
163 |
"fnClick": function ( nButton, oConfig, oFlash ) { |
164 |
$('#account-credits').slideUp(); |
165 |
$('#account-debits').slideDown(); |
166 |
} |
167 |
}, |
168 |
{ |
169 |
"sExtends": "text", |
170 |
"sButtonText": [% IF show_all %] "<i class='icon-eye-close'></i> " + _("Hide fees & payments with no balance") [% ELSE %] "<i class='icon-eye-open'></i> " + _("Show all fees & payments") [% END %], |
171 |
"fnClick": function ( nButton, oConfig, oFlash ) { |
172 |
[% IF show_all %] |
173 |
window.location = "/cgi-bin/koha/members/account.pl?borrowernumber=[% borrowernumber %]&show_all=0"; |
174 |
[% ELSE %] |
175 |
window.location = "/cgi-bin/koha/members/account.pl?borrowernumber=[% borrowernumber %]&show_all=1"; |
176 |
[% END %] |
177 |
} |
178 |
}, |
179 |
{ |
180 |
"sExtends": "print", |
181 |
"sButtonText": "<i class='icon-print'></i> " + _("Print") |
182 |
}, |
183 |
{ |
184 |
"sExtends": "collection", |
185 |
"sButtonText": "<i class='icon-download'></i> " + _("Download") + " <span class='caret' />", |
186 |
"aButtons": [ |
187 |
{ |
188 |
"sExtends": "csv", |
189 |
"sButtonText": "<i class='icon-file'></i> " + _("CSV") |
190 |
} |
191 |
] |
192 |
} |
193 |
] |
194 |
}, |
195 |
"oLanguage": { |
196 |
"sEmptyTable": [% IF show_all %] _("Patron has no payments!") [% ELSE %] _("Patron has no payments with an unused balance!") [% END %] |
197 |
}, |
198 |
"bProcessing": true, |
199 |
"aoColumns": [ |
200 |
{ |
201 |
"mDataProp": null, |
202 |
"sClass": "control center", |
203 |
"sDefaultContent": '<img src="'+sImageUrl+'details_open.png'+'">' |
204 |
}, |
205 |
{ "mDataProp": "credit_id" }, |
206 |
{ "mDataProp": "notes" }, |
207 |
{ |
208 |
"mDataProp": "type", |
209 |
"render": function ( data, type, full, meta ) { |
210 |
return STRINGS['CreditTypes'][data] || val; |
211 |
}, |
212 |
}, |
213 |
{ |
214 |
"mDataProp": "amount_paid", |
215 |
"mRender": function ( data, type, full ) { |
216 |
if ( full.amount_voided && full.amount_voided != void_compare ) { |
217 |
return "<strike>" + full.amount_voided + "</strike>"; |
218 |
} else { |
219 |
return full.amount_paid; |
220 |
} |
221 |
} |
222 |
}, |
223 |
{ "mDataProp": "amount_remaining" }, |
224 |
{ "mDataProp": "created_on" }, |
225 |
{ "mDataProp": "updated_on" } |
226 |
], |
227 |
"aaData": [ |
228 |
[% FOREACH c IN credits %] |
229 |
{ |
230 |
[% PROCESS format_data data=c highlight='credit' %] |
231 |
|
232 |
"account_offsets": [ |
233 |
[% FOREACH ao IN c.account_offsets %] |
234 |
{ |
235 |
[% PROCESS format_data data=ao highlight='offset' %] |
236 |
|
237 |
"debit": { |
238 |
[% PROCESS format_data data=ao.debit highlight='debit' %] |
239 |
} |
240 |
}, |
241 |
[% END %] |
242 |
] |
243 |
|
244 |
}, |
245 |
[% END %] |
246 |
] |
247 |
} ); |
248 |
|
249 |
$('#credits-table td.control').live( 'click', function () { |
250 |
var nTr = this.parentNode; |
251 |
var i = $.inArray( nTr, anOpen ); |
252 |
|
253 |
if ( i === -1 ) { |
254 |
$('img', this).attr( 'src', sImageUrl+"details_close.png" ); |
255 |
var nDetailsRow = creditsTable.fnOpen( nTr, fnFormatCreditDetails(creditsTable, nTr), 'details' ); |
256 |
$('div.innerDetails', nDetailsRow).slideDown(); |
257 |
anOpen.push( nTr ); |
258 |
} |
259 |
else { |
260 |
$('img', this).attr( 'src', sImageUrl+"details_open.png" ); |
261 |
$('div.innerDetails', $(nTr).next()[0]).slideUp( function () { |
262 |
creditsTable.fnClose( nTr ); |
263 |
anOpen.splice( i, 1 ); |
264 |
} ); |
265 |
} |
266 |
} ); |
267 |
|
268 |
} ); |
269 |
|
270 |
function fnFormatDebitDetails( debitsTable, nTr ) { |
271 |
var oData = debitsTable.fnGetData( nTr ); |
272 |
|
273 |
var sOut = "<div class='innerDetails' style='display:none;'>"; |
274 |
|
275 |
var account_offsets = oData.account_offsets; |
276 |
|
277 |
sOut += "<a class='debit_print btn btn-small noprint' style='margin:5px;' onclick='accountPrint(\"debit\"," + oData.debit_id + ")'>" + |
278 |
"<i class='icon-print'></i> " + _("Print receipt") + |
279 |
"</a>"; |
280 |
|
281 |
sOut += "<ul>"; |
282 |
if ( oData.title ) { |
283 |
sOut += "<li>" + _("Title: "); |
284 |
if ( oData.biblionumber ) { |
285 |
sOut += "<a href='/cgi-bin/koha/catalogue/detail.pl?biblionumber=" + oData.biblionumber + "'>"; |
286 |
} |
287 |
|
288 |
sOut += oData.title; |
289 |
|
290 |
if ( oData.biblionumber ) { |
291 |
sOut += "</a>"; |
292 |
} |
293 |
|
294 |
sOut += "</li>"; |
295 |
} |
296 |
|
297 |
if ( oData.barcode ) { |
298 |
sOut += "<li>" + _("Barcode: "); |
299 |
if ( oData.itemnumber ) { |
300 |
sOut += "<a href='/cgi-bin/koha/catalogue/moredetail.pl?itemnumber=11&biblionumber=" + oData.biblionumber + "&bi=" + oData.biblionumber + "#item" + oData.itemnumber + "" + oData.biblionumber + "'>"; |
301 |
} |
302 |
|
303 |
sOut += oData.barcode; |
304 |
|
305 |
if ( oData.itemnumber ) { |
306 |
sOut += "</a>"; |
307 |
} |
308 |
|
309 |
sOut += "</li>"; |
310 |
} |
311 |
|
312 |
if ( oData.notes ) { |
313 |
sOut += "<li>" + _("Notes: ") + oData.notes + "</li>"; |
314 |
} |
315 |
|
316 |
sOut += "</ul>"; |
317 |
|
318 |
if ( account_offsets.length ) { |
319 |
sOut += |
320 |
"<div class='innerDetails'>" + |
321 |
"<table cellpadding='5' cellspacing='0' border='0' style='margin:10px;'>" + |
322 |
"<thead>" + |
323 |
"<tr><th colspan='99'>" + _("Payments applied") + "</th></tr>" + |
324 |
"<tr>" + |
325 |
"<th>" + _("ID") + "</th>" + |
326 |
"<th>" + _("Created on") + "</th>" + |
327 |
"<th>" + _("Payment amount") + "</th>" + |
328 |
"<th>" + _("Applied amount") + "</th>" + |
329 |
"<th>" + _("Type") + "</th>" + |
330 |
"<th>" + _("Notes") + "</th>" + |
331 |
"</tr>" + |
332 |
"</thead>" + |
333 |
"<tbody>"; |
334 |
|
335 |
for ( var i = 0; i < account_offsets.length; i++ ) { |
336 |
ao = account_offsets[i]; |
337 |
credit_type = STRINGS["CreditTypes"][ao.credit.type] || ao.credit.type; |
338 |
offset_type = STRINGS["OffsetTypes"][ao.type] || ao.type; |
339 |
if ( offset_type ) offset_type = " (" + offset_type + ") "; |
340 |
|
341 |
var payment_or_void; |
342 |
if ( ao.credit.amount_voided && ao.credit.amount_voided != void_compare ) { |
343 |
payment_or_void = "<strike>" + ao.credit.amount_voided + "</strike>"; |
344 |
} else { |
345 |
payment_or_void = ao.credit.amount_paid; |
346 |
} |
347 |
|
348 |
sOut += |
349 |
"<tr>" + |
350 |
"<td>" + ao.credit_id + "</td>" + |
351 |
"<td>" + ao.created_on + "</td>" + |
352 |
"<td>" + payment_or_void + "</td>" + |
353 |
"<td>" + ao.amount + "</td>" + |
354 |
"<td>" + credit_type + offset_type + "</td>" + |
355 |
"<td>" + ao.credit.notes + "</td>" + |
356 |
"</tr>"; |
357 |
} |
358 |
|
359 |
sOut += |
360 |
"</tbody>"+ |
361 |
"</table>"; |
362 |
} |
363 |
|
364 |
sOut += |
365 |
"</div>"; |
366 |
|
367 |
return sOut; |
368 |
} |
369 |
|
370 |
function fnFormatCreditDetails( creditsTable, nTr ) { |
371 |
var oData = creditsTable.fnGetData( nTr ); |
372 |
|
373 |
var sOut = "<div class='innerDetails' style='display:none;'>"; |
374 |
|
375 |
sOut += "<button class='credit_print btn btn-small noprint' style='margin:5px;' onclick='accountPrint(\"credit\"," + oData.credit_id + ")'>" + |
376 |
"<i class='icon-print'></i> " + _("Print receipt") + |
377 |
"</button>"; |
378 |
|
379 |
if ( ! oData.amount_voided_original ) { |
380 |
sOut += "<a class='credit_void btn btn-small noprint' style='margin:5px;' onclick='accountVoid(\"credit\"," + oData.credit_id + ")'>" + |
381 |
"<i class='icon-remove-sign'></i> " + _("Void payment") + |
382 |
"</a>"; |
383 |
} |
384 |
|
385 |
var account_offsets = oData.account_offsets; |
386 |
|
387 |
if ( account_offsets.length ) { |
388 |
sOut += |
389 |
"<table cellpadding='5' cellspacing='0' border='0' style='margin:10px;'>" + |
390 |
"<thead>" + |
391 |
"<tr><th colspan='99'>" + _("Fees paid") + "</th></tr>" + |
392 |
"<tr>" + |
393 |
"<th>" + _("ID") + "</th>" + |
394 |
"<th>" + _("Description") + "</th>" + |
395 |
"<th>" + _("Type") + "</th>" + |
396 |
"<th>" + _("Amount") + "</th>" + |
397 |
"<th>" + _("Amount applied") + "</th>" + |
398 |
"<th>" + _("Remaining") + "</th>" + |
399 |
"<th>" + _("Created on") + "</th>" + |
400 |
"<th>" + _("Updated on") + "</th>" + |
401 |
"<th>" + _("Notes") + "</th>" + |
402 |
"</tr>" + |
403 |
"</thead>" + |
404 |
"<tbody>"; |
405 |
|
406 |
for ( var i = 0; i < account_offsets.length; i++ ) { |
407 |
ao = account_offsets[i]; |
408 |
debit_type = STRINGS["DebitTypes"][ao.debit.type] || ao.debit.type; |
409 |
offset_type = STRINGS["OffsetTypes"][ao.type] || ao.type; |
410 |
if ( offset_type ) offset_type = " (" + offset_type + ") "; |
411 |
|
412 |
sOut += |
413 |
"<tr>" + |
414 |
"<td>" + ao.debit.debit_id + "</td>" + |
415 |
"<td>" + ao.debit.description + "</td>" + |
416 |
"<td>" + debit_type + offset_type + "</td>" + |
417 |
"<td>" + ao.debit.amount_original + "</td>" + |
418 |
"<td>" + ao.amount + "</td>" + |
419 |
"<td>" + ao.debit.amount_outstanding + "</td>" + |
420 |
"<td>" + ao.debit.created_on + "</td>" + |
421 |
"<td>" + ao.debit.updated_on + "</td>" + |
422 |
"<td>" + ao.debit.notes + "</td>" + |
423 |
"</tr>"; |
424 |
} |
425 |
|
426 |
sOut += |
427 |
"</tbody>"+ |
428 |
"</table>"; |
429 |
} |
430 |
|
431 |
sOut += |
432 |
"</div>"; |
433 |
|
434 |
return sOut; |
435 |
} |
436 |
|
437 |
function accountPrint( type, id ) { |
438 |
window.open( "/cgi-bin/koha/members/account_print.pl?type=" + type + "&id=" + id ); |
439 |
} |
440 |
|
441 |
function accountVoid( type, id ) { |
442 |
if ( confirm(_("Are you sure you want to void this transaction?")) ) { |
443 |
window.location.href = "/cgi-bin/koha/members/account_void.pl?borrowernumber=" + [% borrowernumber %] + "&id=" + id; |
444 |
} |
445 |
} |
446 |
//]]> |
447 |
</script> |
448 |
</head> |
449 |
<body> |
450 |
[% INCLUDE 'header.inc' %] |
451 |
[% INCLUDE 'patron-search.inc' %] |
452 |
|
453 |
<div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> › <a href="/cgi-bin/koha/members/members-home.pl">Patrons</a> › Account for [% INCLUDE 'patron-title.inc' %]</div> |
454 |
|
455 |
<div id="doc3" class="yui-t2"> |
456 |
<div id="bd"> |
457 |
<div id="yui-main"> |
458 |
<div class="yui-b"> |
459 |
[% INCLUDE 'members-toolbar.inc' %] |
460 |
|
461 |
<div class="statictabs"> |
462 |
<ul> |
463 |
<li class="active"> |
464 |
<a href="/cgi-bin/koha/members/account.pl?borrowernumber=[% borrowernumber %]">Account</a> |
465 |
</li> |
466 |
|
467 |
<li> |
468 |
<a href="/cgi-bin/koha/members/account_payment.pl?borrowernumber=[% borrowernumber %]" >Pay fines</a> |
469 |
</li> |
470 |
|
471 |
<li> |
472 |
<a href="/cgi-bin/koha/members/account_debit.pl?borrowernumber=[% borrowernumber %]" >Create manual invoice</a> |
473 |
</li> |
474 |
|
475 |
<li> |
476 |
<a href="/cgi-bin/koha/members/account_credit.pl?borrowernumber=[% borrowernumber %]" >Create manual credit</a> |
477 |
</li> |
478 |
</ul> |
479 |
</div> |
480 |
|
481 |
<div class="tabs-container"> |
482 |
|
483 |
<p> |
484 |
<h3>Account balance: [% borrower.account_balance | $Currency %]</h3> |
485 |
</p> |
486 |
|
487 |
<div> |
488 |
<div id="account-debits"> |
489 |
<table cellpadding="0" cellspacing="0" border="0" class="display" id="debits-table"> |
490 |
<thead> |
491 |
<tr> |
492 |
<th colspan="99">Fees</th> |
493 |
</tr> |
494 |
<tr> |
495 |
<th></th> |
496 |
<th>ID</th> |
497 |
<th>Description</th> |
498 |
<th>Type</th> |
499 |
<th>Amount</th> |
500 |
<th>Outstanding</th> |
501 |
<th>Created on</th> |
502 |
<th>Updated on</th> |
503 |
</tr> |
504 |
</thead> |
505 |
<tbody></tbody> |
506 |
</table> |
507 |
</div> |
508 |
|
509 |
<div id="account-credits"> |
510 |
<table cellpadding="0" cellspacing="0" border="0" class="display" id="credits-table"> |
511 |
<thead> |
512 |
<tr> |
513 |
<th colspan="99">Payments</th> |
514 |
</tr> |
515 |
<tr> |
516 |
<th></th> |
517 |
<th>ID</th> |
518 |
<th>Notes</th> |
519 |
<th>Type</th> |
520 |
<th>Amount</th> |
521 |
<th>Remaining</th> |
522 |
<th>Created on</th> |
523 |
<th>Updated on</th> |
524 |
</tr> |
525 |
</thead> |
526 |
<tbody></tbody> |
527 |
</table> |
528 |
</div> |
529 |
</div> |
530 |
</div> |
531 |
</div> |
532 |
</div> |
533 |
|
534 |
<div class="yui-b"> |
535 |
[% INCLUDE 'circ-menu.inc' %] |
536 |
</div> |
537 |
</div> |
538 |
[% INCLUDE 'intranet-bottom.inc' %] |
539 |
|
540 |
[% BLOCK format_data %] |
541 |
[% FOREACH key IN data.result_source.columns %] |
542 |
[% IF key.match('^amount') %] |
543 |
"[% key %]_original": "[% data.$key %]", |
544 |
"[% key %]": "[% data.$key FILTER $Currency highlight => highlight %]", |
545 |
[% ELSIF key.match('_on$') %] |
546 |
"[% key %]_original": "[% data.$key %]", |
547 |
"[% key %]": "[% data.$key | $KohaDates %]", |
548 |
[% ELSE %] |
549 |
"[% key %]": "[% data.$key | replace('"', '\"') %]", |
550 |
[% END %] |
551 |
[% END %] |
552 |
[% END %] |