Remove unused form and enhance wash certificate handling
The `book_interior_wash_f` form was removed due to redundancy. Added functionality to handle wash certificate generation, including safety seal and operator data, and added a new form `complete_booking_f` to finalize bookings without certificates. Adjustments were made to several related components to ensure seamless integration.
This commit is contained in:
@@ -12,6 +12,7 @@ use Exception;
|
||||
use forms\form_helper_c;
|
||||
use forms\objects\book_interior_wash_f;
|
||||
use forms\objects\book_wash_f;
|
||||
use forms\objects\complete_booking_f;
|
||||
use forms\objects\generate_booking_wash_certificate_f;
|
||||
use traits\form_t;
|
||||
|
||||
@@ -28,22 +29,23 @@ class form
|
||||
* @var book_wash_f $book_wash The BOOK_WASH form
|
||||
*/
|
||||
public book_wash_f $book_wash;
|
||||
/**
|
||||
* The BOOK_INTERIOR_WASH form
|
||||
* @var book_interior_wash_f $book_interior_wash The BOOK_INTERIOR_WASH form
|
||||
*/
|
||||
public book_interior_wash_f $book_interior_wash;
|
||||
/**
|
||||
* The GENERATE_BOOKING_CERTIFICATE form
|
||||
* @var generate_booking_wash_certificate_f $generate_booking_wash_certificate The GENERATE_BOOKING_CERTIFICATE form
|
||||
*/
|
||||
public generate_booking_wash_certificate_f $generate_booking_wash_certificate;
|
||||
|
||||
/**
|
||||
* The COMPLETE_BOOKING_WITHOUT_WASH_CERTIFICATE form
|
||||
* @var complete_booking_f $complete_booking_without_wash_certificate The COMPLETE_BOOKING_WITHOUT_WASH_CERTIFICATE form
|
||||
*/
|
||||
public complete_booking_f $complete_booking_without_wash_certificate;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->book_wash = new book_wash_f();
|
||||
$this->book_interior_wash = new book_interior_wash_f();
|
||||
$this->generate_booking_wash_certificate = new generate_booking_wash_certificate_f();
|
||||
$this->complete_booking_without_wash_certificate = new complete_booking_f();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,196 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace forms\objects;
|
||||
|
||||
use classes\email;
|
||||
use forms\form_helper_c;
|
||||
use objects\departments_o;
|
||||
use objects\users_o;
|
||||
use traits\form_t;
|
||||
|
||||
class book_interior_wash_f extends form_helper_c
|
||||
{
|
||||
use form_t;
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function sanitize(): void
|
||||
{
|
||||
foreach ( $this->form_unsanitized_data as $key => $value ) {
|
||||
// Sanitize the input TODO: Implement the sanitization logic
|
||||
$this->form_unsanitized_data[$key] = $value;
|
||||
}
|
||||
// Set the sanitized data
|
||||
$this->form_sanitized_data = $this->form_unsanitized_data;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function validateInput(): void
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function beforeSave(): void
|
||||
{
|
||||
// Set the department id to the department id of the user
|
||||
self::setDepartmentId(self::getSanitizedData('department_id'));
|
||||
// Set the customer number to the customer number of the user
|
||||
self::setCustomerNumber(self::getSanitizedData('customer_number'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function afterSubmit(): void
|
||||
{
|
||||
$email = new email();
|
||||
// Get the user from the customer number
|
||||
$user = (new users_o())->getUserByCustomerNumber(self::getSanitizedData('customer_number'));
|
||||
// Get the department name from the department id
|
||||
$department = (new departments_o())->selectId(self::getSanitizedData('department_id'));
|
||||
// Send the booking confirmation email
|
||||
$email->sendBookingConfirmationEmail(
|
||||
123,
|
||||
$user->getCustomerName($user->customer_number->value()),
|
||||
self::getCustomerNumber(),
|
||||
self::getSanitizedData('contact_email'),
|
||||
self::getSanitizedData('reference'),
|
||||
strtoupper(self::getSanitizedData('registration_number_tractor')),
|
||||
strtoupper(self::getSanitizedData('registration_number_trailer')),
|
||||
self::getSanitizedData('wants_wash_certificate') ? 'Ja' : 'Nej',
|
||||
self::getSanitizedData('wants_wash_certificate_email'),
|
||||
self::getSanitizedData('date'),
|
||||
$department->name->value(),
|
||||
$department->description->value(),
|
||||
self::getSanitizedData('wants_pickup') ? 'Ja' : 'Nej',
|
||||
self::getSanitizedData('notes')
|
||||
);
|
||||
// TODO: Implement afterSubmit() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function setup(): void
|
||||
{
|
||||
self::setFormIdentifier('BOOK_INTERIOR_WASH');
|
||||
self::setFormName('Book an interior wash');
|
||||
self::setFormDescription('This form is used to book an interior wash for a vehicle.');
|
||||
self::setSubmitButtonText('Book indvendig vask');
|
||||
// Set the form fields
|
||||
self::defineInputFieldsAdvanced([
|
||||
'customer_number' => [
|
||||
'description' => 'Et kunde nummer, er et unikt nummer, som er tildelt til hver kunde. Som standard er det telefonnummeret indtastet ved oprettelse af kunden.',
|
||||
'required' => true,
|
||||
'placeholder' => 'Indtast dit kunde nummer',
|
||||
'label' => 'Kunde nummer',
|
||||
'help' => 'Dit kunde nummer, som du har fået tildelt af os.',
|
||||
'error' => 'Du skal indtaste et gyldigt kunde nummer.',
|
||||
'validation_method' => 'validateCustomerNumber',
|
||||
],
|
||||
'contact_email' => [
|
||||
'description' => 'Det er vigtigt at indtaste en gyldig email adresse, da vi sender en bekræftelse til denne adresse.',
|
||||
'required' => true,
|
||||
'placeholder' => 'Indtast din email adresse',
|
||||
'label' => 'Email adresse',
|
||||
'help' => 'Vi sender en bekræftelse til denne email adresse.',
|
||||
'error' => 'Du skal indtaste en gyldig email adresse.',
|
||||
'validation_method' => 'validateEmail',
|
||||
],
|
||||
'reference' => [
|
||||
'description' => 'Det er muligt at indtaste et reference nummer, hvis det er relevant for dig. Dette nummer kan være nyttigt til at identificere din booking.',
|
||||
'required' => false,
|
||||
'placeholder' => 'Indtast et reference nummer (hvis relevant)',
|
||||
'label' => 'Reference nummer',
|
||||
'help' => 'Dette nummer tilføjes til din booking som reference.',
|
||||
'error' => 'Du skal indtaste et gyldigt reference nummer.',
|
||||
'validation_method' => 'validateString',
|
||||
'default' => '',
|
||||
],
|
||||
'registration_number_tractor' => [
|
||||
'description' => 'Nummerpladen på den trækkende enhed, som er det køretøj, der trækker traileren.',
|
||||
'required' => true,
|
||||
'placeholder' => 'Indtast registreringsnummeret på den trækkende enhed',
|
||||
'label' => 'Registreringsnummer (trækkende enhed)',
|
||||
'help' => 'Dette er nummerpladen på den trækkende enhed.',
|
||||
'error' => 'Du skal indtaste et gyldigt registreringsnummer.',
|
||||
'validation_method' => 'validateRegistrationNumber',
|
||||
],
|
||||
'registration_number_trailer' => [
|
||||
'description' => 'Nummerpladen på traileren, som er det køretøj, der bliver trukket af den trækkende enhed.',
|
||||
'required' => true,
|
||||
'placeholder' => 'Indtast registreringsnummeret på traileren',
|
||||
'label' => 'Registreringsnummer (trailer)',
|
||||
'help' => 'Dette er nummerpladen på traileren.',
|
||||
'error' => 'Du skal indtaste et gyldigt registreringsnummer.',
|
||||
'validation_method' => 'validateRegistrationNumber',
|
||||
],
|
||||
'wants_wash_certificate' => [
|
||||
'description' => 'En vaskecertifikat er et dokument, der bekræfter, at køretøjet er blevet vasket og rengjort.',
|
||||
'required' => false,
|
||||
'label' => 'Ønsker vaskecertifikat',
|
||||
'help' => 'Hvis du ønsker et vaskecertifikat, skal du markere denne boks.',
|
||||
'error' => null,
|
||||
'validation_method' => 'validateBoolean',
|
||||
'default' => true,
|
||||
],
|
||||
'wants_wash_certificate_email' => [
|
||||
'description' => 'Vaskecertifikatet sendes til den email adresse, der er angivet her. Det er vigtigt at indtaste en gyldig email adresse.',
|
||||
'required' => false,
|
||||
'placeholder' => 'Indtast email adresse til vaskecertifikat',
|
||||
'label' => 'Email adresse til vaskecertifikat',
|
||||
'help' => 'Vaskecertifikatet sendes til denne email adresse.',
|
||||
'error' => 'Du skal indtaste en gyldig email adresse.',
|
||||
'validation_method' => 'validateEmail',
|
||||
'display_if' => 'wants_wash_certificate',
|
||||
'display_if_value' => true,
|
||||
'required_if_display' => true,
|
||||
'default' => null,
|
||||
],
|
||||
'date' => [
|
||||
'description' => 'Datoen for vasken, som er den dato, hvor vasken skal finde sted.',
|
||||
'required' => true,
|
||||
'placeholder' => null,
|
||||
'label' => 'Dato',
|
||||
'help' => 'Hvornår skal vasken finde sted?',
|
||||
'error' => 'Du skal indtaste en gyldig dato.',
|
||||
'validation_method' => 'validateDate',
|
||||
'default' => date('Y-m-d'),
|
||||
],
|
||||
'department_id' => [
|
||||
'description' => 'Den afdeling / vaskehal, hvor vasken skal finde sted.',
|
||||
'required' => true,
|
||||
'placeholder' => null,
|
||||
'label' => 'Afdeling',
|
||||
'help' => 'Vælg den afdeling, hvor vasken skal finde sted.',
|
||||
'error' => 'Du skal vælge en afdeling.',
|
||||
'validation_method' => 'validateInt',
|
||||
'options' => self::getDepartmentOptions(),
|
||||
],
|
||||
'wants_pickup' => [
|
||||
'description' => 'Pickup er en service, hvor vi henter køretøjet og bringer det tilbage efter vasken.',
|
||||
'required' => false,
|
||||
'label' => 'Ønsker afhentning',
|
||||
'help' => 'Hvis du ønsker afhentning af køretøjet, skal du markere denne boks.',
|
||||
'error' => null,
|
||||
'validation_method' => 'validateBoolean',
|
||||
],
|
||||
'notes' => [
|
||||
'description' => 'Dette er et felt, hvor du kan tilføje eventuelle noter eller kommentarer, der er relevante for vasken. Som f.eks. særlige instruktioner eller ønsker.',
|
||||
'required' => false,
|
||||
'placeholder' => 'Indtast eventuelle noter eller kommentarer',
|
||||
'label' => 'Noter',
|
||||
'help' => 'Skriv her eventuelle noter eller kommentarer, der er relevante for vasken.',
|
||||
'error' => null,
|
||||
'validation_method' => 'validateString',
|
||||
'default' => '',
|
||||
],
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,7 @@ namespace forms\objects;
|
||||
|
||||
use classes\email;
|
||||
use forms\form_helper_c;
|
||||
use objects\bookings_new_o;
|
||||
use objects\bookings_o;
|
||||
use objects\departments_o;
|
||||
use objects\users_o;
|
||||
use traits\form_t;
|
||||
@@ -57,32 +57,44 @@ class book_wash_f extends form_helper_c
|
||||
// Get the department name from the department id
|
||||
$department = (new departments_o())->selectId(self::getSanitizedData('department_id'));
|
||||
// Get the bookings_new object
|
||||
$bookings_new = new bookings_new_o();
|
||||
$bookings = new bookings_o();
|
||||
print_r(
|
||||
self::getSanitizedData('wash_type')
|
||||
);
|
||||
// Check if the wash type contains the interior wash
|
||||
$wants_wash_certificate = (bool)self::getSanitizedData('wants_wash_certificate');
|
||||
if (in_array(3, self::getSanitizedData('wash_type'))) {
|
||||
if ($wants_wash_certificate) {
|
||||
$wash_certificate_email = self::getSanitizedData('wants_wash_certificate_email');
|
||||
} else {
|
||||
$wash_certificate_email = '';
|
||||
}
|
||||
}
|
||||
// Create a new booking
|
||||
$bookings_new->add(
|
||||
$bookings->add(
|
||||
self::getCustomerNumber(),
|
||||
self::getFormIdentifier(),
|
||||
self::getSanitizedData('contact_email'),
|
||||
self::getSanitizedData('reference'),
|
||||
strtoupper(self::getSanitizedData('registration_number_tractor')),
|
||||
strtoupper(self::getSanitizedData('registration_number_trailer')),
|
||||
self::getSanitizedData('wants_wash_certificate') ? self::getSanitizedData('wants_wash_certificate_email') : '',
|
||||
$wash_certificate_email ?? '',
|
||||
self::getSanitizedData('date'),
|
||||
$department->id,
|
||||
(bool)self::getSanitizedData('wants_pickup'),
|
||||
self::getSanitizedData('notes'),
|
||||
'pending',
|
||||
$wants_wash_certificate ? 'pending' : 'cancelled',
|
||||
'',
|
||||
'pending',
|
||||
self::getSanitizedData('wash_type'),
|
||||
);
|
||||
// Validate the booking actually exists
|
||||
if (!$bookings_new->exists()) {
|
||||
if (!$bookings->exists()) {
|
||||
throw new \Exception('Booking could not be created');
|
||||
}
|
||||
// Send the booking confirmation email
|
||||
$email->sendBookingConfirmationEmail(
|
||||
$bookings_new->id,
|
||||
$bookings->id,
|
||||
$user->getCustomerName($user->customer_number->value()),
|
||||
self::getCustomerNumber(),
|
||||
self::getSanitizedData('contact_email'),
|
||||
|
||||
@@ -0,0 +1,103 @@
|
||||
<?php
|
||||
|
||||
namespace forms\objects;
|
||||
|
||||
use forms\form_helper_c;
|
||||
use objects\bookings_o;
|
||||
use traits\form_t;
|
||||
|
||||
class complete_booking_f extends form_helper_c
|
||||
{
|
||||
use form_t;
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function sanitize(): void
|
||||
{
|
||||
foreach ( $this->form_unsanitized_data as $key => $value ) {
|
||||
// Sanitize the input TODO: Implement the sanitization logic
|
||||
$this->form_unsanitized_data[$key] = $value;
|
||||
}
|
||||
// Set the sanitized data
|
||||
$this->form_sanitized_data = $this->form_unsanitized_data;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function validateInput(): void
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function beforeSave(): void
|
||||
{
|
||||
// Get the booking from the booking id
|
||||
$bookings = new bookings_o();
|
||||
$bookings->select(self::getSanitizedData('booking_id'));
|
||||
// Check if the user has access to the booking
|
||||
self::restrictAccessDepartment($bookings->department->value());
|
||||
// Check if the user has access to issue wash certificates
|
||||
self::requirePermission(
|
||||
'issue_wash_certificates',
|
||||
'User does not have access to issue wash certificates',
|
||||
);
|
||||
// Set the department id to the department id of the user
|
||||
self::setDepartmentId($bookings->department->value());
|
||||
// Set the customer number to the customer number of the user
|
||||
self::setCustomerNumber($bookings->customer_number->value());
|
||||
// Check if the booking is cancelled
|
||||
switch ($bookings->status->value()) {
|
||||
case 'cancelled':
|
||||
throw new \Exception('Booking is cancelled');
|
||||
break;
|
||||
case 'completed':
|
||||
throw new \Exception('Booking is completed');
|
||||
break;
|
||||
case 'pending':
|
||||
break;
|
||||
default:
|
||||
throw new \Exception('Booking status is unknown, expected cancelled, completed or pending');
|
||||
break;
|
||||
}
|
||||
// Generate the wash certificate
|
||||
$bookings->completeWashWithoutWashCertificate(
|
||||
$bookings->id,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function afterSubmit(): void
|
||||
{
|
||||
// TODO: Implement afterSubmit() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function setup(): void
|
||||
{
|
||||
self::setFormIdentifier('COMPLETE_BOOKING_WITHOUT_WASH_CERTIFICATE');
|
||||
self::setFormName('Bekræft vask');
|
||||
self::setFormDescription('Bekræft vask af booking');
|
||||
self::setSubmitButtonText('Bekræft vask');
|
||||
// Set the form fields
|
||||
self::defineInputFieldsAdvanced([
|
||||
'booking_id' => [
|
||||
'description' => 'Booking ID er det unikke ID for den booking, du vil oprette et vaskecertifikat til.',
|
||||
'required' => true,
|
||||
'placeholder' => 'Indtast booking ID',
|
||||
'label' => 'Booking ID',
|
||||
'help' => 'Dette er det unikke ID for den booking, du vil oprette et vaskecertifikat til.',
|
||||
'error' => 'Du skal indtaste et gyldigt booking ID.',
|
||||
'validation_method' => 'validateBookingId',
|
||||
],
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
namespace forms\objects;
|
||||
|
||||
use forms\form_helper_c;
|
||||
use objects\bookings_new_o;
|
||||
use objects\bookings_o;
|
||||
use traits\form_t;
|
||||
|
||||
class generate_booking_wash_certificate_f extends form_helper_c
|
||||
@@ -37,21 +37,21 @@ class generate_booking_wash_certificate_f extends form_helper_c
|
||||
public function beforeSave(): void
|
||||
{
|
||||
// Get the booking from the booking id
|
||||
$bookings_new = new bookings_new_o();
|
||||
$bookings_new->select(self::getSanitizedData('booking_id'));
|
||||
$bookings = new bookings_o();
|
||||
$bookings->select(self::getSanitizedData('booking_id'));
|
||||
// Check if the user has access to the booking
|
||||
self::restrictAccessDepartment($bookings_new->department->value());
|
||||
self::restrictAccessDepartment($bookings->department->value());
|
||||
// Check if the user has access to issue wash certificates
|
||||
self::requirePermission(
|
||||
'issue_wash_certificates',
|
||||
'User does not have access to issue wash certificates',
|
||||
);
|
||||
// Set the department id to the department id of the user
|
||||
self::setDepartmentId($bookings_new->department->value());
|
||||
self::setDepartmentId($bookings->department->value());
|
||||
// Set the customer number to the customer number of the user
|
||||
self::setCustomerNumber($bookings_new->customer_number->value());
|
||||
self::setCustomerNumber($bookings->customer_number->value());
|
||||
// Check if the booking is cancelled
|
||||
switch ($bookings_new->status->value()) {
|
||||
switch ($bookings->status->value()) {
|
||||
case 'cancelled':
|
||||
throw new \Exception('Booking is cancelled');
|
||||
break;
|
||||
@@ -64,11 +64,24 @@ class generate_booking_wash_certificate_f extends form_helper_c
|
||||
throw new \Exception('Booking status is unknown, expected cancelled, completed or pending');
|
||||
break;
|
||||
}
|
||||
try {
|
||||
$safety_seal = (int)self::getSanitizedData('safety_seal');
|
||||
} catch (\Exception $e) {
|
||||
$safety_seal = null;
|
||||
}
|
||||
try {
|
||||
$operator = (string)self::getSanitizedData('operator');
|
||||
} catch (\Exception $e) {
|
||||
$operator = null;
|
||||
}
|
||||
// Generate the wash certificate
|
||||
$bookings_new->generateWashCertificate(
|
||||
self::getSanitizedData('safety_seal'),
|
||||
self::getSanitizedData('operator'),
|
||||
$bookings->generateWashCertificate(
|
||||
$safety_seal,
|
||||
$operator,
|
||||
);
|
||||
// Mark the booking as completed
|
||||
$bookings->status->set('completed');
|
||||
$bookings->washCertificateStatus->set('completed');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -110,11 +123,11 @@ class generate_booking_wash_certificate_f extends form_helper_c
|
||||
'default' => '',
|
||||
],
|
||||
'operator' => [
|
||||
'description' => 'En operatør er en person, der arbejder med køretøjet.',
|
||||
'description' => 'Operatøren er den person, der har vasket køretøjet. Dette felt er valgfrit.',
|
||||
'required' => false,
|
||||
'placeholder' => 'Indtast operatør',
|
||||
'label' => 'Operatør',
|
||||
'help' => 'Dette er en operatør, der arbejder med køretøjet.',
|
||||
'label' => 'Vognvasker',
|
||||
'help' => 'Dette er navnet på den person, der har vasket køretøjet.',
|
||||
'error' => 'Du skal indtaste en gyldig operatør.',
|
||||
'validation_method' => 'validateString',
|
||||
'default' => '',
|
||||
|
||||
@@ -38,23 +38,23 @@ class wash_certificate extends html2pdf_template
|
||||
/** Add the signature */
|
||||
//$html .= self::getSignature();
|
||||
$html .= self::setDocumentFields(
|
||||
'123',
|
||||
self::getKey('booking_number') ?: '-',
|
||||
self::getKey('time') . ' ' . self::getKey('date'),
|
||||
self::getKey('carried_out_by'),
|
||||
self::getKey('seal_number'),
|
||||
self::getKey('carried_out_by') ?: '-',
|
||||
self::getKey('seal_number') ?: '-',
|
||||
);
|
||||
$html .= self::setDocumentRegistrationNumberFields(
|
||||
self::getKey('reg_1'),
|
||||
self::getKey('reg_2'),
|
||||
self::getKey('reg_1') ?: '-',
|
||||
self::getKey('reg_2') ?: '-',
|
||||
);
|
||||
$html .= self::setDocumentCustomerSupplierFields(
|
||||
[
|
||||
self::getKey('customer_name'),
|
||||
self::getKey('customer_address'),
|
||||
self::getKey('customer_name') ?: '-',
|
||||
self::getKey('customer_address') ?: '-',
|
||||
],
|
||||
[
|
||||
self::getKey('department_name'),
|
||||
self::getKey('department_address'),
|
||||
self::getKey('department_name') ?: '-',
|
||||
self::getKey('department_address') ?: '-',
|
||||
],
|
||||
);
|
||||
$html .= self::setSignatureField(
|
||||
|
||||
@@ -4,6 +4,7 @@ namespace objects;
|
||||
|
||||
use classes\db;
|
||||
use classes\object_property;
|
||||
use classes\pdf_generator;
|
||||
use classes\response;
|
||||
use classes\slack;
|
||||
use classes\wash_certificate_store;
|
||||
@@ -28,6 +29,7 @@ class bookings_o extends db
|
||||
public object_property $notes;
|
||||
public object_property $washCertificateStatus;
|
||||
public object_property $washCertificateUrl;
|
||||
public object_property $wash_certificate_pdf;
|
||||
public object_property $status;
|
||||
public object_property $data;
|
||||
|
||||
@@ -98,6 +100,7 @@ class bookings_o extends db
|
||||
$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->wash_certificate_pdf = new object_property($this->table, $this->id, 'wash_certificate_pdf', '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);
|
||||
}
|
||||
@@ -343,6 +346,93 @@ class bookings_o extends db
|
||||
$db->query($sql);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a wash certificate
|
||||
* @param int|null $safety_seal The safety seal number
|
||||
* @param string|null $operator The operator name
|
||||
* @throws Exception If the object is not selected
|
||||
* @throws Exception If the booking already has a wash certificate
|
||||
*/
|
||||
public function generateWashCertificate(int|null $safety_seal = null, string|null $operator = null): void
|
||||
{
|
||||
self::requireSelected();
|
||||
// Check if the booking already has a wash certificate
|
||||
if ($this->hasWashCertificate()) {
|
||||
throw new Exception('Booking already has a wash certificate');
|
||||
}
|
||||
// Generate the wash certificate
|
||||
// Get the department from the booking
|
||||
$department = (new departments_o())->select((int)$this->department->value());
|
||||
if (!$department->exists()) {
|
||||
throw new Exception('Department not found');
|
||||
}
|
||||
// Get the branding from the department
|
||||
$branding = (new branding_o())->select((int)$department->branding->value());
|
||||
if (!$branding->exists()) {
|
||||
throw new Exception('Branding not found');
|
||||
}
|
||||
// Get the customer from the booking
|
||||
$customer = (new users_o())->getUserByCustomerNumber((int)$this->customer_number->value());
|
||||
$department_array = $department->asArray();
|
||||
$customer_array = $customer->asArray();
|
||||
$booking_array = self::asArray();
|
||||
$department_array['branding'] = $branding->asArray();
|
||||
//print_r($department_array);
|
||||
//print_r($customer_array);
|
||||
//print_r($booking_array);
|
||||
$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([
|
||||
'booking_number' => $this->id,
|
||||
'seal_number' => ($safety_seal ?? null),
|
||||
'reg_1' => $booking_array['regNrTraekker'],
|
||||
'reg_2' => $booking_array['regNrTrailer'],
|
||||
'date' => date('d-m-Y'),
|
||||
'time' => date('H:i'),
|
||||
'carried_out_by' => ($operator ?? null),
|
||||
'department_id' => $department->id,
|
||||
'department_name' => $department_array['branding']['name'] ?: $department_array['name'],
|
||||
'department_address' => $department_array['branding']['address'] ?: $department_array['description'],
|
||||
'customer_name' => $customer->getCustomerName($customer_array['customer_number']),
|
||||
'customer_address' => $customer->getCustomerEcocomicData($customer_array['customer_number'])->economic_customer->address ?: '-',
|
||||
'type' => $booking_array['wash_type'],
|
||||
])
|
||||
->getHtml()
|
||||
);
|
||||
$pdf_path = $pdf_generator->generate_pdf();
|
||||
// Set the PDF in the booking
|
||||
$this->wash_certificate_pdf->set($pdf_path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the booking has a wash certificate
|
||||
* @throws Exception If the object is not selected
|
||||
*/
|
||||
public function hasWashCertificate(): bool
|
||||
{
|
||||
self::requireSelected();
|
||||
// Check if the booking has a wash certificate
|
||||
if ($this->wash_certificate_pdf->value() !== null) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws Exception If the object is not selected
|
||||
*/
|
||||
@@ -364,6 +454,7 @@ class bookings_o extends db
|
||||
'notes' => $this->notes->value(),
|
||||
'washCertificateStatus' => $this->washCertificateStatus->value(),
|
||||
'washCertificateUrl' => $this->washCertificateUrl->value(),
|
||||
'wash_certificate_pdf' => $this->wash_certificate_pdf->value(),
|
||||
'status' => $this->status->value(),
|
||||
'data' => $this->data->value() ? json_decode($this->data->value(), true) : null,
|
||||
];
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace routes;
|
||||
|
||||
use classes\authentication;
|
||||
use classes\pdf_store;
|
||||
use classes\response;
|
||||
use classes\wash_certificate_store;
|
||||
use objects\bookings_o;
|
||||
@@ -273,6 +274,67 @@ class bookingsRoute
|
||||
]
|
||||
);
|
||||
|
||||
$this->get('/bookings/download_pdf', function () {
|
||||
// Require the user to be logged in
|
||||
global /** @var response $response */
|
||||
$response;
|
||||
// Check if the user has access to the department
|
||||
$this->requirePermission('download_own_wash_certificate');
|
||||
// Get the user object
|
||||
$user = (new authentication())->get_user();
|
||||
// Check if the request was successful
|
||||
if (!$user->exists()) {
|
||||
$response->error('User not found', 400);
|
||||
}
|
||||
self::requireParameters(['id']);
|
||||
$id = (int)$this->getParameter('id');
|
||||
self::requireType(
|
||||
$id,
|
||||
self::type_int()
|
||||
);
|
||||
self::requireMinValue($id, 1);
|
||||
self::requireSameLength(
|
||||
$id,
|
||||
self::getParameter('id'),
|
||||
);
|
||||
// Make sure the user is allowed to download the wash certificate
|
||||
if (!$user->hasAccessToBooking($id)) {
|
||||
$response->error('You are not allowed to download this wash certificate', 400);
|
||||
}
|
||||
$bookings = (new bookings_o())->select((int)$id);
|
||||
if (!$bookings->exists()) {
|
||||
$response->error('Booking not found', 404);
|
||||
}
|
||||
// Check if the booking has a wash certificate
|
||||
if (!empty($bookings->wash_certificate_pdf->value())) {
|
||||
// The booking has a wash certificate, so we can proceed
|
||||
$pdf_storage = new pdf_store();
|
||||
// Check if the wash certificate exists.
|
||||
if (!$pdf_storage->doesObjectExist($bookings->wash_certificate_pdf->value())) {
|
||||
$response->error('Wash certificate not found, but it should exist', 500);
|
||||
}
|
||||
// Generate the download link
|
||||
$response->success(
|
||||
["link" => $pdf_storage->getPresignedUrl($bookings->wash_certificate_pdf->value())]
|
||||
);
|
||||
} else {
|
||||
// Check if the certificate is stored in the other bucket
|
||||
$wash_certificate_storage = new wash_certificate_store();
|
||||
// Check if the wash certificate exists.
|
||||
if (!$wash_certificate_storage->washCertificateExists($bookings->id)) {
|
||||
$response->error('No wash certificate found for this booking', 404);
|
||||
}
|
||||
// Generate the download link
|
||||
$response->success(
|
||||
["link" => $wash_certificate_storage->getWashCertificateDownload($bookings->id)]
|
||||
);
|
||||
}
|
||||
},
|
||||
[
|
||||
'download_own_wash_certificate' => 'Download the wash certificate for a booking'
|
||||
]
|
||||
);
|
||||
|
||||
$this->post('/admin/bookings/delete', function () {
|
||||
// Require the user to be logged in
|
||||
global /** @var response $response */
|
||||
|
||||
@@ -24,6 +24,31 @@ class pdfGeneratorRoute
|
||||
global $response;
|
||||
//self::requirePermission('modules_pdf_generator_test');
|
||||
if (true) {
|
||||
// Check if the required parameters are present
|
||||
self::requireParameters([
|
||||
'id',
|
||||
]);
|
||||
$id = (int)self::getParameter('id');
|
||||
self::requireType($id, self::type_int());
|
||||
self::requireMinValue($id, 1);
|
||||
// Check if the operator is set
|
||||
if (self::isParametersSet(['operator'])) {
|
||||
self::requireParameters([
|
||||
'operator',
|
||||
]);
|
||||
$operator = self::getParameter('operator');
|
||||
self::requireType($operator, self::type_string());
|
||||
self::requireMinLength('operator', 1);
|
||||
}
|
||||
// Check if the safety seal / plom number is set
|
||||
if (self::isParametersSet(['safety_seal'])) {
|
||||
self::requireParameters([
|
||||
'safety_seal',
|
||||
]);
|
||||
$safety_seal = (int)self::getParameter('safety_seal');
|
||||
self::requireType($safety_seal, self::type_int());
|
||||
self::requireMinValue($safety_seal, 1);
|
||||
}
|
||||
//(new logs_o())->add('orderInvoices', 'global', 1, $user->id, 'LIST_COLLECTED_INVOICES', 'User accessed the list of collected order invoices');
|
||||
// Get the booking from its ID
|
||||
$id = 434;
|
||||
@@ -68,12 +93,13 @@ class pdfGeneratorRoute
|
||||
],
|
||||
])
|
||||
->addData([
|
||||
'seal_number' => 123456,
|
||||
'booking_number' => $booking->id,
|
||||
'seal_number' => ($safety_seal ?? null),
|
||||
'reg_1' => $booking_array['regNrTraekker'],
|
||||
'reg_2' => $booking_array['regNrTrailer'],
|
||||
'date' => $booking_array['date'],
|
||||
'time' => date('H:i'),
|
||||
'carried_out_by' => 'John Doe',
|
||||
'carried_out_by' => ($operator ?? null),
|
||||
'department_id' => $department->id,
|
||||
'department_name' => $department_array['branding']['name'] ?: $department_array['name'],
|
||||
'department_address' => $department_array['branding']['address'] ?: $department_array['description'],
|
||||
@@ -84,6 +110,8 @@ class pdfGeneratorRoute
|
||||
->getHtml()
|
||||
);
|
||||
$pdf_path = $pdf_generator->generate_pdf();
|
||||
// Set the PDF in the booking
|
||||
$booking->wash_certificate_pdf->set($pdf_path);
|
||||
$response->success([
|
||||
'pdf_path' => $pdf_path,
|
||||
'message' => 'PDF generated successfully',
|
||||
|
||||
@@ -48,6 +48,15 @@ trait route_t
|
||||
return true;
|
||||
}
|
||||
|
||||
public function requireSameLength(mixed $arg1, mixed $arg2): bool
|
||||
{
|
||||
global $response;
|
||||
if (strlen($arg1) !== strlen($arg2)) {
|
||||
$response->error('Invalid length. Expected: ' . strlen($arg2) . ' Got: ' . strlen($arg1), 400);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Require parameter to be one of the given types
|
||||
* @param mixed $value The value to check
|
||||
|
||||
Reference in New Issue
Block a user