Files
wticreatorstudio/Modules/WTIJobBoard/Repositories/JobRequestsRepository.php
T
2024-03-26 22:05:21 -04:00

718 lines
28 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\StudioPlus\Entities\VideoUrl;
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', 'video.urls', 'category', 'product', 'tracks.status', 'tracks.metas', 'shipment' , 'applications.creator', 'applications.address', 'pov_video.urls'])->latest('id');
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(['category', 'video.ottUrl', 'product', 'tracks.status', 'tracks.metas', 'shipment', 'pov_video'])->latest('id');
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['source_id'])){
$sources = $filter['source_id'];
$query->whereIn('source_id', $sources);
}
if(isset($filter['brand'])){
$brand = $filter['brand'];
$query->whereHas('client', function($query) use($brand) {
$query->whereIn('id', $brand);
});
}
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->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['source_id'])){
$sources = $filter['source_id'];
$query->whereIn('source_id', $sources);
}
if(isset($filter['brand'])){
$brand = $filter['brand'];
$query->whereHas('client', function($query) use($brand) {
$query->whereIn('id', $brand);
});
}
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['type']);
if($category){
$job_request = new JobRequest();
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;
$job_request->fill($data);
if($data['client_id'] == null){
$job_request->client_id = auth()->id();
}
$job_request->save();
$product = $data['product'];
$details = new JobRequestProductDetails();
$details->fill($product);
$details->asin = $data['asin'];
$details->category = isset($product['category']['name']) ? $product['category']['name'] : null;
$details->image = $product['image']['link'];
$details->job_request_id = $job_request->id;
$details->save();
$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'){
// $this->sendJobRequestUpdate($job_request->category->support_email, 'Pending', $data['asin']);
// }
return $job_request;
} else {
return false;
}
}
public function update($data)
{
$job_request = JobRequest::with('category')->find($data['id']);
if ($job_request) {
$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'] < $job_request->category->credits ){
$data['status'] == 'draft';
} else if($data['credit_type'] == 'alacarte' && $credits['total_available_credits']['alacarte'] < $job_request->category->credits ){
$data['status'] == 'draft';
}
}
$data['credits'] = $job_request->category->credits;
if($old_status == 'draft' && $data['status'] == 'publish'){
$data['created_at'] = \Carbon\Carbon::now()->format('Y-m-d H:i:s');
}
$job_request->fill($data);
$job_request->update();
$product = $data['product'];
$details = $job_request->product;
$details->fill($product);
$details->asin = $data['asin'];
$details->category = $product['category']['name'];
$details->image = $product['image']['link'];
$details->update();
return $job_request;
}
return false;
}
public function approve($id)
{
$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;
$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) {
$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();
$this->sendJobRequestUpdate($job_request->client->email, 'Rejected', $job_request->asin);
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)
{
$fulfilled_status = JobRequestStatus::where('name', 'fulfilled')->first();
$track_exist = JobRequestTrack::where('job_request_id',$data['id'])->where('status_id',$fulfilled_status->id)->first();
if(!$track_exist) {
$track = new JobRequestTrack();
$track->job_request_id = $data['id'];
$track->status_id = $fulfilled_status->id;
$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();
$this->sendJobRequestUpdate($job_request->client, '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();
$this->sendJobRequestUpdate($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 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', $asin);
$category = JobRequestCategory::find($type);
if(!$category->will_be_shipped){
if(in_array(1, $category->video_types) && !in_array(2, $category->video_types)){
$query = $query->where('is_short',0);
} else if(!in_array(1, $category->video_types) && in_array(2, $category->video_types)){
$query = $query->where('is_short',1);
}
}
$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,
'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);
}
}