feat: add batch name input and enhance voucher management UI, and also you can now generate and print vouchers in group: batch name or Date.

This commit is contained in:
Focuslinkstech 2025-04-18 15:20:09 +01:00
parent e50d7f901d
commit 230a9ddecd
4 changed files with 233 additions and 242 deletions

View file

@ -280,7 +280,7 @@ switch ($action) {
$ui->assign('hlogo', $height); $ui->assign('hlogo', $height);
} }
$ui->assign('public_url', getUrl("voucher/invoice/$id/".md5($id. $db_pass))); $ui->assign('public_url', getUrl("voucher/invoice/$id/" . md5($id . $db_pass)));
$ui->assign('logo', $logo); $ui->assign('logo', $logo);
$ui->assign('_title', 'View Invoice'); $ui->assign('_title', 'View Invoice');
$ui->display('admin/plan/invoice.tpl'); $ui->display('admin/plan/invoice.tpl');
@ -501,7 +501,7 @@ switch ($action) {
$query->where_in('generated_by', $sales); $query->where_in('generated_by', $sales);
} }
} }
$d = Paginator::findMany($query, ["search" => $search], 10, $append_url); $d = $query->find_many();
// extract admin // extract admin
$admins = []; $admins = [];
foreach ($d as $k) { foreach ($d as $k) {
@ -525,6 +525,7 @@ switch ($action) {
} }
} }
$ui->assign('xheader', '<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.11.3/css/jquery.dataTables.min.css">');
$ui->assign('admins', $admins); $ui->assign('admins', $admins);
$ui->assign('d', $d); $ui->assign('d', $d);
$ui->assign('search', $search); $ui->assign('search', $search);
@ -572,120 +573,78 @@ switch ($action) {
$pagebreak = _post('pagebreak'); $pagebreak = _post('pagebreak');
$limit = _post('limit'); $limit = _post('limit');
$vpl = _post('vpl'); $vpl = _post('vpl');
$batch = _post('batch');
$group = _post('group');
$selected_datetime = _post('selected_datetime'); $selected_datetime = _post('selected_datetime');
if (empty($vpl)) {
if (empty($vpl))
$vpl = 3; $vpl = 3;
}
if ($pagebreak < 1) if ($pagebreak < 1)
$pagebreak = 12; $pagebreak = 12;
if ($limit < 1) if ($limit < 1)
$limit = $pagebreak * 2; $limit = $pagebreak * 2;
if (empty($from_id)) { if (empty($from_id))
$from_id = 0; $from_id = 0;
$v = ORM::for_table('tbl_plans')
->left_outer_join('tbl_voucher', array('tbl_plans.id', '=', 'tbl_voucher.id_plan'))
->where('tbl_voucher.status', '0');
$vc = ORM::for_table('tbl_plans')
->left_outer_join('tbl_voucher', array('tbl_plans.id', '=', 'tbl_voucher.id_plan'))
->where('tbl_voucher.status', '0');
if ($planid > 0) {
$v = $v->where('tbl_plans.id', $planid);
$vc = $vc->where('tbl_plans.id', $planid);
} }
if ($from_id > 0 && $planid > 0) { if ($from_id > 0) {
$v = ORM::for_table('tbl_plans') $v = $v->where_gt('tbl_voucher.id', $from_id);
->left_outer_join('tbl_voucher', array('tbl_plans.id', '=', 'tbl_voucher.id_plan')) $vc = $vc->where_gt('tbl_voucher.id', $from_id);
->where('tbl_voucher.status', '0')
->where('tbl_plans.id', $planid)
->where_gt('tbl_voucher.id', $from_id)
->limit($limit);
$vc = ORM::for_table('tbl_plans')
->left_outer_join('tbl_voucher', array('tbl_plans.id', '=', 'tbl_voucher.id_plan'))
->where('tbl_voucher.status', '0')
->where('tbl_plans.id', $planid)
->where_gt('tbl_voucher.id', $from_id);
} else if ($from_id == 0 && $planid > 0) {
$v = ORM::for_table('tbl_plans')
->left_outer_join('tbl_voucher', array('tbl_plans.id', '=', 'tbl_voucher.id_plan'))
->where('tbl_voucher.status', '0')
->where('tbl_plans.id', $planid)
->limit($limit);
$vc = ORM::for_table('tbl_plans')
->left_outer_join('tbl_voucher', array('tbl_plans.id', '=', 'tbl_voucher.id_plan'))
->where('tbl_voucher.status', '0')
->where('tbl_plans.id', $planid);
} else if ($from_id > 0 && $planid == 0) {
$v = ORM::for_table('tbl_plans')
->left_outer_join('tbl_voucher', array('tbl_plans.id', '=', 'tbl_voucher.id_plan'))
->where('tbl_voucher.status', '0')
->where_gt('tbl_voucher.id', $from_id)
->limit($limit);
$vc = ORM::for_table('tbl_plans')
->left_outer_join('tbl_voucher', array('tbl_plans.id', '=', 'tbl_voucher.id_plan'))
->where('tbl_voucher.status', '0')
->where_gt('tbl_voucher.id', $from_id);
} else if ($from_id > 0 && $planid == 0 && $selected_datetime != '') {
$v = ORM::for_table('tbl_plans')
->left_outer_join('tbl_voucher', array('tbl_plans.id', '=', 'tbl_voucher.id_plan'))
->where('tbl_voucher.status', '0')
->where_raw("DATE(created_at) = ?", [$selected_datetime])
->where_gt('tbl_voucher.id', $from_id)
->limit($limit);
$vc = ORM::for_table('tbl_plans')
->left_outer_join('tbl_voucher', array('tbl_plans.id', '=', 'tbl_voucher.id_plan'))
->where('tbl_voucher.status', '0')
->where_gt('tbl_voucher.id', $from_id);
} else {
$v = ORM::for_table('tbl_plans')
->left_outer_join('tbl_voucher', array('tbl_plans.id', '=', 'tbl_voucher.id_plan'))
->where('tbl_voucher.status', '0')
->limit($limit);
$vc = ORM::for_table('tbl_plans')
->left_outer_join('tbl_voucher', array('tbl_plans.id', '=', 'tbl_voucher.id_plan'))
->where('tbl_voucher.status', '0');
} }
if (!empty($selected_datetime)) {
$v = ORM::for_table('tbl_plans') // Group filters (date or batch)
->left_outer_join('tbl_voucher', array('tbl_plans.id', '=', 'tbl_voucher.id_plan')) if (!empty($group)) {
->where('tbl_voucher.status', '0') if ($group == 'datetime' && !empty($selected_datetime)) {
->where('tbl_voucher.created_at', $selected_datetime) $dateFilter = date('Y-m-d', strtotime($selected_datetime));
->limit($limit); $v = $v->where_raw("DATE(tbl_voucher.created_at) = ?", [$dateFilter]);
$vc = ORM::for_table('tbl_plans') $vc = $vc->where_raw("DATE(tbl_voucher.created_at) = ?", [$dateFilter]);
->left_outer_join('tbl_voucher', array('tbl_plans.id', '=', 'tbl_voucher.id_plan')) } elseif ($group == 'batch' && !empty($batch)) {
->where('tbl_voucher.status', '0'); switch ($batch) {
case 'all':
$v = $v->where_not_equal('tbl_voucher.batch_name', '');
$vc = $vc->where_not_equal('tbl_voucher.batch_name', '');
break;
default:
$v = $v->where('tbl_voucher.batch_name', $batch);
$vc = $vc->where('tbl_voucher.batch_name', $batch);
break;
} }
}
}
// Limit only to main query
$v = $v->limit($limit);
// Admin vs non-admin check
if (in_array($admin['user_type'], ['SuperAdmin', 'Admin'])) { if (in_array($admin['user_type'], ['SuperAdmin', 'Admin'])) {
$v = $v->find_many(); $v = $v->find_many();
$vc = $vc->count(); $vc = $vc->count();
} else { } else {
$sales = []; $sales = [$admin['id']];
$sls = ORM::for_table('tbl_users')->select('id')->where('root', $admin['id'])->findArray(); $sls = ORM::for_table('tbl_users')->select('id')->where('root', $admin['id'])->findArray();
foreach ($sls as $s) { foreach ($sls as $s) {
$sales[] = $s['id']; $sales[] = $s['id'];
} }
$sales[] = $admin['id'];
$v = $v->where_in('generated_by', $sales)->find_many(); $v = $v->where_in('generated_by', $sales)->find_many();
$vc = $vc->where_in('generated_by', $sales)->count(); $vc = $vc->where_in('generated_by', $sales)->count();
} }
// Voucher template and data
$template = file_get_contents("pages/Voucher.html"); $template = file_get_contents("pages/Voucher.html");
$template = str_replace('[[company_name]]', $config['CompanyName'], $template); $template = str_replace('[[company_name]]', $config['CompanyName'], $template);
$ui->assign('_title', Lang::T('Hotspot Voucher'));
$ui->assign('from_id', $from_id);
$ui->assign('vpl', $vpl);
$ui->assign('pagebreak', $pagebreak);
$plans = ORM::for_table('tbl_plans')->find_many();
$ui->assign('plans', $plans);
$ui->assign('limit', $limit);
$ui->assign('planid', $planid);
$createdate = ORM::for_table('tbl_voucher')
->select_expr(
"CASE WHEN DATE(created_at) = CURDATE() THEN 'Today' ELSE DATE(created_at) END",
'created_datetime'
)
->where_not_equal('created_at', '0')
->select_expr('COUNT(*)', 'voucher_count')
->group_by('created_datetime')
->order_by_desc('created_datetime')
->find_array();
$ui->assign('createdate', $createdate);
$voucher = []; $voucher = [];
$n = 1; $n = 1;
foreach ($v as $vs) { foreach ($v as $vs) {
@ -699,12 +658,43 @@ switch ($action) {
$n++; $n++;
} }
// Additional data for the view
$plans = ORM::for_table('tbl_plans')->find_many();
$createdate = ORM::for_table('tbl_voucher')
->select_expr(
"CASE WHEN DATE(created_at) = CURDATE() THEN 'Today' ELSE DATE(created_at) END",
'created_datetime'
)
->where_not_equal('created_at', '0')
->select_expr('COUNT(*)', 'voucher_count')
->group_by('created_datetime')
->order_by_desc('created_datetime')
->find_array();
$batches = ORM::for_table('tbl_voucher')
->select('batch_name')
->distinct()
->where_not_equal('batch_name', '')
->order_by_desc('created_at')
->find_many();
$ui->assign('_title', Lang::T('Hotspot Voucher'));
$ui->assign('from_id', $from_id);
$ui->assign('vpl', $vpl);
$ui->assign('pagebreak', $pagebreak);
$ui->assign('plans', $plans);
$ui->assign('limit', $limit);
$ui->assign('planid', $planid);
$ui->assign('createdate', $createdate);
$ui->assign('voucher', $voucher); $ui->assign('voucher', $voucher);
$ui->assign('vc', $vc); $ui->assign('vc', $vc);
$ui->assign('selected_datetime', $selected_datetime); $ui->assign('selected_datetime', $selected_datetime);
$ui->assign('batches', $batches);
//for counting pagebreak $ui->assign('selected_batch', $batch);
$ui->assign('group', $group);
$ui->assign('jml', 0); $ui->assign('jml', 0);
run_hook('view_print_voucher'); #HOOK run_hook('view_print_voucher'); #HOOK
$ui->display('admin/print/voucher.tpl'); $ui->display('admin/print/voucher.tpl');
break; break;
@ -725,6 +715,7 @@ switch ($action) {
$lengthcode = _post('lengthcode'); $lengthcode = _post('lengthcode');
$printNow = _post('print_now', 'no'); $printNow = _post('print_now', 'no');
$voucherPerPage = _post('voucher_per_page', '36'); $voucherPerPage = _post('voucher_per_page', '36');
$batch_name = _post('batch_name', '');
$msg = ''; $msg = '';
if (empty($type) || empty($plan) || empty($server) || empty($numbervoucher) || empty($lengthcode)) { if (empty($type) || empty($plan) || empty($server) || empty($numbervoucher) || empty($lengthcode)) {
@ -734,7 +725,7 @@ switch ($action) {
$msg .= 'The Number of Vouchers must be a number' . '<br>'; $msg .= 'The Number of Vouchers must be a number' . '<br>';
} }
if (!Validator::UnsignedNumber($lengthcode)) { if (!Validator::UnsignedNumber($lengthcode)) {
$msg .= 'The Length Code must be a number' . '<br>'; $msg .= "The Length Code must be a number<br>";
} }
if ($msg == '') { if ($msg == '') {
@ -758,7 +749,7 @@ switch ($action) {
if ($voucher_format == 'numbers') { if ($voucher_format == 'numbers') {
if ($lengthcode < 6) { if ($lengthcode < 6) {
$msg .= 'The Length Code must be more than 6 for numbers' . '<br>'; $msg .= "The Length Code must be more than 6 for numbers<br>";
} }
$vouchers = generateUniqueNumericVouchers($numbervoucher, $lengthcode); $vouchers = generateUniqueNumericVouchers($numbervoucher, $lengthcode);
} else { } else {
@ -782,6 +773,7 @@ switch ($action) {
$d->user = '0'; $d->user = '0';
$d->status = '0'; $d->status = '0';
$d->generated_by = $admin['id']; $d->generated_by = $admin['id'];
$d->batch_name = $batch_name;
$d->save(); $d->save();
$newVoucherIds[] = $d->id(); $newVoucherIds[] = $d->id();
} }

View file

@ -66,10 +66,9 @@
<td>From ID &gt; <input type="text" name="from_id" style="width:40px" value="{$from_id}"> limit <td>From ID &gt; <input type="text" name="from_id" style="width:40px" value="{$from_id}"> limit
<input type="text" name="limit" style="width:40px" value="{$limit}"> <input type="text" name="limit" style="width:40px" value="{$limit}">
</td> </td>
<td>Voucher PerLine <input type="text" style="width:40px" name="vpl" value="{$vpl}"> vouchers <td>Voucher PerLine <input type="text" style="width:40px" name="vpl" value="{$vpl}">
</td> </td>
<td>PageBreak after <input type="text" style="width:40px" name="pagebreak" value="{$pagebreak}"> <td>PageBreak after <input type="text" style="width:40px" name="pagebreak" value="{$pagebreak}">
vouchers
</td> </td>
<td>Plans <select id="plan_id" name="planid" style="width:50px"> <td>Plans <select id="plan_id" name="planid" style="width:50px">
<option value="0">--all--</option> <option value="0">--all--</option>
@ -78,21 +77,42 @@
</option> </option>
{/foreach} {/foreach}
</select></td> </select></td>
<td>Date <select id="selected_datetime" name="selected_datetime" style="width:50px"> <td>Group
<select id="group" name="group" style="width:50px" onchange="toggleOptions()">
<option value="datetime" {if $group eq 'datetime' }selected{/if}> Date
</option>
<option value="batch" {if $group eq 'batch' }selected{/if}> Batch
</option>
</select>
</td>
<td style="display: none;" id="td-batch">Batch
<select id="batch" name="batch" style="width:50px;">
<option value="all">--all--</option>
{foreach $batches as $batch}
<option value="{$batch.batch_name}" {if $batch.batch_name eq $selected_batch}selected{/if}>
{$batch.batch_name}
</option>
{/foreach}
</select>
</td>
<td style="display: none;" id="td-datetime">Date
<select id="selected_datetime" name="selected_datetime" style="width:50px;">
<option value="">--all--</option> <option value="">--all--</option>
{foreach $createdate as $date} {foreach $createdate as $date}
<option value="{$date.created_datetime}" <option value="{$date.created_datetime}" {if $date.created_datetime eq
{if $date.created_datetime eq $selected_datetime}selected{/if}> $selected_datetime}selected{/if}>
{$date.created_datetime} ({$date.voucher_count}) {$date.created_datetime} ({$date.voucher_count})
</option> </option>
{/foreach} {/foreach}
</select></td> </select>
</td>
<td><button type="submit">submit</button></td> <td><button type="submit">submit</button></td>
</tr> </tr>
</table> </table>
<hr> <hr>
<center><button type="button" onclick="window.print()" <center><button type="button" onclick="window.print()"
class="btn btn-default btn-sm no-print">{Lang::T('Click Here to Print')}</button><br> class="btn btn-default btn-sm no-print">{Lang::T('Click
Here to Print')}</button><br>
{Lang::T('Print side by side, it will easy to cut')}<br> show {$v|@count} vouchers from {$vc} {Lang::T('Print side by side, it will easy to cut')}<br> show {$v|@count} vouchers from {$vc}
vouchers<br> from ID {$v[0]['id']} limit {$limit} vouchers vouchers<br> from ID {$v[0]['id']} limit {$limit} vouchers
</center> </center>
@ -120,15 +140,31 @@
<script src="{$app_url}/ui/ui/scripts/jquery.min.js"></script> <script src="{$app_url}/ui/ui/scripts/jquery.min.js"></script>
{if isset($xfooter)} {$xfooter} {/if} {if isset($xfooter)} {$xfooter} {/if}
<script> <script>
jQuery(document).ready(function() { jQuery(document).ready(function () {
// initiate layout and plugins // initiate layout and plugins
$("#actprint").click(function() { $("#actprint").click(function () {
window.print(); window.print();
return false; return false;
}); });
}); });
</script> </script>
<script>
function toggleOptions() {
const group = document.getElementById('group').value;
const tdBatch = document.getElementById('td-batch');
const tdDatetime = document.getElementById('td-datetime');
if (group === 'batch') {
tdBatch.style.display = 'block';
tdDatetime.style.display = 'none';
} else if (group === 'datetime') {
tdDatetime.style.display = 'block';
tdBatch.style.display = 'none';
}
}
toggleOptions();
</script>
</body> </body>
</html> </html>

View file

@ -31,6 +31,12 @@
</select> </select>
</div> </div>
</div> </div>
<div class="form-group">
<label class="col-md-2 control-label">{Lang::T('Batch Name')}</label>
<div class="col-md-6">
<input type="text" class="form-control" name="batch_name" value="" placeholder="{Lang::T('Batch 1')}">
</div>
</div>
<div class="form-group"> <div class="form-group">
<label class="col-md-2 control-label">{Lang::T('Number of Vouchers')}</label> <label class="col-md-2 control-label">{Lang::T('Number of Vouchers')}</label>
<div class="col-md-6"> <div class="col-md-6">

View file

@ -26,66 +26,7 @@
{/if} {/if}
&nbsp; &nbsp;
</div> </div>
<div class="panel-body">
<form id="site-search" method="post" action="{Text::url('')}plan/voucher/">
<div class="row" style="padding: 5px">
<div class="col-lg-2">
<div class="input-group">
<div class="input-group-addon">
<span class="fa fa-search"></span>
</div>
<input type="text" name="search" class="form-control" placeholder="{Lang::T('Code Voucher')}"
value="{$search}">
</div>
</div>
<div class="col-lg-2">
<select class="form-control" id="router" name="router">
<option value="">{Lang::T('Location')}</option>
{foreach $routers as $r}
<option value="{$r}" {if $router eq $r }selected{/if}>{$r}
</option>
{/foreach}
</select>
</div>
<div class="col-lg-2">
<select class="form-control" id="plan" name="plan">
<option value="">{Lang::T('Plan Name')}</option>
{foreach $plans as $p}
<option value="{$p['id']}" {if $plan eq $p['id'] }selected{/if}>{$p['name_plan']}</option>
{/foreach}
</select>
</div>
<div class="col-lg-2">
<select class="form-control" id="status" name="status">
<option value="-">{Lang::T('Status')}</option>
<option value="1" {if $status eq 1 }selected{/if}>Used</option>
<option value="0" {if $status eq 0 }selected{/if}>Not Use</option>
</select>
</div>
<div class="col-lg-2">
<select class="form-control" id="customer" name="customer">
<option value="">{Lang::T('Customer')}</option>
{foreach $customers as $c}
<option value="{$c['user']}" {if $customer eq $c['user'] }selected{/if}>{$c['user']}</option>
{/foreach}
</select>
</div>
<div class="col-lg-2">
<div class="btn-group btn-group-justified" role="group">
<div class="btn-group" role="group">
<button class="btn btn-success btn-block" type="submit"><span
class="fa fa-search"></span></button>
</div>
<div class="btn-group" role="group">
<a class="btn btn-warning btn-block" title="Clear Search Query"
href="{Text::url('')}plan/voucher/"><span
class="glyphicon glyphicon-remove-circle"></span></a>
</div>
</div>
</div>
</div>
</form>
</div>
<div class="table-responsive"> <div class="table-responsive">
<div style="margin-left: 5px; margin-right: 5px;">&nbsp; <div style="margin-left: 5px; margin-right: 5px;">&nbsp;
<table id="datatable" class="table table-bordered table-striped table-condensed"> <table id="datatable" class="table table-bordered table-striped table-condensed">
@ -93,6 +34,7 @@
<tr> <tr>
<th><input type="checkbox" id="select-all"></th> <th><input type="checkbox" id="select-all"></th>
<th>ID</th> <th>ID</th>
<th>{Lang::T('Batch Name ')}</th>
<th>{Lang::T('Type')}</th> <th>{Lang::T('Type')}</th>
<th>{Lang::T('Routers')}</th> <th>{Lang::T('Routers')}</th>
<th>{Lang::T('Plan Name')}</th> <th>{Lang::T('Plan Name')}</th>
@ -110,6 +52,12 @@
<tr {if $ds['status'] eq '1' }class="danger" {/if}> <tr {if $ds['status'] eq '1' }class="danger" {/if}>
<td><input type="checkbox" name="voucher_ids[]" value="{$ds['id']}"></td> <td><input type="checkbox" name="voucher_ids[]" value="{$ds['id']}"></td>
<td>{$ds['id']}</td> <td>{$ds['id']}</td>
<td>{if empty($ds['batch_name'])}
{Lang::T('None')}
{else}
{$ds['batch_name']}
{/if}
</td>
<td>{$ds['type']}</td> <td>{$ds['type']}</td>
<td>{$ds['routers']}</td> <td>{$ds['routers']}</td>
<td>{$ds['name_plan']}</td> <td>{$ds['name_plan']}</td>
@ -146,10 +94,8 @@
{/foreach} {/foreach}
</tbody> </tbody>
</table> </table>
</div> <br>
</div> <div class="row" style="padding: 5px">
</div>
<div class="row" style="padding: 5px">
<div class="col-lg-3 col-lg-offset-9"> <div class="col-lg-3 col-lg-offset-9">
<div class="btn-group btn-group-justified" role="group"> <div class="btn-group btn-group-justified" role="group">
<div class="btn-group" role="group"> <div class="btn-group" role="group">
@ -160,9 +106,15 @@
</div> </div>
</div> </div>
</div> </div>
</div>
<br>
</div>
</div>
</div> </div>
{include file="pagination.tpl"}
<script src="https://code.jquery.com/jquery-3.7.0.min.js"></script>
<script type="text/javascript" charset="utf8"
src="https://cdn.datatables.net/1.13.6/js/jquery.dataTables.min.js"></script>
<script> <script>
function deleteVouchers(voucherIds) { function deleteVouchers(voucherIds) {
if (voucherIds.length > 0) { if (voucherIds.length > 0) {
@ -178,7 +130,7 @@
var xhr = new XMLHttpRequest(); var xhr = new XMLHttpRequest();
xhr.open('POST', '{Text::url('')}plan/voucher-delete-many', true); xhr.open('POST', '{Text::url('')}plan/voucher-delete-many', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onload = function() { xhr.onload = function () {
if (xhr.status === 200) { if (xhr.status === 200) {
var response = JSON.parse(xhr.responseText); var response = JSON.parse(xhr.responseText);
@ -222,9 +174,9 @@
} }
// Example usage for selected vouchers // Example usage for selected vouchers
document.getElementById('deleteSelectedVouchers').addEventListener('click', function() { document.getElementById('deleteSelectedVouchers').addEventListener('click', function () {
var selectedVouchers = []; var selectedVouchers = [];
document.querySelectorAll('input[name="voucher_ids[]"]:checked').forEach(function(checkbox) { document.querySelectorAll('input[name="voucher_ids[]"]:checked').forEach(function (checkbox) {
selectedVouchers.push(checkbox.value); selectedVouchers.push(checkbox.value);
}); });
@ -240,8 +192,8 @@
} }
}); });
document.querySelectorAll('.delete-voucher').forEach(function(button) { document.querySelectorAll('.delete-voucher').forEach(function (button) {
button.addEventListener('click', function() { button.addEventListener('click', function () {
var voucherId = this.getAttribute('data-id'); var voucherId = this.getAttribute('data-id');
deleteVouchers([voucherId]); deleteVouchers([voucherId]);
}); });
@ -249,11 +201,16 @@
// Select or deselect all checkboxes // Select or deselect all checkboxes
document.getElementById('select-all').addEventListener('change', function() { document.getElementById('select-all').addEventListener('change', function () {
var checkboxes = document.querySelectorAll('input[name="voucher_ids[]"]'); var checkboxes = document.querySelectorAll('input[name="voucher_ids[]"]');
for (var checkbox of checkboxes) { for (var checkbox of checkboxes) {
checkbox.checked = this.checked; checkbox.checked = this.checked;
} }
}); });
</script> </script>
<script>
new DataTable('#datatable');
</script>
{include file="sections/footer.tpl"} {include file="sections/footer.tpl"}