wordsonline_connector-1.0.x-dev/src/Controller/OrderController.php

src/Controller/OrderController.php
<?php

namespace Drupal\wordsonline_connector\Controller;

use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use Drupal\wordsonline_connector\WordsOnlineConst;
use Drupal\tmgmt\Entity\Job;
use Drupal\tmgmt\JobInterface;
use Drupal\wordsonline_connector\Entity\WOFile;
use Drupal\wordsonline_connector\Common\ZipHandle;
use Drupal\wordsonline_connector\WordsOnlineState;
use Drupal\wordsonline_connector\WordsOnlineStatus;
use Symfony\Component\DependencyInjection\ContainerInterface;
use GuzzleHttp\ClientInterface;
use Drupal\Core\Database\Connection;
use Drupal\Core\Messenger\Messenger;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\Archiver\ArchiverManager;
use Drupal\Core\File\FileSystemInterface;
use Drupal\tmgmt_file\Format\FormatManager;
use Drupal\Core\Entity\Query\QueryInterface;
use Drupal\wordsonline_connector\Plugin\tmgmt\Translator\WordsOnlineTranslator;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Drupal\Core\Extension\ModuleExtensionList;
use Drupal\Core\Url;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Drupal\tmgmt\Entity\JobItem;
use Drupal\wordsonline_connector\WordsOnlineConnectorManager;

/**
 * Controller for handle order.
 */
class OrderController extends ControllerBase {
  use StringTranslationTrait;

  /**
   * Guzzle HTTP client.
   *
   * @var \GuzzleHttp\ClientInterface
   */
  protected $client;

  /**
   * Database.
   *
   * @var \Drupal\Core\Database\Connection
   */
  protected $database;

  /**
   * ModuleExtensionList.
   *
   * @var Drupal\Core\Extension\ModuleExtensionList
   */
  protected $moduleExtensionList;

  /**
   * Messenger.
   *
   * @var \Drupal\Core\Messenger\Messenger
   */
  protected $messenger;

  /**
   * Archiver.
   *
   * @var Drupal\Core\Archiver\ArchiverManager
   */
  protected $archiver;

  /**
   * The file system service.
   *
   * @var \Drupal\Core\File\FileSystemInterface
   */
  protected $fileSystem;

  /**
   * The file format manager.
   *
   * @var \Drupal\tmgmt_file\Format\FormatManager
   */
  protected $formatManager;

  /**
   * WordsOnline Connector Manager.
   *
   * @var \Drupal\wordsonline_connector\WordsOnlineConnectorManager
   */
  protected $wo_manager;

  /**
   * Constructor.
   *
   * @param \GuzzleHttp\ClientInterface $client
   *   Http client.
   * @param \Drupal\Core\Database\Connection $database
   *   Database connection.
   * @param \Drupal\Core\Messenger\Messenger $messenger
   *   Messenger.
   * @param \Drupal\Core\Archiver\ArchiverManager $archiver
   *   Archiver manager.
   * @param \Drupal\Core\File\FileSystemInterface $fileSystem
   *   File System.
   * @param \Drupal\tmgmt_file\Format\FormatManager $formatManager
   *   The file format manager.
   * @param \Drupal\Core\Extension\ModuleExtensionList
   *   The list module extension list.
   */
  public function __construct(ClientInterface $client, Connection $database, Messenger $messenger, ArchiverManager $archiver, FileSystemInterface $fileSystem, FormatManager $formatManager, ModuleExtensionList $moduleExtensionList, WordsOnlineConnectorManager $wo_manager) {
    $this->client = $client;
    $this->database = $database;
    $this->messenger = $messenger;
    $this->archiver = $archiver;
    $this->fileSystem = $fileSystem;
    $this->formatManager = $formatManager;
    $this->moduleExtensionList = $moduleExtensionList;
    $this->wo_manager = $wo_manager;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    $client = $container->get('http_client');
    $database = $container->get('database');
    $messenger = $container->get('messenger');
    $archiver = $container->get('plugin.manager.archiver');
    $fileSystem = $container->get('file_system');
    $manager = $container->get('plugin.manager.tmgmt_file.format');
    $moduleExtensionList = $container->get('extension.list.module');
    $wo_manager = $container->get('plugin.manager.tmgmt.wordsonline');
    return new static(
        $client,
        $database,
        $messenger,
        $archiver,
        $fileSystem,
        $manager,
        $moduleExtensionList,
        $wo_manager
    );
  }

