bank/
wesweb01/bank/transfer.php1 lines
<?php
# Sida för att överföra pengar från ett konto till ett annat.
require "modules/session.php";
require "modules/page.php";
Session::Init();
Session::RedirectIfNotLoggedIn();
$user = Session::GetUser();
function try_internal_transfer($senderId, $recipientId, $amount): RequestResult
# Validerar användarinput och försöker göra en intern överföring(från användarens ena konto till sitt andra).
{
global $user;
$sender = $user->getAccountFromId($senderId); # Hämtar sändar- och mottagarkonton.
$recipient = $user->getAccountFromId($recipientId);
if ($senderId == $recipientId) # Kollar ifall man försöker skicka till samma konto man skickar ifrån.
# Bör inte hända i formuläret.
return new RequestResult(false, "Kan ej skicka till sändarkonto.");
if (!isset($sender) || !isset($recipient)) # Kollar ifall något av dem saknas.
return new RequestResult(false, "Konto saknas.");
if (!$sender->active || !$recipient->active) # Kollar ifall något av de är avaktiverade.
return new RequestResult(false, "Konto saknas.");
if (!is_int($amount)) # Ser till att värdet är ett tal.
return new RequestResult(false, "Summa pengar är ej ett nummer.");
$intAmount = intval($amount);
$balance = $sender->getBalance(); # Hämtar sändarkontots saldo.
if ($intAmount <= 0) # Ser till att värdet är över 0 kr.
return new RequestResult(false, "Summa pengar underskrider 0 kr.");
if ($intAmount > $balance) # Ser till att värdet inte är mer än man har.
return new RequestResult(false, "Summa pengar överskrider {$balance} kr.");
$user->logInternalTransaction($sender, $recipient, $intAmount);
# Gör själva transaktionen
return new RequestResult(true, "Överförde {$amount} kr till {$recipient->name}!");
}
function try_external_transfer($senderId, $recipientUsername, $amount): RequestResult
# Validerar användarinput och försöker göra en extern överföring(från användarens ena konto till en annan användares konto).
{
global $user;
$sender = $user->getAccountFromId($senderId); # Hämtar sändarkonto.
if (!isset($sender)) # Ser till att sändarkontot finns.
return new RequestResult(false, "Konto saknas.");
if (!$sender->active) # Ser till att sändarkontot inte är avaktiverat.
return new RequestResult(false, "Konto saknas.");
if (!User::UserExists($recipientUsername)) # Ser till att mottagaranvändaren finns.
return new RequestResult(false, "Användare med namn {$recipientUsername} finns ej.");
if (!is_int($amount)) # Kollar ifall värdet är ett tal.
return new RequestResult(false, "Summa pengar är ej ett nummer.");
$intAmount = intval($amount);
$balance = $sender->getBalance(); # Hämtar sändarkontots saldo.
if ($intAmount <= 0) # Ser till att värdet inteär över 0 kr.
return new RequestResult(false, "Summa pengar underskrider 0 kr.");
if ($intAmount > $balance) # Kollar så att man har nog med pengar.
return new RequestResult(false, "Summa pengar överskrider {$amount} kr.");
$recipient = User::LoadUser($recipientUsername); # Laddar mottagaranvändaren.
if ($recipient->username == $user->username) # Ser till att man inte försöker skicka pengar till sig själv.
return new RequestResult(false, "Kan ej överföra pengar till dig själv.");
$user->logExternalTransaction($sender, $recipient, $intAmount);
# Genomför transaktionen.
return new RequestResult(true, "Överförde {$amount} kr till {$recipient->username}!");
}
$result = null;
if (isset($_POST["sender"]) && isset($_POST["recipient"]) && isset($_POST["amount"])) {
# Kollar ifall användaren begär en överföring
if ($_POST["recipient"] == "external") {
# Försöker göra en extern överföring.
if (isset($_POST["recipient-user"]))
$result = try_external_transfer($_POST["sender"], $_POST["recipient-user"], intval($_POST["amount"]));
} else
$result = try_internal_transfer($_POST["sender"], $_POST["recipient"], intval($_POST["amount"]));
# Försöker göra en intern överföring.
}
$selectedAccount = $user->getAccountFromId($_GET["account"]); # Kollar att kontot man skickar ifrån finns.
# (Konto-ID finns i GET-query. Sätts när man klickar på "Överför från" på ett konto i startsidan.)
if (!$selectedAccount) {
header("location: index.php"); # Omdirigerar till startsida ifall konto saknas.
exit();
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Banken - Överför pengar</title>
<link rel="stylesheet" type="text/css" href="../css/materialize.css">
<script defer type="text/javascript" src="../js/materialize.js"></script>
</head>
<body>
<?php print_navbar() ?>
<div class="container">
<h1>Överför pengar</h1>
<div class="col s12 m6">
<div class="card grey lighten-3">
<div class="card-content">
<form class="row" method="POST">
<div class="col s6">
<?php
# Skriver ut eventuellt meddelande.
if (isset($result))
echo "<p><b>{$result->message}</b></p><br>";
# Skriver ut vilket konto man överför ifrån
echo "<p>Överför från: {$selectedAccount->name}";
echo "<input type=\"text\" name=\"sender\" style=\"display: none;\" value=\"{$selectedAccount->id}\" readonly />";
echo "</p>";
?>
<br>
<p>Överför till:</p>
<div id="account-list">
<?php
function create_radio_button($id, $name): void
# Enkel funktion för att skapa en radioknapp för möjliga mottagarkonton.
{
echo "<p><label>";
echo "<input class=\"with-gap\" name=\"recipient\" value=\"{$id}\" type=\"radio\" required />";
echo "<span>{$name}</span>";
echo "</label></p>";
}
foreach ($user->accounts as $account) { # Går igenom alla konton man har.
if (!$account->active) # Skippar ifall kontot är avaktiverat.
continue;
if ($account->id == $selectedAccount->id) # Skippar ifall kontot är det man har valt att skicka från
# (så att man inte skickar från ett konto till samma.)
continue;
create_radio_button($account->id, $account->name); # Skapar knappen för kontot.
}
create_radio_button("external", "Extern överföring"); # Skapar en knapp för externa överföringar.
# Ifall knappen markeras kommer JavaScriptet nedan visa en textruta där man kan skriva in användare.
?>
</div>
<p id="external-input" class="col s8" hidden>
<label for="recipient-user">Mottagarens namn: </label>
<input id="recipient-user" type="text" name="recipient-user" class="validate" required>
</p>
</div>
<div class="col s6">
<?php
echo "<p>Tillgängligt saldo: {$selectedAccount->getBalance()} kr</p>";
# Skriver ut tillgängligt saldo på sändarkontot.
?>
<div class="row">
<p class="col s6">
<label for="amount">Summa: </label>
<?php
# Skriver ut en number-input, med max-värde på så mycket pengar sändarkontot har.
echo "<input type=\"number\" name=\"amount\" id=\"amount\" value=\"0\" min=\"1\"
max=\"{$selectedAccount->getBalance()}\"/>";
?>
</p>
</div>
<p>
<input class="btn blue-grey darken" type="submit" value="Överför">
</p>
</div>
<script>
// Visar textruta där man kan mata in användare ifall knappen för extern överföring markeras.
var accountList = document.getElementById("account-list");
var externalInput = document.getElementById("external-input");
function setState(isExternal) {
if (isExternal) {
externalInput.removeAttribute("hidden");
externalInput.querySelector("input").setAttribute("required", "");
}
else {
externalInput.setAttribute("hidden", "");
externalInput.querySelector("input").removeAttribute("required");
}
console.log(isExternal);
}
for (let i = 0; i < accountList.children.length; i++) {
let button = accountList.children[i].querySelector("input");
let id = button.getAttribute("value");
button.addEventListener("change", () => {
if (button.checked)
setState(id == "external");
});
}
</script>
</form>
</div>
</div>
</div>
</div>
</body>
</html>