/
v.bolshakov
/
AIEcosystem-Testing
Обзор
Документация
Войти
/
v.bolshakov
/
AIEcosystem-Testing
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
dev
console/controllers/MemoQController.php
293 строки
9 KB
Developer
Initial commit
03 авг 2026, 17:43
03 авг 2026, 17:43
7433917
Код
Авторство
О чём код?
<?php namespace console\controllers; use common\helpers\MemoQHelper; use common\helpers\TerHelper; use common\helpers\Utf8Helper; use common\helpers\XliffHelper; use common\kdf\KDocumentStatus; use common\memoQ\FileManagerService; use common\memoQ\meta\serverproject\ExportTranslationDocumentAsXliffBilingual; use common\memoQ\meta\serverproject\ExportTranslationDocumentAsXliffBilingualResponse; use common\memoQ\meta\serverproject\XliffBilingualExportOptions; use common\memoQ\ServerProjectService; use common\models\Email; use common\models\link\LinkUserMemoQ; use common\models\memoq\Document; use common\models\memoq\Project; use common\models\memoq\ProjectInfo; use common\models\memoq\TerSync; use common\models\memoq\UserSync; use common\models\SystemTool; use common\models\User; use common\helpers\DateHelper; use Yii; use yii\console\{Controller, ExitCode}; use yii\db\Expression; use yii\helpers\Console; /** * Work with MemoQ * * @author Dmitry E. Semenov <sde.tomsk@gmail.com> * @copyright Self (c) 2023-2026 */ class MemoQController extends BaseController { /** * @inheritdoc */ protected $system_tool_id = SystemTool::CAT_MEMO_Q; /** * Sync MemoQ users */ public function actionUser() { MemoQHelper::syncUser(); $a = User::getAlias(); // $sub = LinkUserMemoQ::find() // ->select(new Expression('1')) // ->andWhere(['user_id' => new Expression($a . '.id')]); $user_list = User::find() ->select([ $a . '.id', 'email' => 'value' ]) ->alias($a) ->innerJoin(['e' => Email::tableName()], 'e.id = email_id') // ->andWhere(['not exists', $sub]) ->asArray() ->all(); foreach ($user_list as $row) { $m_user_list = \common\models\memoq\User::find() ->select('id') ->andWhere([ 'lower(email)' => Utf8Helper::strtolower($row['email']) ]) ->column(); if (count($m_user_list) > 0) { foreach ($m_user_list as $m_user_id) { $link = LinkUserMemoQ::findOrNew([ 'm_user_id' => $m_user_id ]); $link->setAttributes([ 'user_id' => $row['id'] ]); if (!$link->save()) { $this->stdout('Error link user: ' . $row['email'] . PHP_EOL, Console::FG_RED); } else { $this->stdout('Success link user: ' . $row['email'] . PHP_EOL, Console::FG_GREEN); } } } else { $this->stdout('User not found: ' . $row['email'] . PHP_EOL, Console::FG_RED); } } return ExitCode::OK; } /** * Sync MemoQ Project List Header */ public function actionProjectInfo() { MemoQHelper::syncProjectInfo(); return ExitCode::OK; } /** * Sync MemoQ Project by guid */ public function actionProjectDirect($guid) { MemoQHelper::syncProjectDirect($guid); return ExitCode::OK; } /** * Sync MemoQ Project Document */ public function actionProject() { $user_list = UserSync::find() ->select([ 'user_id', ]) ->andWhere([ 'is_request' => 1 ]) ->andWhere([ 'or', ['last_update' => null], [ '<', 'DATE_ADD(last_update, INTERVAL 120 SECOND)', DateHelper::now() ] ]) ->orderBy([ 'last_update' => SORT_ASC ]) ->limit(5) ->column(); /** @var ServerProjectService $service */ $service = new ServerProjectService(); foreach ($user_list as $user_id) { $this->stdout('Sync user: ' . $user_id . PHP_EOL, Console::FG_GREEN); UserSync::updateAll([ 'last_update' => DateHelper::now(), 'is_request' => 0 ], [ 'user_id' => $user_id ]); $a = ProjectInfo::getAlias(); $sub = Project::find() ->select(new Expression(1)) ->andWhere(['guid' => new Expression($a . '.guid')]) ->andWhere([ 'status_id' => [ KDocumentStatus::TRANSLATION_FINISHED, KDocumentStatus::PROOFREADING_FINISHED, ] ]); $month = DateHelper::now(time() - DateHelper::WEEK * 2); $project_list = ProjectInfo::find() ->alias($a) ->innerJoin(['mu' => \common\models\memoq\User::tableName()], 'mu.guid = creator_user') ->innerJoin(['l' => LinkUserMemoQ::tableName()], 'l.m_user_id = mu.id') ->andWhere([ 'l.user_id' => $user_id ]) ->andWhere(['is not', $a . '.title', null]) ->andWhere([ '>=', $a . '.deadline', $month ]) ->andWhere(['not exists', $sub]) ->all(); /** @var ProjectInfo $project */ foreach ($project_list as $project) { MemoQHelper::syncProject($project->title, $project->client, $service); $this->stdout('Sync project:' . $project->title . ' (' . $project->guid . ')' . PHP_EOL, Console::FG_GREEN); } $this->stdout('Sync count:' . count($project_list) . PHP_EOL, Console::FG_GREEN); } $this->stdout('Sync user count: ' . count($user_list) . PHP_EOL, Console::FG_GREEN); return ExitCode::OK; } /** * Sync MemoQ Project Document Xliff */ public function actionDocument() { $document_list = Document::find() ->andWhere([ 'is_request' => 1 ]) ->last() ->limit(50) ->all(); /** @var Document $document */ foreach ($document_list as $document) { /** @var Project $project */ $project = $document->project; try { $options = new XliffBilingualExportOptions(); $parameters = new ExportTranslationDocumentAsXliffBilingual( $project->guid, $document->guid, $options ); /** @var ServerProjectService $service */ $service = new ServerProjectService(); $fmService = new FileManagerService(); /** @var ExportTranslationDocumentAsXliffBilingualResponse $res */ $res = $service->ExportTranslationDocumentAsXliffBilingual($parameters); $f_info = $res->getExportTranslationDocumentAsXliffBilingualResult(); $file_guid = $f_info->getFileGuid(); $info = MemoQHelper::DownloadFile($fmService, $file_guid); $xliff_content = $info['content']; XliffHelper::parseXliff($document->id, $xliff_content); $this->stdout('Document: «' . $document->document_name . '», ok' . PHP_EOL, Console::FG_GREEN); } catch (\Exception $e) { $this->stdout('Document: «' . $document->document_name . '», error: ' . $e->getMessage() . PHP_EOL, Console::FG_RED); } $document->updateAttributes([ 'is_request' => 0 ]); } return ExitCode::OK; } /** * Update Ter Information */ public function actionTer() { $list = TerSync::find() ->andWhere([ 'is_request' => 1 ]) ->last() ->limit(50) ->all(); /** @var TerSync $item */ foreach ($list as $item) { try { TerHelper::updateTer($item->document_id); $this->stdout('Document: «' . $item->document_id . '», ok' . PHP_EOL, Console::FG_GREEN); } catch (\Exception $e) { $this->stdout('Document: «' . $item->document_id . '», error: ' . $e->getMessage() . PHP_EOL, Console::FG_RED); } $item->updateAttributes([ 'is_request' => 0 ]); } return ExitCode::OK; } }