Files
api/services/nginx/app/objects/bookings_new_o.php
T
Jepp9350 95625e70b9 Add email sending for wash certificates and update form text.
Introduced `sendWashCertificateEmail` method to handle email dispatch, including necessary exception handling for MailerSend. Updated the wash booking form text to enhance clarity and ensure appropriate instructions in Danish.
2025-03-27 11:21:23 +01:00

235 lines
9.8 KiB
PHP

<?php
namespace objects;
use classes\db;
use classes\email;
use classes\object_property;
use classes\pdf_generator;
use Exception;
use MailerSend\Exceptions\MailerSendAssertException;
use MailerSend\Exceptions\MailerSendException;
use Psr\Http\Client\ClientExceptionInterface;
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
* @throws ClientExceptionInterface
*/
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();
}
/**
* Send the wash certificate email
* @throws MailerSendException
* @throws ClientExceptionInterface
* @throws MailerSendAssertException
* @throws \JsonException
* @throws Exception
*/
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(),
);
}
}