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);
}
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);
    }
}
function returnBike($userId, $bike, $stand, $note = "", $force = FALSE)
{
    global $db;
    $bikeNum = intval($bike);
    $stand = strtoupper($stand);
    if ($force == FALSE) {
        $result = $db->query("SELECT bikeNum FROM bikes WHERE currentUser={$userId} ORDER BY bikeNum");
        $bikenumber = $result->num_rows;
        if ($bikenumber == 0) {
            response(_('You currently have no rented bikes.'), ERROR);
        }
    }
    if ($force == FALSE) {
        $result = $db->query("SELECT currentCode FROM bikes WHERE currentUser={$userId} and bikeNum={$bikeNum}");
    } else {
        $result = $db->query("SELECT currentCode FROM bikes WHERE bikeNum={$bikeNum}");
    }
    $row = $result->fetch_assoc();
    $currentCode = sprintf("%04d", $row["currentCode"]);
    $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}");
    if ($note) {
        addNote($userId, $bikeNum, $note);
    }
    $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') . '.';
    if ($note) {
        $message .= '<br />' . _('You have also reported this problem:') . ' ' . $note . '.';
    }
    if ($force == FALSE) {
        $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}");
    } else {
        $result = $db->query("INSERT INTO history SET userId={$userId},bikeNum={$bikeNum},action='FORCERETURN',parameter={$standId}");
    }
    response($message);
}