221 lines
9.1 KiB
PHP
221 lines
9.1 KiB
PHP
<?php
|
|
|
|
$monthTrans = ['jan' => 'Jan', 'feb' => 'Feb', 'mrt' => 'Mar', 'apr' => 'Apr', 'mei' => 'May', 'jun' => 'Jun', 'jul' => 'Jul', 'aug' => 'Aug', 'sep' => 'Sep',
|
|
'okt' => 'Oct', 'nov' => 'Nov', 'dec' => 'Dec'];
|
|
|
|
$worklist_url = 'https://old.wina.be/worklists';
|
|
$worklistsData = file_get_contents($worklist_url);
|
|
preg_match_all('/href="\/worklists\/(\d*)">(.*?)<\/a><\/td><td>.*?<\/td><td>(.*?)<\/td>/s', $worklistsData, $lists);
|
|
|
|
$worklists = [];
|
|
|
|
foreach($lists[1] as $key => $list) {
|
|
|
|
$dateArr = explode(' ', substr($lists[3][$key], 3, 11) . substr($lists[3][$key], 16));
|
|
if (count($dateArr) < 3 || $dateArr[0] === "") continue;
|
|
$dateArr[1] = $monthTrans[$dateArr[1]];
|
|
$date = \DateTimeImmutable::createFromFormat('d M Y H:i', implode(' ', $dateArr));
|
|
|
|
$worklists[$list] = [$lists[2][$key], $date];
|
|
}
|
|
|
|
|
|
for($i = 0; $i < 2; $i++) {
|
|
$url = 'https://old.wina.be/worklists/past?page=' . $i;
|
|
$worklistsData = file_get_contents($url);
|
|
preg_match_all('/href="\/worklists\/(\d*)">(.*?)<\/a><\/td><td>.*?<\/td><td>(.*?)<\/td>/s', $worklistsData, $lists);
|
|
|
|
foreach($lists[1] as $key => $list) {
|
|
$dateArr = explode(' ', substr($lists[3][$key], 3, 11) . substr($lists[3][$key], 16));
|
|
$dateArr[1] = $monthTrans[$dateArr[1]];
|
|
$date = \DateTimeImmutable::createFromFormat('d M Y H:i', implode(' ', $dateArr));
|
|
$worklists[$list] = [$lists[2][$key], $date];
|
|
}
|
|
}
|
|
|
|
uasort($worklists, function($a, $b) {
|
|
if ($a[1] == $b[1]) return;
|
|
return $a[1] > $b[1] ? -1 : 1;
|
|
});
|
|
|
|
$nameCount = [];
|
|
$nameHours = [];
|
|
$totalShifted = 0;
|
|
$total = 0;
|
|
$checkedLists = [];
|
|
|
|
if (isset($_GET['date_period'])) {
|
|
$checkedLists = [];
|
|
$start = \DateTime::createFromFormat('d/m/Y', $_GET['date_period']['startDate']);
|
|
$end = \DateTime::createFromFormat('d/m/Y', $_GET['date_period']['endDate']);
|
|
|
|
foreach($worklists as $key => $list) {
|
|
if ($list[1] >= $start && $list[1] <= $end) $checkedLists[] = $key;
|
|
}
|
|
}
|
|
|
|
if (isset($_GET['worklist']) || count($checkedLists) > 0) {
|
|
|
|
if (count($checkedLists) === 0)
|
|
$checkedLists = $_GET['worklist'];
|
|
|
|
foreach ($checkedLists as $site) {
|
|
$site = 'https://old.wina.be/worklists/' . $site;
|
|
$data = file_get_contents($site);
|
|
|
|
$tempCount = [];
|
|
|
|
preg_match_all('/<div id="(data_shift.*?<table.*?>.*?<\/table>)/s', $data, $shiften);
|
|
$shiften = $shiften[1];
|
|
|
|
foreach ($shiften as $shift) {
|
|
preg_match_all('/data_shift.*?Start<\/td>.*?>.*?(\d.*?)<\/td>/s', $shift, $start);
|
|
preg_match_all('/data_shift.*?Einde<\/td>.*?>.*?(\d.*?)<\/td>/s', $shift, $einde);
|
|
$start = explode(' ', $start[1][0]);
|
|
$start[1] = $monthTrans[$start[1]];
|
|
$start = DateTime::createFromFormat('j M Y - G:i', implode(' ', $start));
|
|
$einde = explode(' ', $einde[1][0]);
|
|
$einde[1] = $monthTrans[$einde[1]];
|
|
$einde = DateTime::createFromFormat('j M Y - G:i', implode(' ', $einde));
|
|
|
|
$diff = ($einde->getTimestamp() - $start->getTimestamp()) / 3600;
|
|
|
|
preg_match_all('/data_shift.*?Invulling.*?<td.*?>(.*?)<\/td>/s', $shift, $blockNames);
|
|
if (count($blockNames[1]) !== 0) {
|
|
preg_match_all('/<span.*?>(.*?)<\/span>/s', $blockNames[1][0], $names);
|
|
|
|
$tempCount = array_merge($tempCount, $names[1]);
|
|
foreach ($names[1] as $name) {
|
|
if (!array_key_exists($name, $nameHours)) {
|
|
$nameHours[$name] = $diff;
|
|
} else {
|
|
$nameHours[$name] += $diff;
|
|
}
|
|
$totalShifted += $diff;
|
|
}
|
|
}
|
|
}
|
|
|
|
$tempCount = array_unique($tempCount);
|
|
|
|
foreach ($tempCount as $name) {
|
|
if (!array_key_exists($name, $nameCount)) {
|
|
$nameCount[$name] = 1;
|
|
} else {
|
|
$nameCount[$name] += 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$avg = 0;
|
|
if ($totalShifted !== 0 & count($nameHours) !== 0)
|
|
$avg = $totalShifted / count($nameHours);
|
|
|
|
?>
|
|
|
|
<!doctype html>
|
|
<html lang="nl">
|
|
<head>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
|
<title>Wina shift counter</title>
|
|
<meta name="author" content="Arthur Bols">
|
|
|
|
<!-- Bootstrap core CSS -->
|
|
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
|
|
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/v/bs4/jszip-2.5.0/dt-1.10.18/b-1.5.6/b-html5-1.5.6/datatables.min.css"/>
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-select@1.13.7/dist/css/bootstrap-select.min.css">
|
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.9.0/css/bootstrap-datepicker3.min.css">
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<main role="main" class="container mt-2">
|
|
|
|
<div class="text-center">
|
|
<h1>Wina shift counter</h1>
|
|
<form class="mb-2" method="get">
|
|
<select name="worklist[]" class="selectpicker" data-style="btn-primary" data-live-search="true" multiple>
|
|
<?php
|
|
foreach($worklists as $key => $list) {
|
|
echo "<option " . (in_array($key, $checkedLists) ? "selected " : '') . "value='$key'>" . $list[0] . ' ' . $list[1]->format('d/m/Y') . "</option>";
|
|
}
|
|
?>
|
|
</select>
|
|
<p class="my-3">or enter a period:</p>
|
|
<div class="input-group input-daterange col-md-6 mx-auto" data-date-format="dd/mm/yyyy" data-provide="datepicker">
|
|
<input type="text" id="date_period_startDate" name="date_period[startDate]" required="required" class="datepicker form-control" autocomplete="off">
|
|
<div class="input-group-prepend input-group-append">
|
|
<span class="input-group-text">to</span>
|
|
</div>
|
|
<input type="text" id="date_period_endDate" name="date_period[endDate]" required="required" class="datepicker form-control" autocomplete="off">
|
|
<button type="submit" id="date_period_save" name="date_period[save]" class="ml-2 d-inline btn-primary btn">select date</button>
|
|
|
|
</div>
|
|
</form>
|
|
|
|
|
|
<?php
|
|
if (count($checkedLists) > 0) {
|
|
echo '<p>' . floor($totalShifted) . ' uur ' . ($totalShifted - floor($totalShifted) > 0 ? ' en ' . round(($totalShifted - floor($totalShifted)) * 60) . ' minuten' : '') . ' geshift!<br>
|
|
Gemiddeld: ' . floor($avg) . ' uur en ' . round(($avg - floor($avg)) * 60) . ' minuten<p>';
|
|
|
|
}
|
|
?>
|
|
</div>
|
|
<div class="table-responsive">
|
|
<div id="controlPanel" class="mb-1"></div>
|
|
<table id="table" class="table">
|
|
<thead>
|
|
<tr>
|
|
<th scope="col">Naam</th>
|
|
<th scope="col">Uren</th>
|
|
<th scope="col">Activiteiten</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php
|
|
foreach ($nameHours as $name => $val) {
|
|
echo "<tr><td data-order='$name'>$name</td><td data-order='$val'>" . floor($val) . 'h ' . ($val - floor($val)) * 60 . 'min' . "</td><td>" . $nameCount[$name] . "</td></tr>";
|
|
}
|
|
?>
|
|
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
</main><!-- /.container -->
|
|
|
|
<footer class="mt-5">
|
|
<div class="container">
|
|
<span class="text-muted">© 2018 - 2019 Arthur Bols <a href="https://git.principis.be/Principis/shiftcounter">source</span>
|
|
</div>
|
|
</footer>
|
|
|
|
<script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
|
|
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
|
|
<script type="text/javascript" src="https://cdn.datatables.net/v/bs4/jszip-2.5.0/dt-1.10.18/b-1.5.6/b-html5-1.5.6/datatables.min.js"></script>
|
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap-select@1.13.7/dist/js/bootstrap-select.min.js"></script>
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.9.0/js/bootstrap-datepicker.min.js"></script>
|
|
|
|
<script type="text/javascript">
|
|
$(document).ready(function() {
|
|
let table = $('#table').DataTable({
|
|
buttons: [
|
|
'copy', 'csv', 'excel'
|
|
]
|
|
});
|
|
table.buttons().container().appendTo('#controlPanel');
|
|
$('.selectpicker').selectpicker();
|
|
});
|
|
|
|
$('.selectpicker').on('hidden.bs.select', function() {
|
|
$('form').submit();
|
|
});
|
|
|
|
$('.input-daterange').datepicker();
|
|
</script>
|
|
</body>
|
|
</html>
|