Example #1
0
 public function downloadAdvancedSearch(Request $request)
 {
     // get parameters from url route
     $parameters = $request->route()->parameters();
     $advancedSearch = AdvancedSearchTask::builder()->find(Crypt::decrypt($parameters['token']));
     if ($advancedSearch === null) {
         abort(404);
     }
     return response()->download(storage_path('exports') . '/' . $advancedSearch->filename_022 . '.' . $advancedSearch->extension_file_022);
 }
Example #2
0
 public function exportData()
 {
     $parameters = [];
     // Maximum rows from request to direct download
     $maximumRowsToDownload = 100;
     // set advanced search, with this function get only inputs to do advanced search
     $parameters = Miscellaneous::dataTableColumnFiltering($this->request, $parameters, 'array');
     // set order table
     $parameters['order'] = json_decode($this->request->input('order'), true);
     // set columns to display in export file
     $parameters['displayColumns'] = json_decode($this->request->input('displayColumns'), true);
     // config variables to count n records
     $parametersCount = $parameters;
     $parametersCount['count'] = true;
     $nFilteredTotal = call_user_func($this->model . '::getIndexRecords', $this->request, $parametersCount);
     // check than there are any data to export
     if ($nFilteredTotal < 1) {
         return null;
     }
     // if there are more than $maximumRowsToDownload rows, set start and length element to storage in file
     if ($nFilteredTotal > $maximumRowsToDownload) {
         // set paginate parameters
         $parameters['start'] = 0;
         // take first row
         $parameters['length'] = config('pulsar.advancedSearchLimitLength');
         // get limit to rows to take
     }
     // get data from model
     $objects = call_user_func($this->model . '::getIndexRecords', $this->request, $parameters);
     // *************************************************************
     // transform string data to number data, to operate with excel
     // *************************************************************
     $objects->transform(function ($item, $key) {
         $attributes = $item->getAttributes();
         foreach ($attributes as $key => $value) {
             if (is_numeric($value) && strpos($value, '.') === false) {
                 $item->{$key} = (int) $value;
             } elseif (is_numeric($value) && strpos($value, '.') !== false) {
                 $item->{$key} = (double) $value;
             }
         }
         return $item;
     });
     // get de first object, to konow properties from model, table name, columns, etc.
     $object = $objects->first();
     // get filename to download
     $filename = ($nFilteredTotal > $maximumRowsToDownload ? uniqid() . '_' : null) . (empty($object->tableTranslation) ? $object->table : trans($object->tableTranslation));
     // create spreadsheet to export data
     $excel = Excel::create($filename, function ($excel) use(&$parameters, $objects, $object) {
         // set the title
         $excel->setTitle('Export table :table')->setCreator('Pulsar')->setCompany('SYSCOVER');
         // set sheet
         $excel->sheet('Data', function ($sheet) use(&$parameters, $objects, $object) {
             // get all attributes from model and transform
             // to array only the keys, to know columns names
             $headers = collect($object->getAttributes())->keys()->toArray();
             /***********************************************************************
              * Get operation columns, this value is sent from advanced search form,
              * with this structure on json format
              *
              * [
              *   ['column' => 'column_database_000', 'operation' => 'sum'],
              *   ['column' => 'column_database_001', 'operation' => 'sum'],
              *   ...
              * ]
              ***********************************************************************/
             if ($this->request->has('operationColumns')) {
                 // set operations columns in parameters to be saved in AdvancedSearchTask model
                 $parameters['operationColumns'] = json_decode($this->request->input('operationColumns'), true);
                 // transform array to collection to manage elements
                 $operationColumns = collect($parameters['operationColumns']);
                 // create empty operations row to be filled after
                 $operationsRow = array_fill(0, count($headers) - 1, '');
                 // set operations columns row
                 foreach ($headers as $key => &$columnName) {
                     // first, check if column has any operation on itself
                     $operationColumn = $operationColumns->where('column', $columnName);
                     if ($operationColumn->count() > 0) {
                         // set operation
                         $operationColumn = $operationColumn->first();
                         switch ($operationColumn['operation']) {
                             case 'sum':
                                 $operationsRow[$key] = $objects->sum($columnName);
                                 break;
                         }
                     }
                 }
             }
             foreach ($headers as $key => &$columnName) {
                 // get translation column if exist
                 if (isset($object->columnTranslation[$columnName])) {
                     $columnName = trans($object->columnTranslation[$columnName]);
                 }
             }
             // set data and headers
             $sheet->prependRow($headers);
             $sheet->fromArray($objects->toArray(), null, 'A2', false, false);
             $sheet->cells('A1:' . $sheet->row(0)->getHighestDataColumn() . '1', function ($cells) {
                 $cells->setBackground('#CCCCCC');
                 $cells->setFontWeight('bold');
             });
             // set operations row and styles
             if ($this->request->has('operationColumns')) {
                 $sheet->appendRow($operationsRow);
                 $sheet->cells('A' . $sheet->row(0)->getHighestRow() . ':' . $sheet->row(0)->getHighestDataColumn() . $sheet->row(0)->getHighestRow(), function ($cells) {
                     $cells->setBackground('#F8F8F8');
                     $cells->setFontWeight('bold');
                 });
             }
         });
     });
     // if there are more than $maximumRowsToDownload rows, create AdvancedSearchTask to execute with cron after
     if ($nFilteredTotal > $maximumRowsToDownload) {
         $excel->store($this->request->input('extensionFile'));
         // set start to next call
         $parameters['start'] = config('pulsar.advancedSearchLimitLength');
         // crete task to download after
         AdvancedSearchTask::create(['date_022' => date('U'), 'user_id_022' => auth('pulsar')->user()->id_010, 'model_022' => $this->model, 'parameters_022' => json_encode($parameters), 'extension_file_022' => $this->request->input('extensionFile'), 'filename_022' => $filename, 'created_022' => false]);
         return redirect()->route($this->routeSuffix)->with(['msg' => 1, 'txtMsg' => trans('pulsar::pulsar.message_advanced_search_exports_03')]);
     } else {
         $excel->download($this->request->input('extensionFile'));
     }
 }
