From 686f12261dd7a9b850537192c2edb4449b6d8e00 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 20 Oct 2020 10:55:14 +1100 Subject: [PATCH] Project number --- app/Http/Controllers/ProjectController.php | 5 ++- .../Requests/Project/StoreProjectRequest.php | 6 +++ app/Transformers/ProjectTransformer.php | 1 + app/Utils/Traits/GeneratesCounter.php | 39 +++++++++++++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/ProjectController.php b/app/Http/Controllers/ProjectController.php index 4b8b721d38bd..cfc772554147 100644 --- a/app/Http/Controllers/ProjectController.php +++ b/app/Http/Controllers/ProjectController.php @@ -24,6 +24,7 @@ use App\Models\Project; use App\Repositories\ProjectRepository; use App\Transformers\ProjectTransformer; use App\Utils\Traits\BulkOptions; +use App\Utils\Traits\GeneratesCounter; use App\Utils\Traits\MakesHash; use App\Utils\Traits\SavesDocuments; use Illuminate\Http\Request; @@ -36,7 +37,8 @@ class ProjectController extends BaseController { use MakesHash; use SavesDocuments; - + use GeneratesCounter; + protected $entity_type = Project::class; protected $entity_transformer = ProjectTransformer::class; @@ -353,6 +355,7 @@ class ProjectController extends BaseController { $project = ProjectFactory::create(auth()->user()->company()->id, auth()->user()->id); $project->fill($request->all()); + $project->number = $this->getNextProjectNumber($request->getClient($request->input('client_id'))); $project->save(); if ($request->has('documents')) { diff --git a/app/Http/Requests/Project/StoreProjectRequest.php b/app/Http/Requests/Project/StoreProjectRequest.php index 6c1d3ef94fec..1903854bbd0f 100644 --- a/app/Http/Requests/Project/StoreProjectRequest.php +++ b/app/Http/Requests/Project/StoreProjectRequest.php @@ -12,6 +12,7 @@ namespace App\Http\Requests\Project; use App\Http\Requests\Request; +use App\Models\Client; use App\Models\Project; use App\Utils\Traits\MakesHash; @@ -51,4 +52,9 @@ class StoreProjectRequest extends Request $this->replace($input); } + + public function getClient($client_id) + { + return Client::find($client_id); + } } diff --git a/app/Transformers/ProjectTransformer.php b/app/Transformers/ProjectTransformer.php index 6ba7d0749b97..76ac59224a10 100644 --- a/app/Transformers/ProjectTransformer.php +++ b/app/Transformers/ProjectTransformer.php @@ -48,6 +48,7 @@ class ProjectTransformer extends EntityTransformer 'assigned_user_id' => (string) $this->encodePrimaryKey($project->assigned_user_id), 'client_id' => (string) $this->encodePrimaryKey($project->client_id), 'name' => $project->name ?: '', + 'number' => $project->number, 'created_at' => (int) $project->created_at, 'updated_at' => (int) $project->updated_at, 'archived_at' => (int) $project->deleted_at, diff --git a/app/Utils/Traits/GeneratesCounter.php b/app/Utils/Traits/GeneratesCounter.php index ad1dc4d9898f..cf81cf79e707 100644 --- a/app/Utils/Traits/GeneratesCounter.php +++ b/app/Utils/Traits/GeneratesCounter.php @@ -16,6 +16,7 @@ use App\Models\Credit; use App\Models\Expense; use App\Models\Invoice; use App\Models\Payment; +use App\Models\Project; use App\Models\Quote; use App\Models\RecurringInvoice; use App\Models\Timezone; @@ -225,6 +226,44 @@ trait GeneratesCounter return (string) $payment_number; } + /** + * Project Number Generator. + * @return string The project number + */ + public function getNextProjectNumber(Client $client) :string + { + + //Reset counters if enabled + $this->resetCounters($client); + + $is_client_counter = false; + + //todo handle if we have specific client patterns in the future + $pattern = $client->company->settings->project_number_pattern; + + //Determine if we are using client_counters + if (strpos($pattern, 'client_counter') === false) { + $counter = $client->company->settings->project_number_counter; + } else { + $counter = $client->settings->project_number_counter; + $is_client_counter = true; + } + + //Return a valid counter + $pattern = ''; + $padding = $client->getSetting('counter_padding'); + $project_number = $this->checkEntityNumber(Project::class, $client, $counter, $padding, $pattern); + + //increment the correct invoice_number Counter (company vs client) + if ($is_client_counter) { + $this->incrementCounter($client, 'project_number_counter'); + } else { + $this->incrementCounter($client->company, 'project_number_counter'); + } + + return (string) $project_number; + } + /** * Gets the next client number. *