  /**
   * Open confirm form.
   *
   * @param Symfony\Component\HttpFoundation\Request $request
   *   The request from client.
   */
  public function openMyModal(Request $request) {
    $request_guid = $request->query->get("request_guid");
    $job_id = $request->query->get("job_id");
    $allowSubmmit = "true";
    if ($request->query->get("allowSubmmit")) {
      $allowSubmmit = $request->query->get("allowSubmmit");
    }
    $modal_form = $this->formBuilder()->getForm(
            '\Drupal\wordsonline_connector\Form\OrderConfirmForm',
            $allowSubmmit,
            $job_id,
            $request_guid
    );
    $render["form"] = $modal_form;
    return $render;
  }

  /**
   * Check quote status.
   *
   * @param Symfony\Component\HttpFoundation\Request $request
   *   The request from client.
   *
   * @return Symfony\Component\HttpFoundation\JsonResponse
   *   A json response.
   */
  public function checkQuoted(Request $request) {
    $has_change = FALSE;
    $key = NULL;
    if ($request->query->get("key")) {
      $key = $request->query->get("key");
    }
    $top = "10";
    $skip = 0;
    if ($request->query->get("page")) {
      $skip = $request->query->get("page");
    }
    if ($request->query->get("top")) {
      $top = $request->query->get("top");
    }
    $list = $this->getDataList($key, $skip, $top);
    if ($list != NULL) {
      $data = $list->list;
      $count = $list->count;
      if ($count > 0) {
        $has_change = $this->wo_manager->isChangeQuoteStatus($data);
      }
    }
    return new JsonResponse(
      [
        "status" => "success",
        "changed" => $has_change
      ]
    );
  }

  /**
   * Get WordsOnline job by job id.
   * 
   * @param int $job_id
   * Job id.
   */
  public function getWordsOnlineConnectorJobRecordByJobId($job_id){
    $f_ret = $this->database
    ->query(WordsOnlineConst::GET_WORDSONLINE_JOB_BY_JOB_ID_QUERY,
      [
        ':job_id' => $job_id
      ]
    )
    ->fetchAssoc();
    return $f_ret;
  }

