Good day! And attention please! This is not a site of the next ordinary web-studio. I am a freelancer with great experience, working for a long time on the market of it-services. I do not take in work projects that cannot accomplish on my own and do not engage third-party developers.

On our web-site You will find descriptions of our solutions and services, developed modules and plugins for different systems, projects, examples of works, useful articles, links, libraries and online services, as well as information about team members.

Advantages of working with us:

Direct contact with professional developer. Personal responsibility.

Flexible code. Multilateral experience. 24 hours accessibility.

Possibility of payment on fact,
work under the contract, time fixing.

We can assist You in integration, customization, adaptation and support the following systems and services:
iTeamO.net / CRM-integration ( vTiger, Sugar, Suite, Bitrix24 ), cloud apps, modules and plugins development
In our work we use popular information technologies - we can help you in their professional application
php mysql html css javascript jquery ajax postgresSql node.JS angularJS laravel phonegap
We are registered partners of these software suppliers and ready to offer You discounts on their products
bitrix bitrix24 vTiger webasyst shop-script phpShop amocrm
namespace iteamo\framework;
require_once(__DIR__ . '/core/app.php');
require_once(__DIR__ . '/libs/traits/withSingleton.php');
/**
 *
 */
class app extends core\app{
public function getLib($key = '', $arParams = [], $arOptions = ['checkParent' => true]) {
  $objLib = parent::getLib($key, $arParams);
  //
  if ($arOptions['checkParent'] && empty($objLib)) {
    if ($this->arClass['name'] != __class__) {
      $parentClass = $this->arClass['parent'];
      $objLib = $parentClass::get()->getLib($key, $arParams, $arOptions);
    }
  }
  //
  return $objLib;
}
//
public function getView($key = '', $arData = [], $arOptions = ['checkParent' => false]) {
  $strView = parent::getView($key, $arData);
  //
  if ($arOptions['checkParent'] && is_null($strView)) {
    if ($this->arClass['name'] != __class__) {
        $parentClass = $this->arClass['parent'];
        $strView = $parentClass::get()->getView($key, $arData, $arOptions);
    }
  }
  //
  return $strView;
}
static public function parsePaths($arItem = []) {
  $arItemResult = [];
  foreach($arItem as $key => $value) {
    if (stripos('prefix' . $key, '[')) {
      $fullPath = '[' . substr_replace($key, '][', stripos($key, '['), 1);
      eval("\$arItemResult" . $fullPath . " = \$value;");
    } else $arItemResult[$key] = $value;
  }
  return $arItemResult;
}
request = {
  getDataFromUrl: function(url) {
    var arData = {};
    if(typeof url != 'undefined' && url.indexOf('?')!== -1) {
      var urlSplit = url.split('?');
      var queryString = urlSplit[1];
      var queryParameters = queryString.split('&');
      for(var index=0; index < queryParameters.length; index++) {
      	var queryParam = queryParameters[index];
      	var queryParamComponents = queryParam.split('=');
      	arData[queryParamComponents[0]] = queryParamComponents[1];
      }
    }
    return arData;
  },
  send: function(path, arData, arParams) {
    if (empty(arData)) arParams = {};
    if (empty(arParams)) arParams = {};
    //
    arParamsDefault = {
      dataType: 'json',
      type: 'GET',
    };
    arParams = jQuery.extend(false, {}, arParamsDefault, arParams);
    //
    var aDeferred = jQuery.Deferred();
		var success = function(data, status, jqXHR) {
      aDeferred.resolve(data);
		}
		var error = function(jqXHR, textStatus, errorThrown){
      aDeferred.reject(textStatus, errorThrown);
		}
    //
    var arDataFromUrl = this.getDataFromUrl(path);
    arData = jQuery.extend(false, {}, arData, arDataFromUrl);
    arParams.data = arData;
    arParams.url = path;
    arParams.timeout = 30000;
		arParams.success = success;
		arParams.error = error;
    //
		jQuery.ajax(arParams);
    //
    return aDeferred.promise();
  },
};
  
templater = {
  parse : function(strTemplate, arData) {
    var strParsedTemplate =
      strTemplate.replace(/\{([a-zA-Z0-9 ]*)\}/g, function(m, key) {
        result = arData[key.trim()];
        return result;
    });
    return strParsedTemplate;
  }
};
init: function (context) {
  window.$this = (context != undefined)?context:this;
  $this.cancelDefaultModulePolling();
  $this.parent.init($this);
},
isPageToInitPhoneLinks: function() {
  var result = false;
  var url = window.location.toString();
  if (/(Leads|Contacts|Accounts|PBXManager)/i.test(url)) {
    result = true;
  }
  return result;
},
isPageToInitCallListeningRecords: function() {
  return $this.isPageToInitPhoneLinks();
},
startCallNotify: function(arResult) {
  var params = {'type' : 'error', 'text' :  app.vtranslate('JS_PBX_OUTGOING_FAILURE')};
  if(arResult.status){
    params = {'type' : 'info', 'text' :  app.vtranslate('JS_PBX_OUTGOING_SUCCESS')};
  } else {
    if(!empty(arResult.arErrors)){
      params.text += ': ' + implode(';', arResult.arErrors);
    }
  }
  notification.show(params);
},
namespace iteamo\framework\libs\traits;
use \iteamo\framework\app;
trait withSingleton {
static public function get($arParams = []) {
  static $objInstances = [];
  $class = get_called_class();
  if (empty($objInstances[$class])) {
    $objInstances[$class] = new $class($arParams);
  }
  return $objInstances[$class];
}
}
public function update($arItem = []) {
  $count = false;
  $arItem = $this->prepareData($arItem);
  $arItems = self::filter($this->arItems, $this->arFilters);
  foreach($arItems as $key => $arItem) {
    $this->arItems[$key] = arrays::mergeUpdate($this->arItems[$key], $arItem);
  }
  $count = count($arItems);
  $this->reset();
  //
  return $count;
}


class entity {
use \iteamo\framework\libs\traits\withEntityInterface{
  \iteamo\framework\libs\traits\withEntityInterface::getItem as traitGetItem;
  \iteamo\framework\libs\traits\withEntityInterface::prepareData as traitPrepareData;
  \iteamo\framework\libs\traits\withEntityInterface::filter as traitFilter;
}
public $arCorrespondence = [];
public $table = '';
public $moduleId = 0;
//
private $dbQueryDriver = null;
/**
 *
 */
public function __construct() {
  include_once 'include/Webservices/Utils.php';
  $this->dbQueryDriver = \iteamo\framework\init::getLib('database/queryDrivers/sql');
}
/**
 *
 */
function filter($arFilters = array()) {
  if (!empty($arFilters['anyPhone'])) {
    $objDb = \PearDatabase::getInstance();