Browse Source

Initial Commit

master
Ruben De Baets 2 years ago
commit
446201b665
11 changed files with 1498 additions and 0 deletions
  1. 1
    0
      .gitignore
  2. 15
    0
      .vscode/launch.json
  3. 31
    0
      README.md
  4. 16
    0
      composer.json
  5. 1246
    0
      composer.lock
  6. 189
    0
      public/index.php
  7. BIN
      public/webshop.db
  8. 0
    0
      src/Controller/.gitkeep
  9. 0
    0
      src/DB/.gitkeep
  10. 0
    0
      src/Model/.gitkeep
  11. 0
    0
      src/Util/.gitkeep

+ 1
- 0
.gitignore View File

@@ -0,0 +1 @@
vendor/

+ 15
- 0
.vscode/launch.json View File

@@ -0,0 +1,15 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Listen for XDebug",
"type": "php",
"request": "launch",
"port": 9003,
"pathMappings": { "/src": "${workspaceRoot}" }
}
]
}

+ 31
- 0
README.md View File

@@ -0,0 +1,31 @@
# Examen PHP 1 - 08/03/2022

De applicatie is een zeer eenvoudig order-systeem. Er zijn 3 klanten, waarvoor je en bestelling kan aanmaken. In de database kan je terugvinden welke productID's er zijn. Een bestelling aanmaken gebeurt in 2 stappen : eerst maak je het order aan (met een referentie), daarna kan je aan een bestaand order producten toevoegen.

Probeer de applicatie uit, bekijk aandachtig de code. Veel zaken moeten duidelijk zijn, waar nodig staat er extra uitleg.

> TIP: debug de applicatie en voeg zelf commentaar toe waar nodig om later snel aan de slag te gaan.

## Installatie

1. Fork deze repository (rechts boven) en maak mij collaborator (in de settings uiterst rechts)
2. Clone deze repository in een aparte folder.
3. Installeer de libraries in vendor: `docker run --rm -t -i -v ${PWD}:/app debaetsr/composer2 install`
4. start de lokale server: `docker run --rm -t -i -v ${PWD}:/src -p 8080:8000 debaetsr/php_xdebug`
5. Start de XDEBUG-server - deze configuratie staat reeds OK

> Zie de mattermost voor meer info omtrent deze commando's, in de pinned posts

### Opdracht

De index.php bevat enkele routes en database connecties. Pas de applicatie aan zodat het voldoet aan het Model - View - Controller systeem.

Maak gebruik van services en Twig! Alle dependencies zijn reeds geïnstalleerd indien je het `composer install` commando (hierboven) uitgevoerd hebt.

> TIP : De namespace is reeds geconfigureerd voor de `/src` folder. Zoek eerst deze uit!

Vergeet niet om gebruik te maken van commits en branches indien nodig. Je mag altijd je notities inscannen/fotograferen en doorsturen.

Er zijn geen instinkers, maar heb wel aandacht voor details.

> TIP : security is belangrijk!

+ 16
- 0
composer.json View File

@@ -0,0 +1,16 @@
{
"require": {
"slim/slim": "4.*",
"slim/psr7": "^1.5",
"twig/twig": "^3.0",
"php-di/php-di": "^6.3"
},
"config": {
"platform-check": false
},
"autoload": {
"psr-4": {
"Shop\\": "src/"
}
}
}

+ 1246
- 0
composer.lock
File diff suppressed because it is too large
View File


+ 189
- 0
public/index.php View File

@@ -0,0 +1,189 @@
<?php

use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;

require __DIR__ . '/../vendor/autoload.php';

class myDB extends \SQLite3
{
public function __construct()
{
$this->open('./webshop.db');
}
}

$app = AppFactory::create();

