Example #1
0
 /**
  * Retrieves multiple paths from an array. If the path does not exist in the
  * array, the default value will be added instead.
  *
  *     // Get the values "username", "password" from $_POST
  *     $auth = Arr::extract($_POST, array('username', 'password'));
  *
  *     // Get the value "level1.level2a" from $data
  *     $data = array('level1' => array('level2a' => 'value 1', 'level2b' => 'value 2'));
  *     Arr::extract($data, array('level1.level2a', 'password'));
  *
  * @param   array  $array    array to extract paths from
  * @param   array  $paths    list of path
  * @param   mixed  $default  default value
  * @return  array
  */
 public static function extract($array, array $paths, $default = NULL)
 {
     $found = array();
     foreach ($paths as $path) {
         Arr::set_path($found, $path, Arr::path($array, $path, $default));
     }
     return $found;
 }
Example #2
0
 public function as_array()
 {
     $data = parent::as_array();
     $data['options'] = json_decode($data['options'], true);
     if (!Arr::path($data, "options.title.text", false)) {
         Arr::set_path($data, "options.title.text", __($data['name']));
     }
     return $data;
 }
Example #3
0
 public function changed($update, array $prefix = array())
 {
     $path = implode('.', $prefix);
     $data = array();
     if (!empty($this->_changed)) {
         if ($update) {
             $data['$inc'] = array($path => $this->_changed);
         } else {
             Arr::set_path($data, $path, $this->_value);
         }
     }
     return $data;
 }
Example #4
0
 public function changed($update, array $prefix = array())
 {
     if (isset($this->_counter)) {
         // acting as counter
         return $this->_counter->changed($update, $prefix);
     }
     $changed = array();
     // Get a list of all relevant keys (current + unset keys)
     $keys = array();
     foreach ($this as $key => $value) {
         $keys[] = $key;
     }
     // don't use array_unique(array_merge(array_keys($this->_changed),$keys)) - array_unique has issues with 0 values (eg array_unique( array('a',0,0,'a','c'));
     $keys = array_merge($keys, array_diff(array_keys($this->_changed), $keys));
     // Walk through array
     foreach ($keys as $key) {
         $value = $this->offsetExists($key) ? $this->offsetGet($key) : NULL;
         if (isset($this->_changed[$key])) {
             // value has been changed
             if ($value instanceof Mango_Interface) {
                 $value = $value->as_array();
             }
             $path = array_merge($prefix, array($key));
             if ($this->_changed[$key] === TRUE) {
                 $data = array();
                 $path = implode('.', $path);
                 if ($update) {
                     $data = array('$set' => array($path => $value));
                 } else {
                     Arr::set_path($data, $path, $value);
                 }
                 $changed = Arr::merge($changed, $data);
                 // __set
                 /*$changed = $update
                 		? arr::merge($changed, array( '$set' => array( implode('.',$path) => $value)))
                 		: arr::merge($changed, arr::path_set($path,$value) );*/
             } else {
                 // __unset
                 if ($update) {
                     $changed = Arr::merge($changed, array('$unset' => array(implode('.', $path) => TRUE)));
                 }
             }
         } elseif ($value instanceof Mango_Interface) {
             $changed = Arr::merge($changed, $value->changed($update, array_merge($prefix, array($key))));
         }
     }
     return $changed;
 }
Example #5
0
 /**
  * Returns all models as JSON
  */
 public function action_read()
 {
     try {
         $id = $this->request->param('id', Arr::get($this->_input, 'id'));
         //Kohana::$log->add(Log::DEBUG,$this->chart->as_array());
         if (empty($id)) {
             $data = $this->chart->read_all();
         } else {
             $data = $this->chart->as_array();
             if (!is_null($this->time)) {
                 $url = sprintf('chart/series/%s/%s', $id, date('Y/m/d', $this->time));
                 $request = Request::factory($url)->execute();
                 $series = json_decode($request->body(), true);
                 Arr::set_path($data, "options.series", Arr::pluck($series, 'options'));
                 Arr::set_path($data, "options.subtitle.text", utf8_encode(strftime("%#d. %B %Y", $this->time)));
             }
         }
         $this->response->body(json_encode($data));
     } catch (Kohana_Exception $e) {
         // Return HTTP 400: Bad Request
         $this->response->status(400);
     }
 }
