YetiForceCompany/YetiForceCRM

View on GitHub
modules/OpenStreetMap/models/Coordinate.php

Summary

Maintainability
D
1 day
Test Coverage
F
10%
<?php

/**
 * Coordiante model.
 *
 * @copyright YetiForce S.A.
 * @license   YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com)
 * @author    Tomasz Kur <t.kur@yetiforce.com>
 * @author    Mariusz Krzaczkowski <m.krzaczkowski@yetiforce.com>
 */
class OpenStreetMap_Coordinate_Model extends \App\Base
{
    /**
     * Radius earth.
     */
    const EARTH_RADIUS = 6378137;

    /**
     * Function to get instance.
     *
     * @return \self
     */
    public static function getInstance()
    {
        return new self();
    }

    /**
     * The function return the border coordinates for the point.
     *
     * @param array $coordinates
     * @param int   $radius
     *
     * @return float[]
     */
    private function getMargins($coordinates, $radius)
    {
        $earthRadius = static::EARTH_RADIUS;
        $lat = $coordinates['lat'];
        $long = $coordinates['lon'];
        $radius *= 1000;

        return [
            'latMax' => $lat + rad2deg($radius / $earthRadius),
            'latMin' => $lat - rad2deg($radius / $earthRadius),
            'lonMax' => $long + rad2deg($radius / $earthRadius / cos(deg2rad($lat))),
            'lonMin' => $long - rad2deg($radius / $earthRadius / cos(deg2rad($lat))),
        ];
    }

    /**
     * Function to get coordinates of center point.
     *
     * @return array
     */
    public function getCoordinatesCenter()
    {
        $coordinatesCenter = [];
        if (!$this->isEmpty('lat') && !$this->isEmpty('lon')) {
            $coordinatesCenter = [
                'lat' => $this->get('lat'),
                'lon' => $this->get('lon'),
            ];
        }
        if ($searchValue = $this->get('searchValue')) {
            $coordinatesCenter = \App\Map\Coordinates::getInstance()->getCoordinatesByValue($searchValue);
        }
        $this->set('coordinatesCenter', $coordinatesCenter);
        return $coordinatesCenter;
    }

    /**
     * Function get label in popup.
     *
     * @param int $crmid
     *
     * @return string
     */
    public function getLabelsToPopupById($crmid)
    {
        $recodMetaData = \vtlib\Functions::getCRMRecordMetadata($crmid);
        $moduleName = $recodMetaData['setype'];
        $queryGenerator = new App\QueryGenerator($moduleName);
        $fields = App\Config::module('OpenStreetMap', 'mapPinFields');
        $queryGenerator->setFields($fields[$moduleName]);
        $queryGenerator->addNativeCondition(['vtiger_crmentity.crmid' => $crmid]);
        $row = $queryGenerator->createQuery()->one();
        $html = '';
        foreach ($row as $value) {
            if (!empty($value)) {
                $html .= \App\Purifier::encodeHtml($value) . '<br />';
            }
        }
        return $html;
    }

    /**
     * Function to get coordinates for record.
     *
     * @param int $recordId
     *
     * @return array
     */
    public function readCoordinates($recordId)
    {
        $dataReader = (new App\Db\Query())->from('u_#__openstreetmap')
            ->where(['crmid' => $recordId])
            ->createCommand()->query();
        $popup = self::getLabelsToPopupById($recordId);
        $coordinates = [];
        while ($row = $dataReader->read()) {
            if (!empty($row['lat'] && !empty($row['lon']))) {
                $coordinates[] = [
                    'lat' => $row['lat'],
                    'lon' => $row['lon'],
                    'label' => $popup,
                    'color' => '#000',
                ];
            }
        }
        $dataReader->close();
        return $coordinates;
    }