$app->map(['GET', 'POST'], "/orders/{client}/create", function (Request $request, Response $response, array $args) {
if ($request->getMethod() == "GET") {
$db2 = new myDB();
$stmt2 = $db2->prepare("SELECT * FROM clients WHERE id = " . $args['client']);
$res2 = $stmt2->execute();
$a = $res2->fetchArray(SQLITE3_ASSOC);

$response->getBody()->write("<h1>Create order for" . $a['firstname'] . " " . $a['lastname'] . "</h1><hr/>");
$response->getBody()->write('<form action="/orders/' . $args['client'] . '/create" method="post">');
$response->getBody()->write('<label for="id">Reference: </label>');
$response->getBody()->write('<input type="text" name="reference">');
$response->getBody()->write('<input type="submit">');
$response->getBody()->write('</form>');

return $response;
} else {
$ref = $request->getParsedBody()['reference'];
$db2 = new myDB();
$sql = "insert into orders (reference, customer_id, vat, subtotal, total) values ('" . $ref . "', " . $args['client'] . ",0,0,0)";
$db2->exec($sql);
return $response->withHeader('Location', '/orders/' . $args['client']);
};
});

// Route with optional params, see https://www.slimframework.com/docs/v4/objects/routing.html#how-to-create-routes section Optional segments
$app->get('/orders[/{client}]', function (Request $request, Response $response, array $args) {
$db = new myDB();

if ($args['client']) {
// orders 1 client
$sql = "SELECT o.* FROM orders o LEFT JOIN clients c on o.customer_id = c.id where c.id = " . $args['client'];
$stmt = $db->prepare($sql);
$res = $stmt->execute();

// naam van de klant
$db2 = new myDB();
$stmt2 = $db2->prepare("SELECT * FROM clients WHERE id = " . $args['client']);
$res2 = $stmt2->execute();
$a = $res2->fetchArray(SQLITE3_ASSOC);
$response->getBody()->write('<a href="/orders/' . $args['client'] . '/create">Create order</a>');
$response->getBody()->write("<h1>ORDERS LIST FOR CLIENT " . $a['firstname'] . " " . $a['lastname'] . "</h1>");
$response->getBody()->write('<hr/>');
$response->getBody()->write("<table>");
} else {
// alle klanten
$response->getBody()->write("<h1>ORDERS LIST FOR ALL CLIENTS </h1>");
$response->getBody()->write('<hr/>');
$response->getBody()->write("<table>");
$sql = "SELECT o.* FROM orders o LEFT JOIN clients c on o.customer_id = c.id";
$stmt = $db->prepare($sql);
$res = $stmt->execute();
}

// toon de orders van 1 of alle klanten
while ($row = $res->fetchArray(SQLITE3_ASSOC)) {
// maak hier een deftige tabel van
$response->getBody()->write("<tr><td>" . " <a href=\"/order/" . $row['id'] . "\">" . $row["reference"] . "</a> " . $row['subtotal'] . " " . $row['vat'] . " " . $row['total'] . "</td></tr>");
}

$response->getBody()->write("</table>");
$response->getBody()->write('<hr/>');

$response->getBody()->write('<a href="/customers">Back to customer list</a> <a href="/orders">Back to order list</a>');

return $response;
});

