Files
api/services/nginx/app/routes/orderBookingRoute.php
T
Jeppe Bundgaard 0180523539 Add orderBookingRoute class for handling order bookings
- Introduced a new `orderBookingRoute` to process and validate order booking data.
- Added methods for parameter validation, customer and department identification, and item verification.
- Implemented functionality to handle booking details such as notes, PO numbers, pickup preferences, and datetime inputs.
2025-11-05 12:34:16 +01:00

269 lines
10 KiB
PHP

<?php
namespace routes;
use classes\authentication;
use Exception;
use objects\departments_o;
use objects\logs_o;
use objects\order_items_o;
use objects\users_o;
use traits\route_t;
class orderBookingRoute
{
use route_t;
public function run(): void
{
$this->post('/order-bookings', function () {
// Require the user to be logged in
global $response;
/**
* Parameters
*/
$customer_number = self::getTargetCustomer(); // users_o object
$department = self::getTargetDepartment(); // Int
$reg_1 = self::getTargetReg(1); // String
$reg_2 = self::getTargetReg(2); // String | Null
$reg_3 = self::getTargetReg(3); // String | Null
$datetime = self::getTargetDateTime(); // DateTime
$note = self::getTargetNote(); // String | Null
$reference = self::getTargetReference(); // String | Null
$po = self::getTargetPo(); // String | Null
$pickup = self::getTargetPickup(); // Bool | Null
$items = self::getTargetItems(); // Array of order_items_o objects
/**
* Debug input
*/
$response->success([
'customer_number' => $customer_number->customer_number,
'department' => $department->id,
'reg_1' => $reg_1,
'reg_2' => $reg_2,
'reg_3' => $reg_3,
'datetime' => $datetime->format('Y-m-d H:i:s'),
'note' => $note,
'reference' => $reference,
'po' => $po,
'pickup' => $pickup,
'items' => $items,
'items_count' => count($items),
]);
exit;
//self::requirePermission('user_security_change_email');
$user = (new authentication())->get_user();
if (!$user) {
(new logs_o())->add('user_security', 'global', 0, 0, 'USER_SECURITY_CHANGE_EMAIL', 'User not logged in');
$response->error('Invalid session', 400);
}
// Require the email, and password parameters
self::requireParameters(['email', 'password']);
// Check if the email is valid
$email = (string)self::getParameter('email');
self::requireMinLength('email', 5);
self::requireMaxLength('email', 255);
self::requireType($email, self::type_string());
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
(new logs_o())->add('user_security', 'global', 0, $user->id, 'USER_SECURITY_CHANGE_EMAIL', 'Invalid email');
$response->error('Invalid email', 400);
}
// Validate the password
$password = (string)self::getParameter('password');
self::requireMinLength('password', 5);
self::requireMaxLength('password', 255);
self::requireType($password, self::type_string());
if (!$user->passwordMatches($password)) {
(new logs_o())->add('user_security', 'global', 0, $user->id, 'USER_SECURITY_CHANGE_EMAIL', 'Invalid password');
$response->error('Invalid password', 400);
} else {
// Change the email
$user->setEmail($email);
(new logs_o())->add('user_security', 'global', 0, $user->id, 'USER_SECURITY_CHANGE_EMAIL', 'Email changed');
$response->success(['message' => 'Email changed']);
}
},
[
'user_security_change_email' => 'Change the email address of the user',
]
);
}
private function getTargetCustomer(): users_o
{
global $response;
$parameter = 'customer_number';
$error = 'Invalid customer number';
self::requireParameters([$parameter]);
self::requireType(self::getParameter($parameter), self::type_int());
self::requireMinLength($parameter, 2);
self::requireMaxLength($parameter, 9);
$value = (int)self::getParameter($parameter);
self::requireMinValue($value, 1);
self::requireMaxValue($value, 999999999);
$object = (new users_o())->getUserByCustomerNumber($value);
if (!$object->exists()) {
$response->error($error, 400);
}
return $object;
}
/**
* @throws Exception If the Department is invalid.
*/
private function getTargetDepartment(): departments_o
{
global $response;
$parameter = 'department';
$error = 'Invalid department';
self::requireParameters([$parameter]);
self::requireType(self::getParameter($parameter), self::type_int());
self::requireMinLength($parameter, 1);
self::requireMaxLength($parameter, 9);
$value = (int)self::getParameter($parameter);
self::requireMinValue($value, 1);
self::requireMaxValue($value, 999999999);
$object = (new departments_o())->select($value);
if (!$object->exists()) {
$response->error($error, 400);
}
return $object;
}
private function getTargetReg(int $index = 1): string|null
{
global $response;
$parameter = 'reg_' . $index;
$error = 'Invalid ' . $parameter;
$required = $index === 1;
if (!$required && !$this->isParametersSet([$parameter])) return null;
self::requireParameters([$parameter]);
if ($required) {
self::requireType(self::getParameter($parameter), self::type_string());
} else {
self::requireTypeIn(self::getParameter($parameter), [self::type_string(), self::type_null()]);
// Check if the value is null
if ($this->getParameter($parameter) === null) return null;
}
self::requireMinLength($parameter, 1);
self::requireMaxLength($parameter, 12);
$value = (int)self::getParameter($parameter);
return self::cleanReg($value);
}
private function getTargetDateTime(): \DateTime
{
global $response;
$parameter = 'datetime';
$error = 'Invalid datetime';
self::requireParameters([$parameter]);
self::requireType(self::getParameter($parameter), self::type_string());
self::requireMinLength($parameter, 10);
self::requireMaxLength($parameter, 25);
$value = (string)self::getParameter($parameter);
$fromFormat = strlen($value) === 10 ? 'Y-m-d' : 'Y-m-d H:i:s';
$datetime = \DateTime::createFromFormat($fromFormat, $value);
if (!$datetime) {
$response->error($error, 400);
}
return $datetime;
}
private function getTargetNote(): string|null
{
$parameter = 'note';
if (!$this->isParametersSet([$parameter])) return null;
self::requireParameters([$parameter]);
self::requireTypeIn(self::getParameter($parameter), [self::type_string(), self::type_null()]);
if (self::getParameter($parameter) === null) return null;
self::requireMinLength($parameter, 1);
self::requireMaxLength($parameter, 1000);
return (string)self::getParameter($parameter);
}
private function getTargetReference(): string|null
{
$parameter = 'reference';
if (!$this->isParametersSet([$parameter])) return null;
self::requireParameters([$parameter]);
self::requireTypeIn(self::getParameter($parameter), [self::type_string(), self::type_null()]);
if (self::getParameter($parameter) === null) return null;
self::requireMinLength($parameter, 1);
self::requireMaxLength($parameter, 100);
return (string)self::getParameter($parameter);
}
private function getTargetPo(): string|null
{
$parameter = 'po';
if (!$this->isParametersSet([$parameter])) return null;
self::requireParameters([$parameter]);
self::requireTypeIn(self::getParameter($parameter), [self::type_string(), self::type_null()]);
if (self::getParameter($parameter) === null) return null;
self::requireMinLength($parameter, 1);
self::requireMaxLength($parameter, 100);
return (string)self::getParameter($parameter);
}
private function getTargetPickup(): bool|null
{
$parameter = 'pickup';
if (!$this->isParametersSet([$parameter])) return null;
self::requireParameters([$parameter]);
self::requireType(self::getParameter($parameter), self::type_bool());
return (bool)self::getParameter($parameter);
}
private function getTargetItems(): array {
global $response;
$parameter = 'items';
$error = 'Invalid items';
self::requireParameters([$parameter]);
self::requireType(self::getParameter($parameter), self::type_array());
$items = (array)self::getParameter($parameter);
if (count($items) === 0) {
$response->error($error, 400);
}
// Verify items
foreach ($items as $key => $item) {
self::requireType($item, self::type_array());
self::requireValidItem((array)$item, $key);
}
return $items;
}
private function cleanReg(string $reg): string
{
// Remove all non-alphanumeric characters
return strtoupper(preg_replace('/[^A-Za-z0-9]/', '', $reg));
}
private function requireValidItem(array $item, int $index): void
{
global $response;
/**
* {
* "id": 22,
* "name": "Double Duty - Kemi",
* "description": " ",
* "price": 239,
* "subscription_allowed": 0,
* "category": "4",
* "piktogram": "",
* "economic_product_id": "24",
* "apply_category_discount": false,
* "requires_note": true,
* "is_wash": false,
* "display_in_booking_form": true,
* "order_priority": 1021,
* "created_at": "2024-12-09 14:31:49",
* "updated_at": "2025-10-28 13:55:58",
* "quantity": 4
* }
*/
// Require id field
if (!isset($item['id']) || !is_int($item['id']) || $item['id'] < 1) {
$response->error('Invalid item id at index ' . $index, 400);
}
// Require quantity field
if (!isset($item['quantity']) || !is_int($item['quantity']) || $item['quantity'] < 1) {
$response->error('Invalid item quantity at index ' . $index, 400);
}
}
}