From f7135c9b27248fce4473f307c35b9a72b7cc2d2b Mon Sep 17 00:00:00 2001 From: Peter Papp Date: Tue, 27 Apr 2021 08:57:00 +0200 Subject: [PATCH] get invoice from url --- app/Console/Commands/SetupDevEnvironment.php | 4 - .../Commands/SetupOasisEnvironment.php | 112 ++++++++++++++++++ app/Console/Kernel.php | 2 + .../Controllers/Oasis/InvoiceController.php | 14 +++ .../Resources/Oasis/OasisInvoiceResource.php | 4 +- app/Services/Oasis/OasisDevService.php | 38 ------ routes/oasis.php | 5 + tests/Feature/Oasis/OasisInvoiceTest.php | 39 ++++++ 8 files changed, 175 insertions(+), 43 deletions(-) create mode 100644 app/Console/Commands/SetupOasisEnvironment.php diff --git a/app/Console/Commands/SetupDevEnvironment.php b/app/Console/Commands/SetupDevEnvironment.php index a333e8e5..dd676cd3 100644 --- a/app/Console/Commands/SetupDevEnvironment.php +++ b/app/Console/Commands/SetupDevEnvironment.php @@ -5,7 +5,6 @@ namespace App\Console\Commands; use App\Models\File; use App\Models\Folder; use App\Models\Share; -use App\Services\Oasis\OasisDevService; use App\Services\SetupService; use App\Models\Setting; use App\Models\User; @@ -74,9 +73,6 @@ class SetupDevEnvironment extends Command $this->info('Clearing application cache...'); $this->clear_cache(); - // Oasis demo content generator - resolve(OasisDevService::class)->create_demo_content(); - $this->info('Dispatching jobs...'); $this->call('queue:work', [ '--stop-when-empty' => true, diff --git a/app/Console/Commands/SetupOasisEnvironment.php b/app/Console/Commands/SetupOasisEnvironment.php new file mode 100644 index 00000000..bb77edc5 --- /dev/null +++ b/app/Console/Commands/SetupOasisEnvironment.php @@ -0,0 +1,112 @@ +info('Setting up Oasis environment'); + + $this->create_demo_content(); + + $this->info('Dispatching jobs...'); + $this->call('queue:work', [ + '--stop-when-empty' => true, + ]); + + $this->info('Everything is done, congratulations! 🥳🥳🥳'); + } + + public function create_demo_content() + { + $user = User::whereEmail('howdy@hi5ve.digital') + ->first(); + + $clients = Client::factory(Client::class) + ->count(6) + ->create(['user_id' => $user->id]); + + $regular_invoices = Invoice::factory(Invoice::class) + ->state(new Sequence( + ['client_id' => $clients[0]->id], + ['client_id' => $clients[1]->id], + ['client_id' => $clients[2]->id], + ['client_id' => $clients[3]->id], + ['client_id' => $clients[4]->id], + ['client_id' => $clients[5]->id], + ))->count(2) + ->create([ + 'user_id' => $user->id, + 'invoice_type' => 'regular-invoice' + ]); + + $advance_invoices = Invoice::factory(Invoice::class) + ->count(2) + ->state(new Sequence( + ['client_id' => $clients[0]->id], + ['client_id' => $clients[1]->id], + ['client_id' => $clients[2]->id], + ['client_id' => $clients[3]->id], + ['client_id' => $clients[4]->id], + ['client_id' => $clients[5]->id], + ))->create([ + 'user_id' => $user->id, + 'invoice_type' => 'advance-invoice', + 'discount_type' => null, + ]); + + // Generate PDF + collect([$regular_invoices, $advance_invoices]) + ->collapse() + ->each(function ($invoice) use ($user) { + + $this->info("Generating invoice id: $invoice->id"); + + \PDF::loadView('oasis.invoices.invoice', [ + 'invoice' => Invoice::find($invoice->id), + 'user' => $user, + ]) + ->setPaper('a4') + ->setOrientation('portrait') + ->save( + storage_path("app/files/{$invoice->user_id}/invoice-{$invoice->id}.pdf") + ); + }); + } +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index acf74fb4..457947af 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -3,6 +3,7 @@ namespace App\Console; use App\Console\Commands\SetupDevEnvironment; +use App\Console\Commands\SetupOasisEnvironment; use App\Services\Oasis\OasisService; use App\Console\Commands\SetupProdEnvironment; use App\Services\SchedulerService; @@ -19,6 +20,7 @@ class Kernel extends ConsoleKernel protected $commands = [ SetupDevEnvironment::class, SetupProdEnvironment::class, + SetupOasisEnvironment::class, ]; /** diff --git a/app/Http/Controllers/Oasis/InvoiceController.php b/app/Http/Controllers/Oasis/InvoiceController.php index a2ceb5e9..4c321f67 100644 --- a/app/Http/Controllers/Oasis/InvoiceController.php +++ b/app/Http/Controllers/Oasis/InvoiceController.php @@ -16,6 +16,7 @@ use Illuminate\Contracts\Routing\ResponseFactory; use Illuminate\Http\Response; use Illuminate\Support\Facades\Notification; use Illuminate\Support\Str; +use Storage; class InvoiceController extends Controller { @@ -39,6 +40,19 @@ class InvoiceController extends Controller ); } + /** + * @param Invoice $invoice + * @return \Symfony\Component\HttpFoundation\StreamedResponse + */ + public function get_invoice(Invoice $invoice) + { + if (! Storage::exists(invoice_path($invoice))) { + abort(404, 'Not Found'); + } + + return Storage::download(invoice_path($invoice), "invoice-{$invoice->id}.pdf"); + } + /** * @return mixed */ diff --git a/app/Http/Resources/Oasis/OasisInvoiceResource.php b/app/Http/Resources/Oasis/OasisInvoiceResource.php index 712b79db..12675fdb 100644 --- a/app/Http/Resources/Oasis/OasisInvoiceResource.php +++ b/app/Http/Resources/Oasis/OasisInvoiceResource.php @@ -3,6 +3,8 @@ namespace App\Http\Resources\Oasis; use Illuminate\Http\Resources\Json\JsonResource; +use Illuminate\Support\Facades\Storage; +use Illuminate\Support\Str; class OasisInvoiceResource extends JsonResource { @@ -19,7 +21,7 @@ class OasisInvoiceResource extends JsonResource 'name' => $this->client['name'] . ' ' . format_to_currency($this->total_net, $this->currency), 'invoiceNumber' => $this->invoice_number, 'total' => format_to_currency($this->total_net, $this->currency), - 'file_url' => '', + 'file_url' => "/oasis/invoice/$this->id", 'clientName' => $this->client['name'], 'mimetype' => 'pdf', 'type' => 'invoice', diff --git a/app/Services/Oasis/OasisDevService.php b/app/Services/Oasis/OasisDevService.php index d49408c5..fcc25eb2 100644 --- a/app/Services/Oasis/OasisDevService.php +++ b/app/Services/Oasis/OasisDevService.php @@ -14,44 +14,6 @@ use Illuminate\Database\Eloquent\Factories\Sequence; class OasisDevService { - public function create_demo_content() - { - $user = User::whereEmail('howdy@hi5ve.digital') - ->first(); - - $clients = Client::factory(Client::class) - ->count(6) - ->create(['user_id' => $user->id]); - - Invoice::factory(Invoice::class) - ->state(new Sequence( - ['client_id' => $clients[0]->id], - ['client_id' => $clients[1]->id], - ['client_id' => $clients[2]->id], - ['client_id' => $clients[3]->id], - ['client_id' => $clients[4]->id], - ['client_id' => $clients[5]->id], - ))->count(14) - ->create([ - 'user_id' => $user->id, - 'invoice_type' => 'regular-invoice' - ]); - - Invoice::factory(Invoice::class) - ->count(14) - ->state(new Sequence( - ['client_id' => $clients[0]->id], - ['client_id' => $clients[1]->id], - ['client_id' => $clients[2]->id], - ['client_id' => $clients[3]->id], - ['client_id' => $clients[4]->id], - ['client_id' => $clients[5]->id], - ))->create([ - 'user_id' => $user->id, - 'invoice_type' => 'advance-invoice' - ]); - } - /** * @return Application|Factory|View */ diff --git a/routes/oasis.php b/routes/oasis.php index 172668d6..90493086 100644 --- a/routes/oasis.php +++ b/routes/oasis.php @@ -43,6 +43,11 @@ Route::group(['middleware' => 'api', 'prefix' => '/api/oasis'], function () { // Web routes Route::group(['middleware' => 'web', 'prefix' => 'oasis'], function () { Route::post('/subscribe/{order}/set-password', [SubscriptionController::class, 'set_password']); + + // Admin + Route::group(['middleware' => 'auth:sanctum'], function () { + Route::get('/invoice/{invoice}', [InvoiceController::class, 'get_invoice']); + }); }); // Debug routes diff --git a/tests/Feature/Oasis/OasisInvoiceTest.php b/tests/Feature/Oasis/OasisInvoiceTest.php index b2eb41b5..e8e35cc3 100644 --- a/tests/Feature/Oasis/OasisInvoiceTest.php +++ b/tests/Feature/Oasis/OasisInvoiceTest.php @@ -278,6 +278,7 @@ class OasisInvoiceTest extends TestCase */ public function user_create_new_invoice_with_storing_new_client_without_avatar_and_mail() { + Storage::fake('local'); Notification::fake(); PDF::fake(); @@ -332,6 +333,7 @@ class OasisInvoiceTest extends TestCase */ public function user_create_new_invoice_without_storing_client_without_avatar_and_mail() { + Storage::fake('local'); Notification::fake(); PDF::fake(); @@ -387,6 +389,7 @@ class OasisInvoiceTest extends TestCase */ public function user_create_new_invoice_without_storing_client() { + Storage::fake('local'); Notification::fake(); PDF::fake(); @@ -441,6 +444,7 @@ class OasisInvoiceTest extends TestCase */ public function user_create_new_invoice_with_existing_client() { + Storage::fake('local'); Notification::fake(); PDF::fake(); @@ -480,6 +484,41 @@ class OasisInvoiceTest extends TestCase Notification::assertTimesSent(1, InvoiceDeliveryNotification::class); } + /** + * @test + */ + public function it_get_invoice_from_url() + { + $user = User::factory(User::class) + ->create(['role' => 'user']); + + Sanctum::actingAs($user); + + $client = Client::factory(Client::class) + ->create([ + 'user_id' => $user->id, + 'name' => 'VueFileManager Inc.', + 'email' => 'howdy@hi5ve.digital', + ]); + + $this->postJson('/api/oasis/invoices', [ + 'invoice_type' => 'regular-invoice', + 'invoice_number' => '2120001', + 'variable_number' => '2120001', + 'client' => $client->id, + 'items' => $this->items, + 'discount_type' => 'percent', + 'discount_rate' => 10, + 'delivery_at' => Carbon::now()->addWeek(), + 'send_invoice' => true, + ])->assertStatus(201); + + $invoice = Invoice::first(); + + $this->get("/oasis/invoice/{$invoice->id}") + ->assertStatus(200); + } + /** * @test */