Several changes:

* Added a user notes field to the checkout page
 * Added user suggestions to the checkout page
 * Refactored suggestion generation
 * Proper pluralization on reminder emails
 * Improved the feedback message when returning a product
This commit is contained in:
Erik Thuning 2019-04-11 17:03:59 +02:00
parent f26e281b9c
commit 2aee184390
6 changed files with 84 additions and 58 deletions

@ -37,12 +37,12 @@ class Cron {
}
private function send_reminder($user, $loans) {
$subject_template = "DMC Helpdesk: Du har ¤count¤ försenade lån";
$subject_template = "DSV Helpdesk: Du har ¤count¤ ¤late¤ lån";
$reminder_template = "¤name¤, försenad sedan ¤due¤\n";
$message_template = <<<EOF
Hej ¤name¤
Vi vill påminna dig om att ditt lån av följande artiklar har gått ut:
Vi vill påminna dig om att ditt lån av följande ¤product¤ har gått ut:
¤list¤
@ -50,22 +50,30 @@ Vänligen återlämna dem till Helpdesk så snart som möjligt, alternativt kont
oss för att lånet förlängt.
Mvh
DMC Helpdesk
DSV Helpdesk
helpdesk@dsv.su.se
08 - 16 16 48
EOF;
$overdue_count = count($loans);
$reminder_list = '';
$late = 'försenat';
$product = 'artikel';
if($count > 1) {
$late = 'försenade';
$product = 'artiklar';
}
foreach($loans as $loan) {
$replacements = array('name' => $loan->get_product()->get_name(),
'due' => $loan->get_duration()['end']);
$reminder_list .= replace($replacements, $reminder_template);
}
$subject = replace(array('count' => $overdue_count), $subject_template);
$message = replace(array('name' => $user->get_displayname(),
'list' => $reminder_list), $message_template);
$subject = replace(array('count' => $overdue_count,
'late' => $late), $subject_template);
$message = replace(array('name' => $user->get_displayname(),
'list' => $reminder_list,
'product' => $product), $message_template);
try {
mb_send_mail($user->get_email(),
@ -75,7 +83,8 @@ EOF;
} catch(Exception $e) {
mb_send_mail('root@dsv.su.se',
"Kunde inte skicka påminnelse",
"Påminnelse kunde inte skickas till ".$user->get_name());
"Påminnelse kunde inte skickas till "
.$user->get_name());
}
}
}

@ -403,6 +403,7 @@
<form class="dark"
action="./"
method="GET">
<datalist id="userlist"></datalist>
<input type="hidden"
name="page"
value="checkout" />
@ -410,8 +411,11 @@
<span class="label">
Användarnamn:
</span>
<input type="text"
<input onFocus="JavaScript:suggest(this, 'user')"
type="text"
name="user"
list="userlist"
autocomplete="off"
placeholder="Användarnamn"
value="¤user¤"
required />
@ -428,6 +432,13 @@
value="¤displayname¤"
disabled />
</div>
<div>
<span class="label">
Anteckningar:
</span>
<textarea name="notes"
disabled>¤notes¤</textarea>
</div>
</form>
<h2>Låna ut artikel</h2>
<form class="light"

