Пример #1
0
 public function bulk()
 {
     $action = Input::get('action');
     $ids = Input::get('id') ? Input::get('id') : Input::get('ids');
     $count = $this->invoiceRepo->bulk($ids, $action);
     if ($count > 0) {
         $message = Utils::pluralize("{$action}d_quote", $count);
         Session::flash('message', $message);
     }
     return Redirect::to('quotes');
 }
Пример #2
0
 public function add_to_dashboard()
 {
     $post_type = get_post_type_object($this->slug);
     $num_posts = wp_count_posts($post_type->name);
     $num = number_format_i18n($num_posts->publish);
     $text = _n(Utils::pluralize($post_type->labels->singular_name), Utils::pluralize($post_type->labels->name), intval($num_posts->publish));
     if (current_user_can('edit_posts')) {
         $num = "<a href='edit.php?post_type={$post_type->name}'>{$num}</a>";
         $text = "<a href='edit.php?post_type={$post_type->name}'>{$text}</a>";
     }
     echo '<tr><td class="first b b-' . $post_type->name . '">' . $num . '</td>';
     echo '<td class="t ' . $post_type->name . '">' . $text . '</td></tr>';
 }
Пример #3
0
 /**
  * Enables the use of build|create for associations.
  *
  * @param string $method Name of method
  * @param mixed $args Method args
  * @return mixed An instance of a given {@link AbstractRelationship}
  */
 public function __call($method, $args)
 {
     //check for build|create_association methods
     if (preg_match('/(build|create)_/', $method)) {
         if (!empty($args)) {
             $args = $args[0];
         }
         $association_name = str_replace(array('build_', 'create_'), '', $method);
         $method = str_replace($association_name, 'association', $method);
         $table = static::table();
         if (($association = $table->get_relationship($association_name)) || ($association = $table->get_relationship($association_name = Utils::pluralize($association_name)))) {
             // access association to ensure that the relationship has been loaded
             // so that we do not double-up on records if we append a newly created
             $this->{$association_name};
             return $association->{$method}($this, $args);
         }
     }
     throw new ActiveRecordException("Call to undefined method: {$method}");
 }