  /**
   * Display list wordsonline job.
   *
   * @param Symfony\Component\HttpFoundation\Request $request
   *   The request from client.
   */
  public function jobList(Request $request) {
    $key = NULL;
    if ($request->query->get("key")) {
      $key = $request->query->get("key");
    }
    $top = "10";
    $skip = 0;
    if ($request->query->get("page")) {
      $skip = $request->query->get("page");
    }
    if ($request->query->get("top")) {
      $top = $request->query->get("top");
    }

    $job_filter_id = "0";
    if ($request->query->get("job_id")) {
      $job_filter_id = $request->query->get("job_id");
    }
    $header = [
      "id" => $this->t("Id"),
      "label" => $this->t("Label"),
      "project_name" => $this->t("Project Name"),
      "request_id" => $this->t("Request Id"),
      "request_name" => $this->t("Request Name"),
      "lang_name" => $this->t("Language"),
      "due_date" => $this->t("Due Date"),
      "status" => $this->t("Status"),
      "opt" => $this->t("Operations"),
    ];
    $refresh_link = base_path().'admin/tmgmt/wordsonline/jobs?top='.$top ."&page=".$skip ;
    if($key != NULL){
      $refresh_link = $refresh_link ."&key=".$key;
    }
    if($job_filter_id != "0"){
      $refresh_link = $refresh_link ."&job_id=".$job_filter_id;
    }
    $form['grant_type'] = [
      '#type' => 'hidden',
      '#default_value' => $refresh_link,
      '#value' => $refresh_link,
      "#attributes" => [
        "id" => "wo_request_url",
      ],
    ];
    $form["#prefix"] =
        "<div> <a id='btnRefresh'  href='#' 
         class='wol-btn btn-layout'>Refresh Page</a>
         </div> <div id='wol-loader'></div>";
    $token = $this->wo_manager->getToken();
    $list = $this->getDataList($key, $skip, $top, $job_filter_id, $token);
    $rows = [];
    $count = 0;
    $pageCount = 0;
    if ($list != NULL) {
      $data = $list->list;
      $count = $list->count;
      $numOfPage = is_numeric($top) ? (int) $top : 10;
      if ($count % $numOfPage > 0) {
        $pageCount = $count / $numOfPage + 1;
      }
      else {
        $pageCount = $count / $numOfPage;
      }
      $configs = $this->getConfig();
      $prj_guid ='';
      if ($configs != NULL) {
        $prj_guid = $configs["project_key"];
      }
      $results = $this->database
      ->query(WordsOnlineConst::ALL_JOB_QUERY)
      ->fetchAll();
      foreach ($data as $row) {
        $job_id = "";
        $operation = "";
        $due_date = "";
        $label = "";
        $status = WordsOnlineConst::NOT_AVAILABLE;
        $sourceLink = "";
        foreach ($results as $res) {
          if ($res->request_guid == $row->requestGuid) {
            $job_id = $res->job_id;
            $job = Job::load($job_id);
            if ($job) {
              $label = html_entity_decode($job->label());
              $status = $row->status;
              $due_date = $job->getSetting("due_date");
              $state = $job->getState();
              $jobItems = array_values($job->getItems());
              $sourceLink = $this->getSourceLink($jobItems);
              if ($row->status == WordsOnlineStatus::IMPORTED_STATUS && $res->status == WordsOnlineConst::JOB_DELIVERED) {
                $this->wo_manager->updateWordsOnlineJobStatus($job_id, WordsOnlineConst::JOB_IMPORTED);
                $res->status = WordsOnlineConst::JOB_IMPORTED;
              }
              if ($state == WordsOnlineConst::STATE_FINISHED) {
                if ($row->status != WordsOnlineStatus::FINISHED_STATUS) {
                  $this->wo_manager->requestAction($token, $row->requestGuid, WordsOnlineStatus::FINISHED_STATUS);
                  $status = WordsOnlineStatus::FINISHED_STATUS;
                }
                $download_link = $this->getDownloadLink($job_id,$row->requestGuid);
                $view_job_link = $this->getViewJobLink($jobItems,$job_id);
                $operation = $this->t( $view_job_link . $download_link . $sourceLink );
                $this->wo_manager->updateWordsOnlineJobStatus($job_id, WordsOnlineConst::JOB_FINISHED);
                break;
              }
              //hotfix old bug 
              if ($state != WordsOnlineConst::STATE_FINISHED && $row->status == WordsOnlineStatus::FINISHED_STATUS) {
                $this->wo_manager->requestAction($token, $row->requestGuid, WordsOnlineStatus::IMPORTED_STATUS);
                $status = WordsOnlineStatus::IMPORTED_STATUS;
                $edit = $this->getReviewLink($jobItems, $job_id);
                $operation =$this->t( $this->getViewXlfLink($job_id,$res->request_guid,'Reimport',$edit) . $sourceLink);
                $this->wo_manager->updateWordsOnlineJobStatus($job_id, WordsOnlineConst::IMPORTED_STATUS);
                break;
              }
              //end hotfix
              if ($row->state == WordsOnlineState::AUTOMATION_FAILED) {
                $this->updateWordsOnlineJobStatus($job_id, WordsOnlineConst::JOB_AUTOMATION_FAILED);
                $status = WordsOnlineConst::JOB_AUTOMATION_FAILED;
                break;
              }
              if ($row->status == WordsOnlineStatus::IN_PROGRESS_STATUS) {
                $operation =$this->t( $this->getConfirmLink($job_id, $res->request_guid,"&allowSubmmit=false") . $sourceLink);
                $this->wo_manager->updateWordsOnlineJobStatus($job_id, WordsOnlineConst::JOB_QUOTED);
                break;
              }
              if ($row->state == WordsOnlineState::QUOTE_SUBMITTED
                && ($row->status == WordsOnlineStatus::UNPAID
                || $row->status == WordsOnlineStatus::QUOTE_SUBMITTED)
                ) {
                $operation =$this->t( $this->getConfirmLink($job_id, $res->request_guid) . $sourceLink);
                $this->wo_manager->updateWordsOnlineJobStatus($job_id, WordsOnlineConst::JOB_QUOTED);
                break;
              }
              if ($row->state == WordsOnlineState::PAYMENT_FAILED
                  && ($row->status == WordsOnlineStatus::UNPAID
                  || $row->status == WordsOnlineStatus::QUOTE_SUBMITTED)
                  ) {
                $operation =$this->t( $this->getConfirmLink($job_id, $res->request_guid) . $sourceLink);
                break;
              }
              if ($res->status == WordsOnlineConst::JOB_IMPORTED) {
                if ($row->status != WordsOnlineStatus::IMPORTED_STATUS) {
                  $this->wo_manager->requestAction($auth, $row->requestGuid, WordsOnlineStatus::IMPORTED_STATUS);
                  $status = WordsOnlineStatus::IMPORTED_STATUS;
                }
                $edit = $this->getReviewLink($jobItems, $job_id);
                $operation =$this->t( $this->getViewXlfLink($job_id,$res->request_guid,'Reimport',$edit) . $sourceLink);
                break;
              }
              if ($row->status == WordsOnlineStatus::DELIVERED
                || $row->status == WordsOnlineStatus::IMPORT_FAIL_STATUS
                || $row->status == WordsOnlineStatus::IMPORT_FAILED_STATUS
                ) {
                if ($res->status != WordsOnlineConst::JOB_DELIVERED) {
                  $this->wo_manager->updateWordsOnlineJobStatus($job_id, WordsOnlineConst::JOB_DELIVERED);
                }
                $link_text = "Import";
                if ($row->status == WordsOnlineStatus::IMPORT_FAIL_STATUS
                || $row->status == WordsOnlineStatus::IMPORT_FAILED_STATUS) {
                  $link_text = "Reimport";
                }
                $operation =$this->t( $this->getViewXlfLink($job_id,$res->request_guid,$link_text) . $sourceLink);
              }
              break;
            }
          }
        }
        $rows[] = [
          "id" => $job_id,
          "label" => $label,
          "project_name" => $row->projectId,
          "request_id" => $row->requestId,
          "request_name" => $row->requestName,
          "lang_name" =>
          $row->sourceLanguageName . " > " . $row->targetLanguageName,
          "due_date" => $due_date,
          "status" => $status,
          "opt" => $operation,
        ];
      }
    }
    $form["searh_prefix"] = [
      "#markup" => '<div class="wol-search-field">',
    ];
    $form["searh_data"] = [
      "#type" => "textfield",
      "#name" => "job_data",
      "#value" => $key,
      "#placeholder" =>  $this->t(WordsOnlineConst::SEARCH_PLACEHOLDER),
    ];
    $form["actions"] = [
      "#type" => "button",
      "#value" => $this->t("Search"),
      "#name" => "job-search",
      "#attributes" => [
        "class" => ["btn", "btn-layout", "ml-3", "wol-btn"],
        "onclick" => "searchJob()",
      ],
    ];
    $pageLimits = [];
    $pageLimits["10"] = "10";
    $pageLimits["15"] = "15";
    $pageLimits["20"] = "20";
    $pageLimits["25"] = "25";
    $form["page_limit"] = [
      "#type" => "select",
      "#required" => TRUE,
      "#name" => "job_page",
      "#default_value" => $top,
      "#options" => $pageLimits,
      "#attributes" => ["onchange" => "changePageLimit()"],
      '#value' => $top,
    ];
    $job_filters=[];
    $job_ids = $this->database
    ->query(
      WordsOnlineConst::ALL_JOB_FOR_FILTER_QUERY,
        [
          ':prj_guid' => $prj_guid
        ]
      )
    ->fetchAll();
    $job_filters["0"] = $this->t("Select Job");
    foreach($job_ids as $tjid){
      $val ="Job (" . $tjid->tjid . ")";
      $job_filters[(string)$tjid->tjid] = $val;
    }
    $form["job_filter"] = [
      "#type" => "select",
      "#name" => "job_filter",
      "#default_value" => $job_filter_id,
      "#options" => $job_filters,
      "#attributes" => ["onchange" => "changePageLimit()"],
      '#value' =>$job_filter_id,
    ];
    $form["searh_surfix"] = [
      "#markup" => "</div>",
    ];
    $form["table"] = [
      "#type" => "table",
      "#header" => $header,
      "#rows" => $rows,
      "#empty" => $this->t("No records found"),
      "#attributes" => ["class" => ["wol-table"]],
    ];
    $form["pager"] = [
      "#type" => "pager",
    ];
    $pagging = $this->generatePagingHtml($pageCount, $skip);
    $form["info_prefix"] = [
      "#markup" => $pagging,
    ];
    $form["#attached"]["library"][] = "wordsonline_connector/wordsonline_job";
    return $form;
  }

