2013-12-07 21:33:07 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
class Utils
|
|
|
|
{
|
2014-04-13 10:19:10 +02:00
|
|
|
public static function isRegistered()
|
|
|
|
{
|
|
|
|
return Auth::check() && Auth::user()->registered;
|
|
|
|
}
|
|
|
|
|
2014-04-23 15:02:24 +02:00
|
|
|
public static function isConfirmed()
|
|
|
|
{
|
|
|
|
return Auth::check() && Auth::user()->confirmed;
|
|
|
|
}
|
|
|
|
|
2014-03-19 00:28:43 +01:00
|
|
|
public static function isProd()
|
|
|
|
{
|
|
|
|
return App::environment() == ENV_PRODUCTION;
|
2014-04-03 23:12:38 +02:00
|
|
|
}
|
|
|
|
|
2014-04-18 10:57:31 +02:00
|
|
|
public static function isNinja()
|
|
|
|
{
|
|
|
|
return self::isNinjaProd() || self::isNinjaDev();
|
|
|
|
}
|
|
|
|
|
2014-04-03 23:12:38 +02:00
|
|
|
public static function isNinjaProd()
|
|
|
|
{
|
|
|
|
return $_SERVER['SERVER_NAME'] == 'www.invoiceninja.com';
|
2014-03-19 00:28:43 +01:00
|
|
|
}
|
|
|
|
|
2014-04-17 16:48:56 +02:00
|
|
|
public static function isNinjaDev()
|
|
|
|
{
|
|
|
|
return isset($_ENV['NINJA_DEV']) && $_ENV['NINJA_DEV'];
|
|
|
|
}
|
|
|
|
|
2014-04-18 10:57:31 +02:00
|
|
|
public static function getProLabel($feature)
|
|
|
|
{
|
|
|
|
if (Auth::check()
|
|
|
|
&& !Auth::user()->isPro()
|
2014-04-29 22:46:40 +02:00
|
|
|
&& $feature == ACCOUNT_ADVANCED_SETTINGS)
|
2014-04-18 10:57:31 +02:00
|
|
|
{
|
|
|
|
return ' <sup class="pro-label">PRO</sup>';
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return '';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-03-19 00:28:43 +01:00
|
|
|
public static function basePath()
|
|
|
|
{
|
2014-03-17 19:03:43 +01:00
|
|
|
return substr($_SERVER['SCRIPT_NAME'], 0, strrpos($_SERVER['SCRIPT_NAME'], '/') + 1);
|
|
|
|
}
|
2014-03-27 13:25:31 +01:00
|
|
|
|
|
|
|
public static function trans($input)
|
|
|
|
{
|
|
|
|
$data = [];
|
|
|
|
|
|
|
|
foreach ($input as $field)
|
|
|
|
{
|
|
|
|
if ($field == "checkbox")
|
|
|
|
{
|
|
|
|
$data[] = $field;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
$data[] = trans("texts.$field");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $data;
|
|
|
|
}
|
2014-03-17 19:03:43 +01:00
|
|
|
|
2014-01-09 00:22:56 +01:00
|
|
|
public static function fatalError($message = false, $exception = false)
|
2013-12-31 20:49:54 +01:00
|
|
|
{
|
2014-01-09 00:22:56 +01:00
|
|
|
if (!$message)
|
2014-01-02 00:12:33 +01:00
|
|
|
{
|
2014-04-01 12:30:43 +02:00
|
|
|
$message = "An error occurred, please try again later.";
|
2014-01-02 00:12:33 +01:00
|
|
|
}
|
|
|
|
|
2014-01-09 00:22:56 +01:00
|
|
|
static::logError($message . ' ' . $exception);
|
2014-01-02 00:12:33 +01:00
|
|
|
|
2014-04-26 21:35:14 +02:00
|
|
|
$data = [
|
|
|
|
'showBreadcrumbs' => false
|
|
|
|
];
|
|
|
|
|
|
|
|
return View::make('error', $data)->with('error', $message);
|
2014-01-09 00:22:56 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public static function logError($error, $context = 'PHP')
|
|
|
|
{
|
|
|
|
$count = Session::get('error_count', 0);
|
|
|
|
Session::put('error_count', ++$count);
|
2014-01-09 14:44:55 +01:00
|
|
|
if ($count > 100) return 'logged';
|
2014-01-09 00:22:56 +01:00
|
|
|
|
|
|
|
$data = [
|
|
|
|
'context' => $context,
|
|
|
|
'user_id' => Auth::check() ? Auth::user()->id : 0,
|
2014-01-30 23:29:09 +01:00
|
|
|
'user_name' => Auth::check() ? Auth::user()->getDisplayName() : '',
|
2014-01-29 11:41:38 +01:00
|
|
|
'url' => Input::get('url', Request::url()),
|
2014-01-09 14:44:55 +01:00
|
|
|
'user_agent' => isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '',
|
2014-01-09 00:22:56 +01:00
|
|
|
'ip' => Request::getClientIp(),
|
2014-03-23 19:01:00 +01:00
|
|
|
'count' => Session::get('error_count', 0)
|
2014-01-09 00:22:56 +01:00
|
|
|
];
|
|
|
|
|
2014-03-23 18:54:02 +01:00
|
|
|
Log::error($error."\n", $data);
|
2014-01-09 00:22:56 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
Mail::queue('emails.error', ['message'=>$error.' '.json_encode($data)], function($message)
|
|
|
|
{
|
|
|
|
$message->to($email)->subject($subject);
|
|
|
|
});
|
|
|
|
*/
|
2013-12-31 20:49:54 +01:00
|
|
|
}
|
|
|
|
|
2014-01-14 12:52:56 +01:00
|
|
|
public static function parseFloat($value)
|
|
|
|
{
|
|
|
|
$value = preg_replace('/[^0-9\.\-]/', '', $value);
|
|
|
|
return floatval($value);
|
|
|
|
}
|
|
|
|
|
2013-12-07 21:33:07 +01:00
|
|
|
public static function formatPhoneNumber($phoneNumber)
|
|
|
|
{
|
2014-01-09 22:38:18 +01:00
|
|
|
$phoneNumber = preg_replace('/[^0-9a-zA-Z]/','',$phoneNumber);
|
2013-12-07 21:33:07 +01:00
|
|
|
|
|
|
|
if (!$phoneNumber) {
|
|
|
|
return '';
|
|
|
|
}
|
|
|
|
|
|
|
|
if(strlen($phoneNumber) > 10) {
|
|
|
|
$countryCode = substr($phoneNumber, 0, strlen($phoneNumber)-10);
|
|
|
|
$areaCode = substr($phoneNumber, -10, 3);
|
|
|
|
$nextThree = substr($phoneNumber, -7, 3);
|
|
|
|
$lastFour = substr($phoneNumber, -4, 4);
|
|
|
|
|
|
|
|
$phoneNumber = '+'.$countryCode.' ('.$areaCode.') '.$nextThree.'-'.$lastFour;
|
|
|
|
}
|
|
|
|
else if(strlen($phoneNumber) == 10) {
|
|
|
|
$areaCode = substr($phoneNumber, 0, 3);
|
|
|
|
$nextThree = substr($phoneNumber, 3, 3);
|
|
|
|
$lastFour = substr($phoneNumber, 6, 4);
|
|
|
|
|
|
|
|
$phoneNumber = '('.$areaCode.') '.$nextThree.'-'.$lastFour;
|
|
|
|
}
|
|
|
|
else if(strlen($phoneNumber) == 7) {
|
|
|
|
$nextThree = substr($phoneNumber, 0, 3);
|
|
|
|
$lastFour = substr($phoneNumber, 3, 4);
|
|
|
|
|
|
|
|
$phoneNumber = $nextThree.'-'.$lastFour;
|
|
|
|
}
|
|
|
|
|
|
|
|
return $phoneNumber;
|
|
|
|
}
|
|
|
|
|
2014-04-23 22:30:54 +02:00
|
|
|
public static function formatMoney($value, $currencyId = false)
|
2013-12-29 18:40:11 +01:00
|
|
|
{
|
2014-04-23 22:30:54 +02:00
|
|
|
if (!$currencyId)
|
|
|
|
{
|
|
|
|
$currencyId = Session::get(SESSION_CURRENCY);
|
|
|
|
}
|
|
|
|
|
2014-01-09 11:39:20 +01:00
|
|
|
$currency = Currency::remember(DEFAULT_QUERY_CACHE)->find($currencyId);
|
|
|
|
|
|
|
|
if (!$currency)
|
|
|
|
{
|
|
|
|
$currency = Currency::remember(DEFAULT_QUERY_CACHE)->find(1);
|
2013-12-29 18:40:11 +01:00
|
|
|
}
|
2014-01-09 11:39:20 +01:00
|
|
|
|
2013-12-29 18:40:11 +01:00
|
|
|
return $currency->symbol . number_format($value, $currency->precision, $currency->decimal_separator, $currency->thousand_separator);
|
|
|
|
}
|
|
|
|
|
2013-12-08 14:32:49 +01:00
|
|
|
public static function pluralize($string, $count)
|
2013-12-07 21:33:07 +01:00
|
|
|
{
|
2014-04-01 12:30:43 +02:00
|
|
|
$field = $count == 1 ? $string : $string . 's';
|
2014-04-02 15:10:00 +02:00
|
|
|
$string = trans("texts.$field", ['count' => $count]);
|
2014-04-01 12:30:43 +02:00
|
|
|
return $string;
|
2013-12-07 21:33:07 +01:00
|
|
|
}
|
|
|
|
|
2013-12-08 14:32:49 +01:00
|
|
|
public static function toArray($data)
|
2013-12-07 21:33:07 +01:00
|
|
|
{
|
|
|
|
return json_decode(json_encode((array) $data), true);
|
|
|
|
}
|
|
|
|
|
2013-12-08 14:32:49 +01:00
|
|
|
public static function toSpaceCase($camelStr)
|
2013-12-07 21:33:07 +01:00
|
|
|
{
|
|
|
|
return preg_replace('/([a-z])([A-Z])/s','$1 $2', $camelStr);
|
|
|
|
}
|
|
|
|
|
2013-12-08 14:32:49 +01:00
|
|
|
public static function timestampToDateTimeString($timestamp) {
|
2013-12-15 13:55:50 +01:00
|
|
|
$timezone = Session::get(SESSION_TIMEZONE, DEFAULT_TIMEZONE);
|
|
|
|
$format = Session::get(SESSION_DATETIME_FORMAT, DEFAULT_DATETIME_FORMAT);
|
|
|
|
return Utils::timestampToString($timestamp, $timezone, $format);
|
2013-12-07 21:33:07 +01:00
|
|
|
}
|
|
|
|
|
2013-12-08 14:32:49 +01:00
|
|
|
public static function timestampToDateString($timestamp) {
|
2013-12-15 13:55:50 +01:00
|
|
|
$timezone = Session::get(SESSION_TIMEZONE, DEFAULT_TIMEZONE);
|
|
|
|
$format = Session::get(SESSION_DATE_FORMAT, DEFAULT_DATE_FORMAT);
|
|
|
|
return Utils::timestampToString($timestamp, $timezone, $format);
|
|
|
|
}
|
|
|
|
|
2013-12-16 22:27:32 +01:00
|
|
|
public static function dateToString($date) {
|
|
|
|
$dateTime = new DateTime($date);
|
|
|
|
$timestamp = $dateTime->getTimestamp();
|
|
|
|
$format = Session::get(SESSION_DATE_FORMAT, DEFAULT_DATE_FORMAT);
|
|
|
|
return Utils::timestampToString($timestamp, false, $format);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static function timestampToString($timestamp, $timezone = false, $format)
|
2013-12-15 13:55:50 +01:00
|
|
|
{
|
2013-12-24 07:22:16 +01:00
|
|
|
if (!$timestamp) {
|
|
|
|
return '';
|
|
|
|
}
|
2013-12-16 22:27:32 +01:00
|
|
|
$date = Carbon::createFromTimeStamp($timestamp);
|
|
|
|
if ($timezone) {
|
|
|
|
$date->tz = $timezone;
|
|
|
|
}
|
2013-12-07 21:33:07 +01:00
|
|
|
if ($date->year < 1900) {
|
|
|
|
return '';
|
|
|
|
}
|
2013-12-15 13:55:50 +01:00
|
|
|
return $date->format($format);
|
2013-12-16 22:27:32 +01:00
|
|
|
}
|
2013-12-07 21:33:07 +01:00
|
|
|
|
2013-12-08 14:32:49 +01:00
|
|
|
public static function toSqlDate($date)
|
2013-12-07 21:33:07 +01:00
|
|
|
{
|
|
|
|
if (!$date)
|
|
|
|
{
|
2013-12-09 10:38:49 +01:00
|
|
|
return null;
|
2013-12-07 21:33:07 +01:00
|
|
|
}
|
|
|
|
|
2014-01-01 00:50:13 +01:00
|
|
|
$timezone = Session::get(SESSION_TIMEZONE);
|
|
|
|
$format = Session::get(SESSION_DATE_FORMAT);
|
2013-12-25 22:34:42 +01:00
|
|
|
|
2014-01-14 12:52:56 +01:00
|
|
|
return DateTime::createFromFormat($format, $date, new DateTimeZone($timezone))->format('Y-m-d');
|
2013-12-07 21:33:07 +01:00
|
|
|
}
|
|
|
|
|
2013-12-08 14:32:49 +01:00
|
|
|
public static function fromSqlDate($date)
|
2013-12-07 21:33:07 +01:00
|
|
|
{
|
|
|
|
if (!$date || $date == '0000-00-00')
|
|
|
|
{
|
|
|
|
return '';
|
|
|
|
}
|
|
|
|
|
2014-01-01 00:50:13 +01:00
|
|
|
$timezone = Session::get(SESSION_TIMEZONE);
|
|
|
|
$format = Session::get(SESSION_DATE_FORMAT);
|
2013-12-25 22:34:42 +01:00
|
|
|
|
2014-01-01 00:50:13 +01:00
|
|
|
return DateTime::createFromFormat('Y-m-d', $date, new DateTimeZone($timezone))->format($format);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static function today($formatResult = true)
|
|
|
|
{
|
|
|
|
$timezone = Session::get(SESSION_TIMEZONE);
|
|
|
|
$format = Session::get(SESSION_DATE_FORMAT);
|
|
|
|
$date = date_create(null, new DateTimeZone($timezone));
|
|
|
|
|
|
|
|
if ($formatResult)
|
|
|
|
{
|
|
|
|
return $date->format($format);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return $date;
|
|
|
|
}
|
2013-12-07 21:33:07 +01:00
|
|
|
}
|
|
|
|
|
2013-12-25 22:34:42 +01:00
|
|
|
public static function trackViewed($name, $type, $url = false)
|
2013-12-07 21:33:07 +01:00
|
|
|
{
|
2013-12-25 22:34:42 +01:00
|
|
|
if (!$url)
|
|
|
|
{
|
|
|
|
$url = Request::url();
|
|
|
|
}
|
|
|
|
|
2013-12-07 21:33:07 +01:00
|
|
|
$viewed = Session::get(RECENTLY_VIEWED);
|
|
|
|
|
|
|
|
if (!$viewed)
|
|
|
|
{
|
|
|
|
$viewed = [];
|
|
|
|
}
|
|
|
|
|
|
|
|
$object = new stdClass;
|
|
|
|
$object->url = $url;
|
|
|
|
$object->name = ucwords($type) . ': ' . $name;
|
|
|
|
|
|
|
|
for ($i=0; $i<count($viewed); $i++)
|
|
|
|
{
|
|
|
|
$item = $viewed[$i];
|
|
|
|
|
|
|
|
if ($object->url == $item->url)
|
|
|
|
{
|
|
|
|
array_splice($viewed, $i, 1);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
array_unshift($viewed, $object);
|
|
|
|
|
|
|
|
if (count($viewed) > RECENTLY_VIEWED_LIMIT)
|
|
|
|
{
|
|
|
|
array_pop($viewed);
|
|
|
|
}
|
|
|
|
|
|
|
|
Session::put(RECENTLY_VIEWED, $viewed);
|
|
|
|
}
|
|
|
|
|
2013-12-10 18:18:35 +01:00
|
|
|
public static function processVariables($str)
|
|
|
|
{
|
|
|
|
if (!$str) {
|
|
|
|
return '';
|
|
|
|
}
|
|
|
|
|
|
|
|
$variables = ['MONTH', 'QUARTER', 'YEAR'];
|
|
|
|
for ($i=0; $i<count($variables); $i++)
|
|
|
|
{
|
|
|
|
$variable = $variables[$i];
|
2013-12-11 12:11:59 +01:00
|
|
|
$regExp = '/:' . $variable . '[+-]?[\d]*/';
|
2013-12-10 18:18:35 +01:00
|
|
|
preg_match_all($regExp, $str, $matches);
|
|
|
|
$matches = $matches[0];
|
|
|
|
if (count($matches) == 0) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
foreach ($matches as $match) {
|
|
|
|
$offset = 0;
|
|
|
|
$addArray = explode('+', $match);
|
|
|
|
$minArray = explode('-', $match);
|
|
|
|
if (count($addArray) > 1) {
|
|
|
|
$offset = intval($addArray[1]);
|
|
|
|
} else if (count($minArray) > 1) {
|
|
|
|
$offset = intval($minArray[1]) * -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
$val = Utils::getDatePart($variable, $offset);
|
|
|
|
$str = str_replace($match, $val, $str);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $str;
|
|
|
|
}
|
2013-12-07 21:33:07 +01:00
|
|
|
|
2013-12-10 18:18:35 +01:00
|
|
|
private static function getDatePart($part, $offset)
|
|
|
|
{
|
|
|
|
$offset = intval($offset);
|
|
|
|
if ($part == 'MONTH') {
|
|
|
|
return Utils::getMonth($offset);
|
|
|
|
} else if ($part == 'QUARTER') {
|
|
|
|
return Utils::getQuarter($offset);
|
|
|
|
} else if ($part == 'YEAR') {
|
|
|
|
return Utils::getYear($offset);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private static function getMonth($offset)
|
|
|
|
{
|
|
|
|
$months = [ "January", "February", "March", "April", "May", "June",
|
|
|
|
"July", "August", "September", "October", "November", "December" ];
|
|
|
|
|
|
|
|
$month = intval(date('n')) - 1;
|
2014-01-09 11:05:35 +01:00
|
|
|
|
2013-12-10 18:18:35 +01:00
|
|
|
$month += $offset;
|
|
|
|
$month = $month % 12;
|
2014-01-09 11:05:35 +01:00
|
|
|
|
|
|
|
if ($month < 0)
|
|
|
|
{
|
|
|
|
$month += 12;
|
|
|
|
}
|
|
|
|
|
2013-12-10 18:18:35 +01:00
|
|
|
return $months[$month];
|
|
|
|
}
|
|
|
|
|
|
|
|
private static function getQuarter($offset)
|
|
|
|
{
|
|
|
|
$month = intval(date('n')) - 1;
|
|
|
|
$quarter = floor(($month + 3) / 3);
|
|
|
|
$quarter += $offset;
|
|
|
|
$quarter = $quarter % 4;
|
|
|
|
if ($quarter == 0) {
|
|
|
|
$quarter = 4;
|
|
|
|
}
|
|
|
|
return 'Q' . $quarter;
|
|
|
|
}
|
|
|
|
|
|
|
|
private static function getYear($offset)
|
|
|
|
{
|
|
|
|
$year = intval(date('Y'));
|
|
|
|
return $year + $offset;
|
|
|
|
}
|
2013-12-10 23:10:43 +01:00
|
|
|
|
|
|
|
public static function getEntityName($entityType)
|
|
|
|
{
|
|
|
|
return ucwords(str_replace('_', ' ', $entityType));
|
|
|
|
}
|
2013-12-11 21:33:44 +01:00
|
|
|
|
2013-12-30 21:17:45 +01:00
|
|
|
public static function getClientDisplayName($model)
|
|
|
|
{
|
|
|
|
if ($model->client_name)
|
|
|
|
{
|
|
|
|
return $model->client_name;
|
|
|
|
}
|
|
|
|
else if ($model->first_name || $model->last_name)
|
|
|
|
{
|
|
|
|
return $model->first_name . ' ' . $model->last_name;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return $model->email;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-01-08 21:09:47 +01:00
|
|
|
public static function encodeActivity($person = null, $action, $entity = null, $otherPerson = null)
|
|
|
|
{
|
2014-01-09 00:22:56 +01:00
|
|
|
$person = $person ? $person->getDisplayName() : '<i>System</i>';
|
2014-01-09 11:39:20 +01:00
|
|
|
$entity = $entity ? '[' . $entity->getActivityKey() . ']' : '';
|
2014-01-09 00:22:56 +01:00
|
|
|
$otherPerson = $otherPerson ? 'to ' . $otherPerson->getDisplayName() : '';
|
2014-01-08 21:09:47 +01:00
|
|
|
|
|
|
|
return trim("$person $action $entity $otherPerson");
|
|
|
|
}
|
|
|
|
|
|
|
|
public static function decodeActivity($message)
|
|
|
|
{
|
|
|
|
$pattern = '/\[([\w]*):([\d]*):(.*)\]/i';
|
|
|
|
preg_match($pattern, $message, $matches);
|
|
|
|
|
|
|
|
if (count($matches) > 0)
|
|
|
|
{
|
|
|
|
$match = $matches[0];
|
|
|
|
$type = $matches[1];
|
|
|
|
$publicId = $matches[2];
|
|
|
|
$name = $matches[3];
|
|
|
|
|
|
|
|
$link = link_to($type . 's/' . $publicId, $name);
|
|
|
|
$message = str_replace($match, "$type $link", $message);
|
|
|
|
}
|
|
|
|
|
|
|
|
return $message;
|
|
|
|
}
|
2013-12-07 21:33:07 +01:00
|
|
|
}
|