'.$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' : ''; $str = '
  • '.trans("texts.new_$type").'
  • '; } if ($type == ENTITY_INVOICE) { if(!empty($items))$items[] = '
  • '; $items[] = '
  • '.trans("texts.recurring_invoices").'
  • '; if(Invoice::canCreate())$items[] = '
  • '.trans("texts.new_recurring_invoice").'
  • '; if (Auth::user()->isPro()) { $items[] = '
  • '; $items[] = '
  • '.trans("texts.quotes").'
  • '; if(Invoice::canCreate())$items[] = '
  • '.trans("texts.new_quote").'
  • '; } } else if ($type == ENTITY_CLIENT) { if(!empty($items))$items[] = '
  • '; $items[] = '
  • '.trans("texts.credits").'
  • '; if(Credit::canCreate())$items[] = '
  • '.trans("texts.new_credit").'
  • '; } else if ($type == ENTITY_EXPENSE) { if(!empty($items))$items[] = '
  • '; $items[] = '
  • '.trans("texts.vendors").'
  • '; if(Vendor::canCreate())$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 = ''; }); 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' ); } }