@ -83,42 +83,39 @@ function get_items($type) {
return $list;
}
function get_tags() {
$search = prepare(
'(select `tag` from `product_tag`)
union
(select `tag` from `template_tag`)
order by `tag`'
);
execute($search);
$out = array();
foreach(result_list($search) as $row) {
$out[] = $row['tag'];
function suggest($type) {
$search = '';
$typename = 'name';
switch($type) {
case 'user':
$search = prepare('select `name` from `user` order by `name`');
break;
case 'template':
$search = prepare('select `name` from `template` order by `name`');
break;
case 'tag':
$search = prepare(
'(select `tag` from `product_tag`)
union
(select `tag` from `template_tag`)
order by `tag`');
$typename = 'tag';
break;
case 'field':
$search = prepare(
'(select `field` from `product_info`)
union
(select `field` from `template_info`)
order by `field`');
$typename = 'field';
break;
default:
return array();
}
return $out;
}
function get_fields() {
$search = prepare(
'(select `field` from `product_info`)
union
(select `field` from `template_info`)
order by `field`'
);
execute($search);
$out = array();
foreach(result_list($search) as $row) {
$out[] = $row['field'];
}
return $out;
}
function get_templates() {
$search = prepare('select `name` from `template` order by `name`');
execute($search);
$out = array();
foreach(result_list($search) as $row) {
$out[] = $row['name'];
$out[] = $row[$typename];
}
return $out;
}

@ -38,7 +38,7 @@ abstract class Page extends Responder {
protected abstract function render_body();
protected $page = 'checkout';
protected $title = "Boka2";
protected $title = "DSV Utlåning";
protected $subtitle = '';
protected $error = null;
protected $menuitems = array('checkout' => 'Låna',
@ -666,12 +666,14 @@ class CheckoutPage extends Page {
protected function render_body() {
$username = '';
$displayname = '';
$notes = '';
$loan_table = '';
$subhead = '';
$enddate = gmdate('Y-m-d', time() + 604800); # 1 week from now
if($this->user !== null) {
$username = $this->user->get_name();
$displayname = $this->user->get_displayname();
$notes = $this->user->get_notes();
$loans = $this->user->get_loans('active');
$loan_table = 'Inga pågående lån.';
if($loans) {
@ -682,6 +684,7 @@ class CheckoutPage extends Page {
}
print(replace(array('user' => $this->userstr,
'displayname' => $displayname,
'notes' => $notes,
'end' => $enddate,
'subtitle' => $subhead,
'loan_table' => $loan_table),
@ -878,7 +881,17 @@ class Ajax extends Responder {
$loan = $product->get_active_loan();
if($loan) {
$loan->end();
return new Success($product->get_name() . ' har lämnats tillbaka.');
$user = $loan->get_user();
$userlink = replace(array('page' => 'users',
'id' => $user->get_id(),
'name' => $user->get_displayname()),
$this->fragments['item_link']);
$productlink = replace(array('page' => 'products',
'id' => $product->get_id(),
'name' => $product->get_name()),
$this->fragments['item_link']);
$user = $loan->get_user();
return new Success($productlink . ' åter från ' . $userlink);
}
return new Failure('Artikeln är inte utlånad.');
}
@ -1099,19 +1112,7 @@ class Ajax extends Responder {
}
private function suggest() {
switch($_POST['type']) {
case 'tag':
return new Success(get_tags());
break;
case 'field':
return new Success(get_fields());
break;
case 'template':
return new Success(get_templates());
break;
default:
return new Failure('Invalid type.');
}
return new Success(suggest($_POST['type']));
}
private function discard_product() {

@ -153,6 +153,7 @@ function inventoryProduct(event) {
function suggest(input, type) {
var existing = []
var capitalize = true
switch(type) {
default:
return showResult({'type':'error',
@ -173,6 +174,9 @@ function suggest(input, type) {
break
case 'template':
break
case 'user':
capitalize = false
break
}
var render = function(result) {
var suggestlist = document.querySelector('#' + type + 'list')
@ -186,8 +190,12 @@ function suggest(input, type) {
continue
}
var next = document.createElement('option')
next.value = suggestion.charAt(0).toUpperCase()
+ suggestion.slice(1)
if(capitalize) {
next.value = suggestion.charAt(0).toUpperCase()
+ suggestion.slice(1)
} else {
next.value = suggestion
}
suggestlist.appendChild(next)
}
}

@ -96,7 +96,7 @@ thead th, tfoot tr {
background-color: #c3d1e2;
}
input:disabled {
input:disabled, textarea:disabled {
background-color: #ededed;
}