Example #6
0
 public function action_read()
 {
     try {
         $series = array();
         foreach ($this->chart->series->find_all() as $objPlot) {
             /* @var $plot Model_Plot */
             // The relevant series options for Highcharts are in
             // the 'options' as JSON
             $arrPlot = $objPlot->as_array();
             // Fetch the plot-data and add it to the options
             if (!is_null($this->time) and !Arr::path($arrPlot, "options.data", false)) {
                 Arr::set_path($arrPlot, "options.data", $objPlot->getData($this->time));
             }
             $series[] = $arrPlot;
         }
         //Kohana::$log->add(Log::DEBUG,  serialize($series));
         $this->response->headers('Content-Type', 'application/json');
         $this->response->body(json_encode($series));
     } catch (Kohana_Exception $e) {
         // Return HTTP 400: Bad Request
         $this->response->status(400);
     }
 }
Example #7
0
 /**
  * To store changes made to configuration
  * Experimental
  *
  * @param string    $key    Path of variable eg: group.key or group.key.option1
  * @param mixed     $value  The new value
  * @return boolean
  */
 public static function myset($key, $value)
 {
     if (strpos($key, '.') !== FALSE) {
         return FALSE;
     }
     // Split the config group, item and path
     list($group, $item, $_path) = explode('.', $key, 3);
     $path = (isset($_path) and !empty($_path)) ? $item . '.' . $_path : $item;
     // load and override config array
     $config = self::load($group);
     Arr::set_path($config, $path, $value, '.');
     $status = TRUE;
     foreach (self::$_sources as $source) {
         // Copy each value in the config
         /** @var $source \Config_Source */
         $status = $source->write($group, $item, $config[$item]);
     }
     return $status;
 }
Example #8
0
 /**
  * Tests Arr::path()
  *
  * @test
  * @dataProvider provider_set_path
  * @param string  $path       The path to follow
  * @param boolean $expected   The expected value
  * @param string  $delimiter  The path delimiter
  */
 public function test_set_path($expected, $array, $path, $value, $delimiter = NULL)
 {
     Arr::set_path($array, $path, $value, $delimiter);
     $this->assertSame($expected, $array);
 }
Example #9
0
 /**
  * Convert namespaced $_FILES array into values Formo can understand
  *
  * @access protected
  * @param array $files
  * @return array
  */
 protected function _resolve_namespaced_files(array $files)
 {
     // The array we will eventually return
     $array = array();
     // Convert $files array to dot keys
     $dot_keys = array();
     foreach ($files as $parent_key => $values) {
         if (!empty($values['name'])) {
             $dot_keys = $this->_arr_dotsyntax($values['name']);
             break;
         }
     }
     // All the parts of each $_FILES contents
     $file_parts = array('name', 'type', 'tmp_name', 'error', 'size');
     foreach ($dot_keys as $dot_key) {
         $parts = explode('.', $dot_key);
         $file_name = array_pop($parts);
         foreach ($file_parts as $file_part) {
             // Create values pulled from the complex $_FILES array
             // for namespaced file inputs
             $set_path = $parent_key . '.' . $dot_key . '.' . $file_part;
             $find_path = $parent_key . '.' . $file_part . '.' . $dot_key;
             Arr::set_path($array, $set_path, Arr::path($files, $find_path));
         }
     }
     return $array;
 }
Example #10
0
 /**
  * Get all of the changed fields as an associative array.
  *
  * @param  boolean  indicate update (TRUE) or insert (FALSE) - (determines use of modifiers like $set/$inc)
  * @param  array    prefix data, used internally
  * @return  array  field => value
  */
 public function changed($update, array $prefix = array())
 {
     $changed = array();
     foreach ($this->_fields as $name => $field) {
         if (isset($field['local']) && $field['local'] === TRUE) {
             // local variables are not stored in DB
             continue;
         }
         $value = isset($this->_object[$name]) ? $this->_object[$name] : Arr::get($this->_clean, $name);
         // prepare prefix
         $path = array_merge($prefix, array($name));
         if (isset($this->_changed[$name])) {
             // value has been changed
             if ($value instanceof Mango_Interface) {
                 $value = $value->as_array();
             }
             if ($this->_changed[$name] === TRUE) {
                 $data = array();
                 $path = implode('.', $path);
                 if ($update) {
                     $data = array('$set' => array($path => $value));
                 } else {
                     Arr::set_path($data, $path, $value);
                 }
                 $changed = Arr::merge($changed, $data);
                 // __set
                 /*$changed = $update
                 		? arr::merge($changed,array('$set'=>array( implode('.',$path) => $value) ) )
                 		: arr::merge($changed, arr::path_set($path,$value) );*/
             } else {
                 // __unset
                 if ($update) {
                     $changed = Arr::merge($changed, array('$unset' => array(implode('.', $path) => TRUE)));
                 }
             }
         } elseif ($this->__isset($name)) {
             // check any (embedded) objects/arrays/sets
             if ($value instanceof Mango_Interface) {
                 $changed = Arr::merge($changed, $value->changed($update, $path));
             }
         }
     }
     return $changed;
 }
