1. Go to this page and download the library: Download salesrender/plugin-core-pbx library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
salesrender / plugin-core-pbx example snippets
use Dotenv\Dotenv;
use SalesRender\Plugin\Components\Db\Components\Connector;
use SalesRender\Plugin\Components\Info\Developer;
use SalesRender\Plugin\Components\Info\Info;
use SalesRender\Plugin\Components\Info\PluginType;
use SalesRender\Plugin\Components\Purpose\PbxPluginClass;
use SalesRender\Plugin\Components\Purpose\PluginEntity;
use SalesRender\Plugin\Components\Settings\Settings;
use SalesRender\Plugin\Components\Translations\Translator;
use SalesRender\Plugin\Core\PBX\Components\CDR\CdrParserContainer;
use SalesRender\Plugin\Core\PBX\Components\CDR\CdrPricing;
use SalesRender\Plugin\Core\PBX\Components\Config\ConfigSender;
use YourVendor\Plugin\PBX\YourProvider\ConfigBuilder;
use YourVendor\Plugin\PBX\YourProvider\Forms\SettingsForm;
use YourVendor\Plugin\PBX\YourProvider\Parsers\CdrApiParser;
use YourVendor\Plugin\PBX\YourProvider\Parsers\CdrWebhookParser;
use Medoo\Medoo;
use Money\Money;
use XAKEPEHOK\Path\Path;
# 0. Load environment variables
$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();
# 1. Configure DB (for SQLite *.db file and parent directory should be writable)
Connector::config(new Medoo([
'database_type' => 'sqlite',
'database' => Path::root()->down('db/database.db')
]));
# 2. Set default language
Translator::config('ru_RU');
# 3. Configure plugin info
Info::config(
new PluginType(PluginType::PBX),
fn() => Translator::get('info', 'Your Plugin Name'),
fn() => Translator::get('info', 'Plugin description in **markdown**'),
[
'class' => PbxPluginClass::CLASS_SIP,
'entity' => PluginEntity::ENTITY_UNSPECIFIED,
'currency' => $_ENV['LV_PLUGIN_PBX_PRICING_CURRENCY'],
'pricing' => [
'pbx' => 0,
'record' => 0,
],
'codename' => 'SR_PBX_YOUR_PROVIDER'
],
new Developer(
'Your Company',
'[email protected]',
'example.com',
)
);
# 4. Configure settings form
Settings::setForm(fn() => new SettingsForm());
# 5. Configure ConfigBuilder and ConfigSender as Settings::addOnSaveHandler()
Settings::addOnSaveHandler(function (Settings $settings) {
$builder = new ConfigBuilder($settings);
$sender = new ConfigSender($builder);
$sender();
});
# 6. Define CDR reward pricing function
CdrPricing::config(function (Money $money) {
$percent = $_ENV['LV_PLUGIN_PBX_PRICING_REWARD'];
return $money->multiply($percent)->divide(100);
});
# 7. Configure CDR parsers
CdrParserContainer::config(
new CdrApiParser(),
new CdrWebhookParser()
);
namespace YourVendor\Plugin\PBX\YourProvider;
use SalesRender\Plugin\Components\Settings\Settings;
use SalesRender\Plugin\Core\PBX\Components\Config\Config;
use SalesRender\Plugin\Core\PBX\Components\Config\ConfigBuilder as ConfigBuilderInterface;
class ConfigBuilder implements ConfigBuilderInterface
{
private Settings $settings;
public function __construct(Settings $settings)
{
$this->settings = $settings;
}
public function __invoke(): Config
{
$config = new Config();
$config->username = $this->settings->getData()->get('main.login');
$config->password = $this->settings->getData()->get('main.password');
$config->from = $this->settings->getData()->get('main.from');
$config->prefix = $this->settings->getData()->get('main.prefix');
$config->protocol = $this->settings->getData()->get('advanced.protocol.0');
$config->domain = $this->settings->getData()->get('advanced.domain');
$config->realm = $this->settings->getData()->get('advanced.realm');
$config->proxy = $this->settings->getData()->get('advanced.proxy');
$config->expires = $this->settings->getData()->get('advanced.expires');
$config->register = $this->settings->getData()->get('advanced.register');
$config->number_format_with_plus = $this->settings->getData()->get('advanced.number_format_with_plus');
$config->send_additional_data_via_x_headers = $this->settings->getData()->get('advanced.send_additional_data_via_x_headers');
$config->header_for_DID = $this->settings->getData()->get('advanced.header_for_DID');
return $config;
}
}
namespace YourVendor\Plugin\PBX\YourProvider\Parsers;
use SalesRender\Plugin\Core\PBX\Components\CDR\CDR;
use SalesRender\Plugin\Core\PBX\Components\CDR\CdrApiParserInterface;
use SalesRender\Plugin\Core\PBX\Components\CDR\CdrPricing;
use Money\Currency;
use Money\Money;
class CdrApiParser implements CdrApiParserInterface
{
/**
* @return CDR[]
*/
public function __invoke(): array
{
// Fetch CDR data from your provider's API
$providerRecords = $this->fetchFromProviderApi();
$result = [];
foreach ($providerRecords as $record) {
$cdr = new CDR($record['phone']);
$cdr->callId = $record['callId'];
$cdr->timestamp = $record['timestamp'];
$cdr->duration = $record['duration'];
$cdr->recordUri = $record['recordUrl'];
$cdr->pricing = new CdrPricing(new Money(
$record['cost'],
new Currency($_ENV['LV_PLUGIN_PBX_PRICING_CURRENCY'])
));
$result[] = $cdr;
}
return $result;
}
}
namespace YourVendor\Plugin\PBX\YourProvider\Parsers;
use SalesRender\Plugin\Components\Access\Token\GraphqlInputToken;
use SalesRender\Plugin\Components\Db\Components\Connector;
use SalesRender\Plugin\Components\Access\Registration\Registration;
use SalesRender\Plugin\Core\PBX\Components\CDR\CDR;
use SalesRender\Plugin\Core\PBX\Components\CDR\CdrPricing;
use SalesRender\Plugin\Core\PBX\Components\CDR\CdrSender;
use SalesRender\Plugin\Core\PBX\Components\CDR\CdrWebhookParserInterface;
use Money\Currency;
use Money\Money;
use Slim\Http\Response;
use Slim\Http\ServerRequest;
class CdrWebhookParser implements CdrWebhookParserInterface
{
public function httpMethod(): string
{
return 'POST';
}
public function getPattern(): string
{
return '/protected/cdr-webhook';
}
public function __invoke(ServerRequest $request, Response $response, array $args): Response
{
$result = [];
foreach ($request->getParsedBody() as $uuid => $data) {
$cdr = new CDR($data['phone']);
$cdr->callId = $uuid;
$cdr->timestamp = $data['timestamp'];
$cdr->duration = $data['duration'];
$cdr->recordUri = $data['recordUrl'];
$cdr->pricing = new CdrPricing(new Money(
$data['cost'],
new Currency($_ENV['LV_PLUGIN_PBX_PRICING_CURRENCY'])
));
$result[] = $cdr;
}
// Authenticate via X-PLUGIN-TOKEN header
$jwt = $request->getHeader('X-PLUGIN-TOKEN')[0] ?? '';
$token = new GraphqlInputToken($jwt);
Connector::setReference($token->getPluginReference());
if (Registration::find() === null) {
throw new \Slim\Exception\HttpException($request, 'Plugin was not registered', 403);
}
// Send CDRs to SalesRender backend
$cdrSender = new CdrSender(...$result);
$cdrSender();
return $response->withJson($result);
}
}
use SalesRender\Plugin\Core\PBX\Factories\WebAppFactory;
);
$application->run();
#!/usr/bin/env php
use SalesRender\Plugin\Core\PBX\Factories\ConsoleAppFactory;
n();
$sender = new CdrWebhookSender($cdrWebhook1, $cdrWebhook2);
$sender(); // Queues a SpecialRequestTask
$sender = new CdrSender($cdr1, $cdr2, $cdr3);
$sender(); // Creates and saves a SpecialRequestTask
Settings::addOnSaveHandler(function (Settings $settings) {
$builder = new ConfigBuilder($settings);
$sender = new ConfigSender($builder);
$sender(); // Builds config, signs it with JWT, and queues the request
});