Files
wticreatorstudio/Modules/Customer/Repositories/CustomerRepository.php
T
Leonard Biano 0e233c3489 Customer Module Updates
Text changes and some fixes
2024-07-05 20:36:38 +08:00

231 lines
12 KiB
PHP

<?php
namespace Modules\Customer\Repositories;
use App\Models\Order;
use Modules\Customer\Entities\CustomerAddress;
use App\Models\User;
use App\Traits\Notification;
use App\Traits\SendMail;
use Illuminate\Support\Facades\Hash;
use Maatwebsite\Excel\Facades\Excel;
use Modules\Customer\Imports\CustomerImport;
use Modules\GeneralSetting\Entities\EmailTemplateType;
use Modules\GeneralSetting\Entities\UserNotificationSetting;
use Modules\Marketing\Entities\ReferralCode;
use Modules\Marketing\Entities\ReferralCodeSetup;
use Modules\Marketing\Entities\ReferralUse;
use Modules\OrderManage\Entities\CustomerNotification;
use Modules\Setup\Entities\Country;
use Modules\Setup\Entities\State;
use Modules\Wallet\Entities\WalletBalance;
use Modules\Customer\Entities\TransferAccountHistory;
use Modules\WTIJobBoard\Entities\JobRequest;
use Modules\Subscription\Entities\UserCredit;
use Modules\Subscription\Entities\UserCreditHistory;
use Modules\Customer\Services\CustomerService;
use Carbon\Carbon;
class CustomerRepository
{
use Notification, SendMail;
public function getAll()
{
return User::with('wallet_balances', 'creditPoints', 'referrer','company','additionalContacts')->whereHas('role', function($query){
return $query->where('type', 'customer');
})->latest();
}
public function membersDropdown()
{
$members = User::with('company')->whereHas('role', function($query){
return $query->whereIn('id', [2,4,5,6,7,8,111,117]);
})->where('is_active', true)->orderBy('first_name')->orderBy('last_name')->get();
$members_data = [];
foreach ($members as $key => $member) {
$data = [
'id' => $member->id,
'member' => $member->role_id == 4 ? $member->full_name ." ".($member->company != null ? "({$member->company->brand_name})" : '') : "{$member->full_name} - {$member->role->name}",
'email' => $member->email,
'avatar' => $member->avatar,
'role_id' => $member->role->id
];
array_push($members_data,$data);
}
return collect($members_data);
}
public function find($id)
{
return User::with('wallet_balances', 'orders', 'customerAddresses', 'creditPoints', 'subscriptions','company','additionalContacts')->findOrFail($id);
}
public function store($data){
$user = User::create([
'first_name' => $data->first_name,
'last_name' => $data->last_name,
'username' => $data->email,
'email' => $data->email,
'verify_code' => sha1(time()),
'password' => Hash::make($data->password),
'role_id' => 4,
'phone' => $data->phone,
'is_verified' => 1,
'is_active' => $data->is_active,
'currency_id' => app('general_setting')->currency,
'lang_code' => app('general_setting')->language_code,
'currency_code' => app('general_setting')->currency_code,
'referrer_id' => $data->referrer_id,
]);
//lets save the company details
$user->wti_data = json_encode($data->only('storefront', 'company_name', 'brand_name', 'accounts_payable_name', 'accounts_payable_email', 'marketing_contact_name', 'marketing_contact_email', 'company_address'));
$user->save();
// User Notification Setting Create
(new UserNotificationSetting)->createForRegisterUser($user->id);
$this->typeId = EmailTemplateType::where('type', 'register_email_template')->first()->id; //register email templete typeid
$this->notificationSend("Register", $user->id);
if ($data->has('referral_code')) {
$referralData = ReferralCodeSetup::first();
$referralExist = ReferralCode::where('referral_code', $data->referral_code)->first();
if ($referralExist) {
$referralExist->update(['total_used' => $referralExist->total_used + 1]);
ReferralUse::create([
'user_id' => $user->id,
'referral_code' => $data->referral_code,
'discount_amount' => $referralData->amount
]);
}
}
return $user;
}
public function update($data, $id){
$user = User::find($id);
$user->update([
'first_name' => $data->first_name,
'last_name' => $data->last_name,
'email' => $data->email,
'phone' => $data->phone,
'password' => $data->password != null ? Hash::make($data->password) : $user->password,
'is_active' => $data->has('is_active') ? $data->is_active : $user->is_active,
'referrer_id' => $data->referrer_id,
]);
//lets update the company details
$user->wti_data = json_encode($data->only('storefront', 'company_name', 'brand_name', 'accounts_payable_name', 'accounts_payable_email', 'marketing_contact_name', 'marketing_contact_email', 'company_address'));
$user->save();
return $user;
}
public function contact($data, $id){
$user = User::find($id);
if($user){
return $this->sendContactCustomer($user,$data);
}
return false;
}
public function transfer($data, $id){
$transfer_from = User::find($id);
if($transfer_from){
$transfer_to = User::find($data->transfer_to);
if($transfer_to){
$total_subscription_credits = JobRequest::whereIn('id',$data['jobs'])->where('client_id',$transfer_from->id)->where('credit_type','subscription')->sum('credits');
$total_alacarte_credits = JobRequest::whereIn('id',$data['jobs'])->where('client_id',$transfer_from->id)->where('credit_type','alacarte')->sum('credits');
$from_credits = (new CustomerService())->credits($transfer_from->id);
$user_credits_history = new UserCreditHistory;
$user_credits_history->user_id = $transfer_from->id;
$user_credits_history->subscription_credits_from = $data['transfer_credits'] ? $total_subscription_credits + $from_credits['total_available_credits']['subscription'] : $total_subscription_credits;
$user_credits_history->subscription_credits_to = 0;
$user_credits_history->alacarte_credits_from = $data['transfer_credits'] ? $total_alacarte_credits + $from_credits['total_available_credits']['alacarte'] : $total_alacarte_credits;
$user_credits_history->alacarte_credits_to = 0;
$user_credits_history->details = 'Credits transferred to '.$transfer_to->full_name.' ('.$transfer_to->email.')';
$user_credits_history->save();
$to_credits = (new CustomerService())->credits($transfer_to->id);
$user_credits_history = new UserCreditHistory;
$user_credits_history->user_id = $transfer_to->id;
$user_credits_history->subscription_credits_from = $to_credits['total_available_credits']['subscription'];
$user_credits_history->subscription_credits_to = $to_credits['total_available_credits']['subscription'] + ($data['transfer_credits'] ? $total_subscription_credits + $from_credits['total_available_credits']['subscription'] : $total_subscription_credits);
$user_credits_history->alacarte_credits_from = $to_credits['total_available_credits']['alacarte'];
$user_credits_history->alacarte_credits_to = $to_credits['total_available_credits']['alacarte'] + ($data['transfer_credits'] ? $total_alacarte_credits + $from_credits['total_available_credits']['alacarte'] : $total_alacarte_credits);
$user_credits_history->details = 'Credits transferred from '.$transfer_from->full_name.' ('.$transfer_from->email.')';
$user_credits_history->save();
UserCredit::where('user_id',$transfer_to->id)->increment('subscription_credits',$data['transfer_credits'] ? $total_subscription_credits + $from_credits['total_available_credits']['subscription'] : $total_subscription_credits);
UserCredit::where('user_id',$transfer_to->id)->increment('alacarte_credits',$data['transfer_credits'] ? $total_alacarte_credits + $from_credits['total_available_credits']['alacarte'] : $total_alacarte_credits);
UserCredit::where('user_id',$transfer_from->id)->decrement('subscription_credits',$data['transfer_credits'] ? $total_subscription_credits + $from_credits['total_available_credits']['subscription'] : $total_subscription_credits);
UserCredit::where('user_id',$transfer_from->id)->decrement('alacarte_credits', $data['transfer_credits'] ? $total_alacarte_credits + $from_credits['total_available_credits']['alacarte'] : $total_alacarte_credits);
$job_requests = JobRequest::with('category')->whereIn('id',$data['jobs'])->where('client_id',$transfer_from->id)->where('status','publish')->orderBy('id')->get();
foreach ($job_requests as $key => $job_request) {
$to_credits = (new CustomerService())->credits($transfer_to->id);
$user_credits_history = new UserCreditHistory;
$user_credits_history->user_id = $transfer_to->id;
$user_credits_history->subscription_credits_from = $to_credits['total_available_credits']['subscription'];
$user_credits_history->subscription_credits_to = $job_request->credit_type == 'subscription' ? $to_credits['total_available_credits']['subscription'] - (int)$job_request->credits : $to_credits['total_available_credits']['subscription'];
$user_credits_history->alacarte_credits_from = $to_credits['total_available_credits']['alacarte'];
$user_credits_history->alacarte_credits_to = $job_request->credit_type == 'alacarte' ? $to_credits['total_available_credits']['alacarte'] - (int)$job_request->credits : $to_credits['total_available_credits']['alacarte'];
$user_credits_history->details = 'Transferred Job ID: <b>'.$job_request->id.'</b> ('.$job_request->category->label.') '.Carbon::parse($job_request->created_at)->format('M j, Y, g:i A');
$user_credits_history->save();
$job_request->client_id = $transfer_to->id;
$job_request->save();
}
TransferAccountHistory::create([
'transfer_by' => auth()->user()->id,
'transfer_from' => $transfer_from->id,
'transfer_to' => $transfer_to->id
]);
return true;
}
}
return false;
}
public function destroy($id){
$customer = User::find($id);
$customer_orders = Order::where('customer_id',$id)->pluck('id');
$wallet = WalletBalance::where('user_id', $id)->pluck('id');
if($customer_orders->count() || $wallet->count()){
return false;
}
$addresses = $customer->customerAddresses->pluck('id');
CustomerAddress::destroy($addresses);
$notifications = CustomerNotification::where('customer_id', $id)->pluck('id');
CustomerNotification::destroy($notifications);
$notification_settings = UserNotificationSetting::where('user_id', $id)->pluck('id');
UserNotificationSetting::destroy($notification_settings);
$customer->delete();
return true;
}
public function BulkUploadStore($data){
Excel::import(new CustomerImport, $data['file']->store('temp'));
}
}