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

1485 lines
64 KiB
PHP

<?php
namespace App\Core\Service;
use App\Core\Repository\Offer\OfferRepository;
use App\Core\Validator\Offer\OfferCreateValidator;
use App\Core\Service\OfferRoomMappingService;
use App\Core\Service\OfferImportantNotesService;
use App\Core\Service\OfferFactMappingService;
use App\Core\Service\OfferContactMappingService;
use App\Core\Service\OfferPhotoMappingService;
use App\Core\Service\OfferCancellationPolicyService;
use App\Core\Service\OfferAccommodationMappingService;
use App\Core\Service\OfferPriceService;
use App\Core\Validator\Offer\OfferUpdateValidator;
use App\Core\Validator\Offer\OfferStatusValidator;
use App\Core\Service\PropertyRoomService;
use App\Core\Repository\OfferConfirmType\OfferConfirmTypeRepository;
use App;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Log;
use Exception;
use App\Exceptions\ApiErrorException;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Config;
use Carbon\Carbon;
class OfferService
{
private $offerRepository;
private $offerCreateValidator;
private $offerFactMappingService;
private $offerContactMappingService;
private $offerRoomMappingService;
private $offerImportantNotesService;
private $offerPhotoMappingService;
private $offerCancellationPolicyService;
private $offerAccommodationMappingService;
private $offerPriceService;
private $offerUpdateValidator;
private $offerStatusValidator;
private $propertyRoomService;
public function __construct(
OfferRepository $offerRepository,
OfferConfirmTypeRepository $offerConfirmTypeRepository,
OfferCreateValidator $offerCreateValidator,
OfferFactMappingService $offerFactMappingService,
OfferContactMappingService $offerContactMappingService,
OfferRoomMappingService $offerRoomMappingService,
OfferImportantNotesService $offerImportantNotesService,
OfferPhotoMappingService $offerPhotoMappingService,
OfferCancellationPolicyService $offerCancellationPolicyService,
OfferAccommodationMappingService $offerAccommodationMappingService,
OfferPriceService $offerPriceService,
OfferUpdateValidator $offerUpdateValidator,
PropertyRoomService $propertyRoomService,
OfferStatusValidator $offerStatusValidator
)
{
$this->offerRepository = $offerRepository;
$this->offerConfirmTypeRepository = $offerConfirmTypeRepository;
$this->offerCreateValidator = $offerCreateValidator;
$this->offerFactMappingService = $offerFactMappingService;
$this->offerContactMappingService = $offerContactMappingService;
$this->offerRoomMappingService = $offerRoomMappingService;
$this->offerImportantNotesService = $offerImportantNotesService;
$this->offerPhotoMappingService = $offerPhotoMappingService;
$this->offerCancellationPolicyService = $offerCancellationPolicyService;
$this->offerAccommodationMappingService = $offerAccommodationMappingService;
$this->offerPriceService = $offerPriceService;
$this->offerUpdateValidator = $offerUpdateValidator;
$this->offerStatusValidator = $offerStatusValidator;
$this->propertyRoomService = $propertyRoomService;
}
public function create($param = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$validationResult = $this->offerCreateValidator->validate($param);
if ($validationResult->errors()->first()) {
$errors = $validationResult->errors()->all();
throw new ApiErrorException($errors);
}
$insertData =
[
"property_id" => fillOnUndefined($param, "property_id"),
"ticket_code" => $this->generateTicket(6),
"offer_code" => generateRandomString(16),
"title" => fillOnUndefined($param, "title"),
"email" => fillOnUndefined($param, "email"),
"expire_date" => fillOnUndefined($param, "expire_date"),
"confirm_type" => fillOnUndefined($param, "confirm_type", 'INS'),
"language" => fillOnUndefined($param, "language"),
"currency" => fillOnUndefined($param, "currency"),
"total" => fillOnUndefined($param, "total", 0),
"payment_type_id" => fillOnUndefined($param, "payment_type_id"),
"payment_type_mapping_id" => fillOnUndefined($param, "payment_type_mapping_id"),
"status" => fillOnUndefined($param, "status", 1),
"accept_status" => fillOnUndefined($param, "accept_status", 2),
"created_by" => fillOnUndefined($param, "created_by"),
"updated_by" => fillOnUndefined($param, "updated_by"),
"created_at" => time(),
"updated_at" => time(),
];
$userCreateResult = $this->offerRepository->create($insertData);
if ($userCreateResult['status'] != 'success') {
throw new Exception('api-unknown_error');
}
$userData = $userCreateResult["data"];
$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->offerRepository->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 selectOfferConfirmType($param = [], $column = ['*'])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$data = $this->offerConfirmTypeRepository->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 update($id, $param = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$updateResult = $this->offerRepository->update($id, $param);
if ($updateResult['status'] != 'success') {
throw new Exception('api-unknown_error');
}
$updateData = $updateResult["data"];
$response = [
'status' => true,
'data' => $updateData,
];
} 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 updateOrCreate($criteria = [], $saveData = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$data = $this->offerRepository->updateOrCreate($criteria, $saveData);
if ($data['status'] != 'success') {
throw new Exception('api-unknown_error');
}
$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 addNewOffer($param = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
DB::beginTransaction();
$offerData =
[
"property_id" => fillOnUndefined($param, "property_id"),
"title" => fillOnUndefined($param, "title"),
"email" => fillOnUndefined($param, "email"),
"expire_date" => fillOnUndefined($param, "expire_date"),
"confirm_type" => fillOnUndefined($param, "confirm_type"),
"language" => fillOnUndefined($param, "language"),
"currency" => fillOnUndefined($param, "currency"),
"total" => fillOnUndefined($param, "total"),
"payment_type_id" => fillOnUndefined($param, "payment_type_id"),
"payment_type_mapping_id" => fillOnUndefined($param, "payment_type_mapping_id"),
"status" => fillOnUndefined($param, "status", 1),
"accept_status" => 3, //Pending Customer Confirm
"created_by" => fillOnUndefined($param, "user_id"),
"updated_by" => fillOnUndefined($param, "user_id"),
];
$offerCreateResult = $this->create($offerData);
if ($offerCreateResult['status'] != 'success') {
throw new Exception('api-unknown_error');
}
$offerData = $offerCreateResult["data"];
$offerData = [
'offer_id' => $offerData['id'],
'property_id' => fillOnUndefined($param, "property_id"),
'user_id' => fillOnUndefined($param, "user_id"),
'fact_mapping' => fillOnUndefined($param, 'fact_mapping', []),
'contact_mapping' => fillOnUndefined($param, 'contact_mapping', []),
'room_mapping' => fillOnUndefined($param, 'room_mapping', []),
'important_notes' => fillOnUndefined($param, 'important_notes', []),
'photo_mapping' => fillOnUndefined($param, 'photo_mapping', []),
'cover_photos' => fillOnUndefined($param, 'cover_photos', []),
'has_cancellation_policy' => fillOnUndefined($param, 'has_cancellation_policy', false),
'cancellation_policy' => fillOnUndefined($param, 'cancellation_policy', []),
'accommodation_mapping' => fillOnUndefined($param, 'accommodation_mapping', []),
'hotel_features_mapping' => fillOnUndefined($param, 'hotel_features_mapping', []),
];
$addOfferFactResponse = $this->offerFactMappingService->insertNewOfferFacts($offerData);
if ($addOfferFactResponse['status'] != 'success') {
throw new ApiErrorException($addOfferFactResponse['message']);
}
$offerContactResponse = $this->offerContactMappingService->insertContactMapping($offerData);
if ($offerContactResponse['status'] != 'success') {
throw new ApiErrorException($offerContactResponse['message']);
}
$offerRoomResponse = $this->offerRoomMappingService->insertRoomMapping($offerData);
if ($offerRoomResponse['status'] != 'success') {
throw new ApiErrorException($offerRoomResponse['message']);
}
$offerRoomResponse = $this->offerAccommodationMappingService->insertAccommodationMapping($offerData);
if ($offerRoomResponse['status'] != 'success') {
throw new ApiErrorException($offerRoomResponse['message']);
}
$offerImportantNotesResponse = $this->offerImportantNotesService->insertImportantNotes($offerData, []);
if ($offerImportantNotesResponse['status'] != 'success') {
throw new ApiErrorException($offerImportantNotesResponse['message']);
}
$offerPhotoMapping = $this->offerPhotoMappingService->insertPhotoMapping($offerData);
if ($offerPhotoMapping['status'] != 'success') {
throw new ApiErrorException($offerPhotoMapping['message']);
}
$offerCoverPhotoMapping = $this->offerPhotoMappingService->insertCoverPhotoMapping($offerData);
if ($offerCoverPhotoMapping['status'] != 'success') {
throw new ApiErrorException($offerCoverPhotoMapping['message']);
}
$offerCancellationPolicy = $this->offerCancellationPolicyService->insertCancellationPolicy($offerData, []);
if ($offerCancellationPolicy['status'] != 'success') {
throw new ApiErrorException($offerCancellationPolicy['message']);
}
$response = [
'status' => true,
'data' => $offerCreateResult["data"],
];
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 getPriceList($param = [], $column = ['*'])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$offerRequest = [
'criteria' => [
['field' => 'status', 'condition' => '=', 'value' => 1],
['field' => 'id', 'condition' => '=', 'value' => $param['offer_id']],
['field' => 'property_id', 'condition' => '=', 'value' => $param['property_id']],
],
'with' => ['offerAccommodationMapping.propertyAccommodation', 'offerPrice', 'offerRoomMapping.propertyRoom'],
'firstRow' => 1
];
$columns = [
"id",
"property_id",
"ticket_code",
"offer_code",
"title",
"description",
"expire_date",
"language",
"currency",
"total",
"payment_type_id",
"accept_status",
"status"
];
$offerData = $this->offerRepository->findByCriteria($offerRequest, $columns);
if (!$offerData) {
throw new ApiErrorException('Offer data not found');
}
$offerAccommodationMapping = collect($offerData['offer_accommodation_mapping'])->map(function ($value) {
return $value['property_accommodation'];
})->values()->all();
$offerPrice = $offerData['offer_price'];
$offerRoomMapping = collect($offerData['offer_room_mapping'])->map(function ($value) {
return $value['property_room'];
})->values()->all();
$responseOfferData = [
"id" => $offerData['id'],
"property_id" => $offerData['property_id'],
"ticket_code" => $offerData['ticket_code'],
"offer_code" => $offerData['offer_code'],
"title" => $offerData['title'],
"expire_date" => $offerData['expire_date'],
"language" => $offerData['language'],
"currency" => $offerData['currency'],
"total" => $offerData['total'],
"accept_status" => $offerData['accept_status'],
"status" => $offerData['status'],
];
$priceDataStartDate = collect($offerPrice)->keyBy('date')->keys()->min();
$startDate = Carbon::parse($priceDataStartDate);
$endDate = collect($offerPrice)->keyBy('date')->keys()->max();
$diffInDays = collect($offerPrice)->count() > 0 ? $startDate->diffInDays(Carbon::parse($endDate)) : -1;
$roomArray = [];
$priceArray = [];
foreach ($offerPrice as $price) {
$priceArray[$offerData['id'] . "|" . $price['property_room_id'] . "|" . $price['property_accommodation_id'] . "|" . $price['date']] = $price;
}
foreach ($offerRoomMapping as $room) {
$roomItem = [
'room_id' => $room['id'],
'room_name' => $room['name'],
];
$accommodationArray = [];
foreach ($offerAccommodationMapping as $offerAccommodation) {
$accommodationItem = [
'id' => $offerAccommodation['id'],
'name' => $offerAccommodation['name'],
'language_key' => $offerAccommodation['language_key'],
];
$roomPrice = [];
$startDate = Carbon::parse($priceDataStartDate);
$numberOfRooms = null;
for ($i = 0; $i <= $diffInDays; $i++) {
$checkKey = $offerData['id'] . "|" . $room['id'] . "|" . $offerAccommodation['id'] . "|" . $startDate->format('Y-m-d');
if (isset($priceArray[$checkKey])) {
$roomPrice[$startDate->format('Y-m-d')] = $priceArray[$checkKey]['amount'];
$numberOfRooms = $priceArray[$checkKey]['number_of_rooms'];
} else {
$roomPrice[$startDate->format('Y-m-d')] = null;
}
$startDate = $startDate->addDay();
}
$accommodationItem['number_of_rooms'] = $numberOfRooms;
$accommodationItem['price'] = $roomPrice;
$accommodationArray[] = $accommodationItem;
}
$roomItem['accommodation'] = $accommodationArray;
$roomArray[] = $roomItem;
}
$responseOfferData['room_price'] = $roomArray;
$responseOfferData['start_date'] = $priceDataStartDate;
$responseOfferData['end_Date'] = $endDate;
$response = [
'status' => true,
'data' => $responseOfferData,
];
} 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 getPrice($param = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$offerRequest = [
'criteria' => [
['field' => 'status', 'condition' => '=', 'value' => 1],
['field' => 'id', 'condition' => '=', 'value' => $param['offer_id']],
['field' => 'property_id', 'condition' => '=', 'value' => $param['property_id']],
],
'with' => [
'offerAccommodationMapping.propertyAccommodation',
'offerPrice',
'offerRoomMapping.propertyRoom.propertyRoomType',
'offerRoomMapping.propertyRoom.propertyRoomFactMapping.propertyFact',
'offerRoomMapping.propertyRoom.PropertyRoomPhotoMapping.propertyRoomPhoto',
'offerRoomMapping.propertyRoom.propertyRoomViewMapping.PropertyRoomViewType'
],
'firstRow' => 1
];
$columns = [
"id",
"property_id",
"title",
"description",
"expire_date",
"language",
"currency",
"total",
"payment_type_id",
"accept_status",
"status"
];
$offerData = $this->offerRepository->findByCriteria($offerRequest, $columns);
if (!$offerData) {
throw new ApiErrorException('Offer data not found');
}
if(empty($offerData['offer_price'])) {
throw new ApiErrorException('Offer prices not include');
}
$offerAccommodationMapping = collect($offerData['offer_accommodation_mapping'])->map(function ($value) {
return $value['property_accommodation'];
})->values()->all();
$offerPrice = $offerData['offer_price'];
$offerRoomMapping = collect($offerData['offer_room_mapping'])->map(function ($value) {
return $value['property_room'];
})->values()->all();
$roomArray = [];
$offerPrice = collect($offerPrice);
$sumAmount = 0;
$sumTotalAmount = 0;
foreach ($offerRoomMapping as $room) {
$accommodationArray = [];
$room['property_room_type'] = collect($room['property_room_type'])->first();
$room['exclude_occupancy'] = json_decode($room['exclude_occupancy']);
$occupancyParams = [
'max_adult' => $room['max_adult'],
'max_child' => $room['max_child'],
'max_occupancy' => $room['max_occupancy'],
'exclude_occupancy' => $room['exclude_occupancy'],
];
$room['include_occupancy'] = $this->propertyRoomService->roomIncludeOccupancies($occupancyParams);
$roomFact = collect($room['property_room_fact_mapping'])->map(function ($value) use ($param) {
return collect($value['property_fact']);
})->values()->all();
$room['room_fact'] = $roomFact;
$roomViews = collect($room['property_room_view_mapping'])->map(function ($value) use ($param) {
return collect($value['property_room_view_type']);
})->values()->all();
$room['room_views'] = $roomViews;
$offerRoomMapping = collect($room['property_room_photo_mapping'])->map(function ($value) use ($param) {
$photoUrlFilePath = Config::get('app.fileSystemDriver') . '/property-photos/' . $param['property_id'] . '/' . $value['property_room_photo']['photo_name'] . '_1024x768.' . $value['property_room_photo']['file_ext'];
$photoUrlThumbFilePath = Config::get('app.fileSystemDriver') . '/property-photos/' . $param['property_id'] . '/' . $value['property_room_photo']['photo_name'] . '_200x200.' . $value['property_room_photo']['file_ext'];
if (File::exists($photoUrlFilePath)) {
$photoUrlFilePath = Config::get('app.imageUrl') . '/property-photos/' . $param['property_id'] . '/' . $value['property_room_photo']['photo_name'] . '_1024x768.' . $value['property_room_photo']['file_ext'];
} else {
$photoUrlFilePath = Config::get('app.imageUrl') . '/property-photos/' . $param['property_id'] . '/' . $value['property_room_photo']['photo_name'] . '_medium.' . $value['property_room_photo']['file_ext'];
}
if (File::exists($photoUrlThumbFilePath)) {
$photoUrlThumbFilePath = Config::get('app.imageUrl') . '/property-photos/' . $param['property_id'] . '/' . $value['property_room_photo']['photo_name'] . '_200x200.' . $value['property_room_photo']['file_ext'];
} else {
$photoUrlThumbFilePath = Config::get('app.imageUrl') . '/property-photos/' . $param['property_id'] . '/' . $value['property_room_photo']['photo_name'] . '_thumbnail.' . $value['property_room_photo']['file_ext'];
}
$original = Config::get('app.imageUrl') . '/property-photos/' . $param['property_id'] . '/' . $value['property_room_photo']['photo_name'] . '.' . $value['property_room_photo']['file_ext'];
return [
'default' => $original,
'fixed' => $photoUrlFilePath,
'thumb' => $photoUrlThumbFilePath
];
})->values()->all();
$room['room_photos'] = $offerRoomMapping;
unset($room['property_room_fact_mapping']);
unset($room['property_room_photo_mapping']);
unset($room['property_room_view_mapping']);
$roomItem = $room;
foreach ($offerAccommodationMapping as $offerAccommodation) {
$accommodationItem = $offerAccommodation;
$amount = $offerPrice->where('property_room_id', '=', $room['id'])
->where('property_accommodation_id', '=', $offerAccommodation['id'])
->sum('amount');
$totalAmount = $offerPrice->where('property_room_id', '=', $room['id'])
->where('property_accommodation_id', '=', $offerAccommodation['id'])
->sum('total_amount');
$numberOfRooms = $offerPrice->where('property_room_id', '=', $room['id'])
->where('property_accommodation_id', '=', $offerAccommodation['id'])->sortBy('date')
->pluck('number_of_rooms')->first();
$roomAccommodationPrices = $offerPrice->where('property_room_id', '=', $room['id'])
->where('property_accommodation_id', '=', $offerAccommodation['id'])->sortBy('date')
->toArray();
$accommodationItem['price_daily'] = [];
if ($roomAccommodationPrices) {
foreach ($roomAccommodationPrices as $dailyPrice) {
$accommodationItem['price_daily'][] = [
'date' => $dailyPrice['date'],
'date_formatted' => Carbon::parse($dailyPrice['date'])->format('d/m/Y'),
'amount' => moneyDoubleFormat($dailyPrice['amount']),
'number_of_rooms' => $dailyPrice['number_of_rooms'],
'total' => moneyDoubleFormat($dailyPrice['total_amount']),
//'currency' => $dailyPrice['currency'],
];
}
$sumAmount += $amount;
$sumTotalAmount += $totalAmount;
$accommodationItem['price'] = [
'amount' => moneyDoubleFormat($amount),
'total_amount' => moneyDoubleFormat($totalAmount),
'number_of_rooms' => $numberOfRooms
];
$accommodationArray[] = $accommodationItem;
}
}
if ($accommodationArray) {
$roomItem['accommodation'] = $accommodationArray;
$roomArray[] = $roomItem;
}
}
$response = [
'status' => true,
'data' => [
'room_list' => $roomArray,
'amount' => moneyDoubleFormat($sumAmount),
'total_amount' => moneyDoubleFormat($sumTotalAmount)
],
];
} 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 storePriceList($param = [], $column = ['*'])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
DB::beginTransaction();
$offerData =
[
"check_in" => fillOnUndefined($param, "start_date"),
"check_out" => fillOnUndefined($param, "end_date")
];
$offerCheckInCheckOutUpdate = $this->update($param["offer_id"], $offerData);
if ($offerCheckInCheckOutUpdate['status'] != 'success') {
throw new ApiErrorException($offerCheckInCheckOutUpdate['message']);
}
$checkOfferApprovedParam = [
'offer_id' => $param['offer_id']
];
$checkOfferApprovedStatus = $this->checkOfferApprovedStatus($checkOfferApprovedParam);
if ($checkOfferApprovedStatus['status'] != 'success') {
throw new ApiErrorException($checkOfferApprovedStatus['message']);
}
$offerRequest = [
'criteria' => [
['field' => 'status', 'condition' => '=', 'value' => 1],
['field' => 'id', 'condition' => '=', 'value' => $param['offer_id']],
],
'with' => ['offerPrice'],
'firstRow' => 1
];
$columns = [
"id",
"property_id",
"title",
"description",
"expire_date",
"language",
"currency",
"total",
"payment_type_id",
];
$offerData = $this->offerRepository->findByCriteria($offerRequest, $columns);
if (!$offerData) {
throw new ApiErrorException('Offer data not found');
}
$oldOfferPrices = $offerData['offer_price'];
$newRoomPrices = $param['room_price'];
$checkTotalAmount = 0;
$insertPrices = [];
foreach ($newRoomPrices as $room) {
foreach ($room['accommodation'] as $accommodation) {
if (
isset($accommodation['number_of_rooms']) &&
!empty($accommodation['number_of_rooms']) &&
$accommodation['number_of_rooms'] !== "" &&
is_numeric($accommodation['number_of_rooms'])
) {
foreach ($accommodation['price'] as $date => $price) {
if (is_numeric($price)) {
$totalAmount = $price * $accommodation['number_of_rooms'];
$insertItem = [
'offer_id' => $offerData['id'],
'date' => $date,
'property_room_id' => $room['room_id'],
'property_accommodation_id' => $accommodation['id'],
'number_of_rooms' => $accommodation['number_of_rooms'],
'currency' => $offerData['currency'],
'amount' => $price,
'total_amount' => $totalAmount,
'status' => fillOnUndefined($param, "status", 1),
'created_by' => fillOnUndefined($param, "user_id", 0),
'updated_by' => fillOnUndefined($param, "user_id", 0),
'created_at' => Carbon::now()->timestamp,
'updated_at' => Carbon::now()->timestamp,
];
$checkTotalAmount += $price;
$insertPrices[] = $insertItem;
}
}
} else {
throw new ApiErrorException(lang('Room (' . $room['room_name'] . '-' . $accommodation['name'] . ') number of rooms data not valid', []));
}
}
}
$deleteThis = collect($oldOfferPrices)->keyBy('id')->keys()->toArray();
if ($deleteThis) {
$deleteRoomRatePrices = $this->offerPriceService->destroy($deleteThis);
if ($deleteRoomRatePrices['status'] != 'success') {
throw new ApiErrorException($deleteRoomRatePrices['message']);
}
}
$insertRoomRatePrices = $this->offerPriceService->insert($insertPrices);
if ($insertRoomRatePrices['status'] != 'success') {
throw new ApiErrorException($insertRoomRatePrices['message']);
}
if ($checkTotalAmount <= 0) {
throw new ApiErrorException('Total amount cannot be zero. Please check your number of rooms and rates.');
}
$offerPriceParams = [
"offer_id" => fillOnUndefined($param, "offer_id"),
"property_id" => fillOnUndefined($param, "property_id"),
"user_id" => fillOnUndefined($param, "user_id"),
];
$offerPriceTotal = $this->offerPriceTotalUpdate($offerPriceParams);
if ($offerPriceTotal['status'] != 'success') {
throw new ApiErrorException($offerPriceTotal['message']);
}
$response = [
'status' => true,
'data' => null,
];
DB::commit();
} catch (ApiErrorException $e) {
$response['message'] = $e->getMessage();
DB::rollBack();
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
DB::rollBack();
}
return output($response);
}
private function offerPriceTotalUpdate($params)
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$checkOfferApprovedParam = [
'offer_id' => $params['offer_id']
];
$checkOfferApprovedStatus = $this->checkOfferApprovedStatus($checkOfferApprovedParam);
if ($checkOfferApprovedStatus['status'] != 'success') {
throw new ApiErrorException($checkOfferApprovedStatus['message']);
}
$offerPriceTotalRequest = [
'criteria' => [
['field' => 'offer_id', 'condition' => '=', 'value' => $params['offer_id']],
['field' => 'status', 'condition' => '=', 'value' => 1],
],
];
$offerPriceTotal = $this->offerPriceService->select($offerPriceTotalRequest);
if ($offerPriceTotal['status'] != 'success') {
throw new ApiErrorException($offerPriceTotal['message']);
}
$totalPrice = collect($offerPriceTotal['data'])->sum(['total_amount']);
$offerStatusData =
[
"total" => $totalPrice,
"updated_by" => fillOnUndefined($params, "user_id")
];
$offerStatusResult = $this->update($params, $offerStatusData);
if ($offerStatusResult['status'] != 'success') {
throw new ApiErrorException(lang('Offer Price Total data is not updated.'));
}
$response = [
'status' => true,
'data' => $offerStatusResult["data"],
];
} 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 findOffer($params)
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$offerRequest = [
'criteria' => [
// ['field' => 'status', 'condition' => '=', 'value' => 1],
['field' => 'id', 'condition' => '=', 'value' => $params['offer_id']],
['field' => 'property_id', 'condition' => '=', 'value' => $params['property_id']],
],
'with' => [
'offerAccommodationMapping.propertyAccommodation',
'offerCancellationPolicy', 'offerContactMapping.propertyExecutive.executiveType',
'offerFactMapping.propertyFact', 'offerImportantNotes', 'offerPhotoMapping.propertyPhoto',
'offerPrice', 'offerRoomMapping.propertyRoom', 'offerAcceptStatus',
'offerLanguage', 'createUser', 'property.propertyBrand'],
'firstRow' => 1
];
$columns = [
"id",
"email",
"property_id",
"ticket_code",
"offer_code",
"title",
"description",
"expire_date",
"language",
"currency",
"total",
"status",
"payment_type_id",
"payment_type_mapping_id",
"status",
"accept_status",
"confirm_type",
"check_in",
"check_out",
"created_by"
];
$offerData = $this->offerRepository->findByCriteria($offerRequest, $columns);
if (!$offerData) {
throw new ApiErrorException('Offer data not found');
}
$offerAccommodationMapping = collect($offerData['offer_accommodation_mapping'])->map(function ($value) {
return $value['property_accommodation'];
})->values()->all();
$offerCancellationPolicy = collect($offerData['offer_cancellation_policy'])->map(function ($value) {
return $value;
})->values()->all();
$offerContactMapping = collect($offerData['offer_contact_mapping'])->map(function ($value) use ($offerData) {
$response = $value['property_executive'];
$response['executive_type'] = $response['executive_type']['language_key'];
return $response;
})->values()->all();
$offerFactMapping = collect($offerData['offer_fact_mapping'])->map(function ($value) {
return $value['property_fact'];
})->values()->all();
$offerImportantNotes = $offerData['offer_important_notes'];
$offerPhotoMapping = collect($offerData['offer_photo_mapping'])
->where('is_cover', '=', 0)
->map(function ($value) use ($params) {
$photoUrlFilePath = Config::get('app.fileSystemDriver') . '/property-photos/' . $params['property_id'] . '/' . $value['property_photo']['photo_name'] . '_1024x768.' . $value['property_photo']['file_ext'];
$photoUrlThumbFilePath = Config::get('app.fileSystemDriver') . '/property-photos/' . $params['property_id'] . '/' . $value['property_photo']['photo_name'] . '_200x200.' . $value['property_photo']['file_ext'];
if (File::exists($photoUrlFilePath)) {
$photoUrlFilePath = Config::get('app.imageUrl') . '/property-photos/' . $params['property_id'] . '/' . $value['property_photo']['photo_name'] . '_1024x768.' . $value['property_photo']['file_ext'];
} else {
$photoUrlFilePath = Config::get('app.imageUrl') . '/property-photos/' . $params['property_id'] . '/' . $value['property_photo']['photo_name'] . '_medium.' . $value['property_photo']['file_ext'];
}
if (File::exists($photoUrlThumbFilePath)) {
$photoUrlThumbFilePath = Config::get('app.imageUrl') . '/property-photos/' . $params['property_id'] . '/' . $value['property_photo']['photo_name'] . '_200x200.' . $value['property_photo']['file_ext'];
} else {
$photoUrlThumbFilePath = Config::get('app.imageUrl') . '/property-photos/' . $params['property_id'] . '/' . $value['property_photo']['photo_name'] . '_thumbnail.' . $value['property_photo']['file_ext'];
}
$value['property_photo']['image_url'] = Config::get('app.imageUrl') . '/property-photos/' . $params['property_id'] . '/' . $value['property_photo']['photo_name'] . '.' . $value['property_photo']['file_ext'];
$value['property_photo']['thumb_image_url'] = $photoUrlThumbFilePath;
$value['property_photo']['medium_image_url'] = $photoUrlFilePath;
return $value['property_photo'];
})->values()->all();
$offerCoverPhotoMapping = collect($offerData['offer_photo_mapping'])
->where('is_cover', '=', 1)
->map(function ($value) use ($params) {
$photoUrlFilePath = Config::get('app.fileSystemDriver') . '/property-photos/' . $params['property_id'] . '/' . $value['property_photo']['photo_name'] . '_1024x768.' . $value['property_photo']['file_ext'];
$photoUrlThumbFilePath = Config::get('app.fileSystemDriver') . '/property-photos/' . $params['property_id'] . '/' . $value['property_photo']['photo_name'] . '_200x200.' . $value['property_photo']['file_ext'];
if (File::exists($photoUrlFilePath)) {
$photoUrlFilePath = Config::get('app.imageUrl') . '/property-photos/' . $params['property_id'] . '/' . $value['property_photo']['photo_name'] . '_1024x768.' . $value['property_photo']['file_ext'];
} else {
$photoUrlFilePath = Config::get('app.imageUrl') . '/property-photos/' . $params['property_id'] . '/' . $value['property_photo']['photo_name'] . '_medium.' . $value['property_photo']['file_ext'];
}
if (File::exists($photoUrlThumbFilePath)) {
$photoUrlThumbFilePath = Config::get('app.imageUrl') . '/property-photos/' . $params['property_id'] . '/' . $value['property_photo']['photo_name'] . '_200x200.' . $value['property_photo']['file_ext'];
} else {
$photoUrlThumbFilePath = Config::get('app.imageUrl') . '/property-photos/' . $params['property_id'] . '/' . $value['property_photo']['photo_name'] . '_thumbnail.' . $value['property_photo']['file_ext'];
}
$value['property_photo']['image_url'] = Config::get('app.imageUrl') . '/property-photos/' . $params['property_id'] . '/' . $value['property_photo']['photo_name'] . '.' . $value['property_photo']['file_ext'];
$value['property_photo']['thumb_image_url'] = $photoUrlThumbFilePath;
$value['property_photo']['medium_image_url'] = $photoUrlFilePath;
return $value['property_photo'];
})->values()->all();
$offerPrice = $offerData['offer_price'];
$offerRoomMapping = collect($offerData['offer_room_mapping'])->map(function ($value) {
return $value['property_room'];
})->values()->all();
$responseOfferData = [
"id" => $offerData['id'],
"email" => $offerData['email'],
"property_id" => $offerData['property_id'],
"ticket_code" => $offerData['ticket_code'],
"offer_code" => $offerData['offer_code'],
"title" => $offerData['title'],
"description" => $offerData['description'],
"expire_date" => $offerData['expire_date'],
"check_in" => $offerData['check_in'],
"check_out" => $offerData['check_out'],
"language" => $offerData['language'],
"currency" => $offerData['currency'],
"total" => $offerData['total'],
"status" => $offerData['status'],
"payment_type_id" => $offerData['payment_type_id'],
"payment_type_mapping_id" => $offerData['payment_type_mapping_id'],
"accept_status" => $offerData['accept_status'],
"confirm_type" => $offerData['confirm_type'],
'offer_accommodation_mapping' => $offerAccommodationMapping,
'offer_has_cancellation_policy' => count($offerCancellationPolicy) > 0 ? true : false,
'offer_cancellation_policy' => $offerCancellationPolicy,
'offer_contact_mapping' => $offerContactMapping,
'offer_fact_mapping' => $offerFactMapping,
'offer_important_notes' => $offerImportantNotes,
'offer_photo_mapping' => $offerPhotoMapping,
'offer_cover_photos' => $offerCoverPhotoMapping,
'offer_price' => $offerPrice,
'offer_room_mapping' => $offerRoomMapping,
'offer_language' => $offerData['offer_language'],
'offer_accept_status' => $offerData['offer_accept_status'],
'create_user' => $offerData['create_user'],
'property' => $offerData['property'],
'property_brand' => $offerData['property']['property_brand'],
];
$response = [
'status' => true,
'data' => $responseOfferData,
];
} 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 editFormCheckValues($params)
{
$responseData = $params;
$offer = fillOnUndefined($params, 'get_offer', []);
$offerContactMapping = collect($offer['offer_contact_mapping'])->keyBy('id')->keys()->all();
$offerPhotoMapping = collect($offer['offer_photo_mapping'])->keyBy('id')->keys()->all();
$offerCoverPhotoMapping = collect($offer['offer_cover_photos'])->keyBy('id')->keys()->all();
$offerRoomMapping = collect($offer['offer_room_mapping'])->keyBy('id')->keys()->all();
$responseData['executives'] = collect($params['executives'])->map(function ($value) use ($offerContactMapping) {
$value['is_selected'] = array_search($value['id'], $offerContactMapping) > -1 ? true : false;
return $value;
})->values()->all();
$responseData['photos'] = collect($params['photos'])->map(function ($value) use ($offerPhotoMapping, $offerCoverPhotoMapping) {
$value['is_selected'] = array_search($value['id'], $offerPhotoMapping) > -1 ? true : false;
$value['is_cover'] = array_search($value['id'], $offerCoverPhotoMapping) > -1 ? true : false;
return $value;
})->values()->all();
$responseData['property_rooms'] = collect($params['property_rooms'])->map(function ($value) use ($offerRoomMapping) {
$value['is_selected'] = array_search($value['id'], $offerRoomMapping) > -1 ? true : false;
return $value;
})->values()->all();
unset($offer['offer_accommodation_mapping']);
unset($offer['offer_contact_mapping']);
unset($offer['offer_fact_mapping']);
unset($offer['offer_photo_mapping']);
unset($offer['offer_cover_photos']);
unset($offer['offer_room_mapping']);
unset($offer['offer_price']);
$responseData['get_offer'] = $offer;
return $responseData;
}
public function updateOffer($param = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
DB::beginTransaction();
$checkOfferApprovedParam = [
'offer_id' => $param['offer_id']
];
$checkOfferApprovedStatus = $this->checkOfferApprovedStatus($checkOfferApprovedParam);
if ($checkOfferApprovedStatus['status'] != 'success') {
throw new ApiErrorException($checkOfferApprovedStatus['message']);
}
$offerId = fillOnUndefined($param, "offer_id");
$offerData = [
"title" => fillOnUndefined($param, "title"),
"email" => fillOnUndefined($param, "email"),
"expire_date" => fillOnUndefined($param, "expire_date"),
"language" => fillOnUndefined($param, "language"),
"currency" => fillOnUndefined($param, "currency"),
"payment_type_id" => fillOnUndefined($param, "payment_type_id"),
"payment_type_mapping_id" => fillOnUndefined($param, "payment_type_mapping_id"),
"updated_by" => fillOnUndefined($param, "user_id"),
];
if ($checkOfferApprovedStatus['data']['confirm_type'] != $param['confirm_type']) {
if ($checkOfferApprovedStatus['data']['accept_status'] == 3) {
$offerData['confirm_type'] = fillOnUndefined($param, "confirm_type");
} else {
throw new ApiErrorException('Offer information cannot be updated due to approval phase.');
}
}
if ($checkOfferApprovedStatus['data']['payment_type_mapping_id'] != $param['payment_type_mapping_id']) {
if ($checkOfferApprovedStatus['data']['accept_status'] == 3) {
$offerData['payment_type_mapping_id'] = fillOnUndefined($param, "payment_type_mapping_id");
} else {
throw new ApiErrorException('Offer information cannot be updated due to approval phase.');
}
}
$validationResult = $this->offerUpdateValidator->validate($offerData);
if ($validationResult->errors()->first()) {
$errors = $validationResult->errors()->all();
throw new ApiErrorException($errors);
}
$offerCreateResult = $this->update($offerId, $offerData);
if ($offerCreateResult['status'] != 'success') {
throw new ApiErrorException(lang('Offer data is not updated.'));
}
$offerData = $offerCreateResult["data"];
$offerData = [
'offer_id' => $offerData['id'],
'user_id' => fillOnUndefined($param, "user_id"),
'fact_mapping' => fillOnUndefined($param, 'fact_mapping', []),
'contact_mapping' => fillOnUndefined($param, 'contact_mapping', []),
'room_mapping' => fillOnUndefined($param, 'room_mapping', []),
'important_notes' => fillOnUndefined($param, 'important_notes', []),
'photo_mapping' => fillOnUndefined($param, 'photo_mapping', []),
'cover_photos' => fillOnUndefined($param, 'cover_photos', []),
'cancellation_policy' => fillOnUndefined($param, 'cancellation_policy', []),
'has_cancellation_policy' => fillOnUndefined($param, 'has_cancellation_policy', false),
'accommodation_mapping' => fillOnUndefined($param, 'accommodation_mapping', []),
'hotel_features_mapping' => fillOnUndefined($param, 'hotel_features_mapping', []),
];
$getOffer = $this->findOffer($param);
if ($getOffer['status'] != 'success') {
throw new ApiErrorException($getOffer['message']);
}
$offer = $getOffer['data'];
$offerFactMapping = collect($offer['offer_fact_mapping'])->keyBy('id')->keys()->all();
$offerContactMapping = collect($offer['offer_contact_mapping'])->keyBy('id')->keys()->all();
$offerPhotoMapping = collect($offer['offer_photo_mapping'])->keyBy('id')->keys()->all();
$offerCoverPhotoMapping = collect($offer['offer_cover_photos'])->keyBy('id')->keys()->all();
$offerRoomMapping = collect($offer['offer_room_mapping'])->keyBy('id')->keys()->all();
$offerAccommodationMapping = collect($offer['offer_accommodation_mapping'])->keyBy('id')->keys()->all();
$offerCancellationPolicy = collect($offer['offer_cancellation_policy'])->keyBy('id')->keys()->all();
$offerImportantNotes = collect($offer['offer_important_notes'])->keyBy('id')->keys()->all();
$addOfferFactResponse = $this->offerFactMappingService->updateOfferFacts($offerData, $offerFactMapping);
if ($addOfferFactResponse['status'] != 'success') {
throw new ApiErrorException($addOfferFactResponse['message']);
}
$offerContactResponse = $this->offerContactMappingService->updateContactMapping($offerData, $offerContactMapping);
if ($offerContactResponse['status'] != 'success') {
throw new ApiErrorException($offerContactResponse['message']);
}
$offerPhotoMapping = $this->offerPhotoMappingService->updatePhotoMapping($offerData, $offerPhotoMapping);
if ($offerPhotoMapping['status'] != 'success') {
throw new ApiErrorException($offerPhotoMapping['message']);
}
$offerCoverPhotoMapping = $this->offerPhotoMappingService->updateCoverPhotoMapping($offerData, $offerCoverPhotoMapping);
if ($offerCoverPhotoMapping['status'] != 'success') {
throw new ApiErrorException($offerCoverPhotoMapping['message']);
}
$offerRoomResponse = $this->offerRoomMappingService->updateRoomMapping($offerData, $offerRoomMapping);
if ($offerRoomResponse['status'] != 'success') {
throw new ApiErrorException($offerRoomResponse['message']);
}
$offerAccommodationResponse = $this->offerAccommodationMappingService->updateAccommodationMapping($offerData, $offerAccommodationMapping);
if ($offerAccommodationResponse['status'] != 'success') {
throw new ApiErrorException($offerAccommodationResponse['message']);
}
$offerImportantNotesResponse = $this->offerImportantNotesService->insertImportantNotes($offerData, $offerImportantNotes);
if ($offerImportantNotesResponse['status'] != 'success') {
throw new ApiErrorException($offerImportantNotesResponse['message']);
}
$offerCancellationPolicy = $this->offerCancellationPolicyService->insertCancellationPolicy($offerData, $offerCancellationPolicy);
if ($offerCancellationPolicy['status'] != 'success') {
throw new ApiErrorException($offerCancellationPolicy['message']);
}
$deleteThisPrices = [
'offer_id' => $offer['id'],
'property_room_id' => fillOnUndefined($offerRoomResponse, 'data', []),
'property_accommodation_id' => fillOnUndefined($offerAccommodationResponse, 'data', []),
];
$deleteThisOfferPrices = $this->offerPriceService->deleteThisOfferPrices($deleteThisPrices);
if ($deleteThisOfferPrices['status'] != 'success') {
throw new ApiErrorException($deleteThisOfferPrices['message']);
}
$response = [
'status' => true,
'data' => $offerCreateResult["data"],
];
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 updateStatus($param = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$validationResult = $this->offerStatusValidator->validate($param);
if ($validationResult->errors()->first()) {
$errors = $validationResult->errors()->all();
throw new ApiErrorException($errors);
}
$offerId = fillOnUndefined($param, "offer_id");
$checkOfferApprovedParam = [
'offer_id' => $offerId
];
$checkOfferApprovedStatus = $this->checkOfferApprovedStatus($checkOfferApprovedParam);
if ($checkOfferApprovedStatus['status'] != 'success') {
throw new ApiErrorException($checkOfferApprovedStatus['message']);
}
$offerStatusData =
[
"property_id" => fillOnUndefined($param, "property_id"),
"status" => fillOnUndefined($param, "status"),
"updated_by" => fillOnUndefined($param, "user_id")
];
$offerStatusResult = $this->update($offerId, $offerStatusData);
if ($offerStatusResult['status'] != 'success') {
throw new ApiErrorException(lang('Offer Status data is not updated.'));
}
$response = [
'status' => true,
'data' => $offerStatusResult["data"],
];
} 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 updateAcceptStatus($param)
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$offerId = fillOnUndefined($param, "offer_id");
$offerCode = fillOnUndefined($param, "offer_code");
$acceptStatus = fillOnUndefined($param, "accept_status", 1);
$checkOfferApprovedParam = [
'offer_id' => $offerId
];
$checkOfferApprovedStatus = $this->checkOfferApprovedStatus($checkOfferApprovedParam);
if ($checkOfferApprovedStatus['status'] != 'success') {
throw new ApiErrorException($checkOfferApprovedStatus['message']);
}
$offerRequest = [
'criteria' => [
['field' => 'status', 'condition' => '=', 'value' => 1],
['field' => 'id', 'condition' => '=', 'value' => $offerId],
['field' => 'offer_code', 'condition' => '=', 'value' => $offerCode]
],
'firstRow' => 1
];
$offerData = $this->offerRepository->findByCriteria($offerRequest);
if (!$offerData) {
throw new ApiErrorException('Offer data not found');
}
$offerAcceptStatusData = [
"accept_status" => $acceptStatus,
"updated_at" => Carbon::now()->timestamp
];
$offerAcceptStatusResult = $this->update($offerData['id'], $offerAcceptStatusData);
if ($offerAcceptStatusResult['status'] != 'success') {
throw new ApiErrorException(lang('Offer Accept Status data is not updated.'));
}
$response = [
'status' => true,
'data' => $offerAcceptStatusResult["data"],
];
} 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 checkOfferApprovedStatus($param)
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$offerRequest = [
'criteria' => [
// ['field' => 'status', 'condition' => '=', 'value' => 1],
['field' => 'id', 'condition' => '=', 'value' => fillOnUndefined($param, "offer_id")],
],
'firstRow' => 1
];
$offerData = $this->offerRepository->findByCriteria($offerRequest);
if (!$offerData) {
throw new ApiErrorException('Update failed. Offer data not found');
}
if (!in_array($offerData['accept_status'], [1, 2, 3])) {
throw new ApiErrorException('Update failed. Offer update is locked.');
}
$response = [
'status' => true,
'data' => $offerData,
];
} 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);
}
private function generateTicket($length = 6)
{
$characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
$checkTicketCriteria = [
'criteria' => [
['field' => 'ticket_code', 'condition' => '=', 'value' => $randomString],
],
'firstRow' => 1
];
$checkTicket = $this->offerRepository->findByCriteria($checkTicketCriteria);
if ($checkTicket) {
$this->generateTicket($length);
}
return $randomString;
}
public function checkPropertyOfferPermissionAccess($param)
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$offerRequest = [
'criteria' => [
['field' => 'id', 'condition' => '=', 'value' => fillOnUndefined($param, "offer_id")],
['field' => 'property_id', 'condition' => '=', 'value' => fillOnUndefined($param, "property_id")],
],
'firstRow' => 1
];
$offerData = $this->offerRepository->findByCriteria($offerRequest,
[
'id', 'property_id', 'offer_code', 'status', 'confirm_type', 'accept_status',
'payment_type_mapping_id', 'title', 'ticket_code', 'offer_code', 'email', 'currency', 'total',
'language', 'created_by'
]
);
if (!$offerData) {
throw new ApiErrorException('Offer permission error');
}
$response = [
'status' => true,
'data' => $offerData,
];
} 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);
}
}