    /**
     * Function to get content in popup.
     *
     * @param array  $data
     * @param string $moduleName
     *
     * @return string
     */
    public function getLabelToPopupByArray($data, $moduleName)
    {
        $html = '<b><a href="index.php?module=' . $moduleName . '&view=Detail&record=' . $data['crmid'] . '"><span class="description">';
        $fields = App\Config::module('OpenStreetMap', 'mapPinFields');
        foreach ($fields[$moduleName] as $fieldName) {
            if (!empty($data[$fieldName])) {
                $html .= \App\Purifier::encodeHtml($data[$fieldName]) . '<br />';
            }
        }
        $html .= '</span></a></b><input type=hidden class="coordinates" data-lon="' . $data['lon'] . '" data-lat="' . $data['lat'] . '">';
        $html .= '<button class="btn btn-success btn-xs startTrack marginTB3 mr-3"><span class="fas fa-truck mr-2"></span>' . \App\Language::translate('LBL_START') . '</button>';
        $html .= '<button class="btn btn-danger btn-xs endTrack marginTB3"><span class="fas fa-flag-checkered mr-2"></span>' . \App\Language::translate('LBL_END') . '</button><br />';
        $html .= '<button class="btn btn-warning btn-xs indirectPoint marginTB3 mr-3"><span class="fas fa-flag mr-2"></span>' . \App\Language::translate('LBL_INDIRECT_POINT', 'OpenStreetMap') . '</button>';
        return $html . '<button class="btn btn-primary btn-xs searchInRadius marginTB3"><span class="fas fa-arrows-to-dot mr-2"></span>' . \App\Language::translate('LBL_SEARCH_IN_RADIUS', 'OpenStreetMap') . '</button>';
    }

    public static $colors = [];

