from table to db
This commit is contained in:
parent
4e88505833
commit
f3bd5872f5
|
@ -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); */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Reference in New Issue