Files
wticreatorstudio/Modules/Customer/Services/CustomerService.php
T
Leonard Biano 5084c1f1df Customer Module Update
Admin customer job settings for category recipient emails and remove prices on prepaid subscrptions
2024-08-02 00:45:09 +08:00

257 lines
13 KiB
PHP

<?php
namespace Modules\Customer\Services;
use Illuminate\Support\Facades\Validator;
use Modules\Customer\Repositories\CustomerRepository;
use Modules\Subscription\Entities\UserCredit;
use Modules\Subscription\Entities\UserCreditHistory;
use Modules\Subscription\Entities\CustomerSubscription;
use Modules\WTIJobBoard\Entities\JobRequest;
use Modules\WTIALaCarte\Entities\AlacarteOrder;
use App\Models\User;
use Carbon\Carbon;
class CustomerService
{
protected $customerRepository;
public function __construct()
{
$this->customerRepository = new CustomerRepository;
}
public function getAll()
{
return $this->customerRepository->getAll();
}
public function membersDropdown()
{
return $this->customerRepository->membersDropdown();
}
public function find($id)
{
return $this->customerRepository->find($id);
}
public function store($data){
return $this->customerRepository->store($data);
}
public function update($data, $id){
return $this->customerRepository->update($data, $id);
}
public function contact($data, $id){
return $this->customerRepository->contact($data, $id);
}
public function transfer($data, $id){
return $this->customerRepository->transfer($data, $id);
}
public function destroy($id){
return $this->customerRepository->destroy($id);
}
public function BulkUploadStore($data){
return $this->customerRepository->BulkUploadStore($data);
}
public function subscriptions($id){
$user = User::find($id);
if($user){
$subscriptions_data = [];
$subscriptions = CustomerSubscription::with('planPrice','discount.coupon','paymentCode.addons')->where('customer_id', $id)->latest()->get();
$currentSubscription = $user->currentSubscription();
foreach ($subscriptions as $subscription) {
$payment_details = '';
if ($subscription->planPrice->billing_type == 'Recurring') {
$price = $subscription->planPrice->price;
$price_monthly = $subscription->planPrice->price / $subscription->planPrice->custom_interval;
if ($subscription->planPrice->interval == 'Custom') {
if($subscription->payment_mode == 'Monthly'){
$payment_details .= "\$".number_format($price_monthly,2)." / monthly for {$subscription->planPrice->custom_interval} Months";
} else {
$payment_details .= "\$".number_format($price,2)." for {$subscription->planPrice->custom_interval} {$subscription->planPrice->custom_interval_type}";
}
} else {
$payment_details .= "\${$subscription->planPrice->price} {$subscription->planPrice->interval}";
}
if($subscription->discount != null){
$duration = $subscription->discount->coupon->duration;
$coupon_payment_mode = $subscription->discount->coupon->payment_mode;
$discount = $subscription->discount->coupon->discount;
if ($subscription->discount->coupon->type == 'Amount') {
$discount_label = "<span class=\"text-success\">Save \${$discount}</span>";
$discounted_price_monthly = $price_monthly - $discount;
$discounted_price_all = $price - $discount;
} else {
$discount_label = "<span class=\"text-success\">Save \${$discount}%</span>";
$discounted_price_monthly = $price_monthly - (($discount / 100) * $price_monthly);
$discounted_price_all = $subscription->discount->coupon->duration == 'Once' ? $price - (($discount / 100) * $price_monthly) : $price - (($discount / 100) * $price);
}
$payment_details .= "<br> <span class=\"badge bg-info\">{$subscription->discount->coupon->code}</span>";
if ($subscription->payment_mode == 'Monthly' && $coupon_payment_mode == 'Monthly' ) {
$payment_details .= $duration == 'Once' ? " - \${$discounted_price_monthly} 1st month only)" : " | \${$discounted_price_monthly} per month";
}
if($subscription->payment_mode == 'All' && $coupon_payment_mode == 'All' ) {
$payment_details .= " - \${$discounted_price_all} for {$subscription->planPrice->custom_interval} Months ";
}
}
} else if ($subscription->planPrice->billing_type == 'One-Time') {
$price = $subscription->planPrice->price;
if($subscription->paymentCode != null){
$payment_details .= "Will expire on ".Carbon::parse($subscription->created_at)->addMonths($subscription->planPrice->access_expire_duration)->format('M d, Y');
} else {
if($subscription->payment_status == 'uncaptured'){
$payment_details .= 'Expires on '. Carbon::parse($subscription->created_at)->addDays(7)->format('M d, Y').' if not yet authorize / captured';
} else {
if($subscription->planPrice->access_expire_duration_type == 'Days'){
$payment_details .= "\${$price} {$subscription->planPrice->billing_type} {$subscription->planPrice->access} access, will expire on ".Carbon::parse($subscription->created_at)->addDays($subscription->planPrice->access_expire_duration)->format('M d, Y');
} else if($subscription->planPrice->access_expire_duration_type == 'Weeks'){
$payment_details .= "\${$price} {$subscription->planPrice->billing_type} {$subscription->planPrice->access} access, will expire on ".Carbon::parse($subscription->created_at)->addWeeks($subscription->planPrice->access_expire_duration)->format('M d, Y');
} else if($subscription->planPrice->access_expire_duration_type == 'Months'){
$payment_details .= "\${$price} {$subscription->planPrice->billing_type} {$subscription->planPrice->access} access, will expire on ".Carbon::parse($subscription->created_at)->addMonths($subscription->planPrice->access_expire_duration)->format('M d, Y');
} else if($subscription->planPrice->access_expire_duration_type == 'Years'){
$payment_details .= "\${$price} {$subscription->planPrice->billing_type} {$subscription->planPrice->access} access, will expire on ".Carbon::parse($subscription->created_at)->addYears($subscription->planPrice->access_expire_duration)->format('M d, Y');
}
}
}
}
$data = [
'id' => $subscription->id,
'plan' => [
'title' => $subscription->planPrice->plan->title,
'image' => $subscription->planPrice->plan->image_url,
'price' => $subscription->planPrice->price,
'billing_type' => $subscription->planPrice->billing_type,
'interval' => $subscription->planPrice->interval,
'custom_interval' => $subscription->planPrice->custom_interval,
'custom_interval_type' => $subscription->planPrice->custom_interval_type,
],
'payment_code' => $subscription->paymentCode != null ? [
'code' => $subscription->paymentCode->code,
'addons' => $subscription->paymentCode->addons,
] : null,
'payment_details' => $payment_details,
'status' => $subscription->status == 'trialing' ? 'Waiting for approval' : $subscription->status,
'approved' => $subscription->approved,
'payment_method' => $subscription->payment_method,
'payment_mode' => $subscription->payment_mode,
'payment_status' => $subscription->payment_status,
'subscription_start' => Carbon::parse($subscription->renewal_start_date == null ? $subscription->created_at : $subscription->renewal_start_date)->format('j M Y, g:i a'),
'subscription_end' => Carbon::parse($subscription->renewal_start_date == null ? $subscription->created_at : $subscription->renewal_start_date)->addMonths($subscription->payment_method == 'prepaid' ? $subscription->planPrice->access_expire_duration : $subscription->planPrice->custom_interval)->format('j M Y, g:i a'),
'subscription_expired' => $currentSubscription && $currentSubscription->status == 'active' ? true : ($subscription->expired_at != null ? Carbon::now()->gt(Carbon::parse($subscription->expired_at)) : true),
'subscription_expired_at' => $subscription->expired_at != null ? Carbon::parse($subscription->expired_at)->format('j M Y, g:i a') : null,
'created_at' => Carbon::parse($subscription->created_at)->format('j M Y, g:i a'),
];
if($subscription->discount != null){
$data['discount'] = [
'code' => $subscription->discount->coupon->code,
'type' => $subscription->discount->coupon->type,
'discount' => $subscription->discount->coupon->discount,
'duration' => $subscription->discount->coupon->duration,
];
}
array_push($subscriptions_data, $data);
}
return collect($subscriptions_data);
}
}
public function credits($id){
$user = User::find($id);
if($user){
UserCredit::firstOrCreate(['user_id' => $user->id]);
$usage = [];
$categories = \Modules\WTIJobBoard\Entities\JobRequestCategory::get();
foreach ($categories as $key => $category) {
$query = \Modules\WTIJobBoard\Entities\JobRequest::query()->where('client_id',$user->id)->where('type',$category->id)->where('status','publish')->where('is_rejected',false)->whereNull('deleted_at');
$usage[$category->name] = [
'subscription' => (int)$query->clone()->where('credit_type','subscription')->sum('credits'),
'alacarte' => (int)$query->clone()->where('credit_type','alacarte')->sum('credits')
];
}
$total_used_subscription_credits = \Modules\WTIJobBoard\Entities\JobRequest::where('client_id',$user->id)->where('status','publish')->where('is_rejected',false)->whereNull('deleted_at')->where('credit_type','subscription')->sum('credits');
$total_used_alacarte_credits = \Modules\WTIJobBoard\Entities\JobRequest::where('client_id',$user->id)->where('status','publish')->where('is_rejected',false)->whereNull('deleted_at')->where('credit_type','alacarte')->sum('credits');
$total_subscription_credits = $user->creditPoints->subscription_credits;
$total_alacarte_credits = $user->creditPoints->alacarte_credits;
return collect([
'total_credits' => [
'subscription' => (int)$total_subscription_credits,
'alacarte' => (int)$total_alacarte_credits,
],
'total_used_credits' => [
'subscription' => (int)$total_used_subscription_credits,
'alacarte' => (int)$total_used_alacarte_credits,
],
'total_available_credits' => [
'subscription' => (int)$total_subscription_credits - $total_used_subscription_credits,
'alacarte' => (int)$total_alacarte_credits - $total_used_alacarte_credits,
],
'usage' => $usage,
]);
} else {
return false;
}
}
public function credits_history($id){
return UserCreditHistory::with(['user'])->where('user_id',$id)->latest('id')->get();
}
public function jobs($id){
return JobRequest::with(['category', 'video', 'product', 'tracks.status', 'tracks.metas', 'shipment'])->latest('id')->where('client_id', $id)->whereNull('deleted_at')->get();
}
public function orders($id){
return AlacarteOrder::with(['user','items.product'])->where('user_id',$id)->latest()->get();
}
public function referrals($id){
return User::with(['company','subscriptions'])->where('referrer_id',$id)->latest('id')->get();
}
}