Ctrl K
ring2all.com

Bulk Modification Module Documentation

Table of Contents

  1. Module Overview (Technical)
  2. Module Overview (Commercial/Business)
  3. Module Overview (End User/Administrator)
  4. Configuration Fields Reference
  5. Operation Flow / Logic Explanation
  6. Common Scenarios & Examples
  7. Limitations & Important Notes
  8. Troubleshooting Tips
  9. Glossary
  10. Suggested UI Improvements

---

1. Module Overview (Technical)

What Is Bulk Modification?

Bulk Modification is an administrative tool that allows applying configuration changes to multiple extensions simultaneously instead of editing each one individually. It provides four flexible selection methods and can modify various extension attributes in a single operation.

Architecture

Plaintext
┌─────────────────────────────────────────────────────────────────┐
│                  Bulk Modification System                       │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ┌──────────────────────────────────────────────────────────┐   │
│  │               SELECTION METHODS                          │   │
│  ├──────────────────────────────────────────────────────────┤   │
│  │  1️⃣ Individual  │  2️⃣ Ranges  │  3️⃣ Patterns  │  4️⃣ Filters │   │
│  │  Select by ID   │  1000-1099  │  10*, *00     │  By CoS     │   │
│  └──────────────────────────────────────────────────────────┘   │
│                           │                                     │
│                           ▼                                     │
│  ┌──────────────────────────────────────────────────────────┐   │
│  │               PREVIEW OPERATION                          │   │
│  │  POST /api/telephony/bulk-modification/preview           │   │
│  │  → Returns count of affected extensions                  │   │
│  └──────────────────────────────────────────────────────────┘   │
│                           │                                     │
│                           ▼                                     │
│  ┌──────────────────────────────────────────────────────────┐   │
│  │               APPLY MODIFICATIONS                        │   │
│  │  POST /api/telephony/bulk-modification                   │   │
│  │  → Executes changes in transaction                       │   │
│  └──────────────────────────────────────────────────────────┘   │
│                           │                                     │
│                           ▼                                     │
│  ┌──────────────────────────────────────────────────────────┐   │
│  │               DATABASE UPDATE                            │   │
│  │  UPDATE public.sip_extensions SET ... WHERE id IN (...)  │   │
│  │  → Updates settings, recording config, language, etc.    │   │
│  └──────────────────────────────────────────────────────────┘   │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

Key Tables

TablePurpose
public.sip_extensionsPrimary table updated during bulk modifications
public.class_of_servicesReferenced for Class of Service changes
public.domainsUsed for multi-tenant domain filtering

API Endpoints

MethodEndpointPurpose
POST/api/telephony/bulk-modification/previewPreview which extensions will be affected
POST/api/telephony/bulk-modificationApply the modifications

Key Files

FileDescription
admin/apps/api/src/modules/telephony/bulk-modification/services/bulkModificationService.tsBackend service handling preview and apply operations
admin/apps/web/src/modules/bulkModification/BulkModificationPage.tsxFrontend page with selection and modification UI
admin/apps/web/src/i18n/en/bulkModification.jsonEnglish translation strings
---

2. Module Overview (Commercial/Business)

Business Value

Bulk Modification dramatically reduces administrative overhead:

Manual ApproachWith Bulk Modification
Change 100 extensions: ~2 hoursChange 100 extensions: ~2 minutes
High error rate from repetitive workConsistent changes across all selected
Requires skilled administratorsSimple interface for routine changes

Use Cases

  1. Department Restructuring
- Move all Sales team extensions to new Class of Service

- Change language settings for entire floor

  1. Compliance Updates
- Enable call recording for all customer-facing extensions

- Update account codes for billing changes

  1. System Migration
- Mass update ring times during transition

- Apply new default settings to all extensions

  1. Onboarding/Offboarding
- Configure batch of new hire extensions

- Disable extensions for departing employees

Licensing Considerations

  • This is typically a System Administrator level feature
  • Consider restricting access to prevent accidental mass changes
  • Include in Enterprise tier to justify technical support costs

---

3. Module Overview (End User/Administrator)

What Can You Do?

Bulk Modification allows you to:

  1. Select Extensions using multiple methods:
- Individual: Pick specific extensions from a list

- Ranges: Specify numeric ranges (e.g., 1000-1099)

- Patterns: Use wildcards (e.g., 10 = all starting with 10)

- Filters: Select by properties (Class of Service, status, language)

  1. Preview Before Applying:
- See exactly how many extensions will be affected

- Confirm before making changes

  1. Apply Modifications:
- Class of Service

- Ring Time (call timeout)

- Language

- Account Code

- Call Recording Settings

