File: /var/www/javago-portal-updates/app/Http/Controllers/Cafe/CafeController.php
<?php
namespace App\Http\Controllers\Cafe;
use App\Actions\ChangePasswordAction;
use App\Helpers\Aws;
use App\Http\Controllers\Controller;
use App\Http\Requests\ChangePasswordRequest;
use App\Http\Requests\EditCafeHoursRequest;
use App\Http\Requests\EditCafeProfileRequest;
use App\Models\Cafe;
use App\Models\CafeFilter;
use App\Models\Order;
use App\Services\CafeService;
use App\Services\ChangePasswordService;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Stripe\Stripe;
use Stripe\Charge;
use Stripe\Customer;
class CafeController extends Controller
{
private $cafeService;
private $changePasswordService;
public function __construct()
{
$this->cafeService = new CafeService(Cafe::class);
$this->changePasswordService = new ChangePasswordService(Cafe::class);
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$data = [];
$data['cafeDetail'] = Auth::user();
$todayStart = Carbon::today()->startOfDay()->timestamp;
$todayEnd = Carbon::today()->endOfDay()->timestamp;
$data['allOrder'] = Order::where('cafe_id', Auth::user()->id)->count();
$data['todayOrder'] = Order::where('cafe_id', Auth::user()->id)->whereBetween('created_at', [$todayStart, $todayEnd])->count();
$data['allRevenue'] = Order::where('cafe_id', Auth::user()->id)->sum('total_amount');
$data['todayUser'] = Order::where('cafe_id', Auth::user()->id)->groupBy('user_id')->whereBetween('created_at', [$todayStart, $todayEnd])->count();
$data['dataUrl'] = route('cafe.order-history.data');
$data['orderHistoryUrl'] = route('cafe.order-history.index').'?view_more=true';
if(Auth::user()->profile_completed == 0 || Auth::user()->menu_completed == 0 || Auth::user()->loyalty_completed == 0 || Auth::user()->stripe_account_id == null || Auth::user()->stripe_onboarding_completed == 0 || Auth::user()->is_published == 0){
return redirect('/cafe/set-cafe-profile');
}else{
return view('cafe.dashboard', $data);
}
}
//set cafe profile
public function set_cafe_profile()
{
$data = [];
$data['cafe_name'] = Auth::user()->cafe_name;
$data['cafe_email'] = Auth::user()->email;
$data['cafe_banner_image'] = Auth::user()->banner_image ? Aws::presignedUri(Auth::user()->banner_image) : '';
$data['cafe_bio'] = Auth::user()->bio;
$data['cafe_phone'] = Auth::user()->phone;
$data['cafe_type'] = Auth::user()->cafe_type;
$data['cafe_address'] = Auth::user()->address;
$data['cafe_postcode'] = Auth::user()->postcode;
$data['cafe_website'] = Auth::user()->website;
$data['cafe_latitude'] = Auth::user()->latitude;
$data['cafe_longitude'] = Auth::user()->longitude;
$data['cafe_timing'] = Auth::user()->timing;
$data['cafe_update_url'] = route('cafe.updateProfile');
$data['cafecancelUrl'] = route('cafe.myProfile');
$data['cafeeditHoursUrl'] = route('cafe.editCafeHours');
$data['cafesetHoursUrl'] = route('cafe.updateCafeHours');
$data['cafeurlGoogleAPI'] = config('geocode.API_URI');
$data['CafeFilter'] = CafeFilter::where([['name', '!=', 'All'], ['name', '!=', 'Favorites']])->pluck('name', 'id');
$data['cafe_filter'] = explode(', ', Auth::user()->cafe_filter);
$usercafeFilter = CafeFilter::whereIn('id', explode(', ' ,Auth::user()->cafe_filter))->pluck('name');
$data['seleted_cafe_filter'] = $usercafeFilter;
$data['cafe_types'] = [];
foreach (__('common.cafe_types') as $value) {
array_push($data['cafe_types'], $value);
}
$data['cafe_days'] = []; // Initialize 'cafe_days' as an empty array
foreach (__('common.days') as $value) {
array_push($data['cafe_days'], $value);
}
$data['cafedataUrl'] = route('cafe.order-history.data');
$data['cafe_menu_create_url'] = route('cafe.cafe-menu-item.create');
$data['cafe_menu_dataUrl'] = route('cafe.cafe-menu-item.data');
$data['cafe_menu_itemType'] = config('constants.item_type');
$data['cafe_stamp_create_url'] = route('cafe.manage-loyalty-stamp.create');
$data['cafe_stamp_dataUrl'] = route('cafe.manage-loyalty-stamp.data');
$data['cafe_edit_profileurl'] = route('cafe.editProfile');
$data['cafe_profile_completed'] =Auth::user()->profile_completed;
$data['cafe_menu_completed'] =Auth::user()->menu_completed;
$data['cafe_loyalty_completed'] =Auth::user()->loyalty_completed;
$data['transaction_id'] =Auth::user()->transaction_id;
$data['is_published'] =Auth::user()->is_published;
return view('cafe.set-cafe-profile', $data); // Make sure this view exists
}
public function myProfile()
{
$data = [];
$data['name'] = Auth::user()->cafe_name;
$data['email'] = Auth::user()->email;
$data['banner_image'] = Auth::user()->banner_image ? Aws::presignedUri(Auth::user()->banner_image) : '';
$data['bio'] = Auth::user()->bio;
$data['phone'] = Auth::user()->phone;
$data['cafe_type'] = Auth::user()->cafe_type;
$data['address'] = Auth::user()->address;
$data['postcode'] = Auth::user()->postcode;
$data['website'] = Auth::user()->website;
$data['url'] = route('cafe.editProfile');
$data['timing'] = Auth::user()->timing;
$cafeFilter = CafeFilter::whereIn('id', explode(', ' ,Auth::user()->cafe_filter))->pluck('name');
$data['cafe_filter'] = $cafeFilter;
$data['days'] = [];
foreach (__('common.days') as $value) {
array_push($data['days'], $value);
}
return view('cafe.profile', $data);
}
public function editProfile()
{
$data = [];
$data['name'] = Auth::user()->cafe_name;
$data['email'] = Auth::user()->email;
$data['banner_image'] = Auth::user()->banner_image ? Aws::presignedUri(Auth::user()->banner_image) : '';
$data['bio'] = Auth::user()->bio;
$data['phone'] = Auth::user()->phone;
$data['cafe_type'] = Auth::user()->cafe_type;
$data['address'] = Auth::user()->address;
$data['postcode'] = Auth::user()->postcode;
$data['website'] = Auth::user()->website;
$data['latitude'] = Auth::user()->latitude;
$data['longitude'] = Auth::user()->longitude;
$data['timing'] = Auth::user()->timing;
$data['url'] = route('cafe.updateProfile');
$data['cancelUrl'] = route('cafe.myProfile');
$data['editHoursUrl'] = route('cafe.editCafeHours');
$data['setHoursUrl'] = route('cafe.updateCafeHours');
$data['urlGoogleAPI'] = config('geocode.API_URI');
$data['CafeFilter'] = CafeFilter::where([['name', '!=', 'All'], ['name', '!=', 'Favorites']])->pluck('name', 'id');
$data['cafe_filter'] = explode(', ', Auth::user()->cafe_filter);
$data['types'] = [];
foreach (__('common.cafe_types') as $value) {
array_push($data['types'], $value);
}
$data['days'] = [];
foreach (__('common.days') as $value) {
array_push($data['days'], $value);
}
return view('cafe.edit-profile', $data);
}
public function updateProfile(EditCafeProfileRequest $request)
{
return $this->cafeService->updateProfile($request);
}
//save transaction id
public function updateTransactionId(Request $request)
{
// Validate the request fields
$request->validate([
'stripeToken' => 'required',
'stripeEmail' => 'required|email',
'amount' => 'required|numeric|min:1',
]);
// Set your Stripe secret key
Stripe::setApiKey('sk_test_51QEnSAQc61PBzjGtZ3vVXK2c9ba9nzx9TMc8Sh03Naab5MXA9BxgOQ8WSPswmGhGx8DWDeN5GNrE4BFQCifP4lUS00Vstnqxq4');
// Get the payment token and other details from the request
$token = $request->input('stripeToken');
$email = $request->input('stripeEmail');
$amount = $request->input('amount');
DB::beginTransaction(); // Start a transaction
try {
// Create a charge with the Stripe API
$charge = Charge::create([
'amount' => $amount,
'currency' => 'usd',
'source' => $token,
'receipt_email' => $email,
]);
// Check if the charge was successful
if ($charge->status === 'succeeded') {
$cafe = Auth::user();
$cafe->update(['transaction_id' => $charge->id]);
// Check if the Stripe customer ID exists
if (empty($cafe->stripe_customer_id)) {
// Create a new customer in Stripe
$customer = Customer::create([
'email' => $cafe->email,
]);
$cafe->update(['stripe_customer_id' => $customer->id]);
}
if (empty($cafe->stripe_account_id)) {
// Create a new connected account in Stripe
$account = \Stripe\Account::create([
'type' => 'express',
'country' => 'US',
'email' => $cafe->email,
]);
// Save the Stripe account ID to your database
$cafe->update(['stripe_account_id' => $account->id]);
}
// if (!empty($cafe->stripe_account_id)) { // Make sure you have the connected account ID
// // Create a transfer to the cafe's connected account
// \Stripe\Transfer::create([
// 'amount' => $amount, // Send the full amount or a percentage as needed
// 'currency' => 'usd',
// 'destination' => $cafe->stripe_account_id,
// 'description' => 'Payment for order',
// ]);
// }
DB::commit(); // Commit the transaction
return response()->json(['status' => 'success', 'message' => 'Payment successful'], 200);
} else {
return response()->json(['status' => 'error', 'message' => 'Payment failed'], 400);
}
} catch (\Exception $e) {
DB::rollBack(); // Roll back the transaction on error
\Log::error('Stripe Payment Error: ' . $e->getMessage());
return response()->json(['status' => 'error', 'message' => 'Payment failed: ' . $e->getMessage()], 400);
}
}
public function updatePublishingStatus(Request $request){
try {
$cafe = Auth::user();
$cafe->update(['is_published' => 1 , 'stripe_onboarding_completed' => 1]);
//DB::commit();
return response()->json([
'status' => 'success',
'message' => 'Cafe published successfully!',
'cafe' => $cafe->only(['id', 'name', 'is_published']) // Adjust fields as needed
], 200);
} catch (\Exception $e) {
return response()->json(['status' => 'error', 'message' => 'error updating publishing status'], 400);
}
}
public function editCafeHours()
{
$data = [];
$data['timing'] = Auth::user()->timing;
$data['setHoursUrl'] = route('cafe.updateCafeHours');
$data['days'] = [];
foreach (__('common.days') as $value) {
array_push($data['days'], $value);
}
$modelView = view('cafe.set-cafe-hours', $data)->render();
return response()->json([
'status' => 200,
'data' => $modelView,
]);
// return response()->json([
// 'status' => 404,
// 'data' => '',
// ]);
}
public function updateCafeHours(EditCafeHoursRequest $request)
{
return $this->cafeService->updateCafeHours($request);
}
public function changePasswordForm()
{
$url = route('cafe.changePassword');
return view('change-password', compact('url'));
}
public function changePassword(ChangePasswordRequest $request, ChangePasswordAction $changePasswordAction)
{
return $changePasswordAction->handle(Cafe::class, $request);
// return $this->changePasswordService->changePassword($request);
}
public function termsAndConditions()
{
return view('terms-and-conditions');
}
public function privacyPolicy()
{
return view('privacy-policy');
}
public function FAQs()
{
return view('FAQs');
}
public function aboutUs()
{
return view('about-us');
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}