HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux Bradford-Sitios 6.14.0-1017-azure #17~24.04.1-Ubuntu SMP Mon Dec 1 20:10:50 UTC 2025 x86_64
User: www-data (33)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/api_matriculas/app/Http/Requests/Configuration/StoreOrUpdateConfigurationRequest.php
<?php

namespace App\Http\Requests\Configuration;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Validation\Rule;

class StoreOrUpdateConfigurationRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'code' => [
                'required',
                Rule::exists('configurations', 'code'),
            ],
            'data' => 'required',
        ];
    }

    public function messages()
    {
        return [
            'code.required' => 'Configuración requerida',
            'code.exists'   => 'Configuración no encontrada',
            'data.required' => 'Data de Configuración requerida',
        ];
    }

    public function withValidator(Validator $validator)
    {
        $validator->after(function ($validator) {
            if ($validator->errors()->any()) {
                return;
            }

            $code = $this->input('code');
            $encodedData = $this->input('data');
            $config = json_decode(base64_decode($encodedData), true);

            if (empty($config)) {
                $validator->errors()->add('data', 'Los datos de configuración no son válidos.');
                return;
            }

            $configRules = $this->getConfigRules($code);
            if (empty($configRules['rules'])) {
                return;
            }

            $configValidator = \Illuminate\Support\Facades\Validator::make(
                $config,
                $configRules['rules'],
                $configRules['messages']
            );

            if ($configValidator->fails()) {
                foreach ($configValidator->errors()->all() as $error) {
                    $validator->errors()->add('config', $error);
                }
            }
        });
    }

    private function getConfigRules(string $code): array
    {
        switch ($code) {
            case 'contract_template':
                return [
                    'rules' => [
                        'template' => 'required|string',
                    ],
                    'messages' => [
                        'template.string' => 'El Template del contrato es requerido.',
                    ],
                ];
            case 'general':
                return [
                    'rules' => [
                        'email'        => 'nullable|email|max:255',
                        'whatsapp'     => 'nullable|string|max:20',
                        'cae_title'    => 'required|string|max:150',
                        'cae_message'  => 'required|string|max:255',
                        'cfe_title'    => 'required|string|max:150',
                        'cfe_message'  => 'required|string|max:255',
                        'inactive_title'   => 'nullable|string|max:150',
                        'inactive_message' => 'nullable|string|max:255',
                        'enrollment_start_date' => 'nullable|date',
                        'enrollment_end_date'   => 'nullable|date|after_or_equal:enrollment_start_date',
                    ],
                    'messages' => [
                        'email.email'          => 'El email debe tener un formato válido.',
                        'email.max'            => 'El email no puede exceder 255 caracteres.',
                        'whatsapp.string'      => 'El whatsapp debe ser un texto.',
                        'whatsapp.max'         => 'El whatsapp no puede exceder 20 caracteres.',
                        'cae_title.required'   => 'El título CAE es obligatorio.',
                        'cae_title.string'     => 'El título CAE debe ser un texto.',
                        'cae_title.max'        => 'El título CAE no puede exceder 150 caracteres.',
                        'cae_message.required' => 'La descripción CAE es obligatorio.',
                        'cae_message.string'   => 'La descripción CAE debe ser un texto.',
                        'cae_message.max'      => 'La descripción CAE no puede exceder 255 caracteres.',
                        'cfe_title.required'   => 'El título CFE es obligatorio.',
                        'cfe_title.string'     => 'El título CFE debe ser un texto.',
                        'cfe_title.max'        => 'El título CFE no puede exceder 150 caracteres.',
                        'cfe_message.required' => 'La descripción CFE es obligatorio.',
                        'cfe_message.string'   => 'La descripción CFE debe ser un texto.',
                        'cfe_message.max'      => 'La descripción CFE no puede exceder 255 caracteres.',
                        'inactive_title.string'    => 'El título de alumno inactivo debe ser un texto.',
                        'inactive_title.max'       => 'El título de alumno inactivo no puede exceder 150 caracteres.',
                        'inactive_message.string'  => 'La descripción de alumno inactivo debe ser un texto.',
                        'inactive_message.max'     => 'La descripción de alumno inactivo no puede exceder 255 caracteres.',
                        'enrollment_start_date.date'        => 'La fecha de apertura debe ser una fecha válida.',
                        'enrollment_end_date.date'          => 'La fecha de cierre debe ser una fecha válida.',
                        'enrollment_end_date.after_or_equal' => 'La fecha de cierre debe ser posterior o igual a la fecha de apertura.',
                    ],
                ];
            case 'toku':
                return [
                    'rules' => [
                        'status'    => 'required|boolean',
                        'url_toku'  => 'required|string',
                        'api_token' => 'required|string',
                    ],
                    'messages' => [
                        'status.required'    => 'El estado del modal es obligatorio.',
                        'status.boolean'     => 'El estado del modal debe ser verdadero o falso.',
                        'url_toku.required'  => 'La URL de Toku es obligatoria.',
                        'url_toku.string'    => 'La URL de Toku debe ser texto.',
                        'api_token.required' => 'El API Token es obligatorio.',
                        'api_token.string'   => 'El API Token debe ser texto.',
                    ],
                ];
            case 'firmaki':
                return [
                    'rules' => [
                        'status'           => 'required|boolean',
                        'environment'      => 'required|string|in:production,integration',
                        'url_sandbox'      => 'required|string|url',
                        'url_production'   => 'required|string|url',
                        'api_key'          => 'required|string',
                        'email_account'    => 'required|email',
                        'password_account' => 'required|string|min:6',
                    ],
                    'messages' => [
                        'status.required'           => 'El estado es obligatorio.',
                        'status.boolean'            => 'El estado debe ser verdadero o falso.',
                        'environment.required'      => 'El entorno es obligatorio.',
                        'environment.string'        => 'El entorno debe ser texto.',
                        'environment.in'            => 'El entorno debe ser "production" o "integration".',
                        'url_sandbox.required'      => 'La URL del sandbox es obligatoria.',
                        'url_sandbox.string'        => 'La URL del sandbox debe ser texto.',
                        'url_sandbox.url'           => 'La URL del sandbox debe ser válida.',
                        'url_production.required'   => 'La URL de producción es obligatoria.',
                        'url_production.string'     => 'La URL de producción debe ser texto.',
                        'url_production.url'        => 'La URL de producción debe ser válida.',
                        'api_key.required'          => 'El API Key es obligatorio.',
                        'api_key.string'            => 'El API Key debe ser texto.',
                        'email_account.required'    => 'El correo de la cuenta es obligatorio.',
                        'email_account.email'       => 'El correo de la cuenta debe ser válido.',
                        'password_account.required' => 'La contraseña es obligatoria.',
                        'password_account.string'   => 'La contraseña debe ser texto.',
                        'password_account.min'      => 'La contraseña debe tener al menos :min caracteres.',
                    ],
                ];
            default:
                return ['rules' => [], 'messages' => []];
        }
    }

    protected function failedValidation(Validator $validator)
    {
        throw new HttpResponseException(
            genericResponse(['error' => implode(', ', $validator->errors()->all())], 400)
        );
    }
}