diff --git a/app/Export/CSV/BaseExport.php b/app/Export/CSV/BaseExport.php index 6be20cafa90f..483c1c0b4a48 100644 --- a/app/Export/CSV/BaseExport.php +++ b/app/Export/CSV/BaseExport.php @@ -13,6 +13,7 @@ namespace App\Export\CSV; use App\Utils\Number; use App\Models\Client; +use App\Models\ClientContact; use App\Utils\Helpers; use App\Models\Company; use App\Models\Expense; @@ -1028,4 +1029,35 @@ class BaseExport return $header; } + + public function processMetaData(array $row, $resource): array + { + $class = get_class($resource); + + match ($class) { + Invoice::class => $entity = 'invoice', + Expense::class => $entity = 'expense', + ClientContact::class => $entity = 'contact', + default => $entity = 'invoice', + }; + + $clean_row = []; + + foreach (array_values($this->input['report_keys']) as $key => $value) { + + $report_keys = explode(".", $value); + + $column_key = $value; + $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; + $clean_row[$key]['value'] = $row[$column_key]; + $clean_row[$key]['identifier'] = $value; + $clean_row[$key]['display_value'] = $row[$column_key]; + + } + + return $clean_row; + } + } diff --git a/app/Export/CSV/ClientExport.php b/app/Export/CSV/ClientExport.php index 608595196fea..79a59ddbd71a 100644 --- a/app/Export/CSV/ClientExport.php +++ b/app/Export/CSV/ClientExport.php @@ -11,15 +11,16 @@ namespace App\Export\CSV; -use App\Libraries\MultiDB; -use App\Models\Client; -use App\Models\Company; -use App\Transformers\ClientContactTransformer; -use App\Transformers\ClientTransformer; use App\Utils\Ninja; -use Illuminate\Database\Eloquent\Builder; -use Illuminate\Support\Facades\App; +use App\Utils\Number; +use App\Models\Client; use League\Csv\Writer; +use App\Models\Company; +use App\Libraries\MultiDB; +use Illuminate\Support\Facades\App; +use App\Transformers\ClientTransformer; +use Illuminate\Database\Eloquent\Builder; +use App\Transformers\ClientContactTransformer; class ClientExport extends BaseExport { @@ -93,7 +94,8 @@ class ClientExport extends BaseExport $report = $query->cursor() ->map(function ($client) { - return $this->buildRow($client); + $row = $this->buildRow($client); + return $this->processMetaData($row, $client); })->toArray(); return array_merge(['columns' => $header], $report); @@ -171,6 +173,30 @@ class ClientExport extends BaseExport return $this->decorateAdvancedFields($client, $entity); } + public function processMetaData(array $row, $resource): array + { + $clean_row = []; + foreach (array_values($this->input['report_keys']) as $key => $value) { + + $report_keys = explode(".", $value); + + $column_key = $value; + $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] == 'client' ? null : $resource->{$report_keys[0]}->hashed_id ?? null; + $clean_row[$key]['value'] = $row[$column_key]; + $clean_row[$key]['identifier'] = $value; + + if(in_array($clean_row[$key]['id'], ['paid_to_date', 'balance', 'credit_balance','payment_balance'])) + $clean_row[$key]['display_value'] = Number::formatMoney($row[$column_key], $resource); + else + $clean_row[$key]['display_value'] = $row[$column_key]; + + } + + return $clean_row; + } + private function decorateAdvancedFields(Client $client, array $entity) :array { if (in_array('client.user', $this->input['report_keys'])) { diff --git a/app/Export/CSV/ContactExport.php b/app/Export/CSV/ContactExport.php index 5efddeaade90..9de6b85d7420 100644 --- a/app/Export/CSV/ContactExport.php +++ b/app/Export/CSV/ContactExport.php @@ -94,7 +94,8 @@ class ContactExport extends BaseExport $report = $query->cursor() ->map(function ($contact) { - return $this->buildRow($contact); + $row = $this->buildRow($contact); + return $this->processMetaData($row, $contact); })->toArray(); return array_merge(['columns' => $header], $report); diff --git a/app/Export/CSV/CreditExport.php b/app/Export/CSV/CreditExport.php index d9641895371b..ca0fde8bfed6 100644 --- a/app/Export/CSV/CreditExport.php +++ b/app/Export/CSV/CreditExport.php @@ -56,7 +56,7 @@ class CreditExport extends BaseExport return array_merge(['columns' => $header], $report); } - private function processMetaData(array $row, Credit $credit): array + public function processMetaData(array $row, $resource): array { $clean_row = []; foreach (array_values($this->input['report_keys']) as $key => $value) { diff --git a/app/Export/CSV/DocumentExport.php b/app/Export/CSV/DocumentExport.php index 26d55840e431..391fe14050a3 100644 --- a/app/Export/CSV/DocumentExport.php +++ b/app/Export/CSV/DocumentExport.php @@ -56,11 +56,33 @@ class DocumentExport extends BaseExport $report = $query->cursor() ->map(function ($document) { $row = $this->buildRow($document); + return $this->processMetaData($row, $document); })->toArray(); return array_merge(['columns' => $header], $report); } + private function processMetaData(array $row, Document $document): array + { + $clean_row = []; + foreach (array_values($this->input['report_keys']) as $key => $value) { + + $report_keys = explode(".", $value); + + $column_key = $value; + $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] == 'document' ? null : $document->{$report_keys[0]}->hashed_id ?? null; + $clean_row[$key]['value'] = $row[$column_key]; + $clean_row[$key]['identifier'] = $value; + + $clean_row[$key]['display_value'] = $row[$column_key]; + + } + + return $clean_row; + } + private function init(): Builder { diff --git a/app/Export/CSV/ExpenseExport.php b/app/Export/CSV/ExpenseExport.php index 1eb5747cc16f..32eaf9b6ca60 100644 --- a/app/Export/CSV/ExpenseExport.php +++ b/app/Export/CSV/ExpenseExport.php @@ -49,7 +49,8 @@ class ExpenseExport 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/InvoiceExport.php b/app/Export/CSV/InvoiceExport.php index bf999f9177f7..4123940a7695 100644 --- a/app/Export/CSV/InvoiceExport.php +++ b/app/Export/CSV/InvoiceExport.php @@ -78,7 +78,8 @@ class InvoiceExport 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/InvoiceItemExport.php b/app/Export/CSV/InvoiceItemExport.php index d7db46889269..92e85fcd348a 100644 --- a/app/Export/CSV/InvoiceItemExport.php +++ b/app/Export/CSV/InvoiceItemExport.php @@ -81,12 +81,16 @@ class InvoiceItemExport extends BaseExport return ['identifier' => $value, 'display_value' => $headerdisplay[$value]]; })->toArray(); - $query->cursor() - ->each(function ($resource) { + $items = $query->cursor() + ->map(function ($resource) { $this->iterateItems($resource); - }); + $row = $this->processMetaData($this->storage_array[0], $resource); + $this->storage_array = []; + return $row; + })->toArray(); - return array_merge(['columns' => $header], $this->storage_array); + + return array_merge(['columns' => $header], $items); } @@ -188,13 +192,36 @@ class InvoiceItemExport extends BaseExport $entity['tax_category'] = $invoice->taxTypeString($entity['tax_category']); } - // if($this->force_keys) { - // $entity['client'] = $invoice->client->present()->name(); - // $entity['client_id_number'] = $invoice->client->id_number; - // $entity['client_number'] = $invoice->client->number; - // $entity['status'] = $invoice->stringStatus($invoice->status_id); - // } - return $entity; } + + public function processMetaData(array $row, $resource): array + { + $entity = 'invoice'; + $clean_row = []; + + foreach (array_values($this->input['report_keys']) as $key => $value) { + + $report_keys = explode(".", $value); + + $column_key = $value; + + if($value == 'type_id' || $value == 'item.type_id') + $column_key = 'type'; + + if($value == 'tax_id' || $value == 'item.tax_id') + $column_key = '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; + $clean_row[$key]['value'] = isset($row[$column_key]) ? $row[$column_key] : $row[$report_keys[1]]; + $clean_row[$key]['identifier'] = $value; + $clean_row[$key]['display_value'] = isset($row[$column_key]) ? $row[$column_key] : $row[$report_keys[1]]; + + } + + return $clean_row; + } + } diff --git a/app/Http/Controllers/QuoteController.php b/app/Http/Controllers/QuoteController.php index 301307372ae6..45cfc2293fd8 100644 --- a/app/Http/Controllers/QuoteController.php +++ b/app/Http/Controllers/QuoteController.php @@ -576,14 +576,9 @@ class QuoteController extends BaseController if ($action == 'convert_to_project') { $quotes->each(function ($quote, $key) use ($user) { if ($user->can('edit', $quote)) { - $project = CloneQuoteToProjectFactory::create($quote, $user->id); - - if (empty($project->number)) { - $project->number = $this->getNextProjectNumber($project); - } - $project->save(); - $quote->project_id = $project->id; - $quote->save(); + + $quote->service()->convertToProject(); + } }); diff --git a/app/Http/Controllers/Reports/DocumentReportController.php b/app/Http/Controllers/Reports/DocumentReportController.php index 42dc7478c962..d0cd939c86a7 100644 --- a/app/Http/Controllers/Reports/DocumentReportController.php +++ b/app/Http/Controllers/Reports/DocumentReportController.php @@ -11,12 +11,13 @@ namespace App\Http\Controllers\Reports; +use Illuminate\Http\Response; +use App\Utils\Traits\MakesHash; +use App\Jobs\Report\SendToAdmin; use App\Export\CSV\DocumentExport; +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 DocumentReportController extends BaseController { @@ -62,14 +63,27 @@ class DocumentReportController 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(), DocumentExport::class, $this->filename); + SendToAdmin::dispatch($user->company(), $request->all(), DocumentExport::class, $this->filename); return response()->json(['message' => 'working...'], 200); } // expect a list of visible fields, or use the default - $export = new DocumentExport(auth()->user()->company(), $request->all()); + if($request->has('output') && $request->input('output') == 'json') { + + $hash = \Illuminate\Support\Str::uuid(); + + PreviewReport::dispatch($user->company(), $request->all(), DocumentExport::class, $hash); + + return response()->json(['message' => $hash], 200); + } + + $export = new DocumentExport($user->company(), $request->all()); $csv = $export->run(); diff --git a/app/Services/Quote/ConvertQuoteToProject.php b/app/Services/Quote/ConvertQuoteToProject.php index d74b05f49ebd..6b1b642cd16a 100644 --- a/app/Services/Quote/ConvertQuoteToProject.php +++ b/app/Services/Quote/ConvertQuoteToProject.php @@ -64,7 +64,7 @@ class ConvertQuoteToProject $task->project_id = $this->quote->project_id; $task->description = $item->notes; $task->status_id = $task_status->id; - $task->rate = $item->unit_cost; + $task->rate = $item->cost; $task_repo->save([], $task); });