$app->map(['GET', 'POST'], "/order/{id}/create", function (Request $request, Response $response, array $args) {

if ($request->getMethod() == "GET") {
$db2 = new myDB();
$stmt2 = $db2->prepare("SELECT * FROM orders WHERE id = " . $args['id']);
$res2 = $stmt2->execute();
$a = $res2->fetchArray(SQLITE3_ASSOC);

$response->getBody()->write("<h1>Create orderline for" . $a['reference'] . "</h1><hr/>");
$response->getBody()->write('<form action="/order/' . $args['id'] . '/create" method="post">');
$response->getBody()->write('<label for="id">product: </label>');
$response->getBody()->write('<input type="text" name="id">');
$response->getBody()->write('<label for="qty">qty: </label>');
$response->getBody()->write('<input type="text" name="qty">');
$response->getBody()->write('<input type="submit">');
$response->getBody()->write('</form>');
$response->getBody()->write('<hr/>');
$response->getBody()->write('<a href="/customers">Back to customer list</a> <a href="/orders">Back to order list</a>');
return $response;
} else {
$productid = $request->getParsedBody()['id'];
$qty = $request->getParsedBody()['qty'];
$db2 = new myDB();

// vraag details van het product op
$sqlproduct = "select * from products where id = " . $productid;
$stmtproduct = $db2->prepare($sqlproduct);
$resproduct = $stmtproduct->execute();
$product = $resproduct->fetchArray(SQLITE3_ASSOC);
$order_id = $args['id'];
$unitprice = $product['unitprice'];
$vatperc = $product['vatperc'];

// bereken de prijs van de lijn
$subtotal = $qty * $unitprice;
$vat = $subtotal * $vatperc / 100;
$total = $subtotal + $vat;

// voeg orderlijn toe
$sql = "insert into order_lines (order_id, product_id, qty, subtotal, vat, total) values ($order_id, $productid, $qty, $subtotal, $vat, $total)";
$db2->exec($sql);

// update het order met nieuwe totalen
$sql = "update orders set total = total + $total, subtotal = subtotal + $subtotal, vat = vat + $vat where id = $order_id";
$db2->exec($sql);

return $response->withHeader('Location', '/order/' . $args['id'] . '/create');
};
});

$app->get('/order/{id}', function (Request $request, Response $response, array $args) {

$db = new myDB();

// detail orderlijnen
$sql = "SELECT * FROM order_lines o LEFT JOIN products p on o.product_id = p.id where o.order_id = " . $args['id'];
$stmt = $db->prepare($sql);
$res = $stmt->execute();

// detail order
$db2 = new myDB();
$stmt = $db2->prepare("SELECT * FROM orders WHERE id = " . $args['id']);
$res2 = $stmt->execute();
$a = $res2->fetchArray(SQLITE3_ASSOC);
$response->getBody()->write('<a href="/order/' . $args['id'] . '/create">Add orderline</a>');


$response->getBody()->write("<h1>ORDER DETAILS FOR ORDER " . $a['reference'] . "</h1>");
$response->getBody()->write('<hr/>');
$response->getBody()->write("<table>");
while ($row = $res->fetchArray(SQLITE3_ASSOC)) {
// maak hier een deftige tabel van
$response->getBody()->write("<tr><td>" . " " . $row['id'] . " " . $row["itemnumber"] . " " . $row['name'] . " " . $row['qty'] . " " . $row['subtotal'] . " " . $row['vat'] . " " . $row['total'] . "</td></tr>");
}
$response->getBody()->write("</table>");
$response->getBody()->write('<hr/>');

$response->getBody()->write('<a href="/customers">Back to customer list</a> <a href="/orders">Back to order list</a>');

return $response;
});


$app->get('/customers', function (Request $request, Response $response, array $args) {
$db = new myDB();
$sql = "SELECT * FROM clients";
$stmt = $db->prepare($sql);
$res = $stmt->execute();

$response->getBody()->write("<h1>CUSTOMERS LIST </h1>");
$response->getBody()->write('<hr/>');
$response->getBody()->write("<table>");
while ($row = $res->fetchArray(SQLITE3_ASSOC)) {
// maak hier een deftige tabel van
$response->getBody()->write("<tr><td>" . " " . " <a href=\"/orders/" . $row['id'] . "\">" . $row["id"] . "</a> " . " " . $row['firstname'] . " " . $row['lastname'] . " " . $row['street'] . " " . $row['street2'] . " " . $row['zipcode'] . " " . $row['city'] . " " . $row['country'] . "</td></tr>");
}
$response->getBody()->write("</table>");

return $response;
});



$app->run();

BIN
public/webshop.db View File


+ 0
- 0
src/Controller/.gitkeep View File


+ 0
- 0
src/DB/.gitkeep View File


+ 0
- 0
src/Model/.gitkeep View File


+ 0
- 0
src/Util/.gitkeep View File


Loading…
Cancel
Save