Files
desk-moloni/scripts/production_readiness_validator.sh
Emanuel Almeida c19f6fd9ee fix(perfexcrm module): align version to 3.0.1, unify entrypoint, and harden routes/views
- Bump DESK_MOLONI version to 3.0.1 across module
- Normalize hooks to after_client_* and instantiate PerfexHooks safely
- Fix OAuthController view path and API client class name
- Add missing admin views for webhook config/logs; adjust view loading
- Harden client portal routes and admin routes mapping
- Make Dashboard/Logs/Queue tolerant to optional model methods
- Align log details query with existing schema; avoid broken joins

This makes the module operational in Perfex (admin + client), reduces 404s,
and avoids fatal errors due to inconsistent tables/methods.
2025-09-11 17:38:45 +01:00

597 lines
20 KiB
Bash

#!/bin/bash
# Desk-Moloni v3.0 Production Readiness Validator
# Author: Descomplicar.pt
# Version: 3.0.0
# License: Commercial
set -e
# Color codes for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# Configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
MODULE_DIR="$(dirname "$SCRIPT_DIR")"
REPORT_FILE="/tmp/desk-moloni-production-readiness-$(date +%Y%m%d-%H%M%S).txt"
CRITICAL_FAILURES=0
HIGH_FAILURES=0
MEDIUM_FAILURES=0
LOW_FAILURES=0
# Functions
log() {
echo -e "${GREEN}[VALIDATE]${NC} $1" | tee -a "$REPORT_FILE"
}
critical() {
echo -e "${RED}[CRITICAL]${NC} $1" | tee -a "$REPORT_FILE"
((CRITICAL_FAILURES++))
}
high() {
echo -e "${RED}[HIGH]${NC} $1" | tee -a "$REPORT_FILE"
((HIGH_FAILURES++))
}
medium() {
echo -e "${YELLOW}[MEDIUM]${NC} $1" | tee -a "$REPORT_FILE"
((MEDIUM_FAILURES++))
}
low() {
echo -e "${BLUE}[LOW]${NC} $1" | tee -a "$REPORT_FILE"
((LOW_FAILURES++))
}
pass() {
echo -e "${GREEN}[PASS]${NC} $1" | tee -a "$REPORT_FILE"
}
# Production readiness banner
echo "========================================================================"
echo " DESK-MOLONI v3.0 PRODUCTION READINESS VALIDATOR"
echo "========================================================================"
echo "Validation Report: $REPORT_FILE"
echo "Validation Date: $(date)"
echo ""
log "Starting comprehensive production readiness validation..."
# 1. Module Structure Validation
echo ""
log "=== MODULE STRUCTURE VALIDATION ==="
# Check core files exist
CORE_FILES=(
"desk_moloni.php"
"composer.json"
"phpunit.xml"
"VERSION"
"README.md"
)
for file in "${CORE_FILES[@]}"; do
if [[ -f "$MODULE_DIR/$file" ]]; then
pass "Core file exists: $file"
else
critical "Missing core file: $file"
fi
done
# Check directory structure
CORE_DIRECTORIES=(
"assets"
"cli"
"config"
"controllers"
"database"
"docs"
"helpers"
"language"
"libraries"
"models"
"scripts"
"src"
"tests"
"views"
)
for dir in "${CORE_DIRECTORIES[@]}"; do
if [[ -d "$MODULE_DIR/$dir" ]]; then
pass "Core directory exists: $dir"
else
high "Missing core directory: $dir"
fi
done
# Check specific implementation files
IMPLEMENTATION_FILES=(
"libraries/Encryption.php"
"database/migrations/001_create_desk_moloni_tables.sql"
"config/config.php"
"cli/queue_processor.php"
"scripts/install.sh"
"scripts/security_audit.sh"
"scripts/performance_report.sh"
)
for file in "${IMPLEMENTATION_FILES[@]}"; do
if [[ -f "$MODULE_DIR/$file" ]]; then
pass "Implementation file exists: $file"
else
high "Missing implementation file: $file"
fi
done
# 2. Test Infrastructure Validation
echo ""
log "=== TEST INFRASTRUCTURE VALIDATION ==="
# Count test files
TEST_FILE_COUNT=$(find "$MODULE_DIR/tests" -name "*Test.php" 2>/dev/null | wc -l)
if [[ $TEST_FILE_COUNT -ge 20 ]]; then
pass "Test suite comprehensive: $TEST_FILE_COUNT test files"
elif [[ $TEST_FILE_COUNT -ge 10 ]]; then
medium "Test suite adequate: $TEST_FILE_COUNT test files"
else
high "Test suite insufficient: $TEST_FILE_COUNT test files (minimum 20 required)"
fi
# Check test categories
TEST_CATEGORIES=(
"tests/contract"
"tests/integration"
"tests/security"
"tests/performance"
"tests/unit"
"tests/database"
)
for category in "${TEST_CATEGORIES[@]}"; do
if [[ -d "$MODULE_DIR/$category" ]]; then
TEST_COUNT=$(find "$MODULE_DIR/$category" -name "*Test.php" | wc -l)
if [[ $TEST_COUNT -gt 0 ]]; then
pass "Test category implemented: $category ($TEST_COUNT tests)"
else
medium "Test category empty: $category"
fi
else
high "Missing test category: $category"
fi
done
# Validate PHPUnit configuration
if [[ -f "$MODULE_DIR/phpunit.xml" ]]; then
if grep -q "testsuites" "$MODULE_DIR/phpunit.xml"; then
pass "PHPUnit configuration includes test suites"
else
medium "PHPUnit configuration missing test suites"
fi
if grep -q "coverage" "$MODULE_DIR/phpunit.xml"; then
pass "PHPUnit configuration includes coverage reporting"
else
low "PHPUnit configuration missing coverage reporting"
fi
else
critical "PHPUnit configuration file missing"
fi
# 3. Security Implementation Validation
echo ""
log "=== SECURITY IMPLEMENTATION VALIDATION ==="
# Check encryption implementation
if [[ -f "$MODULE_DIR/libraries/Encryption.php" ]]; then
if grep -q "AES-256-GCM" "$MODULE_DIR/libraries/Encryption.php"; then
pass "Strong encryption algorithm implemented (AES-256-GCM)"
else
critical "Weak or missing encryption algorithm"
fi
if grep -q "random_bytes" "$MODULE_DIR/libraries/Encryption.php"; then
pass "Cryptographically secure random number generation"
else
high "Weak random number generation detected"
fi
else
critical "Encryption library missing"
fi
# Check OAuth implementation
OAUTH_FILES=$(find "$MODULE_DIR" -name "*.php" -exec grep -l "oauth\|OAuth" {} \; 2>/dev/null | wc -l)
if [[ $OAUTH_FILES -gt 0 ]]; then
pass "OAuth implementation found in $OAUTH_FILES files"
# Check for PKCE implementation
PKCE_IMPL=$(grep -r "code_challenge\|code_verifier" "$MODULE_DIR" --include="*.php" 2>/dev/null | wc -l)
if [[ $PKCE_IMPL -gt 0 ]]; then
pass "PKCE (Proof Key for Code Exchange) implemented"
else
medium "PKCE not implemented - consider for enhanced security"
fi
else
critical "OAuth implementation not found"
fi
# Check input validation
VALIDATION_PATTERNS=$(grep -r "filter_var\|htmlspecialchars\|strip_tags\|mysqli_real_escape_string" "$MODULE_DIR" --include="*.php" 2>/dev/null | wc -l)
if [[ $VALIDATION_PATTERNS -gt 10 ]]; then
pass "Comprehensive input validation implemented"
elif [[ $VALIDATION_PATTERNS -gt 5 ]]; then
medium "Basic input validation implemented"
else
high "Insufficient input validation"
fi
# Check for hardcoded secrets
HARDCODED_SECRETS=$(grep -r -i -E "(password|secret|key|token).*=.*['\"][^'\"]*['\"]" "$MODULE_DIR" --include="*.php" | grep -v "// " | grep -v "/\*" | wc -l)
if [[ $HARDCODED_SECRETS -gt 0 ]]; then
critical "Potential hardcoded secrets found: $HARDCODED_SECRETS instances"
else
pass "No hardcoded secrets detected"
fi
# 4. Performance and Scalability Validation
echo ""
log "=== PERFORMANCE AND SCALABILITY VALIDATION ==="
# Check for caching implementation
CACHING_IMPL=$(grep -r "cache\|redis" "$MODULE_DIR" --include="*.php" 2>/dev/null | wc -l)
if [[ $CACHING_IMPL -gt 5 ]]; then
pass "Caching strategy implemented"
elif [[ $CACHING_IMPL -gt 0 ]]; then
medium "Basic caching implemented"
else
high "No caching strategy detected"
fi
# Check queue implementation
if [[ -f "$MODULE_DIR/cli/queue_processor.php" ]]; then
pass "Queue processing system implemented"
# Check for queue management features
if grep -q "priority\|retry\|failed" "$MODULE_DIR/cli/queue_processor.php"; then
pass "Advanced queue features implemented"
else
medium "Basic queue implementation only"
fi
else
critical "Queue processing system missing"
fi
# Check database optimization
DB_MIGRATIONS=$(find "$MODULE_DIR/database/migrations" -name "*.sql" 2>/dev/null | wc -l)
if [[ $DB_MIGRATIONS -gt 0 ]]; then
pass "Database migration system implemented"
# Check for indexes in migrations
INDEX_COUNT=$(grep -i "INDEX\|KEY" "$MODULE_DIR/database/migrations/"*.sql 2>/dev/null | wc -l)
if [[ $INDEX_COUNT -gt 5 ]]; then
pass "Database indexes implemented for performance"
else
medium "Limited database optimization detected"
fi
else
critical "Database migration system missing"
fi
# 5. Code Quality Validation
echo ""
log "=== CODE QUALITY VALIDATION ==="
# Check for Composer dependencies
if [[ -f "$MODULE_DIR/composer.json" ]]; then
pass "Composer dependency management implemented"
# Check for development vs production dependencies
if grep -q "require-dev" "$MODULE_DIR/composer.json"; then
pass "Development dependencies separated"
else
low "No development dependencies separation"
fi
# Check for autoloading
if grep -q "autoload" "$MODULE_DIR/composer.json"; then
pass "Autoloading configuration present"
else
medium "Missing autoloading configuration"
fi
else
high "Composer dependency management missing"
fi
# Check code organization
PHP_FILE_COUNT=$(find "$MODULE_DIR" -name "*.php" | wc -l)
if [[ $PHP_FILE_COUNT -gt 20 ]]; then
pass "Comprehensive PHP implementation: $PHP_FILE_COUNT files"
elif [[ $PHP_FILE_COUNT -gt 10 ]]; then
medium "Adequate PHP implementation: $PHP_FILE_COUNT files"
else
high "Limited PHP implementation: $PHP_FILE_COUNT files"
fi
# Check for namespacing
NAMESPACE_USAGE=$(grep -r "namespace\|use " "$MODULE_DIR" --include="*.php" 2>/dev/null | wc -l)
if [[ $NAMESPACE_USAGE -gt 10 ]]; then
pass "Proper namespacing implemented"
elif [[ $NAMESPACE_USAGE -gt 0 ]]; then
medium "Basic namespacing implemented"
else
low "No namespacing detected"
fi
# 6. Documentation Validation
echo ""
log "=== DOCUMENTATION VALIDATION ==="
# Check for essential documentation
DOCUMENTATION_FILES=(
"README.md"
"docs/ADMINISTRATOR_GUIDE.md"
"docs/CLIENT_USER_GUIDE.md"
"docs/TROUBLESHOOTING_MANUAL.md"
"docs/MAINTENANCE_PROCEDURES.md"
)
for doc in "${DOCUMENTATION_FILES[@]}"; do
if [[ -f "$MODULE_DIR/$doc" ]]; then
FILE_SIZE=$(stat -c%s "$MODULE_DIR/$doc" 2>/dev/null || echo 0)
if [[ $FILE_SIZE -gt 1000 ]]; then
pass "Documentation complete: $doc ($(($FILE_SIZE / 1024))KB)"
else
medium "Documentation minimal: $doc"
fi
else
high "Missing documentation: $doc"
fi
done
# Check for code documentation
PHPDOC_COUNT=$(grep -r "@param\|@return\|@throws" "$MODULE_DIR" --include="*.php" 2>/dev/null | wc -l)
if [[ $PHPDOC_COUNT -gt 50 ]]; then
pass "Comprehensive code documentation"
elif [[ $PHPDOC_COUNT -gt 20 ]]; then
medium "Basic code documentation"
else
low "Limited code documentation"
fi
# 7. Configuration Management Validation
echo ""
log "=== CONFIGURATION MANAGEMENT VALIDATION ==="
# Check configuration structure
if [[ -d "$MODULE_DIR/config" ]]; then
CONFIG_FILES=$(find "$MODULE_DIR/config" -name "*.php" | wc -l)
if [[ $CONFIG_FILES -gt 0 ]]; then
pass "Configuration system implemented: $CONFIG_FILES config files"
else
medium "Configuration directory empty"
fi
else
high "Configuration directory missing"
fi
# Check for environment-specific configuration
ENV_CONFIG=$(grep -r "getenv\|env(" "$MODULE_DIR" --include="*.php" 2>/dev/null | wc -l)
if [[ $ENV_CONFIG -gt 0 ]]; then
pass "Environment-based configuration implemented"
else
medium "No environment-based configuration detected"
fi
# Check for configuration validation
CONFIG_VALIDATION=$(grep -r "config.*validation\|validate.*config" "$MODULE_DIR" --include="*.php" 2>/dev/null | wc -l)
if [[ $CONFIG_VALIDATION -gt 0 ]]; then
pass "Configuration validation implemented"
else
low "No configuration validation detected"
fi
# 8. Integration and Compatibility Validation
echo ""
log "=== INTEGRATION AND COMPATIBILITY VALIDATION ==="
# Check Perfex CRM integration hooks
HOOK_USAGE=$(grep -r "hooks()\|add_action\|add_filter" "$MODULE_DIR" --include="*.php" 2>/dev/null | wc -l)
if [[ $HOOK_USAGE -gt 5 ]]; then
pass "Comprehensive Perfex CRM integration"
elif [[ $HOOK_USAGE -gt 0 ]]; then
medium "Basic Perfex CRM integration"
else
critical "No Perfex CRM integration detected"
fi
# Check for menu integration
MENU_INTEGRATION=$(grep -r "app_menu\|sidebar" "$MODULE_DIR" --include="*.php" 2>/dev/null | wc -l)
if [[ $MENU_INTEGRATION -gt 0 ]]; then
pass "Admin menu integration implemented"
else
high "No admin menu integration"
fi
# Check for permission system integration
PERMISSION_USAGE=$(grep -r "has_permission\|tblpermissions" "$MODULE_DIR" --include="*.php" 2>/dev/null | wc -l)
if [[ $PERMISSION_USAGE -gt 0 ]]; then
pass "Permission system integration implemented"
else
high "No permission system integration"
fi
# 9. Client Portal Validation
echo ""
log "=== CLIENT PORTAL VALIDATION ==="
if [[ -d "$MODULE_DIR/client_portal" ]]; then
pass "Client portal directory exists"
# Check for Vue.js implementation
if [[ -f "$MODULE_DIR/client_portal/package.json" ]]; then
if grep -q "vue" "$MODULE_DIR/client_portal/package.json"; then
pass "Vue.js client portal implemented"
else
medium "Client portal missing Vue.js"
fi
else
medium "Client portal missing package.json"
fi
# Check for built assets
if [[ -d "$MODULE_DIR/client_portal/dist" ]]; then
ASSET_COUNT=$(find "$MODULE_DIR/client_portal/dist" -name "*.js" -o -name "*.css" | wc -l)
if [[ $ASSET_COUNT -gt 0 ]]; then
pass "Client portal assets built: $ASSET_COUNT files"
else
high "Client portal assets not built"
fi
else
high "Client portal build directory missing"
fi
else
high "Client portal not implemented"
fi
# 10. Deployment Readiness Validation
echo ""
log "=== DEPLOYMENT READINESS VALIDATION ==="
# Check for installation scripts
if [[ -f "$MODULE_DIR/scripts/install.sh" && -x "$MODULE_DIR/scripts/install.sh" ]]; then
pass "Installation script ready"
else
critical "Installation script missing or not executable"
fi
# Check for deployment documentation
if [[ -f "$MODULE_DIR/PRODUCTION_DEPLOYMENT_PACKAGE.md" ]]; then
pass "Deployment documentation available"
else
high "Deployment documentation missing"
fi
# Check for version tracking
if [[ -f "$MODULE_DIR/VERSION" ]]; then
VERSION=$(cat "$MODULE_DIR/VERSION")
if [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
pass "Version properly formatted: $VERSION"
else
medium "Version format irregular: $VERSION"
fi
else
medium "Version file missing"
fi
# Check for backup procedures
BACKUP_SCRIPTS=$(find "$MODULE_DIR/scripts" -name "*backup*" -o -name "*restore*" 2>/dev/null | wc -l)
if [[ $BACKUP_SCRIPTS -gt 0 ]]; then
pass "Backup procedures implemented"
else
medium "No backup procedures detected"
fi
# Calculate Production Readiness Score
echo ""
log "=== CALCULATING PRODUCTION READINESS SCORE ==="
TOTAL_CHECKS=100 # Approximate number of checks performed
TOTAL_FAILURES=$((CRITICAL_FAILURES + HIGH_FAILURES + MEDIUM_FAILURES + LOW_FAILURES))
PASS_COUNT=$((TOTAL_CHECKS - TOTAL_FAILURES))
READINESS_SCORE=$(((PASS_COUNT * 100) / TOTAL_CHECKS))
# Determine readiness status
if [[ $CRITICAL_FAILURES -gt 0 ]]; then
READINESS_STATUS="NOT READY"
READINESS_COLOR="${RED}"
elif [[ $HIGH_FAILURES -gt 5 ]]; then
READINESS_STATUS="NEEDS WORK"
READINESS_COLOR="${YELLOW}"
elif [[ $HIGH_FAILURES -gt 0 || $MEDIUM_FAILURES -gt 10 ]]; then
READINESS_STATUS="ALMOST READY"
READINESS_COLOR="${YELLOW}"
else
READINESS_STATUS="PRODUCTION READY"
READINESS_COLOR="${GREEN}"
fi
# Generate final report
echo ""
echo "┌─────────────────────────────────────────────────────────────────────────────┐" | tee -a "$REPORT_FILE"
echo "│ PRODUCTION READINESS VALIDATION REPORT │" | tee -a "$REPORT_FILE"
echo "├─────────────────────────────────────────────────────────────────────────────┤" | tee -a "$REPORT_FILE"
echo "│ Module: Desk-Moloni v3.0 │" | tee -a "$REPORT_FILE"
echo "│ Validation Date: $(date)" | tee -a "$REPORT_FILE"
echo "│ Report File: $REPORT_FILE" | tee -a "$REPORT_FILE"
echo "├─────────────────────────────────────────────────────────────────────────────┤" | tee -a "$REPORT_FILE"
printf "│ Readiness Score: %-8s │ Status: %-12s │ Total Checks: %-6s │\n" "${READINESS_SCORE}%" "$READINESS_STATUS" "$TOTAL_CHECKS" | tee -a "$REPORT_FILE"
echo "├─────────────────────────────────────────────────────────────────────────────┤" | tee -a "$REPORT_FILE"
printf "│ Critical Issues: %-6s │ High Issues: %-6s │ Medium Issues: %-6s │\n" "$CRITICAL_FAILURES" "$HIGH_FAILURES" "$MEDIUM_FAILURES" | tee -a "$REPORT_FILE"
printf "│ Low Issues: %-10s │ Pass Count: %-8s │ Fail Count: %-8s │\n" "$LOW_FAILURES" "$PASS_COUNT" "$TOTAL_FAILURES" | tee -a "$REPORT_FILE"
echo "└─────────────────────────────────────────────────────────────────────────────┘" | tee -a "$REPORT_FILE"
echo "" | tee -a "$REPORT_FILE"
# Production readiness recommendations
echo "PRODUCTION READINESS ASSESSMENT:" | tee -a "$REPORT_FILE"
echo "===============================" | tee -a "$REPORT_FILE"
if [[ $CRITICAL_FAILURES -gt 0 ]]; then
echo "🚨 CRITICAL: $CRITICAL_FAILURES critical issues must be resolved before production deployment" | tee -a "$REPORT_FILE"
echo " - Review and fix all critical security, functionality, and integration issues" | tee -a "$REPORT_FILE"
echo " - Complete missing core components" | tee -a "$REPORT_FILE"
echo " - Implement essential security measures" | tee -a "$REPORT_FILE"
fi
if [[ $HIGH_FAILURES -gt 0 ]]; then
echo "⚠️ HIGH: $HIGH_FAILURES high-priority issues should be addressed" | tee -a "$REPORT_FILE"
echo " - Enhance security implementations" | tee -a "$REPORT_FILE"
echo " - Complete missing documentation" | tee -a "$REPORT_FILE"
echo " - Improve test coverage" | tee -a "$REPORT_FILE"
fi
if [[ $MEDIUM_FAILURES -gt 0 ]]; then
echo "📋 MEDIUM: $MEDIUM_FAILURES medium-priority improvements recommended" | tee -a "$REPORT_FILE"
echo " - Enhance performance optimizations" | tee -a "$REPORT_FILE"
echo " - Improve code documentation" | tee -a "$REPORT_FILE"
echo " - Add monitoring capabilities" | tee -a "$REPORT_FILE"
fi
if [[ "$READINESS_STATUS" == "PRODUCTION READY" ]]; then
echo "✅ EXCELLENT: Module is production ready!" | tee -a "$REPORT_FILE"
echo " - All critical requirements met" | tee -a "$REPORT_FILE"
echo " - Security standards implemented" | tee -a "$REPORT_FILE"
echo " - Documentation complete" | tee -a "$REPORT_FILE"
echo " - Testing infrastructure in place" | tee -a "$REPORT_FILE"
fi
echo "" | tee -a "$REPORT_FILE"
echo "NEXT STEPS:" | tee -a "$REPORT_FILE"
echo "1. Address all critical and high-priority issues" | tee -a "$REPORT_FILE"
echo "2. Perform final security audit" | tee -a "$REPORT_FILE"
echo "3. Complete performance testing" | tee -a "$REPORT_FILE"
echo "4. Prepare production deployment plan" | tee -a "$REPORT_FILE"
echo "5. Schedule go-live activities" | tee -a "$REPORT_FILE"
echo ""
echo "========================================================================"
echo -e "Production readiness validation completed!"
echo -e "Readiness Status: ${READINESS_COLOR}$READINESS_STATUS${NC}"
echo -e "Score: $READINESS_SCORE% | Critical: $CRITICAL_FAILURES | High: $HIGH_FAILURES | Medium: $MEDIUM_FAILURES"
echo "Report saved to: $REPORT_FILE"
echo "========================================================================"
# Exit with appropriate code
if [[ $CRITICAL_FAILURES -gt 0 ]]; then
exit 1
elif [[ $HIGH_FAILURES -gt 5 ]]; then
exit 2
else
exit 0
fi