403Webshell
Server IP : 65.108.144.40  /  Your IP : 216.73.217.165
Web Server : Apache/2.4.52 (Ubuntu)
System : Linux ubuntu-8gb-hel1-1 5.15.0-173-generic #183-Ubuntu SMP Fri Mar 6 13:29:34 UTC 2026 x86_64
User : dev ( 1000)
PHP Version : 8.2.30
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /var/www/html/project-slim/app/Validators/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/html/project-slim/app/Validators/ReportValidator.php
<?php

namespace App\Validators;

use App\Exceptions\ValidationException;

class ReportValidator extends BaseValidator
{
    private $validReportTypes = [
        'financial_summary', 'sales_report', 'user_activity', 'performance_metrics',
        'compliance_report', 'audit_log', 'custom_report', 'monthly_summary',
        'quarterly_review', 'annual_report'
    ];

    private $validFormats = ['pdf', 'excel', 'csv', 'json'];
    private $validFrequencies = ['daily', 'weekly', 'monthly', 'quarterly', 'yearly'];
    private $validStatuses = ['draft', 'processing', 'completed', 'failed', 'cancelled'];
    private $validPriorities = ['low', 'medium', 'high', 'urgent'];

    /**
     * Main validation method
     */
    public function validate(array $data): void
    {
        $this->data = $data;
        $this->clearErrors();
    }

    /**
     * Validate report generation data
     */
    public function validateGenerate(array $data): void
    {
        $this->data = $data;
        $this->clearErrors();

        // Required fields
        $this->required('type', 'Report type is required')
             ->in('type', $this->validReportTypes, 'Invalid report type');

        $this->required('company_id', 'Company ID is required')
             ->integer('company_id', 'Company ID must be a valid integer')
             ->min('company_id', 1, 'Company ID must be a positive number');

        // Optional date range validation
        if (isset($data['date_from']) && !empty($data['date_from'])) {
            $this->date('date_from', 'Y-m-d', 'Date from must be in YYYY-MM-DD format');
        }

        if (isset($data['date_to']) && !empty($data['date_to'])) {
            $this->date('date_to', 'Y-m-d', 'Date to must be in YYYY-MM-DD format');
        }

        // Validate date range logic
        if (isset($data['date_from']) && isset($data['date_to']) && 
            !empty($data['date_from']) && !empty($data['date_to'])) {
            $fromDate = \DateTime::createFromFormat('Y-m-d', $data['date_from']);
            $toDate = \DateTime::createFromFormat('Y-m-d', $data['date_to']);
            
            if ($fromDate && $toDate && $fromDate > $toDate) {
                $this->addError('date_from', 'Date from cannot be later than date to');
            }
        }

        if (isset($data['format'])) {
            $this->in('format', $this->validFormats, 'Invalid format. Must be one of: pdf, excel, csv, json');
        }

        if (isset($data['filters']) && !empty($data['filters'])) {
            if (!is_array($data['filters'])) {
                $this->addError('filters', 'Filters must be an array');
            }
        }

        if (isset($data['title']) && !empty($data['title'])) {
            $this->minLength('title', 3, 'Title must be at least 3 characters long')
                 ->maxLength('title', 100, 'Title must not exceed 100 characters');
        }

        if (isset($data['description']) && !empty($data['description'])) {
            $this->maxLength('description', 1000, 'Description cannot exceed 1000 characters');
        }

        $this->throwIfErrors('Report generation validation failed');
    }

    /**
     * Validate report update data
     */
    public function validateUpdate(array $data): void
    {
        $this->data = $data;
        $this->clearErrors();

        if (isset($data['title']) && !empty($data['title'])) {
            $this->minLength('title', 3, 'Title must be at least 3 characters long')
                 ->maxLength('title', 100, 'Title must not exceed 100 characters');
        }

        if (isset($data['description']) && !empty($data['description'])) {
            $this->maxLength('description', 1000, 'Description cannot exceed 1000 characters');
        }

        if (isset($data['status'])) {
            $this->in('status', $this->validStatuses, 'Invalid status. Must be one of: draft, processing, completed, failed, cancelled');
        }

        if (isset($data['priority'])) {
            $this->in('priority', $this->validPriorities, 'Invalid priority. Must be one of: low, medium, high, urgent');
        }

        if (isset($data['type'])) {
            $this->in('type', $this->validReportTypes, 'Invalid report type');
        }

        $this->throwIfErrors('Report update validation failed');
    }

