Sixtens hemsida Uppgifter Blogg Om

Bankapplikation

Gå till sida

Källkod

bank/

logout.php

transfer.php

index.php

login.php

manage.php

signup.php

change_password.php

modules/

user.php

page.php

session.php

utility.php

users/

hjk.json

sixten2.json

sixten.json

wesweb01/bank/transfer.php

1 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>