Example #3
0
 /**
  * Function to manage queue from advanced search
  */
 public static function checkAdvancedSearchExports()
 {
     // get advanced search without create yet
     $advancedSearches = AdvancedSearchTask::builder()->where('created_022', false)->get();
     foreach ($advancedSearches as $advancedSearch) {
         // get parametes from advnaced search
         $parameters = json_decode($advancedSearch->parameters_022, true);
         // config variables to count n records
         $parametersCount = $parameters;
         $parametersCount['count'] = true;
         $nFilteredTotal = call_user_func($advancedSearch->model_022 . '::getIndexRecords', null, $parametersCount);
         $lastInteraction = false;
         // flag to know if this is the las call to do
         // if is the last interaction, set length to get just last record
         if ($parameters['start'] + $parameters['length'] >= $nFilteredTotal) {
             $parameters['length'] = $nFilteredTotal;
             $lastInteraction = true;
         }
         // get data from model
         $objects = call_user_func($advancedSearch->model_022 . '::getIndexRecords', null, $parameters);
         // *************************************************************
         // transform string data to number data, to operate with excel
         // *************************************************************
         $objects->transform(function ($item, $key) {
             $attributes = $item->getAttributes();
             foreach ($attributes as $key => $value) {
                 if (is_numeric($value) && strpos($value, '.') === false) {
                     $item->{$key} = (int) $value;
                 } elseif (is_numeric($value) && strpos($value, '.') !== false) {
                     $item->{$key} = (double) $value;
                 }
             }
             return $item;
         });
         // get de first object, to konow properties from model, table name, columns, etc.
         $object = $objects->first();
         // get filename to load
         $filename = storage_path('exports') . '/' . $advancedSearch->filename_022 . '.' . $advancedSearch->extension_file_022;
         // create spreadsheet to export data
         Excel::load($filename, function ($excel) use($parameters, $objects, $object) {
             // get sheet
             $excel->sheet('Data', function ($sheet) use($parameters, $objects, $object) {
                 // get all attributes from model and transform
                 // to array only the keys, to know columns names
                 $headers = collect($object->getAttributes())->keys()->toArray();
                 // if has operations columns, read las row (operations row), and delete
                 if (isset($parameters['operationColumns'])) {
                     $highestRow = $sheet->getHighestRow();
                     // get highest row
                     $highestColumn = $sheet->getHighestColumn();
                     // get highest column
                     // get last row
                     $oldOperationsRow = $sheet->rangeToArray('A' . $highestRow . ':' . $highestColumn . $highestRow, null, true, false)[0];
                     // transform array to collection to manage elements
                     $operationColumns = collect($parameters['operationColumns']);
                     // create empty operations row to be filled after
                     $operationsRow = array_fill(0, count($headers) - 1, '');
                     // set operations columns row
                     // key from headers correspond with the key from oldOperationColumns
                     foreach ($headers as $key => &$columnName) {
                         // first, check if column has any operation on itself
                         $operationColumn = $operationColumns->where('column', $columnName);
                         if ($operationColumn->count() > 0) {
                             // set operation
                             $operationColumn = $operationColumn->first();
                             switch ($operationColumn['operation']) {
                                 case 'sum':
                                     $operationsRow[$key] = $objects->sum($columnName) + $oldOperationsRow[$key];
                                     // sum old operations row
                                     break;
                             }
                         }
                     }
                     // remove operations columns row
                     $sheet->removeRow($highestRow);
                 }
                 // set operations row and styles
                 if (isset($parameters['operationColumns'])) {
                     // set new data in spreadsheet, but overwrite old operations row
                     $sheet->fromArray($objects->toArray(), null, 'A' . $sheet->getHighestRow(), false, false);
                     $sheet->appendRow($operationsRow);
                     $sheet->cells('A' . $sheet->row(0)->getHighestRow() . ':' . $sheet->row(0)->getHighestDataColumn() . $sheet->row(0)->getHighestRow(), function ($cells) {
                         $cells->setBackground('#F8F8F8');
                         $cells->setFontWeight('bold');
                     });
                 } else {
                     // set new data in spreadsheet
                     $sheet->fromArray($objects->toArray(), null, 'A' . ($sheet->getHighestRow() + 1), false, false);
                 }
             });
         }, null, true)->store($advancedSearch->extension_file_022);
         if ($lastInteraction) {
             // get user to send email
             $user = $advancedSearch->getUser;
             // send email to user
             $dataMessage = ['emailTo' => $user->email_010, 'nameTo' => $user->name_010 . ' ' . $user->surname_010, 'subject' => trans('pulsar::pulsar.message_advanced_search_exports'), 'token' => Crypt::encrypt($advancedSearch->id_022), 'advancedSearch' => $advancedSearch];
             Mail::send('pulsar::emails.advanced_search_exports_notification', $dataMessage, function ($m) use($dataMessage) {
                 $m->to($dataMessage['emailTo'], $dataMessage['nameTo'])->subject($dataMessage['subject']);
             });
             // send mail
             $advancedSearch->created_022 = true;
             // todo, delete advanced search from database?
         } else {
             // set next paginate parameters
             $parameters['start'] = $parameters['start'] + $parameters['length'];
             $advancedSearch->parameters_022 = json_encode($parameters);
         }
         // save model with new data interaction
         $advancedSearch->save();
     }
 }