    /**
     * Draws color.
     *
     * @staticvar int $indexColor
     *
     * @param string $value
     *
     * @return string color
     */
    private function getMarkerColor($value)
    {
        static $indexColor = 0;
        if (empty($value)) {
            return '#000';
        }
        if (isset(self::$colors[$value])) {
            return self::$colors[$value];
        }
        $defaultColors = ['ff0000', 'ff00de', '7000ff', '001eff', '00c2ff', '00ff45', 'ff9b00', '961d5f',
            'FF79E1', 'FF73B9', 'FE67EB', 'E77AFE', 'D97BFD', 'A27AFE', 'FF8A8A', 'FF86E3', 'FF86C2',
            'FE8BF0', 'EA8DFE', 'DD88FD', 'AD8BFE', 'FF9797', 'FF97E8', 'FF97CB', 'FE98F1', 'ED9EFE',
            'E29BFD', 'B89AFE', 'FFA8A8', 'FFACEC', 'FFA8D3', 'FEA9F3', 'EFA9FE', 'E7A9FE', 'C4ABFE',
            'FFBBBB', 'FFACEC', 'FFBBDD', 'FFBBF7', 'F2BCFE', 'EDBEFE', 'D0BCFE', 'FFCECE', 'FFC8F2',
            'FFC8E3', 'FFCAF9', 'F5CAFF', 'F0CBFE', 'DDCEFF', 'FFDFDF', 'FFDFF8', 'FFDFEF', 'FFDBFB',
            'F9D9FF', 'F4DCFE', 'E6DBFF', 'FFECEC', 'FFEEFB', 'FFECF5', 'FFEEFD', 'FDF2FF', 'FAECFF',
            'F1ECFF', 'FFF2F2', 'FFFEFB', 'FFF9FC', 'FFF9FE', 'FFFDFF', 'FDF9FF', 'FBF9FF', '800080',
            '872187', '9A03FE', '892EE4', '3923D6', '2966B8', '23819C', 'BF00BF', 'BC2EBC', 'A827FE',
            '9B4EE9', '6755E3', '2F74D0', '2897B7', 'DB00DB', 'D54FD5', 'B445FE', 'A55FEB', '8678E9',
            '4985D6', '2FAACE', 'F900F9', 'DD75DD', 'BD5CFE', 'AE70ED', '9588EC', '6094DB', '44B4D5',
            'FF4AFF', 'DD75DD', 'C269FE', 'AE70ED', 'A095EE', '7BA7E1', '57BCD9', 'FF86FF', 'E697E6',
            'CD85FE', 'C79BF2', 'B0A7F1', '8EB4E6', '7BCAE1', 'FFA4FF', 'EAA6EA', 'D698FE', 'CEA8F4',
            'BCB4F3', 'A9C5EB', '8CD1E6', 'FFBBFF', 'EEBBEE', 'DFB0FF', 'DBBFF7', 'CBC5F5', 'BAD0EF',
            'A5DBEB', 'FFCEFF', 'F0C4F0', 'E8C6FF', 'E1CAF9', 'D7D1F8', 'CEDEF4', 'B8E2EF', 'FFDFFF',
            'F4D2F4', 'EFD7FF', 'EDDFFB', 'E3E0FA', 'E0EAF8', 'C9EAF3', 'FFECFF', 'F4D2F4', 'F9EEFF',
            'F5EEFD', 'EFEDFC', 'EAF1FB', 'DBF0F7', 'FFF9FF', 'FDF9FD', 'FEFDFF', 'FEFDFF', 'F7F5FE',
            'F8FBFE', 'EAF7FB', '5757FF', '62A9FF', '62D0FF', '06DCFB', '01FCEF', '03EBA6', '01F33E',
            '6A6AFF', '75B4FF', '75D6FF', '24E0FB', '1FFEF3', '03F3AB', '0AFE47', '7979FF', '86BCFF',
            '8ADCFF', '3DE4FC', '5FFEF7', '33FDC0', '4BFE78', '8C8CFF', '99C7FF', '99E0FF', '63E9FC',
            '74FEF8', '62FDCE', '72FE95', '9999FF', '99C7FF', 'A8E4FF', '75ECFD', '92FEF9', '7DFDD7',
            '8BFEA8', 'AAAAFF', 'A8CFFF', 'BBEBFF', '8CEFFD', 'A5FEFA', '8FFEDD', 'A3FEBA', 'BBBBFF',
            'BBDAFF', 'CEF0FF', 'ACF3FD', 'B5FFFC', 'A5FEE3', 'B5FFC8', 'CACAFF', 'D0E6FF', 'D9F3FF',
            'C0F7FE', 'CEFFFD', 'BEFEEB', 'CAFFD8', 'E1E1FF', 'DBEBFF', 'ECFAFF', 'C0F7FE', 'E1FFFE',
            'BDFFEA', 'EAFFEF', 'EEEEFF', 'ECF4FF', 'F9FDFF', 'E6FCFF', 'F2FFFE', 'CFFEF0', 'EAFFEF',
            'F9F9FF', 'F9FCFF', 'FDFEFF', 'F9FEFF', 'FDFFFF', 'F7FFFD', 'F9FFFB', '1FCB4A', '59955C',
            '48FB0D', '2DC800', '59DF00', '9D9D00', 'B6BA18', '27DE55', '6CA870', '79FC4E', '32DF00',
            '61F200', 'C8C800', 'CDD11B', '4AE371', '80B584', '89FC63', '36F200', '66FF00', 'DFDF00',
            'DFE32D', '7CEB98', '93BF96', '99FD77', '52FF20', '95FF4F', 'FFFFAA', 'EDEF85', '93EEAA',
            'A6CAA9', 'AAFD8E', '6FFF44', 'ABFF73', 'FFFF84', 'EEF093', 'A4F0B7', 'B4D1B6', 'BAFEA3',
            '8FFF6F', 'C0FF97', 'FFFF99', 'F2F4B3', 'BDF4CB', 'C9DECB', 'CAFEB8', 'A5FF8A', 'D1FFB3',
            'FFFFB5', 'F5F7C4', 'D6F8DE', 'DBEADC', 'DDFED1', 'B3FF99', 'DFFFCA', 'FFFFC8', 'F7F9D0',
            'E3FBE9', 'E9F1EA', 'EAFEE2', 'D2FFC4', 'E8FFD9', 'FFFFD7', 'FAFBDF', 'E3FBE9', 'F3F8F4',
            'F1FEED', 'E7FFDF', 'F2FFEA', 'FFFFE3', 'FCFCE9', 'FAFEFB', 'FBFDFB', 'FDFFFD', 'F5FFF2',
            'FAFFF7', 'FFFFFD', 'FDFDF0', 'BABA21', 'C8B400', 'DFA800', 'DB9900', 'FFB428', 'FF9331',
            'FF800D', 'E0E04E', 'D9C400', 'F9BB00', 'EAA400', 'FFBF48', 'FFA04A', 'FF9C42', 'E6E671',
            'E6CE00', 'FFCB2F', 'FFB60B', 'FFC65B', 'FFAB60', 'FFAC62', 'EAEA8A', 'F7DE00', 'FFD34F',
            'FFBE28', 'FFCE73', 'FFBB7D', 'FFBD82', 'EEEEA2', 'FFE920', 'FFDD75', 'FFC848', 'FFD586',
            'FFC48E', 'FFC895', 'F1F1B1', 'FFF06A', 'FFE699', 'FFD062', 'FFDEA2', 'FFCFA4', 'FFCEA2',
            'F4F4BF', 'FFF284', 'FFECB0', 'FFE099', 'FFE6B5', 'FFD9B7', 'FFD7B3', 'F7F7CE', 'FFF7B7',
            'FFF1C6', 'FFEAB7', 'FFEAC4', 'FFE1C6', 'FFE2C8', 'F9F9DD', 'FFF9CE', 'FFF5D7', 'FFF2D2',
            'FFF2D9', 'FFEBD9', 'FFE6D0', 'FBFBE8', 'FFFBDF', 'FFFAEA', 'FFF9EA', 'FFF7E6', 'FFF4EA',
            'FFF1E6', 'FEFEFA', 'FFFEF7', 'FFFDF7', 'FFFDF9', 'FFFDF9', 'FFFEFD', 'FFF9F4', 'D1D17A',
            'C0A545', 'C27E3A', 'C47557', 'B05F3C', 'C17753', 'B96F6F', 'D7D78A', 'CEB86C', 'C98A4B',
            'CB876D', 'C06A45', 'C98767', 'C48484', 'DBDB97', 'D6C485', 'D19C67', 'D29680', 'C87C5B',
            'D0977B', 'C88E8E', 'E1E1A8', 'DECF9C', 'DAAF85', 'DAA794', 'CF8D72', 'DAAC96', 'D1A0A0',
            'E9E9BE', 'E3D6AA', 'DDB791', 'DFB4A4', 'D69E87', 'E0BBA9', 'D7ACAC', 'EEEECE', 'EADFBF',
            'E4C6A7', 'E6C5B9', 'DEB19E', 'E8CCBF', 'DDB9B9', 'E9E9C0', 'EDE4C9', 'E9D0B6', 'EBD0C7',
            'E4C0B1', 'ECD5CA', 'E6CCCC', 'EEEECE', 'EFE7CF', 'EEDCC8', 'F0DCD5', 'EACDC1', 'F0DDD5',
            'ECD9D9', 'F1F1D6', 'F5EFE0', 'F2E4D5', 'F5E7E2', 'F0DDD5', 'F5E8E2', 'F3E7E7', 'F5F5E2',
            'F9F5EC', 'F9F3EC', 'F9EFEC', 'F5E8E2', 'FAF2EF', 'F8F1F1', 'FDFDF9', 'FDFCF9', 'FCF9F5',
            'FDFAF9', 'FDFAF9', 'FCF7F5', 'FDFBFB', 'F70000', 'B9264F', '990099', '74138C', '0000CE',
            '1F88A7', '4A9586', 'FF2626', 'D73E68', 'B300B3', '8D18AB', '5B5BFF', '25A0C5', '5EAE9E',
            'FF5353', 'DD597D', 'CA00CA', 'A41CC6', '7373FF', '29AFD6', '74BAAC', 'FF7373', 'E37795',
            'D900D9', 'BA21E0', '8282FF', '4FBDDD', '8DC7BB', 'FF8E8E', 'E994AB', 'FF2DFF', 'CB59E8',
            '9191FF', '67C7E2', 'A5D3CA', 'FFA4A4', 'EDA9BC', 'F206FF', 'CB59E8', 'A8A8FF', '8ED6EA',
            'C0E0DA', 'FFB5B5', 'F0B9C8', 'FF7DFF', 'D881ED', 'B7B7FF', 'A6DEEE', 'CFE7E2', 'FFC8C8',
            'F4CAD6', 'FFA8FF', 'EFCDF8', 'C6C6FF', 'C0E7F3', 'DCEDEA', 'FFEAEA', 'F8DAE2', 'FFC4FF',
            'EFCDF8', 'DBDBFF', 'D8F0F8', 'E7F3F1', 'FFEAEA', 'FAE7EC', 'FFE3FF', 'F8E9FC', 'EEEEFF',
            'EFF9FC', 'F2F9F8', 'FFFDFD', 'FEFAFB', 'FFFDFF', 'FFFFFF', 'FDFDFF', 'FAFDFE', 'F7FBFA', ];

        $color = '#' . $defaultColors[$indexColor];
        ++$indexColor;
        self::$colors[$value] = $color;

        return $color;
    }

