diff --git a/app/Http/Controllers/SubscriptionController.php b/app/Http/Controllers/SubscriptionController.php index 9a21f2043293..efc14f00def1 100644 --- a/app/Http/Controllers/SubscriptionController.php +++ b/app/Http/Controllers/SubscriptionController.php @@ -16,6 +16,7 @@ use App\Events\Subscription\SubscriptionWasCreated; use App\Events\Subscription\SubscriptionWasUpdated; use App\Factory\SubscriptionFactory; use App\Filters\SubscriptionFilters; +use App\Http\Requests\Subscription\BulkSubscriptionRequest; use App\Http\Requests\Subscription\CreateSubscriptionRequest; use App\Http\Requests\Subscription\DestroySubscriptionRequest; use App\Http\Requests\Subscription\EditSubscriptionRequest; @@ -466,22 +467,31 @@ class SubscriptionController extends BaseController * ), * ) */ - public function bulk() + public function bulk(BulkSubscriptionRequest $request) { /** @var \App\Models\User $user */ $user = auth()->user(); - $action = request()->input('action'); + $subscriptions = Subscription::withTrashed()->find($request->ids); - $ids = request()->input('ids'); - $subscriptions = Subscription::withTrashed()->find($this->transformKeys($ids)); + if(in_array($request->action, ['assign_invoice'])) { + + $subscriptions->each(function ($subscription, $key) use ($request, $user) { + if ($user->can('edit', $subscription)) { + $this->subscription_repo->{$request->action}($subscription, $request); + } + }); - $subscriptions->each(function ($subscription, $key) use ($action, $user) { + return $this->listResponse(Subscription::withTrashed()->whereIn('id', $request->ids)); + + } + + $subscriptions->each(function ($subscription, $key) use ($request, $user) { if ($user->can('edit', $subscription)) { - $this->subscription_repo->{$action}($subscription); + $this->subscription_repo->{$request->action}($subscription); } }); - return $this->listResponse(Subscription::withTrashed()->whereIn('id', $this->transformKeys($ids))); + return $this->listResponse(Subscription::withTrashed()->whereIn('id', $request->ids)); } } diff --git a/app/Repositories/SubscriptionRepository.php b/app/Repositories/SubscriptionRepository.php index 4e1d05f9f291..e9b83ea30f79 100644 --- a/app/Repositories/SubscriptionRepository.php +++ b/app/Repositories/SubscriptionRepository.php @@ -21,6 +21,7 @@ use App\Models\InvoiceInvitation; use App\Models\Subscription; use App\Utils\Traits\CleanLineItems; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Str; class SubscriptionRepository extends BaseRepository { @@ -163,4 +164,18 @@ class SubscriptionRepository extends BaseRepository return $item; } + + public function assign_invoice(Subscription $subscription, $request) + { + $class = "\\App\\Models\\".ucfirst(Str::camel($request->entity)); + + $entity = $class::withTrashed()->find($request->entity_id); + + if($entity){ + $entity->subscription_id = $subscription->id; + $entity->save(); + } + + return $subscription; + } } diff --git a/tests/Feature/SubscriptionApiTest.php b/tests/Feature/SubscriptionApiTest.php index 61f72e0d6451..a0fb674d794a 100644 --- a/tests/Feature/SubscriptionApiTest.php +++ b/tests/Feature/SubscriptionApiTest.php @@ -11,16 +11,18 @@ namespace Tests\Feature; +use Tests\TestCase; +use App\Models\Invoice; use App\Models\Product; +use App\Models\RecurringInvoice; +use Tests\MockAccountData; +use Illuminate\Support\Str; use App\Models\Subscription; use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\Model; -use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Support\Facades\Session; -use Illuminate\Support\Str; use Illuminate\Validation\ValidationException; -use Tests\MockAccountData; -use Tests\TestCase; +use Illuminate\Foundation\Testing\DatabaseTransactions; /** * @test @@ -32,6 +34,8 @@ class SubscriptionApiTest extends TestCase use DatabaseTransactions; use MockAccountData; + protected $faker; + protected function setUp(): void { parent::setUp(); @@ -47,6 +51,82 @@ class SubscriptionApiTest extends TestCase Model::reguard(); } + public function testAssignInvoice() + { + $i = Invoice::factory() + ->create([ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'client_id' => $this->client->id, + ]); + + + $s = Subscription::factory() + ->create([ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + + ]); + + $data = [ + 'ids' => [$s->hashed_id], + 'entity' => 'invoice', + 'entity_id' => $i->hashed_id, + 'action' => 'assign_invoice' + ]; + + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/subscriptions/bulk', $data); + + $response->assertStatus(200); + + $i = $i->fresh(); + + $this->assertEquals($s->id, $i->subscription_id); + + } + + public function testAssignRecurringInvoice() + { + $i = RecurringInvoice::factory() + ->create([ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'client_id' => $this->client->id, + ]); + + + $s = Subscription::factory() + ->create([ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + + ]); + + $data = [ + 'ids' => [$s->hashed_id], + 'entity' => 'recurring_invoice', + 'entity_id' => $i->hashed_id, + 'action' => 'assign_invoice' + ]; + + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/subscriptions/bulk', $data); + + $response->assertStatus(200); + + $i = $i->fresh(); + + $this->assertEquals($s->id, $i->subscription_id); + + } + public function testSubscriptionFilter() { $response = $this->withHeaders([