/**
  * Bootstrap any application services.
  *
  * @return void
  */
 public function boot()
 {
     Form::macro('image_data', function ($imagePath) {
         return 'data:image/jpeg;base64,' . base64_encode(file_get_contents($imagePath));
     });
     Form::macro('nav_link', function ($url, $text, $url2 = '', $extra = '') {
         $capitalize = config('former.capitalize_translations');
         $class = Request::is($url) || Request::is($url . '/*') || Request::is($url2 . '/*') ? ' class="active"' : '';
         if ($capitalize) {
             $title = ucwords(trans("texts.{$text}")) . Utils::getProLabel($text);
         } else {
             $title = trans("texts.{$text}") . Utils::getProLabel($text);
         }
         return '<li' . $class . '><a href="' . URL::to($url) . '" ' . $extra . '>' . $title . '</a></li>';
     });
     Form::macro('tab_link', function ($url, $text, $active = false) {
         $class = $active ? ' class="active"' : '';
         return '<li' . $class . '><a href="' . URL::to($url) . '" data-toggle="tab">' . $text . '</a></li>';
     });
     Form::macro('menu_link', function ($type) {
         $types = $type . 's';
         $Type = ucfirst($type);
         $Types = ucfirst($types);
         $class = (Request::is($types) || Request::is('*' . $type . '*')) && !Request::is('*settings*') ? ' active' : '';
         $str = '<li class="dropdown ' . $class . '">
                <a href="' . URL::to($types) . '" class="dropdown-toggle">' . trans("texts.{$types}") . '</a>';
         $items = [];
         if (Auth::user()->hasPermission('create_all')) {
             $items[] = '<li><a href="' . URL::to($types . '/create') . '">' . trans("texts.new_{$type}") . '</a></li>';
         }
         if ($type == ENTITY_INVOICE) {
             if (!empty($items)) {
                 $items[] = '<li class="divider"></li>';
             }
             $items[] = '<li><a href="' . URL::to('recurring_invoices') . '">' . trans("texts.recurring_invoices") . '</a></li>';
             if (Invoice::canCreate()) {
                 $items[] = '<li><a href="' . URL::to('recurring_invoices/create') . '">' . trans("texts.new_recurring_invoice") . '</a></li>';
             }
             if (Auth::user()->isPro()) {
                 $items[] = '<li class="divider"></li>';
                 $items[] = '<li><a href="' . URL::to('quotes') . '">' . trans("texts.quotes") . '</a></li>';
                 if (Invoice::canCreate()) {
                     $items[] = '<li><a href="' . URL::to('quotes/create') . '">' . trans("texts.new_quote") . '</a></li>';
                 }
             }
         } else {
             if ($type == ENTITY_CLIENT) {
                 if (!empty($items)) {
                     $items[] = '<li class="divider"></li>';
                 }
                 $items[] = '<li><a href="' . URL::to('credits') . '">' . trans("texts.credits") . '</a></li>';
                 if (Credit::canCreate()) {
                     $items[] = '<li><a href="' . URL::to('credits/create') . '">' . trans("texts.new_credit") . '</a></li>';
                 }
             } else {
                 if ($type == ENTITY_EXPENSE) {
                     if (!empty($items)) {
                         $items[] = '<li class="divider"></li>';
                     }
                     $items[] = '<li><a href="' . URL::to('vendors') . '">' . trans("texts.vendors") . '</a></li>';
                     if (Vendor::canCreate()) {
                         $items[] = '<li><a href="' . URL::to('vendors/create') . '">' . trans("texts.new_vendor") . '</a></li>';
                     }
                 }
             }
         }
         if (!empty($items)) {
             $str .= '<ul class="dropdown-menu" id="menu1">' . implode($items) . '</ul>';
         }
         $str .= '</li>';
         return $str;
     });
     Form::macro('flatButton', function ($label, $color) {
         return '<input type="button" value="' . trans("texts.{$label}") . '" style="background-color:' . $color . ';border:0 none;border-radius:5px;padding:12px 40px;margin:0 6px;cursor:hand;display:inline-block;font-size:14px;color:#fff;text-transform:none;font-weight:bold;"/>';
     });
     Form::macro('emailViewButton', function ($link = '#', $entityType = ENTITY_INVOICE) {
         return view('partials.email_button')->with(['link' => $link, 'field' => "view_{$entityType}", 'color' => '#0b4d78'])->render();
     });
     Form::macro('emailPaymentButton', function ($link = '#') {
         return view('partials.email_button')->with(['link' => $link, 'field' => 'pay_now', 'color' => '#36c157'])->render();
     });
     Form::macro('breadcrumbs', function ($status = false) {
         $str = '<ol class="breadcrumb">';
         // Get the breadcrumbs by exploding the current path.
         $basePath = Utils::basePath();
         $parts = explode('?', isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '');
         $path = $parts[0];
         if ($basePath != '/') {
             $path = str_replace($basePath, '', $path);
         }
         $crumbs = explode('/', $path);
         foreach ($crumbs as $key => $val) {
             if (is_numeric($val)) {
                 unset($crumbs[$key]);
             }
         }
         $crumbs = array_values($crumbs);
         for ($i = 0; $i < count($crumbs); $i++) {
             $crumb = trim($crumbs[$i]);
             if (!$crumb) {
                 continue;
             }
             if ($crumb == 'company') {
                 return '';
             }
             $name = trans("texts.{$crumb}");
             if ($i == count($crumbs) - 1) {
                 $str .= "<li class='active'>{$name}</li>";
             } else {
                 $str .= '<li>' . link_to($crumb, $name) . '</li>';
             }
         }
         if ($status) {
             $str .= '&nbsp;&nbsp;&nbsp;&nbsp;' . $status;
         }
         return $str . '</ol>';
     });
     Validator::extend('positive', function ($attribute, $value, $parameters) {
         return Utils::parseFloat($value) >= 0;
     });
     Validator::extend('has_credit', function ($attribute, $value, $parameters) {
         $publicClientId = $parameters[0];
         $amount = $parameters[1];
         $client = \App\Models\Client::scope($publicClientId)->firstOrFail();
         $credit = $client->getTotalCredit();
         return $credit >= $amount;
     });
     // check that the time log elements don't overlap
     Validator::extend('time_log', function ($attribute, $value, $parameters) {
         $lastTime = 0;
         $value = json_decode($value);
         array_multisort($value);
         foreach ($value as $timeLog) {
             list($startTime, $endTime) = $timeLog;
             if (!$endTime) {
                 continue;
             }
             if ($startTime < $lastTime || $startTime > $endTime) {
                 return false;
             }
             if ($endTime < min($startTime, $lastTime)) {
                 return false;
             }
             $lastTime = max($lastTime, $endTime);
         }
         return true;
     });
     Validator::extend('less_than', function ($attribute, $value, $parameters) {
         return floatval($value) <= floatval($parameters[0]);
     });
     Validator::replacer('less_than', function ($message, $attribute, $rule, $parameters) {
         return str_replace(':value', $parameters[0], $message);
     });
     Validator::extend('has_counter', function ($attribute, $value, $parameters) {
         return !$value || strstr($value, '{$counter}');
     });
     Validator::extend('valid_contacts', function ($attribute, $value, $parameters) {
         foreach ($value as $contact) {
             $validator = Validator::make($contact, ['email' => 'email|required_without:first_name', 'first_name' => 'required_without:email']);
             if ($validator->fails()) {
                 return false;
             }
         }
         return true;
     });
     Validator::extend('valid_invoice_items', function ($attribute, $value, $parameters) {
         $total = 0;
         foreach ($value as $item) {
             $qty = isset($item['qty']) ? $item['qty'] : 1;
             $cost = isset($item['cost']) ? $item['cost'] : 1;
             $total += $qty * $cost;
         }
         return $total <= MAX_INVOICE_AMOUNT;
     });
 }
 /**
  * Display the specified resource.
  *
  * @param  int      $id
  * @return Response
  */
 public function show($publicId)
 {
     $client = Client::withTrashed()->scope($publicId)->with('contacts', 'size', 'industry')->firstOrFail();
     if (!$this->checkViewPermission($client, $response)) {
         return $response;
     }
     Utils::trackViewed($client->getDisplayName(), ENTITY_CLIENT);
     $actionLinks = [];
     if (Task::canCreate()) {
         $actionLinks[] = ['label' => trans('texts.new_task'), 'url' => '/tasks/create/' . $client->public_id];
     }
     if (Utils::isPro() && Invoice::canCreate()) {
         $actionLinks[] = ['label' => trans('texts.new_quote'), 'url' => '/quotes/create/' . $client->public_id];
     }
     if (!empty($actionLinks)) {
         $actionLinks[] = \DropdownButton::DIVIDER;
     }
     if (Payment::canCreate()) {
         $actionLinks[] = ['label' => trans('texts.enter_payment'), 'url' => '/payments/create/' . $client->public_id];
     }
     if (Credit::canCreate()) {
         $actionLinks[] = ['label' => trans('texts.enter_credit'), 'url' => '/credits/create/' . $client->public_id];
     }
     if (Expense::canCreate()) {
         $actionLinks[] = ['label' => trans('texts.enter_expense'), 'url' => '/expenses/create/0/' . $client->public_id];
     }
     $data = array('actionLinks' => $actionLinks, 'showBreadcrumbs' => false, 'client' => $client, 'credit' => $client->getTotalCredit(), 'title' => trans('texts.view_client'), 'hasRecurringInvoices' => Invoice::scope()->where('is_recurring', '=', true)->whereClientId($client->id)->count() > 0, 'hasQuotes' => Invoice::scope()->where('is_quote', '=', true)->whereClientId($client->id)->count() > 0, 'hasTasks' => Task::scope()->whereClientId($client->id)->count() > 0, 'gatewayLink' => $client->getGatewayLink());
     return View::make('clients.show', $data);
 }
 protected function getDatatableActions($entityType)
 {
     return [[trans('texts.edit_client'), function ($model) {
         return URL::to("clients/{$model->public_id}/edit");
     }, function ($model) {
         return Client::canEditItem($model);
     }], ['--divider--', function () {
         return false;
     }, function ($model) {
         return Client::canEditItem($model) && (Task::canCreate() || Invoice::canCreate());
     }], [trans('texts.new_task'), function ($model) {
         return URL::to("tasks/create/{$model->public_id}");
     }, function ($model) {
         return Task::canCreate();
     }], [trans('texts.new_invoice'), function ($model) {
         return URL::to("invoices/create/{$model->public_id}");
     }, function ($model) {
         return Invoice::canCreate();
     }], [trans('texts.new_quote'), function ($model) {
         return URL::to("quotes/create/{$model->public_id}");
     }, function ($model) {
         return Auth::user()->isPro() && Invoice::canCreate();
     }], ['--divider--', function () {
         return false;
     }, function ($model) {
         return (Task::canCreate() || Invoice::canCreate()) && (Payment::canCreate() || Credit::canCreate() || Expense::canCreate());
     }], [trans('texts.enter_payment'), function ($model) {
         return URL::to("payments/create/{$model->public_id}");
     }, function ($model) {
         return Payment::canCreate();
     }], [trans('texts.enter_credit'), function ($model) {
         return URL::to("credits/create/{$model->public_id}");
     }, function ($model) {
         return Credit::canCreate();
     }], [trans('texts.enter_expense'), function ($model) {
         return URL::to("expenses/create/0/{$model->public_id}");
     }, function ($model) {
         return Expense::canCreate();
     }]];
 }