Example #11
0
 /**
  * Throws an exception because Filter is read-only.
  * Implements ArrayAccess method.
  *
  * @throws  Kohana_Exception
  * @param   string   $offset    key to set
  * @param   mixed    $value     value to set
  * @return  void
  */
 public function offsetSet($offset, $value)
 {
     Arr::set_path($this->_data, $offset, $value);
 }
Example #12
0
 /**
  * Set a value for a field's attribute
  * You can use Arr::set_path's dot-syntax to set an attribute
  *
  * @access public
  * @param mixed $var
  * @param mixed $val (default: NULL)
  * @return void
  */
 public function set($var, $val = NULL)
 {
     if (is_array($var)) {
         foreach ($var as $key => $value) {
             $this->set($key, $value);
         }
         return $this;
     }
     if ($var === 'val') {
         // Special case for value
         $this->val($val);
         return $this;
     }
     if ($var === 'driver') {
         // Special case for driver
         $this->_set_driver($val);
         return $this;
     }
     if ($var == 'attr') {
         $this->attr($val);
         return $this;
     }
     if ($var == 'fields' and is_array($val)) {
         foreach ($val as $field) {
             $field['parent'] = $this;
             $new_field = Formo::factory($field);
             $this->add($new_field);
         }
         return $this;
     }
     if (strpos($var, '.') !== FALSE) {
         list($var, $parts) = explode('.', $var, 2);
     } else {
         $parts = NULL;
     }
     $array_name = $this->_get_var_name($var);
     if ($array_name === '_vars') {
         if ($parts) {
             return Arr::set_path($this->_vars, "{$var}.{$parts}", $val);
         } else {
             $this->_vars[$var] = $val;
         }
     } elseif ($parts) {
         Arr::set_path($this->{$array_name}, $parts, $val);
     } else {
         // Set the value
         $this->{$array_name} = $val;
     }
     return $this;
 }