User Workflow

Plaintext
┌─────────────────────────────────────────────────────────────────┐
│                    Administrator Workflow                       │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  Step 1: Choose Selection Method                                │
│  ├─ Individual → Click extensions from list                    │
│  ├─ Ranges → Enter 1000-1099                                   │
│  ├─ Patterns → Enter 10* for "starts with 10"                  │
│  └─ Filters → Select Class of Service, Status, etc.            │
│                                                                 │
│  Step 2: Preview Selection                                      │
│  ├─ Click "Preview Selection" button                           │
│  └─ ✓ "Preview: 47 extension(s) will be modified"              │
│                                                                 │
│  Step 3: Configure Modifications                                │
│  ├─ ☐ Class of Service → [Select new CoS]                      │
│  ├─ ☐ Ring Time → [30 seconds]                                 │
│  ├─ ☐ Language → [Spanish]                                     │
│  ├─ ☐ Account Code → [SALES-2024]                              │
│  └─ ☐ Call Recording → [Enable incoming/outgoing]              │
│                                                                 │
│  Step 4: Apply Changes                                          │
│  ├─ Click "Apply Changes" button                               │
│  └─ ✓ "Successfully modified 47 extension(s)"                  │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

Quick Tips

TIP
Always Preview First: Use the Preview button to verify your selection before applying changes. This prevents accidental modifications to wrong extensions.
TIP
Use Ranges for Floors/Departments: If extensions are numbered by floor (1000s = Floor 1, 2000s = Floor 2), ranges make selection easy.
CAUTION
Recording Changes Are Immediate: Enabling call recording applies to calls made/received after the change—existing calls are not affected.

---

4. Configuration Fields Reference

Selection Methods

Individual Selection

FeatureDescriptionExample
Extension SearchSearch by number, name, or emailType "John" to find John's extension
Multi-SelectClick to toggle selectionClick ext 1001, click ext 1005, click ext 1010
Select AllLoad all domain extensionsClick "Select All Extensions" button
Clear AllRemove all selectedClick "Clear" button

Ranges

FeatureDescriptionExample
Start/EndDefine numeric range boundsStart: 1000, End: 1099
Multiple RangesAdd multiple non-contiguous ranges1000-1099 + 2050-2099 + 3000-3010
BehaviorIncludes both start and end values1000-1005 = extensions 1000, 1001, 1002, 1003, 1004, 1005

Patterns

PatternMeaningMatches
10Starts with 101000, 1001, 1099, 10
00Ends with 001000, 2000, 9900, 100
35Starts with 3, ends with 5305, 3005, 3125, 35
All extensionsEvery extension in domain

Filters

FilterOptionsDescription
Class of ServiceDropdown of available CoSOnly extensions with selected CoS
Extension StatusAny / Enabled Only / Disabled OnlyFilter by enabled state
VoicemailAny / Enabled / DisabledFilter by voicemail status
LanguageLanguage selectorFilter by extension language

Modification Options

ModificationTypeDescriptionRange/Options
Class of ServiceDropdownChange permission level for calls (local, long-distance, international)Available CoS from domain
Ring TimeNumber InputSeconds before call goes to voicemail10-120 seconds
LanguageDropdownLanguage for voicemail prompts and IVR menusen-us-emma, es-us-paloma, etc.
Account CodeText InputBilling/reporting code for the extensionAny text string
Call RecordingCheckboxesEnable/disable recording by directionIncoming, Outgoing, Internal, On-Demand
---

5. Operation Flow / Logic Explanation

Preview Flow

Plaintext
┌─────────────────────────────────────────────────────────────────┐
│                      Preview Operation                          │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  1. User configures selection (extensionIds, ranges, patterns, │
│     or filters)                                                 │
│     │                                                           │
│     ▼                                                           │
│  2. Frontend sends POST to /api/telephony/bulk-modification/    │
│     preview                                                     │
│     │                                                           │
│     ▼                                                           │
│  3. Backend normalizes payload                                  │
│     ├─ sanitizeSelectionPayload()                               │
│     └─ Resolves domainId from tenant context                    │
│     │                                                           │
│     ▼                                                           │
│  4. Backend generates WHERE clause                              │
│     ├─ Individual: WHERE id IN (1, 2, 3)                        │
│     ├─ Ranges: WHERE extension::int BETWEEN 1000 AND 1099       │
│     ├─ Patterns: WHERE extension LIKE '10%'                     │
│     └─ Filters: WHERE class_of_services_id = 5 AND enabled = t  │
│     │                                                           │
│     ▼                                                           │
│  5. Backend executes COUNT query                                │
│     │  SELECT COUNT(*) FROM sip_extensions WHERE ...            │
│     │                                                           │
│     ▼                                                           │
│  6. Returns response: { success: true, count: 47 }              │
│     │                                                           │
│     ▼                                                           │
│  7. Frontend displays: "Preview: 47 extension(s) will be        │
│     modified"                                                   │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

