'.$title.''; }); Form::macro('tab_link', function($url, $text, $active = false) { $class = $active ? ' class="active"' : ''; return ''.$text.''; }); 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' : ''; $user = Auth::user(); $str = '
  • '.trans("texts.new_$type").'
  • '; } if ($type == ENTITY_INVOICE) { if(!empty($items))$items[] = '
  • '; $items[] = '
  • '.trans('texts.recurring_invoices').'
  • '; if($user->can('create', ENTITY_INVOICE))$items[] = '
  • '.trans('texts.new_recurring_invoice').'
  • '; $items[] = '
  • '; $items[] = '
  • '.trans('texts.quotes').'
  • '; if($user->can('create', ENTITY_QUOTE))$items[] = '
  • '.trans('texts.new_quote').'
  • '; } else if ($type == ENTITY_CLIENT) { if(!empty($items))$items[] = '
  • '; $items[] = '
  • '.trans('texts.credits').'
  • '; if($user->can('create', ENTITY_CREDIT))$items[] = '
  • '.trans('texts.new_credit').'
  • '; } else if ($type == ENTITY_EXPENSE) { if(!empty($items))$items[] = '
  • '; $items[] = '
  • '.trans('texts.vendors').'
  • '; if($user->can('create', ENTITY_VENDOR))$items[] = '
  • '.trans('texts.new_vendor').'
  • '; } if(!empty($items)){ $str.= ''; } $str .= ''; return $str; }); Form::macro('flatButton', function($label, $color) { return ''; }); 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 = ''; }); Form::macro('human_filesize', function($bytes, $decimals = 1) { $size = ['B','kB','MB','GB','TB','PB','EB','ZB','YB']; $factor = floor((strlen($bytes) - 1) / 3); if($factor == 0)$decimals=0;// There aren't fractional bytes return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . ' ' . @$size[$factor]; }); 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; }); } /** * Register any application services. * * This service provider is a great spot to register your various container * bindings with the application. As you can see, we are registering our * "Registrar" implementation here. You can add your own bindings too! * * @return void */ public function register() { $this->app->bind( 'Illuminate\Contracts\Auth\Registrar', 'App\Services\Registrar' ); } }