'.$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' : '';
return '
'.trans("texts.$types").'
';
});
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 = '';
// 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';
}
}
if ($status) {
$str .= $status;
}
return $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('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'
);
}
}