Apply Flow

Plaintext
┌─────────────────────────────────────────────────────────────────┐
│                       Apply Operation                           │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  1. User clicks "Apply Changes"                                 │
│     │                                                           │
│     ▼                                                           │
│  2. Frontend validates:                                         │
│     ├─ At least one selection method has values                 │
│     └─ At least one modification checkbox is enabled            │
│     │                                                           │
│     ▼                                                           │
│  3. Frontend builds payload:                                    │
│     {                                                           │
│       extensionIds: [1, 2, 3],    // or ranges/patterns/filters │
│       modifications: {                                          │
│         classOfServicesId: 5,                                   │
│         callTimeout: 30,                                        │
│         languageCode: "es-us-paloma",                           │
│         recording: { recordIncoming: true, ... }                │
│       }                                                         │
│     }                                                           │
│     │                                                           │
│     ▼                                                           │
│  4. POST /api/telephony/bulk-modification                       │
│     │                                                           │
│     ▼                                                           │
│  5. Backend validates and selects target extensions:            │
│     SELECT id, extension FROM sip_extensions WHERE ...          │
│     │                                                           │
│     ▼                                                           │
│  6. Backend generates UPDATE query:                             │
│     generateBulkUpdateQuery(extensionIds, modifications)        │
│     │                                                           │
│     ▼                                                           │
│  7. Executes in transaction:                                    │
│     UPDATE sip_extensions SET                                   │
│       class_of_services_id = 5,                                 │
│       call_timeout = 30,                                        │
│       language_code = 'es-us-paloma',                           │
│       updated_at = NOW(),                                       │
│       updated_by = 123                                          │
│     WHERE id IN (1, 2, 3, ...)                                  │
│     │                                                           │
│     ▼                                                           │
│  8. Returns: { success: true, updatedCount: 47 }                │
│     │                                                           │
│     ▼                                                           │
│  9. Frontend shows success and clears form                      │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

---

6. Common Scenarios & Examples

Scenario 1: Department Language Change

Context: Marketing department (extensions 2000-2099) needs Spanish prompts.

Plaintext
Selection: Ranges
  → Start: 2000, End: 2099
  
Preview: "55 extension(s) will be modified"

Modifications:
  ☑️ Language → es-us-paloma
  
Apply → "Successfully modified 55 extension(s)"

Scenario 2: Enable Recording for Customer Service

Context: All extensions with Class of Service "Customer Service" need call recording.

Plaintext
Selection: Filters
  → Class of Service: "Customer Service"
  → Extension Status: Enabled Only
  
Preview: "23 extension(s) will be modified"

Modifications:
  ☑️ Call Recording
    ☑️ Record Incoming Calls
    ☑️ Record Outgoing Calls
    ☐ Record Internal Calls
    ☐ Record On Demand
    
Apply → "Successfully modified 23 extension(s)"

Scenario 3: Pattern-Based Ring Time Adjustment

Context: All executive extensions (starting with 1) should ring longer.

Plaintext
Selection: Patterns
  → Pattern: "1*"
  
Preview: "12 extension(s) will be modified"

Modifications:
  ☑️ Ring Time → 45 seconds (from default 30)
  
Apply → "Successfully modified 12 extension(s)"

Scenario 4: Mass Account Code Assignment

Context: Year-end billing requires new account codes for all extensions.

Plaintext
Selection: Individual
  → Click "Select All Extensions"
  → 347 extensions selected
  
Modifications:
  ☑️ Account Code → "FY2026-Q1"
  
Apply → "Successfully modified 347 extension(s)"

---

7. Limitations & Important Notes

Technical Limitations

WARNING
No Undo: Bulk modifications cannot be automatically reversed. Keep a backup or document previous settings before large changes.
WARNING
Domain Scope: Operations are scoped to the currently selected domain. You cannot modify extensions across multiple domains in one operation.
IMPORTANT
XML Regeneration: Some changes (like recording settings) may require XML regeneration for the extension. The system handles this automatically, but very large batches may experience brief delays.

Best Practices

  1. Always Preview First: Never skip the preview step, especially for ranges and patterns
  2. Start Small: Test with a small range before applying to entire departments
  3. Document Changes: Keep a log of bulk modifications for audit purposes
  4. Off-Peak Hours: Run large bulk modifications during low-traffic periods
  5. Verify After: Spot-check a few extensions after bulk changes

