2 Commits

26 changed files with 185 additions and 88 deletions

0
.gitignore vendored Executable file → Normal file
View File

0
LICENSE Executable file → Normal file
View File

0
README.md Executable file → Normal file
View File

0
START Executable file → Normal file
View File

0
composer.json Executable file → Normal file
View File

0
composer.lock generated Executable file → Normal file
View File

View File

View File

@@ -9,15 +9,10 @@ use mirzaev\arangodb\connection,
use ArangoDBClient\Document as _document; use ArangoDBClient\Document as _document;
// Фреймворк для Google Sheets // Фреймворк для Google Sheets
use Flow\ETL\Adapter\GoogleSheet\GoogleSheetRange, use Flow\ETL\Adapter\GoogleSheet\GoogleSheetExtractor,
Flow\ETL\Adapter\GoogleSheet\GoogleSheetExtractor,
Flow\ETL\Adapter\GoogleSheet\Columns, Flow\ETL\Adapter\GoogleSheet\Columns,
Flow\ETL\Flow, Flow\ETL\Flow,
Flow\ETL\Config,
Flow\ETL\FlowContext,
Flow\ETL\Row\Entry,
Flow\ETL\Row, Flow\ETL\Row,
Flow\ETL\DSL\To,
Flow\ETL\DSL\From; Flow\ETL\DSL\From;
// Фреймворк для Google API // Фреймворк для Google API
@@ -79,7 +74,7 @@ function convertNumber(string $number): string
{ {
// Очистка всего кроме цифр, а потом поиск 10 первых чисел (без восьмёрки) // Очистка всего кроме цифр, а потом поиск 10 первых чисел (без восьмёрки)
preg_match('/\d?(\d{10})/', preg_replace("/[^\d]/", "", $number), $matches); preg_match('/^8(\d{10})/', preg_replace("/[^\d]/", "", $number), $matches);
// Инициализация номера // Инициализация номера
$number = isset($matches[1]) ? 7 . $matches[1] : $number; $number = isset($matches[1]) ? 7 . $matches[1] : $number;
@@ -148,7 +143,7 @@ function connectAll(_document $worker): void
} }
function sync(Row &$row, string $city = 'Красноярск'): void function sync(Row &$row, string $city = 'Красноярск', array $formulas = []): void
{ {
global $arangodb; global $arangodb;
@@ -200,6 +195,33 @@ function sync(Row &$row, string $city = 'Красноярск'): void
// Конвертация // Конвертация
$worker->{$key} = $_row[$key] ?? $value; $worker->{$key} = $_row[$key] ?? $value;
} }
if (strlen($formulas[2]) < 12) {
// Не конвертирован номер
// Инициализация номера
$number = convertNumber($_row['phone'] ?? '');
// Реинициализация строки с новыми данными по ссылке (приоритет из Google Sheets)
$row = $row->set((new Flow())->read(From::array([init([
'id' => $_row['id'] ?? '',
'name' => $_row['name'] ?? '',
'phone' => "=HYPERLINK(\"https://call.ctrlq.org/+$number\"; \"$number\")",
'birth' => $_row['birth'] ?? '',
'address' => $_row['address'] ?? '',
'commentary' => $_row['commentary'] ?? '',
'activity' => $_row['activity'] ?? '',
'passport' => $_row['passport'] ?? '',
'issued' => $_row['issued'] ?? '',
'department' => $_row['department'] ?? '',
'hiring' => $_row['hiring'] ?? '',
'district' => $_row['district'] ?? '',
'requisites' => $_row['requisites'] ?? '',
'fired' => $_row['fired'] ?? '',
'payment' => $_row['payment'] ?? '',
'tax' => $_row['tax'] ?? '',
], true)]))->fetch(1)[0]->get('row'));
}
} }
// Обновление инстанции документа в базе данных // Обновление инстанции документа в базе данных
@@ -275,18 +297,38 @@ $sheets = require(__DIR__ . '/../settings/workers/sheets.php');
$client = new Client(); $client = new Client();
$client->setScopes(Sheets::SPREADSHEETS); $client->setScopes(Sheets::SPREADSHEETS);
$client->setAuthConfig($settings); $client->setAuthConfig($settings);
$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')); // Перебор таблиц
// Инициализация обработчика таблиц
$sheets = new Sheets($client);
// Инициализация инстанции Flow для Google Sheet API
$rows = (new Flow())->read(new GoogleSheetExtractor($sheets, $document, new Columns($sheet, 'A', 'P'), true, 1000, 'row'));
// Инициализация счётчика итераций
$i = 1; $i = 1;
$formulas = $sheets->spreadsheets_values->get($document, "$sheet!A:P", ['valueRenderOption' => 'FORMULA']) ?? null;
if ($formulas === null) continue;
foreach ($rows->fetch(5000) as $row) { foreach ($rows->fetch(5000) as $row) {
// Перебор строк
// Запись счётчика
++$i; ++$i;
// Инициализация буфера строки
$buffer = $row; $buffer = $row;
sync($row, $sheet);
// Синхронизация с базой данных
sync($row, $sheet, $formulas[$i - 1]);
// Запись изменений строки в Google Sheet
if ($buffer !== $row) { if ($buffer !== $row) {
$api->spreadsheets_values->update( $sheets->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'])]]),

View File

@@ -32,22 +32,29 @@ $arangodb = new connection(require __DIR__ . '/../settings/arangodb.php');
function generateLabel(string $name): string function generateLabel(string $name): string
{ {
return match ($name) { return match ($name) {
'created_in_sheets', 'Отметка времени' => 'created_in_sheets', 'imported_created_in_sheets', 'Отметка времени' => 'imported_created_in_sheets',
'updated_in_sheets', 'время последнего изменения' => 'updated_in_sheets', 'imported_date', 'Дата заявки' => 'imported_date',
'date', 'дата заявки' => 'date', 'imported_market', 'Ваш магазин' => 'imported_market',
'market', '№ магазина' => 'market', 'imported_worker', 'Требуемый сотрудник' => 'imported_worker',
'type', 'формат' => 'type', 'imported_work', 'Вид работы' => 'imported_work',
'address', 'адрес' => 'address', 'imported_start', 'Начало работы' => 'imported_start',
'worker', 'Код сотрудника (000000)' => 'worker', 'imported_end', 'Конец работы' => 'imported_end',
'imported_hours', 'Часы работы' => 'imported_hours',
'created_in_sheets', 'Создано' => 'created_in_sheets',
'date', 'Дата' => 'date',
'market', 'Магазин' => 'market',
'type', 'Тип' => 'type',
'address', 'Адрес' => 'address',
'worker', 'Сотрудник' => 'worker',
'name', 'ФИО' => 'name', 'name', 'ФИО' => 'name',
'work', 'Вид работ' => 'work', 'work', 'Работа' => 'work',
'start', 'Время начала заявки' => 'start', 'start', 'Начало' => 'start',
'end', 'Время окончания заявки' => 'end', 'end', 'Конец' => 'end',
'hours', 'Количество часов по заявке' => 'hours', 'hours', 'Часы' => 'hours',
'tax', 'ИНН' => 'tax', 'tax', 'ИНН' => 'tax',
'confirmed', 'подтверждение' => 'confirmed', 'confirmed', 'Подтверждено' => 'confirmed',
'commentary', 'примечание от ТТ' => 'commentary', 'commentary', 'Комментарий' => 'commentary',
'response', 'ответ от контрагента' => 'response', 'response', 'Ответ' => 'response',
'_id', 'ID' => '_id', '_id', 'ID' => '_id',
default => $name default => $name
}; };
@@ -56,22 +63,29 @@ function generateLabel(string $name): string
function degenerateLabel(string $name): string function degenerateLabel(string $name): string
{ {
return match ($name) { return match ($name) {
'Отметка времени', 'created_in_sheets' => 'Отметка времени', 'Отметка времени', 'imported_created_in_sheets' => 'Отметка времени',
'время последнего изменения', 'updated_in_sheets' => 'время последнего изменения', 'Дата заявки', 'imported_date' => 'Дата заявки',
'дата заявки', 'date' => 'дата заявки', 'Ваш магазин', 'imported_market' => 'Ваш магазин',
'№ магазина', 'market' => '№ магазина', 'Требуемый сотрудник', 'imported_worker' => 'Требуемый сотрудник',
'формат', 'type' => 'формат', 'Вид работы', 'imported_work' => 'Вид работы',
'адрес', 'address' => 'адрес', 'Начало работы', 'imported_start' => 'Начало работы',
'Код сотрудника (000000)', 'worker' => 'Код сотрудника (000000)', 'Конец работы', 'imported_end' => 'Конец работы',
'Часы работы', 'imported_hours' => 'Часы работы',
'Создано', 'created_in_sheets' => 'Создано',
'Дата', 'date' => 'Дата',
'Магазин', 'market' => 'Магазин',
'Тип', 'type' => 'Тип',
'Адрес', 'address' => 'Адрес',
'Сотрудник', 'worker' => 'Сотрудник',
'ФИО', 'name' => 'ФИО', 'ФИО', 'name' => 'ФИО',
'Вид работ', 'work' => 'Вид работ', 'Работа', 'work' => 'Работа',
'Время начала заявки', 'start' => 'Время начала заявки', 'Начало', 'start' => 'Начало',
'Время окончания заявки', 'end' => 'Время окончания заявки', 'Конец', 'end' => 'Конец',
'Количество часов по заявке', 'hours' => 'Количество часов по заявке', 'Часы', 'hours' => 'Часы',
'ИНН', 'tax' => 'ИНН', 'ИНН', 'tax' => 'ИНН',
'подтверждение', 'confirmed' => 'подтверждение', 'Подтверждено', 'confirmed' => 'Подтверждено',
'примечание от ТТ', 'commentary' => 'примечание от ТТ', 'Комментарий', 'commentary' => 'Комментарий',
'ответ от контрагента', 'response' => 'ответ от контрагента', 'Ответ', 'response' => 'Ответ',
'ID', '_id' => 'ID', 'ID', '_id' => 'ID',
default => $name default => $name
}; };
@@ -81,12 +95,11 @@ function filterWorker(?string $worker): string
{ {
global $arangodb; global $arangodb;
return match ($worker) { return match ((int) $worker) {
'Отмена', 'отмена', 'ОТМЕНА' => 'Отмена', 'Отмена', 'отмена', 'ОТМЕНА' => 'Отмена',
'', 0, 00, 000, 0000, 00000, 000000, 0000000, 00000000, 000000000, 0000000000 => '', '', 0, 00, 000, 0000, 00000, 000000, 0000000, 00000000, 000000000, 0000000000 => '',
default => (function () use ($worker, $arangodb) { default => (function () use ($worker, $arangodb) {
return $worker; if (
/* if (
collection::init($arangodb->session, 'workers') collection::init($arangodb->session, 'workers')
&& collection::search( && collection::search(
$arangodb->session, $arangodb->session,
@@ -96,7 +109,7 @@ function filterWorker(?string $worker): string
) )
) )
) return $worker; ) return $worker;
else return $worker; */ else return '';
})() })()
}; };
} }
@@ -111,7 +124,7 @@ function init(array $row, bool $reverse = false): array
} }
function sync(int $_i, Row &$row, ?array $raw = null): void function sync(int $_i, Row &$row, array $raw = []): void
{ {
global $arangodb; global $arangodb;
@@ -131,22 +144,29 @@ function sync(int $_i, Row &$row, ?array $raw = null): void
// Инициализация данных для записи в таблицу // Инициализация данных для записи в таблицу
$new = [ $new = [
'imported_created_in_sheets' => $work->imported_created_in_sheets,
'imported_date' => $work->imported_date,
'imported_market' => $work->imported_market,
'imported_worker' => $work->imported_worker,
'imported_work' => $work->imported_work,
'imported_start' => $work->imported_start,
'imported_end' => $work->imported_end,
'imported_hours' => $work->imported_hours,
'created_in_sheets' => $work->created_in_sheets, 'created_in_sheets' => $work->created_in_sheets,
'date' => $work->date, 'date' => $work->date,
'market' => $work->market,
'type' => $work->type,
'address' => $work->address,
'worker' => $work->worker, 'worker' => $work->worker,
'name' => $work->name, 'name' => $work->name,
'work' => $work->work, 'work' => $work->work,
'start' => $work->start, 'start' => $work->start,
'end' => $work->end, 'end' => $work->end,
'hours' => $work->hours, 'hours' => $work->hours,
'market' => $work->market, 'tax' => $work->tax,
'type' => $work->type,
'address' => $work->address,
'confirmed' => $work->confirmed, 'confirmed' => $work->confirmed,
'commentary' => $work->commentary, 'commentary' => $work->commentary,
'response' => $work->response, 'response' => $work->response,
'updated_in_sheets' => $work->updated_in_sheets,
'tax' => $work->tax,
'_id' => $work->getId(), '_id' => $work->getId(),
]; ];
@@ -255,7 +275,7 @@ function sync(int $_i, Row &$row, ?array $raw = null): void
$_row['market'] $_row['market']
) )
)) { )) {
// Инициализирована инстанция документа в базе данных нового мазагина // Инициализирована инстанция документа в базе данных нового магазина
// Реинициализация магазина // Реинициализация магазина
$request->_from = $_market->getId(); $request->_from = $_market->getId();
@@ -286,28 +306,35 @@ function sync(int $_i, Row &$row, ?array $raw = null): void
} else if ( } else if (
(!empty($_row['imported_market']) || !empty($_row['market'])) (!empty($_row['imported_market']) || !empty($_row['market']))
&& collection::init($arangodb->session, 'requests', true) && collection::init($arangodb->session, 'markets') && collection::init($arangodb->session, 'requests', true) && collection::init($arangodb->session, 'markets')
&& ($market = collection::search($arangodb->session, sprintf("FOR d IN markets FILTER d.id == '%s' RETURN d", $_row['imported_market'] ?? $_row['market']))) && ($market = collection::search($arangodb->session, sprintf("FOR d IN markets FILTER d.id == '%s' RETURN d", $raw[2] ?? $_row[10])))
&& $work = collection::search( && $work = collection::search(
$arangodb->session, $arangodb->session,
sprintf( sprintf(
"FOR d IN works FILTER d._id == '%s' RETURN d", "FOR d IN works FILTER d._id == '%s' RETURN d",
document::write($arangodb->session, 'works', [ document::write($arangodb->session, 'works', [
'created_in_sheets' => $raw[0] ?? '', 'imported_created_in_sheets' => $raw[0],
'date' => $raw[1] ?? '', 'imported_date' => $raw[1],
'worker' => filterWorker($_row['worker'] ?? ''), 'imported_market' => $raw[2],
'name' => "=ЕСЛИ(СОВПАД(\$A$_i;\"\");\"\"; ЕСЛИ( НЕ(СОВПАД(IFNA(ВПР(\$C$_i;part_import_KRSK!\$R$2:\$R$4999;1;);\"\");\$C$_i)); ЕСЛИ((СОВПАД(IFNA(ВПР(\$C$_i;part_import_KRSK!\$I\$2:\$L\$4999;4);\"\");\"\")); IFNA(ВПР(\$C$_i;part_import_KRSK!\$I\$2:\$J\$4999;2;); \"Сотрудник не назначен\"); \"УВОЛЕН (В списке работающих)\"); \"УВОЛЕН (В списке уволенных)\"))", 'imported_worker' => $raw[3],
'work' => $_row['work'] ?? '', 'imported_work' => $raw[4],
'start' => $raw[5] ?? '', 'imported_start' => $raw[5],
'end' => $raw[6] ?? '', 'imported_end' => $raw[6],
'hours' => $_row['hours'] ?? '', 'imported_hours' => $raw[7],
'market' => $_row['market'] ?? '', 'created_in_sheets' => $raw[0] ?? $raw[8],
'type' => "=ЕСЛИ(СОВПАД(A$_i;\"\");\"\"; IFNA(ВПР(I$_i;part_import_KRSK!\$B\$2:\$E\$15603;2;);\"Нет в базе\"))", 'date' => $raw[1] ?? $raw[9],
'address' => "=ЕСЛИ(СОВПАД(A$_i;\"\");\"\"; IFNA(ВПР(I$_i;part_import_KRSK!\$B\$2:\$E\$15603;4;);\"Нет в базе\"))", 'market' => $raw[2] ?? $raw[10],
'type' => "=ЕСЛИ(СОВПАД(I$_i;\"\");\"\"; IFNA(ВПР(K$_i;part_import_KRSK!\$B\$2:\$E\$15603;2;);\"Нет в базе\"))",
'address' => "=ЕСЛИ(СОВПАД(I$_i;\"\");\"\"; IFNA(ВПР(K$_i;part_import_KRSK!\$B\$2:\$E\$15603;4;);\"Нет в базе\"))",
'worker' => filterWorker($raw[13] ?? $raw[3]),
'name' => "=ЕСЛИ(СОВПАД(\$I$_i;\"\");\"\"; ЕСЛИ( НЕ(СОВПАД(IFNA(ВПР(\$N$_i;part_import_KRSK!\$R$2:\$R$4999;1;);\"\");\$N$_i)); ЕСЛИ((СОВПАД(IFNA(ВПР(\$N$_i;part_import_KRSK!\$I\$2:\$L\$4999;4);\"\");\"\")); IFNA(ВПР(\$N$_i;part_import_KRSK!\$I\$2:\$J\$4999;2;); \"Сотрудник не назначен\"); \"УВОЛЕН (В списке работающих)\"); \"УВОЛЕН (В списке уволенных)\"))",
'work' => $raw[4] ?? $raw[15],
'start' => $raw[5] ?? $raw[16],
'end' => $raw[6] ?? $raw[17],
'hours' => $raw[7] ?? $raw[18],
'tax' => "=ЕСЛИ(СОВПАД(\$I$_i;\"\");\"\"; IFNA(ВПР(\$N$_i;part_import_KRSK!\$I\$2:\$K\$5000;3;); IFNA(ВПР(\$N$_i;part_import_KRSK!\$R\$2:\$T\$5000;3;);\"000000000000\")))",
'confirmed' => $_row['confirmed'] ?? '', 'confirmed' => $_row['confirmed'] ?? '',
'commentary' => $_row['commentary'] ?? '', 'commentary' => $_row['commentary'] ?? '',
'response' => $_row['response'] ?? '', 'response' => $_row['response'] ?? '',
'updated_in_sheets' => $raw[14] ?? '',
'tax' => "=ЕСЛИ(СОВПАД(\$A$_i;\"\");\"\"; IFNA(ВПР(\$C$_i;part_import_KRSK!\$I\$2:\$K\$5000;3;); IFNA(ВПР(\$C$_i;part_import_KRSK!\$R\$2:\$T\$5000;3;);\"000000000000\")))",
'transfer_to_sheets' => false 'transfer_to_sheets' => false
]) ])
) )
@@ -346,23 +373,30 @@ function sync(int $_i, Row &$row, ?array $raw = null): void
// Реинициализация строки с новыми данными по ссылке (приоритет из Google Sheets) // Реинициализация строки с новыми данными по ссылке (приоритет из Google Sheets)
$row = $row->set((new Flow())->read(From::array([init([ $row = $row->set((new Flow())->read(From::array([init([
'created_in_sheets' => $raw[0] ?? '', 'imported_created_in_sheets' => $raw[0] ?? '',
'date' => $raw[1] ?? '', 'imported_date' => $raw[1] ?? '',
'worker' => filterWorker($_row['worker'] ?? ''), 'imported_market' => $_row['imported_market'] ?? '',
'name' => "=ЕСЛИ(СОВПАД(\$A$_i;\"\");\"\"; ЕСЛИ( НЕ(СОВПАД(IFNA(ВПР(\$C$_i;part_import_KRSK!\$R$2:\$R$4999;1;);\"\");\$C$_i)); ЕСЛИ((СОВПАД(IFNA(ВПР(\$C$_i;part_import_KRSK!\$I\$2:\$L\$4999;4);\"\");\"\")); IFNA(ВПР(\$C$_i;part_import_KRSK!\$I\$2:\$J\$4999;2;); \"Сотрудник не назначен\"); \"УВОЛЕН (В списке работающих)\"); \"УВОЛЕН (В списке уволенных)\"))", 'imported_worker' => $_row['imported_worker'] ?? '',
'work' => $_row['work'] ?? '', 'imported_work' => $_row['imported_work'] ?? '',
'start' => $raw[5] ?? '', 'imported_start' => $raw[5] ?? '',
'end' => $raw[6] ?? '', 'imported_end' => $raw[6] ?? '',
'hours' => $_row['hours'] ?? '', 'imported_hours' => $_row['imported_hours'] ?? '',
'market' => $_row['market'] ?? '', 'created_in_sheets' => $raw[0] ?? $raw[8],
'type' => "=ЕСЛИ(СОВПАД(A$_i;\"\");\"\"; IFNA(ВПР(I$_i;part_import_KRSK!\$B\$2:\$E\$15603;2;);\"Нет в базе\"))", 'date' => $raw[1] ?? $raw[9],
'address' => "=ЕСЛИ(СОВПАД(A$_i;\"\");\"\"; IFNA(ВПР(I$_i;part_import_KRSK!\$B\$2:\$E\$15603;4;);\"Нет в базе\"))", 'market' => $raw[2] ?? $raw[10],
'type' => "=ЕСЛИ(СОВПАД(I$_i;\"\");\"\"; IFNA(ВПР(K$_i;part_import_KRSK!\$B\$2:\$E\$15603;2;);\"Нет в базе\"))",
'address' => "=ЕСЛИ(СОВПАД(I$_i;\"\");\"\"; IFNA(ВПР(K$_i;part_import_KRSK!\$B\$2:\$E\$15603;4;);\"Нет в базе\"))",
'worker' => filterWorker($raw[13] ?? $raw[3]),
'name' => "=ЕСЛИ(СОВПАД(\$I$_i;\"\");\"\"; ЕСЛИ( НЕ(СОВПАД(IFNA(ВПР(\$N$_i;part_import_KRSK!\$R$2:\$R$4999;1;);\"\");\$N$_i)); ЕСЛИ((СОВПАД(IFNA(ВПР(\$N$_i;part_import_KRSK!\$I\$2:\$L\$4999;4);\"\");\"\")); IFNA(ВПР(\$N$_i;part_import_KRSK!\$I\$2:\$J\$4999;2;); \"Сотрудник не назначен\"); \"УВОЛЕН (В списке работающих)\"); \"УВОЛЕН (В списке уволенных)\"))",
'work' => $raw[4] ?? $raw[15],
'start' => $raw[5] ?? $raw[16],
'end' => $raw[6] ?? $raw[17],
'hours' => $raw[7] ?? $raw[18],
'tax' => "=ЕСЛИ(СОВПАД(\$I$_i;\"\");\"\"; IFNA(ВПР(\$N$_i;part_import_KRSK!\$I\$2:\$K\$5000;3;); IFNA(ВПР(\$N$_i;part_import_KRSK!\$R\$2:\$T\$5000;3;);\"000000000000\")))",
'confirmed' => $_row['confirmed'] ?? '', 'confirmed' => $_row['confirmed'] ?? '',
'commentary' => $_row['commentary'] ?? '', 'commentary' => $_row['commentary'] ?? '',
'response' => $_row['response'] ?? '', 'response' => $_row['response'] ?? '',
'updated_in_sheets' => $raw[14] ?? '', '_id' => $_row['_id'] ?? '',
'tax' => "=ЕСЛИ(СОВПАД(\$A$_i;\"\");\"\"; IFNA(ВПР(\$C$_i;part_import_KRSK!\$I\$2:\$K\$5000;3;); IFNA(ВПР(\$C$_i;part_import_KRSK!\$R\$2:\$T\$5000;3;);\"000000000000\")))",
'_id' => $_row['_id'] ?? ''
], true)]))->fetch(1)[0]->get('row')); ], true)]))->fetch(1)[0]->get('row'));
} else return; } else return;
else throw new exception('Не удалось инициализировать коллекцию'); else throw new exception('Не удалось инициализировать коллекцию');
@@ -382,32 +416,53 @@ foreach ($sheets as $sheet) {
// Инициализация обработчика таблиц // Инициализация обработчика таблиц
$sheets = new Sheets($client); $sheets = new Sheets($client);
// Инициализация инстанций Flow для Google Sheet API // Инициализация инстанции Flow для Google Sheet API
$formulas = (new Flow())->read(new GoogleSheetExtractor($sheets, $document, new Columns($sheet, 'A', 'Q'), true, 1000, 'row', ['valueRenderOption' => 'FORMULA'])); $rows = (new Flow())->read(new GoogleSheetExtractor($sheets, $document, new Columns($sheet, 'A', 'X'), true, 1000, 'row'));
$rows = $sheets->spreadsheets_values->get($document, "$sheet!A:Q");
// Инициализация счётчика итераций // Инициализация счётчика итераций
$i = 1; $i = 1;
foreach ($formulas->fetch(50000) as $formula) { $raws = $sheets->spreadsheets_values->get($document, "$sheet!A:X") ?? null;
if ($raws === null) continue;
foreach ($rows->fetch(10000) as $row) {
// Перебор строк // Перебор строк
// Запись счётчика // Запись счётчика
++$i; ++$i;
// Инициализация буфера строки // Инициализация буфера строки
$buffer = $formula; $buffer = $row;
// Синхронизация с базой данных // Синхронизация с базой данных
sync($i, $formula, $rows[$i - 1] ?? null); sync($i, $row, $raws[$i - 1]);
// Запись изменений строки в Google Sheet // Запись изменений строки в Google Sheet
if ($buffer !== $formula) { if ($buffer !== $row) {
$row = init($row->toArray()['row']);
$sheets->spreadsheets_values->update( $sheets->spreadsheets_values->update(
$document, $document,
"$sheet!A$i:Q$i", "$sheet!I$i:X$i",
new ValueRange(['values' => [array_values($formula->entries()->toArray()['row'])]]), new ValueRange(['values' => [array_values(init([
'created_in_sheets' => $row['created_in_sheets'] ?? '',
'date' => $row['date'] ?? '',
'market' => $row['market'] ?? '',
'type' => $row['type'] ?? '',
'address' => $row['address'] ?? '',
'worker' => $row['worker'] ?? '',
'name' => $row['name'] ?? '',
'work' => $row['work'] ?? '',
'start' => $row['start'] ?? '',
'end' => $row['end'] ?? '',
'hours' => $row['hours'] ?? '',
'tax' => $row['tax'] ?? '',
'confirmed' => $row['confirmed'] ?? '',
'commentary' => $row['commentary'] ?? '',
'response' => $row['response'] ?? '',
'_id' => $row['_id'] ?? '',
], true))]]),
['valueInputOption' => 'USER_ENTERED'] ['valueInputOption' => 'USER_ENTERED']
); );

0
mirzaev/spetsresurs/google_sheets/parser/system/settings/.gitignore vendored Executable file → Normal file
View File

View File

View File

View File

0
sheets/markets.xlsx Executable file → Normal file
View File

0
sheets/workers.xlsx Executable file → Normal file
View File

0
sheets/works.xlsx Executable file → Normal file
View File