timegridio/timegrid

View on GitHub
app/Http/Controllers/Manager/BusinessServiceController.php

Summary

Maintainability
A
0 mins
Test Coverage
A
96%
<?php

namespace App\Http\Controllers\Manager;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Timegridio\Concierge\Models\Business;
use Timegridio\Concierge\Models\Service;

class BusinessServiceController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index(Business $business)
    {
        logger()->info(__METHOD__);
        logger()->info(sprintf('businessId:%s', $business->id));

        $this->authorize('manageServices', $business);

        // BEGIN

        return view('manager.businesses.services.index', compact('business'));
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return Response
     */
    public function create(Business $business)
    {
        logger()->info(__METHOD__);
        logger()->info(sprintf('businessId:%s', $business->id));

        if ($business->services()->count() > plan('limits.services', $business->plan)) {
            flash()->warning(trans('app.saas.plan_limit_reached'));

            return redirect()->back();
        }

        $this->authorize('manageServices', $business);

        // BEGIN

        $types = $business->servicetypes->pluck('name', 'id');

        $service = new Service([
            'duration' => $business->pref('service_default_duration'),
        ]); // For Form Model Binding
        return view('manager.businesses.services.create', compact('business', 'service', 'types'));
    }

    /**
     * Store a newly created resource in storage.
     *
     * @return Response
     */
    public function store(Business $business, Request $request)
    {
        logger()->info(__METHOD__);
        logger()->info(sprintf('businessId:%s', $business->id));

        $this->authorize('manageServices', $business);

        // BEGIN

        //////////////////
        // FOR REFACTOR //
        //////////////////

        $service = Service::firstOrNew($request->except('_token'));

        $service->business()->associate($business->id);

        if ($request->get('type_id')) {
            $service->type()->associate($request->get('type_id'));
        }

        $service->save();

        logger()->info("Stored serviceId:{$service->id}");

        flash()->success(trans('manager.service.msg.store.success'));

        return redirect()->route('manager.business.service.show', [$business, $service]);
    }

    /**
     * Display the specified resource.
     *
     * @param Business $business Business to show service of
     * @param Service  $service  Service to show
     *
     * @return Response
     */
    public function show(Business $business, Service $service)
    {
        logger()->info(__METHOD__);
        logger()->info(sprintf('businessId:%s serviceId:%s', $business->id, $service->id));

        $this->authorize('manageServices', $business);

        // BEGIN

        return view('manager.businesses.services.show', compact('service'));
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param Business $business Business to edit service of
     * @param Service  $service  Service to edit
     *
     * @return Response
     */
    public function edit(Business $business, Service $service)
    {
        logger()->info(__METHOD__);
        logger()->info(sprintf('businessId:%s serviceId:%s', $business->id, $service->id));

        $this->authorize('manageServices', $business);

        // BEGIN

        $types = $business->servicetypes->pluck('name', 'id');

        return view('manager.businesses.services.edit', compact('service', 'types'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param Business $business Business to update service of
     * @param Service  $service  Service to update
     *
     * @return Response
     */
    public function update(Business $business, Service $service, Request $request)
    {
        logger()->info(__METHOD__);
        logger()->info(sprintf('businessId:%s serviceId:%s', $business->id, $service->id));

        $this->authorize('manageServices', $business);

        // BEGIN

        //////////////////
        // FOR REFACTOR //
        //////////////////
        $service->update($request->only([
            'name',
            'color',
            'duration',
            'description',
            'prerequisites',
        ]));

        if ($request->get('type_id')) {
            $service->type()->associate($request->get('type_id'));
            $service->save();
        }

        flash()->success(trans('manager.business.service.msg.update.success'));

        return redirect()->route('manager.business.service.show', [$business, $service]);
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param Business $business Business to destroy service of
     * @param Service  $service  Service to destroy
     *
     * @return Response
     */
    public function destroy(Business $business, Service $service)
    {
        logger()->info(__METHOD__);
        logger()->info(sprintf('businessId:%s serviceId:%s', $business->id, $service->id));

        $this->authorize('manageServices', $business);

        // BEGIN

        //////////////////
        // FOR REFACTOR //
        //////////////////

        $service->forceDelete();

        flash()->success(trans('manager.services.msg.destroy.success'));

        return redirect()->route('manager.business.service.index', $business);
    }
}