Пример #4
0
 private function importFilei()
 {
     $data = Session::get('data');
     $map = Input::get('map');
     $count = 0;
     $hasHeaders = true;
     foreach ($data as $row) {
         if ($hasHeaders) {
             $hasHeaders = false;
             continue;
         }
         foreach ($row as $index => $value) {
             $field = $map[$index];
             $value = trim($value);
             if ($field == Invoice::$fieldCodClient) {
                 $clients = Client::scope()->get();
                 $flag = 1;
                 foreach ($clients as $client) {
                     $cod_client = intval($value);
                     if ($client->public_id == $cod_client) {
                         $flag = 1;
                     }
                 }
                 if ($flag == 0) {
                     $message = 'cliente no encontrado ' . $value . 'Favor revisar el archivo importado ';
                     Session::flash('message', $message);
                     return Redirect::to('company/import_export');
                 }
             } else {
                 if ($field == Invoice::$fieldProduct) {
                     if ($value == '') {
                         $message = 'Concepto vacío. Favor revisar el archivo importado ';
                         Session::flash('message', $message);
                         return Redirect::to('company/import_export');
                     }
                 } else {
                     if ($field == Invoice::$fieldAmount) {
                         if ($value == '') {
                             $message = 'Monto vacío. Favor revisar el archivo importado ';
                             Session::flash('message', $message);
                             return Redirect::to('company/import_export');
                         }
                     }
                 }
             }
         }
     }
     $branch_id = Input::get('branch_id');
     $clients = Client::scope()->get();
     $clientMap = [];
     $data = Session::get('data');
     Session::forget('data');
     $hasHeaders = true;
     foreach ($clients as $client) {
         $i = 0;
         $clientMap[$client->public_id][$i] = $client->id;
         $clientMap[$client->public_id][$i + 1] = $client->nit;
         $clientMap[$client->public_id][$i + 2] = $client->name;
     }
     foreach ($data as $row) {
         if ($hasHeaders) {
             $hasHeaders = false;
             continue;
         }
         $invoice = Invoice::createNew();
         $invoiceItem = InvoiceItem::createNew();
         $count++;
         $branch = \DB::table('branches')->where('id', $branch_id)->first();
         $invoice->branch_id = $branch_id;
         $invoiceNumber = $branch->invoice_number_counter;
         $invoice->invoice_number = $invoiceNumber;
         $today = new DateTime('now');
         $invoice->invoice_date = $today->format('Y-m-d');
         $invoiceDesign = \DB::table('invoice_designs')->where('account_id', \Auth::user()->account_id)->orderBy('public_id', 'desc')->first();
         $invoice->invoice_design_id = $invoiceDesign->id;
         $account = \Auth::user()->account;
         $invoice->account_name = $account->name;
         $invoice->account_nit = $account->nit;
         $invoice->branch_name = $branch->name;
         $invoice->address1 = $branch->address1;
         $invoice->address2 = $branch->address2;
         $invoice->phone = $branch->postal_code;
         $invoice->city = $branch->city;
         $invoice->state = $branch->state;
         $invoice->number_autho = $branch->number_autho;
         $invoice->deadline = $branch->deadline;
         $invoice->key_dosage = $branch->key_dosage;
         $invoice->activity_pri = $branch->activity_pri;
         $invoice->activity_sec1 = $branch->activity_sec1;
         $invoice->law = $branch->law;
         foreach ($row as $index => $value) {
             $field = $map[$index];
             $value = trim($value);
             if ($field == Invoice::$fieldCodClient) {
                 $cod_client = intval($value);
                 $invoice->client_id = $clientMap[$cod_client][0];
                 $invoice->client_nit = $clientMap[$cod_client][1];
                 $invoice->client_name = $clientMap[$cod_client][2];
             } else {
                 if ($field == Invoice::$fieldProduct) {
                     $notes = $value;
                 } else {
                     if ($field == Invoice::$fieldAmount) {
                         $invoiceItem->notes = wordwrap($notes, 70, "\n");
                         $str = str_replace(".", "", $value);
                         $amount = str_replace(",", ".", $str);
                         $invoiceItem->cost = $amount;
                         $invoiceItem->qty = 1;
                         $invoiceItem->tax_rate = 0;
                         $invoice->subtotal = $invoiceItem->cost;
                         $invoice->amount = $invoiceItem->cost;
                         $invoice->balance = $invoiceItem->cost;
                     }
                 }
             }
         }
         $invoice_dateCC = date("Ymd", strtotime($invoice->invoice_date));
         $invoice_date_limitCC = date("d/m/Y", strtotime($branch->deadline));
         require_once app_path() . '/includes/control_code.php';
         $cod_control = codigoControl($invoice->invoice_number, $invoice->client_nit, $invoice_dateCC, $invoice->amount, $branch->number_autho, $branch->key_dosage);
         $invoice->control_code = $cod_control;
         $invoice_date = date("d/m/Y", strtotime($invoice->invoice_date));
         require_once app_path() . '/includes/BarcodeQR.php';
         // $ice = $invoice->amount-$invoice->fiscal;
         $desc = $invoice->subtotal - $invoice->amount;
         $subtotal = number_format($invoice->subtotal, 2, '.', '');
         $amount = number_format($invoice->amount, 2, '.', '');
         $fiscal = number_format($invoice->fiscal, 2, '.', '');
         // $icef = number_format($ice, 2, '.', '');
         $descf = number_format($desc, 2, '.', '');
         // if($icef=="0.00"){
         //   $icef = 0;
         // }
         if ($descf == "0.00") {
             $descf = 0;
         }
         $icef = 0;
         $qr = new BarcodeQR();
         $datosqr = $invoice->account_nit . '|' . $invoice->invoice_number . '|' . $invoice->number_autho . '|' . $invoice_date . '|' . $subtotal . '|' . $amount . '|' . $invoice->control_code . '|' . $invoice->client_nit . '|' . $icef . '|0|0|' . $descf;
         $qr->text($datosqr);
         $qr->draw(150, 'qr/' . $account->account_key . '_' . $branch->name . '_' . $invoice->invoice_number . '.png');
         $input_file = 'qr/' . $account->account_key . '_' . $branch->name . '_' . $invoice->invoice_number . '.png';
         $output_file = 'qr/' . $account->account_key . '_' . $branch->name . '_' . $invoice->invoice_number . '.jpg';
         $inputqr = imagecreatefrompng($input_file);
         list($width, $height) = getimagesize($input_file);
         $output = imagecreatetruecolor($width, $height);
         $white = imagecolorallocate($output, 255, 255, 255);
         imagefilledrectangle($output, 0, 0, $width, $height, $white);
         imagecopy($output, $inputqr, 0, 0, 0, 0, $width, $height);
         imagejpeg($output, $output_file);
         $invoice->qr = HTML::image_data('qr/' . $account->account_key . '_' . $branch->name . '_' . $invoice->invoice_number . '.jpg');
         $invoice->save();
         $invoice->invoice_items()->save($invoiceItem);
         // Activity::createInvoice($invoice, false);
     }
     $message = Utils::pluralize('created_invoicei', $count);
     Session::flash('message', $message);
     return Redirect::to('invoices');
 }
