Files
wticreatorstudio/Modules/Customer/Http/Controllers/CustomerAccountController.php
T
Leonard Biano 0efe4f002c Customer Module Update
Company profile with additional contacts and customer notes
2024-07-04 19:20:44 +08:00

266 lines
8.6 KiB
PHP

<?php
namespace Modules\Customer\Http\Controllers;
use App\Models\Order;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Customer\Http\Requests\ProfileRequest;
use Modules\Customer\Http\Requests\CreateAddressRequest;
use Modules\Customer\Http\Requests\UpdateProfileRequest;
use Modules\Customer\Http\Requests\UpdateCompanyInfoRequest;
use Modules\Customer\Entities\CustomerAddress;
use Modules\Customer\Rules\MatchOldPassword;
use App\Models\User;
use Illuminate\Support\Facades\Hash;
use App\Traits\ImageStore;
use Illuminate\Support\Facades\File;
use Modules\Customer\Services\CustomerService;
use App\Repositories\UserRepository;
use Brian2694\Toastr\Facades\Toastr;
use Modules\Setup\Entities\Country;
use Exception;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
use Modules\UserActivityLog\Traits\LogActivity;
use Yajra\DataTables\Facades\DataTables;
use Modules\Subscription\Entities\UserCredit;
use Modules\Customer\Services\AugmentationService;
use Illuminate\Support\Facades\URL;
use Modules\WTIALaCarte\Entities\AlacarteOrder;
use Modules\Customer\Entities\UserCompany;
use Modules\Customer\Entities\UserAdditionalContact;
use App\Traits\SendMail;
use Illuminate\Support\Facades\Cache;
class CustomerAccountController extends Controller
{
use ImageStore, SendMail;
protected $customerService;
public function __construct(CustomerService $customerService){
$this->customerService = $customerService;
}
public function account()
{
$customer = auth()->user()->load(['company','additionalContacts']);
$orders = AlacarteOrder::with(['user','items.product'])->where('user_id',$customer->id)->latest()->get();
return view('customer::account')->with('customer',$customer)->with('orders',$orders);
}
public function updateProfile(UpdateProfileRequest $request)
{
try {
$customer = auth()->user();
$customer->first_name = $request->first_name;
$customer->last_name = $request->last_name;
$customer->phone = $request->phone;
$customer->date_of_birth = $request->date_of_birth;
$customer->description = $request->description;
$file = $request->file('avatar');
if ($request->hasFile('avatar')) {
$this->deleteImage($customer->avatar);
$customer->avatar= $this->saveAvatar($file,200,200);
}
$customer->save();
return response()->json([
'message' => 'Profile Updated Successfully.'
]);
} catch(Exception $e){
return response()->json([
'message' => $e->getMessage()
], 500);
}
}
public function updateCompanyInfo(UpdateCompanyInfoRequest $request)
{
try {
$customer = auth()->user();
$company = UserCompany::updateOrCreate(
[
'user_id' => $customer->id,
],
[
'company_name' => $request->company_name,
'brand_name' => $request->brand_name,
'storefront' => $request->storefront,
'company_address' => $request->company_address,
'accounts_payable_name' => $request->accounts_payable_name,
'accounts_payable_email' => $request->accounts_payable_email,
'marketing_contact_name' => $request->marketing_contact_name,
]
);
$updates = [];
if (Cache::has(auth()->user()->id.'_company_info_updates')) {
$updates = json_decode(Cache::pull(auth()->user()->id.'_company_info_updates'));
}
foreach ($request->additional_contacts as $key => $additional_contact) {
$contact = UserAdditionalContact::updateOrCreate(
[
'id' => $additional_contact['id'] ?? null
],
[
'user_id' => $customer->id,
'name' => $additional_contact['name'],
'email' => $additional_contact['email'],
'position' => $additional_contact['position'],
]
);
if(!$contact->wasRecentlyCreated && $contact->wasChanged()){
$changes = \Arr::except($contact->getChanges(), ['updated_at']);
foreach($changes as $attr => $value){
$updates[] = "Updated Additional Contact ".str_replace(' ', '_', $attr)." to <b>". $value."</b>";
}
}
if($contact->wasRecentlyCreated){
$updates[] = "Added Additional Contact with Name: <b>". $contact->name."</b>, Email: <b>". $contact->email."</b> and Position: <b>".$contact->position."</b>";
}
}
$contactsId = collect($request->additional_contacts)->pluck('id')->toArray();
$customer->additionalContacts()
->whereNotIn('id', $contactsId)
->delete();
if(count($updates) > 0){
$changes = '';
$changes .= '<ul style="color:#55575d;font-family:Arial;font-size:13px;">';
foreach ($updates as $key => $value) {
$changes .= '<li>'.$value.'</li>';
}
$changes .= '</ul>';
$this->sendCompanyUpdates($customer->name,$customer->email,$changes);
}
return response()->json([
'additional_contacts' => $customer->additionalContacts()->get(),
'message' => 'Company Information Updated Successfully.'
]);
} catch(Exception $e){
return response()->json([
'message' => $e->getMessage()
], 500);
}
}
public function updatePassword(Request $request)
{
try {
$request->validate([
'current_password' => 'required|string',
'password' => 'required|min:8|confirmed',
'password_confirmation' => 'required'
],
[
'password.min' => 'Minimun password length is 8!'
]);
$customer = auth()->user();
if (!Hash::check($request->current_password, $customer->password)) {
return response()->json([
'message' => 'Current password does not match.'
], 500);
}
$customer->password = Hash::make($request->password);
$customer->save();
return response()->json([
'message' => 'Password Change Successfully.'
]);
} catch(Exception $e){
return response()->json([
'message' => $e->getMessage()
], 500);
}
}
public function updateEmail(Request $request)
{
try {
$customer = auth()->user();
$request->validate([
'email' => 'required|string|email|max:255|unique:users,email,'.$customer->id
]);
$action_link = URL::temporarySignedRoute('customer.account.update-email-verify', 60 * 60, [
'user' => encrypt($customer->id),
'email' => $request->email
]);
$this->sendChangeEmailVerification($request->email, $action_link);
return response()->json([
'message' => 'Please check your email for a verification link to activate your new email adddress.'
]);
} catch(Exception $e){
return response()->json([
'message' => $e->getMessage()
], 500);
}
}
public function verifyUpdateEmail(Request $request)
{
try {
if (!$request->hasValidSignature()) {
abort(403);
}
$customer = auth()->user();
if($customer->id == decrypt($request->user)){
$this->sendChangeEmailNotification($customer->email, $request->email);
$customer->email = $request->email;
$customer->save();
Toastr::success('New Email Successfully Verified', __('common.success'));
return redirect()->to('/account');
} else {
abort(403);
}
} catch(Exception $e){
return response()->json([
'message' => $e->getMessage()
], 500);
}
}
}