  /**
   * Generate paging html
   */
  public function generatePagingHtml($pageCount, $skip){
    $pagging = "<div class='pagination'>";
    if ($pageCount > 0) {
      $pagging = $pagging . "<a href='#' class='wo-page' data-page='1'>&laquo;</a>";
      if ($skip == "" || $skip == NULL) {
        $skip = 1;
      }
      for ($i = 1; $i <= $pageCount; $i++) {
        $active = "";
        if ($i == $skip) {
          $active = "active";
        }
        $pagging =
          $pagging .
          "<a class='$active wo-page' href='#' data-page='$i'>" .
          $i .
          "</a>";
      }
      $pagging =
        $pagging .
        "<a href='#' class='wo-page' data-page='$pageCount'>&raquo;</a></div>";
    }
    $pagging = $pagging . "</div>";
    return $pagging;
  }

  /**
   * Get view job link.
   * 
   * @param array $jobItems
   * Job items.
   * @param int $job_id
   * Job id.
   */
  public function getViewJobLink($jobItems, $job_id){
    $url ='';
    if (count($jobItems) > 1) {
      $url = base_path() .
        "admin/tmgmt/jobs/" .
        $job_id;
    }
    else {
      $url = base_path() .
        "admin/tmgmt/items/" .
        $jobItems[0]->id() .
        "?destination=" .
        base_path() .
        "admin/tmgmt/jobs/" .
        $job_id;
    }
    return " <a href='$url' target='_blank'   class='btn'  title='View Job'>View Job</a> ";
  }

