diff --git a/services/nginx/app/classes/form.php b/services/nginx/app/classes/form.php index 8a6bccfe..04bff56d 100644 --- a/services/nginx/app/classes/form.php +++ b/services/nginx/app/classes/form.php @@ -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(); } /** diff --git a/services/nginx/app/modules/forms/objects/book_interior_wash_f.php b/services/nginx/app/modules/forms/objects/book_interior_wash_f.php deleted file mode 100644 index 0496e4ee..00000000 --- a/services/nginx/app/modules/forms/objects/book_interior_wash_f.php +++ /dev/null @@ -1,196 +0,0 @@ -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' => '', - ], - ]); - } -} \ No newline at end of file diff --git a/services/nginx/app/modules/forms/objects/book_wash_f.php b/services/nginx/app/modules/forms/objects/book_wash_f.php index 0355caa9..06ac4fba 100644 --- a/services/nginx/app/modules/forms/objects/book_wash_f.php +++ b/services/nginx/app/modules/forms/objects/book_wash_f.php @@ -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'), diff --git a/services/nginx/app/modules/forms/objects/complete_booking_f.php b/services/nginx/app/modules/forms/objects/complete_booking_f.php new file mode 100644 index 00000000..daad4d94 --- /dev/null +++ b/services/nginx/app/modules/forms/objects/complete_booking_f.php @@ -0,0 +1,103 @@ +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', + ], + ]); + } +} \ No newline at end of file diff --git a/services/nginx/app/modules/forms/objects/generate_booking_wash_certificate_f.php b/services/nginx/app/modules/forms/objects/generate_booking_wash_certificate_f.php index a1a21a1f..08200ab8 100644 --- a/services/nginx/app/modules/forms/objects/generate_booking_wash_certificate_f.php +++ b/services/nginx/app/modules/forms/objects/generate_booking_wash_certificate_f.php @@ -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' => '', diff --git a/services/nginx/app/modules/html2pdf/templates/wash_certificate.php b/services/nginx/app/modules/html2pdf/templates/wash_certificate.php index 8dfc5d0f..2696fc19 100644 --- a/services/nginx/app/modules/html2pdf/templates/wash_certificate.php +++ b/services/nginx/app/modules/html2pdf/templates/wash_certificate.php @@ -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( diff --git a/services/nginx/app/objects/bookings_o.php b/services/nginx/app/objects/bookings_o.php index 437ec2a6..5518c565 100644 --- a/services/nginx/app/objects/bookings_o.php +++ b/services/nginx/app/objects/bookings_o.php @@ -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, ]; diff --git a/services/nginx/app/routes/bookingsRoute.php b/services/nginx/app/routes/bookingsRoute.php index ef5b3f62..7ba87f09 100644 --- a/services/nginx/app/routes/bookingsRoute.php +++ b/services/nginx/app/routes/bookingsRoute.php @@ -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 */ diff --git a/services/nginx/app/routes/pdfGeneratorRoute.php b/services/nginx/app/routes/pdfGeneratorRoute.php index e462db4b..32f246a0 100644 --- a/services/nginx/app/routes/pdfGeneratorRoute.php +++ b/services/nginx/app/routes/pdfGeneratorRoute.php @@ -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', diff --git a/services/nginx/app/traits/route_t.php b/services/nginx/app/traits/route_t.php index 360a04b8..438c1624 100644 --- a/services/nginx/app/traits/route_t.php +++ b/services/nginx/app/traits/route_t.php @@ -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