diff --git a/app/Http/Controllers/ImportController.php b/app/Http/Controllers/ImportController.php index 74e09f9e49ac..2871bc41e7b5 100644 --- a/app/Http/Controllers/ImportController.php +++ b/app/Http/Controllers/ImportController.php @@ -143,7 +143,6 @@ class ImportController extends Controller foreach($headers as $key => $value) { if(isset($hints[$key])) { - nlog($hints[$key]); continue; } diff --git a/app/Http/Controllers/QuoteController.php b/app/Http/Controllers/QuoteController.php index 4d06e8bc5ca6..ac923ebf1ccc 100644 --- a/app/Http/Controllers/QuoteController.php +++ b/app/Http/Controllers/QuoteController.php @@ -16,6 +16,7 @@ use App\Models\Quote; use App\Models\Client; use App\Models\Account; use App\Models\Invoice; +use App\Models\Project; use Illuminate\Http\Request; use App\Factory\QuoteFactory; use App\Filters\QuoteFilters; @@ -33,6 +34,7 @@ use App\Transformers\QuoteTransformer; use App\Utils\Traits\GeneratesCounter; use Illuminate\Support\Facades\Storage; use App\Transformers\InvoiceTransformer; +use App\Transformers\ProjectTransformer; use App\Factory\CloneQuoteToInvoiceFactory; use App\Factory\CloneQuoteToProjectFactory; use App\Http\Requests\Quote\EditQuoteRequest; @@ -683,7 +685,14 @@ class QuoteController extends BaseController private function performAction(Quote $quote, $action, $bulk = false) { switch ($action) { - case 'convert': + case 'convert_to_project': + + $this->entity_type = Project::class; + $this->entity_transformer = ProjectTransformer::class; + + return $this->itemResponse($quote->service()->convertToProject()); + + case 'convert': case 'convert_to_invoice': $this->entity_type = Invoice::class; @@ -691,8 +700,6 @@ class QuoteController extends BaseController return $this->itemResponse($quote->service()->convertToInvoice()); - break; - case 'clone_to_invoice': $this->entity_type = Invoice::class; @@ -701,19 +708,19 @@ class QuoteController extends BaseController $invoice = CloneQuoteToInvoiceFactory::create($quote, auth()->user()->id); return $this->itemResponse($invoice); - break; + case 'clone_to_quote': $quote = CloneQuoteFactory::create($quote, auth()->user()->id); return $this->itemResponse($quote); - break; + case 'approve': if (! in_array($quote->status_id, [Quote::STATUS_SENT, Quote::STATUS_DRAFT])) { return response()->json(['message' => ctrans('texts.quote_unapprovable')], 400); } return $this->itemResponse($quote->service()->approveWithNoCoversion()->save()); - break; + case 'history': // code... break; @@ -725,16 +732,14 @@ class QuoteController extends BaseController echo Storage::get($file); }, basename($file), ['Content-Type' => 'application/pdf']); - - break; case 'restore': $this->quote_repo->restore($quote); if (! $bulk) { return $this->itemResponse($quote); } - break; + case 'archive': $this->quote_repo->archive($quote); @@ -752,16 +757,11 @@ class QuoteController extends BaseController break; case 'email': - $quote->service()->sendEmail(); - - return response()->json(['message'=> ctrans('texts.sent_message')], 200); - break; - case 'send_email': + $quote->service()->sendEmail(); return response()->json(['message'=> ctrans('texts.sent_message')], 200); - break; case 'mark_sent': $quote->service()->markSent()->save(); diff --git a/app/Http/Requests/Quote/BulkActionQuoteRequest.php b/app/Http/Requests/Quote/BulkActionQuoteRequest.php index b3fb8857f3bc..c9f41313a568 100644 --- a/app/Http/Requests/Quote/BulkActionQuoteRequest.php +++ b/app/Http/Requests/Quote/BulkActionQuoteRequest.php @@ -30,9 +30,11 @@ class BulkActionQuoteRequest extends Request { $input = $this->all(); - $rules = []; + $rules = [ + 'action' => 'sometimes|in:convert_to_invoice,convert_to_project,email,bulk_download,bulk_print,clone_to_invoice,approve,download,restore,archive,delete,send_email,mark_sent', + ]; - if ($input['action'] == 'convert_to_invoice') { + if (in_array($input['action'], ['convert,convert_to_invoice']) ) { $rules['action'] = [new ConvertableQuoteRule()]; } diff --git a/app/Http/Requests/Task/StoreTaskRequest.php b/app/Http/Requests/Task/StoreTaskRequest.php index 6dab0aa252c7..826954b0cd80 100644 --- a/app/Http/Requests/Task/StoreTaskRequest.php +++ b/app/Http/Requests/Task/StoreTaskRequest.php @@ -28,23 +28,30 @@ class StoreTaskRequest extends Request */ public function authorize() : bool { - return auth()->user()->can('create', Task::class); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + return $user->can('create', Task::class); } public function rules() { + + /** @var \App\Models\User $user */ + $user = auth()->user(); + $rules = []; if (isset($this->number)) { - $rules['number'] = Rule::unique('tasks')->where('company_id', auth()->user()->company()->id); + $rules['number'] = Rule::unique('tasks')->where('company_id', $user->company()->id); } if (isset($this->client_id)) { - $rules['client_id'] = 'bail|required|exists:clients,id,company_id,'.auth()->user()->company()->id.',is_deleted,0'; + $rules['client_id'] = 'bail|required|exists:clients,id,company_id,'.$user->company()->id.',is_deleted,0'; } if (isset($this->project_id)) { - $rules['project_id'] = 'bail|required|exists:projects,id,company_id,'.auth()->user()->company()->id.',is_deleted,0'; + $rules['project_id'] = 'bail|required|exists:projects,id,company_id,'.$user->company()->id.',is_deleted,0'; } $rules['timelog'] = ['bail','array',function ($attribute, $values, $fail) { diff --git a/app/Repositories/TaskRepository.php b/app/Repositories/TaskRepository.php index f3f5642dc198..ab97fe7f7aa3 100644 --- a/app/Repositories/TaskRepository.php +++ b/app/Repositories/TaskRepository.php @@ -45,7 +45,7 @@ class TaskRepository extends BaseRepository $task->saveQuietly(); if ($this->new_task && ! $task->status_id) { - $this->setDefaultStatus($task); + $task->status_id = $this->setDefaultStatus($task); } $task->number = empty($task->number) || ! array_key_exists('number', $data) ? $this->trySaving($task) : $data['number']; diff --git a/app/Services/Quote/QuoteService.php b/app/Services/Quote/QuoteService.php index 908cb257c151..e12168af52e1 100644 --- a/app/Services/Quote/QuoteService.php +++ b/app/Services/Quote/QuoteService.php @@ -13,13 +13,14 @@ namespace App\Services\Quote; use App\Utils\Ninja; use App\Models\Quote; -use App\Jobs\Util\UnlinkFile; +use App\Models\Project; use App\Utils\Traits\MakesHash; use App\Exceptions\QuoteConversion; use App\Jobs\Entity\CreateEntityPdf; use App\Repositories\QuoteRepository; use App\Events\Quote\QuoteWasApproved; use Illuminate\Support\Facades\Storage; +use App\Services\Quote\ConvertQuoteToProject; class QuoteService { @@ -41,6 +42,13 @@ class QuoteService return $this; } + public function convertToProject(): Project + { + $project = (new ConvertQuoteToProject($this->quote))->run(); + + return $project; + } + public function convert() :self { if ($this->quote->invoice_id) { diff --git a/tests/Feature/TaskApiTest.php b/tests/Feature/TaskApiTest.php index 1651954bb121..931f0062cf26 100644 --- a/tests/Feature/TaskApiTest.php +++ b/tests/Feature/TaskApiTest.php @@ -102,6 +102,28 @@ class TaskApiTest extends TestCase } } + public function testStatusSets() + { + + $data = [ + 'client_id' => $this->client->id, + 'user_id' => $this->user->id, + 'company_id' => $this->company->id, + 'description' => 'Test Task', + 'time_log' => '[[1681165417,1681165432,"sumtin",true],[1681165446,0]]', + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson("/api/v1/tasks"); + + $response->assertStatus(200); + $arr = $response->json(); + + $this->assertNotEmpty($arr['data']['status_id']); + } + public function testStartDate() { $x = [];