|
|
|
@ -32,11 +32,10 @@ $arangodb = new connection(require __DIR__ . '/../settings/arangodb.php');
|
|
|
|
|
function generateLabel(string $name): string
|
|
|
|
|
{
|
|
|
|
|
return match ($name) {
|
|
|
|
|
'id', 'ID', 'ТТ', '№ТТ' => 'id',
|
|
|
|
|
'type', 'ТИП', 'Тип', 'тип', 'ФОРМАТ' => 'type',
|
|
|
|
|
'name', 'ДИРЕКТОР', 'Директор', 'директор', 'ДИРЕКТОР ТТ' => 'name',
|
|
|
|
|
'id', 'ID', 'ТТ' => 'id',
|
|
|
|
|
'type', 'ТИП', 'Тип', 'тип' => 'type',
|
|
|
|
|
'director', 'ДИРЕКТОР', 'Директор', 'директор' => 'director',
|
|
|
|
|
'address', 'АДРЕС', 'Адрес', 'адрес' => 'address',
|
|
|
|
|
'city', 'город', 'Город', 'Направление' => 'city',
|
|
|
|
|
default => $name
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
@ -46,24 +45,12 @@ function degenerateLabel(string $name): string
|
|
|
|
|
return match ($name) {
|
|
|
|
|
'ID', 'id' => 'ID',
|
|
|
|
|
'ТИП', 'type' => 'ТИП',
|
|
|
|
|
'ДИРЕКТОР', 'name' => 'ДИРЕКТОР',
|
|
|
|
|
'ДИРЕКТОР', 'director' => 'ДИРЕКТОР',
|
|
|
|
|
'АДРЕС', 'address' => 'АДРЕС',
|
|
|
|
|
'city' => 'ГОРОД',
|
|
|
|
|
default => $name
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function convertNumber(string $number): string
|
|
|
|
|
{
|
|
|
|
|
// Очистка всего кроме цифр, а потом поиск 10 первых чисел (без восьмёрки)
|
|
|
|
|
preg_match('/\d?(\d{10})/', preg_replace("/[^\d]/", "", $number), $matches);
|
|
|
|
|
|
|
|
|
|
// Инициализация номера
|
|
|
|
|
$number = isset($matches[1]) ? 7 . $matches[1] : $number;
|
|
|
|
|
|
|
|
|
|
return $number;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function init(array $row, bool $reverse = false): array
|
|
|
|
|
{
|
|
|
|
|
$buffer = [];
|
|
|
|
@ -74,27 +61,21 @@ function init(array $row, bool $reverse = false): array
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function sync(Row &$row): void
|
|
|
|
|
function sync(Row &$row, string $city = 'Красноярск'): void
|
|
|
|
|
{
|
|
|
|
|
global $arangodb;
|
|
|
|
|
|
|
|
|
|
// Инициализация строки в Google Sheet
|
|
|
|
|
$_row = init($row->toArray()['row']);
|
|
|
|
|
|
|
|
|
|
// Инициализация ФИО
|
|
|
|
|
$name = explode(' ', $_row['name']);
|
|
|
|
|
|
|
|
|
|
// Инициализация идентификатора
|
|
|
|
|
if (empty($id = preg_replace('/([^^\d]?)(\d+).*/u', 'K$2', $_row['id']))) return;
|
|
|
|
|
|
|
|
|
|
if (collection::init($arangodb->session, 'market'))
|
|
|
|
|
if ($market = collection::search($arangodb->session, sprintf("FOR d IN market FILTER d.id == '%s' RETURN d", $id))) {
|
|
|
|
|
if (collection::init($arangodb->session, 'markets'))
|
|
|
|
|
if (!empty($_row['id']) && $market = collection::search($arangodb->session, sprintf("FOR d IN markets FILTER d.id == '%s' RETURN d", $_row['id']))) {
|
|
|
|
|
// Найдена запись магазина (строки) в базе данных и включен режим перезаписи (приоритет - google sheets)
|
|
|
|
|
|
|
|
|
|
if (false && $market->transfer_to_sheets) {
|
|
|
|
|
if ($market->transfer_to_sheets) {
|
|
|
|
|
// Запрошен форсированный перенос данных из базы данных в таблицу
|
|
|
|
|
|
|
|
|
|
/* // Инициализация данных для записи в таблицу
|
|
|
|
|
// Инициализация данных для записи в таблицу
|
|
|
|
|
$new = [
|
|
|
|
|
'id' => $market->id ?? '',
|
|
|
|
|
'type' => $market->type ?? '',
|
|
|
|
@ -109,62 +90,39 @@ function sync(Row &$row): void
|
|
|
|
|
if ($_row !== $new) $row = $row->set((new Flow())->read(From::array([init($new, true)]))->fetch(1)[0]->get('row'));
|
|
|
|
|
|
|
|
|
|
// Деактивация форсированного трансфера
|
|
|
|
|
$market->transfer_to_sheets = false; */
|
|
|
|
|
$market->transfer_to_sheets = false;
|
|
|
|
|
} else {
|
|
|
|
|
// Перенос изменений из Google Sheet в инстанцию документа в базе данных
|
|
|
|
|
|
|
|
|
|
/* // Реинициализация данных в инстанции документа в базе данных с данными из Google Sheet
|
|
|
|
|
// Реинициализация данных в инстанции документа в базе данных с данными из Google Sheet
|
|
|
|
|
foreach ($market->getAll() as $key => $value) {
|
|
|
|
|
// Перебор всех записанных значений в инстанции документа в базе данных
|
|
|
|
|
|
|
|
|
|
// Конвертация
|
|
|
|
|
$market->{$key} = $_row[$key] ?? $value;
|
|
|
|
|
} */
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* // Обновление инстанции документа в базе данных
|
|
|
|
|
document::update($arangodb->session, $market); */
|
|
|
|
|
} else if (
|
|
|
|
|
// Обновление инстанции документа в базе данных
|
|
|
|
|
document::update($arangodb->session, $market);
|
|
|
|
|
} else if (
|
|
|
|
|
$market = collection::search(
|
|
|
|
|
$arangodb->session,
|
|
|
|
|
sprintf(
|
|
|
|
|
"FOR d IN market FILTER d._id == '%s' RETURN d",
|
|
|
|
|
document::write($arangodb->session, 'market', [
|
|
|
|
|
'id' => $id,
|
|
|
|
|
"FOR d IN markets FILTER d._id == '%s' RETURN d",
|
|
|
|
|
document::write($arangodb->session, 'markets', [
|
|
|
|
|
'id' => $_row['id'] ?? '',
|
|
|
|
|
'type' => $_row['type'] ?? '',
|
|
|
|
|
'name' => [
|
|
|
|
|
'first' => $name[1] ?? $_row['name'] ?? '',
|
|
|
|
|
'second' => $name[0] ?? '',
|
|
|
|
|
'last' => $name[2] ?? ''
|
|
|
|
|
],
|
|
|
|
|
'director' => $_row['director'] ?? '',
|
|
|
|
|
'address' => $_row['address'] ?? '',
|
|
|
|
|
'city' => $_row['city'] ?? '',
|
|
|
|
|
'active' => true
|
|
|
|
|
'city' => $city,
|
|
|
|
|
'transfer_to_sheets' => false
|
|
|
|
|
])
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
) {
|
|
|
|
|
// Не найдена запись магазина (строки) в базе данных и была создана
|
|
|
|
|
|
|
|
|
|
// Создание аккаунта
|
|
|
|
|
$account = document::write($arangodb->session, 'account', [
|
|
|
|
|
'type' => 'market',
|
|
|
|
|
'name' => [
|
|
|
|
|
'first' => $name[1] ?? $_row['name'] ?? '',
|
|
|
|
|
'second' => $name[0] ?? '',
|
|
|
|
|
'last' => $name[2] ?? ''
|
|
|
|
|
],
|
|
|
|
|
'number' => convertNumber($_row['number'] ?? ''),
|
|
|
|
|
'active' => true
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
// Подключение сотрудника к аккаунту. Создание ребра: account -> market
|
|
|
|
|
document::write(
|
|
|
|
|
$arangodb->session,
|
|
|
|
|
'account_edge_market',
|
|
|
|
|
['_from' => $account, '_to' => $market->getId()]
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
/* // Реинициализация строки с новыми данными по ссылке (приоритет из Google Sheets)
|
|
|
|
|
$row = $row->set((new Flow())->read(From::array([init([
|
|
|
|
|
'id' => $_row['id'] ?? '',
|
|
|
|
@ -186,15 +144,15 @@ $client->setAuthConfig($settings);
|
|
|
|
|
$api = new Sheets($client);
|
|
|
|
|
|
|
|
|
|
foreach ($sheets as $sheet) {
|
|
|
|
|
$rows = (new Flow())->read(new GoogleSheetExtractor($api, $document, new Columns($sheet, 'B', 'F'), true, 1000, 'row'));
|
|
|
|
|
$rows = (new Flow())->read(new GoogleSheetExtractor($api, $document, new Columns($sheet, 'A', 'D'), true, 1000, 'row'));
|
|
|
|
|
|
|
|
|
|
$i = 1;
|
|
|
|
|
foreach ($rows->fetch(5000) as $row) {
|
|
|
|
|
if (++$i === 2) continue;
|
|
|
|
|
foreach ($rows->fetch(3000) as $row) {
|
|
|
|
|
++$i;
|
|
|
|
|
$buffer = $row;
|
|
|
|
|
sync($row);
|
|
|
|
|
sync($row, $sheet);
|
|
|
|
|
if ($buffer !== $row) {
|
|
|
|
|
/* $api->spreadsheets_values->update(
|
|
|
|
|
$api->spreadsheets_values->update(
|
|
|
|
|
$document,
|
|
|
|
|
"$sheet!A$i:D$i",
|
|
|
|
|
new ValueRange(['values' => [array_values($row->entries()->toArray()['row'])]]),
|
|
|
|
@ -202,7 +160,7 @@ foreach ($sheets as $sheet) {
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// Ожидание для того, чтобы снизить шанс блокировки от Google
|
|
|
|
|
sleep(3); */
|
|
|
|
|
sleep(3);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|