    /**
     * Function to get coordinates for many records.
     *
     * @param int[] $records Array with id of records
     *
     * @return array
     */
    public function readCoordinatesByRecords(array $records)
    {
        $moduleModel = $this->get('srcModuleModel');
        $groupByField = $this->get('groupBy');
        $coordinatesCenter = $this->get('coordinatesCenter');
        $radius = $this->get('radius');
        $moduleName = $moduleModel->getName();
        $fields = App\Config::module('OpenStreetMap', 'mapPinFields');
        $fields = $fields[$moduleName];
        if (!empty($groupByField)) {
            $fields[] = $groupByField;
        }
        $queryGenerator = new App\QueryGenerator($moduleName);
        $queryGenerator->setFields($fields);
        $queryGenerator->setCustomColumn('u_#__openstreetmap.lat');
        $queryGenerator->setCustomColumn('u_#__openstreetmap.lon');
        $queryGenerator->setCustomColumn('vtiger_crmentity.crmid');
        $queryGenerator->addJoin(['LEFT JOIN', 'u_#__openstreetmap', 'vtiger_crmentity.crmid = u_#__openstreetmap.crmid']);
        $query = $queryGenerator->createQuery();
        $andWhere = ['and', ['vtiger_crmentity.crmid' => $records], ['u_#__openstreetmap.type' => 'a']];
        if (!empty($coordinatesCenter) && !empty($radius)) {
            $margins = self::getMargins($coordinatesCenter, $radius);
            $andWhere[] = ['<', 'u_#__openstreetmap.lat', $margins['latMax']];
            $andWhere[] = ['>', 'u_#__openstreetmap.lat', $margins['latMin']];
            $andWhere[] = ['<', 'u_#__openstreetmap.lon', $margins['lonMax']];
            $andWhere[] = ['>', 'u_#__openstreetmap.lon', $margins['lonMin']];
        }
        $dataReader = $query->andWhere($andWhere)->createCommand()->query();
        $coordinates = [];
        while ($row = $dataReader->read()) {
            if (!empty($row['lat'] && !empty($row['lon']))) {
                $coordinates[] = [
                    'recordId' => $row['crmid'],
                    'lat' => $row['lat'],
                    'lon' => $row['lon'],
                    'label' => self::getLabelToPopupByArray($row, $moduleName),
                    'color' => self::getMarkerColor($row[$groupByField] ?? '')
                ];
            }
        }
        $dataReader->close();

        return $coordinates;
    }