  /**
   * Get download link.
   * 
   * @param int $job_id
   * Job id.
   * @param string $request_guid
   * Request guid.
   */
  public function getDownloadLink($job_id,$request_guid){
    $down = base_path() .
    WordsOnlineConst::VIEW_XLF_LINK .
    $job_id.'&request_guid='.$request_guid;
  return $this->t(
    " <a href=':url' class='use-ajax btn'  
    data-dialog-type='modal' 
    title='download'>Download</a> ",
    [
      ":url" => $down
    ]
  );
  }

  /**
   * Get confirm link.
   * 
   * @param int $job_id
   * Job id.
   * @param string $request_guid
   * Request guid.
   * @param string $add
   * Add more param.
   */
  public function getConfirmLink($job_id, $request_guid,$add=''){
    $link = base_path() .
    WordsOnlineConst::CONFIRM_ORDER_LINK .
    $job_id.'&request_guid='.$request_guid.$add;
    return $this->t(
    " <a href=':url' class='use-ajax btn'  
     data-dialog-type='modal' title='View Quote'
     >View Quote</a> ",
    [
      ":url" => $link,
    ]
    );
  }

  /**
   * Get review link.
   * 
   * @param array $jobItems
   * Job items.
   * @param int $job_id
   * Job id.
   */
  public function getReviewLink($jobItems, $job_id){
    $link = '';
    if (count($jobItems) > 1) {
      $url = base_path() .
        "admin/tmgmt/jobs/" .
        $job_id;
        $link =" <div class='wo-dropdown'><button class='dropbtn'>Review</button><div class='wo-dropdown-content'>";
        foreach($jobItems as $ji){
          $job_item_id = $ji->id();
          $link .="<a href='".base_path() .
          "admin/tmgmt/items/" .
          $job_item_id .
          "?destination=" .
          base_path() .
          "admin/tmgmt/jobs/" .
          $job_id."' hreflang='und'  target='_blank'>".$ji->getSourceLabel()."(Job Item " . $job_item_id . ")</a>";
        }
        $link .= "</div></div> ";
    }
    else {
        foreach($jobItems as $ji){
          $job_item_id = $ji->id();
          $url = base_path() .
          "admin/tmgmt/items/" .
          $job_item_id .
          "?destination=" .
          base_path() .
          "admin/tmgmt/jobs/" .
          $job_id;
          $link = " <a href='" . $url . "' target='_blank' 
          class='btn' title='Review'>Review</a> ";
          break;
        }
    }
    return  $link;
  }

