function status($action, $result, $values = FALSE) { if ($action == 'RENT') { if ($result == OK) { $message = '<h3>' . _('Bike') . ' ' . $values->bikenum . ': <span class="label label-primary">' . _('Open with code') . ' ' . $values->bike->currentcode . '.</span></h3>' . _('Change code immediately to') . ' <span class="label label-default">' . $values->newcode . '</span><br />' . _('(open, rotate metal part, set new code, rotate metal part back)') . '.'; if (isset($values->note)) { $message .= "<br />" . _('Reported issue:') . " <em>" . $values->note . "</em>"; } response($message); } elseif ($result == 100) { response(_('You can not rent any bikes. Contact the admins to lift the ban.'), ERROR); } elseif ($result == 101) { response(_('You can only rent') . " " . sprintf(ngettext('%d bike', '%d bikes', $values->userlimit), $values->userlimit) . " " . _('at once') . ".", ERROR); } elseif ($result == 102) { response(_('You can only rent') . " " . sprintf(ngettext('%d bike', '%d bikes', $values->userlimit), $values->userlimit) . " " . _('at once and you have already rented') . " " . $values->userlimit . ".", ERROR); } elseif ($result == 110) { response(_('Bike') . " " . $values->bikenum . " " . _('is not rentable now, you have to rent bike') . " " . $values->stacktopbike . " " . _('from this stand') . ".", ERROR); } elseif ($result == 120) { response(_('You have already rented the bike') . ' ' . $values->bikenum . '. ' . _('Code is') . ' <span class="label label-primary">' . $values->currentcode . '</span>. ' . _('Return bike by scanning QR code on a stand') . '.', ERROR); } elseif ($result == 121) { response(_('Bike') . " " . $values->bikenum . " " . _('is already rented by someone else') . ".", ERROR); } elseif ($result == 130) { response(_('You are below required credit') . " " . $values->requiredcredit . getcreditcurrency() . ". " . _('Please, recharge your credit.'), ERROR); } } elseif ($action == 'RETURN') { if ($result == OK) { $message = '<h3>' . _('Bike') . ' ' . $values->bikenum . ': <span class="label label-primary">' . _('Lock with code') . ' ' . $values->currentcode . '.</span></h3>'; $message .= '<br />' . _('Please') . ', <strong>' . _('rotate the lockpad to') . ' <span class="label label-default">0000</span></strong> ' . _('when leaving') . '.'; if (iscreditenabled() and isset($values->creditchange)) { $message .= '<br />' . _('Credit change') . ': -' . $values->creditchange . getcreditcurrency() . '.'; } response($message); } elseif ($result == 100) { response(_('You have no rented bikes currently.'), ERROR); } elseif ($result == 101) { $message = _('You have') . ' ' . $values->countrented . ' ' . _('rented bikes currently. QR code return can be used only when 1 bike is rented. Please, use web'); if ($connectors["sms"]) { $message .= _(' or SMS'); } $message .= _(' to return the bikes.'); response($message, ERROR); } } response('Unhandled status ' . $result . ' in ' . $action . ' in file ' . __FILE__ . '.', ERROR); }
function returnbike($userId, $stand) { global $db, $connectors; $stand = strtoupper($stand); $result = $db->query("SELECT bikeNum FROM bikes WHERE currentUser={$userId} ORDER BY bikeNum"); $bikenumber = $result->num_rows; if ($bikenumber == 0) { response(_('You have no rented bikes currently.'), ERROR); } elseif ($bikenumber > 1) { $message = _('You have') . ' ' . $bikenumber . ' ' . _('rented bikes currently. QR code return can be used only when 1 bike is rented. Please, use web'); if ($connectors["sms"]) { $message .= _(' or SMS'); } $message .= _(' to return the bikes.'); response($message, ERROR); } else { $result = $db->query("SELECT bikeNum,currentCode FROM bikes WHERE currentUser={$userId}"); $row = $result->fetch_assoc(); $currentCode = sprintf("%04d", $row["currentCode"]); $bikeNum = $row["bikeNum"]; $result = $db->query("SELECT standId FROM stands where standName='{$stand}'"); $row = $result->fetch_assoc(); $standId = $row["standId"]; $result = $db->query("UPDATE bikes SET currentUser=NULL,currentStand={$standId} WHERE bikeNum={$bikeNum} and currentUser={$userId}"); $message = '<h3>' . _('Bike') . ' ' . $bikeNum . ': <span class="label label-primary">' . _('Lock with code') . ' ' . $currentCode . '.</span></h3>'; $message .= '<br />' . _('Please') . ', <strong>' . _('rotate the lockpad to') . ' <span class="label label-default">0000</span></strong> ' . _('when leaving') . '.'; $creditchange = changecreditendrental($bikeNum, $userId); if (iscreditenabled() and $creditchange) { $message .= '<br />' . _('Credit change') . ': -' . $creditchange . getcreditcurrency() . '.'; } $result = $db->query("INSERT INTO history SET userId={$userId},bikeNum={$bikeNum},action='RETURN',parameter={$standId}"); response($message); } }
require "actions-sms.php"; log_sms($sms->UUID(), $sms->Number(), $sms->Time(), $sms->Text(), $sms->IPAddress()); $args = preg_split("/\\s+/", $sms->ProcessedText()); //preg_split must be used instead of explode because of multiple spaces /** TODO validation of bike / stand for commands */ if (!validateNumber($sms->Number())) { sendSMS($sms->Number(), _('Your number is not registered.')); } else { switch ($args[0]) { case "HELP": help($sms->Number()); break; case "CREDIT": if (iscreditenabled() == FALSE) { unknownCommand($sms->Number(), $args[0]); break; } credit($sms->Number()); break; case "FREE": freeBikes($sms->Number()); break; case "RENT": validateReceivedSMS($sms->Number(), count($args), 2, _('with bike number:') . " RENT 47"); rentbike($sms->Number(), $args[1]); //intval break; case "RETURN": validateReceivedSMS($sms->Number(), count($args), 3, _('with bike number and stand name:') . " RETURN 47 RACKO");
function help($number) { global $db; $userid = getUser($number); $privileges = getprivileges($userid); if ($privileges > 0) { $message = "Commands:\nHELP\n"; if (iscreditenabled()) { $message .= "CREDIT\n"; } $message .= "FREE\nRENT bikenumber\nRETURN bikeno stand\nWHERE bikeno\nINFO stand\nNOTE bikeno problem\n---\nFORCERENT bikenumber\nFORCERETURN bikeno stand\nLIST stand\nLAST bikeno\nREVERT bikeno\nADD email phone fullname\nDELNOTE bikeno [pattern]\nTAG stand note for all bikes\nUNTAG stand [pattern]"; sendSMS($number, $message); } else { $message = "Commands:\nHELP\n"; if (iscreditenabled()) { $message .= "CREDIT\n"; } $message .= "FREE\nRENT bikeno\nRETURN bikeno stand\nWHERE bikeno\nINFO stand\nNOTE bikeno problem description\nNOTE stand problem description"; sendSMS($number, $message); } }
function getcreditcurrency() { global $credit; if (iscreditenabled() == FALSE) { return; } // if credit system disabled, exit return $credit["currency"]; }
function validatecoupon($userid, $coupon) { global $db, $credit; if (iscreditenabled() == FALSE) { return; } // if credit system disabled, exit $result = $db->query("SELECT coupon,value FROM coupons WHERE coupon='" . $coupon . "' AND status<'2'"); if ($result->num_rows == 1) { $row = $result->fetch_assoc(); $value = $row["value"]; $result = $db->query("UPDATE credit SET credit=credit+'" . $value . "' WHERE userId='" . $userid . "'"); $result = $db->query("INSERT INTO history SET userId={$userid},action='CREDITCHANGE',parameter='" . $value . "|add+" . $value . "|" . $coupon . "'"); $result = $db->query("UPDATE coupons SET status='2' WHERE coupon='" . $coupon . "'"); response('+' . $value . ' ' . $credit["currency"] . '. ' . _('Coupon') . ' ' . $coupon . ' ' . _('has been redeemed') . '.'); } response(_('Invalid coupon, try again.'), 1); }
</div> </div> <div role="tabpanel" class="tab-pane" id="stands"> <div class="row"> <div class="col-lg-12"> <!-- button type="button" id="stands" class="btn btn-default" title="Show stand situation."><span class="glyphicon glyphicon-map-marker"></span> <?php echo _('Stand situation'); ?> </button --> <div id="standsconsole"></div> </div> </div> </div> <?php if (iscreditenabled()) { ?> <div role="tabpanel" class="tab-pane" id="credit"> <div class="row"> <div class="col-lg-12"> <button type="button" id="listcoupons" class="btn btn-default" title="<?php echo _('Display existing coupons.'); ?> "><span class="glyphicon glyphicon-list-alt"></span> <?php echo _('List coupons'); ?> </button> <button type="button" id="generatecoupons1" class="btn btn-success" title="<?php echo _('Generate new coupons.'); ?> "><span class="glyphicon glyphicon-plus"></span> <?php
function returnBike($number, $bike, $stand, $message = "", $force = FALSE) { global $db; $userId = getUser($number); $bikeNum = intval($bike); $stand = strtoupper($stand); $result = $db->query("SELECT standId FROM stands WHERE standName='{$stand}'"); if (!$result->num_rows) { sendSMS($number, _('Stand name') . " '" . $stand . "' " . _('does not exist. Stands are marked by CAPITALLETTERS.')); return; } $row = $result->fetch_assoc(); $standId = $row["standId"]; if ($force == FALSE) { $result = $db->query("SELECT bikeNum FROM bikes WHERE currentUser={$userId} ORDER BY bikeNum"); $bikenumber = $result->num_rows; if ($bikenumber == 0) { sendSMS($number, _('You have no rented bikes currently.')); return; } $listBikes = ""; while ($row = $result->fetch_assoc()) { $listBikes .= $row["bikeNum"] . ","; } if ($bikenumber > 1) { $listBikes = substr($listBikes, 0, strlen($listBikes) - 1); } } if ($force == FALSE) { $result = $db->query("SELECT currentCode FROM bikes WHERE currentUser={$userId} AND bikeNum={$bikeNum}"); if ($result->num_rows != 1) { sendSMS($number, _('You does not have bike') . " " . $bikeNum . " rented. " . _('You have rented the following') . " " . sprintf(ngettext('%d bike', '%d bikes', $bikenumber), $bikenumber) . ": {$listBikes}"); return; } $row = $result->fetch_assoc(); $currentCode = sprintf("%04d", $row["currentCode"]); $result = $db->query("SELECT note FROM notes WHERE bikeNum={$bikeNum} AND deleted IS NULL ORDER BY time DESC LIMIT 1"); $row = $result->fetch_assoc(); $note = $row["note"]; } else { $result = $db->query("SELECT currentCode,currentUser FROM bikes WHERE bikeNum={$bikeNum}"); if ($result->num_rows != 1) { sendSMS($number, _('Bike') . " " . $bikeNum . " " . _('is not rented. Saint Thomas, the patronus of all unrented bikes, prohibited returning unrented bikes.')); return; } $row = $result->fetch_assoc(); $currentCode = sprintf("%04d", $row["currentCode"]); $currentUser = $row["currentUser"]; $result = $db->query("SELECT note FROM notes WHERE bikeNum={$bikeNum} AND deleted IS NULL ORDER BY time DESC LIMIT 1"); $row = $result->fetch_assoc(); $note = $row["note"]; if ($currentUser) { $result = $db->query("SELECT number FROM users WHERE userId={$currentUser}"); $row = $result->fetch_assoc(); $currentUserNumber = $row["number"]; } } if (!preg_match("/return[\\s,\\.]+[0-9]+[\\s,\\.]+[a-zA-Z0-9]+[\\s,\\.]+(.*)/i", $message, $matches)) { $userNote = ""; } else { $userNote = $db->conn->real_escape_string(trim($matches[1])); } $result = $db->query("UPDATE bikes SET currentUser=NULL,currentStand={$standId} WHERE bikeNum={$bikeNum}"); if ($userNote) { $db->query("INSERT INTO notes SET bikeNum={$bikeNum},userId={$userId},note='{$userNote}'"); $result = $db->query("SELECT userName,number FROM users WHERE userId='{$userId}'"); $row = $result->fetch_assoc(); $userName = $row["userName"]; $phone = $row["number"]; $result = $db->query("SELECT stands.standName FROM bikes LEFT JOIN users ON bikes.currentUser=users.userID LEFT JOIN stands ON bikes.currentStand=stands.standId WHERE bikeNum={$bikeNum}"); $row = $result->fetch_assoc(); $standName = $row["standName"]; if ($standName != NULL) { $bikeStatus = _('at') . " " . $standName; } else { $bikeStatus = _('used by') . " " . $userName . " +" . $phone; } notifyAdmins(_('Note') . " b.{$bikeNum} (" . $bikeStatus . ") " . _('by') . " {$userName}/{$phone}:" . $userNote); } $message = _('Bike') . " " . $bikeNum . " " . _('returned to stand') . " " . $stand . ". " . _('Make sure you set code to') . " " . $currentCode . "."; if ($note or $userNote) { $tempnote = $note; if ($userNote) { $tempnote = $userNote; } if ($tempnote) { $message .= "(note:" . $tempnote . ")"; } } $message .= " " . _('Rotate lockpad to 0000.'); if ($force == FALSE) { $creditchange = changecreditendrental($bikeNum, $userId); $result = $db->query("INSERT INTO history SET userId={$userId},bikeNum={$bikeNum},action='RETURN',parameter={$standId}"); } else { $result = $db->query("INSERT INTO history SET userId={$userId},bikeNum={$bikeNum},action='FORCERETURN',parameter={$standId}"); if ($currentUserNumber) { sendSMS($currentUserNumber, _('System override') . ": " . _('Your rented bike') . " " . $bikeNum . " " . _('has been returned by admin') . "."); } } if (iscreditenabled()) { $message .= _('Credit') . ": " . getusercredit($userId) . getcreditcurrency(); if ($creditchange) { $message .= " (-" . $creditchange . ")"; } $message .= "."; } sendSMS($number, $message); }