    /**
     * Get coordinates for select records.
     *
     * @return array
     */
    public function getCoordinatesCustomView()
    {
        $selectedIds = $this->get('selectedIds');
        if ('all' == $selectedIds) {
            return $this->readAllCoordinatesFromCustomeView();
        }
        if (!empty($selectedIds)) {
            return $this->readCoordinatesByRecords(Vtiger_Mass_Action::getRecordsListFromRequest($this->get('request')));
        }
        return [];
    }

    /**
     * Get coordinates for all records in the listview.
     *
     * @return array
     */
    public function readAllCoordinatesFromCustomeView()
    {
        $moduleModel = $this->get('srcModuleModel');
        $moduleName = $moduleModel->getName();
        $excludedIds = $this->get('excluded_ids');
        $searchValue = $this->get('search_value');
        $operator = $this->get('operator');
        $groupByField = $this->get('groupBy');
        $coordinatesCenter = $this->get('coordinatesCenter');
        $radius = $this->get('radius');
        $fields = App\Config::module('OpenStreetMap', 'mapPinFields');
        $fields = $fields[$moduleName];
        if (!empty($groupByField)) {
            $fields[] = $groupByField;
            $fieldModel = Vtiger_Field_Model::getInstance($groupByField, $moduleModel);
            $groupByFieldColumn = $fieldModel->get('column');
        }
        $queryGenerator = new App\QueryGenerator($moduleName);
        $queryGenerator->initForCustomViewById($this->get('viewname'));
        $queryGenerator->setFields($fields);
        $queryGenerator->setCustomColumn('u_#__openstreetmap.lat');
        $queryGenerator->setCustomColumn('u_#__openstreetmap.lon');
        $queryGenerator->setCustomColumn('vtiger_crmentity.crmid');
        if ($advancedConditions = $this->get('advancedConditions')) {
            $queryGenerator->setAdvancedConditions($advancedConditions);
        }
        $queryGenerator->addJoin(['LEFT JOIN', 'u_#__openstreetmap', 'u_#__openstreetmap.crmid = vtiger_crmentity.crmid']);
        if (!empty($searchValue) && $operator) {
            $queryGenerator->addCondition($this->get('search_key'), $searchValue, $operator);
        }
        $searchParams = $this->getArray('search_params');
        if (empty($searchParams)) {
            $searchParams = [];
        }
        foreach ($searchParams as $key => $value) {
            if (empty($value)) {
                unset($searchParams[$key]);
            }
        }
        $transformedSearchParams = $queryGenerator->parseBaseSearchParamsToCondition($searchParams);
        $queryGenerator->parseAdvFilter($transformedSearchParams);
        $queryGenerator->addNativeCondition(['u_#__openstreetmap.type' => 'a']);
        if ($excludedIds && !empty($excludedIds) && \is_array($excludedIds) && \count($excludedIds) > 0) {
            $queryGenerator->addNativeCondition(['not in', 'vtiger_crmentity.crmid', $excludedIds]);
        }
        if (!empty($coordinatesCenter) && !empty($radius)) {
            $margins = self::getMargins($coordinatesCenter, $radius);
            $queryGenerator->addNativeCondition([
                'and',
                ['<', 'u_#__openstreetmap.lat', $margins['latMax']],
                ['>', 'u_#__openstreetmap.lat', $margins['latMin']],
                ['<', 'u_#__openstreetmap.lon', $margins['lonMax']],
                ['>', 'u_#__openstreetmap.lon', $margins['lonMin']],
            ]);
        }
        $dataReader = $queryGenerator->createQuery()->createCommand()->query();
        $coordinates = [];
        while ($row = $dataReader->read()) {
            if (!empty($row['lat'] && !empty($row['lon']))) {
                $coordinates[] = [
                    'recordId' => $row['crmid'],
                    'lat' => $row['lat'],
                    'lon' => $row['lon'],
                    'label' => self::getLabelToPopupByArray($row, $moduleName),
                    'color' => self::getMarkerColor($row[$groupByFieldColumn]),
                ];
            }
        }
        $dataReader->close();
        return $coordinates;
    }

