markets without google

This commit is contained in:
Arsen Mirzaev Tatyano-Muradovich 2024-02-29 02:54:38 +07:00
parent f3bd5872f5
commit c5facf13b0
2 changed files with 51 additions and 15 deletions

View File

@ -34,7 +34,7 @@ function generateLabel(string $name): string
return match ($name) { return match ($name) {
'id', 'ID', 'ТТ' => 'id', 'id', 'ID', 'ТТ' => 'id',
'type', 'ТИП', 'Тип', 'тип' => 'type', 'type', 'ТИП', 'Тип', 'тип' => 'type',
'director', 'ДИРЕКТОР', 'Директор', 'директор' => 'director', 'name', 'ДИРЕКТОР', 'Директор', 'директор' => 'name',
'address', 'АДРЕС', 'Адрес', 'адрес' => 'address', 'address', 'АДРЕС', 'Адрес', 'адрес' => 'address',
default => $name default => $name
}; };
@ -45,12 +45,23 @@ function degenerateLabel(string $name): string
return match ($name) { return match ($name) {
'ID', 'id' => 'ID', 'ID', 'id' => 'ID',
'ТИП', 'type' => 'ТИП', 'ТИП', 'type' => 'ТИП',
'ДИРЕКТОР', 'director' => 'ДИРЕКТОР', 'ДИРЕКТОР', 'name' => 'ДИРЕКТОР',
'АДРЕС', 'address' => 'АДРЕС', 'АДРЕС', 'address' => 'АДРЕС',
default => $name 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 function init(array $row, bool $reverse = false): array
{ {
$buffer = []; $buffer = [];
@ -68,14 +79,17 @@ function sync(Row &$row, string $city = 'Красноярск'): void
// Инициализация строки в Google Sheet // Инициализация строки в Google Sheet
$_row = init($row->toArray()['row']); $_row = init($row->toArray()['row']);
// Инициализация ФИО
$name = explode(' ', $_row['name']);
if (collection::init($arangodb->session, 'markets')) 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']))) { if (!empty($_row['id']) && $market = collection::search($arangodb->session, sprintf("FOR d IN markets FILTER d.id == '%s' RETURN d", $_row['id']))) {
// Найдена запись магазина (строки) в базе данных и включен режим перезаписи (приоритет - google sheets) // Найдена запись магазина (строки) в базе данных и включен режим перезаписи (приоритет - google sheets)
if ($market->transfer_to_sheets) { if (false && $market->transfer_to_sheets) {
// Запрошен форсированный перенос данных из базы данных в таблицу // Запрошен форсированный перенос данных из базы данных в таблицу
// Инициализация данных для записи в таблицу /* // Инициализация данных для записи в таблицу
$new = [ $new = [
'id' => $market->id ?? '', 'id' => $market->id ?? '',
'type' => $market->type ?? '', 'type' => $market->type ?? '',
@ -90,21 +104,21 @@ function sync(Row &$row, string $city = 'Красноярск'): void
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'));
// Деактивация форсированного трансфера // Деактивация форсированного трансфера
$market->transfer_to_sheets = false; $market->transfer_to_sheets = false; */
} else { } else {
// Перенос изменений из Google Sheet в инстанцию документа в базе данных // Перенос изменений из Google Sheet в инстанцию документа в базе данных
// Реинициализация данных в инстанции документа в базе данных с данными из Google Sheet /* // Реинициализация данных в инстанции документа в базе данных с данными из Google Sheet
foreach ($market->getAll() as $key => $value) { foreach ($market->getAll() as $key => $value) {
// Перебор всех записанных значений в инстанции документа в базе данных // Перебор всех записанных значений в инстанции документа в базе данных
// Конвертация // Конвертация
$market->{$key} = $_row[$key] ?? $value; $market->{$key} = $_row[$key] ?? $value;
} } */
} }
// Обновление инстанции документа в базе данных /* // Обновление инстанции документа в базе данных
document::update($arangodb->session, $market); document::update($arangodb->session, $market); */
} else if ( } else if (
$market = collection::search( $market = collection::search(
$arangodb->session, $arangodb->session,
@ -113,16 +127,39 @@ function sync(Row &$row, string $city = 'Красноярск'): void
document::write($arangodb->session, 'markets', [ document::write($arangodb->session, 'markets', [
'id' => $_row['id'] ?? '', 'id' => $_row['id'] ?? '',
'type' => $_row['type'] ?? '', 'type' => $_row['type'] ?? '',
'director' => $_row['director'] ?? '', 'name' => [
'first' => $name[1] ?? $_row['name'] ?? '',
'second' => $name[0] ?? '',
'last' => $name[2] ?? ''
],
'address' => $_row['address'] ?? '', 'address' => $_row['address'] ?? '',
'city' => $city, 'city' => $city,
'transfer_to_sheets' => false 'active' => true
]) ])
) )
) )
) { ) {
// Не найдена запись магазина (строки) в базе данных и была создана // Не найдена запись магазина (строки) в базе данных и была создана
// Создание аккаунта
$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) /* // Реинициализация строки с новыми данными по ссылке (приоритет из 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'] ?? '',
@ -147,12 +184,12 @@ foreach ($sheets as $sheet) {
$rows = (new Flow())->read(new GoogleSheetExtractor($api, $document, new Columns($sheet, 'A', 'D'), true, 1000, 'row')); $rows = (new Flow())->read(new GoogleSheetExtractor($api, $document, new Columns($sheet, 'A', 'D'), true, 1000, 'row'));
$i = 1; $i = 1;
foreach ($rows->fetch(3000) as $row) { foreach ($rows->fetch(5000) 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:D$i", "$sheet!A$i:D$i",
new ValueRange(['values' => [array_values($row->entries()->toArray()['row'])]]), new ValueRange(['values' => [array_values($row->entries()->toArray()['row'])]]),
@ -160,7 +197,7 @@ foreach ($sheets as $sheet) {
); );
// Ожидание для того, чтобы снизить шанс блокировки от Google // Ожидание для того, чтобы снизить шанс блокировки от Google
sleep(3); sleep(3); */
} }
} }
} }

View File

@ -77,7 +77,6 @@ function degenerateLabel(string $name): string
function convertNumber(string $number): string function convertNumber(string $number): string
{ {
// Очистка всего кроме цифр, а потом поиск 10 первых чисел (без восьмёрки) // Очистка всего кроме цифр, а потом поиск 10 первых чисел (без восьмёрки)
preg_match('/\d?(\d{10})/', preg_replace("/[^\d]/", "", $number), $matches); preg_match('/\d?(\d{10})/', preg_replace("/[^\d]/", "", $number), $matches);