Skip to content

Commit

Permalink
Add warranty uploader
Browse files Browse the repository at this point in the history
Fixes #2, #3, #4
  • Loading branch information
bochoven committed May 19, 2020
1 parent 2a49c96 commit 2951b7d
Show file tree
Hide file tree
Showing 4 changed files with 173 additions and 1 deletion.
4 changes: 3 additions & 1 deletion provides.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,6 @@ listings:
widgets:
hardware_age: { view: hardware_age_widget }
hardware_warranty: { view: hardware_warranty_widget }
warranty: { view: warranty_widget }
warranty: { view: warranty_widget }
admin_pages:
admin: { i18n: warranty.warranty }
61 changes: 61 additions & 0 deletions views/admin_form.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<?php $this->view('partials/head')?>

<div class="container">
<div class="row">
<div class="col-lg-6">
<h3>Update warranty status</h3>
<p>Update warranty status of the clients</p>
<div class="form-group">
<button id="update-status" class="btn btn-default">Update</button>
</div>

<div class="alert alert-success hidden" role="alert" id="update-result"></div>
</div>

<div class="col-lg-6">
<h3>Update warranty information</h3>
<?php if($result):?>

<div class="alert alert-success alert-dismissible" role="alert">Updated entries: <?=$result['updated']?></div>
<div class="alert alert-info alert-dismissible" role="alert">CSV entries: <?=$result['csv_entries']?></div>
<div class="alert alert-warning alert-dismissible" role="alert">Invalid entries: <?=$result['invalid']?></div>

<?php endif?>

<p class="help-block">CSV file format (you also need the header):
<pre>
"serial_number","purchase_date","end_date"
"3X6RHPJ3P7QM","2016-06-09","2020-06-09"
</pre>
</p>

<form action="" method="post" enctype="multipart/form-data">
<input type="hidden" name="_token" value="<?php echo getCSRF();?>">
<div class="form-group">
<label for="csv">Select csv file</label>
<input type="file" name="csv" id="csv" accept=".csv">
</div>
<button type="submit" class="btn btn-default">Upload</button>
</form>
</div>
</div>
</div>

<script>
$('#update-status').click(function (e) {
$(this).attr('disabled', true);
var $btn = $(this);

function done () {
$btn.attr('disabled', false);
$('#update-result').removeClass('hidden');
}

$.getJSON(appUrl + '/module/warranty/update_status', function (data) {
done();
$('#update-result').text('Updated: ' + data['updated'] + ' clients');
});
});
</script>

<?php $this->view('partials/foot'); ?>
39 changes: 39 additions & 0 deletions warranty_controller.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,24 @@ public function __construct()
$this->module_path = dirname(__FILE__);
}

public function admin()
{
require $this->module_path . '/warranty_upload.php';
$uploader = new Warranty_upload;
view('admin_form', ['result' => $uploader->handleUpload()], $this->module_path . '/views/');
}

public function update_status()
{
jsonView(
[
'updated' => Warranty_model::where('end_date', '<', date('Y-m-d'))
->where('warranty.status', '!=', 'Expired')
->update(['warranty.status' => 'Expired'])
]
);
}

public function report($serial_number = '')
{
jsonView(
Expand Down Expand Up @@ -59,6 +77,27 @@ public function get_stats($alert = false)
);
}


/**
* Get Warranty statistics
*
* @param bool $alert Filter on 30 days
**/
public function get_machines_expiring_next_month()
{
$between = [date('Y-m-d'), date('Y-m-d', strtotime('+30days'))];

jsonView(
Warranty_model::selectRaw('machine.computer_name, warranty.status')
->whereBetween('end_date', $between)
->join('machine', 'machine.serial_number', '=', 'warranty.serial_number')
->filter()
->orderBy('end_date', 'desc')
->get()
->toArray()
);
}

/**
* Generate age data for age widget
*
Expand Down
70 changes: 70 additions & 0 deletions warranty_upload.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
<?php

class Warranty_upload
{
public function __construct()
{
# code...
}

public function handleUpload()
{
if( ! isset( $_FILES['csv']['tmp_name'])){
return;
}

$csv = $this->_convertFileToCsv($_FILES['csv']['tmp_name']);

$result = [
'csv_entries' => count($csv),
'updated' => 0,
'invalid' => 0,
];

foreach ($csv as $entry) {
if( ! $this->_validateEntry($entry)){
$result['invalid'] += 1;
}
else{
$result['updated'] += $this->_updateEntry($entry);
}
}

return $result;
}

private function _validateEntry($entry)
{
if( ! isset($entry['serial_number'])){
return false;
}
if( ! isset($entry['purchase_date'])){
return false;
}
if( ! isset($entry['end_date'])){
return false;
}
return true;
}

private function _updateEntry($entry)
{
return Warranty_model::where('warranty.serial_number', $entry['serial_number'])
->where('purchase_date', '!=', $entry['purchase_date'])
->where('end_date', '!=', $entry['end_date'])
->update([
'purchase_date' => $entry['purchase_date'],
'end_date' => $entry['end_date'],
]);
}

private function _convertFileToCsv($file)
{
$csv = array_map('str_getcsv', file($file));
array_walk($csv, function(&$a) use ($csv) {
$a = array_combine($csv[0], $a);
});
array_shift($csv); # remove column header
return $csv;
}
}

0 comments on commit 2951b7d

Please sign in to comment.