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); } }