279 lines
9.3 KiB
PHP
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 ');
|
|
}
|
|
}
|