From 0aa423e90e08e0eb125959314006eb2623b37c68 Mon Sep 17 00:00:00 2001 From: ncoronel Date: Mon, 24 Aug 2026 16:42:38 -0300 Subject: [PATCH] feat(sales): validate PDF timezone parameter --- .../AdminAppSaleModificationPdfRequest.php | 22 ++++++++ .../Sale/Requests/AdminAppSalePdfRequest.php | 17 ++++++ app/Domains/Shared/Rules/ValidTimezone.php | 24 ++++++++ lang/en/validation.php | 2 + lang/es/validation.php | 2 + .../Unit/Sale/AdminAppSalePdfRequestTest.php | 55 +++++++++++++++++++ 6 files changed, 122 insertions(+) create mode 100644 app/Domains/Sale/Requests/AdminAppSaleModificationPdfRequest.php create mode 100644 app/Domains/Sale/Requests/AdminAppSalePdfRequest.php create mode 100644 app/Domains/Shared/Rules/ValidTimezone.php create mode 100644 tests/Unit/Sale/AdminAppSalePdfRequestTest.php diff --git a/app/Domains/Sale/Requests/AdminAppSaleModificationPdfRequest.php b/app/Domains/Sale/Requests/AdminAppSaleModificationPdfRequest.php new file mode 100644 index 0000000..db42725 --- /dev/null +++ b/app/Domains/Sale/Requests/AdminAppSaleModificationPdfRequest.php @@ -0,0 +1,22 @@ +> */ + public function rules(): array + { + return [ + 'timezone' => ['required', 'string', new ValidTimezone], + ]; + } +} diff --git a/app/Domains/Sale/Requests/AdminAppSalePdfRequest.php b/app/Domains/Sale/Requests/AdminAppSalePdfRequest.php new file mode 100644 index 0000000..2b6dbdd --- /dev/null +++ b/app/Domains/Sale/Requests/AdminAppSalePdfRequest.php @@ -0,0 +1,17 @@ +> */ + public function rules(): array + { + return [ + ...parent::rules(), + 'timezone' => ['required', 'string', new ValidTimezone], + ]; + } +} diff --git a/app/Domains/Shared/Rules/ValidTimezone.php b/app/Domains/Shared/Rules/ValidTimezone.php new file mode 100644 index 0000000..ead73f0 --- /dev/null +++ b/app/Domains/Shared/Rules/ValidTimezone.php @@ -0,0 +1,24 @@ + 'The :attribute field is required when :values is present.', 'required_without' => 'The :attribute field is required when :values is not present.', 'string' => 'The :attribute must be a string.', + 'timezone' => 'The timezone sent by the browser is invalid.', 'unique' => 'The :attribute has already been taken.', 'url' => 'The :attribute must be a valid URL.', 'uuid' => 'The :attribute must be a valid UUID.', @@ -52,6 +53,7 @@ return [ 'password_confirmation' => 'password confirmation', 'telefono' => 'phone number', 'tenant_codigo' => 'tenant', + 'timezone' => 'timezone', 'variant_id' => 'variant', ], ]; diff --git a/lang/es/validation.php b/lang/es/validation.php index 694b7fe..e303b7e 100644 --- a/lang/es/validation.php +++ b/lang/es/validation.php @@ -37,6 +37,7 @@ return [ 'required_with' => 'El campo :attribute es obligatorio cuando :values está presente.', 'required_without' => 'El campo :attribute es obligatorio cuando :values no está presente.', 'string' => ':Attribute debe ser texto.', + 'timezone' => 'La zona horaria enviada por el navegador no es válida.', 'unique' => 'El :attribute ya está en uso.', 'url' => ':Attribute debe ser una URL válida.', 'uuid' => ':Attribute debe ser un UUID válido.', @@ -52,6 +53,7 @@ return [ 'password_confirmation' => 'confirmación de contraseña', 'telefono' => 'teléfono', 'tenant_codigo' => 'tenant', + 'timezone' => 'zona horaria', 'variant_id' => 'variante', ], ]; diff --git a/tests/Unit/Sale/AdminAppSalePdfRequestTest.php b/tests/Unit/Sale/AdminAppSalePdfRequestTest.php new file mode 100644 index 0000000..4852211 --- /dev/null +++ b/tests/Unit/Sale/AdminAppSalePdfRequestTest.php @@ -0,0 +1,55 @@ +assertTrue(Validator::make([ + 'timezone' => 'America/Argentina/Buenos_Aires', + ], $request->rules())->passes()); + + $this->assertTrue(Validator::make([ + 'timezone' => 'America/Buenos_Aires', + ], $request->rules())->passes()); + + $this->assertFalse(Validator::make([ + 'timezone' => 'Invalid/Timezone', + ], $request->rules())->passes()); + + $this->assertFalse(Validator::make([], $request->rules())->passes()); + } + } + + public function test_invalid_timezone_message_uses_the_application_locale(): void + { + $request = new AdminAppSalePdfRequest; + + App::setLocale('es'); + $spanishValidator = Validator::make(['timezone' => 'Invalid/Timezone'], $request->rules()); + $this->assertSame( + 'La zona horaria enviada por el navegador no es válida.', + $spanishValidator->errors()->first('timezone'), + ); + + App::setLocale('en'); + $englishValidator = Validator::make(['timezone' => 'Invalid/Timezone'], $request->rules()); + $this->assertSame( + 'The timezone sent by the browser is invalid.', + $englishValidator->errors()->first('timezone'), + ); + } +}