  /**
   * Get source link.
   * 
   * @param array $jobItems
   * Job items.
   */
  public function getSourceLink($jobItems){
    $link =" <div class='wo-dropdown'><button class='dropbtn'>Source</button><div class='wo-dropdown-content'>";
    foreach($jobItems as $ji){
      $item_id = $ji->getItemId();
      $sourceUrl =  $ji->getSourceUrl()->toString();
      if($sourceUrl == "FALSE" || $sourceUrl == "1"){
        $sourceUrl = "/node/".$item_id;
      }
      if (substr($sourceUrl , 0, 1 ) === '/') {
        $sourceUrl = substr($sourceUrl, 1);
      }
      $sourceUrl = base_path() . $sourceUrl;
      $sourceLabel =  $ji->getSourceLabel();
      $link .="<a href='" . $sourceUrl . "' hreflang='und' target='_blank'>" . $sourceLabel ."(Job Item " . $ji->id() . ")</a>";
    }
    $link .= "</div></div> ";
    return  $link;
  }

  /**
   * Get view xlf link.
   * 
   * @param int $job_id
   * Job id.
   * @param string $request_guid
   * Request guid.
   * @param string $link_text
   * Link text.
   * @param string $add
   * Add more string.
   */
  public function getViewXlfLink($job_id,$request_guid,$link_text ='Import',$add =''){
    $down = base_path() .
    WordsOnlineConst::VIEW_XLF_LINK .
    $job_id.'&request_guid='.$request_guid;
  return $this->t($add.
    " <a href=':url' class='use-ajax btn'  
    data-dialog-type='modal' 
    title='download'>Download</a>  <a  class='btn' onclick='reimport(@job_id,@request_guid
    )'  title='@link_text'>@link_text </a> ",
    [
      ":url" => $down,
      "@job_id" => $job_id,
      "@link_text" => $link_text,
      '@request_guid' =>  "'" . (string) $request_guid . "'",
    ]
  );
  }

  /**
   * Get list requests.
   *
   * @param string $filter
   *   The filter string.
   * @param int $skip
   *   Skip record.
   * @param string $top
   *   Number of record per page.
   * @param string $job_filter_id
   * Job id.
   */
  public function getDataList($filter, $skip, $top = "10", string $job_filter_id = "0", $token = NULL) {
    $page = 0;
    if ($skip != NULL && $skip != "") {
      $page = (int) $skip;
      if ($page > 0) {
        $page = $page - 1;
      }
    }
    if($job_filter_id != NULL &&  $job_filter_id !="0"){
     $record = $this->getWordsOnlineConnectorJobRecordByJobId((int)$job_filter_id);
     if($record != NULL){
      $filter = $record["request_name"];
     }
    }
   
    $page = $page * 10;
    if ($token == NULL) {
      $token = $this->wo_manager->getToken();
    }
    if ($token != NULL) {
      $url = WordsOnlineConst::API_URL .
        'Requests?$skip=' .
        $page .
        '&$top=' .
        $top .
        '&$orderby=CreatedAt desc ';
      if ($filter != NULL && $filter != "") {
        $searchId = "";
        if (is_numeric($filter)) {
          $searchId = " or RequestId eq  " . $filter . " ";
        }
        $url = $url .
          '&$filter=(contains(tolower(RequestName),tolower(%27' .
          $filter .
          "%27))  " .
          $searchId .
          ")";
      }
     
      $result = $this->client->get(
        $url,
        [
          "headers" => [
            "Authorization" => "Bearer " . $token,
            "Accept" => "application/json",
            "Referer" => "ClientAPI",
          ],
          "timeout" => 3600,
        ]
      );
      if ($result->getStatusCode() == 200) {
        $data = json_decode($result->getBody()->getContents());
        if ($data->status == 1) {
          return $data->result;
        }
      }
    }
    return NULL;
  }

  /**
   * Get quote info for job.
   *
   * @param Symfony\Component\HttpFoundation\Request $request
   *   The request from client.
   *
   * @return Symfony\Component\HttpFoundation\JsonResponse
   *   A json response.
   */
  public function getQuote(Request $request) {
    $res["status"] = "error";
    if ($request->query->get("job_id")) {
      $job_id = $request->query->get("job_id");
      $request_guid = $request->query->get("request_guid");
      $token = $this->wo_manager->getToken();
      if ($token != NULL) {
        if ($request_guid != NULL) {
          $quotes = wordsonline_connector_get_quote($request_guid, $token);
          if ($quotes != NULL && $quotes->status == 1) {
            $res["status"] = "success";
            $res["data"] = $quotes->result;
          }
        }
        return new JsonResponse($res);
      }
      else {
        return new JsonResponse($res);
      }
    }
    else {
      return new JsonResponse($res);
    }
  }

  /**
   * Check has delivery files.
   *
   * @return Symfony\Component\HttpFoundation\JsonResponse
   *   A json response.
   */
  public function checkHasFiles() {
    $token = $this->wo_manager->getToken();
    if ($token != NULL) {
      $has_change = $this->wo_manager->isHasDeliveryStatusChange($token);
      return new JsonResponse(
        [
          "status" => "success",
          "changed" => $has_change,
        ]
      );
    }
    else {
      return new JsonResponse(["status" => "error", "changed" => FALSE]);
    }
  }

  /**
   * Set request fail and send mail.
   *
   * @param string $request_guid
   *   Guid of request.
   * @param string $xmlData
   *   Xml content.
   * @param string $token
   *   The token for authorization.
   */
  public function sendErrorToWordsOnline($request_guid, $xmlData, $token) {
    $messages = wordsonline_connector_get_error_message($xmlData);
    wordsonline_connector_request_action(
      $request_guid,
      WordsOnlineStatus::IMPORT_FAIL_STATUS,
      $messages,
      $token
    );
  }

  /**
   * Import file.
   *
   * @param Symfony\Component\HttpFoundation\Request $request
   *   The request from client.
   *
   * @return Symfony\Component\HttpFoundation\JsonResponse
   *   A json response.
   */
  public function reimport(Request $request) {
    if ($request->query->get("job_id")) {
      $job_id = $request->query->get("job_id");
      $request_guid = $request->query->get("request_guid");
      $status =  $this->wo_manager->import($job_id, $request_guid);
      return new JsonResponse(["status" => $status]);
    }
    return new JsonResponse(["status" => "error"]);
  }

  /**
   * Get config from wordsonline table.
   */
  public function getConfig() {
    $ret = $this->database
    ->query(WordsOnlineConst::SELECT_CONFIG)
    ->fetchAssoc();
    return $ret;
  }

  /**
   * Display xlf file for review.
   *
   * @param Symfony\Component\HttpFoundation\Request $request
   *   The request from client.
   */
  public function viewXlf(Request $request) {
    $xmlData = [];
    $fName ="";
    if ($request->query->get("job_id")) {
      $job_id = $request->query->get("job_id");
      $request_guid = $request->query->get("request_guid");
      $token = $this->wo_manager->getToken();
      if ($token != NULL) {
        if ($request_guid != NULL) {
          $files = wordsonline_connector_get_request_files_list(
            $request_guid,
            $token
          );
          if ($files != NULL) {
            foreach ($files->result as $fi) {
              $file_guid = $fi->guid;
              $data = wordsonline_connector_download_file(
                $request_guid,
                $file_guid,
                $token
              );
              $fName = "public://" . $fi->name;
              file_put_contents($fName, $data);
              $zip = new ZipHandle($fName, $this->archiver, $this->fileSystem);
              $fileContent = $zip->fileContent;
              $fileNames = $zip->fileNames;
              //$this->fileSystem->delete($fName);
              if ($fileContent != NULL
                && count($fileContent) > 0
              ) {
                $i = 0;
                foreach ($fileContent as $fcontent) {
                  array_push($xmlData, new WOFile(
                    $fileNames[$i],
                    $fcontent
                  ));
                  $i++;
                }
              }
            }
          }
        }
      }
     
    }
    $modal_form = $this->formBuilder()->getForm(
      '\Drupal\wordsonline_connector\Form\ViewXlfForm',
      $xmlData,
      $fName
    );
    $render["form"] = $modal_form;
    return $render;
  }

  /**
   * Get xlf file content.
   *
   * @param Symfony\Component\HttpFoundation\Request $request
   *   The request from client.
   */
  public function getFileContent(Request $request) {
    $result = "";
    if ($request->query->get("fileName")) {
      $fileName = $request->query->get("fileName");
      $tempPath = "temporary://wordsonline_connector/$fileName";
      if (!file_exists($tempPath)) {
        return new JsonResponse(
          [
            "status" => "error",
            "result" => "",
            "messages" => "File $fileName is not exists",
          ]
        );
      }
      $result = file_get_contents($tempPath);
    }
    else {
      return new JsonResponse(
        [
          "status" => "error",
          "result" => "",
          "messages" => "Paramerter is incorrect",
        ]
      );
    }
    return new JsonResponse(
      [
        "status" => "success",
        "result" => $result,
        "messages" => "",
      ]
    );
  }

  /**
   * Get zip file content.
   *
   * @param Symfony\Component\HttpFoundation\Request $request
   *   The request from client.
   */
  public function downloadJobFile(Request $request) {
    $fileName = $request->query->get("fileName");
    $uri = 'public://' . $fileName;
    $headers = [
      'Content-Type'     => 'application/zip',
      'Content-Disposition' => 'attachment;filename="' . $fileName . '"',
    ];
    return new BinaryFileResponse($uri, 200, $headers, TRUE);
  }

  /**
   * Display list wordsonline support language.
   *
   * @param Symfony\Component\HttpFoundation\Request $request
   *   The request from client.
   */
  public function supportLanguages(Request $request) {
    $header = [
      "code" => $this->t("Drupal Language Code"),
      "lang_name" => $this->t("Language Name"),
      "wol_code" => $this->t("WordsOnline Language Code")
    ];
    $rows = [];
    $form["#prefix"] =
        "<div><a  href='".base_path() . WordsOnlineConst::IMPORT_SUPPORT_LANG_URL."' 
         class='wol-btn btn-layout'>Re-import support languages</a>
         </div>";
    $results = $this->database
      ->query(
        WordsOnlineConst::GET_ALL_WORDSONLINE_SUPPORT_LANGUAGES_QUERY
      )
      ->fetchAll();
    foreach ($results as $res) {
      $rows[] = [
        "code" => $res->code,
        "lang_name" => $res->lang_name,
        "wol_code" => $res->wol_code
      ];

    }
    $form["table"] = [
      "#type" => "table",
      "#header" => $header,
      "#rows" => $rows,
      "#empty" => $this->t("No records found"),
      "#attributes" => ["class" => ["wol-table"]],
    ];
    $form["#attached"]["library"][] = "wordsonline_connector/wordsonline_support_language";
    return $form;
  }

  /**
   * reImport list wordsonline support language.
   *
   * @param Symfony\Component\HttpFoundation\Request $request
   *   The request from client.
   */
  public function importSupportLanguages(Request $request) {
     try{
      $npath = $this->moduleExtensionList->getPath(WordsOnlineConst::MODULE_ID);
      $import = $this->fileSystem->realpath($npath . '/js/languages.json');//$this->fileUrlGenerator->generateAbsoluteString($npath . '/js/languages.json');
      $content = file_get_contents($import);
      $langs = json_decode($content);
      foreach ($langs as $lang) {
        $results = $this->database
        ->query(
          WordsOnlineConst::GET_WORDSONLINE_SUPPORT_LANGUAGE_BY_CODE_QUERY,
            [":code" => (string) $lang->code]
        )
        ->fetchAssoc();
        if ($results != NULL) {
          $this->database
          ->update(WordsOnlineConst::LANGUAGE_JOB_TABLE)
          ->condition("code", $lang->code)
          ->fields(
            [
              'code' => $lang->code,
              'lang_name' => $lang->lang_name,
              'wol_code' => $lang->wol_code
            ]
          )
          ->execute();
        } else {
          $this->database->insert(WordsOnlineConst::LANGUAGE_JOB_TABLE)
          ->fields(['code', 'lang_name', 'wol_code'])
          ->values([
            'code' => $lang->code,
            'lang_name' => $lang->lang_name,
            'wol_code' => $lang->wol_code
          ])
          ->execute();
        }
       
      }
      $this->messenger->addMessage('Re-import supported languages successfully');
     }catch(\Exception $e) {
      $this->messenger->addError($e->getMessage());
     }
     $target_url = base_path() . WordsOnlineConst::SUPPORT_LANG_URL;
     $response = new RedirectResponse($target_url);
     $response->send();
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc