bank_sql/
wesweb01/bank_sql/index.php1 lines
<?php
# Startsida för banken. Visas endast när man är inloggad.
# Importerar moduler
require "modules/session.php";
require "modules/page.php";
Session::Init(); # Initierar sessionen.
Session::RedirectIfNotLoggedIn(); # Omdirigerar en till inloggningssidan ifall man inte är inloggad.
$user = Session::GetUser(); # Hämtar ett användarobjekt utifrån ens användar-id från sessionen.
$mainAccount = $user->getMainAccount(); # Hämtar huvudkontot för användaren.
# Huvudkontot är det konto som externa transaktioner, insättningar och uttag sker ifrån. Det går inte att radera.
# Denna sorts inledning är till stor del gemensam för alla sidor, så därför kommenteras den endast i denna fil.
$maxDeposit = 1000000; # Maxinsättning.
function try_deposit_withdraw($type, $amount): RequestResult
# Funktion för att försöka göra en insättning eller uttag från konto.
# Observera att alla funtkioner som börjar på try följer samma mönster, där den validerar användarinput.
# RequestResult är en egendefinerad klass som både innehåller ett meddelande, samt en boolean som avgör ifall det var lyckat eller ej.
# Används för att visa meddelande till användare, samt eventuellt hantera logik beroende på resultatet.
{
global $user, $mainAccount, $maxDeposit;
$intAmount = intval($amount);
if ($intAmount <= 0) # Ifall man anger ett värde under 0 misslyckas uttaget/insättningen.
return new RequestResult(false, "Angedda summan pengar får ej underskrida 0 kr.");
switch ($type) {
case "deposit":
if ($intAmount > $maxDeposit) # Ifall man anger en summa större än gränsen misslyckas insättningen.
return new RequestResult(false, "Angedda summan pengar får ej överskrida {$maxDeposit} kr.");
$user->logDeposit($intAmount); # Spara insättning.
$mainAccount->rereadValues(); # Ser till att saldot läses om.
return new RequestResult(true, "Satte in {$intAmount} kr på {$mainAccount->name}!");
case "withdraw":
$balance = $mainAccount->balance;
if ($intAmount > $balance) # Ifall man anger en summa större än man har misslyckas uttaget.
return new RequestResult(false, "Angedda summan pengar får ej överskrida {$balance} kr.");
$user->logWithdrawal($intAmount); # Spara uttagning.
$mainAccount->rereadValues(); # Ser till att saldot läses om.
return new RequestResult(true, "Tog ut {$intAmount} kr från {$mainAccount->name}!");
default: # Ifall användaren angett felaktig metod.
return new RequestResult(false, "Fel metod: {$type}.");
}
}
$result = null;
if (isset($_POST["transaction-type"]) && isset($_POST["amount"])) { # Här kör vi våran try metod ifall användaren begär det.
$result = try_deposit_withdraw($_POST["transaction-type"], $_POST["amount"]);
}
if (isset($_GET["action"])) {
switch ($_GET["action"]) {
case "create_account":
# Den här koden körs ifall användaren klickar på skapa (bank)konto.
# Helst hade jag velat använda POST för det här, men det hade blivit konstigt att använda formulär för det.
$user->createAccount("Nytt konto");
break;
default:
}
header("location: index.php");
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Banken</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() # Skriver ut navbar. Finns i alla filer. ?>
<div class="container row">
<?php
echo "<h1>Välkommen, {$user->username}!</h1>";
?>
<div class="row">
<div class="col s12 m6">
<div class="card grey lighten-3">
<div class="card-content">
<span class="card-title"><b>Mina konton</b></span>
<div class="card-action">
<ul class="collection ">
<?php
# Här går vi igenom varje konto som användaren har och visar namn på konto, samt saldo.
$i = 0;
foreach ($user->accounts as $account) {
if (!$account->isActive)
continue;
$colorChange = $i % 2 == 0 ? "2" : "1"; # Sak för att göra varannan färg ljus- respektive mörkgrå.
echo "<li class=\"collection-item grey lighten-{$colorChange} row\">
<a href=\"manage.php?account={$account->accountId}\" class=\"btn right blue-grey darken\">Hantera</a>
<p class=\"right\"> </p>
<a href=\"transfer.php?account={$account->accountId}\" class=\"btn right blue-grey darken\">Överför från</a>
<p><b>{$account->name}</b><br>{$account->balance} kr</p>
</li>";
$i++;
}
?>
</ul>
</div>
<a class="btn blue-grey darken" href="?action=create_account">Skapa nytt konto</a>
</div>
</div>
</div>
<div class="col s12 m6">
<div class="card grey lighten-3">
<div class="card-content">
<span class="card-title"><b>Insättning/uttag</b></span>
<div class="card-action">
<?php
# Skriver ut eventuellt meddelande angående insättning/uttag.
if (isset($result))
echo "<p><b>{$result->message}</b></p><br>";
?>
<form method="POST" id="deposit-withdrawal-form">
<p>
<label>
<input class="with-gap" name="transaction-type" value="deposit" id="deposit"
type="radio" required />
<span>Insättning</span>
</label>
</p>
<p>
<label>
<input class="with-gap" name="transaction-type" value="withdraw" id="withdraw"
type="radio" required />
<span>Uttag</span>
</label>
</p>
<br>
<div class="form-show-selected" hidden>
<p id="deposit-withdrawal-info"></p>
<div class="row">
<p class="col s6">
<label for="amount">Summa: </label>
<input type="number" name="amount" id="amount" class="validate" required
value="0" min="1" />
</p>
</div>
<p>
<input class="btn blue-grey darken" type="submit" value="Sätt in pengar">
</p>
</div>
<script>
// Detta script ser till att formuläret för insättning och uttag är lite interaktivt.
var depositButton = document.getElementById("deposit");
var withdrawButton = document.getElementById("withdraw");
var accountName = <?php echo "\"{$mainAccount->name}\""; ?>;
var maxWithdraw = <?php echo $mainAccount->balance; ?>;
var maxDeposit = <?php echo $maxDeposit; ?>;
var form = document.getElementById("deposit-withdrawal-form");
var submit = form.querySelector("input[type='submit']");
var amount = document.getElementById("amount");
var infoLabel = document.getElementById("deposit-withdrawal-info");
var hidden = true;
function setState(deposit) {
infoLabel.innerText = (deposit ? "Sätter in på: " : "Tar ut från: ") + accountName;
submit.value = deposit ? "Sätt in pengar" : "Ta ut pengar";
amount.setAttribute("max", deposit ? maxDeposit : maxWithdraw);
if (!hidden) return;
form.querySelector(".form-show-selected").removeAttribute("hidden");
hidden = false;
}
depositButton.addEventListener("change", function () {
if (depositButton.checked)
setState(true);
});
withdrawButton.addEventListener("change", function () {
if (withdrawButton.checked)
setState(false);
});
</script>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>