/home/mip/mip/app/Modules/ClientServiceProvider.php
<?php

namespace QxCMS\Modules;

use Illuminate\Routing\Router;
use Illuminate\Support\ServiceProvider;

class ClientServiceProvider extends ServiceProvider
{

    protected $namespace = 'QxCMS\Modules';

    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot(Router $router)
    {
        $modules = config('modules.modules');
        array_filter($modules, function($module) use ($router){
            if($module=='Client')
            {
                $this->registerModuleRoute($router, $module);
                $this->registerModuleView($module);
            }
        });

        view()->composer(['Client::dashboard.*', 'Client::layouts'], function($view){
            if (auth('client')->check())
            {
                $permissions = $this->serializePermission(auth('client')->user()->permissions);
                $view->with('userPermissions', $permissions);
            }
        });
    }

    public function serializePermission($permissions){
        $results = array();
        foreach ($permissions as $k => $permission){
            $results[$permission->menu_id] =  array(
                'can_access' => $permission->can_access,
                'can_update' => $permission->can_update,
                'can_create' => $permission->can_create,
                'can_delete' => $permission->can_delete,
                'can_export' => $permission->can_export,
                'can_import' => $permission->can_import,
                'can_print' => $permission->can_print,
            );
        }
        return $results;
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->setClientInterface();
        $this->mergeConfigFrom(
            __DIR__.'/tables.php', 'tables'
        );
        $this->mergeConfigFrom(
            config_path().'/account.php', 'account'
        );
    }

    public function registerModuleView($module)
    {
        return $this->loadViewsFrom(__DIR__."/$module/Views", $module);
    }

    public function registerModuleRoute($router, $module)
    {
        $router->group([
            'namespace' => $this->namespace.'\\'.$module.'\\'.'Controllers',
            'middleware' => 'web',
            'prefix' => strtolower($module)
        ], function ($router) use ($module) {
                require __DIR__."/$module/routes.php";
        });
    }
    
    public function setClientInterface()
    {
        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Settings\Roles\RoleRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Settings\Roles\RoleRepository::class
        );
        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Settings\Roles\PermissionRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Settings\Roles\PermissionRepository::class
        );
        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Settings\Users\UserRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Settings\Users\UserRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Principals\PrincipalRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Principals\PrincipalRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Principals\ContactPersonRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Principals\ContactPersonRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Principals\ContactNumberRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Principals\ContactNumberRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Questionnaire\TemplateRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Questionnaire\TemplateRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Questionnaire\QuestionRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Questionnaire\QuestionRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Questionnaire\AnswerRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Questionnaire\AnswerRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Subject\SubjectRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Subject\SubjectRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Officers\OfficerRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Officers\OfficerRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Directory\DirectoriesRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Directory\DirectoriesRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Directory\AffiliatesRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Directory\AffiliatesRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Directory\SpecializationsRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Directory\SpecializationsRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Directory\CitiesRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Directory\CitiesRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Directory\MunicipalitiesRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Directory\MunicipalitiesRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Directory\ProvincesRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Directory\ProvincesRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Products\ProductRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Products\ProductRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Products\ProductBrandRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Products\ProductBrandRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Products\ProductCategoryRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Products\ProductCategoryRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Posts\PostCategoryRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Posts\PostCategoryRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Posts\PostsRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Posts\PostsRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Pages\PagesRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Pages\PagesRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Participants\ParticipantRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Participants\ParticipantRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\JobOpening\JobOpeningRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\JobOpening\JobOpeningRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Pages\FAQRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Pages\FAQRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Pages\AboutUsRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Pages\AboutUsRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Pages\ContactUsRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Pages\ContactUsRepository::class
        );

        $this->app->bind(
            \QxCMS\Modules\Client\Repositories\Applicants\ApplicantRepositoryInterface::class,
            \QxCMS\Modules\Client\Repositories\Applicants\ApplicantRepository::class
        );
    }
}