Example #13
0
 public function action_index()
 {
     $ids = array_keys(Arr::get($_POST, 'job', array()));
     $ids = array_filter($ids, function ($st) {
         return preg_match('/^T1W[0-9]{12}$/i', $st);
     });
     if (!$ids) {
         throw new HTTP_Exception_404('Not found');
     }
     $users = DB::select('id', 'company_id')->from('users')->execute()->as_array('id', 'company_id');
     $companies = array();
     $result = Database_Mongo::collection('submissions')->find(array('job_key' => array('$in' => $ids), 'financial_time' => array('$gt' => 0)), array('user_id' => 1, 'job_key' => 1, 'paid' => 1, 'rate' => 1));
     foreach ($result as $submission) {
         if (Arr::get($users, $submission['user_id'])) {
             $path = array($users[$submission['user_id']], $submission['job_key']);
             Arr::set_path($companies, $path, Arr::path($companies, $path, 0) + $submission['paid'] * $submission['rate']);
         }
     }
     $paid = array();
     if ($companies) {
         $result = DB::select('job_key', 'company_id', DB::expr('SUM(`payment_jobs`.`amount`) as value'))->from('payment_jobs')->join('payments')->on('payment_id', '=', 'id')->where('job_key', 'IN', $ids)->group_by('job_key', 'company_id')->execute()->as_array();
         foreach ($result as $payment) {
             $paid[$payment['company_id']][$payment['job_key']] = $payment['value'];
         }
     }
     $jobs = array_fill_keys($ids, array('c' => array(), 'p' => array()));
     foreach ($companies as $company => $list) {
         foreach ($list as $key => $value) {
             $jobs[$key]['c'][$company] = $value;
         }
     }
     foreach ($paid as $company => $list) {
         foreach ($list as $key => $value) {
             $jobs[$key]['p'][$company] = $value;
         }
     }
     if (Arr::get($_POST, 'company') && Arr::get($_POST, 'payment')) {
         $company = Arr::get($companies, $_POST['company']);
         if (!$company) {
             die(json_encode(array('success' => false)));
         }
         $payments = array_map('floatval', array_intersect_key($_POST['payment'], $company));
         $payment = array('company_id' => intval($_POST['company']), 'admin_id' => User::current('id'), 'payment_time' => time(), 'amount' => array_sum($payments));
         Database::instance()->begin();
         $id = Arr::get(DB::insert('payments', array_keys($payment))->values(array_values($payment))->execute(), 0);
         $query = DB::insert('payment_jobs', array('payment_id', 'job_key', 'amount'));
         foreach ($company as $job => $value) {
             if (Arr::get($payments, $job)) {
                 $query->values(array($id, $job, $payments[$job]));
             }
         }
         $query->execute();
         $partial = array();
         $paid = array();
         $result = Database_Mongo::collection('jobs')->find(array('_id' => array('$in' => $ids)));
         foreach ($result as $job) {
             $data = Utils::calculate_financial($job);
             if (isset($data['$set']['partial'])) {
                 $partial[] = $job['_id'];
             } elseif (isset($data['$set']['paid'])) {
                 $paid[] = $job['_id'];
             }
         }
         if ($partial) {
             Database_Mongo::collection('jobs')->update(array('_id' => array('$in' => $partial)), array('$unset' => array('paid' => 1), '$set' => array('partial' => 1)), array('multiple' => 1));
         }
         if ($paid) {
             Database_Mongo::collection('jobs')->update(array('_id' => array('$in' => $paid)), array('$unset' => array('partial' => 1), '$set' => array('paid' => 1)), array('multiple' => 1));
         }
         Database::instance()->commit();
         Messages::save('Payment successfully added!', 'success');
         die(json_encode(array('success' => true)));
     }
     ksort($jobs);
     if ($companies) {
         $companies = DB::select('id', 'name')->from('companies')->where('id', 'IN', array_keys($companies))->order_by('name', 'ASC')->execute()->as_array('id', 'name');
     } else {
         $companies = array();
     }
     $view = View::factory('Jobs/Payment')->bind('jobs', $jobs)->bind('companies', $companies);
     $this->response->body($view);
 }
Example #14
0
 private static function set_array_values(&$array, $path, $values)
 {
     $new = array();
     foreach ($values as $item) {
         parse_str($item, $item);
         $new = Arr::merge($new, $item);
     }
     Arr::set_path($array, $path, $new);
 }
Example #15
0
 public function changed($update, array $prefix = array())
 {
     // fetch changed elements in this set
     $elements = array();
     switch ($this->_mode) {
         case 'push':
         case 'set':
         case 'addToSet':
             foreach ($this->_changed as $index) {
                 $elements[] = $this->offsetGet($index);
             }
             break;
         case 'pull':
             // changed values were stored in _changed array
             $elements = $this->_changed;
             break;
     }
     // normalize changed elements
     foreach ($elements as &$element) {
         if ($element instanceof Mango_Interface) {
             $element = $element->as_array();
         }
     }
     if ($update === FALSE) {
         // no more changes possible after this
         $data = array();
         if (count($elements)) {
             Arr::set_path($data, implode('.', $prefix), $elements);
         }
         return $data;
         /*return count($elements)
         		? arr::path_set($prefix,$elements)
         		: array();*/
     }
     // First, get all changes made to the elements of this set directly
     $changes_local = array();
     switch ($this->_mode) {
         case 'pop':
             $changes_local = array('$pop' => array(implode('.', $prefix) => $this->_changed));
             break;
         case 'set':
             foreach ($this->_changed as $index => $set_index) {
                 $changes_local = Arr::merge($changes_local, array('$set' => array(implode('.', $prefix) . '.' . $set_index => $elements[$index])));
             }
             break;
         case 'unset':
             foreach ($this->_changed as $unset_index) {
                 $changes_local = Arr::merge($changes_local, array('$unset' => array(implode('.', $prefix) . '.' . $unset_index => TRUE)));
             }
             break;
         case 'addToSet':
             $elements = count($this->_changed) > 1 ? array('$each' => $elements) : $elements[0];
             $changes_local = array('$addToSet' => array(implode('.', $prefix) => $elements));
             break;
         case 'push':
         case 'pull':
             $mod = '$' . $this->_mode;
             if (count($this->_changed) > 1) {
                 $mod .= 'All';
             } else {
                 $elements = $elements[0];
             }
             $changes_local = array($mod => array(implode('.', $prefix) => $elements));
             break;
     }
     // Second, get all changes made within children elements themselves
     $changes_children = array();
     foreach ($this as $index => $value) {
         if (!is_array($this->_changed) || !in_array($this->_mode, array('push', 'set', 'addToSet')) || !in_array($index, $this->_changed)) {
             if ($value instanceof Mango_Interface) {
                 $changes_children = Arr::merge($changes_children, $value->changed($update, array_merge($prefix, array($index))));
             }
         }
     }
     // Some modifiers don't work well together in Mongo - check for mistakes
     if (isset($this->_mode) && $this->_mode !== 'set' && $this->_mode !== 'unset' && !empty($changes_children)) {
         throw new Mango_Exception('MongoDB does not support any other updates when already in :mode mode', array(':mode' => $this->_mode));
     }
     // Return all changes
     return Arr::merge($changes_local, $changes_children);
 }