Security Considerations

CAUTION
Access Control: Only System Administrators should have access to this module. Misconfigured bulk changes can disrupt service for many users.
CAUTION
Audit Trail: All bulk modifications should be logged with the administrator's user ID and timestamp.

---

8. Troubleshooting Tips

Common Issues

SymptomPossible CauseSolution
"No extensions found"Domain filter mismatchVerify correct domain is selected in header
Preview shows 0Pattern syntax incorrectCheck wildcard usage: not %
"No modifications selected"No checkbox enabledEnable at least one modification checkbox
Partial successSome extensions have constraintsCheck for unique constraint violations
Slow operationToo many extensionsSplit into smaller batches (500 max recommended)

Validation Errors

ErrorMeaningResolution
"Please select at least one extension"Individual tab emptySearch and select extensions
"Please add at least one range"Ranges tab emptyAdd start/end range values
"Please add at least one pattern"Patterns tab emptyAdd at least one pattern
"Please select at least one filter"Filters tab, no selectionsSelect at least one filter option

Diagnostic SQL

Check extensions matching a range:

Sql
SELECT extension, name, enabled 
FROM public.sip_extensions 
WHERE domain_id = [domain_id]
  AND extension::int BETWEEN 1000 AND 1099
ORDER BY extension;

Check extensions matching a pattern:

Sql
SELECT extension, name, enabled 
FROM public.sip_extensions 
WHERE domain_id = [domain_id]
  AND extension LIKE '10%'
ORDER BY extension;

Verify recent bulk changes:

Sql
SELECT extension, updated_at, updated_by 
FROM public.sip_extensions 
WHERE domain_id = [domain_id]
  AND updated_at > NOW() - INTERVAL '1 hour'
ORDER BY updated_at DESC;

---

9. Glossary

TermDefinition
Bulk ModificationThe process of applying the same configuration change to multiple extensions at once
PreviewA non-destructive operation that shows how many extensions would be affected before changes are made
Selection MethodThe technique used to choose which extensions to modify (individual, ranges, patterns, filters)
RangeA numeric span of extension numbers (e.g., 1000-1099)
PatternA wildcard expression to match extensions (e.g., 10 matches 1000, 1001, etc.)
FilterCriteria based on extension properties (Class of Service, enabled status, language)
Class of Service (CoS)Permission level controlling what types of calls an extension can make
Account CodeA text identifier used for billing and reporting purposes
Ring TimeDuration in seconds before an unanswered call proceeds to voicemail or next action
TransactionDatabase operation that either completes fully or rolls back entirely—no partial updates
---

10. Suggested UI Improvements

Tooltip Improvements

FieldCurrentSuggested
Ring Time"How long to ring before going to voicemail (10-120 seconds)""How many seconds the phone rings before proceeding to voicemail or voicemail. Most users prefer 20-30 seconds. Very short times (10s) may frustrate callers."
PatternsN/A"Use as a wildcard: 10 matches 1000-1099, 00 matches 100, 1000, 2000. Patterns are case-sensitive for alphanumeric extensions."
Class of ServiceN/A"Controls calling permissions. Change carefully—restricting CoS may prevent users from making certain calls."

UX Enhancements

  1. Confirmation Modal: Before applying, show a summary modal:
Plaintext
   ⚠️ You are about to modify 47 extensions:
   - Class of Service: Sales Team → Customer Service
   - Ring Time: (unchanged) → 45 seconds
   
   [Cancel] [Apply Changes]
   

  1. Undo History: Store last 10 bulk operations with ability to revert

  1. Export Before: Add button "Download Current Settings" before applying changes

  1. Progress Indicator: For large batches, show progress bar instead of spinner

  1. Dry Run Mode: Advanced option to generate SQL without executing, for review

Label Changes

CurrentSuggestedReason
"Ring Time (seconds)""Ring Duration (seconds)"Clearer terminology
"Configure Modifications""Changes to Apply"Simpler language
"Preview Selection""Count Affected Extensions"More descriptive

Filter Enhancements

Add additional filters:

  • Extension Type (SIP, Hotdesk, Virtual, None)
  • Billing Enabled (Yes/No)
  • Agent Profile (for call center extensions)
  • Date Created (before/after)



Lua Script Status ℹ️

Integration Module

ComponentStatusNotes
Bulk Modificationℹ️ Configuration moduleActions applied directly to database records
--- Documentation last updated: January 2026
AI Assistant

👋 Hello! I'm your Ring2All documentation assistant. I can help you find information about configuring and using the Ring2All PBX platform.

How can I help you today?