Пример #5
0
if ($url['path'] == '3locales') {
    $check['extra_locale'] = $locale2;
    $searches[$locale2] = $locale3_strings;
    $data[] = $tmx_target2;
}
$search_yields_results = false;
// This will hold the components names for the search filters
$components = [];
foreach ($searches as $key => $value) {
    $search_results = ShowResults::getTMXResults(array_keys($value), $data);
    $components += Project::getComponents($search_results);
    if (count($value) > 0) {
        // We have results, we won't display search suggestions but search results
        $search_yields_results = true;
        $search_id = strtolower(str_replace('-', '', $key));
        $message_count = $real_search_results > $limit_results ? "<span class=\"results_count_{$search_id}\">{$limit_results} results</span> out of {$real_search_results}" : "<span class=\"results_count_{$search_id}\">" . Utils::pluralize(count($search_results), 'result') . '</span>';
        $output[$key] = "<h2>Displaying {$message_count} for the string " . "<span class=\"searchedTerm\">{$initial_search_decoded}</span> in {$key}:</h2>";
        $output[$key] .= ShowResults::resultsTable($search_id, $search_results, $initial_search, $source_locale, $locale, $check);
    } else {
        $output[$key] = "<h2>No matching results for the string " . "<span class=\"searchedTerm\">{$initial_search_decoded}</span>" . " for the locale {$key}</h2>";
    }
}
// Remove duplicated components
$components = array_unique($components);
// Display a search hint for the closest string we have if we have no search results
if (!$search_yields_results) {
    $merged_strings = [];
    foreach ($data as $key => $values) {
        $merged_strings = array_merge($merged_strings, array_values($values));
    }
    $best_matches = Strings::getSimilar($initial_search, $merged_strings, 3);
Пример #6
0
<?php

namespace Transvision;

// Include the common simple search form
include __DIR__ . '/simplesearchform.php';
$search_id = 'unchanged_strings';
$content = "<h2><span class=\"results_count_{$search_id}\">" . Utils::pluralize(count($unchanged_strings), 'string') . "</span> identical to English</h2>\n";
if (isset($filter_block)) {
    $content .= "<div id='filters'>" . "  <h4>Filter by folder:</h4>\n" . "  <a href='#showall' id='showall' class='filter'>Show all results</a>\n" . $filter_block . "</div>\n";
}
$content .= "<table class='collapsable results_table {$search_id}'>\n";
$content .= "  <tr class='column_headers'>\n" . "    <th>String ID</th>\n" . "    <th>English</th>\n" . "    <th>Translation</th>\n" . "  </tr>\n";
foreach ($unchanged_strings as $string_id => $string_value) {
    $component = explode('/', $string_id)[0];
    $entity_link = "/?sourcelocale={$source_locale}" . "&locale={$locale}" . "&repo={$repo}" . "&search_type=entities&recherche={$string_id}";
    /*
        Since this view displays strings identical to source locale, I'll use the same
        direction, not the locale's default (for example I'll use LTR for English+Arabic).
    */
    $direction = RTLSupport::getDirection($source_locale);
    $content .= "  <tr class='{$component} {$search_id}'>\n" . "    <td dir='ltr'><a href='{$entity_link}'>{$string_id}</a></td>\n" . "    <td dir='{$direction}' lang='{$source_locale}'>{$string_value}</td>\n" . "    <td dir='{$direction}' lang='{$locale}'>" . $strings_locale[$string_id] . "</td>\n" . "  </tr>\n";
}
$content .= "</table>\n";
echo $content;
Пример #7
0
 public function bulk()
 {
     $action = Input::get('action');
     $statusId = Input::get('statusId');
     $ids = Input::get('id') ? Input::get('id') : Input::get('ids');
     $count = $this->invoiceRepo->bulk($ids, $action, $statusId);
     if ($count > 0) {
         $key = $action == 'mark' ? "updated_quote" : "{$action}d_quote";
         $message = Utils::pluralize($key, $count);
         Session::flash('message', $message);
     }
     return Redirect::to('quotes');
 }
Пример #8
0
 /**
  * Create a tab containing the repo info
  *
  * @param  array   $data   Array containing structured commit data
  * @param  string  $id     ID that will be used in combination with an HTML anchor
  *                         in a tab-link to show this tab-content. Should match the id in $data
  *                         argument used in Health::getStatsPane.
  * @param  boolean $active Should this tab be the active one?
  * @return string  HTML element to add between <div class="tab-content"> and
  *                        </div>, or false if data are missing.
  */
 public static function getStatsTab($data, $id, $active)
 {
     // Create the tab only if we get data
     if (isset($data['commit'])) {
         $date = $data['commit']['date'];
         $tab = '';
         // Set CSS classes if the latest commit is 1 year old or older
         $commit_class = $date->diff(new \DateTime('now'))->format('%y') >= 1 ? ' old' : '';
         $active_class = $active ? ' active' : '';
         // Build HTML
         $commit = '<b>' . Utils::ago($date) . '</b> (' . $date->format('F d, Y \\a\\t H:i \\G\\M\\T e') . ') by ' . $data['commit']['author'];
         $tab .= '<div id="' . $id . '" class="metrics tab' . $active_class . '">' . '<h4>Repo metrics:</h4><ul>' . '<li class="metric' . $commit_class . '">Last commit: ' . $commit . '</li>' . '<li class="metric">Number of commits: ' . Utils::pluralize($data['commit_sum'], 'commit') . '</li>' . '</ul></div>';
         return $tab;
     } else {
         return false;
     }
 }
 function __construct()
 {
     $class = get_class($this);
     $this->file_name = strtolower(Utils::pluralize($class));
     $this->file_path = DATAPATH . "data." . $this->file_name . ".json";
 }
Пример #10
0
<?php

namespace Transvision;

// Include the common simple search form
include __DIR__ . '/simplesearchform.php';
if ($error_count > 0) {
    $search_id = 'check_variable';
    $content = "<h2><span class=\"results_count_{$search_id}\">" . Utils::pluralize($error_count, 'result') . "</span> found</h2>\n";
    if (isset($filter_block)) {
        $content .= "<div id='filters'>" . "  <h4>Filter by folder:</h4>\n" . "  <a href='#showall' id='showall' class='filter'>Show all results</a>\n" . $filter_block . "</div>\n";
    }
    $content .= "<table class='collapsable results_table {$search_id}'>\n" . "  <tr>\n" . "    <th>Entity</th>\n" . "    <th>{$source_locale}</th>\n" . "    <th>{$locale}</th>\n" . "  </tr>\n";
    foreach ($var_errors as $string_id) {
        // Link to entity
        $string_id_link = "?sourcelocale={$source_locale}" . "&locale={$locale}" . "&repo={$repo}" . "&search_type=entities&recherche={$string_id}";
        $bugzilla_link = Bugzilla::reportErrorLink($locale, $string_id, $source[$string_id], $target[$string_id], $repo, $string_id_link);
        $path_locale1 = VersionControl::hgPath($source_locale, $repo, $string_id);
        $path_locale2 = VersionControl::hgPath($locale, $repo, $string_id);
        $component = explode('/', $string_id)[0];
        $content .= "<tr class='{$component} {$search_id}'>\n                       <td>\n                          <span class='celltitle'>Entity</span>\n                          <a class='link_to_entity' href=\"/{$string_id_link}\">" . ShowResults::formatEntity($string_id) . "</a>\n                       </td>\n                       <td dir='{$direction1}'>\n                          <span class='celltitle'>{$source_locale}</span>\n                          <div class='string'>" . Utils::secureText($source[$string_id]) . "</div>\n                          <div class='result_meta_link'>\n                            <a class='source_link' href='{$path_locale1}'><em>&lt;source&gt;</em></a>\n                          </div>\n                       </td>\n                        <td dir='{$direction2}'>\n                          <span class='celltitle'>{$locale}</span>\n                          <div class='string'>" . Utils::secureText($target[$string_id]) . "</div>\n                          <div class='result_meta_link'>\n                            <a class='source_link' href='{$path_locale2}'><em>&lt;source&gt;</em></a>\n                            <a class='bug_link' target='_blank' href='{$bugzilla_link}'>&lt;report a bug&gt;</a>\n                          </div>\n                       </td>\n                     </tr>\n";
    }
    $content .= "</table>\n";
} else {
    $content = "<h2>Congratulations, no errors found.</h2>";
}
print $content;
 private function importFile()
 {
     $data = Session::get('data');
     Session::forget('data');
     $map = Input::get('map');
     $count = 0;
     $hasHeaders = Input::get('header_checkbox');
     $countries = Country::remember(DEFAULT_QUERY_CACHE)->get();
     $countryMap = [];
     foreach ($countries as $country) {
         $countryMap[strtolower($country->name)] = $country->id;
     }
     foreach ($data as $row) {
         if ($hasHeaders) {
             $hasHeaders = false;
             continue;
         }
         $client = Client::createNew();
         $contact = Contact::createNew();
         $contact->is_primary = true;
         $contact->send_invoice = true;
         $count++;
         foreach ($row as $index => $value) {
             $field = $map[$index];
             $value = trim($value);
             if ($field == Client::$fieldName && !$client->name) {
                 $client->name = $value;
             } else {
                 if ($field == Client::$fieldPhone && !$client->work_phone) {
                     $client->work_phone = $value;
                 } else {
                     if ($field == Client::$fieldAddress1 && !$client->address1) {
                         $client->address1 = $value;
                     } else {
                         if ($field == Client::$fieldAddress2 && !$client->address2) {
                             $client->address2 = $value;
                         } else {
                             if ($field == Client::$fieldCity && !$client->city) {
                                 $client->city = $value;
                             } else {
                                 if ($field == Client::$fieldState && !$client->state) {
                                     $client->state = $value;
                                 } else {
                                     if ($field == Client::$fieldPostalCode && !$client->postal_code) {
                                         $client->postal_code = $value;
                                     } else {
                                         if ($field == Client::$fieldCountry && !$client->country_id) {
                                             $value = strtolower($value);
                                             $client->country_id = isset($countryMap[$value]) ? $countryMap[$value] : null;
                                         } else {
                                             if ($field == Client::$fieldNotes && !$client->private_notes) {
                                                 $client->private_notes = $value;
                                             } else {
                                                 if ($field == Contact::$fieldFirstName && !$contact->first_name) {
                                                     $contact->first_name = $value;
                                                 } else {
                                                     if ($field == Contact::$fieldLastName && !$contact->last_name) {
                                                         $contact->last_name = $value;
                                                     } else {
                                                         if ($field == Contact::$fieldPhone && !$contact->phone) {
                                                             $contact->phone = $value;
                                                         } else {
                                                             if ($field == Contact::$fieldEmail && !$contact->email) {
                                                                 $contact->email = strtolower($value);
                                                             }
                                                         }
                                                     }
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }
         $client->save();
         $client->contacts()->save($contact);
         Activity::createClient($client, false);
     }
     $message = Utils::pluralize('created_client', $count);
     Session::flash('message', $message);
     return Redirect::to('clients');
 }
if ($url['path'] == '3locales') {
    $check['extra_locale'] = $locale2;
    $searches[$locale2] = $locale3_strings;
    $data[] = $tmx_target2;
}
$search_yields_results = false;
// This will hold the components names for the search filters
$components = [];
foreach ($searches as $key => $value) {
    $search_results = ShowResults::getTMXResults(array_keys($value), $data);
    $components += Project::getComponents($search_results);
    if (count($value) > 0) {
        // We have results, we won't display search suggestions but search results
        $search_yields_results = true;
        $message_count = $real_search_results > $limit_results ? $limit_results . ' of ' . $real_search_results : count($search_results);
        $pluralized_count = Utils::pluralize($message_count, 'result');
        $output[$key] = "<h2>Displaying {$pluralized_count} for the string " . "<span class=\"searchedTerm\">{$initial_search_decoded}</span> in {$key}:</h2>";
        $output[$key] .= ShowResults::resultsTable($search_results, $initial_search, $source_locale, $locale, $check);
    } else {
        $output[$key] = "<h2>No matching results for the string " . "<span class=\"searchedTerm\">{$initial_search_decoded}</span>" . " for the locale {$key}</h2>";
    }
}
// Remove duplicated components
$components = array_unique($components);
// Display a search hint for the closest string we have if we have no search results
if (!$search_yields_results) {
    $merged_strings = [];
    foreach ($data as $key => $values) {
        $merged_strings = array_merge($merged_strings, array_values($values));
    }
    $best_matches = Strings::getSimilar($initial_search, $merged_strings, 3);
Пример #13
0
 /**
  * Remove the specified resource from storage.
  *
  * @param  int  $id
  * @return Response
  */
 public function bulk($entityType = ENTITY_INVOICE)
 {
     $action = Input::get('action');
     $ids = Input::get('id') ? Input::get('id') : Input::get('ids');
     $count = $this->invoiceRepo->bulk($ids, $action);
     if ($count > 0) {
         $message = Utils::pluralize("{$action}d_{$entityType}", $count);
         Session::flash('message', $message);
     }
     return Redirect::to("{$entityType}s");
 }
Пример #14
0
 /**
  * Remove the specified resource from storage.
  *
  * @param  int  $id
  * @return Response
  */
 public function bulk($entityType = ENTITY_INVOICE)
 {
     $action = Input::get('action');
     $statusId = Input::get('statusId');
     $ids = Input::get('id') ? Input::get('id') : Input::get('ids');
     if ($action == 'delete') {
         $invoices = Invoice::withTrashed()->scope($ids)->get();
         foreach ($invoices as $invoice) {
             BookSale::deleteBook($invoice);
         }
     }
     //$count = $this->invoiceRepo->bulk($ids, $action, $statusId);
     if ($count > 0) {
         $key = $action == 'mark' ? "updated_{$entityType}" : "{$action}d_{$entityType}";
         $message = Utils::pluralize($key, $count);
         Session::flash('message', $message);
     }
     return Redirect::to("{$entityType}");
 }
 /**
  * Remove the specified resource from storage.
  *
  * @param  int  $id
  * @return Response
  */
 public function bulk($entityType = ENTITY_INVOICE)
 {
     $action = Input::get('action');
     $statusId = Input::get('statusId', INVOICE_STATUS_SENT);
     $ids = Input::get('id') ? Input::get('id') : Input::get('ids');
     $count = $this->invoiceRepo->bulk($ids, $action, $statusId);
     if ($count > 0) {
         $key = $action == 'mark' ? "updated_{$entityType}" : "{$action}d_{$entityType}";
         $message = Utils::pluralize($key, $count);
         Session::flash('message', $message);
     }
     if ($action == 'restore' && $count == 1) {
         return Redirect::to("{$entityType}s/" . $ids[0]);
     } else {
         return Redirect::to("{$entityType}s");
     }
 }
Пример #16
0
 public function bulk()
 {
     $action = Input::get('action');
     $ids = Input::get('id') ? Input::get('id') : Input::get('ids');
     $count = $this->paymentRepo->bulk($ids, $action);
     if ($count > 0) {
         $message = Utils::pluralize($action . 'd_payment', $count);
         Session::flash('message', $message);
     }
     return Redirect::to('payments');
 }
Пример #17
0
 public function bulk()
 {
     $action = Input::get('action');
     $ids = Input::get('id') ? Input::get('id') : Input::get('ids');
     $count = $this->clientRepo->bulk($ids, $action);
     $message = Utils::pluralize($action . 'd_client', $count);
     Session::flash('message', $message);
     if ($action == 'restore' && $count == 1) {
         return Redirect::to('clients/' . $ids[0]);
     } else {
         return Redirect::to('clients');
     }
 }
Пример #18
0
 public function tableize($s)
 {
     return Utils::pluralize(strtolower($this->underscorify($s)));
 }
Пример #19
0
 public static function time_more_days_to_go(\DateTime $timeInFuture, $timeNow = true)
 {
     $timeNow = $timeNow instanceof \DateTime ? $timeNow : new \DateTime();
     $gap = date_diff($timeNow, $timeInFuture, false);
     $out = array(0, 0);
     if ($gap->invert == 1) {
         return array(0, 'days');
     }
     switch (true) {
         case $gap->y > 1:
             $out = array($gap->y, Utils::pluralize($gap->y, 'year', 'years'));
             break;
         case $gap->days >= 150 && $gap->y <= 1:
             $out = array($gap->y * 12 + $gap->m, Utils::pluralize($gap->y * 12 + $gap->m, 'month', 'months'));
             break;
         default:
             $out = array($gap->days, Utils::pluralize($gap->days, 'day', 'days'));
             break;
     }
     return $out;
 }