PHP code example of salesrender / plugin-core-pbx

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
});

your-plugin/
  bootstrap.php
  console.php
  public/
    index.php
  src/
    ConfigBuilder.php
    Forms/
      SettingsForm.php
    Parsers/
      CdrApiParser.php
      CdrWebhookParser.php
  db/
  .env