first commit
This commit is contained in:
@@ -0,0 +1,239 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands\PropertyReviewService;
|
||||
|
||||
|
||||
use App\Exceptions\ApiErrorException;
|
||||
use App\Models\PropertyReview;
|
||||
use App\Models\PropertyReviewCategory;
|
||||
use App\Models\PropertyReviewCategoryMapping;
|
||||
use App\Models\PropertyReviewKeywordMapping;
|
||||
use Carbon\Carbon;
|
||||
use Google\Protobuf\Api;
|
||||
use GuzzleHttp\Client;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Mail\Mailer;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use Illuminate\Support\Facades\Config;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Str;
|
||||
use Exception;
|
||||
|
||||
class PropertyReviewAnalyzeService extends Command
|
||||
{
|
||||
protected $signature = 'cron:property-review-analyze-service {review_id}';
|
||||
|
||||
protected $description = '';
|
||||
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$this->restClient = new Client(['http_errors' => false]);
|
||||
|
||||
}
|
||||
|
||||
protected function requestService($params = [])
|
||||
{
|
||||
|
||||
$response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500];
|
||||
|
||||
try {
|
||||
|
||||
$client = new \GuzzleHttp\Client([
|
||||
'max' => 5,
|
||||
'strict' => false,
|
||||
'referer' => false,
|
||||
'protocols' => ['https'],
|
||||
'timeout' => 30,
|
||||
'headers' => [
|
||||
'Authorization' => 'Bearer ' . config('app.openAISecretKey'),
|
||||
'Content-Type' => 'application/json',
|
||||
'Cache-Control' => 'no-cache',
|
||||
'Connection' => 'keep-alive',
|
||||
'Accept-Encoding' => 'gzip'
|
||||
]
|
||||
]
|
||||
);
|
||||
|
||||
|
||||
$result = $client->post('https://api.openai.com/v1/chat/completions', [
|
||||
'body' => json_encode($params['query'])
|
||||
]);
|
||||
|
||||
$result = $result->getBody()->getContents();
|
||||
$result = json_decode($result, 1);
|
||||
|
||||
$choiceMessage = reset($result['choices']);
|
||||
|
||||
if (isset($choiceMessage['message']['content'])) {
|
||||
$choiceMessage = json_decode($choiceMessage['message']['content'], 1);
|
||||
$data = $choiceMessage;
|
||||
}
|
||||
|
||||
$response = [
|
||||
'status' => true,
|
||||
'data' => $data,
|
||||
];
|
||||
|
||||
|
||||
} catch (ApiErrorException $e) {
|
||||
$response['message'] = implode(', ', $e->getMessageArr());
|
||||
$response['statusCode'] = 400;
|
||||
} catch (Exception $e) {
|
||||
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
|
||||
Log::error($message);
|
||||
$response['message'] = $e->getMessage();
|
||||
$response['statusCode'] = 500;
|
||||
}
|
||||
|
||||
return $response;
|
||||
|
||||
}
|
||||
|
||||
public function handle()
|
||||
{
|
||||
|
||||
$this->info(date('Y-m-d H:i:s') . ' START');
|
||||
|
||||
|
||||
//420
|
||||
|
||||
$propertyReview = PropertyReview::where('id', $this->argument('review_id'))
|
||||
->with('channel')
|
||||
->with('property')
|
||||
->first();
|
||||
|
||||
$propertyReview = $propertyReview ? $propertyReview->toArray() : null;
|
||||
|
||||
if (!$propertyReview) {
|
||||
Log::error('Property Review: ' . $propertyReview['property']['name'] . ' - ' . $propertyReview['channel']['name']);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
$propertyReviewCategory = PropertyReviewCategory::where('status', 1)->select(['id', 'name'])->get()->toArray();
|
||||
$propertyReviewCategoryText = implode(', ', collect($propertyReviewCategory)->pluck('name')->toArray());
|
||||
|
||||
|
||||
$params['query'] = [
|
||||
'model' => 'gpt-4o',
|
||||
'response_format' => [
|
||||
'type' => 'json_object'
|
||||
],
|
||||
'messages' => [
|
||||
[
|
||||
'role' => 'system',
|
||||
'content' => 'Sen bir otel gelir yönetimi uzmanısın ve otellere yapılan yorumları değerlendiriyosun. Cevaplar SADECE JSON formatında. Yorumu genel olarak değerlendirip, misafir gibi düşünüp 0: olumsuz,1: olumlu olacak şekilde sentiment alanında işaretleyelim. Gelen yorumları \"' . $propertyReviewCategoryText . '\" kategorilerine göre categories alanında işaretleyip gruplayalım. Her bir gruplanan kategori için de 0: olumsuz,1: olumlu olacak şekilde işaretleyelim, ilgisiz kategorileri eklemeyelim. keywords alanında bu yorum ile ilgili kilit kelimeleri, ileride kelime bulutu yapmak için ingilizce çıkaralım,kelimeler otel ve otelcilik ile ilgili olsun, kelimeler normal metin şeklinde, aralıkları boşluklu ve sadece ilk harfleri büyük olsun, bu kelimeler için de 0: olumsuz,1: olumlu olacak şekilde işaretleyelim. Yorumu da language parametresi altında 2 haneli ISO koduna göre verelim.'
|
||||
],
|
||||
[
|
||||
'role' => 'user',
|
||||
'content' => $propertyReview['review']
|
||||
]
|
||||
]
|
||||
|
||||
];
|
||||
|
||||
$propertyReviewAnalyze = $this->requestService($params);
|
||||
//$propertyReviewAnalyze = json_decode('{"status":true,"data":{"sentiment":0,"categories":{"Location":0,"Breakfast":0,"Service":1,"Cleanliness":1,"Room Facilities":0},"keywords":{"Location":0,"Breakfast":0,"Service Quality":1,"Cleaning":1,"Room Amenities":0}}}', 1);
|
||||
|
||||
if ($propertyReviewAnalyze['status']) {
|
||||
|
||||
|
||||
DB::beginTransaction();
|
||||
|
||||
$transactionSave = false;
|
||||
|
||||
try {
|
||||
|
||||
|
||||
$this->info(date('Y-m-d H:i:s') . ': Property Review: ' . $propertyReview['property']['name'] . ' - ' . $propertyReview['channel']['name']);
|
||||
|
||||
PropertyReview::where('id', $propertyReview['id'])->update(['sentiment' => $propertyReviewAnalyze['data']['sentiment'], 'language' => $propertyReviewAnalyze['data']['language']]);
|
||||
|
||||
//PropertyReviewCategoryMapping
|
||||
$this->info(date('Y-m-d H:i:s') . ': Property Review Category Mapping: ' . $propertyReview['property']['name'] . ' - ' . $propertyReview['channel']['name']);
|
||||
$bulkReviewCategoryMapping = [];
|
||||
PropertyReviewCategoryMapping::where('review_id', $propertyReview['id'])->delete();
|
||||
foreach ($propertyReviewAnalyze['data']['categories'] as $category => $categorySentiment) {
|
||||
|
||||
$categorySelected = collect($propertyReviewCategory)->where('name', $category)->first();
|
||||
|
||||
if (isset($categorySelected['id'])) {
|
||||
|
||||
$bulkReviewCategoryMapping[] = [
|
||||
'review_id' => $propertyReview['id'],
|
||||
'property_id' => $propertyReview['property_id'],
|
||||
'channel_id' => $propertyReview['channel_id'],
|
||||
'category_id' => $categorySelected['id'],
|
||||
'sentiment' => $categorySentiment,
|
||||
'review_date' => $propertyReview['review_date'],
|
||||
'status' => 1,
|
||||
'created_at' => time(),
|
||||
'updated_at' => time(),
|
||||
];
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($bulkReviewCategoryMapping)) {
|
||||
PropertyReviewCategoryMapping::insert($bulkReviewCategoryMapping);
|
||||
}
|
||||
//PropertyReviewCategoryMapping
|
||||
|
||||
|
||||
//PropertyReviewKeywordMapping
|
||||
if (is_array($propertyReviewAnalyze['data']['keywords'])) {
|
||||
$this->info(date('Y-m-d H:i:s') . ': Property Review Keyword Mapping: ' . $propertyReview['property']['name'] . ' - ' . $propertyReview['channel']['name']);
|
||||
$bulkReviewKeywordMapping = [];
|
||||
PropertyReviewKeywordMapping::where('review_id', $propertyReview['id'])->delete();
|
||||
foreach ($propertyReviewAnalyze['data']['keywords'] as $keyword => $keywordSentiment) {
|
||||
|
||||
$bulkReviewKeywordMapping[] = [
|
||||
'review_id' => $propertyReview['id'],
|
||||
'property_id' => $propertyReview['property_id'],
|
||||
'channel_id' => $propertyReview['channel_id'],
|
||||
'keyword' => $keyword,
|
||||
'sentiment' => $keywordSentiment,
|
||||
'review_date' => $propertyReview['review_date'],
|
||||
'status' => 1,
|
||||
'created_at' => time(),
|
||||
'updated_at' => time(),
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
if (!empty($bulkReviewKeywordMapping)) {
|
||||
PropertyReviewKeywordMapping::insert($bulkReviewKeywordMapping);
|
||||
}
|
||||
}
|
||||
//PropertyReviewKeywordMapping
|
||||
|
||||
|
||||
//throw new Exception('Booking Room could not be made');
|
||||
|
||||
$transactionSave = true;
|
||||
|
||||
|
||||
} catch (Exception $e) {
|
||||
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
|
||||
Log::error($message);
|
||||
$transactionSave = false;
|
||||
}
|
||||
|
||||
if ($transactionSave) {
|
||||
DB::commit();
|
||||
} else {
|
||||
DB::rollBack();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$this->info(date('Y-m-d H:i:s') . ' FINISHED');
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands\PropertyReviewService;
|
||||
|
||||
use App\Exceptions\ApiErrorException;
|
||||
use App\Jobs\PropertyReviewServiceJob;
|
||||
use App\Models\PropertyReviewChannelMapping;
|
||||
use Carbon\Carbon;
|
||||
use Google\Protobuf\Api;
|
||||
use GuzzleHttp\Client;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Mail\Mailer;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use Illuminate\Support\Facades\Config;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Str;
|
||||
use Exception;
|
||||
|
||||
class PropertyReviewScheduleService extends Command
|
||||
{
|
||||
protected $signature = 'cron:property-review-schedule-service';
|
||||
|
||||
protected $description = '';
|
||||
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
public function handle()
|
||||
{
|
||||
|
||||
$this->info(date('Y-m-d H:i:s') . ' START');
|
||||
|
||||
|
||||
$propertyReviewChannelMapping = PropertyReviewChannelMapping::where('status', 1)
|
||||
->with('channel')
|
||||
->with('property')
|
||||
->get();
|
||||
|
||||
$propertyReviewChannelMapping = $propertyReviewChannelMapping ? $propertyReviewChannelMapping->toArray() : null;
|
||||
|
||||
foreach ($propertyReviewChannelMapping as $propertyReview) {
|
||||
|
||||
if (Carbon::createFromTimestamp($propertyReview['created_at'])->dayName != Carbon::now()->dayName) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$this->info(date('Y-m-d H:i:s') . ' Property Review: ' . $propertyReview['property']['name'] . ' - ' . $propertyReview['channel']['name']);
|
||||
|
||||
dispatch(new PropertyReviewServiceJob($propertyReview['property_id'], $propertyReview['channel_id']));
|
||||
|
||||
}
|
||||
|
||||
|
||||
$this->info(date('Y-m-d H:i:s') . ' FINISHED');
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,738 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands\PropertyReviewService;
|
||||
|
||||
|
||||
use App\Exceptions\ApiErrorException;
|
||||
use App\Jobs\PropertyReviewAnalyzeServiceJob;
|
||||
use App\Jobs\PropertyReviewServiceJob;
|
||||
use App\Models\PropertyReview;
|
||||
use App\Models\PropertyReviewChannelMapping;
|
||||
use Carbon\Carbon;
|
||||
use Google\Protobuf\Api;
|
||||
use GuzzleHttp\Client;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Mail\Mailer;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use Illuminate\Support\Facades\Config;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Str;
|
||||
use Exception;
|
||||
|
||||
class PropertyReviewService extends Command
|
||||
{
|
||||
protected $signature = 'cron:property-review-service {property_id} {channel_id}';
|
||||
|
||||
protected $description = '';
|
||||
|
||||
protected $maxPageSize = 10;
|
||||
|
||||
protected $xApiKey = 'sk_live_995958e62147c2ae81f6be573daa7c0d0bcedf550ff5dae52315bd05f1272803';
|
||||
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$this->restClient = new Client(['http_errors' => false]);
|
||||
|
||||
}
|
||||
|
||||
protected function requestService($params)
|
||||
{
|
||||
|
||||
try {
|
||||
|
||||
$requestUrl = $params['requestUrl'];
|
||||
$requestParams['headers']['x-api-key'] = $this->xApiKey;
|
||||
$requestParams['headers']['Content-Type'] = 'application/json';
|
||||
|
||||
unset($params['requestUrl']);
|
||||
$requestParams['query'] = $params;
|
||||
|
||||
$result = $this->restClient->request('GET', $requestUrl, $requestParams);
|
||||
|
||||
$getResponseBody = $result->getBody()->getContents();
|
||||
$getResponseData = $getResponseBody ? json_decode($getResponseBody, 1) : [];
|
||||
|
||||
//$getResponseData = json_decode(file_get_contents(storage_path() . '/response.json'), 1);
|
||||
//$getResponseData = json_decode(file_get_contents(storage_path() . '/google.json'), 1);
|
||||
//$getResponseData = json_decode(file_get_contents(storage_path() . '/Tripadvisor.json'), 1);
|
||||
//$getResponseData = json_decode(file_get_contents(storage_path() . '/Tripadvisor.json'), 1);
|
||||
|
||||
if (isset($getResponseData['error'])) {
|
||||
throw new ApiErrorException($getResponseData['detail']);
|
||||
}
|
||||
|
||||
$response['status'] = true;
|
||||
$response['data'] = $getResponseData;
|
||||
|
||||
} catch (Exception $e) {
|
||||
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
|
||||
Log::debug($message);
|
||||
$response['message'] = $e->getMessage();
|
||||
|
||||
dd($response);
|
||||
|
||||
}
|
||||
|
||||
return $response;
|
||||
|
||||
}
|
||||
|
||||
public function handle()
|
||||
{
|
||||
|
||||
$this->info(date('Y-m-d H:i:s') . ' START');
|
||||
|
||||
$propertyReviewChannelMapping = PropertyReviewChannelMapping::where('property_id', $this->argument('property_id'))
|
||||
->where('channel_id', $this->argument('channel_id'))
|
||||
->with('channel')
|
||||
->with('property')
|
||||
->first();
|
||||
|
||||
$propertyReviewChannelMapping = $propertyReviewChannelMapping ? $propertyReviewChannelMapping->toArray() : null;
|
||||
|
||||
Log::debug('Property Review: ' . $propertyReviewChannelMapping['property']['name'] . ' - ' . $propertyReviewChannelMapping['channel']['name']);
|
||||
|
||||
switch ($propertyReviewChannelMapping['channel_id']) {
|
||||
|
||||
//BookingCom
|
||||
case '1':
|
||||
|
||||
$this->info(date('Y-m-d H:i:s') . ' START : ' . $propertyReviewChannelMapping['property']['name'] . ' - ' . $propertyReviewChannelMapping['channel']['name']);
|
||||
|
||||
$maxPageSize = 1;
|
||||
|
||||
if ($propertyReviewChannelMapping['fetch_status'] == 3) {
|
||||
$maxPageSize = $this->maxPageSize;
|
||||
PropertyReviewChannelMapping::where('id', $propertyReviewChannelMapping['id'])->update(['fetch_status' => 2]);
|
||||
}
|
||||
|
||||
|
||||
for ($i = 0; $i < $maxPageSize; $i++) {
|
||||
|
||||
|
||||
$requestParams = [
|
||||
'requestUrl' => 'https://api.stayapi.com/v1/booking/hotel/reviews',
|
||||
'hotel_id' => $propertyReviewChannelMapping['parameterArray']['hotelId'],
|
||||
'sort' => 'newest',
|
||||
'per_page' => 20,
|
||||
'page' => ($i + 1)
|
||||
];
|
||||
|
||||
$requestReview = $this->requestService($requestParams);
|
||||
|
||||
//$bulkReview = [];
|
||||
if ($requestReview['status']) {
|
||||
|
||||
foreach ($requestReview['data']['data']['reviews'] as $review) {
|
||||
|
||||
try {
|
||||
|
||||
if (empty($review['review']['positive']) && empty($review['review']['negative'])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$bulkReview = [
|
||||
'property_id' => $propertyReviewChannelMapping['property_id'],
|
||||
'channel_id' => $propertyReviewChannelMapping['channel_id'],
|
||||
'channel_review_id' => $review['id'],
|
||||
'author' => $review['guest']['name'],
|
||||
'title' => fillOnUndefined($review['review'], 'title'),
|
||||
'review' => $review['review']['positive'] . ' ' . $review['review']['negative'],
|
||||
'review_date' => Carbon::parse($review['reviewed_date'])->toDateTimeString(),
|
||||
'rating' => $review['score'],
|
||||
'top_rating' => 10,
|
||||
'score' => number_format($review['score'] / 10 * 100, 2),
|
||||
'language' => $review['review']['language'],
|
||||
'detail' => json_encode($review),
|
||||
'status' => 1,
|
||||
'created_at' => time(),
|
||||
'updated_at' => time(),
|
||||
];
|
||||
|
||||
$propertyReviewCheck = PropertyReview::where('property_id', $bulkReview['property_id'])
|
||||
->where('channel_id', $bulkReview['channel_id'])
|
||||
->where('channel_review_id', $bulkReview['channel_review_id'])
|
||||
->first();
|
||||
|
||||
if (!$propertyReviewCheck) {
|
||||
$propertyReviewCreate = PropertyReview::create($bulkReview);
|
||||
|
||||
dispatch(new PropertyReviewAnalyzeServiceJob($propertyReviewCreate['id']));
|
||||
|
||||
$this->info(date('Y-m-d H:i:s') . ' - ' . $bulkReview['channel_review_id']);
|
||||
} else {
|
||||
$this->error(date('Y-m-d H:i:s') . ' - ' . $bulkReview['channel_review_id']);
|
||||
}
|
||||
|
||||
|
||||
} catch (Exception $e) {
|
||||
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
|
||||
Log::error($message);
|
||||
|
||||
//dd($message);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
PropertyReviewChannelMapping::where('id', $propertyReviewChannelMapping['id'])->update(['fetch_status' => 1]);
|
||||
|
||||
break;
|
||||
|
||||
//Google
|
||||
case '2':
|
||||
|
||||
$this->info(date('Y-m-d H:i:s') . ' START : ' . $propertyReviewChannelMapping['property']['name'] . ' - ' . $propertyReviewChannelMapping['channel']['name']);
|
||||
|
||||
$maxPageSize = 1;
|
||||
if ($propertyReviewChannelMapping['fetch_status'] == 3) {
|
||||
PropertyReviewChannelMapping::where('id', $propertyReviewChannelMapping['id'])->update(['fetch_status' => 2]);
|
||||
}
|
||||
|
||||
|
||||
for ($i = 0; $i < $maxPageSize; $i++) {
|
||||
|
||||
$requestParams = [
|
||||
'requestUrl' => 'https://api.stayapi.com/v1/google_reviews/reviews-paginated',
|
||||
'data_id' => $propertyReviewChannelMapping['parameterArray']['dataId'],
|
||||
'sort_by' => 'newest',
|
||||
'pages' => 10
|
||||
];
|
||||
|
||||
$requestReview = $this->requestService($requestParams);
|
||||
|
||||
|
||||
if ($requestReview['status']) {
|
||||
|
||||
foreach ($requestReview['data']['reviews'] as $review) {
|
||||
|
||||
if (empty($review['text'])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
$bulkReview = [
|
||||
'property_id' => $propertyReviewChannelMapping['property_id'],
|
||||
'channel_id' => $propertyReviewChannelMapping['channel_id'],
|
||||
'channel_review_id' => $review['review_id'],
|
||||
'author' => $review['reviewer']['name'],
|
||||
'title' => null,
|
||||
'review' => $review['text'],
|
||||
'review_date' => Carbon::parse($review['iso_date'])->toDateTimeString(),
|
||||
'rating' => $review['rating'],
|
||||
'top_rating' => 5,
|
||||
'score' => number_format($review['rating'] / 5 * 100, 2),
|
||||
'language' => null,
|
||||
'detail' => json_encode($review),
|
||||
'status' => 1,
|
||||
'created_at' => time(),
|
||||
'updated_at' => time(),
|
||||
];
|
||||
|
||||
$propertyReviewCheck = PropertyReview::where('property_id', $bulkReview['property_id'])
|
||||
->where('channel_id', $bulkReview['channel_id'])
|
||||
->where('channel_review_id', $bulkReview['channel_review_id'])
|
||||
->first();
|
||||
|
||||
if (!$propertyReviewCheck) {
|
||||
$propertyReviewCreate = PropertyReview::create($bulkReview);
|
||||
|
||||
dispatch(new PropertyReviewAnalyzeServiceJob($propertyReviewCreate['id']));
|
||||
|
||||
$this->info(date('Y-m-d H:i:s') . ' - ' . $bulkReview['channel_review_id']);
|
||||
} else {
|
||||
$this->error(date('Y-m-d H:i:s') . ' - ' . $bulkReview['channel_review_id']);
|
||||
}
|
||||
|
||||
|
||||
} catch (Exception $e) {
|
||||
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
|
||||
Log::error($message);
|
||||
|
||||
//dd($message);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
PropertyReviewChannelMapping::where('id', $propertyReviewChannelMapping['id'])->update(['fetch_status' => 1]);
|
||||
|
||||
break;
|
||||
|
||||
//Tripadvisor
|
||||
case '3':
|
||||
|
||||
$this->info(date('Y-m-d H:i:s') . ' START : ' . $propertyReviewChannelMapping['property']['name'] . ' - ' . $propertyReviewChannelMapping['channel']['name']);
|
||||
|
||||
$maxPageSize = 1;
|
||||
|
||||
if ($propertyReviewChannelMapping['fetch_status'] == 3) {
|
||||
$maxPageSize = $this->maxPageSize;
|
||||
PropertyReviewChannelMapping::where('id', $propertyReviewChannelMapping['id'])->update(['fetch_status' => 2]);
|
||||
}
|
||||
|
||||
|
||||
for ($i = 0; $i < $maxPageSize; $i++) {
|
||||
|
||||
$requestParams = [
|
||||
'requestUrl' => 'https://api.stayapi.com/v1/tripadvisor/hotel/reviews/' . $propertyReviewChannelMapping['parameterArray']['hotelId'],
|
||||
'per_page' => 20,
|
||||
'page' => ($i + 1)
|
||||
];
|
||||
|
||||
$requestReview = $this->requestService($requestParams);
|
||||
|
||||
if ($requestReview['status']) {
|
||||
|
||||
foreach ($requestReview['data']['reviews'] as $review) {
|
||||
|
||||
if (!fillOnUndefined($review, 'text')) {
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
$bulkReview = [
|
||||
'property_id' => $propertyReviewChannelMapping['property_id'],
|
||||
'channel_id' => $propertyReviewChannelMapping['channel_id'],
|
||||
'channel_review_id' => $review['id'],
|
||||
'author' => $review['user']['display_name'],
|
||||
'title' => fillOnUndefined($review, 'title'),
|
||||
'review' => fillOnUndefined($review, 'text'),
|
||||
'review_date' => Carbon::parse($review['created_date'])->toDateTimeString(),
|
||||
'rating' => $review['rating'],
|
||||
'top_rating' => 5,
|
||||
'score' => number_format($review['rating'] / 5 * 100, 2),
|
||||
'language' => fillOnUndefined($review, 'language'),
|
||||
'detail' => json_encode($review),
|
||||
'status' => 1,
|
||||
'created_at' => time(),
|
||||
'updated_at' => time(),
|
||||
];
|
||||
|
||||
$propertyReviewCheck = PropertyReview::where('property_id', $bulkReview['property_id'])
|
||||
->where('channel_id', $bulkReview['channel_id'])
|
||||
->where('channel_review_id', $bulkReview['channel_review_id'])
|
||||
->first();
|
||||
|
||||
if (!$propertyReviewCheck) {
|
||||
$propertyReviewCreate = PropertyReview::create($bulkReview);
|
||||
|
||||
dispatch(new PropertyReviewAnalyzeServiceJob($propertyReviewCreate['id']));
|
||||
|
||||
$this->info(date('Y-m-d H:i:s') . ' - ' . $bulkReview['channel_review_id']);
|
||||
} else {
|
||||
$this->error(date('Y-m-d H:i:s') . ' - ' . $bulkReview['channel_review_id']);
|
||||
}
|
||||
|
||||
|
||||
} catch (Exception $e) {
|
||||
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
|
||||
Log::error($message);
|
||||
|
||||
//dd($message);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
PropertyReviewChannelMapping::where('id', $propertyReviewChannelMapping['id'])->update(['fetch_status' => 1]);
|
||||
|
||||
break;
|
||||
|
||||
//Agoda
|
||||
case '4':
|
||||
|
||||
$this->info(date('Y-m-d H:i:s') . ' START : ' . $propertyReviewChannelMapping['property']['name'] . ' - ' . $propertyReviewChannelMapping['channel']['name']);
|
||||
|
||||
$maxPageSize = 1;
|
||||
|
||||
if ($propertyReviewChannelMapping['fetch_status'] == 3) {
|
||||
$maxPageSize = $this->maxPageSize;
|
||||
PropertyReviewChannelMapping::where('id', $propertyReviewChannelMapping['id'])->update(['fetch_status' => 2]);
|
||||
}
|
||||
|
||||
|
||||
for ($i = 0; $i < $maxPageSize; $i++) {
|
||||
|
||||
$requestParams = [
|
||||
'requestUrl' => 'https://api.stayapi.com/v1/agoda/hotel/reviews/' . $propertyReviewChannelMapping['parameterArray']['hotelId'],
|
||||
'page' => ($i + 1)
|
||||
];
|
||||
|
||||
$requestReview = $this->requestService($requestParams);
|
||||
|
||||
|
||||
if ($requestReview['status']) {
|
||||
|
||||
foreach ($requestReview['data']['reviews'] as $review) {
|
||||
|
||||
if (!fillOnUndefined($review, 'comment')) {
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
$bulkReview = [
|
||||
'property_id' => $propertyReviewChannelMapping['property_id'],
|
||||
'channel_id' => $propertyReviewChannelMapping['channel_id'],
|
||||
'channel_review_id' => $review['review_id'],
|
||||
'author' => null,
|
||||
'title' => fillOnUndefined($review, 'title'),
|
||||
'review' => fillOnUndefined($review, 'comment'),
|
||||
'review_date' => Carbon::parse($review['date'])->toDateTimeString(),
|
||||
'rating' => $review['rating'],
|
||||
'top_rating' => 10,
|
||||
'score' => number_format($review['rating'] / 10 * 100, 2),
|
||||
'language' => fillOnUndefined($review, 'language'),
|
||||
'detail' => json_encode($review),
|
||||
'status' => 1,
|
||||
'created_at' => time(),
|
||||
'updated_at' => time(),
|
||||
];
|
||||
|
||||
$propertyReviewCheck = PropertyReview::where('property_id', $bulkReview['property_id'])
|
||||
->where('channel_id', $bulkReview['channel_id'])
|
||||
->where('channel_review_id', $bulkReview['channel_review_id'])
|
||||
->first();
|
||||
|
||||
if (!$propertyReviewCheck) {
|
||||
$propertyReviewCreate = PropertyReview::create($bulkReview);
|
||||
|
||||
dispatch(new PropertyReviewAnalyzeServiceJob($propertyReviewCreate['id']));
|
||||
|
||||
$this->info(date('Y-m-d H:i:s') . ' - ' . $bulkReview['channel_review_id']);
|
||||
} else {
|
||||
$this->error(date('Y-m-d H:i:s') . ' - ' . $bulkReview['channel_review_id']);
|
||||
}
|
||||
|
||||
|
||||
} catch (Exception $e) {
|
||||
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
|
||||
Log::error($message);
|
||||
|
||||
//dd($message);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
PropertyReviewChannelMapping::where('id', $propertyReviewChannelMapping['id'])->update(['fetch_status' => 1]);
|
||||
|
||||
break;
|
||||
|
||||
//Trip.com
|
||||
case '5':
|
||||
|
||||
$this->info(date('Y-m-d H:i:s') . ' START : ' . $propertyReviewChannelMapping['property']['name'] . ' - ' . $propertyReviewChannelMapping['channel']['name']);
|
||||
|
||||
$maxPageSize = 1;
|
||||
|
||||
if ($propertyReviewChannelMapping['fetch_status'] == 3) {
|
||||
$maxPageSize = $this->maxPageSize;
|
||||
PropertyReviewChannelMapping::where('id', $propertyReviewChannelMapping['id'])->update(['fetch_status' => 2]);
|
||||
}
|
||||
|
||||
|
||||
for ($i = 0; $i < $maxPageSize; $i++) {
|
||||
|
||||
$requestParams = [
|
||||
'requestUrl' => 'https://api.stayapi.com/v1/tripcom/hotel/reviews/' . $propertyReviewChannelMapping['parameterArray']['hotelId'],
|
||||
'page' => ($i + 1),
|
||||
'page_size' => 50
|
||||
];
|
||||
|
||||
$requestReview = $this->requestService($requestParams);
|
||||
|
||||
if ($requestReview['status']) {
|
||||
|
||||
foreach ($requestReview['data']['data']['reviews'] as $review) {
|
||||
|
||||
if (!fillOnUndefined($review, 'text')) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* if ($review['source'] != 1) {
|
||||
continue;
|
||||
}*/
|
||||
|
||||
try {
|
||||
|
||||
$bulkReview = [
|
||||
'property_id' => $propertyReviewChannelMapping['property_id'],
|
||||
'channel_id' => $propertyReviewChannelMapping['channel_id'],
|
||||
'channel_review_id' => $review['id'],
|
||||
'author' => isset($review['reviewer_name']) ? $review['reviewer_name'] : null,
|
||||
'title' => fillOnUndefined($review, 'title'),
|
||||
'review' => fillOnUndefined($review, 'text'),
|
||||
'review_date' => Carbon::parse($review['date'])->toDateTimeString(),
|
||||
'rating' => $review['rating'],
|
||||
'top_rating' => 10,
|
||||
'score' => number_format($review['rating'] / 10 * 100, 2),
|
||||
'language' => fillOnUndefined($review, 'language'),
|
||||
'detail' => json_encode($review),
|
||||
'status' => 1,
|
||||
'created_at' => time(),
|
||||
'updated_at' => time(),
|
||||
];
|
||||
|
||||
|
||||
$propertyReviewCheck = PropertyReview::where('property_id', $bulkReview['property_id'])
|
||||
->where('channel_id', $bulkReview['channel_id'])
|
||||
->where('channel_review_id', $bulkReview['channel_review_id'])
|
||||
->first();
|
||||
|
||||
if (!$propertyReviewCheck) {
|
||||
$propertyReviewCreate = PropertyReview::create($bulkReview);
|
||||
|
||||
dispatch(new PropertyReviewAnalyzeServiceJob($propertyReviewCreate['id']));
|
||||
|
||||
$this->info(date('Y-m-d H:i:s') . ' - ' . $bulkReview['channel_review_id']);
|
||||
} else {
|
||||
$this->error(date('Y-m-d H:i:s') . ' - ' . $bulkReview['channel_review_id']);
|
||||
}
|
||||
|
||||
|
||||
} catch (Exception $e) {
|
||||
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
|
||||
Log::error($message);
|
||||
|
||||
//dd($message);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
PropertyReviewChannelMapping::where('id', $propertyReviewChannelMapping['id'])->update(['fetch_status' => 1]);
|
||||
|
||||
break;
|
||||
|
||||
//Expedia.com
|
||||
case '6':
|
||||
|
||||
$this->info(date('Y-m-d H:i:s') . ' START : ' . $propertyReviewChannelMapping['property']['name'] . ' - ' . $propertyReviewChannelMapping['channel']['name']);
|
||||
|
||||
$maxPageSize = 1;
|
||||
|
||||
if ($propertyReviewChannelMapping['fetch_status'] == 3) {
|
||||
$maxPageSize = $this->maxPageSize;
|
||||
PropertyReviewChannelMapping::where('id', $propertyReviewChannelMapping['id'])->update(['fetch_status' => 2]);
|
||||
}
|
||||
|
||||
|
||||
for ($i = 0; $i < $maxPageSize; $i++) {
|
||||
|
||||
$requestParams = [
|
||||
'requestUrl' => 'https://api.stayapi.com/v1/expedia/hotel/reviews',
|
||||
'property_id' => $propertyReviewChannelMapping['parameterArray']['hotelId'],
|
||||
'page' => $i,
|
||||
'page_size' => 5
|
||||
];
|
||||
|
||||
$requestReview = $this->requestService($requestParams);
|
||||
|
||||
if ($requestReview['status']) {
|
||||
|
||||
foreach ($requestReview['data']['reviews'] as $review) {
|
||||
|
||||
if (!fillOnUndefined($review, 'text')) {
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
preg_match('/(\d+)\s*\/\s*(\d+)/', $review['rating'], $matches);
|
||||
|
||||
$bulkReview = [
|
||||
'property_id' => $propertyReviewChannelMapping['property_id'],
|
||||
'channel_id' => $propertyReviewChannelMapping['channel_id'],
|
||||
'channel_review_id' => $review['id'],
|
||||
'author' => isset($review['reviewer_name']) ? $review['reviewer_name'] : null,
|
||||
'title' => fillOnUndefined($review, 'title'),
|
||||
'review' => fillOnUndefined($review, 'text'),
|
||||
'review_date' => Carbon::parse($review['review_date'])->toDateTimeString(),
|
||||
'rating' => (int)$matches[1],
|
||||
'top_rating' => 10,
|
||||
'score' => number_format((int)$matches[1] / 10 * 100, 2),
|
||||
'language' => fillOnUndefined($review, 'language'),
|
||||
'detail' => json_encode($review),
|
||||
'status' => 1,
|
||||
'created_at' => time(),
|
||||
'updated_at' => time(),
|
||||
];
|
||||
|
||||
|
||||
$propertyReviewCheck = PropertyReview::where('property_id', $bulkReview['property_id'])
|
||||
->where('channel_id', $bulkReview['channel_id'])
|
||||
->where('channel_review_id', $bulkReview['channel_review_id'])
|
||||
->first();
|
||||
|
||||
if (!$propertyReviewCheck) {
|
||||
$propertyReviewCreate = PropertyReview::create($bulkReview);
|
||||
|
||||
dispatch(new PropertyReviewAnalyzeServiceJob($propertyReviewCreate['id']));
|
||||
|
||||
$this->info(date('Y-m-d H:i:s') . ' - ' . $bulkReview['channel_review_id']);
|
||||
} else {
|
||||
$this->error(date('Y-m-d H:i:s') . ' - ' . $bulkReview['channel_review_id']);
|
||||
}
|
||||
|
||||
|
||||
} catch (Exception $e) {
|
||||
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
|
||||
Log::error($message);
|
||||
|
||||
//dd($message);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
PropertyReviewChannelMapping::where('id', $propertyReviewChannelMapping['id'])->update(['fetch_status' => 1]);
|
||||
|
||||
break;
|
||||
|
||||
//HolidayCheck
|
||||
case '7':
|
||||
|
||||
$this->info(date('Y-m-d H:i:s') . ' START : ' . $propertyReviewChannelMapping['property']['name'] . ' - ' . $propertyReviewChannelMapping['channel']['name']);
|
||||
|
||||
$maxPageSize = 1;
|
||||
|
||||
if ($propertyReviewChannelMapping['fetch_status'] == 3) {
|
||||
$maxPageSize = $this->maxPageSize;
|
||||
PropertyReviewChannelMapping::where('id', $propertyReviewChannelMapping['id'])->update(['fetch_status' => 2]);
|
||||
}
|
||||
|
||||
|
||||
for ($i = 0; $i < $maxPageSize; $i++) {
|
||||
|
||||
$hotelId = $propertyReviewChannelMapping['parameterArray']['hotelId'];
|
||||
$limit = 10;
|
||||
$offset = $i * $limit;
|
||||
|
||||
$requestParams = [
|
||||
'requestUrl' => "https://www.holidaycheck.de/api/hotel-reviews;filter=hotel.id:{$hotelId};limit={$limit};offset={$offset};select=id,user,title,texts,textAdvice,hotel,travelDate,recommendation,ratings,ranking,proofedReservation,ownerComment,additional,entryDate;sort=entryDate:desc",
|
||||
];
|
||||
|
||||
$requestReview = $this->requestService($requestParams);
|
||||
|
||||
if ($requestReview['status']) {
|
||||
|
||||
$reviews = isset($requestReview['data']['data']['items']) ? $requestReview['data']['data']['items'] : [];
|
||||
|
||||
foreach ($reviews as $review) {
|
||||
|
||||
$reviewText = fillOnUndefined($review, 'textAdvice');
|
||||
if (empty($reviewText)) {
|
||||
$reviewText = fillOnUndefined($review, 'texts.GENERAL');
|
||||
}
|
||||
|
||||
if (empty($reviewText)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
$rating = fillOnUndefined($review, 'ratings.GENERAL.GENERAL');
|
||||
|
||||
$author = fillOnUndefined($review, 'user.firstName');
|
||||
if (empty($author)) {
|
||||
$author = fillOnUndefined($review, 'user.name');
|
||||
}
|
||||
|
||||
$bulkReview = [
|
||||
'property_id' => $propertyReviewChannelMapping['property_id'],
|
||||
'channel_id' => $propertyReviewChannelMapping['channel_id'],
|
||||
'channel_review_id' => fillOnUndefined($review, 'id'),
|
||||
'author' => $author,
|
||||
'title' => fillOnUndefined($review, 'title'),
|
||||
'review' => $reviewText,
|
||||
'review_date' => Carbon::createFromTimestampMs(fillOnUndefined($review, 'entryDate'))->toDateTimeString(),
|
||||
'rating' => $rating,
|
||||
'top_rating' => 6,
|
||||
'score' => number_format($rating / 6 * 100, 2),
|
||||
'language' => fillOnUndefined($review, 'originalLocale'),
|
||||
'detail' => json_encode($review),
|
||||
'status' => 1,
|
||||
'created_at' => time(),
|
||||
'updated_at' => time(),
|
||||
];
|
||||
|
||||
$propertyReviewCheck = PropertyReview::where('property_id', $bulkReview['property_id'])
|
||||
->where('channel_id', $bulkReview['channel_id'])
|
||||
->where('channel_review_id', $bulkReview['channel_review_id'])
|
||||
->first();
|
||||
|
||||
if (!$propertyReviewCheck) {
|
||||
$propertyReviewCreate = PropertyReview::create($bulkReview);
|
||||
|
||||
dispatch(new PropertyReviewAnalyzeServiceJob($propertyReviewCreate['id']));
|
||||
|
||||
$this->info(date('Y-m-d H:i:s') . ' - ' . $bulkReview['channel_review_id']);
|
||||
} else {
|
||||
$this->error(date('Y-m-d H:i:s') . ' - ' . $bulkReview['channel_review_id']);
|
||||
}
|
||||
|
||||
|
||||
} catch (Exception $e) {
|
||||
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
|
||||
Log::error($message);
|
||||
|
||||
//dd($message);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
PropertyReviewChannelMapping::where('id', $propertyReviewChannelMapping['id'])->update(['fetch_status' => 1]);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
$this->info(date('Y-m-d H:i:s') . ' FINISHED');
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user