Files
api-extranetwork/app/Core/Service/PropertyRoomRateChannelMappingService.php
ExtraNetwork e5c4b6aa13 first commit
2026-05-12 17:04:54 +03:00

341 lines
14 KiB
PHP

<?php
namespace App\Core\Service;
use App\Core\Repository\PropertyRoomRateChannelMapping\PropertyRoomRateChannelMappingRepository;
use App\Core\Repository\PropertyChannelMapping\PropertyChannelMappingRepository;
use App\Core\Validator\PropertyRoomRateChannelMapping\PropertyRoomRateChannelMappingAddValidator;
use App\Core\Validator\PropertyRoomRateChannelMapping\PropertyRoomRateChannelMappingUpdateValidator;
use App\Core\Repository\PropertyRoom\PropertyRoomRepository;
use App\Core\Repository\PropertyAvailabilityType\PropertyAvailabilityTypeRepository;
use \App\Core\Service\PropertyChannelMappingService;
use App;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Config;
use Exception;
use App\Exceptions\ApiErrorException;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
class PropertyRoomRateChannelMappingService
{
private $propertyRoomRateChannelMappingRepository;
private $propertyRoomRateChannelMappingAddValidator;
private $propertyRoomRateChannelMappingUpdateValidator;
private $propertyChannelMappingRepository ;
private $propertyRoomRepository;
private $propertyAvailabilityTypeRepository;
private $propertyChannelMappingService;
public function __construct(
PropertyRoomRateChannelMappingRepository $propertyRoomRateChannelMappingRepository,
PropertyChannelMappingRepository $propertyChannelMappingRepository,
PropertyRoomRateChannelMappingUpdateValidator $propertyRoomRateChannelMappingUpdateValidator,
PropertyRoomRateChannelMappingAddValidator $propertyRoomRateChannelMappingAddValidator,
PropertyRoomRepository $propertyRoomRepository,
PropertyAvailabilityTypeRepository $propertyAvailabilityTypeRepository,
PropertyChannelMappingService $propertyChannelMappingService
)
{
$this->propertyRoomRateChannelMappingRepository = $propertyRoomRateChannelMappingRepository;
$this->propertyRoomRateChannelMappingAddValidator = $propertyRoomRateChannelMappingAddValidator;
$this->propertyRoomRateChannelMappingUpdateValidator = $propertyRoomRateChannelMappingUpdateValidator;
$this->propertyChannelMappingRepository = $propertyChannelMappingRepository;
$this->propertyRoomRepository = $propertyRoomRepository ;
$this->propertyAvailabilityTypeRepository = $propertyAvailabilityTypeRepository ;
$this->propertyChannelMappingService = $propertyChannelMappingService ;
}
public function addPropertyRoomRateChannelMapping($params = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
DB::beginTransaction();
$validateData =
[
'room_rate_mapping_id' => fillOnUndefined($params, 'room_rate_mapping_id'),
'channels' => fillOnUndefined($params, 'channels'),
"created_by" => fillOnUndefined($params, "user_id"),
"updated_by" => fillOnUndefined($params, "user_id")
];
$validationResult = $this->propertyRoomRateChannelMappingAddValidator->validate($validateData);
if ($validationResult->errors()->first()) {
$errors = $validationResult->errors()->all();
throw new ApiErrorException($errors);
}
$deleteCriteria = [
'criteria' => [
['field' => 'room_rate_mapping_id', 'condition' => '=', 'value' => $validateData['room_rate_mapping_id']],
]
];
$this->propertyRoomRateChannelMappingRepository->delete($deleteCriteria);
foreach ($validateData["channels"] as $fact){
$insertData = [
'property_id' => $params['property_id'] ,
'room_rate_mapping_id' => $validateData['room_rate_mapping_id'] ,
'channel_id' => $fact,
'status' => 1,
"created_by" => $validateData['created_by'] ,
"updated_by" =>$validateData['updated_by'] ,
];
$userCreateResult = $this->propertyRoomRateChannelMappingRepository->create($insertData);
if ($userCreateResult['status'] != 'success') {
throw new Exception('api-unknown_error');
}
}
$response = [
'status' => true,
'data' => null,
];
DB::commit();
} catch (ApiErrorException $e) {
$response['message'] = implode(', ', $e->getMessageArr());
DB::rollBack();
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
DB::rollBack();
}
return output($response);
}
public function getPropertyRoomRateChannelMapping($params = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$criteria = [
'criteria' => [
['field' => 'status', 'condition' => '=', 'value' => 1],
]
];
$data = $this->propertyRoomRateChannelMappingRepository->findByCriteria($criteria, ['id', 'room_rate_mapping_id', 'channel_id']);
$data = $data ? $data : [];
$rateChannelMapping = [];
foreach ($data as $mapping){
$rateChannelMapping[$mapping['channel_id'].'|'.$mapping['room_rate_mapping_id']] = $mapping ;
}
$criteria = [
'criteria' => [
['field' => 'status', 'condition' => '=', 'value' => 1],
['field' => 'property_id', 'condition' => '=', 'value' => fillOnUndefined($params, 'property_id')],
],
'with' => ['propertyRoomRateMapping.propertyRoomRate']
];
$data = $this->propertyRoomRepository->findByCriteria($criteria, ['id','property_id','name','room_type_id','max_occupancy','max_adult','max_child','exclude_occupancy','room_size','room_size_type', 'room_type_count', 'room_count', 'bathroom_count', 'toilet_count', 'lounge_count', 'max_child_number']);
$roomData = $data ? $data : [];
$channels = [] ;
foreach ($params['channels'] as $channelItem) {
$rooms = [] ;
$channel = $channelItem;
foreach ($roomData as $roomItem) {
$room = $roomItem;
unset($room['property_room_rate_mapping']);
$rates = [] ;
foreach ($roomItem['property_room_rate_mapping'] as $roomRate) {
$rate = $roomRate ;
$checkKey = $channel['id'].'|'.$roomRate['id'];
unset($rate['property_room_rate']) ;
$rate['rate_name'] = $roomRate['property_room_rate']['name'];
$rate['rate_description'] = $roomRate['property_room_rate']['name'];
$rate['min_stay'] = $roomRate['property_room_rate']['min_stay'];
$rate['max_stay'] = $roomRate['property_room_rate']['max_stay'];
$rate['is_selected'] = isset($rateChannelMapping[$checkKey]);
$rates[] = $rate;
}
$room['rates'] = $rates ;
$rooms[] = $room ;
}
$channel['rooms'] = $rooms ;
$channels[] = $channel ;
}
$response = [
'status' => true,
'data' => $channels,
];
} catch (ApiErrorException $e) {
$response['message'] = $e->getMessage();
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
}
return output($response);
}
public function updatePropertyRoomRateChannelMapping($params = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
DB::beginTransaction();
$validateData =
[
'room_rate_channel_mapping' => fillOnUndefined($params, 'room_rate_channel_mapping'),
"created_by" => fillOnUndefined($params, "user_id"),
"updated_by" => fillOnUndefined($params, "user_id")
];
$validationResult = $this->propertyRoomRateChannelMappingUpdateValidator->validate($validateData);
if ($validationResult->errors()->first()) {
$errors = $validationResult->errors()->all();
throw new ApiErrorException($errors);
}
foreach ($params['room_rate_channel_mapping'] as $mapping) {
$hasDate = isset($mapping['has_date']) ? $mapping['has_date'] : 0 ;
$startDate = isset($mapping['start_date']) ? $mapping['start_date'] : null ;
$endDate = isset($mapping['end_date']) ? $mapping['end_date'] : null ;
$checkData = [
['field' => 'property_id', 'condition' => '=', 'value' => $params['property_id']],
['field' => 'channel_id', 'condition' => '=', 'value' => $mapping['channel_id']],
['field' => 'room_rate_mapping_id', 'condition' => '=', 'value' => $mapping['room_rate_mapping_id']],
];
$checkParams = [
'property_id' => $params['property_id'],
'channel_id' => $mapping['channel_id'],
] ;
$checkMappingStatus =$this->propertyChannelMappingService->checkPropertyChannelMapping($checkParams);
if ($checkMappingStatus['status'] != 'success') {
return Exception('api-unknown_error');
}
if($mapping['is_selected'] == true){
$addData = [
'property_id' => $params['property_id'] ,
'room_rate_mapping_id' => $mapping['room_rate_mapping_id'] ,
'channel_id' => $mapping['channel_id'] ,
'has_date' => $hasDate ,
'start_date' => $startDate ,
'end_date' => $endDate ,
'status' => 1,
"created_by" => $validateData['created_by'],
"updated_by" =>$validateData['updated_by'],
'created_at' => Carbon::now()->timestamp,
'updated_at' => Carbon::now()->timestamp,
];
$createStatus = $this->propertyRoomRateChannelMappingRepository->updateOrCreate($checkData, $addData );
if ($createStatus['status'] != 'success') {
throw new Exception('api-unknown_error');
}
}else {
$softDeleteData = [
'status' => 0,
'has_date' => $hasDate ,
'start_date' => $startDate ,
'end_date' => $endDate ,
"updated_by" =>$validateData['updated_by'],
'updated_at' => Carbon::now()->timestamp,
];
$deleteCriteria = ['criteria' => $checkData ];
$softDelete = $this->propertyRoomRateChannelMappingRepository->updateWhere($deleteCriteria, $softDeleteData );
if ($softDelete['status'] != 'success') {
throw new Exception('api-unknown_error');
}
}
}
$response = [
'status' => true,
'data' => null,
];
DB::commit();
} catch (ApiErrorException $e) {
$response['message'] = implode(', ', $e->getMessageArr());
DB::rollBack();
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
DB::rollBack();
}
return output($response);
}
public function select($param = [], $column = ['*'])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$data = $this->propertyRoomRateChannelMappingRepository->findByCriteria($param, $column);
$response['status'] = 1;
$response['data'] = $data;
} catch (ApiErrorException $e) {
$response['status'] = 0;
$response['message'] = implode(', ', $e->getMessageArr());
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
}
return output($response);
}
public function selectChannelAvailabilityType($param = [], $column = ['*'])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$data = $this->propertyAvailabilityTypeRepository->findByCriteria($param, $column);
$response['status'] = 1;
$response['data'] = $data;
} catch (ApiErrorException $e) {
$response['status'] = 0;
$response['message'] = implode(', ', $e->getMessageArr());
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
}
return output($response);
}
}