app/Http/Controllers/ContactController.php
<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Repositories\ContactRepositoryEloquent;
use App\Entities\Contact;
use Log;
use Lang;
use Prettus\Validator\Exceptions\ValidatorException;
use Illuminate\Support\Facades\Auth;
use App\Repositories\CompanyRepositoryEloquent;
use App\Repositories\TypeRepositoryEloquent;
use Alientronics\FleetanyWebAttributes\Repositories\AttributeRepositoryEloquent;

class ContactController extends Controller
{

    protected $contactRepo;
    
    protected $fields = [
        'id',
        'name',
        'contact-type',
        'city'
    ];
    
    public function __construct(ContactRepositoryEloquent $contactRepo)
    {
        parent::__construct();
        
        $this->middleware('auth');
        $this->contactRepo = $contactRepo;
    }

    public function index()
    {
        $filters = $this->helper->getFilters($this->request->all(), $this->fields, $this->request);
        
        $contacts = $this->contactRepo->results($filters);
                
        return view("contact.index", compact('contacts', 'filters'));
    }
    
    public function create()
    {
        $contact = new Contact();
        $company_id = CompanyRepositoryEloquent::getCompanies();
        $contact_type_id = TypeRepositoryEloquent::getTypes('contact');
        $typedialog = TypeRepositoryEloquent::getDialogStoreOptions('contact');
        $driver_profile = [];
        
        $attributes = [];
        if (config('app.attributes_api_url') != null) {
            $attributes = AttributeRepositoryEloquent::getAttributes('contact');
        }
        
        return view("contact.edit", compact(
            'contact',
            'contact_type_id',
            'typedialog',
            'company_id',
            'driver_profile',
            'attributes'
        ));
    }

    public function store()
    {
        try {
            $this->contactRepo->validator();
            $inputs = $this->contactRepo->setInputs($this->request->all());
            $inputs['entity_id'] = $this->contactRepo->create($inputs)->id;
            if (config('app.attributes_api_url') != null) {
                AttributeRepositoryEloquent::setValues($inputs);
            }
            return $this->redirect->to('contact')->with('message', Lang::get(
                'general.succefullcreate',
                ['table'=> Lang::get('general.Contact')]
            ));
        } catch (ValidatorException $e) {
            return $this->redirect->back()->withInput()
                   ->with('errors', $e->getMessageBag());
        }
    }
    
    public function edit($idContact)
    {
        $contact = $this->contactRepo->find($idContact);
        $this->helper->validateRecord($contact);
        
        $company_id = CompanyRepositoryEloquent::getCompanies();
        $contact_type_id = TypeRepositoryEloquent::getTypes('contact');
        $typedialog = TypeRepositoryEloquent::getDialogStoreOptions('contact');
        
        $driver_profile = $this->contactRepo->getDriverProfile($idContact);
        
        $attributes = [];
        if (config('app.attributes_api_url') != null) {
            $attributes = AttributeRepositoryEloquent::getAttributesWithValues(
                'contact.'.$contact->type->name,
                $idContact
            );
        }
        
        return view("contact.edit", compact(
            'contact',
            'contact_type_id',
            'typedialog',
            'company_id',
            'driver_profile',
            'attributes'
        ));
    }
    
    public function update($idContact)
    {
        try {
            $contact = $this->contactRepo->find($idContact);
            $this->helper->validateRecord($contact);
            $this->contactRepo->validator();
            $inputs = $this->contactRepo->setInputs($this->request->all());
            $inputs['entity_id'] = $this->contactRepo->update($inputs, $idContact)->id;
            if (config('app.attributes_api_url') != null) {
                AttributeRepositoryEloquent::setValues($inputs);
            }
            return $this->redirect->to('contact')->with('message', Lang::get(
                'general.succefullupdate',
                ['table'=> Lang::get('general.Contact')]
            ));
            ;
        } catch (ValidatorException $e) {
            return $this->redirect->back()->withInput()
                    ->with('errors', $e->getMessageBag());
        }
    }
    
    public function destroy($idContact)
    {
        $hasReferences = $this->contactRepo->hasReferences($idContact);
        $contact = $this->contactRepo->find($idContact);
        if ($contact && !$hasReferences) {
            $this->helper->validateRecord($contact);
            Log::info('Delete field: '.$idContact);
            $this->contactRepo->delete($idContact);
            return $this->redirect->to('contact')->with('message', Lang::get("general.deletedregister"));
        } elseif ($hasReferences) {
            return $this->redirect->to('contact')->with('message', Lang::get("general.deletedregisterhasreferences"));
        } else {
            return $this->redirect->to('contact')->with('message', Lang::get("general.deletedregistererror"));
        }
    }
}