Example #16
0
File: user.php Project: anqh/anqh
 /**
  * Get/set user setting.
  *
  * @param   string  $key
  * @param   mixed   $value
  * @return  mixed
  */
 public function setting($key, $value = null)
 {
     if (!$this->_settings) {
         $this->_settings = $this->settings;
     }
     if (is_null($value)) {
         // Get setting
         return Arr::path($this->_settings, $key, self::default_setting($key));
     } else {
         // Set setting
         if (self::default_setting($key) === $value) {
             // Default setting, unset
             Arr::unset_path($this->_settings, $key);
         } else {
             // Non-default, set
             Arr::set_path($this->_settings, $key, $value);
         }
         $this->settings = $this->_settings;
     }
 }
 /**
  * set a var
  */
 public function set($path, $value)
 {
     // alter data
     Arr::set_path(self::$_data, $this->_group . $path, $value);
 }
Example #18
0
 public function action_lifd()
 {
     $companies = DB::select('id', 'name')->from('companies')->execute()->as_array('id', 'name');
     $regions = DB::select('id', 'name')->from('regions')->execute()->as_array('id', 'name');
     if ($this->request->is_ajax() || $this->request->param('id') == 'export') {
         $query = array();
         $url = array();
         if (!Group::current('allow_assign')) {
             $query['$or'] = array(array('companies' => intval(User::current('company_id'))), array('ex' => intval(User::current('company_id'))));
         } else {
             if (Arr::get($_POST, 'company') && is_array($_POST['company'])) {
                 $company = array_map('intval', $_POST['company']);
                 if (count($company) == 1) {
                     $company = array_shift($company);
                 }
                 $query['$or'] = array(array('companies' => is_array($company) ? array('$in' => $company) : $company), array('ex' => is_array($company) ? array('$in' => $company) : $company));
                 $url['company'] = is_array($company) ? implode(',', $company) : $company;
                 $url['ex'] = '1';
             }
         }
         if (Arr::get($_POST, 'region') && isset($regions[$_POST['region']])) {
             $query['region'] = strval($_POST['region']);
         }
         if (Arr::get($_POST, 'fsa')) {
             $fsa = is_array($_POST['fsa']) ? array_map('strval', $_POST['fsa']) : explode(', ', $_POST['fsa']);
             $query['data.12'] = count($fsa) > 1 ? array('$in' => $fsa) : array_shift($fsa);
         }
         if (Arr::get($_POST, 'fsam')) {
             $fsam = is_array($_POST['fsam']) ? array_map('strval', $_POST['fsam']) : explode(', ', $_POST['fsam']);
             $query['data.13'] = count($fsam) > 1 ? array('$in' => $fsam) : array_shift($fsam);
         }
         $result = Database_Mongo::collection('jobs')->find($query, array('data.12' => 1, 'data.13' => 1, 'data.14' => 1, 'data.17' => 1, 'data.18' => 1, 'data.43' => 1, 'data.44' => 1, 'data.222' => 1, 'data.228' => 1, 'created' => 1, 'companies' => 1, 'ex' => 1));
         $jobs = array();
         foreach ($result as $job) {
             $jobs[$job['_id']] = array('fsa' => Arr::path($job, 'data.12', 'Unknown'), 'fsam' => Arr::path($job, 'data.13', 'Unknown'), 'lifd' => Arr::path($job, 'data.17', 0) . '|' . Arr::path($job, 'data.18', 0), 'fda' => Arr::path($job, 'data.14', 'Unknown'), 'status' => strtolower(preg_replace('/[^a-z]/i', '', Arr::path($job, 'data.44'))), 'companies' => array('now' => Arr::get($job, 'companies', array()), 'ex' => Arr::get($job, 'ex', array())), 'test' => strtolower(preg_replace('/[^0-9a-z]/i', '', Arr::path($job, 'data.43', ''))), 'variation' => strtolower(preg_replace('/[^a-z]/i', '', Arr::path($job, 'data.222'))), 'sequence' => Arr::path($job, 'data.228'));
         }
         usort($jobs, function ($a, $b) {
             foreach ($a as $key => $v) {
                 $v2 = $b[$key];
                 if ($key == 'lifd') {
                     $v = explode('|', $v);
                     $v2 = explode('|', $v2);
                     if ($v[0] < $v2[0]) {
                         return -1;
                     } elseif ($v[0] > $v2[0]) {
                         return 1;
                     } elseif ($v[1] < $v2[1]) {
                         return -1;
                     } elseif ($v[1] > $v2[1]) {
                         return 1;
                     }
                 } elseif (!is_array($v)) {
                     if ($v < $v2) {
                         return -1;
                     } elseif ($v > $v2) {
                         return 1;
                     }
                 }
             }
             return 0;
         });
         $list = array();
         $total = array();
         $breakdown = array();
         foreach ($jobs as $job) {
             $comp = $job['companies'];
             unset($job['companies']);
             $break = false;
             if ($job['status'] == 'built') {
                 if (!$job['test']) {
                     $break = 'no-result';
                 } elseif (in_array($job['test'], array('accessissues', 'demand', 'livefibre'), true)) {
                     $break = 'test-exception';
                 } elseif ($job['test'] == 'qafailed') {
                     $break = 'qa-issues';
                 } elseif ($job['variation'] == 'requiresendorsement' && !$job['sequence']) {
                     $break = 'seq-required';
                 } elseif (in_array($job['variation'], array('requiresendorsement', 'autoendorsed', 'autoendorsedvariation', 'novariation'), true)) {
                     $break = 'no-issue';
                 }
                 if ($break) {
                     $breakdown[$job['fsa']][$break] = Arr::path($breakdown, array($job['fsa'], $break)) + 1;
                     $breakdown[$job['fsam']][$break] = Arr::path($breakdown, array($job['fsam'], $break)) + 1;
                     $breakdown[$job['fsam'] . $job['lifd']][$break] = Arr::path($breakdown, array($job['fsam'] . $job['lifd'], $break)) + 1;
                     $breakdown[$job['fda'] . $job['lifd']][$break] = Arr::path($breakdown, array($job['fda'] . $job['lifd'], $break)) + 1;
                 }
             }
             unset($job['test']);
             unset($job['variation']);
             unset($job['sequence']);
             Arr::set_path($list, $job, Arr::path($list, $job, 0) + 1);
             $total[$job['fsa']][$job['status']] = Arr::path($total, array($job['fsa'], $job['status'])) + 1;
             $total[$job['fsam']][$job['status']] = Arr::path($total, array($job['fsam'], $job['status'])) + 1;
             $total[$job['fsam'] . $job['lifd']][$job['status']] = Arr::path($total, array($job['fsam'] . $job['lifd'], $job['status'])) + 1;
             $job['status'] = 'companies';
             $job['comp'] = 'now';
             Arr::set_path($list, $job, array_merge(Arr::path($list, $job, array()), $comp['now']));
             $job['comp'] = 'ex';
             Arr::set_path($list, $job, array_merge(Arr::path($list, $job, array()), $comp['ex']));
         }
         if ($this->request->param('id') == 'export') {
             $excel = new PHPExcel();
             $sheet = $excel->getActiveSheet();
             $sheet->setTitle('LIFD Report');
             $header = array('FSA ID', 'FSAM ID', 'LIFD', 'FDA ID');
             if (Group::current('allow_assign')) {
                 $header[] = 'Current contractors';
                 $header[] = 'Previous contractors';
             }
             $header = array_merge($header, array('Total tickets', 'ASSIGNED', 'NOTIFY', 'PLANNED', 'Total', 'SCHEDULED', 'IN-PROGRESS', 'HELD-CONTRACTOR', 'Total', 'BUILT', 'TESTED', 'Total', 'DEFERRED', 'DIRTY', 'HELD-NBN', 'Total'));
             $sheet->fromArray($header);
             $end = $sheet->getHighestDataColumn();
             $sheet->getStyle('A1:' . $end . '1')->getFont()->setBold(true);
             $sheet->getStyle('A1:' . $end . '1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB('FFF0F0F0');
             $i = 2;
             $fill = function ($companies, $data) {
                 $result = array();
                 if (Group::current('allow_assign')) {
                     $result[] = implode("\n", array_intersect_key($companies, array_flip(Arr::path($data, 'companies.now', array()))));
                     $result[] = implode("\n", array_intersect_key($companies, array_flip(Arr::path($data, 'companies.ex', array()))));
                 }
                 $result[] = array_sum($data);
                 $result[] = Arr::get($data, 'assigned');
                 $result[] = Arr::get($data, 'notify');
                 $result[] = Arr::get($data, 'planned');
                 $result[] = Arr::get($data, 'assigned') + Arr::get($data, 'notify') + Arr::get($data, 'planned');
                 $result[] = Arr::get($data, 'scheduled');
                 $result[] = Arr::get($data, 'inprogress');
                 $result[] = Arr::get($data, 'heldcontractor');
                 $result[] = Arr::get($data, 'scheduled') + Arr::get($data, 'inprogress') + Arr::get($data, 'heldcontractor');
                 $result[] = Arr::get($data, 'built');
                 $result[] = Arr::get($data, 'tested');
                 $result[] = Arr::get($data, 'built') + Arr::get($data, 'tested');
                 $result[] = Arr::get($data, 'deferred');
                 $result[] = Arr::get($data, 'dirty');
                 $result[] = Arr::get($data, 'heldnbn');
                 $result[] = Arr::get($data, 'deferred') + Arr::get($data, 'dirty') + Arr::get($data, 'heldnbn');
                 return $result;
             };
             foreach ($list as $fsa => $fsams) {
                 $first = $i;
                 $row = array_merge(array($fsa, '', '', ''), $fill($companies, $total[$fsa]));
                 $sheet->fromArray($row, NULL, 'A' . $i);
                 $sheet->getStyle('A' . $i . ':' . $end . $i)->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB('FFEEE0E7');
                 $sheet->getRowDimension($i++)->setOutlineLevel(0)->setCollapsed(true)->setVisible(true);
                 foreach ($fsams as $fsam => $lifds) {
                     $row = array_merge(array($fsa, $fsam, '', ''), $fill($companies, $total[$fsam]));
                     $sheet->fromArray($row, NULL, 'A' . $i);
                     $sheet->getStyle('A' . $i . ':' . $end . $i)->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB('FFE7EEE0');
                     $sheet->getRowDimension($i++)->setOutlineLevel(1)->setCollapsed(true)->setVisible(false);
                     foreach ($lifds as $lifd => $fdas) {
                         $dates = explode('|', $lifd);
                         $days = Utils::working_days($dates[1]);
                         $row = array_merge(array($fsa, $fsam, ($dates[0] ? date('d-m-Y', $dates[0]) : '') . '-' . ($dates[1] ? date('d-m-Y', $dates[1]) . ' [' . $days . ' day' . ($days != 1 ? 's ' : ' ') . ($dates[1] < time() ? 'passed' : 'left') . ']' : ''), ''), $fill($companies, $total[$fsam . $lifd]));
                         $sheet->fromArray($row, NULL, 'A' . $i);
                         $sheet->getStyle('A' . $i . ':' . $end . $i)->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB('FFEEE7E0');
                         $sheet->getRowDimension($i++)->setOutlineLevel(2)->setCollapsed(true)->setVisible(false);
                         $start = $i;
                         foreach ($fdas as $fda => $item) {
                             $row = array_merge(array($fsa, $fsam, ($dates[0] ? date('d-m-Y', $dates[0]) : '') . '-' . ($dates[1] ? date('d-m-Y', $dates[1]) . ' [' . $days . ' day' . ($days != 1 ? 's ' : ' ') . ($dates[1] < time() ? 'passed' : 'left') . ']' : ''), $fda), $fill($companies, $item));
                             $sheet->fromArray($row, NULL, 'A' . $i);
                             $sheet->getRowDimension($i++)->setOutlineLevel(3)->setCollapsed(true)->setVisible(false);
                         }
                         $end = Group::current('allow_assign') ? 'G' : 'E';
                         $sheet->getStyle('A' . $start . ':' . $end . ($i - 1))->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB('FFE0E7EE');
                     }
                 }
                 $max = $i - 1;
                 $start = Group::current('allow_assign') ? 'H' : 'F';
                 $end = Group::current('allow_assign') ? 'K' : 'I';
                 $sheet->getStyle($start . $first . ':' . $end . $max)->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB('FFE0FFFF');
                 $start = Group::current('allow_assign') ? 'L' : 'J';
                 $end = Group::current('allow_assign') ? 'O' : 'M';
                 $sheet->getStyle($start . $first . ':' . $end . $max)->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB('FFF5FFCF');
                 $start = Group::current('allow_assign') ? 'P' : 'N';
                 $end = Group::current('allow_assign') ? 'R' : 'P';
                 $sheet->getStyle($start . $first . ':' . $end . $max)->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB('FFCFFFCC');
                 $start = Group::current('allow_assign') ? 'S' : 'Q';
                 $end = Group::current('allow_assign') ? 'V' : 'T';
                 $sheet->getStyle($start . $first . ':' . $end . $max)->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB('FFFFD7D7');
                 $sheet->getStyle('A' . $i . ':' . $end . $i)->getFont()->setBold(true);
                 $sheet->getStyle('A' . $i . ':' . $end . $i)->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB('FFF0F0F0');
                 $sheet->fromArray($header, NULL, 'A' . $i++);
             }
             foreach (range('A', $sheet->getHighestDataColumn()) as $col) {
                 $sheet->getColumnDimension($col)->setAutoSize(true);
             }
             foreach (range(1, $sheet->getHighestDataRow()) as $row) {
                 $sheet->getRowDimension($row)->setRowHeight(-1);
             }
             $max = $sheet->getHighestDataRow();
             $sheet->getStyle('A1' . ':' . $sheet->getHighestDataColumn() . $max)->getBorders()->getAllBorders()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
             $sheet->getStyle('A1' . ':' . $sheet->getHighestDataColumn() . $max)->getAlignment()->setWrapText(true);
             $name = tempnam(sys_get_temp_dir(), 'excel');
             header('Content-type: application/xlsx');
             header('Content-disposition: filename="LifdReport.xlsx"');
             $writer = new PHPExcel_Writer_Excel2007($excel);
             $writer->save($name);
             readfile($name);
             unlink($name);
             die;
         }
         $view = View::factory('Dashboard/LifdReport')->set('url', URL::query($url, false))->bind('total', $total)->bind('breakdown', $breakdown)->bind('list', $list)->bind('companies', $companies);
         $filters = array();
         if (Arr::get($_POST, 'region')) {
             $filters[] = array('name' => 'Region', 'value' => Arr::get($regions, $_POST['region'], 'Unknown'));
         }
         if (Arr::get($_POST, 'company') && is_array($_POST['company'])) {
             $filters[] = array('name' => 'Contractor', 'value' => implode(', ', array_intersect_key($companies, array_flip($_POST['company']))));
         }
         die(json_encode(array('filters' => $filters, 'html' => strval($view))));
     }
     $query = array();
     if (!Group::current('allow_assign')) {
         $query['$or'] = array(array('companies' => intval(User::current('company_id'))), array('ex' => intval(User::current('company_id'))));
     }
     $fsa = Database_Mongo::collection('jobs')->distinct('data.12', $query ?: NULL);
     $fsam = Database_Mongo::collection('jobs')->distinct('data.13', $query ?: NULL);
     sort($fsa);
     sort($fsam);
     $view = View::factory('Dashboard/Lifd')->bind('fsa', $fsa)->bind('fsam', $fsam)->bind('companies', $companies)->bind('regions', $regions);
     $this->response->body($view);
 }