Files
api-extranetwork/app/Console/Commands/ChannelManager/BestAvailableRateSyncService.php
ExtraNetwork e5c4b6aa13 first commit
2026-05-12 17:04:54 +03:00

357 lines
18 KiB
PHP

<?php
namespace App\Console\Commands\ChannelManager;
use App\Core\Mail\LogMail;
use App\Core\Service\ChannelManagerPropertyMappingService;
use App\Core\Service\PropertyBookingEngineService;
use App\Core\Service\PropertyChannelMappingService;
use App\Core\Service\PropertyRoomRateChannelMappingService;
use App\Core\Service\PropertyRoomRatePriceService;
use App\Exceptions\ApiErrorException;
use App\Http\Controllers\BookingEngine\V1\SearchController;
use Carbon\Carbon;
use GuzzleHttp\Client;
use Illuminate\Console\Command;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Mail\Mailer;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class BestAvailableRateSyncService extends Command
{
protected $signature = 'cron:bar-sync-service {--property_id=}';
protected $description = '';
protected $mailer;
public function __construct(
Mailer $mailer,
ChannelManagerPropertyMappingService $channelManagerPropertyMappingService,
PropertyRoomRateChannelMappingService $propertyRoomRateChannelMappingService,
PropertyBookingEngineService $propertyBookingEngineService,
PropertyRoomRatePriceService $propertyRoomRatePriceService
)
{
parent::__construct();
$this->mailer = $mailer;
$this->channelManagerPropertyMappingService = $channelManagerPropertyMappingService;
$this->propertyRoomRateChannelMappingService = $propertyRoomRateChannelMappingService;
$this->propertyBookingEngineService = $propertyBookingEngineService;
$this->propertyRoomRatePriceService = $propertyRoomRatePriceService;
}
public function handle()
{
$this->info(date('Y-m-d H:i:s') . ' : Start');
$requestParam =
[
'criteria' =>
[
['field' => 'status', 'condition' => '=', 'value' => 1],
['field' => 'channel_manager_id', 'condition' => '=', 'value' => 2],//Channex
['field' => 'channel_manager_property_id', 'condition' => '!=', 'value' => null],
],
'with' => ['property']
];
$howManyDays = 90;
if (!is_null($this->option('property_id'))) {
$requestParam['criteria'][] = ['field' => 'property_id', 'condition' => '=', 'value' => $this->option('property_id')];
$howManyDays = 6 * 30;
}
$channelManagerPropertyMapping = $this->channelManagerPropertyMappingService->select($requestParam);
$channelManagerPropertyMapping = $channelManagerPropertyMapping['status'] == 'success' ? $channelManagerPropertyMapping['data'] : [];
foreach ($channelManagerPropertyMapping as $propertyMapping) {
if ($propertyMapping['property']['status'] != 1) {
$this->error(date('Y-m-d H:i:s') . ' : ' . $propertyMapping['property']['name']);
continue;
}
$response = ['status' => false, 'message' => ''];
try {
$propertyRoomRateChannelMappingParam = [
'criteria' => [
['field' => 'channel_id', 'condition' => '=', 'value' => 5],//Kanal Yöentimi
['field' => 'property_id', 'condition' => '=', 'value' => $propertyMapping['property_id']],
['field' => 'status', 'condition' => '=', 'value' => 1],
],
'with' => [
'propertyRoomRateMapping.propertyRoomRate.propertyRoomRateAccommodation',
'propertyRoomRateMapping.propertyRoom.propertyRoomType',
]
];
$propertyRoomRateChannelMapping = $this->propertyRoomRateChannelMappingService->select($propertyRoomRateChannelMappingParam);
$propertyRoomRateChannelMapping = $propertyRoomRateChannelMapping['status'] == 'success' ? $propertyRoomRateChannelMapping['data'] : [];
$propertyRoomRateChannelMappingCollect = collect($propertyRoomRateChannelMapping);
$propertyBookingEngineParam = [
'criteria' => [
['field' => 'property_id', 'condition' => '=', 'value' => $propertyMapping['property_id']],
['field' => 'channel_id', 'condition' => '=', 'value' => 1],
['field' => 'status', 'condition' => '=', 'value' => 1],
],
'with' => ['channel', 'property.propertyBookingEngineToken'],
'firstRow' => 1
];
$propertyBookingEngine = $this->propertyBookingEngineService->select($propertyBookingEngineParam, ['id', 'property_id', 'channel_id', 'token']);
$propertyBookingEngine = $propertyBookingEngine['status'] == 'success' ? $propertyBookingEngine['data'] : [];
if (empty($propertyBookingEngine)) {
$this->info(date('Y-m-d H:i:s') . ' : None Booking Engine!');
continue;
}
$searchController = App::make("App\Http\Controllers\BookingEngine\V1\SearchController");
$roomRateFormatted = [];
$today = Carbon::now()->startOfDay()->toDateTimeString();
if (!is_null($this->option('property_id'))) {
$today = Carbon::now()->startOfDay()->toDateTimeString();
} else {
//00:00 04:00 08:00 12:00 16:00 20:00
$processHour = (integer)Carbon::now()->format('H');
switch ($processHour) {
case ($processHour >= 0 && $processHour <= 2) :
case ($processHour > 8 && $processHour <= 10):
case ($processHour > 16 && $processHour <= 18):
$today = Carbon::now()->startOfDay()->toDateTimeString();
break;
case ($processHour > 2 && $processHour <= 4) :
case ($processHour > 10 && $processHour <= 12):
case ($processHour > 18 && $processHour <= 20) :
$today = Carbon::now()->startOfDay()->addDays($howManyDays)->toDateTimeString();
break;
case ($processHour > 4 && $processHour <= 6) :
case ($processHour > 12 && $processHour <= 14):
case ($processHour > 20 && $processHour <= 22) :
$today = Carbon::now()->startOfDay()->addDays($howManyDays * 2)->toDateTimeString();
break;
case ($processHour > 6 && $processHour <= 8) :
case ($processHour > 14 && $processHour <= 16):
case ($processHour > 22 && $processHour < 24) :
$today = Carbon::now()->startOfDay()->addDays($howManyDays * 3)->toDateTimeString();
break;
}
}
for ($i = 0; $i < $howManyDays; $i++) {
$checkIn = Carbon::parse($today)->addDays($i)->toDateString();
$checkOut = Carbon::parse($checkIn)->addDay()->toDateString();
$searchRequestJson = [
'date' => [
'checkIn' => $checkIn,
'checkOut' => $checkOut,
],
'rooms' => [
[
'adults' => 2,
'children' => 0,
'age' => [],
]
],
'property' => [],
'ipAddress' => '185.137.215.118',
'isMobile' => null,
'noneCacheSearch' => true,
'min_stay_disabled' => true
];
$requestCreate = Request::create(null, null, [], [], [], [], json_encode($searchRequestJson));
$requestCreate->headers->set('channelId', '1');
$requestCreate->headers->set('bookingEnginePropertyId', $propertyMapping['property_id']);
$requestCreate->headers->set('channelToken', $propertyBookingEngine['channel']['token']);
$requestCreate->headers->set('bookingEngineToken', $propertyBookingEngine['property']['property_booking_engine_token']['token']);
$search = $searchController->search($requestCreate);
$search = json_decode(json_encode($search), 1);
$this->info(date('Y-m-d H:i:s') . ' : ' . $propertyBookingEngine['property']['name'] . ' - ' . $checkIn);
if ($search['original']['status'] == 200) {
if (empty($search['original']['data']['properties'])) {
//Rate Stop or Price 0 Case
foreach ($propertyRoomRateChannelMapping as $roomRateChannelMapping) {
$referenceRoomRateMapping = $propertyRoomRateChannelMappingCollect
->where('property_room_rate_mapping.room_id', $roomRateChannelMapping['property_room_rate_mapping']['room_id'])
->where('property_room_rate_mapping.property_room_rate.name', 'Best Available Rate')->first();
if (!empty($referenceRoomRateMapping)) {
$roomRateKey = '1|' . $referenceRoomRateMapping['property_room_rate_mapping']['room_id'] . '|' . $referenceRoomRateMapping['property_room_rate_mapping']['id'] . '|' . $checkIn;
$roomRateFormatted[$roomRateKey] = [
'setup_type_id' => '1',
'room_id' => $referenceRoomRateMapping['property_room_rate_mapping']['room_id'],
'room_rate_mapping_id' => $referenceRoomRateMapping['property_room_rate_mapping']['id'],
'date' => $checkIn,
'amount' => 0
];
}
}
//Rate Stop or Price 0 Case
$this->info(date('Y-m-d H:i:s') . ' : ' . $propertyBookingEngine['property']['name'] . ' - ' . $checkIn . ' - NONE');
continue;
}
$property = reset($search['original']['data']['properties']);
if (empty($property)) {
$this->info(date('Y-m-d H:i:s') . ' : ' . $propertyBookingEngine['property']['name'] . ' - ' . $checkIn . ' - NONE');
continue;
}
if (!isset($property['availabilities'])) {
$this->info(date('Y-m-d H:i:s') . ' : ' . $propertyBookingEngine['property']['name'] . ' - ' . $checkIn . ' - NONE');
continue;
}
$propertyAvailability = reset($property['availabilities']);
if (empty($propertyAvailability)) {
$this->info(date('Y-m-d H:i:s') . ' : ' . $propertyBookingEngine['property']['name'] . ' - ' . $checkIn . ' - NONE');
continue;
}
/*dd($propertyAvailability['rooms']);
$propertyAvailabilityRoom = reset($propertyAvailability['rooms']);
if (empty($propertyAvailability)) {
$this->info(date('Y-m-d H:i:s') . ' : ' . $propertyBookingEngine['property']['name'] . ' - ' . $checkIn . ' - NONE');
continue;
}
$propertyAvailabilityRoom['rates'] = collect($propertyAvailabilityRoom['rates'])->sortBy('total')->toArray();
*/
foreach ($propertyAvailability['rooms'] as $roomId => $room) {
foreach ($room['rates'] as $roomRateInnerKey => $roomRate) {
/*$propertyAvailabilityRoomRate = reset($propertyAvailabilityRoom['rates']);
if (empty($propertyAvailabilityRoomRate)) {
$this->info(date('Y-m-d H:i:s') . ' : ' . $propertyBookingEngine['property']['name'] . ' - ' . $checkIn . ' - NONE');
continue;
}*/
$propertyAvailabilityRoomRatePrices = reset($roomRate['requestedRoomPrice']);
if (empty($propertyAvailabilityRoomRatePrices)) {
$this->info(date('Y-m-d H:i:s') . ' : ' . $propertyBookingEngine['property']['name'] . ' - ' . $checkIn . ' - NONE');
continue;
}
$propertyAvailabilityRoomRatePrice = reset($propertyAvailabilityRoomRatePrices['prices']);
if (empty($propertyAvailabilityRoomRatePrice)) {
$this->info(date('Y-m-d H:i:s') . ' : ' . $propertyBookingEngine['property']['name'] . ' - ' . $checkIn . ' - NONE');
continue;
}
$this->info(date('Y-m-d H:i:s') . ' : ' . $propertyBookingEngine['property']['id'] . ' - ' . $propertyBookingEngine['property']['name'] . ' - ' . $checkIn . ' - ' . $propertyAvailabilityRoomRatePrice['total']);
$referenceRoomRateMapping = $propertyRoomRateChannelMappingCollect
->where('property_room_rate_mapping.room_id', $roomId)
->where('property_room_rate_mapping.property_room_rate.name', 'Best Available Rate')->first();
if (empty($referenceRoomRateMapping)) {
$this->info(date('Y-m-d H:i:s') . ' : None Best Available Rate! PropertyId: ' . $propertyMapping['property_id'] . ' Room: ' . $room['name']);
continue;
}
/*if($referenceRoomRateMapping['property_room_rate_mapping']['id'] != 6003) {
continue;
}*/
$roomRateKey = '1|' . $referenceRoomRateMapping['property_room_rate_mapping']['room_id'] . '|' . $referenceRoomRateMapping['property_room_rate_mapping']['id'] . '|' . $checkIn;
if (!isset($roomRateFormatted[$roomRateKey])) {
$roomRateFormatted[$roomRateKey] = [
'setup_type_id' => '1',
'room_id' => $referenceRoomRateMapping['property_room_rate_mapping']['room_id'],
'room_rate_mapping_id' => $referenceRoomRateMapping['property_room_rate_mapping']['id'],
'date' => $checkIn,
'amount' => $propertyAvailabilityRoomRatePrice['total']
];
}
if ($propertyAvailabilityRoomRatePrice['total'] < $roomRateFormatted[$roomRateKey]['amount']) {
$roomRateFormatted[$roomRateKey]['amount'] = $propertyAvailabilityRoomRatePrice['total'];
}
}
}
} else {
$this->info(date('Y-m-d H:i:s') . ' : ' . $propertyBookingEngine['property']['name'] . ' - ' . $checkIn . ' - NONE');
}
}
$requestParams = [
'property_id' => $propertyMapping['property_id'],
'channel_id' => 5,
'availability' => [],
'user_id' => 1,
'rates' => $roomRateFormatted
];
$roomRateUpdate = $this->propertyRoomRatePriceService->roomRateUpdate($requestParams);
if ($roomRateUpdate['status'] != 'success') {
throw new ApiErrorException($roomRateUpdate['message']);
}
$response['status'] = true;
$this->info(date('Y-m-d H:i:s') . ' : ' . $propertyBookingEngine['property']['id'] . ' : ' . $propertyBookingEngine['property']['name'] . ' - Today: ' . $today . ' - OK');
Log::debug($propertyBookingEngine['property']['id'] . ' : ' . $propertyBookingEngine['property']['name'] . ' - Today: ' . $today . ' - OK');
} catch (ApiErrorException $e) {
$response['message'] = implode(', ', $e->getMessageArr());
$this->error(date('Y-m-d H:i:s') . ' : ' . $response['message']);
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
}
}
$this->info(date('Y-m-d H:i:s') . ' : Finished');
}
}