request = $request; $this->propertyService = $propertyService; $this->propertyTypeService = $propertyTypeService; $this->propertyChainService = $propertyChainService; $this->userPropertyMappingService = $userPropertyMappingService; $this->permissionService = $permissionService; $this->propertyConfigService = $propertyConfigService; $this->siteConfigService = $siteConfigService; $this->countryService = $countryService; $this->generalTimezoneService = $generalTimezoneService; $this->propertyNetworkService = $propertyNetworkService; $this->productService = $productService; $this->dashboardPlusService = $dashboardPlusService; } public function listProperty(Request $request) { $response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500]; try { if (is_null($request->getContent())) { throw new ApiErrorException(lang('Parameter Error.')); } $params = $request->params; $requestParams = [ 'locale' => fillOnUndefined($params, 'locale'), 'user_id' => $request->credentials->user_id, ]; $property = $this->propertyService->getPropertyList($requestParams); if ($property['status'] != 'success') { throw new Exception($property['message']); } $response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $property['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 apiResponse($response['status'], $response['message'], $response['data'], $response['statusCode']); } public function getProperty(Request $request) { $response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500]; try { $return = []; if (is_null($request->getContent())) { throw new ApiErrorException(lang('Parameter Error.')); } $params = $request->params; $requestParams = [ 'locale' => fillOnUndefined($params, 'locale'), 'property_id' => fillOnUndefined($params, 'property_id'), ]; $property = $this->propertyService->getProperty($requestParams); if ($property['status'] != 'success') { throw new Exception($property['message']); } $return['get_property'] = $property['data']['get_property']; $return['minimum_age_policies'] = $property['data']['minimum_age_policies']; $propertyType = $this->propertyTypeService->getPropertyTypes($requestParams); if ($propertyType['status'] != 'success') { throw new ApiErrorException($propertyType['message']); } $return['property_type'] = $propertyType['data']['property_type']; $propertyChains = $this->propertyChainService->getPropertyChains($requestParams); if ($propertyChains['status'] != 'success') { throw new ApiErrorException($propertyChains['message']); } $return['property_chains'] = $propertyChains['data']['property_chains']; $criteria = [ 'criteria' => [ ['field' => 'status', 'condition' => '=', 'value' => 1], ], "orderBy" => [ ["field" => "name", "value" => "ASC"] ] ]; $countries = $this->countryService->getCountryList($criteria); if ($countries['status'] != 'success') { throw new ApiErrorException($countries['message']); } $return['countries'] = $countries['data']; $generalTimeZones = $this->generalTimezoneService->getAllaGeneralTimezone($params); if ($generalTimeZones['status'] != 'success') { throw new ApiErrorException($generalTimeZones['message']); } $return['general_timezone'] = $generalTimeZones['data']; $response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $return]; } 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 apiResponse($response['status'], $response['message'], $response['data'], $response['statusCode']); } public function updateProperty(Request $request) { $response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500]; try { if (is_null($this->request->getContent())) { throw new ApiErrorException(lang('Parameter Error.')); } $params = $this->request->params; $requestParams = [ 'locale' => fillOnUndefined($params, 'locale'), 'property_info' => fillOnUndefined($params, 'property_info'), 'additional_info' => fillOnUndefined($params, 'additional_info'), 'property_language_spoken' => fillOnUndefined($params, 'property_language_spoken'), 'has_locale_name' => fillOnUndefined($params, 'has_locale_name', false), 'property_id' => fillOnUndefined($params, 'property_id'), 'user_id' => $request->credentials->user_id, ]; $property = $this->propertyService->propertyUpdate($requestParams); if ($property['status'] != 'success') { throw new ApiErrorException($property['message']); } $response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $property['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 apiResponse($response['status'], $response['message'], $response['data'], $response['statusCode']); } public function updatePropertyContentCode(Request $request) { $response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500]; try { if (is_null($this->request->getContent())) { throw new ApiErrorException(lang('Parameter Error.')); } $params = $this->request->params; $requestParams = [ 'content_code' => fillOnUndefined($params, 'content_code') ]; $validator = Validator::make($requestParams, ['content_code' => 'nullable|min:5|max:10']); if (!empty($validator->errors()->messages())) { throw new ApiErrorException('The verification code must be a minimum of 5 and a maximum of 10 digits.'); } $property = $this->propertyService->update($params['property_id'], $requestParams); if ($property['status'] != 'success') { throw new ApiErrorException($property['message']); } $response = ['status' => 1, 'statusCode' => 200, 'message' => null, '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 apiResponse($response['status'], $response['message'], $response['data'], $response['statusCode']); } public function userPropertyMenu(Request $request) { $response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 400]; try { $userId = $request->credentials->user_id; $params = $request->params; $mappingPropertiesCriteria = [ 'criteria' => [ ['field' => 'user_id', 'condition' => '=', 'value' => $userId], ], 'with' => ['property'], ]; if (isset($params['property_id'])) { $mappingPropertiesCriteria['criteria'][] = ['field' => 'property_id', 'condition' => '=', 'value' => $params['property_id']]; } $mappingProperties = $this->userPropertyMappingService->select($mappingPropertiesCriteria); if (!$mappingProperties['data']) { throw new ApiErrorException(lang('User Property mapping not found')); } $propertyList = collect($mappingProperties['data'])->map(function ($value) use ($userId, $params) { $menuParams = [ 'user_id' => $userId, 'property_id' => $value['property']['id'], 'locale' => fillOnUndefined($params, 'locale') ]; if (is_array($value['property'])) { return $value['property'] = [ 'id' => $value['property']['id'], 'name' => $value['property']['name'], 'property_menu' => $this->permissionService->getMenuTreeForUser($menuParams) ]; } })->toArray(); $return['property_list'] = $propertyList; $response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $return]; } 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'] = 400; } return apiResponse($response['status'], $response['message'], $response['data'], $response['statusCode']); } public function propertyDashBoard(Request $request) { $response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 400]; try { if (is_null($this->request->getContent())) { throw new ApiErrorException(lang('Parameter Error.')); } $params = $this->request->params; $propertyDashBoardparams = [ 'property_id' => fillOnUndefined($params, 'property_id'), 'user_id' => $request->credentials->user_id, 'locale' => array_shift($request->header()['language']) ]; $propertyRequest = [ 'criteria' => [ ['field' => 'id', 'condition' => '=', 'value' => $params['property_id']], ], 'firstRow' => true ]; $property = $this->propertyService->select($propertyRequest); if ($property['status'] != 'success' || !isset($property['data'])) { throw new ApiErrorException($property['message']); } $property = isset($property['data']) ? $property['data'] : []; $siteConfig = $this->propertyConfigService->propertyDashBoard($propertyDashBoardparams); if ($siteConfig['status'] != 'success') { throw new ApiErrorException($siteConfig['message']); } $return = $siteConfig['data']; $return['hotel_name'] = $property['name']; $siteHints = $this->siteConfigService->siteHints($propertyDashBoardparams); if ($siteHints['status'] != 'success') { throw new ApiErrorException($siteConfig['message']); } $return['site_hints'] = $siteHints['data']; $return['content_code'] = $property['content_code']; $response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $return]; } 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'] = 400; } return apiResponse($response['status'], $response['message'], $response['data'], $response['statusCode']); } public function propertyPabDashBoard(Request $request) { $response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 400]; try { if (is_null($this->request->getContent())) { throw new ApiErrorException(lang('Parameter Error.')); } $params = $this->request->params; $requestData = [ 'property_id' => fillOnUndefined($params, 'property_id') ]; $property = $this->propertyNetworkService->getAllDashboardData($requestData); if ($property['status'] != 'success' || !isset($property['data'])) { throw new ApiErrorException($property['message']); } $property = isset($property['data']) ? $property['data'] : []; /*$return = [ 'hotel_name' => $property['name'], 'room_and_rate' => [ 'room_count' => 16, 'rate_count' => 8 ], 'channels' => [ 'channel_percent' => 25, 'avail_channels' => 48, 'saved_channel' => 12 ], 'reservation' => [ [ 'day' => 'Mon', 'reservation_count' => 16, 'reservation_percent' => 50 ], [ 'day' => 'Tue', 'reservation_count' => 5, 'reservation_percent' => 15 ], [ 'day' => 'Wed', 'reservation_count' => 12, 'reservation_percent' => 30 ], [ 'day' => 'Thu', 'reservation_count' => 15, 'reservation_percent' => 50 ], [ 'day' => 'Fri', 'reservation_count' => 45, 'reservation_percent' => 95 ], [ 'day' => 'Sat', 'reservation_count' => 47, 'reservation_percent' => 97 ], [ 'day' => 'Mon', 'reservation_count' => 49, 'reservation_percent' => 100 ], ], 'for_cast' => [ 'total' => 40, 'popular_channels' => [ [ 'name' => 'Booking.Com', 'cast' => 12, ], [ 'name' => 'Agoda', 'cast' => 13, ], [ 'name' => 'Trivago', 'cast' => 15, ], ] ] ];*/ $response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $property]; } 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'] = 400; } return apiResponse($response['status'], $response['message'], $response['data'], $response['statusCode']); } public function createProperty(Request $request) { $response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500]; try { DB::beginTransaction(); $return = []; if (is_null($request->getContent())) { throw new ApiErrorException(lang('Parameter Error.')); } $userId = $request->credentials->user_id; $propertyInsertData = [ 'name' => __('enw-your_property_name'), 'property_chain' => 1, 'status' => 2, 'created_by' => $userId, 'updated_by' => $userId, 'created_at' => time(), 'updated_at' => time(), ]; $propertyCreate = $this->propertyService->create($propertyInsertData); if ($propertyCreate['status'] != 'success') { throw new ApiErrorException($propertyCreate['message']); } $return = $propertyCreate['data']; $userPropertyMappingData = [ 'user_id' => $userId, 'status' => 1, 'property_id' => $propertyCreate['data']['id'], 'created_by' => $userId, 'updated_by' => $userId, 'created_at' => time(), 'updated_at' => time(), ]; $userPropertyMappingCreate = $this->userPropertyMappingService->create($userPropertyMappingData); if ($userPropertyMappingCreate['status'] != 'success') { throw new ApiErrorException($userPropertyMappingCreate['message']); } $propertyProducts = $this->productService->setDefaultPropertyProducts($userPropertyMappingData); if ($propertyProducts['status'] != 'success') { throw new ApiErrorException($propertyProducts['message']); } $response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $return]; DB::commit(); } catch (ApiErrorException $e) { $response['message'] = implode(', ', $e->getMessageArr()); $response['statusCode'] = 400; DB::rollBack(); } catch (Exception $e) { $message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage(); Log::error($message); $response['message'] = $e->getMessage(); $response['statusCode'] = 500; DB::rollBack(); } return apiResponse($response['status'], $response['message'], $response['data'], $response['statusCode']); } /* * Dashboard Plus */ public function propertyDashBoardPlus(Request $request) { $response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 400]; try { if (is_null($this->request->getContent())) { throw new ApiErrorException(lang('Parameter Error.')); } $params = $this->request->params; $params['user_id'] = $request->credentials->user_id; //Date Check $diffInDays = Carbon::parse($params['start_date'])->diffInDays(Carbon::parse($params['finish_date'])); if ($diffInDays > 180) { throw new ApiErrorException('A maximum of 180 days of data can be retrieved.'); } if (Carbon::parse($params['finish_date'])->isBefore(Carbon::parse($params['start_date']))) { throw new ApiErrorException('The finish date cannot be earlier than the start date.'); } $propertyCriteria = [ 'criteria' => [ ['field' => 'id', 'condition' => '=', 'value' => $params['property_id']], ], 'firstRow' => true ]; $property = $this->propertyService->select($propertyCriteria); if ($property['status'] != 'success' || !isset($property['data'])) { throw new ApiErrorException($property['message']); } $property = isset($property['data']) ? $property['data'] : []; $dashBoardParam = [ 'property_id' => $params['property_id'], 'start_date' => fillOnUndefined($params, 'start_date', Carbon::now()->subYear()->toDateString()), 'finish_date' => fillOnUndefined($params, 'finish_date', Carbon::now()->subDay()->toDateString()), ]; $todayCheckin = $this->dashboardPlusService->todayCheckin($dashBoardParam); $todayCheckin = $todayCheckin['status'] ? $todayCheckin['data'] : 0; $todayCheckout = $this->dashboardPlusService->todayCheckout($dashBoardParam); $todayCheckout = $todayCheckout['status'] ? $todayCheckout['data'] : 0; $lengthOfStay = $this->dashboardPlusService->lengthOfStay($dashBoardParam); $lengthOfStay = $lengthOfStay['status'] ? $lengthOfStay['data'] : 0; $lengthOfBooking = $this->dashboardPlusService->lengthOfBooking($dashBoardParam); $lengthOfBooking = $lengthOfBooking['status'] ? $lengthOfBooking['data'] : 0; $totalBooking = $this->dashboardPlusService->totalBooking($dashBoardParam); $totalBooking = $totalBooking['status'] ? $totalBooking['data'] : []; $averageDailyRate = $this->dashboardPlusService->averageDailyRate($dashBoardParam); $averageDailyRate = $averageDailyRate['status'] ? $averageDailyRate['data'] : []; $totalPax = $this->dashboardPlusService->totalPax($dashBoardParam); $totalPax = $totalPax['status'] ? $totalPax['data'] : []; $responseData = [ 'propertyId' => $property['id'], 'propertyName' => $property['name'], 'todayCheckin' => $todayCheckin, 'todayCheckout' => $todayCheckout, 'lengthOfStay' => $lengthOfStay, 'lengthOfBooking' => $lengthOfBooking, 'totalBooking' => $totalBooking, 'totalPax' => $totalPax, 'averageDailyRate' => $averageDailyRate, ]; $response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $responseData]; } 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'] = 400; } return apiResponse($response['status'], $response['message'], $response['data'], $response['statusCode']); } public function propertyDashBoardPlusWebVisitor(Request $request) { $response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 400]; try { if (is_null($this->request->getContent())) { throw new ApiErrorException(lang('Parameter Error.')); } $params = $this->request->params; $params['user_id'] = $request->credentials->user_id; //Date Check $diffInDays = Carbon::parse($params['start_date'])->diffInDays(Carbon::parse($params['finish_date'])); if ($diffInDays > 180) { throw new ApiErrorException('A maximum of 180 days of data can be retrieved.'); } if (Carbon::parse($params['finish_date'])->isBefore(Carbon::parse($params['start_date']))) { throw new ApiErrorException('The finish date cannot be earlier than the start date.'); } $webVisitorParam = [ 'property_id' => $params['property_id'], 'start_date' => fillOnUndefined($params, 'start_date', Carbon::now()->subYear()->toDateString()), 'finish_date' => fillOnUndefined($params, 'finish_date', Carbon::now()->subDay()->toDateString()), ]; $webVisitor = $this->dashboardPlusService->webVisitor($webVisitorParam); if (!$webVisitor['status']) { throw new ApiErrorException($webVisitor['message']); } $responseData = $webVisitor['data']; $response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $responseData]; } 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'] = 400; } return apiResponse($response['status'], $response['message'], $response['data'], $response['statusCode']); } public function propertyDashBoardPlusGuestDemographic(Request $request) { $response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 400]; try { if (is_null($this->request->getContent())) { throw new ApiErrorException(lang('Parameter Error.')); } $params = $this->request->params; $params['user_id'] = $request->credentials->user_id; //Date Check $diffInDays = Carbon::parse($params['start_date'])->diffInDays(Carbon::parse($params['finish_date'])); if ($diffInDays > 180) { throw new ApiErrorException('A maximum of 180 days of data can be retrieved.'); } if (Carbon::parse($params['finish_date'])->isBefore(Carbon::parse($params['start_date']))) { throw new ApiErrorException('The finish date cannot be earlier than the start date.'); } $webVisitorParam = [ 'property_id' => $params['property_id'], 'start_date' => fillOnUndefined($params, 'start_date', Carbon::now()->subYear()->toDateString()), 'finish_date' => fillOnUndefined($params, 'finish_date', Carbon::now()->subDay()->toDateString()), ]; $webVisitor = $this->dashboardPlusService->guestDemographic($webVisitorParam); if (!$webVisitor['status']) { throw new ApiErrorException($webVisitor['message']); } $responseData = $webVisitor['data']; $response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $responseData]; } 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'] = 400; } return apiResponse($response['status'], $response['message'], $response['data'], $response['statusCode']); } public function propertyDashBoardPlusTopChannel(Request $request) { $response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 400]; try { if (is_null($this->request->getContent())) { throw new ApiErrorException(lang('Parameter Error.')); } $params = $this->request->params; $params['user_id'] = $request->credentials->user_id; //Date Check $diffInDays = Carbon::parse($params['start_date'])->diffInDays(Carbon::parse($params['finish_date'])); if ($diffInDays > 180) { throw new ApiErrorException('A maximum of 180 days of data can be retrieved.'); } if (Carbon::parse($params['finish_date'])->isBefore(Carbon::parse($params['start_date']))) { throw new ApiErrorException('The finish date cannot be earlier than the start date.'); } $topChannelParam = [ 'property_id' => $params['property_id'], 'start_date' => fillOnUndefined($params, 'start_date', Carbon::now()->subYear()->toDateString()), 'finish_date' => fillOnUndefined($params, 'finish_date', Carbon::now()->subDay()->toDateString()), ]; $webVisitor = $this->dashboardPlusService->topChannel($topChannelParam); if (!$webVisitor['status']) { throw new ApiErrorException($webVisitor['message']); } $responseData = $webVisitor['data']; $response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $responseData]; } 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'] = 400; } return apiResponse($response['status'], $response['message'], $response['data'], $response['statusCode']); } public function propertyDashBoardPlusChannelForecast(Request $request) { $response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 400]; try { if (is_null($this->request->getContent())) { throw new ApiErrorException(lang('Parameter Error.')); } $params = $this->request->params; $params['user_id'] = $request->credentials->user_id; //Date Check $diffInDays = Carbon::parse($params['start_date'])->diffInDays(Carbon::parse($params['finish_date'])); if ($diffInDays > 180) { throw new ApiErrorException('A maximum of 180 days of data can be retrieved.'); } if (Carbon::parse($params['finish_date'])->isBefore(Carbon::parse($params['start_date']))) { throw new ApiErrorException('The finish date cannot be earlier than the start date.'); } $topChannelParam = [ 'property_id' => $params['property_id'], 'start_date' => fillOnUndefined($params, 'start_date', Carbon::now()->subYear()->toDateString()), 'finish_date' => fillOnUndefined($params, 'finish_date', Carbon::now()->subDay()->toDateString()), ]; $webVisitor = $this->dashboardPlusService->channelForecast($topChannelParam); if (!$webVisitor['status']) { throw new ApiErrorException($webVisitor['message']); } $responseData = $webVisitor['data']; $response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $responseData]; } 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'] = 400; } return apiResponse($response['status'], $response['message'], $response['data'], $response['statusCode']); } public function bookingEngineReport(Request $request) { $response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 400]; try { $reportTypes = [ 'TRS' => 'Transaction Report', 'GTR' => 'Guest Transaction Report', 'DSR' => 'Date Search Report', 'DSS' => 'Date Search Stay Report', 'UCR' => 'User Country Report', 'ULR' => 'User Language Report', ]; if (is_null($this->request->getContent())) { throw new ApiErrorException(lang('Parameter Error.')); } $params = $this->request->params; $params['user_id'] = $request->credentials->user_id; //Date Check $diffInDays = Carbon::parse($params['start_date'])->diffInDays(Carbon::parse($params['finish_date'])); if ($diffInDays > 180) { throw new ApiErrorException('A maximum of 180 days of data can be retrieved.'); } if (Carbon::parse($params['finish_date'])->isBefore(Carbon::parse($params['start_date']))) { throw new ApiErrorException('The finish date cannot be earlier than the start date.'); } if (!in_array(fillOnUndefined($params, 'type'), array_keys($reportTypes))) { throw new ApiErrorException('Undefined report type.'); } $propertyCriteria = [ 'criteria' => [ ['field' => 'id', 'condition' => '=', 'value' => $params['property_id']], ], 'firstRow' => true ]; $property = $this->propertyService->select($propertyCriteria); if ($property['status'] != 'success' || !isset($property['data'])) { throw new ApiErrorException($property['message']); } $property = isset($property['data']) ? $property['data'] : []; $reportType = $params['type']; if($reportType != 'DSS') { $searchData = vwBookingEngineSearch::where('property_id', $property['id']) ->whereBetween('date', [$params['start_date'], $params['finish_date']]) ->get()->toArray(); } $responseData = []; switch ($reportType) { case 'TRS': $responseData['search'] = collect($searchData)->count(); $responseData['roomFound'] = collect($searchData)->where('status', 1)->count(); $responseData['roomNotFound'] = collect($searchData)->where('status', 0)->count(); $responseData['preBooking'] = collect($searchData)->where('status', 2)->count(); $responseData['booking'] = collect($searchData)->where('status', 3)->count(); break; case 'GTR': $occupancyCodes = collect($searchData)->groupBy('pax')->keys()->toArray(); foreach ($occupancyCodes as $occupancyCode) { $responseData[$occupancyCode]['text'] = occupancyCodeFormatted($occupancyCode); $responseData[$occupancyCode]['count'] = collect($searchData)->where('pax', $occupancyCode)->count(); } $responseData = collect($responseData)->sortByDesc('count')->toArray(); break; case 'DSR': //Daily Intensity $dailyIntensity = []; foreach ($searchData as $data) { $checkInDate = $data['checkin_date']; $checkOutDate = $data['checkout_date']; $dateDiff = Carbon::parse($data['checkout_date'])->diffInDays(Carbon::parse($data['checkin_date'])); for ($i = 0; $i < $dateDiff; $i++) { $date = Carbon::parse($checkInDate)->addDays($i)->toDateString(); if (!isset($dailyIntensity[$date])) { $dailyIntensity[$date]['text'] = Carbon::parse($date)->format('d.m.Y'); $dailyIntensity[$date]['search'] = 0; $dailyIntensity[$date]['roomFound'] = 0; $dailyIntensity[$date]['roomNotFound'] = 0; $dailyIntensity[$date]['preBooking'] = 0; $dailyIntensity[$date]['booking'] = 0; } $dailyIntensity[$date]['search']++; $dailyIntensity[$date]['roomFound'] += $data['status'] == 1 ? 1 : 0; $dailyIntensity[$date]['roomNotFound'] += $data['status'] == 0 ? 1 : 0; $dailyIntensity[$date]['preBooking'] += $data['status'] == 2 ? 1 : 0; $dailyIntensity[$date]['booking'] += $data['status'] == 3 ? 1 : 0; } } ksort($dailyIntensity); $responseData = $dailyIntensity; //Daily Intensity break; case 'DSS': //Daily Intensity $searchData = vwBookingEngineSearch::where('property_id', $property['id']) ->where('channel_id', $params['channel_id']) ->whereBetween('checkin_date', [$params['start_date'], $params['finish_date']]) ->orderByDesc('id') ->get()->toArray(); $dailyIntensity = []; foreach ($searchData as $data) { $checkInDate = $data['checkin_date']; $checkOutDate = $data['checkout_date']; $dateDiff = Carbon::parse($data['checkout_date'])->diffInDays(Carbon::parse($data['checkin_date'])); for ($i = 0; $i < $dateDiff; $i++) { $date = Carbon::parse($checkInDate)->addDays($i)->toDateString(); if(!Carbon::parse($date)->betweenIncluded($params['start_date'], $params['finish_date'])) { continue; } if (!isset($dailyIntensity[$date])) { $dailyIntensity[$date]['text'] = Carbon::parse($date)->format('d.m.Y'); $dailyIntensity[$date]['search'] = 0; $dailyIntensity[$date]['roomFound'] = 0; $dailyIntensity[$date]['roomNotFound'] = 0; $dailyIntensity[$date]['preBooking'] = 0; $dailyIntensity[$date]['booking'] = 0; $dailyIntensity[$date]['bookingCode'] = []; } $dailyIntensity[$date]['search']++; $dailyIntensity[$date]['roomFound'] += $data['status'] == 1 ? 1 : 0; $dailyIntensity[$date]['roomNotFound'] += $data['status'] == 0 ? 1 : 0; $dailyIntensity[$date]['preBooking'] += $data['status'] == 2 ? 1 : 0; $dailyIntensity[$date]['booking'] += $data['status'] == 3 ? 1 : 0; if(!empty($data['booking_code'])) { $dailyIntensity[$date]['bookingCode'][] = $data['booking_code']; } } } ksort($dailyIntensity); $responseData = $dailyIntensity; //Daily Intensity break; case 'UCR': $countryList = Country::all()->toArray(); $countryCodes = collect($searchData)->where('country_code', '!=', null)->groupBy('country_code')->keys()->toArray(); foreach ($countryCodes as $countryCode) { $countryText = $countryCode; $countryTextCheck = collect($countryList)->where('country_code', mb_strtoupper($countryCode))->first(); if (!empty($countryTextCheck)) { $countryText = $countryTextCheck['name']; } $responseData[$countryCode]['text'] = $countryText; $responseData[$countryCode]['search'] = collect($searchData)->where('country_code', $countryCode)->count(); $responseData[$countryCode]['roomFound'] = collect($searchData)->where('country_code', $countryCode)->where('status', 1)->count(); $responseData[$countryCode]['roomNotFound'] = collect($searchData)->where('country_code', $countryCode)->where('status', 0)->count(); $responseData[$countryCode]['preBooking'] = collect($searchData)->where('country_code', $countryCode)->where('status', 2)->count(); $responseData[$countryCode]['booking'] = collect($searchData)->where('country_code', $countryCode)->where('status', 3)->count(); } break; case 'ULR': $languageList = Language::all()->toArray(); $languageCodes = collect($searchData)->groupBy('language_code')->keys()->toArray(); foreach ($languageCodes as $languageCode) { $languageText = $languageCode; $languageTextCheck = collect($languageList)->where('code', $languageCode)->first(); if (!empty($languageTextCheck)) { $languageText = $languageTextCheck['name']; } $responseData[$languageCode]['text'] = $languageText; $responseData[$languageCode]['search'] = collect($searchData)->where('language_code', $languageCode)->count(); $responseData[$languageCode]['roomFound'] = collect($searchData)->where('language_code', $languageCode)->where('status', 1)->count(); $responseData[$languageCode]['roomNotFound'] = collect($searchData)->where('language_code', $languageCode)->where('status', 0)->count(); $responseData[$languageCode]['preBooking'] = collect($searchData)->where('language_code', $languageCode)->where('status', 2)->count(); $responseData[$languageCode]['booking'] = collect($searchData)->where('language_code', $languageCode)->where('status', 3)->count(); } $responseData = collect($responseData)->sortByDesc('search')->toArray(); break; case 'default': break; } $response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $responseData]; } 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'] = 400; } return apiResponse($response['status'], $response['message'], $response['data'], $response['statusCode']); } public function couponCodeReport(Request $request) { $response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 400]; try { if (is_null($this->request->getContent())) { throw new ApiErrorException(lang('Parameter Error.')); } $params = $this->request->params; $params['user_id'] = $request->credentials->user_id; //Date Check $diffInDays = Carbon::parse($params['start_date'])->diffInDays(Carbon::parse($params['finish_date'])); if ($diffInDays > 180) { throw new ApiErrorException('A maximum of 180 days of data can be retrieved.'); } if (Carbon::parse($params['finish_date'])->isBefore(Carbon::parse($params['start_date']))) { throw new ApiErrorException('The finish date cannot be earlier than the start date.'); } $propertyCriteria = [ 'criteria' => [ ['field' => 'id', 'condition' => '=', 'value' => $params['property_id']], ], 'firstRow' => true ]; $property = $this->propertyService->select($propertyCriteria); if ($property['status'] != 'success' || !isset($property['data'])) { throw new ApiErrorException($property['message']); } $property = isset($property['data']) ? $property['data'] : []; $startDate = Carbon::parse($params['start_date'])->startOfDay()->toDateTimeString(); $finishDate = Carbon::parse($params['finish_date'])->endOfDay()->toDateTimeString(); $status = fillOnUndefined($params,'status', 1); if (empty(fillOnUndefined($params, 'code'))) { $searchData = vwBookingSummaryAll::where('property_id', $property['id']) ->where('coupon_code', '!=', null) ->where('status', '=', $status) ->whereBetween('time', [$startDate, $finishDate]) ->with('bookingStatus') ->get()->toArray(); } else { $searchData = vwBookingSummaryAll::where('property_id', $property['id']) ->where('coupon_code', $params['code']) ->where('status', '=', $status) ->whereBetween('time', [$startDate, $finishDate]) ->with('bookingStatus') ->get()->toArray(); } $responseData = []; foreach ($searchData as $data) { $responseData[] = [ 'id' => $data['id'], 'transaction_period' => $data['transaction_period'], 'checkout_period' => $data['checkout_period'], 'code' => $data['coupon_code'], 'booking_code' => $data['booking_code'], 'name_surname' => $data['name_surname'], 'checkin_date' => $data['checkin_date'], 'checkout_date' => $data['checkout_date'], 'length_of_stay' => $data['length_of_stay'], 'length_of_booking' => $data['length_of_booking'], 'total' => $data['total'], 'total_formatted' => $data['total_formatted'], 'currency_code' => $data['currency_code'], 'status' => $data['status'], 'status_name' => $data['booking_status']['name'], 'status_language_key' => $data['booking_status']['language_key'], 'time' => $data['time'], 'time_formatted' => Carbon::parse($data['time'])->format('d.m.Y H:i:s') ]; } $response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $responseData]; } 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'] = 400; } return apiResponse($response['status'], $response['message'], $response['data'], $response['statusCode']); } }