ldc-boutique-cnc/app/Http/Controllers/Fo/CustomerController.php
2022-11-24 15:30:22 +01:00

279 lines
9.3 KiB
PHP

<?php
namespace App\Http\Controllers\Fo;
use App\Http\Controllers\Controller;
use App\Http\Requests\Fo\Customers\ConfirmDeleteRequest;
use App\Http\Requests\Fo\Customers\UpdateEmailRequest;
use App\Http\Requests\Fo\Customers\UpdatePasswordRequest;
use App\Http\Requests\Fo\Customers\UpdateInfosRequest;
use App\Models\Customer;
use App\Models\Shop;
use App\Models\Order;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\ValidationException;
use LDC\LDCCRM\Enums\ApiError;
use LDC\LDCCRM\Exceptions\ApiErrorException;
use LDC\LDCCRM\Exceptions\CrmException;
use LDC\LDCCRM\Exceptions\ValidationException as CrmValidationException;
use LDC\LDCCRM\Models\SingleOptin;
class CustomerController extends Controller
{
// * --- Backoffice ---
/**
* profil client (mon compte)
*
* @return \Illuminate\Contracts\View\View
*/
public function dashboard()
{
// Show Profile.
/** @var \App\Models\Customer|null $customer */
$customer = Auth::guard('frontend')->user();
if (!$customer) {
abort(404);
}
/** @var \LDC\LDCCRM\Models\Customer $crmCustomer */
$crmCustomer = $customer->apiData;
/** @var object $crmInfos */
$crmInfos = \json_decode(\json_encode($crmCustomer));
return view('front.customer.dashboard', compact('customer', 'crmInfos'));
}
/**
* Show update customer informations form
*
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
*/
public function email()
{
return view('front.auth.change-email');
}
/**
* Uupdate customer email
*
* @param \App\Http\Requests\Fo\Customers\UpdateEmailRequest $request
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
*/
public function emailSubmit(UpdateEmailRequest $request)
{
/** @var \App\Models\Customer */
$customer = \auth('frontend')->user();
// FIXME:Add warning email to customer !!!
return $this->updateCrmCustomerInfo($customer, ['email' => $request->get('email')]) ?
back()->with('success', trans('Vos informations ont bien été enregistrées.')) :
back()->withInput()->withErrors(trans('Une erreur est survenue, merci de réessayer ultérieurement.'));
}
/**
* Show update customer password form
*
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
*/
public function password()
{
return view('front.auth.passwords.change');
}
/**
* Update customer password
*
* @param UpdatePasswordRequest $request
* @return \Illuminate\Http\RedirectResponse
*/
public function passwordSubmit(UpdatePasswordRequest $request)
{
/** @var \App\Models\Customer */
$customer = \auth('frontend')->user();
// FIXME:Add warning email to customer !!!
return $this->updateCrmCustomerInfo($customer, ['password' => $request->get('password')]) ?
back()->with('success', trans('Vos informations ont bien été enregistrées.')) :
back()->withInput()->withErrors(trans('Une erreur est survenue, merci de réessayer ultérieurement.'));
}
/**
* Send a request to the CRM to change the given customer's informations
* @param \App\Http\Requests\Fo\UpdateInfosRequest $request
* @return \Illuminate\Http\RedirectResponse
*/
public function updateInfos(UpdateInfosRequest $request)
{
/** @var \App\Models\Customer */
$customer = auth('frontend')->user();
return $this->updateCrmCustomerInfo($customer, $request->validated()) ?
back()->with('success', trans('Vos informations ont bien été enregistrées.')) :
back()->withInput()->withErrors(trans('Une erreur est survenue, merci de réessayer ultérieurement.'));
}
/**
* Show customer delete account page
*
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
*/
public function destroy()
{
return view('front.customer.destroy');
}
/**
* Show customer delete account page
*
* @param \App\Http\Requests\Fo\Customers\ConfirmDeleteRequest $request
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
*/
public function destroySubmit(ConfirmDeleteRequest $request)
{
if ($request->confirm) {
try {
return DB::transaction(function () {
// FIXME:Add warning email to customer !!!
/** @var \App\Models\Customer */
$customer = auth('frontend')->user();
/** @var \Ldc\LDCCRM\Models\Customer */
$crmCustomer = $customer->api_data;
$customer->deleteOrFail();
$crmCustomer->delete();
// * Force logout
auth('frontend')->logout();
return response()->redirectToRoute('home')
->with('info', trans(
// phpcs:ignore Generic.Files.LineLength.TooLong
'Votre compte à bien été supprimé, si vous avez des commandes en cours vous pouvez utiliser le formulaire de contact en cas de besoin.'
));
});
} catch (\Exception $e) {
report($e);
Session::flash('error', trans('Une erreur est survenue veuillez réssayer plus tard.'));
} //end try
} //end if
return back();
}
/**
* Updates user info
*
* @param \App\Models\Customer $customer
* @param array $data
* @return boolean
* @throws \Illuminate\Validation\ValidationException If something failed.
*/
private function updateCrmCustomerInfo(Customer $customer, array $data)
{
return DB::transaction(function () use ($customer, $data) {
try {
/** @var \LDC\LDCCRM\Models\Customer */
$crmCustomer = $customer->apiData;
if (\array_key_exists('email', $data)) {
$customer->email = $data['email'];
$customer->saveOrFail();
}
$crmCustomer->fill($data);
return $crmCustomer->save();
} catch (CrmValidationException $e) {
throw ValidationException::withMessages([
'error' => $e->getMessage()
]);
} catch (ApiErrorException $e) {
if ($e->getApiError()->equals(ApiError::validationFailed())) {
throw ValidationException::withMessages([
'error' => $e->getMessage()
]);
}
report($e);
return false;
} //end try
});
}
// * --- END Backoffice ---
/**
* affichage des commandes du customer connecté
*
* @param Request $request
* @return \Illuminate\Contracts\View\View
*
* @phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClass
*/
public function myOrders(Request $request)
{
// @phpcs:enable
$orders = Order::where('customer_id', Auth::guard('frontend')->user()->id)->orderBy('date', 'DESC')->get();
return view('front.customer.my-orders', compact('orders'));
}
/**
* Show detail commande
*
* @param string $reference
* @return \Illuminate\Contracts\View\View
*/
public function orderDetail(string $reference)
{
$order = Order::where('reference', '=', $reference)
->where('customer_id', Auth::guard('frontend')->user()->id)
->firstOrFail();
if ($order->status_id == 1) {
$shop = null;
} else {
$shop = Shop::find($order->timeslot->shop->id);
}
return view('front.customer.order-detail', compact('order', 'shop'));
}
/**
* Call the CRM to add a single optin
*
* @param Request $request
* @return \Illuminate\Contracts\View\View
*
*/
public function addOptIn(Request $request)
{
$validator = Validator::make($request->all(), ['email' => 'required|email']);
if ($validator->fails()) {
return __('L\'adresse email est incorrecte');
}
try {
SingleOptin::setStatus($request->email, true);
return trans('Votre inscription à la newsletter a été prise en compte');
} catch (ApiErrorException $e) {
// * Il y a deja un customerInfo avec optin a true pour ce customer
if ($e->getApiError()->equals(ApiError::singleOptinCustomerExists())) {
return trans('Vous êtes déjà inscrit avec cette adresse email');
}
report($e);
return trans('Une erreur est survenue, merci de réessayer ultérieurement');
} catch (CrmException $e) {
report($e);
return trans('Une erreur est survenue, merci de réessayer ultérieurement');
}
return trans('Une erreur est survenue, merci de réessayer ultérieurement ');
}
}