    /**
     * Get total count of records in the clipboard.
     *
     * @return array
     */
    public function getCachedRecords()
    {
        $db = \App\Db::getInstance();
        $dataReader = (new App\Db\Query())->select(['count' => 'COUNT(*)', 'module_name'])
            ->from('u_#__openstreetmap_cache')->where(['user_id' => Users_Privileges_Model::getCurrentUserModel()->getId()])
            ->groupBy('module_name')
            ->createCommand($db)->query();
        $records = [];
        while ($row = $dataReader->read()) {
            $records[$row['module_name']] = $row['count'];
        }
        $dataReader->close();

        return $records;
    }

    /**
     * Get coordinates for records from the clipboard.
     *
     * @return array
     */
    public function readCoordinatesCache()
    {
        $modules = $this->get('cache');
        $currentUser = Users_Privileges_Model::getCurrentUserModel();
        $userId = $currentUser->getId();
        $db = \App\Db::getInstance();
        $coordinates = [];
        foreach ($modules as $moduleName) {
            $records = (new App\Db\Query())
                ->select(['crmids'])
                ->from('u_#__openstreetmap_cache')
                ->where(['user_id' => $userId, 'module_name' => $moduleName])
                ->createCommand($db)->queryColumn();
            if (!empty($records)) {
                $this->set('srcModuleModel', Vtiger_Module_Model::getInstance($moduleName));
                $coordinates[$moduleName] = $this->readCoordinatesByRecords($records);
            }
        }
        return $coordinates;
    }

