Files
api/services/nginx/app/objects/bookings_new_o.php
T
Jepp9350 8aee687106 Add new booking handling features and improve validations
Introduced support for a `data` property in bookings, extended form handling with additional validation and input fields, and added functionality for retrieving booking counts by date and status. Improved safety seal labeling and enhanced PDF generation comments.
2025-03-27 10:53:54 +01:00

223 lines
9.4 KiB
PHP

<?php
namespace objects;
use classes\db;
use classes\email;
use classes\object_property;
use classes\pdf_generator;
use Exception;
use traits\db_object_t;
class bookings_new_o extends db
{
use db_object_t;
public object_property $customer_number;
public object_property $wash_type;
public object_property $contact_email;
public object_property $reference_number;
public object_property $regNrTraekker;
public object_property $regNrTrailer;
public object_property $washCertificateEmail;
public object_property $date;
public object_property $department;
public object_property $pickup_bool;
public object_property $notes;
public object_property $washCertificateStatus;
public object_property $washCertificateUrl;
public object_property $status;
public object_property $data;
private static function isCancelled(int $id): bool
{
global $db;
// Check if the booking has been cancelled
$sql = "SELECT status FROM bookings WHERE id = $id";
$result = $db->query($sql);
$row = $db->fetch_assoc($result);
return $row['status'] === 'cancelled';
}
public function structure(): void
{
$this->setTable('bookings_new');
}
public function delete(int $id): void
{
$this->id = $id;
$this->getObjectProperties();
// Set the status to cancelled
$this->status->set('cancelled');
// Remove the cache
redis->clear_department_booking_count($this->department->value());
}
public function getObjectProperties(): void
{
$this->customer_number = new object_property($this->table, $this->id, 'customer_number', 'int', true);
$this->wash_type = new object_property($this->table, $this->id, 'wash_type', 'string', true);
$this->contact_email = new object_property($this->table, $this->id, 'contact_email', 'string', true);
$this->reference_number = new object_property($this->table, $this->id, 'reference_number', 'string', true);
$this->regNrTraekker = new object_property($this->table, $this->id, 'regNrTraekker', 'string', true);
$this->regNrTrailer = new object_property($this->table, $this->id, 'regNrTrailer', 'string', true);
$this->washCertificateEmail = new object_property($this->table, $this->id, 'washCertificateEmail', 'string', true);
$this->date = new object_property($this->table, $this->id, 'date', 'string', true);
$this->department = new object_property($this->table, $this->id, 'department', 'int', true);
$this->pickup_bool = new object_property($this->table, $this->id, 'pickup_bool', 'int', true);
$this->notes = new object_property($this->table, $this->id, 'notes', 'string', true);
$this->washCertificateStatus = new object_property($this->table, $this->id, 'washCertificateStatus', 'string', true);
$this->washCertificateUrl = new object_property($this->table, $this->id, 'washCertificateUrl', 'string', true);
$this->status = new object_property($this->table, $this->id, 'status', 'string', true);
$this->data = new object_property($this->table, $this->id, 'data', 'string', true);
}
public function parseBookings(array $listObjectsWithPaginationIfSet): array
{
// Parse the customer numbers
$bookings = $this->parseCustomerNumbers($listObjectsWithPaginationIfSet);
return $bookings;
}
public function parseCustomerNumbers(array $listObjectsWithPaginationIfSet): array
{
// Parse the customer numbers
foreach ( $listObjectsWithPaginationIfSet as $key => $value ) {
$listObjectsWithPaginationIfSet[$key]['customer_name'] = (new users_o())->getCustomerName($value['customer_number']);
}
return $listObjectsWithPaginationIfSet;
}
/**
* @param int $customer_number
* @param string $wash_type
* @param string $contact_email
* @param string $reference_number
* @param string $regNrTraekker
* @param string $regNrTrailer
* @param string $washCertificateEmail
* @param string $date
* @param string $department
* @param int $pickup_bool
* @param string $notes
* @param string $washCertificateStatus
* @param string $washCertificateUrl
* @param string $status
* @return void
*/
public function add(int $customer_number, string $wash_type, string $contact_email, string $reference_number, string $regNrTraekker, string $regNrTrailer, string $washCertificateEmail, string $date, string $department, int $pickup_bool, string $notes, string $washCertificateStatus, string $washCertificateUrl, string $status, array $data = []): void
{
global $db;
// Avoid SQL injection
$wash_type = $db->escape_string($wash_type);
$contact_email = $db->escape_string($contact_email);
$reference_number = $db->escape_string($reference_number);
$regNrTraekker = $db->escape_string($regNrTraekker);
$regNrTrailer = $db->escape_string($regNrTrailer);
$washCertificateEmail = $db->escape_string($washCertificateEmail);
$date = $db->escape_string($date);
$department = $db->escape_string($department);
$notes = $db->escape_string($notes);
$washCertificateStatus = $db->escape_string($washCertificateStatus);
$washCertificateUrl = $db->escape_string($washCertificateUrl);
$status = $db->escape_string($status);
// Create a new record in the database ( Replace the code, if an entry already exists )
$sql = "INSERT INTO $this->table (customer_number, wash_type, contact_email, reference_number, regNrTraekker, regNrTrailer, washCertificateEmail, date, department, pickup_bool, notes, washCertificateStatus, washCertificateUrl, status) VALUES ($customer_number, '$wash_type', '$contact_email', '$reference_number', '$regNrTraekker', '$regNrTrailer', '$washCertificateEmail', '$date', '$department', $pickup_bool, '$notes', '$washCertificateStatus', '$washCertificateUrl', '$status')";
$db->query($sql);
// Clear the cache
redis->clear_department_booking_count($department);
// Get the id of the new record
$this->id = $db->insert_id();
// Set the object properties
self::getObjectProperties();
// Add the data to the object
$this->data->set(json_encode($data));
self::objectChanged();
}
public function objectChanged(): void
{
// Clear the cache
redis->clear_department_booking_count($this->department->value());
}
/**
* Generate a wash certificate for the booking
* @param string|null $safety_seal
* @param string|null $operator
* @return void
* @throws Exception If the booking is cancelled
* @throws Exception If the booking is completed
* @throws Exception If the booking status is unknown
*/
public function generateWashCertificate(string|null $safety_seal, string|null $operator): void
{
self::requireSelected();
// Prepare the date and time
$date = date('d-m-Y', strtotime($this->date->value()));
$time = date('H:i', strtotime($this->date->value()));
// Get the customer name
$customer_name = (new users_o())->getCustomerName($this->customer_number->value());
$pdf_generator = new pdf_generator();
$pdf_generator->add_html($pdf_generator->templates->getTemplate('wash_certificate')
->setCompany([
'name' => 'Truck Wash',
'address' => 'Letland Allé 2',
'zip' => 2630,
'city' => 'Taastrup',
'phone_prefix' => 45,
'phone' => 43717886,
'email' => 'cph@truckwash.dk',
'website' => 'www.truckwash.dk',
'images' => [
'logo' => '/truckwash-banner-png.png',
'banner' => '/truckwash-banner-png.png',
'signature' => '/truckwash-underskrift.png',
],
])
->addData([
'seal_number' => $safety_seal,
'reg_1' => $this->regNrTraekker->value(),
'reg_2' => $this->regNrTrailer->value(),
'date' => $date,
'time' => $time,
'carried_out_by' => $operator,
'department_id' => $this->department->value(),
'customer_name' => $customer_name,
'type' => $this->wash_type->value(),
])
->getHtml()
);
// Generate the pdf
$pdf_path = $pdf_generator->generate_pdf();
// Set the wash certificate url
$this->washCertificateUrl->set($pdf_path);
// Set the wash certificate status
$this->washCertificateStatus->set('completed');
// Set the status to completed
$this->status->set('completed');
self::sendWashCertificateEmail();
}
public function sendWashCertificateEmail(): void
{
self::requireSelected();
// Send the wash certificate email
$email = new email();
$email->sendWashCertificateEmail(
$this->id,
(new users_o())->getCustomerName($this->customer_number->value()),
$this->contact_email->value(),
$this->reference_number->value(),
$this->washCertificateUrl->value(),
$this->washCertificateEmail->value(),
);
}
}