AiPBX administrators frequently need to configure custom star codes, paging groups, supervisor whisper/spy codes, CRM webhooks, or direct Asterisk application routines (*80, *55, *700, DISA) without opening an SSH terminal or editing /etc/asterisk/extensions_*.conf files manually. Manual file modifications are prone to syntax errors and get overwritten or desynchronized during system updates.
Provide a dedicated Web Management UI under PBX → Custom Dialplan (/custom-dialplan) that allows administrators to define custom Asterisk contexts safely, validate syntax before saving, preview the compiled .conf file, and automatically link internal contexts to the PBX internal dialplan ([from-internal-pbx-ortak]).
pbx_custom_dialplans with fields for context name, content, internal inclusion, order, and active state./etc/asterisk/pbx/extensions_custom.conf with automatic atomic rollback on failure.[custom-dialplan-pbx] included in [from-internal-pbx-ortak] for active entries with include_in_internal = 1.(), [], and ${} before save.from-internal, from-trunk, default, etc.) protected against overwriting.web/auth.php restricting access strictly to Admin (role_id === 1).Dahili Arama (PJSIP/1001)
│
▼
[from-internal-pbx-ortak]
│
├── include => custom-dialplan-pbx ───► [custom-dialplan-pbx]
│ ├── include => app-intercom (*80EXT)
│ ├── include => app-supervisor-spy (*55EXT)
│ └── include => app-group-paging (*700)
├── include => local-extensions
└── include => outbound-routes
Table: pbx_custom_dialplans
id: INT AUTO_INCREMENT PRIMARY KEYtitle: VARCHAR(150) NOT NULLcontext_name: VARCHAR(80) NOT NULL UNIQUEdialplan_content: TEXT NOT NULLinclude_in_internal: TINYINT(1) DEFAULT 1description: VARCHAR(255) NULLsort_order: INT DEFAULT 10is_active: TINYINT(1) DEFAULT 1created_at / updated_at: DATETIMECustomDialplanRepository.phpCustomDialplanService.php (Syntax validator, reserved context guard, recipe templates)SyncCustomDialplan.php (Generates [custom-dialplan-pbx] aggregator and custom context blocks)CustomDialplanController.phptemplates/views/custom_dialplan/index.php'custom_dialplan' to the hardcoded circuit breaker in web/auth.php.'admin_only' => true in RoleRepository.php.20261031200000_create_pbx_custom_dialplans.phpSyncCustomDialplan and integrate into syncEverything()CustomDialplanTest.php (7 tests, 83 assertions passing)docs/custom-dialplan.md and release v1.50.35