Your IP : 216.73.216.180


Current Path : /home/bitrix/ext_www/mr.yacl.site/demo/
Upload File :
Current File : /home/bitrix/ext_www/mr.yacl.site/demo/1_employees.php

<?php

use Bitrix\Main\Application;
use Bitrix\Main\Config\Option;
use Bitrix\Main\InvalidOperationException;
use Bitrix\Main\Loader;
use Bitrix\Main\PhoneNumber\Format;
use Bitrix\Main\PhoneNumber\Parser;
use Faker\Factory;
use Korus\Main\Orm\Iblock\Manager;

define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS", true);
define("BX_CRONTAB", true);
define('BX_WITH_ON_AFTER_EPILOG', true);
define('BX_NO_ACCELERATOR_RESET', true);
define("CRON_RUN", true);

if (empty($_SERVER["DOCUMENT_ROOT"])) {
    $_SERVER["DOCUMENT_ROOT"] = realpath(dirname(__DIR__));
}
$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"];

require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
require($_SERVER["DOCUMENT_ROOT"] . "/vendor/autoload.php");

@set_time_limit(0);
@ignore_user_abort(true);

Loader::includeModule('korus.main');

$iblockManager = Manager::getInstance()->getProviderByCode('departments', 'structure');

$rootId = null;
$arSectionsMap = [];
$secTable = $iblockManager->getSectionTableClassName();
$db = $secTable::query()
    ->setSelect(['ID', 'NAME', 'DEPTH_LEVEL'])
    ->where('ACTIVE', 'Y')
    ->where('IBLOCK_ID', $secTable::getIblockId())
    ->whereBetween('DEPTH_LEVEL', 1, 3)
    ->setOrder(['LEFT_MARGIN'])
    ->exec();
while ($row = $db->fetch()) {
    switch ($row['DEPTH_LEVEL']) {
        case 1:
            $rootId = $row['ID'];
            break;

        case 2:
            $parent = $row;
            if (!isset($arSectionsMap[$row['NAME']])) {
                $arSectionsMap[$row['NAME']] = [
                    'ID' => $row['ID'],
                    'SECTIONS' => []
                ];
            }
            break;

        case 3:
            $arSectionsMap[$parent['NAME']]['SECTIONS'][$row['NAME']] = $row['ID'];
            break;
    }
}

$imagesPath = Application::getDocumentRoot() . '/demo/src/upload/employees';
$images = array_diff(scandir($imagesPath), ['.', '..']);

$phoneFilter = function ($v) {
    return '(35222)' != substr($v, 0, 7);
};

$connection = Application::getConnection();
$connection->startTransaction();
try {
    $faker = Factory::create('ru_RU');

    $userGroups = Option::get('main', 'new_user_registration_def_group');
    $userGroups = explode(',', $userGroups);

    if (!$rootId) {
        $arFields = [
            "ACTIVE" => 'Y',
            "IBLOCK_ID" => $secTable::getIblockId(),
            "NAME" => 'Компания',
            "CODE" => $faker->unique()->numerify('demo_###')
        ];

        $bs = new \CIBlockSection;
        $rootId = $bs->Add($arFields);
        if (!$rootId) {
            throw new InvalidOperationException(sprintf('Не удалось создать раздел "Компания": %s', $bs->LAST_ERROR));
        }
    }

    $csvFile = new \CCSVData();
    $csvFile->SetFirstHeader(true);
    $csvFile->SetDelimiter(',');
    $csvFile->LoadFile(Application::getDocumentRoot() . '/demo/src/employees.csv');
    while ($row = $csvFile->Fetch()) {
        list($position, $department, $affiliate) = array_map('trim', $row);

        if ($affiliate) {
            if (!isset($arSectionsMap[$affiliate])) {
                $arFields = [
                    "ACTIVE" => 'Y',
                    "IBLOCK_ID" => $secTable::getIblockId(),
                    "IBLOCK_SECTION_ID" => $rootId,
                    "NAME" => $affiliate,
                    "CODE" => $faker->unique()->numerify('demo_###')
                ];

                $bs = new \CIBlockSection;
                $id = $bs->Add($arFields);
                if ($id) {
                    $arSectionsMap[$affiliate] = [
                        'ID' => $id,
                        'SECTIONS' => []
                    ];
                } else {
                    throw new InvalidOperationException(sprintf('Не удалось создать раздел "%s": %s', $affiliate, $bs->LAST_ERROR));
                }
            }

            if (!isset($arSectionsMap[$affiliate]['SECTIONS'][$department])) {
                $arFields = [
                    "ACTIVE" => 'Y',
                    "IBLOCK_ID" => $secTable::getIblockId(),
                    "IBLOCK_SECTION_ID" => $arSectionsMap[$affiliate]['ID'],
                    "NAME" => $department,
                    "CODE" => $faker->unique()->numerify('demo_###')
                ];

                $bs = new \CIBlockSection;
                $id = $bs->Add($arFields);
                if ($id) {
                    $arSectionsMap[$affiliate]['SECTIONS'][$department] = $id;
                } else {
                    throw new InvalidOperationException(sprintf('Не удалось создать раздел "%s": %s', $department, $bs->LAST_ERROR));
                }
            }
        }

        $img = $faker->unique()->randomElement($images);
        $gender = mb_substr($img, 0, 1);
        $genderForFaker = $gender == 'M' ? 'male' : 'female';
        $login = $faker->unique()->numerify('demo_###');
        $email = $login . '@k-team.vm';
        $pass = $login . '_pass1937';

        $arUser = [
            'ACTIVE' => 'Y',
            'NAME' => $faker->firstName($genderForFaker),
            'SECOND_NAME' => $faker->middleName($genderForFaker),
            'LAST_NAME' => $faker->lastName($genderForFaker),
            'EMAIL' => $email,
            'LOGIN' => $login,
            'PASSWORD' => $pass,
            'CONFIRM_PASSWORD' => $pass,
            'PERSONAL_GENDER' => $gender,
            'PERSONAL_BIRTHDAY' => $faker->dateTimeInInterval('-30years', '+1month')->format('d.m.Y'),
            'PERSONAL_PHOTO' => \CFile::MakeFileArray($imagesPath . DIRECTORY_SEPARATOR . $img),
            'PERSONAL_PHONE' => Parser::getInstance()->parse($faker->valid($phoneFilter)->phoneNumber())->format(Format::INTERNATIONAL),
            'WORK_POSITION' => $position,
            'WORK_PHONE' => Parser::getInstance()->parse($faker->valid($phoneFilter)->phoneNumber())->format(Format::INTERNATIONAL),
            'UF_DEPARTMENT' => [$arSectionsMap[$affiliate]['SECTIONS'][$department]],
            'GROUP_ID' => $userGroups
        ];
        $us = new \CUser;
        $id = $us->Add($arUser);
        if (!$id) {
            throw new InvalidOperationException(sprintf('Не удалось создать пользователя: %s', $us->LAST_ERROR));
        }
    }

    $connection->commitTransaction();
} catch (\Exception $e) {
    ShowError($e->getMessage());
    $connection->rollbackTransaction();
}