HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux ip-10-0-8-47 6.8.0-1021-aws #23~22.04.1-Ubuntu SMP Tue Dec 10 16:31:58 UTC 2024 aarch64
User: ubuntu (1000)
PHP: 8.1.2-1ubuntu2.22
Disabled: NONE
Upload Files
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)
    {
        //
    }

    
}