# milad-mma/voip-auto-caller architecture

> Architecture diagram of the GitHub repository milad-mma/voip-auto-caller, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-14). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/milad-mma/voip-auto-caller
- Repository: https://github.com/milad-mma/voip-auto-caller

## Overview

AutoCaller is an Issabel/Elastix outbound campaign dialer. Operators configure audio and call rules, import contacts, start campaigns, and inspect per-call outcomes; API clients can also request quick calls and poll results. The campaign runner originates calls through Asterisk, whose AGI flow plays audio and handles DTMF, while outcomes and reports are persisted for later export. The graph includes the documented subsystems and sampled web/API routes; the `sql/` tree mirrors application modules, but its internal wiring was not independently inspected.

Main entry points: [`app/lib/Router.php`](https://github.com/milad-mma/voip-auto-caller/blob/main/app/lib/Router.php) (Route dispatch), [`app/lib/Dialer.php`](https://github.com/milad-mma/voip-auto-caller/blob/main/app/lib/Dialer.php) (Campaign dialer), [`app/controllers/CampaignController.php`](https://github.com/milad-mma/voip-auto-caller/blob/main/app/controllers/CampaignController.php) (Campaign management), [`app/lib/Agi.php`](https://github.com/milad-mma/voip-auto-caller/blob/main/app/lib/Agi.php) (IVR handler)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["Web and API"]
  node_front["Web front controller<br/>[index.php]"]
  node_router["Route dispatch<br/>[Router.php]"]
  node_api["REST API<br/>[ApiController.php]"]
  node_login["Authentication<br/>[AuthController.php]"]
  node_sql_api["SQL REST API<br/>[ApiController.php]"]
  node_sql_auth["SQL authentication<br/>[Auth.php]"]
  node_local_auth["SQL web front controller<br/>[index.php]"]
end

subgraph group_campaign["Campaign operations"]
  node_campaign_ui["Campaign management"]
  node_quickcall["Quick calls"]
  node_contacts["Contact import<br/>[Importer.php]"]
  node_phonebook["Phonebook"]
  node_dnc["Do-not-call list<br/>[Dnc.php]"]
  node_audio["Audio library<br/>[Audio.php]"]
  node_sql_campaign["SQL campaign management"]
end

subgraph group_runtime["Calling runtime"]
  node_dialer["Campaign dialer<br/>[Dialer.php]"]
  node_dialer_service["Dialer service<br/>[dialer.php]"]
  node_ami["AMI client<br/>[Ami.php]"]
  node_agi_entry["AGI entrypoint<br/>[agi.php]"]
  node_agi["IVR handler<br/>[Agi.php]"]
  node_trunks["Trunk pool<br/>[Trunks.php]"]
  node_sql_dialer["SQL campaign dialer<br/>[Dialer.php]"]
  node_sql_trunks["SQL trunk pool<br/>[Trunks.php]"]
end

subgraph group_support["Administration and results"]
  node_reports["Reports and export<br/>[Exporter.php]"]
  node_settings["PBX settings"]
  node_cli["Admin CLI<br/>[console.php]"]
  node_sql_settings["SQL PBX settings"]
  node_sql_cli["SQL admin CLI<br/>[console.php]"]
  node_local_lang_en["English translations<br/>[en.php]"]
  node_local_lang_fa["Persian translations<br/>[fa.php]"]
  node_sql_lang_fa["SQL Persian translations<br/>[fa.php]"]
end

node_operator(("Operator"))
node_api_client(("API client"))
node_asterisk["Asterisk PBX"]
node_mysql[("MySQL data")]

node_operator -->|"uses web UI"| node_front
node_api_client -->|"sends requests"| node_api
node_front -->|"routes requests"| node_router
node_router -->|"dispatches campaigns"| node_campaign_ui
node_router -->|"dispatches API"| node_api
node_router -->|"dispatches login"| node_login
node_campaign_ui -->|"imports contacts"| node_contacts
node_campaign_ui -->|"stores campaign data"| node_mysql
node_api -->|"creates quick call"| node_quickcall
node_quickcall -->|"stores call"| node_mysql
node_phonebook -->|"adds contacts"| node_campaign_ui
node_contacts -->|"checks exclusions"| node_dnc
node_dialer_service -->|"runs daemon"| node_dialer
node_dialer -->|"reads queued work"| node_mysql
node_dialer -->|"selects trunk"| node_trunks
node_dialer -->|"originates calls"| node_ami
node_ami -->|"sends AMI events"| node_asterisk
node_asterisk -->|"reports outcomes"| node_ami
node_asterisk -->|"runs AGI"| node_agi_entry
node_agi_entry -->|"starts IVR"| node_agi
node_agi -->|"records responses"| node_mysql
node_agi -->|"handles DTMF"| node_asterisk
node_reports -->|"reads outcomes"| node_mysql
node_settings -.->|"configures trunk pool"| node_trunks
node_settings -.->|"stores settings"| node_mysql
node_cli -->|"runs administration"| node_mysql
node_sql_api -->|"creates quick call"| node_quickcall
node_sql_campaign -->|"imports contacts"| node_contacts
node_sql_dialer -.->|"reads queued work"| node_mysql
node_sql_dialer -.->|"selects trunk"| node_sql_trunks
node_sql_trunks -.->|"checks trunk state"| node_asterisk
node_sql_settings -.->|"configures trunk pool"| node_sql_trunks
node_local_auth -.->|"authenticates users"| node_sql_auth
node_sql_cli -.->|"runs administration"| node_mysql

click node_front "https://github.com/milad-mma/voip-auto-caller/blob/main/public/index.php"
click node_router "https://github.com/milad-mma/voip-auto-caller/blob/main/app/lib/Router.php"
click node_api "https://github.com/milad-mma/voip-auto-caller/blob/main/app/controllers/ApiController.php"
click node_login "https://github.com/milad-mma/voip-auto-caller/blob/main/app/controllers/AuthController.php"
click node_campaign_ui "https://github.com/milad-mma/voip-auto-caller/blob/main/app/controllers/CampaignController.php"
click node_quickcall "https://github.com/milad-mma/voip-auto-caller/blob/main/app/controllers/QuickCallController.php"
click node_contacts "https://github.com/milad-mma/voip-auto-caller/blob/main/app/lib/Importer.php"
click node_phonebook "https://github.com/milad-mma/voip-auto-caller/blob/main/app/controllers/PhonebookController.php"
click node_dnc "https://github.com/milad-mma/voip-auto-caller/blob/main/app/lib/Dnc.php"
click node_audio "https://github.com/milad-mma/voip-auto-caller/blob/main/app/lib/Audio.php"
click node_dialer "https://github.com/milad-mma/voip-auto-caller/blob/main/app/lib/Dialer.php"
click node_dialer_service "https://github.com/milad-mma/voip-auto-caller/blob/main/bin/dialer.php"
click node_ami "https://github.com/milad-mma/voip-auto-caller/blob/main/app/lib/Ami.php"
click node_agi_entry "https://github.com/milad-mma/voip-auto-caller/blob/main/bin/agi.php"
click node_agi "https://github.com/milad-mma/voip-auto-caller/blob/main/app/lib/Agi.php"
click node_trunks "https://github.com/milad-mma/voip-auto-caller/blob/main/app/lib/Trunks.php"
click node_reports "https://github.com/milad-mma/voip-auto-caller/blob/main/app/lib/Exporter.php"
click node_settings "https://github.com/milad-mma/voip-auto-caller/blob/main/app/controllers/SettingsController.php"
click node_cli "https://github.com/milad-mma/voip-auto-caller/blob/main/bin/console.php"
click node_sql_api "https://github.com/milad-mma/voip-auto-caller/blob/main/sql/app/controllers/ApiController.php"
click node_sql_campaign "https://github.com/milad-mma/voip-auto-caller/blob/main/sql/app/controllers/CampaignController.php"
click node_sql_settings "https://github.com/milad-mma/voip-auto-caller/blob/main/sql/app/controllers/SettingsController.php"
click node_sql_dialer "https://github.com/milad-mma/voip-auto-caller/blob/main/sql/app/lib/Dialer.php"
click node_sql_trunks "https://github.com/milad-mma/voip-auto-caller/blob/main/sql/app/lib/Trunks.php"
click node_sql_auth "https://github.com/milad-mma/voip-auto-caller/blob/main/sql/app/lib/Auth.php"
click node_sql_cli "https://github.com/milad-mma/voip-auto-caller/blob/main/sql/bin/console.php"
click node_local_auth "https://github.com/milad-mma/voip-auto-caller/blob/main/sql/public/index.php"
click node_local_lang_en "https://github.com/milad-mma/voip-auto-caller/blob/main/app/lang/en.php"
click node_local_lang_fa "https://github.com/milad-mma/voip-auto-caller/blob/main/app/lang/fa.php"
click node_sql_lang_fa "https://github.com/milad-mma/voip-auto-caller/blob/main/sql/app/lang/fa.php"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_front,node_router,node_api,node_login,node_sql_api,node_sql_auth,node_local_auth,node_api_client toneBlue
class node_campaign_ui,node_quickcall,node_contacts,node_phonebook,node_dnc,node_audio,node_sql_campaign,node_mysql toneAmber
class node_dialer,node_dialer_service,node_ami,node_agi_entry,node_agi,node_trunks,node_sql_dialer,node_sql_trunks toneMint
class node_reports,node_settings,node_cli,node_sql_settings,node_sql_cli,node_local_lang_en,node_local_lang_fa,node_sql_lang_fa toneRose
class node_operator,node_asterisk toneIndigo
```

## Components

### Web and API

- [Web front controller](https://github.com/milad-mma/voip-auto-caller/blob/main/public/index.php): `public/index.php`
- [Route dispatch](https://github.com/milad-mma/voip-auto-caller/blob/main/app/lib/Router.php): `app/lib/Router.php`
- [REST API](https://github.com/milad-mma/voip-auto-caller/blob/main/app/controllers/ApiController.php): `app/controllers/ApiController.php`
- [Authentication](https://github.com/milad-mma/voip-auto-caller/blob/main/app/controllers/AuthController.php): `app/controllers/AuthController.php`
- [SQL REST API](https://github.com/milad-mma/voip-auto-caller/blob/main/sql/app/controllers/ApiController.php): `sql/app/controllers/ApiController.php`
- [SQL authentication](https://github.com/milad-mma/voip-auto-caller/blob/main/sql/app/lib/Auth.php): `sql/app/lib/Auth.php`
- [SQL web front controller](https://github.com/milad-mma/voip-auto-caller/blob/main/sql/public/index.php): `sql/public/index.php`

### Campaign operations

- [Campaign management](https://github.com/milad-mma/voip-auto-caller/blob/main/app/controllers/CampaignController.php): `app/controllers/CampaignController.php`
- [Quick calls](https://github.com/milad-mma/voip-auto-caller/blob/main/app/controllers/QuickCallController.php): `app/controllers/QuickCallController.php`
- [Contact import](https://github.com/milad-mma/voip-auto-caller/blob/main/app/lib/Importer.php): `app/lib/Importer.php`
- [Phonebook](https://github.com/milad-mma/voip-auto-caller/blob/main/app/controllers/PhonebookController.php): `app/controllers/PhonebookController.php`
- [Do-not-call list](https://github.com/milad-mma/voip-auto-caller/blob/main/app/lib/Dnc.php): `app/lib/Dnc.php`
- [Audio library](https://github.com/milad-mma/voip-auto-caller/blob/main/app/lib/Audio.php): `app/lib/Audio.php`
- [SQL campaign management](https://github.com/milad-mma/voip-auto-caller/blob/main/sql/app/controllers/CampaignController.php): `sql/app/controllers/CampaignController.php`

### Calling runtime

- [Campaign dialer](https://github.com/milad-mma/voip-auto-caller/blob/main/app/lib/Dialer.php): `app/lib/Dialer.php`
- [Dialer service](https://github.com/milad-mma/voip-auto-caller/blob/main/bin/dialer.php): `bin/dialer.php`
- [AMI client](https://github.com/milad-mma/voip-auto-caller/blob/main/app/lib/Ami.php): `app/lib/Ami.php`
- [AGI entrypoint](https://github.com/milad-mma/voip-auto-caller/blob/main/bin/agi.php): `bin/agi.php`
- [IVR handler](https://github.com/milad-mma/voip-auto-caller/blob/main/app/lib/Agi.php): `app/lib/Agi.php`
- [Trunk pool](https://github.com/milad-mma/voip-auto-caller/blob/main/app/lib/Trunks.php): `app/lib/Trunks.php`
- [SQL campaign dialer](https://github.com/milad-mma/voip-auto-caller/blob/main/sql/app/lib/Dialer.php): `sql/app/lib/Dialer.php`
- [SQL trunk pool](https://github.com/milad-mma/voip-auto-caller/blob/main/sql/app/lib/Trunks.php): `sql/app/lib/Trunks.php`

### Administration and results

- [Reports and export](https://github.com/milad-mma/voip-auto-caller/blob/main/app/lib/Exporter.php): `app/lib/Exporter.php`
- [PBX settings](https://github.com/milad-mma/voip-auto-caller/blob/main/app/controllers/SettingsController.php): `app/controllers/SettingsController.php`
- [Admin CLI](https://github.com/milad-mma/voip-auto-caller/blob/main/bin/console.php): `bin/console.php`
- [SQL PBX settings](https://github.com/milad-mma/voip-auto-caller/blob/main/sql/app/controllers/SettingsController.php): `sql/app/controllers/SettingsController.php`
- [SQL admin CLI](https://github.com/milad-mma/voip-auto-caller/blob/main/sql/bin/console.php): `sql/bin/console.php`
- [English translations](https://github.com/milad-mma/voip-auto-caller/blob/main/app/lang/en.php): `app/lang/en.php`
- [Persian translations](https://github.com/milad-mma/voip-auto-caller/blob/main/app/lang/fa.php): `app/lang/fa.php`
- [SQL Persian translations](https://github.com/milad-mma/voip-auto-caller/blob/main/sql/app/lang/fa.php): `sql/app/lang/fa.php`

### Other components

- **Operator**
- **API client**
- **Asterisk PBX**
- **MySQL data**

## Connections

- Operator → Web front controller: uses web UI
- API client → REST API: sends requests
- Web front controller → Route dispatch: routes requests (evidence: `public/index.php`)
- Route dispatch → Campaign management: dispatches campaigns
- Route dispatch → REST API: dispatches API
- Route dispatch → Authentication: dispatches login
- Campaign management → Contact import: imports contacts (evidence: `app/controllers/CampaignController.php`)
- Campaign management → MySQL data: stores campaign data
- REST API → Quick calls: creates quick call (evidence: `app/controllers/ApiController.php`)
- Quick calls → MySQL data: stores call
- Phonebook → Campaign management: adds contacts
- Contact import → Do-not-call list: checks exclusions
- Dialer service → Campaign dialer: runs daemon
- Campaign dialer → MySQL data: reads queued work
- Campaign dialer → Trunk pool: selects trunk
- Campaign dialer → AMI client: originates calls
- AMI client → Asterisk PBX: sends AMI events
- Asterisk PBX → AMI client: reports outcomes
- Asterisk PBX → AGI entrypoint: runs AGI
- AGI entrypoint → IVR handler: starts IVR
- IVR handler → MySQL data: records responses
- IVR handler → Asterisk PBX: handles DTMF
- Reports and export → MySQL data: reads outcomes
- PBX settings → Trunk pool: configures trunk pool
- PBX settings → MySQL data: stores settings
- Admin CLI → MySQL data: runs administration
- SQL REST API → Quick calls: creates quick call (evidence: `sql/app/controllers/ApiController.php`)
- SQL campaign management → Contact import: imports contacts (evidence: `sql/app/controllers/CampaignController.php`)
- SQL campaign dialer → MySQL data: reads queued work
- SQL campaign dialer → SQL trunk pool: selects trunk
- SQL trunk pool → Asterisk PBX: checks trunk state
- SQL PBX settings → SQL trunk pool: configures trunk pool
- SQL web front controller → SQL authentication: authenticates users
- SQL admin CLI → MySQL data: runs administration
