File: /home/imensosw/www/ezwork/app/Models/Document.php
<?php
/**
* DocumentModel class file
*
* PHP Version 7.2
*
* @category Model
* @package Ez
* @author Imenso Software <admin@imensosoftware.com>
* @license http://imensosoftware/license.php GNU Public License
* @link http://imensosoftware.com/recipes
*/
namespace App\Models;
use DB ;
use Illuminate\Database\Eloquent\Model;
use App\Models\DocumentService;
use App\Models\DocumentPartService;
/**
* DocumentModel class
*
* The class manage Document related queries
*
* @category DocumentModel
* @package Ez
* @author Imenso Software <admin@imensosoftware.com>
* @license http://imensosoftware/license.php GNU Public License
* @link http://imensosoftware.com/recipes
*/
class Document extends Model
{
public $table = "documents";
/**
* The attributes that are mass assignable.
*
* @var array
*/
public $fillable = ['document_status_id','approval_status_id','file_title','file_name',
'word_count','page_count','client_code_id',
'client_charge_code_id','requester_id','from_language_id','to_language_id',
'requested_delivery','committed_delivery','start_datetime','context_id',
'include_header','include_footer','include_notes','include_non_words',
'client_comment',
];
/**
* Services function return services that belong to the specified document.
*
* @param void
* @return App\Models\Service
*/
public function services()
{
return $this->belongsToMany('App\Models\Service', 'document_services', 'document_id', 'service_id');
}
/**
* Services function return services that belong to the specified document.
*
* @param void
* @return App\Models\Service
*/
public function references()
{
return $this->hasMany('App\Models\DocumentReference', 'document_id');
}
/**
* GetDocument function get the list of document of specified id
* and return the document list .
*
* @param int documentId
* @return App\Models\Document
*/
public static function getDocument($documentId)
{
return Document::
select(
"documents.*",
'from_languages.language_l as from_language',
'to_languages.language_l as to_language',
'from_languages.language_s as from_language_s',
'to_languages.language_s as to_language_s',
'document_contexts.context',
'clients.code as client_code',
'document_status.status_name',
'requesters.requester_name',
'client_charge_codes.client_charge_code',
DB::raw("
DATE_FORMAT(documents.start_datetime, '%a, %D %b, %l %p') as start_datetime_dmy,
DATE_FORMAT(documents.committed_delivery, '%a, %D %b, %l %p') as committed_delivery_dmy,
DATE_FORMAT(documents.requested_delivery, '%a, %D %b, %l %p') as requested_delivery_dmy,
DATE_FORMAT(documents.requested_delivery,'%Y-%m-%dT%TZ') as requested_delivery,
DATE_FORMAT(documents.committed_delivery,'%Y-%m-%dT%TZ') as committed_delivery,
DATE_FORMAT(documents.start_datetime,'%Y-%m-%dT%TZ') as start_datetime,
GROUP_CONCAT(DISTINCT services.service_s ORDER BY services.id SEPARATOR ' > ') as service_name,
GROUP_CONCAT(DISTINCT services.id ORDER BY services.id SEPARATOR ',') as service_ids
")
)
->leftJoin('document_status', 'document_status.id', '=', 'documents.document_status_id')
->leftJoin('languages as from_languages', 'from_languages.id', '=', 'documents.from_language_id')
->leftJoin('languages as to_languages', 'to_languages.id', '=', 'documents.to_language_id')
->leftJoin('document_contexts', 'document_contexts.id', '=', 'documents.context_id')
->leftJoin('clients', 'clients.id', '=', 'documents.client_code_id')
->leftJoin('document_services', 'document_services.document_id', '=', 'documents.id')
->leftJoin('services', 'services.id', '=', 'document_services.service_id')
->leftJoin('client_charge_codes', 'client_charge_codes.id', '=', 'documents.client_charge_code_id')
->leftJoin('requesters', 'requesters.id', '=', 'documents.requester_id')
->where('documents.id', $documentId)->groupBy('documents.id')->first();
}
/**
* GetDocuments function gets the list of all the documents from storage
* and return the document list .
*
* @param array request
* @return App\Models\Document
*/
public static function getDocuments($request)
{
$page = 0 ;
if ($request->page) {
$page = $request->page ;
}
$documents = Document::
select(
"documents.*",
'from_languages.language_l as from_language',
'to_languages.language_l as to_language',
'from_languages.language_s as from_language_s',
'to_languages.language_s as to_language_s',
'clients.code as client_code',
'requesters.requester_name',
'document_contexts.context',
'document_status.status_name',
DB::raw(
"SUBSTRING(from_languages.language_l, 1, 1) as language_in,
SUBSTRING(to_languages.language_l, 1, 1) as language_out,
DATE_FORMAT(documents.start_datetime, '%a, %D %b, %l %p') as start_datetime_dmy,
DATE_FORMAT(documents.committed_delivery, '%a, %D %b, %l %p') as committed_delivery_dmy,
DATE_FORMAT(documents.requested_delivery, '%a, %D %b, %l %p') as requested_delivery_dmy,
count(document_parts.id) as partCount,
GROUP_CONCAT(DISTINCT services.service_s ORDER BY services.id SEPARATOR ' > ') as service_name,
GROUP_CONCAT(DISTINCT services.service_s ORDER BY services.id SEPARATOR ',') as service_names,
TIMESTAMPDIFF(SECOND,now(),documents.start_datetime)*1000 as time_remaining"
)
)
->leftJoin('languages as from_languages', 'from_languages.id', '=', 'documents.from_language_id')
->leftJoin('languages as to_languages', 'to_languages.id', '=', 'documents.to_language_id')
->leftJoin('document_contexts', 'document_contexts.id', '=', 'documents.context_id')
->leftJoin('clients', 'clients.id', '=', 'documents.client_code_id')
->leftJoin('requesters', 'requesters.id', '=', 'documents.requester_id')
->leftJoin('document_status', 'document_status.id', '=', 'documents.document_status_id')
->leftJoin('document_parts', 'document_parts.document_id', '=', 'documents.id')
->leftJoin('document_services', 'document_services.document_id', '=', 'documents.id')
->leftJoin('services', 'services.id', '=', 'document_services.service_id')
;
if ($request->search_by && $request->search_by != '') {
$searchBy = $request->search_by ;
$documents = $documents
->where('documents.file_title', 'like', "%$searchBy%")
->orWhere('documents.file_name', 'like', "%$searchBy%")
->orWhere('clients.code', 'like', "%$searchBy%")
->orWhere('requesters.requester_name', 'like', "%$searchBy%")
->orWhere('from_languages.language_l', 'like', "%$searchBy%")
->orWhere('to_languages.language_l', 'like', "%$searchBy%")
->orWhere('from_languages.language_s', 'like', "%$searchBy%")
->orWhere('to_languages.language_s', 'like', "%$searchBy%")
;
}
if ($request->document_status_id && $request->document_status_id != '') {
$statusId = $request->document_status_id ;
$documents = $documents
->where('documents.document_status_id', $statusId);
}
$documentsResult = $documents->groupBy('documents.id')->orderBy('documents.so', 'DESC')
->orderBy('documents.id', 'DESC')->offset($page * 10)->limit(10)->get();
$documents = [];
foreach ($documentsResult as $document) {
$documentId = $document->id;
$services = DocumentService::
select("services.*")
->join('services', 'services.id', '=', 'document_services.service_id')
->where('document_services.document_id', $document->id)
->orderBy('services.id', 'ASC')->get();
$servicesCol = 'parts.id as part_id,parts.part_name';
foreach ($services as $service) {
$serviceId = $service->id;
/*$servicesCol = $servicesCol . ",MAX(CASE WHEN document_services.service_id =
$serviceId and document_services.document_id = $documentId THEN
document_part_services.delivery_datetime END) service_$serviceId";*/
$servicesCol = $servicesCol . ",MAX(CASE WHEN document_services.service_id
= $serviceId and document_services.document_id = $documentId THEN
DATE_FORMAT(document_part_services.delivery_datetime, '%d-%m-%Y %h:%i %p') END) service_$serviceId";
}
$partServices = DocumentPartService::select(DB::raw("$servicesCol"))
->join('document_parts', 'document_parts.id', '=', 'document_part_services.document_part_id')
->join('parts', 'parts.id', '=', 'document_parts.part_id')
->join('document_services', 'document_services.id', '=', 'document_part_services.document_service_id')
->where('document_services.document_id', $document->id)
->groupBy('document_part_services.document_part_id')->orderBy('parts.id', 'ASC')->get();
$currentService = DocumentService::getCurrentService($document->id);
$document['services'] = $services;
$document['partServices'] = $partServices;
$document['currentService'] = $currentService;
$documents[] = $document;
}
return $documents;
}
/**
* apiPostWordCount function call api word_count
* and return the document list .
*
* @param array request
* return api word_count responde json
*/
public static function apiPostWordCount($data)
{
$curl = curl_init();
$sourceLanguage = "english";
$targetLanguage = "english";
$header = $data['include_header'] == 1 ? "true" : "false";
$footer = $data['include_footer'] == 1 ? "true" : "false";
$notes = $data['include_notes'] == 1 ? "true" : "false";
$nonWords = $data['include_non_words'] == 1 ? "true" : "false";
$s3Path = $data['s3Path'];
$postData = [
'source_language' => $sourceLanguage,
'target_language' => $targetLanguage,
's3_path' => $s3Path,
'include_counts' =>
[
'header' => $header,
'footer' => $footer,
'notes' => $notes,
'non_words' => $nonWords,
],
];
$postData = json_encode($postData);
$id = $data['id'] ;
curl_setopt_array(
$curl,
array(
CURLOPT_URL => env('API_WORD_COUNT') . "/word_count/$id?assignment_id=$id",
CURLOPT_HEADER => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => $postData,
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'Content-Length: ' . strlen($postData)
),
)
);
$response = curl_exec($curl);
$httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
return json_decode($httpcode);
}
/**
* apiPostWordCount function call api word_count
* and return the document list .
*
* @param array request
* return api word_count responde json
*/
public static function apiPutWordCount($data)
{
$curl = curl_init();
$sourceLanguage = "english";
$targetLanguage = "english";
$header = $data['include_header'] == 1 ? "true" : "false";
$footer = $data['include_footer'] == 1 ? "true" : "false";
$notes = $data['include_notes'] == 1 ? "true" : "false";
$nonWords = $data['include_non_words'] == 1 ? "true" : "false";
$s3Path = $data['s3Path'];
$id = $data['id'] ;
$postData = [
'source_language' => $sourceLanguage,
'target_language' => $targetLanguage,
's3_path' => $s3Path,
'include_counts' =>
[
'header' => $header,
'footer' => $footer,
'notes' => $notes,
'non_words' => $nonWords,
],
];
$postData = json_encode($postData);
$id = $data['id'] ;
curl_setopt_array(
$curl,
array(
CURLOPT_URL => env('API_WORD_COUNT') . "/word_count/$id?assignment_id=$id",
CURLOPT_HEADER => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => $postData,
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'Content-Length: ' . strlen($postData)
),
)
);
$response = curl_exec($curl);
$httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
return json_decode($httpcode);
}
/**
* apiPostWordCount function call api word_count
* and return the document list .
*
* @param array request
* return api word_count responde json
*/
public static function apiGetWordCount($id)
{
$curl = curl_init();
curl_setopt_array(
$curl,
array(
CURLOPT_URL => env('API_WORD_COUNT') . "/word_count/$id",
CURLOPT_HEADER => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json'
),
)
);
$response = curl_exec($curl);
$httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
return json_decode($httpcode);
}
/**
* apiPostWordCount function call api word_count
* and return the document list .
*
* @param array request
* return api word_count responde json
*/
public static function apiGetSplitter($data)
{
$curl = curl_init();
curl_setopt_array(
$curl,
array(
CURLOPT_URL => env('API_SPLITTER') . "/splitter/" . $data['id'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
)
);
// $response = curl_exec($curl);
// curl_close($curl);
// return json_decode($response);
$response = curl_exec($curl);
if (empty($response)) {
curl_close($curl);
return json_decode(['HTTP_CODE' => 404]);
//die("No HTTP result was returned");
} else {
$info = curl_getinfo($curl);
curl_close($curl);
if (empty($info['http_code'])) {
return json_decode(['HTTP_CODE' => 404]);
//die("No HTTP code was returned");
} else {
$data = json_decode($response);
$data->HTTP_CODE = $info['http_code'];
return $data;
}
}
}
/**
* apiPostPublish function call api publish
* and return the assignment details.
*
* @param array request
* return api publish responde json
*/
public static function apiPostPublish($data, $deliveryPlan)
{
$curl = curl_init();
$postData = [
'context' => $data['context_id'],
'client_code' => $data['client_code_id'],
'client_charge_code' => $data['client_charge_code'],
'committed_delivery' => $data['committed_delivery'],
'delivery_plan' => $deliveryPlan
];
$postData = json_encode($postData);
$id = $data['id'] ;
curl_setopt_array(
$curl,
array(
CURLOPT_URL => env('API_PUBLISH') . "/publish/$id?assignment_id=$id",
CURLOPT_HEADER => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => $postData,
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'Content-Length: ' . strlen($postData)
),
)
);
$response = curl_exec($curl);
$httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
return json_decode($httpcode);
}
}