@@ -32,10 +32,11 @@ $arangodb = new connection(require __DIR__ . '/../settings/arangodb.php');
function generateLabel ( string $name ) : string
{
return match ( $name ) {
'id' , 'ID' , 'Т Т ' => 'id' ,
'type' , 'ТИП' , 'Тип' , 'тип' => 'type' ,
'director ' , 'ДИРЕКТОР' , 'Директор' , 'директор' => 'director ' ,
'id' , 'ID' , 'Т Т ' , '№ТТ' => 'id' ,
'type' , 'ТИП' , 'Тип' , 'тип' , 'ФОРМАТ' => 'type' ,
'name ' , 'ДИРЕКТОР' , 'Директор' , 'директор' , 'ДИРЕКТОР Т Т ' => 'name ',
'address' , 'АДРЕС' , 'Адрес' , 'адрес' => 'address' ,
'city' , 'город' , 'Город' , 'Направление' => 'city' ,
default => $name
};
}
@@ -45,12 +46,24 @@ function degenerateLabel(string $name): string
return match ( $name ) {
'ID' , 'id' => 'ID' ,
'ТИП' , 'type' => 'ТИП' ,
'ДИРЕКТОР' , 'director ' => 'ДИРЕКТОР' ,
'ДИРЕКТОР' , 'name ' => 'ДИРЕКТОР' ,
'АДРЕС' , '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 = [];
@@ -61,21 +74,27 @@ function init(array $row, bool $reverse = false): array
}
function sync ( Row & $row , string $city = 'Красноярск' ): void
function sync ( Row & $row ) : void
{
global $arangodb ;
// Инициализация строки в Google Sheet
$_row = init ( $row -> toArray ()[ 'row' ]);
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 ' ]))) {
// Инициализация ФИО
$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 ))) {
// Найдена запись магазина (строки) в базе данных и включен режим перезаписи (приоритет - google sheets)
if ( $market -> transfer_to_sheets ) {
if ( false && $market -> transfer_to_sheets ) {
// Запрошен форсированный перенос данных из базы данных в таблицу
// Инициализация данных для записи в таблицу
/* // Инициализация данных для записи в таблицу
$new = [
'id' => $market->id ?? '',
'type' => $market->type ?? '',
@@ -90,39 +109,62 @@ 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'));
// Деактивация форсированного трансфера
$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 markets FILTER d._id == '%s' RETURN d " ,
document :: write ( $arangodb -> session , 'markets ' , [
'id' => $_row [ 'id' ] ? ? '' ,
" FOR d IN market FILTER d._id == '%s' RETURN d " ,
document :: write ( $arangodb -> session , 'market' , [
'id' => $id ,
'type' => $_row [ 'type' ] ? ? '' ,
'director' => $_row [ 'director' ] ? ? '' ,
'name' => [
'first' => $name [ 1 ] ? ? $_row [ 'name' ] ? ? '' ,
'second' => $name [ 0 ] ? ? '' ,
'last' => $name [ 2 ] ? ? ''
],
'address' => $_row [ 'address' ] ? ? '' ,
'city' => $city ,
'transfer_to_sheets ' => fals e
'city' => $_row [ 'city' ] ? ? '' ,
'active ' => tru e
])
)
)
) {
// Н е найдена запись магазина (строки) в базе данных и была создана
// Создание аккаунта
$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'] ?? '',
@@ -144,15 +186,15 @@ $client->setAuthConfig($settings);
$api = new Sheets ( $client );
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 , 'B ' , 'F ' ), true , 1000 , 'row' ));
$i = 1 ;
foreach ( $rows -> fetch ( 3 000) as $row ) {
++ $i ;
foreach ( $rows -> fetch ( 5 000) as $row ) {
if ( ++ $i === 2 ) continue ;
$buffer = $row ;
sync ( $row , $sheet );
sync ( $row );
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'])]]),
@@ -160,7 +202,7 @@ foreach ($sheets as $sheet) {
);
// Ожидание для того, чтобы снизить шанс блокировки от Google
sleep( 3 );
sleep(3); */
}
}
}