    /**
     * Validate report scheduling data
     */
    public function validateSchedule(array $data): void
    {
        $this->data = $data;
        $this->clearErrors();

        // Required fields
        $this->required('type', 'Report type is required')
             ->in('type', $this->validReportTypes, 'Invalid report type');

        $this->required('company_id', 'Company ID is required')
             ->integer('company_id', 'Company ID must be a valid integer')
             ->min('company_id', 1, 'Company ID must be a positive number');

        $this->required('frequency', 'Frequency is required')
             ->in('frequency', $this->validFrequencies, 'Invalid frequency. Must be one of: daily, weekly, monthly, quarterly, yearly');

        // Optional date validation
        if (isset($data['start_date']) && !empty($data['start_date'])) {
            $this->date('start_date', 'Y-m-d', 'Start date must be in YYYY-MM-DD format');
            
            // Check if start date is not in the past
            $startDate = \DateTime::createFromFormat('Y-m-d', $data['start_date']);
            $today = new \DateTime('today');
            if ($startDate && $startDate < $today) {
                $this->addError('start_date', 'Start date cannot be in the past');
            }
        }

        if (isset($data['end_date']) && !empty($data['end_date'])) {
            $this->date('end_date', 'Y-m-d', 'End date must be in YYYY-MM-DD format');
        }

        // Validate date range logic
        if (isset($data['start_date']) && isset($data['end_date']) && 
            !empty($data['start_date']) && !empty($data['end_date'])) {
            $startDate = \DateTime::createFromFormat('Y-m-d', $data['start_date']);
            $endDate = \DateTime::createFromFormat('Y-m-d', $data['end_date']);
            
            if ($startDate && $endDate && $startDate > $endDate) {
                $this->addError('start_date', 'Start date cannot be later than end date');
            }
        }

        // Recipients validation
        if (isset($data['recipients']) && !empty($data['recipients'])) {
            if (!is_array($data['recipients'])) {
                $this->addError('recipients', 'Recipients must be an array');
            } else {
                foreach ($data['recipients'] as $index => $recipient) {
                    if (!filter_var($recipient, FILTER_VALIDATE_EMAIL)) {
                        $this->addError('recipients', "Invalid email address at index {$index}: {$recipient}");
                        break;
                    }
                }
            }
        }

        if (isset($data['is_active'])) {
            $this->boolean('is_active', 'Active status must be true or false');
        }

        $this->throwIfErrors('Report schedule validation failed');
    }

    /**
     * Validate report sharing data
     */
    public function validateShare(array $data): void
    {
        $this->data = $data;
        $this->clearErrors();

        // Required recipients field
        $this->required('recipients', 'Recipients are required');

        if (isset($data['recipients'])) {
            if (!is_array($data['recipients'])) {
                $this->addError('recipients', 'Recipients must be an array');
            } else {
                foreach ($data['recipients'] as $index => $recipient) {
                    if (!filter_var($recipient, FILTER_VALIDATE_EMAIL)) {
                        $this->addError('recipients', "Invalid email address at index {$index}: {$recipient}");
                        break;
                    }
                }
            }
        }

        if (isset($data['message']) && !empty($data['message'])) {
            $this->maxLength('message', 500, 'Message cannot exceed 500 characters');
        }

        if (isset($data['expires_at']) && !empty($data['expires_at'])) {
            // Validate datetime format
            $expiresAt = \DateTime::createFromFormat('Y-m-d H:i:s', $data['expires_at']);
            if (!$expiresAt || $expiresAt->format('Y-m-d H:i:s') !== $data['expires_at']) {
                $this->addError('expires_at', 'Invalid expires_at format. Use YYYY-MM-DD HH:MM:SS');
            } elseif ($expiresAt->getTimestamp() < time()) {
                $this->addError('expires_at', 'Expiration date cannot be in the past');
            }
        }

        if (isset($data['permissions']) && !empty($data['permissions'])) {
            if (!is_array($data['permissions'])) {
                $this->addError('permissions', 'Permissions must be an array');
            }
        }

        if (isset($data['include_charts'])) {
            $this->boolean('include_charts', 'Include charts option must be true or false');
        }

        if (isset($data['include_summary'])) {
            $this->boolean('include_summary', 'Include summary option must be true or false');
        }

        $this->throwIfErrors('Report sharing validation failed');
    }

    /**
     * Validate report search parameters
     */
    public function validateSearch(array $data): void
    {
        $this->data = $data;
        $this->clearErrors();

        if (isset($data['q']) && !empty($data['q'])) {
            $this->minLength('q', 2, 'Search query must be at least 2 characters long')
                 ->maxLength('q', 100, 'Search query must not exceed 100 characters');
        }

        if (isset($data['type']) && !empty($data['type'])) {
            $this->in('type', $this->validReportTypes, 'Invalid report type');
        }

        if (isset($data['status']) && !empty($data['status'])) {
            $this->in('status', $this->validStatuses, 'Invalid status');
        }

        if (isset($data['company_id'])) {
            $this->integer('company_id', 'Company ID must be a valid integer')
                 ->min('company_id', 1, 'Company ID must be a positive number');
        }

        if (isset($data['created_from']) && !empty($data['created_from'])) {
            $this->date('created_from', 'Y-m-d', 'Created from date must be in YYYY-MM-DD format');
        }

        if (isset($data['created_to']) && !empty($data['created_to'])) {
            $this->date('created_to', 'Y-m-d', 'Created to date must be in YYYY-MM-DD format');
        }

        if (isset($data['page'])) {
            $this->integer('page', 'Page must be a valid integer')
                 ->min('page', 1, 'Page must be at least 1');
        }

        if (isset($data['limit'])) {
            $this->integer('limit', 'Limit must be a valid integer')
                 ->min('limit', 1, 'Limit must be at least 1')
                 ->max('limit', 100, 'Limit must not exceed 100');
        }

        $this->throwIfErrors('Report search validation failed');
    }
}

Youez - 2016 - github.com/yon3zu
LinuXploit