    /**
     * Save records to clipboard.
     *
     * @param array $records Array with records id
     */
    public function saveCache($records)
    {
        $moduleName = $this->get('moduleName');
        $userId = Users_Privileges_Model::getCurrentUserModel()->getId();
        $insertedData = [];
        foreach ($records as $recordId) {
            $insertedData[] = [$userId, $moduleName, $recordId];
        }
        App\Db::getInstance()->createCommand()
            ->batchInsert('u_#__openstreetmap_cache', ['user_id', 'module_name', 'crmids'], $insertedData)
            ->execute();
    }

    /**
     * Removes records in the clipbord.
     */
    public function deleteCache()
    {
        $moduleName = $this->get('moduleName');
        \App\Db::getInstance()->createCommand()
            ->delete('u_#__openstreetmap_cache', ['module_name' => $moduleName, 'user_id' => Users_Privileges_Model::getCurrentUserModel()->getId()])
            ->execute();
    }

    /**
     * Function to set all records from module to cache.
     */
    public function saveAllRecordsToCache()
    {
        $moduleName = $this->get('moduleName');
        $queryGenerator = new App\QueryGenerator($moduleName);
        $queryGenerator->setFields(['id']);
        $dataReader = $queryGenerator->createQuery()->createCommand()->query();
        $records = [];
        while ($row = $dataReader->read()) {
            $records[] = $row['id'];
        }
        $this->deleteCache();
        $this->saveCache($records);

        return $dataReader->count();
    }

    /**
     * Adding records to the clipboard.
     *
     * @param type $record
     */
    public function addCache($record)
    {
        $moduleName = $this->get('moduleName');
        if (!(new \App\Db\Query())->from('u_#__openstreetmap_cache')
            ->where(['crmids' => $record])->exists()) {
            App\Db::getInstance()->createCommand()->insert('u_#__openstreetmap_cache', [
                'module_name' => $moduleName,
                'user_id' => Users_Privileges_Model::getCurrentUserModel()->getId(),
                'crmids' => $record,
            ])->execute();
        }
    }
}