Appearance
Software Settings
Overview
Software Settings control the core behavior, features, and modules of ZAL ULTRA. These settings affect data validation, UI display, logging, security, and enable/disable major system modules. Proper configuration is crucial for optimal system performance.
📋 Table of Contents
- Data Format Settings
- Display & UI Settings
- Google Maps Integration
- Module Management
- Logging & Debugging
- Import & Migration
- Network Security
Data Format Settings
Phone Format
Field Name: phone_formate
Type: Text Input
Required: Yes
Default: +880XXXXXXXXXX
Description
Defines the standard phone number format used throughout the entire system for subscribers, users, and SMS sending.
Format Patterns
X= Any digit (0-9)+= Country code prefix-= Separator (optional)
Examples by Country
Bangladesh: +880XXXXXXXXXX
USA: +1XXXXXXXXXX
India: +91XXXXXXXXXX
Pakistan: +92XXXXXXXXXX
Kenya: +254XXXXXXXXXSystem Impact
- Validation: All phone inputs validated against this format
- SMS Gateway: Numbers formatted before sending
- Display: Numbers shown in this format across all pages
- CSV Import: Import validates against this format
Phone Format Status
Field Name: phone_formate_status
Type: Toggle Switch (On/Off)
Default: Off
When Enabled (On)
- ✅ Phone numbers MUST match the defined format
- ✅ Invalid numbers rejected during creation/update
- ✅ Real-time validation in forms
When Disabled (Off)
- ⚠️ Numbers can be entered in any format
- ⚠️ May cause SMS delivery failures
Recommendation: Keep this ENABLED for data consistency.
Identity Format
Field Name: identity_formate
Type: Text Input
Required: Yes
Default: XXXXXXXXXX
Description
Defines the format for identity documents (National ID, Passport, etc.).
Format Patterns
X= Any digit (0-9)A= Any letter (A-Z, a-z)#= Any alphanumeric
Examples
Bangladesh NID (Old): XXXXXXXXXX (10 digits)
Bangladesh NID (New): XXXXXXXXXXXXX (13 digits)
Passport: AA####### (2 letters + 7 alphanumeric)Identity Format Status
Field Name: identity_formate_status
Type: Toggle Switch (On/Off)
Default: Off
Enables or disables strict identity number format validation.
Display & UI Settings
Page Loading Animation
Field Name: page_loading
Type: Dropdown Select
Options: spinner-message, spinner-logo, none
Default: spinner-message
Options
- spinner-message - Shows spinner with loading message
- spinner-logo - Shows spinner with company logo (better branding)
- none - No loading animation (fastest perceived performance)
Table View Type
Field Name: table_view_type
Type: Dropdown Select
Options: default, compact, comfortable
Default: default
Options
- default - Standard row height (balanced view)
- compact - Smaller rows (more data visible, recommended for 10,000+ records)
- comfortable - Larger rows (easier to read, better for data entry)
Applies To
All data tables: Subscriber list, User list, Invoice list, Payment list, Package list, etc.
Google Maps Integration
Google Map Status
Field Name: google_map_status
Type: Toggle Switch (On/Off)
Default: Off
When Enabled (On)
- ✅ Google Maps displayed on dashboard
- ✅ Subscriber locations shown with markers
- ✅ Click markers to view subscriber details
- ✅ Visual representation of subscriber distribution
When Disabled (Off)
- ❌ No map displayed
- ✅ No API calls (saves quota)
- ✅ Faster dashboard loading (~500ms faster)
Performance Impact
- Adds ~500ms to dashboard load time
- Loads up to 100 subscribers with valid coordinates
- Requires valid Google Maps API key
Google Map API Key
Field Name: google_map_api_key
Type: Text Input
Required: Yes (if Google Map Status is enabled)
How to Get API Key
- Go to Google Cloud Console
- Create project or select existing
- Enable "Maps JavaScript API"
- Create credentials → API Key
- Restrict API key to your domain
- Copy and paste key here
Security Best Practices
- ✅ Restrict API key to your domain only
- ✅ Enable only required APIs
- ✅ Set usage quotas to prevent abuse
- ✅ Monitor API usage regularly
Pricing
- Free Tier: 28,000 map loads per month
- Cost: $7 per 1,000 additional map loads
Module Management
These settings enable or disable entire modules. Disabling unused modules improves performance and simplifies the UI.
Inventory Module Status
Field Name: inventory_module_status
Type: Toggle Switch (On/Off)
Default: Off
When Enabled (On)
- ✅ Inventory menu visible
- ✅ Manage products, categories, stock levels
- ✅ Track purchase orders and sales
- ✅ Inventory reports available
Use Cases
- ISPs selling routers, cables, accessories
- Tracking hardware inventory
- Managing stock levels
Voucher Module Status
Field Name: voucher_module_status
Type: Toggle Switch (On/Off)
Default: Off
When Enabled (On)
- ✅ Generate voucher codes
- ✅ Hotspot card printing
- ✅ Batch voucher generation
- ✅ Voucher sales tracking
Use Cases
- Hotspot/WiFi businesses
- Prepaid internet cards
- Guest WiFi access
- Hotel/cafe WiFi
Prepaid Card Module Status
Field Name: prepaid_card_module_status
Type: Toggle Switch (On/Off)
Default: Off
When Enabled (On)
- ✅ Generate scratch cards
- ✅ Card recharge system
- ✅ Card sales tracking
- ✅ Batch card generation
Difference from Voucher
- Voucher: For internet access codes (one-time login)
- Prepaid Card: For balance recharge (add money to account)
Tickets Module Status
Field Name: tickets_module_status
Type: Toggle Switch (On/Off)
Default: Off
When Enabled (On)
- ✅ Support ticket system active
- ✅ Subscribers can create tickets
- ✅ Staff can respond to tickets
- ✅ Ticket status tracking
- ✅ Email notifications
Use Cases
- Customer support management
- Technical issue tracking
- Billing inquiries
- Service requests
Notices Module Status
Field Name: notices_module_status
Type: Toggle Switch (On/Off)
Default: Off
When Enabled (On)
- ✅ Create system-wide announcements
- ✅ Notices displayed on dashboard
- ✅ Scrolling notice ticker
- ✅ Target specific user types
Use Cases
- System maintenance announcements
- Payment reminders
- New feature announcements
- Holiday schedules
Department Module Status
Field Name: department_module_status
Type: Toggle Switch (On/Off)
Default: Off
When Enabled (On)
- ✅ Create departments (Sales, Support, Technical, etc.)
- ✅ Assign staff to departments
- ✅ Department-based reporting
- ✅ Department-wise permissions
Use Cases
- Large ISPs with multiple departments
- Organizing staff by function
- Team management
Logging & Debugging
CoA Request Log Status
Field Name: coa_request_log_status
Type: Toggle Switch (On/Off)
Default: Off
What is CoA?
CoA (Change of Authorization) is a RADIUS protocol feature (RFC 5176) that allows the server to send real-time commands to NAS (Network Access Server) to:
- Disconnect a user session immediately
- Change user bandwidth limits
- Update user policies
- Force re-authentication
When Enabled (On)
- ✅ All CoA requests are logged to database
- ✅ Log includes:
- Subscriber ID and username
- NAS IP address and port
- CoA command sent (Disconnect, CoA-Request)
- Response from NAS
- Success/failure status
- Timestamp
- ✅ Logs stored in
coa_requeststable - ✅ Viewable in Logs → CoA Logs menu
When Disabled (Off)
- ❌ CoA requests are NOT logged
- ✅ CoA functionality still works normally
- ✅ Better performance (no database writes)
System Impact
Database:
- Table:
coa_requests - Growth: ~100-1000 records per day
- Storage: ~1KB per record
Performance:
- Minimal impact (~5ms per CoA request)
- Recommended for debugging only
Code Location:
php
// File: app/Services/RadiusServices.php
// Lines: 474-480
if (isset($softwareSettings->coa_request_log_status) &&
$softwareSettings->coa_request_log_status == 1) {
$coa = new CoaRequest;
$coa->isp_id = $subscriber->isp_id;
$coa->subscriber_id = $subscriber->id;
$coa->nas_ip = $nasData->nas_ip;
$coa->command = 'Disconnect-Request';
$coa->save();
}Use Cases
- Debugging: Troubleshoot CoA failures
- Auditing: Track all CoA requests for compliance
- Monitoring: Identify NAS connectivity issues
- Support: Investigate subscriber complaints
Best Practice
- ✅ Enable during initial setup and testing
- ✅ Enable when troubleshooting connection issues
- ❌ Disable in production for better performance
- ✅ Periodically clean old logs (older than 30 days)
Failed Auto Renew Log Status
Field Name: failed_auto_renew_log_status
Type: Toggle Switch (On/Off)
Default: Off
CRITICAL SETTING
This is one of the MOST IMPORTANT settings for monitoring system health and revenue. ALWAYS KEEP ENABLED in production.
What is Auto Renew?
Auto Renew automatically renews subscriber packages when they expire, ensuring continuous service and revenue. It runs every minute via cron job.
When Enabled (On)
- ✅ All failed auto-renewal attempts are logged
- ✅ Log includes:
- Subscriber ID, username, and full name
- Package ID and name
- Failure reason (detailed)
- Subscriber balance
- Reseller balance
- Package price
- Discount amount
- Timestamp
- ✅ Logs stored in
auto_renew_failed_logstable - ✅ Viewable in Logs → Failed Auto Renew menu
When Disabled (Off)
- ❌ Failed attempts are NOT logged
- ⚠️ You will NOT know why renewals are failing
- ⚠️ Revenue loss cannot be tracked
Failure Reasons Logged
- Insufficient Subscriber Balance - Prepaid subscriber doesn't have enough balance
- Insufficient Reseller Balance - Reseller doesn't have enough balance (postpaid)
- Inactive Subscriber - Subscriber account is disabled
- Inactive Reseller - Reseller account is disabled
- Package Auto Renew Disabled - Package has auto-renew turned off
- Subscriber Auto Renew Disabled - Subscriber has auto-renew turned off
- Reseller Auto Renew Disabled - Reseller has auto-renew turned off
- Invalid Package Accounting - Package pricing not configured properly
- Package Validation Failed - Package data is invalid or missing
- Excessive Discount - Subscriber discount exceeds reseller profit margin
- Invoice Generation Failed - Error creating invoice
- Duplicate Activation - Already activated in last 2 minutes
- Too Frequent Invoice - Invoice created in last 2 minutes
- Invalid Data - Missing required subscriber or package data
System Impact
Database:
- Table:
auto_renew_failed_logs - Growth: Varies (0-1000+ records per day depending on issues)
- Storage: ~500 bytes per record
Performance:
- Minimal impact (~5ms per failed attempt)
- Only writes on failure (not on success)
Code Location:
php
// File: app/Services/Command/AutorenewServices.php
// Lines: 918-921
if (isset($softwareSettings->failed_auto_renew_log_status) &&
$softwareSettings->failed_auto_renew_log_status == 1) {
$failedLog = new AutoRenewFailedLog();
$failedLog->subscriber_id = $subscriberData->id;
$failedLog->failure_reason = $reason;
$failedLog->subscriber_balance = $subscriberBalance;
$failedLog->save();
}Use Cases
- Revenue Monitoring: Track revenue loss from failed renewals
- Troubleshooting: Identify why renewals are failing
- Customer Support: Explain to subscribers why renewal failed
- Financial Analysis: Calculate potential revenue loss
- Proactive Support: Contact subscribers before balance runs out
Revenue Impact Example
Scenario:
- 100 failed renewals per day
- Average package price: $10
- Monthly revenue loss: 100 × $10 × 30 = $30,000
With logging enabled:
- Identify issues quickly
- Contact subscribers proactively
- Recover 70% of failed renewals
- Recover $21,000 per monthBest Practice
- ✅ ALWAYS KEEP ENABLED in production
- ✅ Review logs daily to identify issues
- ✅ Set up alerts for high failure rates
- ✅ Clean old logs periodically (older than 90 days)
- ✅ Export logs monthly for analysis
Viewing Logs
- Go to Logs → Failed Auto Renew
- Filter by date range, subscriber, or failure reason
- Export to CSV for analysis
- Take action based on failure reasons
Import & Migration
Import from ZAL PRO Status
Field Name: import_from_zalpro_status
Type: Toggle Switch (On/Off)
Default: Off
What is ZAL PRO?
ZAL PRO is the previous version of this ISP management software. This feature allows you to migrate all your data from ZAL PRO to ZAL ULTRA.
When Enabled (On)
- ✅ Import menu visible in sidebar
- ✅ Can import subscribers from ZAL PRO
- ✅ CSV import templates for ZAL PRO format
- ✅ Data mapping and transformation tools
- ✅ Validation and error reporting
- ✅ Progress tracking
When Disabled (Off)
- ❌ Import features hidden
- ❌ Cannot import from ZAL PRO
What Can Be Imported?
Subscribers (46 fields)
- Personal information
- Contact details
- Network configuration
- Package assignments
- Expiration dates
- Location data (latitude/longitude)
- FTTH details
Packages - Package configurations and pricing
Users/Resellers - User accounts and hierarchy
Invoices - Historical invoices
RADIUS Data - radcheck, radreply, radusergroup
Import Process
- Export from ZAL PRO - Export data to CSV format
- Upload to ZAL ULTRA - Go to Subscribers → Import
- Select Options:
- Import Type: New or Update
- Process Type: Frontend (max 1000) or Backend (unlimited)
- Upload CSV - Select file and click Import
- Monitor Progress - Track import status
- Review Logs - Check for errors
System Impact
- Performance: Queue-based processing (no timeouts)
- Capacity: Can handle 10,000+ records
- Validation: Phone/identity format validation
- Duplicate Detection: Based on username
Best Practice
- ✅ Enable only during migration period
- ✅ Test with small dataset first (100 records)
- ✅ Backup database before import
- ✅ Use backend processing for large datasets
- ✅ Disable after migration is complete
Network Security
MAC Lock Mode Status
Field Name: mac_lock_mode_status
Type: Dropdown Select
Options: disabled, strict, flexible
Default: disabled
What is MAC Locking?
MAC (Media Access Control) locking restricts a subscriber's internet access to specific devices identified by their MAC address. This prevents:
- Account sharing between multiple users
- Unauthorized device usage
- Multiple simultaneous connections
- Revenue loss from account sharing
Options
1. Disabled
- ❌ No MAC address locking
- ✅ Subscribers can connect from any device
- ✅ Unlimited devices
- ⚠️ Account sharing possible
When to Use:
- Public WiFi hotspots
- Guest networks
- No security concerns
2. Strict Mode
- ✅ MAC address MUST be pre-registered
- ✅ Only registered MAC addresses can connect
- ❌ Unregistered devices are blocked immediately
- ✅ CoA disconnect sent to unregistered devices
- ✅ Maximum security
Strict Mode Flow:
1. Subscriber tries to connect from new device
2. RADIUS checks MAC address in database
3. MAC not found → Connection REJECTED
4. CoA disconnect sent to NAS
5. Subscriber must register MAC address first
6. Device can now connectWhen to Use:
- Corporate clients
- Business accounts
- High-security networks
- Prevent account sharing
3. Flexible Mode
- ✅ First device MAC is auto-registered
- ✅ Subsequent devices must be manually registered
- ✅ Allows initial connection without registration
- ⚠️ Less secure than strict mode
Flexible Mode Flow:
1. Subscriber connects from new device (first time)
2. RADIUS checks MAC address
3. MAC not found, but subscriber has no registered MACs
4. Connection ALLOWED
5. MAC address auto-registered
6. Next device must be manually registeredWhen to Use:
- Residential clients
- Better user experience
- Still prevents excessive sharing
System Impact
Database:
- Table:
subscriber_mac_addresses - Columns: subscriber_id, mac_address, device_name, registered_at
RADIUS Integration:
- MAC address checked during authentication
- CoA disconnect sent for unauthorized MACs
- Logs stored in
coa_mac_lock_logstable
Best Practice
- ✅ Use Strict Mode for corporate/business clients
- ✅ Use Flexible Mode for residential clients
- ✅ Allow 2-3 MAC addresses per subscriber
- ✅ Provide self-service MAC registration portal
MAC Address Formats Supported
AA:BB:CC:DD:EE:FFAA-BB-CC-DD-EE-FFAABBCCDDEEFF
Summary & Recommendations
Critical Settings (Always Enable)
- ✅ Failed Auto Renew Log Status - Track revenue loss
- ✅ Phone Format Status - Data consistency
- ✅ Identity Format Status - Data validation
Performance Settings
| Setting | Small ISP (<1K) | Large ISP (10K+) |
|---|---|---|
| Table View | Default | Compact |
| Page Loading | Spinner Logo | None |
| Google Maps | Enabled | Disabled |
| CoA Logs | Enabled | Disabled |
Module Recommendations
- Inventory Module: Enable if selling hardware
- Voucher Module: Enable for hotspot business
- Tickets Module: Enable for customer support
- Notices Module: Enable for announcements
- Department Module: Enable for large teams (10+ staff)
Security Recommendations
- MAC Lock Mode:
- Corporate: Strict
- Residential: Flexible
- Public WiFi: Disabled
Troubleshooting
Phone Numbers Not Validating
- Check
phone_formate_statusis enabled - Verify
phone_formatepattern is correct - Test with sample phone number
Google Maps Not Showing
- Check
google_map_statusis enabled - Verify
google_map_api_keyis valid - Check API key restrictions
- Verify subscribers have latitude/longitude
CoA Requests Not Working
- Check NAS configuration
- Verify CoA port (3799) is open
- Enable
coa_request_log_statusto debug - Check logs for error messages
Auto-Renew Failing
- Enable
failed_auto_renew_log_status - Check logs for failure reasons
- Verify subscriber/reseller balance
- Check package auto-renew settings
MAC Lock Not Working
- Verify
mac_lock_mode_statusis not disabled - Check RADIUS configuration
- Enable CoA logs to debug
- Verify MAC addresses are registered
Related Documentation
- General Settings - Company information and timezone
- Subscriber Settings - Subscriber-specific settings
- SMS Settings - SMS gateway configuration
- Email Settings - Email server configuration
- User Settings - User/reseller settings
- Captive Portal Settings - Hotspot configuration

