Files
wticreatorstudio/Modules/WTIJobBoard/Repositories/JobRequestsRepository.php
T

930 lines
42 KiB
PHP

<?php
namespace Modules\WTIJobBoard\Repositories;
use Illuminate\Support\Facades\Cache;
use Modules\WTIJobBoard\Entities\Creator;
use Modules\WTIJobBoard\Entities\JobRequest;
use Modules\WTIJobBoard\Entities\JobRequestCategory;
use Modules\WTIJobBoard\Entities\JobRequestProductDetails;
use Modules\WTIJobBoard\Entities\JobRequestStatus;
use Modules\WTIJobBoard\Entities\JobRequestTrack;
use Modules\WTIJobBoard\Entities\JobRequestTrackMeta;
use Modules\WTIJobBoard\Entities\JobRequestBadge;
use Modules\WTIJobBoard\Entities\JobRequestSocialMediaSite;
use Modules\WTIJobBoard\Entities\JobRequestSocialMediaPost;
use Modules\WTIJobBoard\Entities\JobRequestSetting;
use Modules\StudioPlus\Entities\VideoUrl;
use Modules\Subscription\Entities\UserCreditHistory;
use Modules\Customer\Services\CustomerService;
use App\Traits\SendMail;
use Carbon\Carbon;
class JobRequestsRepository
{
use SendMail;
public function all($data)
{
if (permissionCheck('job_board.admin.index')) {
$items = JobRequest::with(['client.company', 'video.urls', 'video.videoType', 'source', 'category.badge', 'product', 'socialMediaPosts.site', 'tracks.status', 'tracks.metas', 'shipment' , 'applications.creator', 'applications.address', 'pov_video.urls', 'pov_video.videoType']);
if (!in_array(auth()->user()->role->type, ['superadmin', 'admin'])) {
$type_ids = [];
$categories = Cache::remember('categories', 300, function() {
return JobRequestCategory::where('active',1)->get();
});
foreach ($categories as $key => $category) {
if($category->route_permission != null && permissionCheck($category->route_permission)){
array_push($type_ids, $category->id);
}
}
$items = $items->whereIn('type', $type_ids)->where('status','publish')->whereNull('deleted_at');
}
//dont show draft job request and deleted
$items = $items->where('status','publish')->whereNull('deleted_at');
} else {
$items = JobRequest::with(['source', 'category.badge', 'video.ottUrl', 'video.urls', 'product', 'socialMediaPosts.site', 'tracks.status', 'tracks.metas', 'shipment', 'pov_video.videoType']);
if (permissionCheck('job_board.creator.index')) {
$items = $items->where('is_approved', true)->where(function($query) {
$query->whereDoesntHave('applications', function($query) {
$query->where('is_hired', true);
})->orWhereHas('applications', function($query) {
$query->where('is_hired', true)->where('applicant_id', auth()->id());
});
})->whereHas('category', function ($query) {
$query->where('will_be_shipped', 1);
})->where('status','publish')->whereNull('deleted_at');
// $type_ids = [];
// $staff_badges = (array)json_decode(auth()->user()->staff->badges);
// $badges = \Modules\WTIJobBoard\Entities\JobRequestBadge::whereIn('id',$staff_badges)->get();
// foreach ($badges as $key => $badge) {
// if($badge->categories != null){
// array_push($type_ids, $badge->categories[0]);
// }
// }
// $items = $items->whereIn('type', $type_ids);
} else {
$items = $items->where('client_id', auth()->id())->whereNull('deleted_at');
}
}
if (isset($data['filter'])) {
$filter = $data['filter'];
$items = $items->where(function($query) use($filter) {
if(isset($filter['job_types'])){
$job_types = $filter['job_types'];
$query->whereIn('type', $job_types);
}
if(isset($filter['job_status'])){
$job_status = $filter['job_status'];
$query->whereIn('job_status', $job_status);
}
if(isset($filter['creator_status'])){
$creator_status = $filter['creator_status'];
if (in_array("Available", $creator_status)){
$query->whereDoesntHave('applications', function($query) {
$query->where('applicant_id', auth()->id());
});
}
if (in_array("Applied", $creator_status)){
$query->orWhereHas('applications', function ($query) {
$query->where('applicant_id', auth()->id())->where('is_hired', 0);
});
}
if (in_array("In Progress", $creator_status)){
$query->orWhereHas('applications', function ($query) {
$query->where('applicant_id', auth()->id())->where('is_hired', 1);
})->where('job_status','!=','Completed');
}
if (in_array("Completed", $creator_status)){
$query->orWhereHas('applications', function ($query) {
$query->where('applicant_id', auth()->id())->where('is_hired', 1);
})->where('job_status','Completed');
}
}
if(isset($filter['source_id'])){
$sources = $filter['source_id'];
$query->whereIn('source_id', $sources);
}
if(isset($filter['client'])){
$client = $filter['client'];
$query->whereHas('client', function($query) use($client) {
$query->whereIn('id', $client);
});
}
if(isset($filter['product_brand'])){
$product_brand = $filter['product_brand'];
$query->whereHas('product', function($query) use($product_brand) {
$query->whereIn('brand', $product_brand);
});
}
if(isset($filter['track_package'])){
$track_package = $filter['track_package'];
$query->whereIn('track_package_status', $track_package);
}
if(isset($filter['order_date'][0])){
$startDate = Carbon::parse($filter['order_date'][0])->addDay()->format('Y-m-d');
$endDate = isset($filter['order_date'][1]) ? Carbon::parse($filter['order_date'][1])->addDay()->format('Y-m-d') : $startDate;
$query->whereDate('created_at', '>=', $startDate)->whereDate('created_at', '<=', $endDate);
}
if(isset($filter['shipped_date'][0])){
$startDate = Carbon::parse($filter['shipped_date'][0])->addDay()->format('Y-m-d');
$endDate = isset($filter['shipped_date'][1]) ? Carbon::parse($filter['shipped_date'][1])->addDay()->format('Y-m-d') : $startDate;
$query->whereHas('tracks', function($query) use($startDate,$endDate) {
$query->where('status_id', 3)->whereDate('created_at', '>=', $startDate)->whereDate('created_at', '<=', $endDate);
});
}
if(isset($filter['received_date'][0])){
$startDate = Carbon::parse($filter['received_date'][0])->addDay()->format('Y-m-d');
$endDate = isset($filter['received_date'][1]) ? Carbon::parse($filter['received_date'][1])->addDay()->format('Y-m-d') : $startDate;
$query->whereHas('tracks', function($query) use($startDate,$endDate) {
$query->where('status_id', 4)->whereDate('created_at', '>=', $startDate)->whereDate('created_at', '<=', $endDate);
});
}
if(isset($filter['search'])){
$search = $filter['search'];
$query->where('id', 'like', '%' . $search . '%');
$query->orWhere('title', 'like', '%' . $search . '%');
$query->orWhere('asin', 'like', '%' . $search . '%');
// $query->orWhereHas('client', function ($query) use($search) {
// $query->where('name', 'like', '%' . $search . '%');
// });
}
});
}
$items = $items->orderBy('created_at', $data['ascending'] === 'true' ? 'ASC' : 'DESC')->paginate($data['pagination']);
return $items;
}
public function counts($data)
{
if (permissionCheck('job_board.admin.index')) {
$items = JobRequest::query();
if (!in_array(auth()->user()->role->type, ['superadmin', 'admin'])) {
$type_ids = [];
$categories = Cache::remember('categories', 300, function() {
return JobRequestCategory::where('active',1)->get();
});
foreach ($categories as $key => $category) {
if($category->route_permission != null && permissionCheck($category->route_permission)){
array_push($type_ids, $category->id);
}
}
$items = $items->whereIn('type', $type_ids)->where('status','publish')->whereNull('deleted_at');
}
//dont show draft job request and deleted
$items = $items->where('status','publish')->whereNull('deleted_at');
} else {
$items = JobRequest::query();
if (permissionCheck('job_board.creator.index')) {
$items = $items->where('is_approved', true)->where(function($query) {
$query->whereDoesntHave('applications', function($query) {
$query->where('is_hired', true);
})->orWhereHas('applications', function($query) {
$query->where('is_hired', true)->where('applicant_id', auth()->id());
});
})->whereHas('category', function ($query) {
$query->where('will_be_shipped', 1);
})->where('status','publish')->whereNull('deleted_at');
// $type_ids = [];
// $staff_badges = (array)json_decode(auth()->user()->staff->badges);
// $badges = \Modules\WTIJobBoard\Entities\JobRequestBadge::whereIn('id',$staff_badges)->get();
// foreach ($badges as $key => $badge) {
// if($badge->categories != null){
// array_push($type_ids, $badge->categories[0]);
// }
// }
// $items = $items->whereIn('type', $type_ids);
} else {
$items = $items->where('client_id', auth()->id())->whereNull('deleted_at');
}
}
if (isset($data['filter'])) {
$filter = $data['filter'];
$items = $items->where(function($query) use($filter) {
if(isset($filter['job_types'])){
$job_types = $filter['job_types'];
$query->whereIn('type', $job_types);
}
if(isset($filter['job_status'])){
$job_status = $filter['job_status'];
$query->whereIn('job_status', $job_status);
}
if(isset($filter['creator_status'])){
$creator_status = $filter['creator_status'];
if (in_array("Available", $creator_status)){
$query->whereDoesntHave('applications', function($query) {
$query->where('applicant_id', auth()->id());
});
}
if (in_array("Applied", $creator_status)){
$query->orWhereHas('applications', function ($query) {
$query->where('applicant_id', auth()->id())->where('is_hired', 0);
});
}
if (in_array("In Progress", $creator_status)){
$query->orWhereHas('applications', function ($query) {
$query->where('applicant_id', auth()->id())->where('is_hired', 1);
})->where('job_status','!=','Completed');
}
if (in_array("Completed", $creator_status)){
$query->orWhereHas('applications', function ($query) {
$query->where('applicant_id', auth()->id())->where('is_hired', 1);
})->where('job_status','Completed');
}
}
if(isset($filter['source_id'])){
$sources = $filter['source_id'];
$query->whereIn('source_id', $sources);
}
if(isset($filter['client'])){
$client = $filter['client'];
$query->whereHas('client', function($query) use($client) {
$query->whereIn('id', $client);
});
}
if(isset($filter['product_brand'])){
$product_brand = $filter['product_brand'];
$query->whereHas('product', function($query) use($product_brand) {
$query->whereIn('brand', $product_brand);
});
}
if(isset($filter['track_package'])){
$track_package = $filter['track_package'];
$query->whereIn('track_package_status', $track_package);
}
if(isset($filter['order_date'][0])){
$startDate = Carbon::parse($filter['order_date'][0])->addDay()->format('Y-m-d');
$endDate = isset($filter['order_date'][1]) ? Carbon::parse($filter['order_date'][1])->addDay()->format('Y-m-d') : $startDate;
$query->whereDate('created_at', '>=', $startDate)->whereDate('created_at', '<=', $endDate);
}
if(isset($filter['shipped_date'][0])){
$startDate = Carbon::parse($filter['shipped_date'][0])->addDay()->format('Y-m-d');
$endDate = isset($filter['shipped_date'][1]) ? Carbon::parse($filter['shipped_date'][1])->addDay()->format('Y-m-d') : $startDate;
$query->whereHas('tracks', function($query) use($startDate,$endDate) {
$query->where('status_id', 3)->whereDate('created_at', '>=', $startDate)->whereDate('created_at', '<=', $endDate);
});
}
if(isset($filter['received_date'][0])){
$startDate = Carbon::parse($filter['received_date'][0])->addDay()->format('Y-m-d');
$endDate = isset($filter['received_date'][1]) ? Carbon::parse($filter['received_date'][1])->addDay()->format('Y-m-d') : $startDate;
$query->whereHas('tracks', function($query) use($startDate,$endDate) {
$query->where('status_id', 4)->whereDate('created_at', '>=', $startDate)->whereDate('created_at', '<=', $endDate);
});
}
if(isset($filter['search'])){
$search = $filter['search'];
$query->where('id', 'like', '%' . $search . '%');
$query->orWhere('title', 'like', '%' . $search . '%');
$query->orWhere('asin', 'like', '%' . $search . '%');
// $query->orWhereHas('client', function ($query) use($search) {
// $query->where('name', 'like', '%' . $search . '%');
// });
}
});
}
return $items->get()->countBy(function ($item) {
return permissionCheck('job_board.admin.index') ? strtolower(str_replace(' ', '_', $item->client_status)) : ( permissionCheck('job_board.creator.index') ? strtolower(str_replace(' ', '_', $item->creator_status)) : strtolower(str_replace(' ', '_', $item->client_status)));
});
}
public function create($data)
{
$category = JobRequestCategory::find($data['category']['id']);
if($category){
$job_request = new JobRequest();
if($data['client_id'] == null){
$credits = auth()->user()->credit_points_status;
if($data['status'] == 'publish' && auth()->user()->role->type == 'customer'){
if($data['credit_type'] == 'subscription' && $credits['total_available_credits']['subscription'] < $category->credits ){
$data['status'] == 'draft';
} else if($data['credit_type'] == 'alacarte' && $credits['total_available_credits']['alacarte'] < $category->credits ){
$data['status'] == 'draft';
}
}
} else {
$credits = (new CustomerService())->credits($data['client_id']);
}
$data['credits'] = $category->credits;
$data['source_id'] = $data['source']['id'];
$data['type'] = $data['category']['id'];
$data['post_to'] = $data['category']['will_be_posted'] ? $data['post_to'] : null;
$job_request->fill($data);
if($data['client_id'] == null){
$job_request->client_id = auth()->id();
}
$job_request->save();
if($category->will_be_posted && $job_request->post_to != null){
foreach ($job_request->post_to as $key => $site) {
JobRequestSocialMediaPost::create([
'job_request_id' => $job_request->id,
'social_media_site_id' => $site,
'handle' => $data['handles'][$site]
]);
}
}
if($data['source']['has_product']){
$product = $data['product'];
$job_request->product()->create([
'asin' => $data['asin'],
'name' => $product['name'] != null ? $product['name'] : $data['title'],
'store' => isset($product['store']) ? $product['store'] : null,
'brand' => isset($product['brand']) ? $product['brand'] : null,
'store' => isset($product['store']) ? $product['store'] : null,
'category' => isset($product['category']['name']) ? $product['category']['name'] : null,
'price' => isset($product['price']) ? $product['price'] : null,
'reviews' => isset($product['reviews']) ? $product['reviews'] : null,
'image' => isset($product['image']['link']) ? $product['image']['link'] : null,
'link' => isset($product['link']) ? $product['link'] : null,
]);
}
$status_ordered = JobRequestStatus::where('name', 'ordered')->first();
if ($status_ordered) {
$track = new JobRequestTrack();
$track->job_request_id = $job_request->id;
$track->status_id = $status_ordered->id;
$track->save();
}
if($job_request->status == 'publish' && $job_request->category->credits > 0){
UserCreditHistory::create([
'user_id' => $job_request->client_id,
'subscription_credits_from' => $credits['total_available_credits']['subscription'],
'subscription_credits_to' => $job_request->credit_type == 'subscription' ? $credits['total_available_credits']['subscription'] - (int)$job_request->credits : $credits['total_available_credits']['subscription'],
'alacarte_credits_from' => $credits['total_available_credits']['alacarte'],
'alacarte_credits_to' => $job_request->credit_type == 'alacarte' ? $credits['total_available_credits']['alacarte'] - (int)$job_request->credits : $credits['total_available_credits']['alacarte'],
'details' => 'Job ID: <b>'.$job_request->id.'</b> ('.$job_request->category->label.')'
]);
}
// if($job_request->status == 'publish'){
// $this->sendJobRequestUpdate($job_request->category->support_email, 'Pending', $data['asin']);
// }
return $job_request;
} else {
return false;
}
}
public function update($data)
{
$job_request = JobRequest::with(['client.company','category'])->find($data['id']);
if ($job_request) {
$category = JobRequestCategory::find($data['category']['id']);
$old_status = $job_request->status;
if (auth()->user()->role->type == 'customer') {
$data['is_approved'] = 0;
$data['job_status'] = 'Pending';
}
if($data['status'] == 'publish' && auth()->user()->role->type == 'customer'){
$credits = auth()->user()->credit_points_status;
if($data['credit_type'] == 'subscription' && $credits['total_available_credits']['subscription'] < $category->credits ){
$data['status'] == 'draft';
} else if($data['credit_type'] == 'alacarte' && $credits['total_available_credits']['alacarte'] < $category->credits ){
$data['status'] == 'draft';
}
}
$data['credits'] = $category->credits;
$data['type'] = $data['category']['id'];
$data['post_to'] = $data['category']['will_be_posted'] ? $data['post_to'] : null;
$data['studio_plus_videos_id'] = $data['category']['video_types'] == null ? null : $data['studio_plus_videos_id'];
if($old_status == 'draft' && $data['status'] == 'publish'){
$data['created_at'] = \Carbon\Carbon::now()->format('Y-m-d H:i:s');
$credits = (new CustomerService())->credits($job_request->client_id);
UserCreditHistory::create([
'user_id' => $job_request->client_id,
'subscription_credits_from' => $credits['total_available_credits']['subscription'],
'subscription_credits_to' => $job_request->credit_type == 'subscription' ? $credits['total_available_credits']['subscription'] - (int)$job_request->credits : $credits['total_available_credits']['subscription'],
'alacarte_credits_from' => $credits['total_available_credits']['alacarte'],
'alacarte_credits_to' => $job_request->credit_type == 'alacarte' ? $credits['total_available_credits']['alacarte'] - (int)$job_request->credits : $credits['total_available_credits']['alacarte'],
'details' => 'Job ID: <b>'.$job_request->id.'</b> ('.$job_request->category->label.')'
]);
} else if($old_status == 'publish' && $data['status'] == 'draft'){
$credits = (new CustomerService())->credits($job_request->client_id);
UserCreditHistory::create([
'user_id' => $job_request->client_id,
'subscription_credits_from' => $credits['total_available_credits']['subscription'],
'subscription_credits_to' => $job_request->credit_type == 'subscription' ? $credits['total_available_credits']['subscription'] + (int)$job_request->credits : $credits['total_available_credits']['subscription'],
'alacarte_credits_from' => $credits['total_available_credits']['alacarte'],
'alacarte_credits_to' => $job_request->credit_type == 'alacarte' ? $credits['total_available_credits']['alacarte'] + (int)$job_request->credits : $credits['total_available_credits']['alacarte'],
'details' => 'Reset to Draft Job ID: <b>'.$job_request->id.'</b> ('.$job_request->category->label.')'
]);
}
$job_request->fill($data);
$job_request->update();
if($category->will_be_posted && $job_request->post_to != null){
$job_request->socialMediaPosts()->whereNotIn('social_media_site_id', $job_request->post_to)->delete();
foreach ($job_request->post_to as $key => $site) {
JobRequestSocialMediaPost::updateOrCreate(
['job_request_id' => $job_request->id, 'social_media_site_id' => $site],
['handle' => isset($data['handles'][$site]) ? $data['handles'][$site] : null]
);
}
}
$product = $data['product'];
$job_request->product()->update([
'asin' => $data['asin'],
'name' => $product['name'] != null ? $product['name'] : $data['title'],
'store' => isset($product['store']) ? $product['store'] : null,
'brand' => isset($product['brand']) ? $product['brand'] : null,
'store' => isset($product['store']) ? $product['store'] : null,
'category' => isset($product['category']['name']) ? $product['category']['name'] : null,
'price' => isset($product['price']) ? $product['price'] : null,
'reviews' => isset($product['reviews']) ? $product['reviews'] : null,
'image' => isset($product['image']['link']) ? $product['image']['link'] : null,
'link' => isset($product['link']) ? $product['link'] : null,
]);
return $job_request;
}
return false;
}
public function approve($id,$credits)
{
$user = auth()->user();
if ($user) {
$role = $user->role->type;
if (permissionCheck('job_request.approve')) {
$job_request = JobRequest::find($id);
if ($job_request) {
$job_request->job_status = 'Approved';
$job_request->track_package_status = 'Approved';
$job_request->is_approved = true;
$job_request->is_rejected = false;
if($job_request->category->credits == 0){
$user_credits = (new CustomerService())->credits($job_request->client_id);
if($job_request->credit_type == 'subscription' && $user_credits['total_available_credits']['subscription'] < $credits){
return false;
} else if($job_request->credit_type == 'alacarte' && $user_credits['total_available_credits']['alacarte'] < $credits){
return false;
}
UserCreditHistory::create([
'user_id' => $job_request->client_id,
'subscription_credits_from' => $user_credits['total_available_credits']['subscription'],
'subscription_credits_to' => $job_request->credit_type == 'subscription' ? $user_credits['total_available_credits']['subscription'] - (int)$credits : $user_credits['total_available_credits']['subscription'],
'alacarte_credits_from' => $user_credits['total_available_credits']['alacarte'],
'alacarte_credits_to' => $job_request->credit_type == 'alacarte' ? $user_credits['total_available_credits']['alacarte'] - (int)$credits : $user_credits['total_available_credits']['alacarte'],
'details' => 'Job ID: <b>'.$job_request->id.'</b> ('.$job_request->category->label.')'
]);
$job_request->credits = $credits;
}
$job_request->update();
$processing_status = JobRequestStatus::where('name', 'processing')->first();
$track = new JobRequestTrack();
$track->job_request_id = $job_request->id;
$track->status_id = $processing_status->id;
$track->save();
//complete the job after approve for purchase video and access video
if($job_request->type == 10 || $job_request->type == 12){
$this->fulfilled(['id' => $job_request->id]);
}
//$this->sendJobRequestUpdate($job_request->client->email, 'Approved', $job_request->asin);
return true;
}
}
}
return false;
}
public function reject($id)
{
$user = auth()->user();
if ($user) {
$role = $user->role->type;
if (permissionCheck('job_request.reject')) {
$job_request = JobRequest::find($id);
if ($job_request) {
$credits = (new CustomerService())->credits($job_request->client_id);
UserCreditHistory::create([
'user_id' => $job_request->client_id,
'subscription_credits_from' => $credits['total_available_credits']['subscription'],
'subscription_credits_to' => $job_request->credit_type == 'subscription' ? $credits['total_available_credits']['subscription'] + (int)$job_request->credits : $credits['total_available_credits']['subscription'],
'alacarte_credits_from' => $credits['total_available_credits']['alacarte'],
'alacarte_credits_to' => $job_request->credit_type == 'alacarte' ? $credits['total_available_credits']['alacarte'] + (int)$job_request->credits : $credits['total_available_credits']['alacarte'],
'details' => 'Rejected Job ID: <b>'.$job_request->id.'</b> ('.$job_request->category->label.')'
]);
$job_request->job_status = 'Denied';
$job_request->track_package_status = 'Rejected';
$job_request->is_rejected = true;
$job_request->is_approved = false;
$job_request->update();
$processing_status = JobRequestStatus::where('name', 'rejected')->first();
$track = new JobRequestTrack();
$track->job_request_id = $job_request->id;
$track->status_id = $processing_status->id;
$track->save();
$setting = JobRequestSetting::where('job_request_category_id',$job_request->type)->where('user_id',$job_request->client_id)->whereNotNull('email')->first();
$this->sendJobRequestUpdate($setting ? $setting->email : $job_request->client->email, 'Rejected', $job_request->asin);
return true;
}
}
}
return false;
}
public function incomplete($id)
{
if (permissionCheck('job_request.incomplete')) {
$job_request = JobRequest::find($id);
if ($job_request) {
$last_track = $job_request->tracks()->where('status_id','!=',5)->latest()->first();
$job_request->job_status = 'In Progress';
$job_request->track_package_status = $last_track->status->label;
$job_request->update();
$processing_status = JobRequestStatus::where('name', 'incomplete')->first();
$track = new JobRequestTrack();
$track->job_request_id = $job_request->id;
$track->status_id = $processing_status->id;
$track->save();
return true;
}
}
return false;
}
public function delete($id)
{
$job_request = JobRequest::find($id);
if ($job_request) {
if ($job_request->client_id != auth()->id() && !permissionCheck('job_request.delete')) {
return false;
}
$job_request->delete();
$job_request->product()->delete();
$job_request->applications()->delete();
$job_request->shipment()->delete();
$job_request->tracks()->delete();
return true;
}
return false;
}
public function fulfilled($data)
{
$current_track = JobRequestTrack::where('job_request_id',$data['id'])->latest()->first();
$track_exist = JobRequestTrack::where('job_request_id',$data['id'])->where('status_id',5)->first();
if(!$track_exist || $current_track->status_id == 11) {
$track = new JobRequestTrack();
$track->job_request_id = $data['id'];
$track->status_id = 5;
$track->save();
$meta = new JobRequestTrackMeta();
$meta->track_id = $track->id;
$meta->name = 'fulfilled_at';
$meta->value = $data['fulfilled_at'] ?? \Carbon\Carbon::now()->format('Y-m-d H:i:s');
$meta->save();
}
$job_request = JobRequest::find($data['id']);
if($job_request->job_status != 'Completed'){
$job_request->job_status = 'Completed';
$job_request->track_package_status = 'Completed';
$job_request->save();
$setting = JobRequestSetting::where('job_request_category_id',$job_request->type)->where('user_id',$job_request->client_id)->whereNotNull('email')->first();
$this->sendJobRequestUpdate((object)['email' => $setting ? $setting->email : $job_request->client->email, 'first_name' => $job_request->client->first_name], 'Completed', $job_request->asin);
}
return true;
}
public function winner($data)
{
$job_request = JobRequest::find($data['id']);
if ($job_request) {
$winner_selected_status = JobRequestStatus::where('name', 'winner-selected')->first();
$track_exist = JobRequestTrack::where('job_request_id',$job_request->id)->where('status_id',$winner_selected_status->id)->first();
if(!$track_exist) {
$track = new JobRequestTrack();
$track->job_request_id = $job_request->id;
$track->status_id = $winner_selected_status->id;
$track->save();
}
$job_request->track_package_status = 'Winner Selected';
$job_request->others = [
'winner_name' => $data['winner_name'],
'winner_phone' => $data['winner_phone'],
'winner_shipping_address' => $data['winner_shipping_address'],
];
$job_request->save();
$setting = JobRequestSetting::where('job_request_category_id',$job_request->type)->where('user_id',$job_request->client_id)->whereNotNull('email')->first();
$this->sendJobRequestUpdate($setting ? $setting->email : $job_request->client->email, 'Winner Selected', $job_request->id);
return true;
}
return false;
}
public function deliverable($data)
{
$deliverable_status = JobRequestStatus::where('name', 'deliverable')->first();
$track = new JobRequestTrack();
$track->job_request_id = $data['id'];
$track->status_id = $deliverable_status->id;
$track->save();
$meta = new JobRequestTrackMeta();
$meta->track_id = $track->id;
$meta->name = 'deliverable_at';
$meta->value = $data['deliverable_at'];
$meta->save();
$job_request = JobRequest::find($data['id']);
$job_request->job_status = 'In Progress';
$job_request->track_package_status = 'Scheduled';
$job_request->save();
return true;
}
public function deliverableUpdate($data)
{
$meta = JobRequestTrackMeta::where('track_id', $data['track_id'])->first();
if($meta){
$meta->value = $data['deliverable_at'];
$meta->update();
return true;
}
return false;
}
public function postedLinks($data)
{
$job_request = JobRequest::find($data['id']);
foreach ($data['links'] as $id => $value) {
$post = JobRequestSocialMediaPost::where('job_request_id', $job_request->id)->where('id', $id)->first();
if($post){
$post->url = $value;
$post->save();
}
}
$this->fulfilled($data);
return true;
}
public function adminNotes($data)
{
$job_request = JobRequest::find($data['id']);
if($job_request){
$job_request->admin_notes = $data['admin_notes'];
$job_request->save();
return true;
}
return false;
}
public function url($data)
{
if (permissionCheck('job_request.pictures-manager') || permissionCheck('job_request.pov-manager') || permissionCheck('job_request.livestream.url') || permissionCheck('job_board.livestream-manager') || permissionCheck('job_board.ott-app-manager') || permissionCheck('job_board.giveaway-manager')) {
$job_request = JobRequest::find($data['id']);
if ($job_request) {
if($job_request->category->name == 'pov_video'){
$amazon = $job_request->video->urls->where('label','Amazon')->first();
if($amazon){
$amazon->url = $data['url'];
$amazon->save();
}
} else {
$job_request->fill($data);
$job_request->update();
}
return $this->fulfilled($data);
}
}
return false;
}
public function downloadVideo($id)
{
$job_request = JobRequest::find($id);
$video_id = $job_request->pov_video != null ? $job_request->pov_video->id : ($job_request->video != null ? $job_request->video->id : false );
if(!$video_id) return false;
$video = \Modules\StudioPlus\Entities\StudioPlusVideo::with('channel')->find($video_id);
if($video){
//$token = \Cache::remember('user-token-'.auth()->user()->id, 300, function () {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://wtisv.com/api/studio/get-token');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
$headers = array();
$headers[] = 'Authorization: Bearer ooVeuWUlukjmsHSc26yVqlVT4BG7Ii9P';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = json_decode(curl_exec($ch));
curl_close($ch);
$token = $result->token;
//});
if($token){
//for purchase video only should not have watermarks
if($job_request->type == 10){
$video_url = $video->original_video_url;
} else {
$video_url = $video->video_url;
}
$video_url = \Str::remove(\Config::get('studioplus.google_api_endpoint'). "/" , $video_url);
$video_url = \Str::remove(\Config::get('studioplus.bucket_name'). "/", $video_url);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://wtisv.com/api/studio/generate-video-link');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "user_id=".$video->channel->user_id."&video_id=".$video->id."&video_url=".$video_url);
$headers = array();
$headers[] = 'Authorization: Bearer '.$token;
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = json_decode(curl_exec($ch));
curl_close($ch);
return isset($result->link) ? $result->link : false;
}
}
return false;
}
public function searchPOV($asin, $type)
{
$query = \Modules\StudioPlus\Entities\StudioPlusVideo::query()->with('urls')->where('asin', 'LIKE', "%{$asin}%");
$category = JobRequestCategory::find($type);
if($category && $category->video_types != null){
$query = $query->whereIn('studio_plus_video_type_id', $category->video_types);
}
$videos = $query->get();
$pov_videos = [];
foreach ($videos as $key => $video) {
$alread_purchased = false;
if($type == 10){
$job = JobRequest::where('studio_plus_videos_id',$video->id)->where('type',10)->first() ?? false;
}
$data = [
'id' => $video->id,
'title' => $video->title,
'type' => $video->videoType->name,
'status' => $video->status,
'urls' => $video->urls,
'alread_purchased' => isset($job) ? ($job && $job->job_status != 'Pending' ? true : false) : false
];
array_push($pov_videos,$data);
}
return collect($pov_videos);
}
}