from table to db

This commit is contained in:
Arsen Mirzaev Tatyano-Muradovich 2024-01-22 19:22:39 +07:00
parent 4e88505833
commit f3bd5872f5

View File

@ -34,14 +34,14 @@ function generateLabel(string $name): string
return match ($name) { return match ($name) {
'id', 'ID' => 'id', 'id', 'ID' => 'id',
'name', 'ФИО' => 'name', 'name', 'ФИО' => 'name',
'phone', 'Номер' => 'phone', 'number', 'Номер' => 'number',
'birth', 'Дата рождения' => 'birth', 'birth', 'Дата рождения' => 'birth',
'address', 'Регистрация' => 'address', 'address', 'Регистрация' => 'address',
'commentary', 'Комментарий' => 'commentary', 'commentary', 'Комментарий', 'примечание к звонкам' => 'commentary',
'activity', 'Работа' => 'activity', 'activity', 'Работа' => 'activity',
'passport', 'Паспорт' => 'passport', 'passport', 'Паспорт' => 'passport',
'issued', 'Выдан' => 'issued', 'issued', 'Выдан' => 'issued',
'department', 'Подразделение' => 'department', 'department', 'Подразделение', 'Код подразделения' => 'department',
'hiring', 'Нанят' => 'hiring', 'hiring', 'Нанят' => 'hiring',
'district', 'Район', 'район' => 'district', 'district', 'Район', 'район' => 'district',
'requisites', 'Реквизиты', 'реквизиты' => 'requisites', 'requisites', 'Реквизиты', 'реквизиты' => 'requisites',
@ -57,14 +57,14 @@ function degenerateLabel(string $name): string
return match ($name) { return match ($name) {
'ID', 'id' => 'ID', 'ID', 'id' => 'ID',
'ФИО', 'name' => 'ФИО', 'ФИО', 'name' => 'ФИО',
'Номер', 'phone' => 'Номер', 'Номер', 'number' => 'Номер',
'Дата рождения', 'birth' => 'Дата рождения', 'Дата рождения', 'birth' => 'Дата рождения',
'Регистрация', 'address' => 'Регистрация', 'Регистрация', 'address' => 'Регистрация',
'Комментарий', 'commentary' => 'Комментарий', 'Комментарий', 'примечание к звонкам', 'commentary' => 'Комментарий',
'Работа', 'activity' => 'Работа', 'Работа', 'activity' => 'Работа',
'Паспорт', 'passport' => 'Паспорт', 'Паспорт', 'passport' => 'Паспорт',
'Выдан', 'issued' => 'Выдан', 'Выдан', 'issued' => 'Выдан',
'Подразделение', 'department' => 'Подразделение', 'Подразделение', 'Код подразделения', 'department' => 'Подразделение',
'Нанят', 'hiring' => 'Нанят', 'Нанят', 'hiring' => 'Нанят',
'Район', 'district' => 'Район', 'Район', 'district' => 'Район',
'Реквизиты', 'requisites' => 'Реквизиты', 'Реквизиты', 'requisites' => 'Реквизиты',
@ -122,7 +122,7 @@ function connect(_document $worker, _document $robot): void
) )
)) ))
) { ) {
// Инициализировано ребро: workers -> robot (любой) // Инициализировано ребро: worker -> robot (любой)
// Активация // Активация
$robot->status = 'active'; $robot->status = 'active';
@ -134,17 +134,40 @@ function connectAll(_document $worker): void
{ {
global $arangodb; global $arangodb;
// Инициализация ребра: workers -> viber // Инициализация ребра: worker -> viber
if ( if (
collection::init($arangodb->session, 'viber') collection::init($arangodb->session, 'viber')
&& $viber = collection::search( && $viber = collection::search(
$arangodb->session, $arangodb->session,
sprintf( sprintf(
"FOR d IN viber FILTER d.number == '%d' RETURN d", "FOR d IN viber FILTER d.number == '%d' RETURN d",
$worker->phone $worker->number
) )
) )
) connect($worker, $viber); ) connect($worker, $viber);
// Инициализация ребра: worker -> telegram
if (
collection::init($arangodb->session, 'telegram')
&& $viber = collection::search(
$arangodb->session,
sprintf(
"FOR d IN telegram FILTER d.number == '%d' RETURN d",
$worker->number
)
)
) connect($worker, $viber);
}
function id()
{
global $arangodb;
return collection::search(
$arangodb->session,
"RETURN MAX((FOR d in worker RETURN +d.id))",
) + 1;
} }
@ -155,18 +178,21 @@ function sync(Row &$row, string $city = 'Красноярск'): void
// Инициализация строки в Google Sheet // Инициализация строки в Google Sheet
$_row = init($row->toArray()['row']); $_row = init($row->toArray()['row']);
if (collection::init($arangodb->session, 'workers')) // Инициализация ФИО
if (!empty($_row['id']) && $worker = collection::search($arangodb->session, sprintf("FOR d IN workers FILTER d.id == '%s' RETURN d", $_row['id']))) { $name = explode(' ', $_row['name']);
if (collection::init($arangodb->session, 'worker'))
if (!empty($_row['id']) && $worker = collection::search($arangodb->session, sprintf("FOR d IN worker FILTER d.id == '%s' RETURN d", $_row['id']))) {
// Найдена запись работника (строки) в базе данных и включен режим перезаписи (приоритет - google sheets) // Найдена запись работника (строки) в базе данных и включен режим перезаписи (приоритет - google sheets)
if ($worker->transfer_to_sheets) { if (false && $worker->transfer_to_sheets) {
// Запрошен форсированный перенос данных из базы данных в таблицу // Запрошен форсированный перенос данных из базы данных в таблицу
// Инициализация данных для записи в таблицу // Инициализация данных для записи в таблицу
$new = [ /* $new = [
'id' => $worker->id ?? '', 'id' => $worker->id ?? id(),
'name' => $worker->name ?? '', 'name' => $worker->name ?? '',
'phone' => convertNumber($worker->phone ?? ''), 'number' => convertNumber($worker->number ?? ''),
'birth' => $worker->birth ?? '', 'birth' => $worker->birth ?? '',
'address' => $worker->address ?? '', 'address' => $worker->address ?? '',
'commentary' => $worker->commentary ?? '', 'commentary' => $worker->commentary ?? '',
@ -180,73 +206,100 @@ function sync(Row &$row, string $city = 'Красноярск'): void
'fired' => $worker->fired ?? '', 'fired' => $worker->fired ?? '',
'payment' => $worker->payment ?? '', 'payment' => $worker->payment ?? '',
'tax' => $worker->tax ?? '', 'tax' => $worker->tax ?? '',
]; ]; */
// Замена NULL на пустую строку // Замена NULL на пустую строку
foreach ($new as $key => &$value) if ($value === null) $value = ''; /* foreach ($new as $key => &$value) if ($value === null) $value = ''; */
// Реинициализация строки с новыми данными по ссылке (приоритет из базы данных) // Реинициализация строки с новыми данными по ссылке (приоритет из базы данных)
if ($_row !== $new) $row = $row->set((new Flow())->read(From::array([init($new, true)]))->fetch(1)[0]->get('row')); /* if ($_row !== $new) $row = $row->set((new Flow())->read(From::array([init($new, true)]))->fetch(1)[0]->get('row')); */
// Деактивация форсированного трансфера // Деактивация форсированного трансфера
$worker->transfer_to_sheets = false; /* $worker->transfer_to_sheets = false; */
} else { } else {
// Перенос изменений из Google Sheet в инстанцию документа в базе данных // Перенос изменений из Google Sheet в инстанцию документа в базе данных
// Реинициализация данных в инстанции документа в базе данных с данными из Google Sheet // Реинициализация данных в инстанции документа в базе данных с данными из Google Sheet
foreach ($worker->getAll() as $key => $value) { /* foreach ($worker->getAll() as $key => $value) { */
// Перебор всех записанных значений в инстанции документа в базе данных // Перебор всех записанных значений в инстанции документа в базе данных
// Конвертация // Конвертация
$worker->{$key} = $_row[$key] ?? $value; /* $worker->{$key} = $_row[$key] ?? $value; */
} /* } */
} }
// Обновление инстанции документа в базе данных // Обновление инстанции документа в базе данных
document::update($arangodb->session, $worker); /* document::update($arangodb->session, $worker); */
// Подключение к чат-роботам // Подключение к чат-роботам
connectAll($worker); /* connectAll($worker); */
} else if ( } else if (
!empty($_row['id']) /* !empty($_row['id']) */
&& !empty($_row['phone']) /* && !empty($_row['number']) */
&& $worker = collection::search( /* && */
$worker = collection::search(
$arangodb->session, $arangodb->session,
sprintf( sprintf(
"FOR d IN workers FILTER d._id == '%s' RETURN d", "FOR d IN worker FILTER d._id == '%s' RETURN d",
document::write($arangodb->session, 'workers', [ document::write($arangodb->session, 'worker', [
'id' => $_row['id'] ?? '', 'id' => $_row['id'] ?? id(),
'name' => $_row['name'] ?? '', 'name' => [
'phone' => convertNumber($_row['phone'] ?? ''), 'first' => $name[1] ?? $_row['name'] ?? '',
'second' => $name[0] ?? '',
'last' => $name[2] ?? ''
],
'number' => convertNumber($_row['number'] ?? ''),
'birth' => $_row['birth'] ?? '', 'birth' => $_row['birth'] ?? '',
'address' => $_row['address'] ?? '', 'address' => $_row['address'] ?? '',
'commentary' => $_row['commentary'] ?? '', 'commentary' => $_row['commentary'] ?? '',
'activity' => $_row['activity'] ?? '', 'activity' => $_row['activity'] ?? '',
'passport' => $_row['passport'] ?? '', 'passport' => $_row['passport'] ?? '',
'issued' => $_row['issued'] ?? '', 'issued' => '',
'department' => $_row['department'] ?? '', 'department' => [
'number' => $_row['department'] ?? '',
'address' => $_row['issued'] ?? ''
],
'hiring' => $_row['hiring'] ?? '', 'hiring' => $_row['hiring'] ?? '',
'district' => $_row['district'] ?? '', 'district' => $_row['district'] ?? '',
'requisites' => $_row['requisites'] ?? '', 'requisites' => $_row['requisites'] ?? '',
'fired' => $_row['fired'] ?? '', 'fired' => $_row['fired'] ?? '',
'payment' => $_row['payment'] ?? '', 'payment' => $_row['payment'] ?? '',
'tax' => $_row['tax'] ?? '', 'tax' => $_row['tax'] ?? '',
'city' => $city, 'city' => 'Красноярск' ?? $city,
'transfer_to_sheets' => false 'active' => true
]) ])
) )
) )
) { ) {
// Не найдена запись работника (строки) в базе данных и была создана // Не найдена запись работника (строки) в базе данных и была создана
// Создание аккаунта
$account = document::write($arangodb->session, 'account', [
'type' => 'worker',
'name' => [
'first' => $name[1] ?? $_row['name'] ?? '',
'second' => $name[0] ?? '',
'last' => $name[2] ?? ''
],
'number' => convertNumber($_row['number'] ?? ''),
'active' => true
]);
// Подключение сотрудника к аккаунту. Создание ребра: account -> worker
document::write(
$arangodb->session,
'account_edge_worker',
['_from' => $account, '_to' => $worker->getId()]
);
// Инициализация номера // Инициализация номера
$number = convertNumber($_row['phone'] ?? ''); /* $number = convertNumber($_row['number'] ?? ''); */
// Реинициализация строки с новыми данными по ссылке (приоритет из Google Sheets) // Реинициализация строки с новыми данными по ссылке (приоритет из Google Sheets)
$row = $row->set((new Flow())->read(From::array([init([ /* $row = $row->set((new Flow())->read(From::array([init([
'id' => $_row['id'] ?? '', 'id' => $_row['id'] ?? '',
'name' => $_row['name'] ?? '', 'name' => $_row['name'] ?? '',
'phone' => "=HYPERLINK(\"https://call.ctrlq.org/+$number\"; \"$number\")", 'number' => "=HYPERLINK(\"https://call.ctrlq.org/+$number\"; \"$number\")",
'birth' => $_row['birth'] ?? '', 'birth' => $_row['birth'] ?? '',
'address' => $_row['address'] ?? '', 'address' => $_row['address'] ?? '',
'commentary' => $_row['commentary'] ?? '', 'commentary' => $_row['commentary'] ?? '',
@ -260,10 +313,10 @@ function sync(Row &$row, string $city = 'Красноярск'): void
'fired' => $_row['fired'] ?? '', 'fired' => $_row['fired'] ?? '',
'payment' => $_row['payment'] ?? '', 'payment' => $_row['payment'] ?? '',
'tax' => $_row['tax'] ?? '', 'tax' => $_row['tax'] ?? '',
], true)]))->fetch(1)[0]->get('row')); ], true)]))->fetch(1)[0]->get('row')); */
// Подключение к чат-роботам // Подключение к чат-роботам
connectAll($worker); /* connectAll($worker); */
} else return; } else return;
else throw new exception('Не удалось инициализировать коллекцию'); else throw new exception('Не удалось инициализировать коллекцию');
} }
@ -278,23 +331,23 @@ $client->setAuthConfig($settings);
$api = new Sheets($client); $api = new Sheets($client);
foreach ($sheets as $sheet) { foreach ($sheets as $sheet) {
$rows = (new Flow())->read(new GoogleSheetExtractor($api, $document, new Columns($sheet, 'A', 'P'), true, 1000, 'row')); $rows = (new Flow())->read(new GoogleSheetExtractor($api, $document, new Columns($sheet, 'A', 'W'), true, 1000, 'row'));
$i = 1; $i = 1;
foreach ($rows->fetch(5000) as $row) { foreach ($rows->fetch(4183) as $row) {
++$i; ++$i;
$buffer = $row; $buffer = $row;
sync($row, $sheet); sync($row, $sheet);
if ($buffer !== $row) { if ($buffer !== $row) {
$api->spreadsheets_values->update( /* $api->spreadsheets_values->update(
$document, $document,
"$sheet!A$i:P$i", "$sheet!A$i:P$i",
new ValueRange(['values' => [array_values($row->entries()->toArray()['row'])]]), new ValueRange(['values' => [array_values($row->entries()->toArray()['row'])]]),
['valueInputOption' => 'USER_ENTERED'] ['valueInputOption' => 'USER_ENTERED']
); ); */
// Ожидание для того, чтобы снизить шанс блокировки от Google // Ожидание для того, чтобы снизить шанс блокировки от Google
sleep(3); /* sleep(3); */
} }
} }
} }