diff --git a/app/Export/CSV/BaseExport.php b/app/Export/CSV/BaseExport.php index 0fa46ba477a0..12f48e057b15 100644 --- a/app/Export/CSV/BaseExport.php +++ b/app/Export/CSV/BaseExport.php @@ -31,6 +31,8 @@ use App\Transformers\TaskTransformer; use App\Transformers\PaymentTransformer; use Illuminate\Database\Eloquent\Builder; use League\Fractal\Serializer\ArraySerializer; +use App\Models\Product; +use App\Models\Task; class BaseExport { @@ -235,8 +237,8 @@ class BaseExport ]; protected array $product_report_keys = [ - 'project' => 'project_id', - 'vendor' => 'vendor_id', + // 'project' => 'project_id', + // 'vendor' => 'vendor_id', 'custom_value1' => 'custom_value1', 'custom_value2' => 'custom_value2', 'custom_value3' => 'custom_value3', @@ -252,6 +254,10 @@ class BaseExport 'tax_name1' => 'tax_name1', 'tax_name2' => 'tax_name2', 'tax_name3' => 'tax_name3', + 'image' => 'product_image', + 'tax_category' => 'tax_id', + 'max_quantity' => 'max_quantity', + 'in_stock_quantity' => 'in_stock_quantity', ]; protected array $item_report_keys = [ @@ -992,6 +998,7 @@ class BaseExport $key = str_replace('payment.', '', $key); $key = str_replace('expense.', '', $key); $key = str_replace('product.', '', $key); + $key = str_replace('task.', '', $key); if(stripos($value, 'custom_value') !== false) { @@ -1015,7 +1022,7 @@ class BaseExport $custom_field_string = strlen($helper->makeCustomField($this->company->custom_fields, $entity)) > 1 ? $helper->makeCustomField($this->company->custom_fields, $entity) : ctrans("texts.{$parts[1]}"); $header[] = ctrans("texts.{$parts[0]}") . " " . $custom_field_string; } - elseif(count($parts) == 2 && in_array(substr($original_key, 0, -1), ['credit','quote','invoice','purchase_order','recurring_invoice'])){ + elseif(count($parts) == 2 && in_array(substr($original_key, 0, -1), ['credit','quote','invoice','purchase_order','recurring_invoice','task'])){ $custom_field_string = strlen($helper->makeCustomField($this->company->custom_fields, "product".substr($original_key,-1))) > 1 ? $helper->makeCustomField($this->company->custom_fields, "product".substr($original_key,-1)) : ctrans("texts.{$parts[1]}"); $header[] = ctrans("texts.{$parts[0]}") . " " . $custom_field_string; } @@ -1050,6 +1057,9 @@ class BaseExport Document::class => $entity = 'document', ClientContact::class => $entity = 'contact', PurchaseOrder::class => $entity = 'purchase_order', + Payment::class => $entity = 'payment', + Product::class => $entity = 'product', + Task::class => $entity = 'task', default => $entity = 'invoice', }; @@ -1060,6 +1070,17 @@ class BaseExport $report_keys = explode(".", $value); $column_key = $value; + + if($value == 'product_image') { + $column_key = 'image'; + $value = 'image'; + } + + if($value == 'tax_id') { + $column_key = 'tax_category'; + $value = 'tax_category'; + } + $clean_row[$key]['entity'] = $report_keys[0]; $clean_row[$key]['id'] = $report_keys[1] ?? $report_keys[0]; $clean_row[$key]['hashed_id'] = $report_keys[0] == $entity ? null : $resource->{$report_keys[0]}->hashed_id ?? null; diff --git a/app/Export/CSV/PaymentExport.php b/app/Export/CSV/PaymentExport.php index 930be240b75f..b868bd23ea71 100644 --- a/app/Export/CSV/PaymentExport.php +++ b/app/Export/CSV/PaymentExport.php @@ -16,7 +16,7 @@ use App\Models\Company; use App\Models\Payment; use App\Transformers\PaymentTransformer; use App\Utils\Ninja; -use Illuminate\Contracts\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Facades\App; use League\Csv\Writer; @@ -28,40 +28,6 @@ class PaymentExport extends BaseExport public Writer $csv; - // public array $entity_keys = [ - // 'amount' => 'amount', - // 'applied' => 'applied', - // 'client' => 'client_id', - // 'currency' => 'currency_id', - // 'custom_value1' => 'custom_value1', - // 'custom_value2' => 'custom_value2', - // 'custom_value3' => 'custom_value3', - // 'custom_value4' => 'custom_value4', - // 'date' => 'date', - // 'exchange_currency' => 'exchange_currency_id', - // 'gateway' => 'gateway_type_id', - // 'number' => 'number', - // 'private_notes' => 'private_notes', - // 'project' => 'project_id', - // 'refunded' => 'refunded', - // 'status' => 'status_id', - // 'transaction_reference' => 'transaction_reference', - // 'type' => 'type_id', - // 'vendor' => 'vendor_id', - // 'invoices' => 'invoices', - // ]; - - // private array $decorate_keys = [ - // 'vendor', - // 'status', - // 'project', - // 'client', - // 'currency', - // 'exchange_currency', - // 'type', - // 'invoices', - // ]; - public function __construct(Company $company, array $input) { $this->company = $company; @@ -105,12 +71,12 @@ class PaymentExport extends BaseExport $report = $query->cursor() ->map(function ($resource) { - return $this->buildRow($resource); + $row = $this->buildRow($resource); + return $this->processMetaData($row, $resource); })->toArray(); return array_merge(['columns' => $header], $report); - } public function run() diff --git a/app/Export/CSV/ProductExport.php b/app/Export/CSV/ProductExport.php index a4c5bbf7535c..0097040ba622 100644 --- a/app/Export/CSV/ProductExport.php +++ b/app/Export/CSV/ProductExport.php @@ -13,11 +13,10 @@ namespace App\Export\CSV; use App\Libraries\MultiDB; use App\Models\Company; -use App\Models\Document; use App\Models\Product; use App\Transformers\ProductTransformer; use App\Utils\Ninja; -use Illuminate\Contracts\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Facades\App; use League\Csv\Writer; @@ -48,7 +47,8 @@ class ProductExport extends BaseExport $report = $query->cursor() ->map(function ($resource) { - return $this->buildRow($resource); + $row = $this->buildRow($resource); + return $this->processMetaData($row, $resource); })->toArray(); return array_merge(['columns' => $header], $report); diff --git a/app/Export/CSV/TaskExport.php b/app/Export/CSV/TaskExport.php index 387bda902043..cd50dc8fe524 100644 --- a/app/Export/CSV/TaskExport.php +++ b/app/Export/CSV/TaskExport.php @@ -18,6 +18,7 @@ use App\Models\Task; use App\Models\Timezone; use App\Transformers\TaskTransformer; use App\Utils\Ninja; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\App; use League\Csv\Writer; @@ -33,6 +34,10 @@ class TaskExport extends BaseExport public Writer $csv; + private array $storage_array = []; + + private array $storage_item_array = []; + public array $entity_keys = [ 'start_date' => 'start_date', 'end_date' => 'end_date', @@ -65,7 +70,7 @@ class TaskExport extends BaseExport $this->entity_transformer = new TaskTransformer(); } - public function run() + public function init(): Builder { MultiDB::setDb($this->company->db); App::forgetInstance('translator'); @@ -74,19 +79,12 @@ class TaskExport extends BaseExport $t->replace(Ninja::transformTranslations($this->company->settings)); $this->date_format = DateFormat::find($this->company->settings->date_format_id)->format; - - //load the CSV document from a string - $this->csv = Writer::createFromString(); - ksort($this->entity_keys); if (count($this->input['report_keys']) == 0) { - $this->input['report_keys'] = array_values($this->entity_keys); + $this->input['report_keys'] = array_values($this->task_report_keys); } - //insert the header - $this->csv->insertOne($this->buildHeader()); - $query = Task::query() ->withTrashed() ->where('company_id', $this->company->id) @@ -94,51 +92,104 @@ class TaskExport extends BaseExport $query = $this->addDateRange($query); + return $query; + + } + + public function run() + { + + $query = $this->init(); + + //load the CSV document from a string + $this->csv = Writer::createFromString(); + + //insert the header + $this->csv->insertOne($this->buildHeader()); + $query->cursor() ->each(function ($entity) { $this->buildRow($entity); }); + $this->csv->insertAll($this->storage_array); + return $this->csv->toString(); } + + public function returnJson() + { + $query = $this->init(); + + $headerdisplay = $this->buildHeader(); + + $header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){ + return ['identifier' => $value, 'display_value' => $headerdisplay[$value]]; + })->toArray(); + + $query->cursor() + ->each(function ($resource) { + + $this->buildRow($resource); + + foreach($this->storage_array as $row) + { + $this->storage_item_array[] = $this->processMetaData($row, $resource); + } + + $this->storage_array = []; + }); + + return array_merge(['columns' => $header], $this->storage_item_array); + } + private function buildRow(Task $task) { $entity = []; $transformed_entity = $this->entity_transformer->transform($task); foreach (array_values($this->input['report_keys']) as $key) { - $keyval = array_search($key, $this->entity_keys); - if(!$keyval) { - $keyval = array_search(str_replace("task.", "", $key), $this->entity_keys) ?? $key; + $parts = explode('.', $key); + + if (is_array($parts) && $parts[0] == 'task' && array_key_exists($parts[1], $transformed_entity)) { + $entity[$key] = $transformed_entity[$parts[1]]; + } elseif (array_key_exists($key, $transformed_entity)) { + $entity[$key] = $transformed_entity[$key]; + } else { + $entity[$key] = $this->resolveKey($key, $task, $this->entity_transformer); } - if(!$keyval) { - $keyval = $key; - } + // $keyval = array_search($key, $this->entity_keys); - if (array_key_exists($key, $transformed_entity)) { - $entity[$keyval] = $transformed_entity[$key]; - } elseif (array_key_exists($keyval, $transformed_entity)) { - $entity[$keyval] = $transformed_entity[$keyval]; - } - else { - $entity[$keyval] = $this->resolveKey($keyval, $task, $this->entity_transformer); - } + // if(!$keyval) { + // $keyval = array_search(str_replace("task.", "", $key), $this->entity_keys) ?? $key; + // } + + // if(!$keyval) { + // $keyval = $key; + // } + + // if (array_key_exists($key, $transformed_entity)) { + // $entity[$keyval] = $transformed_entity[$key]; + // } elseif (array_key_exists($keyval, $transformed_entity)) { + // $entity[$keyval] = $transformed_entity[$keyval]; + // } + // else { + // $entity[$keyval] = $this->resolveKey($keyval, $task, $this->entity_transformer); + // } } $entity['start_date'] = ''; $entity['end_date'] = ''; $entity['duration'] = ''; - if (is_null($task->time_log) || (is_array(json_decode($task->time_log, 1)) && count(json_decode($task->time_log, 1)) == 0)) { - $this->csv->insertOne($entity); + $this->storage_array[] = $entity; } else { $this->iterateLogs($task, $entity); } - } @@ -180,12 +231,13 @@ class TaskExport extends BaseExport $entity = $this->decorateAdvancedFields($task, $entity); - $this->csv->insertOne($entity); + $this->storage_array[] = $entity; unset($entity['start_date']); unset($entity['end_date']); unset($entity['duration']); } + } private function decorateAdvancedFields(Task $task, array $entity) :array diff --git a/app/Http/Controllers/Reports/InvoiceItemReportController.php b/app/Http/Controllers/Reports/InvoiceItemReportController.php index dc568dfad629..a124171cc66e 100644 --- a/app/Http/Controllers/Reports/InvoiceItemReportController.php +++ b/app/Http/Controllers/Reports/InvoiceItemReportController.php @@ -80,7 +80,6 @@ class InvoiceItemReportController extends BaseController return response()->json(['message' => $hash], 200); } - $export = new InvoiceItemExport($user->company(), $request->all()); diff --git a/app/Http/Controllers/Reports/TaskReportController.php b/app/Http/Controllers/Reports/TaskReportController.php index 5eff880c38de..8339a909bcb0 100644 --- a/app/Http/Controllers/Reports/TaskReportController.php +++ b/app/Http/Controllers/Reports/TaskReportController.php @@ -11,12 +11,13 @@ namespace App\Http\Controllers\Reports; +use Illuminate\Http\Response; use App\Export\CSV\TaskExport; +use App\Utils\Traits\MakesHash; +use App\Jobs\Report\SendToAdmin; +use App\Jobs\Report\PreviewReport; use App\Http\Controllers\BaseController; use App\Http\Requests\Report\GenericReportRequest; -use App\Jobs\Report\SendToAdmin; -use App\Utils\Traits\MakesHash; -use Illuminate\Http\Response; class TaskReportController extends BaseController { @@ -62,14 +63,26 @@ class TaskReportController extends BaseController */ public function __invoke(GenericReportRequest $request) { + /** @var \App\Models\User $user */ + $user = auth()->user(); + if ($request->has('send_email') && $request->get('send_email')) { - SendToAdmin::dispatch(auth()->user()->company(), $request->all(), TaskExport::class, $this->filename); + SendToAdmin::dispatch($user->company(), $request->all(), TaskExport::class, $this->filename); return response()->json(['message' => 'working...'], 200); } // expect a list of visible fields, or use the default - $export = new TaskExport(auth()->user()->company(), $request->all()); + if($request->has('output') && $request->input('output') == 'json') { + + $hash = \Illuminate\Support\Str::uuid(); + + PreviewReport::dispatch($user->company(), $request->all(), TaskExport::class, $hash); + + return response()->json(['message' => $hash], 200); + } + + $export = new TaskExport($user->company(), $request->all()); $csv = $export->run(); diff --git a/lang/en/texts.php b/lang/en/texts.php index 8be95187c7be..b67f6f745b16 100644 --- a/lang/en/texts.php +++ b/lang/en/texts.php @@ -5158,6 +5158,7 @@ $LANG = array( 'click_or_drop_files_here' => 'Click or drop files here', 'set_public' => 'Set public', 'set_private' => 'Set private', + 'in_stock_quantity' => 'Stock quantity', ); return $LANG;