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

759 lines
29 KiB
PHP

<?php
namespace App\Core\Service;
use App\Core\Service\LanguageService;
use App\Core\Repository\PropertyFact\PropertyFactRepository;
use App\Core\Repository\PropertyFactMapping\PropertyFactMappingRepository;
use App\Core\Validator\PropertyFact\PropertyFactSearchValidator;
use App\Core\Service\PropertyRoomFactMappingService;
use App\Core\Service\PropertyFactMappingService;
use App\Core\Service\ApplicationCacheService;
use App;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Config;
use Exception;
use App\Exceptions\ApiErrorException;
class PropertyFactService
{
private $languageService;
private $propertyFactRepository;
private $propertyFactMappingService;
private $applicationCacheService;
private $propertyFactMappingRepository;
private $propertyFactSearchValidator;
private $propertyRoomFactMappingService;
public function __construct(
ApplicationCacheService $applicationCacheService,
PropertyFactMappingService $propertyFactMappingService,
PropertyFactRepository $propertyFactRepository,
PropertyFactMappingRepository $propertyFactMappingRepository,
PropertyFactSearchValidator $propertyFactSearchValidator,
PropertyRoomFactMappingService $propertyRoomFactMappingService,
LanguageService $languageService
)
{
$this->applicationCacheService = $applicationCacheService;
$this->propertyFactMappingService = $propertyFactMappingService;
$this->languageService = $languageService;
$this->propertyFactRepository = $propertyFactRepository;
$this->propertyFactMappingRepository = $propertyFactMappingRepository;
$this->propertyFactSearchValidator = $propertyFactSearchValidator;
$this->propertyRoomFactMappingService = $propertyRoomFactMappingService;
}
public function create($param = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$insertData =
[
"property_id" => fillOnUndefined($param, "property_id"),
"Fact_category_id" => fillOnUndefined($param, "Fact_category_id"),
"Fact" => fillOnUndefined($param, "Fact"),
"locale" => fillOnUndefined($param, "locale"),
"status" => fillOnUndefined($param, "status", 0),
"created_by" => fillOnUndefined($param, "created_by"),
"updated_by" => fillOnUndefined($param, "updated_by"),
"created_at" => time(),
"updated_at" => time(),
];
$userCreateResult = $this->propertyFactRepository->create($insertData);
if ($userCreateResult['status'] != 'success') {
throw new Exception('api-unknown_error');
}
$userData = $userCreateResult["data"]->toArray();
$response = [
'status' => true,
'data' => $userData,
];
} catch (ApiErrorException $e) {
$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 select($param = [], $column = ['*'])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$data = $this->propertyFactRepository->findByCriteria($param, $column);
$response = [
'status' => true,
'data' => $data,
];
} 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 getPropertyFact($params = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$requestData = [
'criteria' => [
['field' => 'status', 'condition' => '=', 'value' => 1],
],
'with' => []
];
$fectData = $this->select($requestData);
if ($fectData['status'] != 'success') {
throw new ApiErrorException(lang('Fact data not loaded'));
}
$factCollection = collect($fectData['data']);
$propertyFactMappingRequest = [
'criteria' => [
['field' => 'property_id', 'condition' => '=', 'value' => $params['property_id']],
]
];
$propertyFactMappingData = $this->propertyFactMappingService->select($propertyFactMappingRequest);
if ($propertyFactMappingData['status'] != 'success') {
throw new ApiErrorException(lang('Fact data not loaded'));
}
$propertyFactMappingData = $propertyFactMappingData['data'] ? $propertyFactMappingData['data'] : [];
$propertyFactMapping = [];
foreach ($propertyFactMappingData as $propertyFactItem) {
$propertyFactMapping[$propertyFactItem['fact_id']] = $propertyFactItem;
}
$return = [];
$mainFacts = $factCollection->where('parent_id', '=', null)
->toArray();
$responseFacts = [];
foreach ($mainFacts as $fact) {
$mainFactItem['id'] = $fact['id'];
$mainFactItem['name'] = $fact['name'];
$mainFactItem['language_key'] = $fact['language_key'];
$mainFactItem['title_language_key'] = $fact['title_language_key'];
$mainFactItem['icon'] = $fact['icon'];
if ($fact['type'] == 1) {
$mainFactItem['icon'] = 'far fa-tv-retro';
}
$subCats = $factCollection->where('parent_id', '=', $fact['id'])
->toArray();
array_multisort(
array_column($subCats, 'order_number'), SORT_ASC,
array_column($subCats, 'name'), SORT_ASC,
$subCats
);
$responseSubCats = [];
foreach ($subCats as $subCat) {
$subCatItem['id'] = $subCat['id'];
$subCatItem['name'] = $subCat['name'];
$subCatItem['language_key'] = $subCat['language_key'];
$subCatItem['title_language_key'] = $subCat['title_language_key'];
$subCatItem['icon'] = $subCat['icon'];
$subCatItem['priority'] = $subCat['order_number'];
$subCatItem['parent_id'] = $fact['id'];
if ($subCat['type'] == 1) {
$subCatItem['icon'] = 'far fa-tv-retro';
}
$subFacts = $factCollection->where('parent_id', '=', $subCat['id'])
->toArray();
array_multisort(
array_column($subFacts, 'order_number'), SORT_ASC,
array_column($subFacts, 'name'), SORT_ASC,
$subFacts
);
$responseSubFacts = [];
foreach ($subFacts as $subFact) {
$subFactItem['id'] = $subFact['id'];
$subFactItem['name'] = $subFact['name'];
$subFactItem['language_key'] = $subFact['language_key'];
$subFactItem['title_language_key'] = $subFact['title_language_key'];
$subFactItem['type'] = $subFact['type'];
$subFactItem['icon'] = $subFact['icon'];
$subFactItem['parent_id'] = $subCat['id'];
$checkMappingData = isset($propertyFactMapping[$subFact['id']]) ? $propertyFactMapping[$subFact['id']] : [];
$subFactItem['is_selected'] = $checkMappingData ? true : false;
$subFactItem['mapping_id'] = fillOnUndefined($checkMappingData, 'id');
// Todo Will be typed when 'attributes' is added
// $subFactItem['attributes'] = null;
$subFactItem['description'] = null;
if ($checkMappingData && fillOnUndefined($checkMappingData, 'description')) {
$descriptionLangContents = json_decode($checkMappingData['description'], 1);
if(isset($params['locale'])) {
$params['currentLanguage'] = $params['locale'];
}
if (isset($params['currentLanguage']) && isset($descriptionLangContents[$params['currentLanguage']])) {
$subFactItem['description'] = $descriptionLangContents[$params['currentLanguage']];
}
}
$responseSubFacts[] = $subFactItem;
}
$subCatItem['fact'] = $responseSubFacts;
$responseSubCats[$subCat['id']] = $subCatItem;
}
$mainFactItem['fact_subcategory'] = $responseSubCats;
$return[$fact['id']] = $mainFactItem;
}
$response = [
'status' => true,
'data' => $return,
];
} 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 searchPropertyFact($params = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$validationResult = $this->propertyFactSearchValidator->validate($params);
if ($validationResult->errors()->first()) {
$errors = $validationResult->errors()->all();
throw new ApiErrorException($errors);
}
$propertyFactRequest = [
'criteria' => [
['field' => 'property_id', 'condition' => '=', 'value' => $params['property_id']],
]
];
$propertyFactData = $this->propertyFactMappingRepository->findByCriteria($propertyFactRequest, ['id', 'property_id', 'fact_id']);
$propertyFacts = collect($propertyFactData)->keyBy('fact_id')->keys()->toArray();
if (!$propertyFacts) {
throw new ApiErrorException(lang('Check fact data from your content'));
}
$searchFactRequest = [
'whereIn' => [
['field' => 'id', 'value' => $propertyFacts]
]
];
if ($params['search_term']) {
$searchFactRequest['criteria'][] = ['field' => 'name', 'condition' => 'like', 'value' => '%' . $params['search_term'] . '%'];
}
$searchFactData = $this->propertyFactRepository->findByCriteria($searchFactRequest, ['id', 'name', 'language_key']);
if (!$searchFactData) {
throw new ApiErrorException(lang('Fact data not loaded'));
}
$response = [
'status' => true,
'data' => $searchFactData,
];
} 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 getPropertyRoomFact($params = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$requestData = [
'criteria' => [
['field' => 'status', 'condition' => '=', 'value' => 1],
['field' => 'parent_id', 'condition' => '=', 'value' => 293],
],
'with' => []
];
$factData = $this->select($requestData);
if ($factData['status'] != 'success') {
throw new ApiErrorException(lang('Fact data not loaded'));
}
$subFacts = $factData['data'] ? $factData['data'] : [];
$showRecommended = false;
$propertyRoomFactMappingRequest = [
'criteria' => [
['field' => 'property_id', 'condition' => '=', 'value' => $params['property_id']],
]
];
$propertyRoomFactMappingData = $this->propertyRoomFactMappingService->select($propertyRoomFactMappingRequest);
if ($propertyRoomFactMappingData['status'] != 'success') {
throw new ApiErrorException(lang('Fact data not loaded'));
}
$propertyRoomFactMappingCollection = collect($propertyRoomFactMappingData['data']);
$propertyRoomFactMappingData = $propertyRoomFactMappingData['data'] ? $propertyRoomFactMappingData['data'] : [];
$propertyFactMapping = [];
foreach ($propertyRoomFactMappingData as $mappingItem) {
$propertyFactMapping[$mappingItem['fact_id']] = $mappingItem;
$propertyRoomFactMapping[$mappingItem['room_id'] . '|' . $mappingItem['fact_id']] = $mappingItem;
}
if ($propertyRoomFactMappingData) {
$showRecommended = true;
}
$responseSubFacts = [];
if ($showRecommended) {
$showRecommendedData = $propertyRoomFactMappingCollection
->where('room_id', '=', $params['room_id'])
->first();
if ($showRecommendedData) {
$showRecommended = false;
}
}
foreach ($subFacts as $subFact) {
$subFactItem['id'] = $subFact['id'];
$subFactItem['name'] = $subFact['name'];
$subFactItem['language_key'] = $subFact['language_key'];
$subFactItem['title_language_key'] = $subFact['title_language_key'];
$subFactItem['type'] = $subFact['type'];
if ($subFact['type'] == 1) {
$subFactItem['icon'] = $subFact['icon'];
}
$checkMappingData = isset($propertyRoomFactMapping[$params['room_id'] . '|' . $subFact['id']]) ? $propertyRoomFactMapping[$params['room_id'] . '|' . $subFact['id']] : [];
$checkRecommended = isset($propertyFactMapping[$subFact['id']]) ? $propertyFactMapping[$subFact['id']] : [];
$subFactItem['is_selected'] = $checkMappingData ? true : false;
$subFactItem['is_recommended'] = $checkRecommended ? true : false;
$subFactItem['mapping_id'] = fillOnUndefined($checkMappingData, 'id');
$subFactItem['is_feature'] = fillOnUndefined($checkMappingData, 'is_feature', 0);
$responseSubFacts[] = $subFactItem;
}
if (collect($responseSubFacts)->where('is_recommended', 'true')->count() == 0) {
$showRecommended = false;
}
$response = [
'status' => true,
'data' => [
'get_room_facts' => $responseSubFacts,
'show_recommended' => $showRecommended,
],
];
} 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 getSubCategoryFacts($params = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$requestData = [
'criteria' => [
['field' => 'status', 'condition' => '=', 'value' => 1],
['field' => 'type', 'condition' => '=', 'value' => 1],
['field' => 'parent_id', 'condition' => '=', 'value' => $params['sub_category_id']],
],
'orderBy' => [
["field" => "order_number", "value" => "ASC"],
["field" => "name", "value" => "ASC"],
]
];
$factData = $this->select($requestData);
if ($factData['status'] != 'success') {
throw new ApiErrorException(lang('Fact data not loaded'));
}
$factCollection = collect($factData['data']);
$propertyFactMappingRequest = [
'criteria' => [
['field' => 'property_id', 'condition' => '=', 'value' => $params['property_id']],
]
];
$propertyFactMappingData = $this->propertyFactMappingService->select($propertyFactMappingRequest);
if ($propertyFactMappingData['status'] != 'success') {
throw new ApiErrorException(lang('Fact data not loaded'));
}
$propertyFactMappingData = $propertyFactMappingData['data'] ? $propertyFactMappingData['data'] : [];
$propertyFactMapping = [];
foreach ($propertyFactMappingData as $propertyFactItem) {
$propertyFactMapping[$propertyFactItem['fact_id']] = $propertyFactItem;
}
$getApplicationLanguages = $this->languageService->getApplicationLanguages();
if ($getApplicationLanguages['status'] != 'success') {
throw new ApiErrorException($getApplicationLanguages['message']);
}
$applicationLanguages = $getApplicationLanguages['data'];
$subFacts = $factCollection->toArray();
$responseSubFacts = [];
foreach ($subFacts as $subFact) {
$subFactItem['id'] = $subFact['id'];
$subFactItem['name'] = $subFact['name'];
$subFactItem['language_key'] = $subFact['language_key'];
$subFactItem['title_language_key'] = $subFact['title_language_key'];
$subFactItem['type'] = $subFact['type'];
$subFactItem['icon'] = $subFact['icon'];
$checkMappingData = isset($propertyFactMapping[$subFact['id']]) ? $propertyFactMapping[$subFact['id']] : [];
$subFactItem['is_selected'] = $checkMappingData ? true : false;
$subFactItem['mapping_id'] = fillOnUndefined($checkMappingData, 'id');
$subFactItem['description'] = [];
$descriptionLangContents = $checkMappingData ? json_decode($checkMappingData['description'], 1) : [];
$responseLangDescription = [];
foreach ($applicationLanguages as $applicationLanguage) {
$langKey = $applicationLanguage['code'];
$responseLangDescription[] = [
'language_code' => $langKey,
'description' => isset($descriptionLangContents[$langKey]) ? $descriptionLangContents[$langKey] : null
];
}
$subFactItem['description'] = $responseLangDescription;
$responseSubFacts[] = $subFactItem;
}
$response = [
'status' => true,
'data' => $responseSubFacts,
];
} 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 getSubCategoryMenus($params = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$requestData = [
'criteria' => [
['field' => 'status', 'condition' => '=', 'value' => 1],
['field' => 'type', 'condition' => '=', 'value' => 0],
['field' => 'id', 'condition' => '!=', 'value' => 9], // Accommodation
]
];
$factData = $this->select($requestData);
if ($factData['status'] != 'success') {
throw new ApiErrorException(lang('Fact data not loaded'));
}
$factCollection = collect($factData['data']);
$mainFacts = $factCollection->where('parent_id', '=', null)->sortBy('order_number')->toArray();
$responseSubFacts = [];
$isFoundItem = false;
$nextItem = '/app/content/rooms';
$prevItem = '/app/content/photos';
$isDisable = true;
$foundIndex = -1;
$logData = [];
foreach ($mainFacts as $mainFact) {
$subFacts = $factCollection->where('parent_id', '=', $mainFact['id'])->sortBy('order_number')->toArray();
foreach ($subFacts as $subFact) {
$logData[] = $subFact;
if ($params['parent_id'] == $subFact['parent_id']) {
$subFactItem['id'] = $subFact['id'];
$subFactItem['name'] = $subFact['name'];
$subFactItem['language_key'] = $subFact['language_key'];
$subFactItem['title_language_key'] = $subFact['title_language_key'];
$subFactItem['type'] = $subFact['type'];
$subFactItem['icon'] = $subFact['icon'];
$subFactItem['alias'] = 'Property.Fact.SubCategoryFacts.' . $subFact['id'];
$subFactItem['url'] = '/app/content/facts/' . $subFact['id'];
$subFactItem['is_disable'] = $isDisable;
$responseSubFacts[] = $subFactItem;
}
if ($params['sub_category_id'] == $subFact['id']) {
$isDisable = false;
}
if ($isFoundItem) {
$subFactItem['icon'] = $subFact['icon'];
$foundIndex++;
}
if ($params['sub_category_id'] == $subFact['id']) {
$isFoundItem = true;
$foundIndex = 0;
}
if ($isFoundItem && $foundIndex == 1) {
$nextItem = '/app/content/facts/' . $subFact['id'];
}
if (!$isFoundItem) {
$prevItem = '/app/content/facts/' . $subFact['id'];
}
}
}
$response = [
'status' => true,
'data' => [
'menu' => $responseSubFacts,
'prev' => $prevItem,
'next' => $nextItem,
],
];
} 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 getPropertyOfferFilter($params = [], $offerAllFactIds = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$categories = $params;
$responseArray = [];
$accommodationTypes = [];
foreach ($categories as $category) {
$categoryArray = [];
$categoryItem = $category;
foreach ($category['fact_subcategory'] as $subCategory) {
$subCategoryItem = $subCategory;
if ($subCategory['id'] == 9) {
$facts = collect($subCategory['fact'])->map(function ($value) use ($offerAllFactIds) {
$value['is_selected'] = array_search($value['id'], $offerAllFactIds) > -1;
return $value;
})->values()->all();
$subCategoryItem['fact'] = $facts ? $facts : [];
$accommodationTypes = $subCategoryItem['fact'];
} else {
$facts = collect($subCategory['fact'])->where('is_selected', '=', true)->map(function ($value) use ($offerAllFactIds) {
$value['is_selected'] = array_search($value['id'], $offerAllFactIds) > -1;
return $value;
})->values()->all();
$subCategoryItem['fact'] = $facts ? $facts : [];
$categoryArray[$subCategory['id']] = $subCategoryItem;
}
}
$categoryItem['fact_subcategory'] = $categoryArray;
$responseArray[$category['id']] = $categoryItem;
}
$response = [
'status' => true,
'data' => [
'get_facts' => $responseArray,
'accommodation_types' => $accommodationTypes,
],
];
} 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 getPropertyOfferFilterForHtml($params = [], $offerAllFactIds = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$categories = $params;
$responseArray = [];
foreach ($categories as $category) {
$categoryArray = [];
$categoryItem = $category;
foreach ($category['fact_subcategory'] as $subCategory) {
$subCategoryItem = $subCategory;
$facts = collect($subCategory['fact'])
->where('is_selected', '=', true)
->whereIn('id', $offerAllFactIds)
->map(function ($value) use ($offerAllFactIds) {
return $value;
})->values()->all();
$subCategoryItem['fact'] = $facts ? $facts : [];
if ($facts) {
$categoryArray[$subCategory['id']] = $subCategoryItem;
}
}
$categoryItem['fact_subcategory'] = $categoryArray;
$responseArray[$category['id']] = $categoryItem;
}
$response = [
'status' => true,
'data' => $responseArray,
];
} 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 checkPropertyFactMapping($param = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$request = [
'criteria' => [
['field' => 'property_id', 'condition' => '=', 'value' => $param['property_id']],
],
'whereIn' => [
['field' => 'fact_id', 'value' => $param['fact_ids']],
],
'count' => 1
];
$data = $this->propertyFactMappingRepository->findByCriteria($request);
if ($data < count($param['fact_ids'])) {
throw new ApiErrorException('Property - Fact Mapping not validate.');
}
$response = [
'status' => true,
'data' => $data,
];
} 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);
}
}