diff --git a/app/Http/Controllers/Oasis/InvoiceController.php b/app/Http/Controllers/Oasis/InvoiceController.php index e92c5872..b8fe219e 100644 --- a/app/Http/Controllers/Oasis/InvoiceController.php +++ b/app/Http/Controllers/Oasis/InvoiceController.php @@ -1,6 +1,8 @@ user(); $invoice = Invoice::create([ - 'user_id' => $user->id, - 'client_id' => $client->id ?? null, - 'invoice_type' => $request->invoice_type, - 'invoice_number' => $request->invoice_number, + 'user_id' => $user->id, + 'client_id' => $client->id ?? null, + 'invoice_type' => $request->invoice_type, + 'invoice_number' => $request->invoice_number, 'variable_number' => $request->variable_number, - 'delivery_at' => $request->delivery_at, - 'discount_type' => $request->discount_type ?? null, - 'discount_rate' => $request->discount_rate ?? null, - 'items' => json_decode($request->items), - 'user' => $user->invoiceProfile, - 'client' => [ - 'email' => $client->email ?? $request->client_email, - 'name' => $client->name ?? $request->client_name, - 'address' => $client->address ?? $request->client_address, - 'city' => $client->city ?? $request->client_city, + 'delivery_at' => $request->delivery_at, + 'discount_type' => $request->discount_type ?? null, + 'discount_rate' => $request->discount_rate ?? null, + 'items' => json_decode($request->items), + 'user' => $user->invoiceProfile, + 'client' => [ + 'email' => $client->email ?? $request->client_email, + 'name' => $client->name ?? $request->client_name, + 'address' => $client->address ?? $request->client_address, + 'city' => $client->city ?? $request->client_city, 'postal_code' => $client->postal_code ?? $request->client_postal_code, - 'country' => $client->country ?? $request->client_country, - 'ico' => $client->ico ?? $request->client_ico, - 'dic' => $client->dic ?? $request->client_dic ?? null, - 'ic_dph' => $client->ic_dph ?? $request->client_ic_dph ?? null, + 'country' => $client->country ?? $request->client_country, + 'ico' => $client->ico ?? $request->client_ico, + 'dic' => $client->dic ?? $request->client_dic ?? null, + 'ic_dph' => $client->ic_dph ?? $request->client_ic_dph ?? null, ], ]); // Generate PDF \PDF::loadView('oasis.invoices.invoice', [ 'invoice' => Invoice::find($invoice->id), - 'user' => $user, + 'user' => $user, ]) ->setPaper('a4') ->setOrientation('portrait') @@ -156,12 +158,12 @@ class InvoiceController extends Controller $user = $request->user(); $invoice->update([ - 'invoice_number' => $request->invoice_number, + 'invoice_number' => $request->invoice_number, 'variable_number' => $request->variable_number, - 'delivery_at' => $request->delivery_at, - 'discount_type' => $request->discount_type ?? null, - 'discount_rate' => $request->discount_rate ?? null, - 'items' => json_decode($request->items), + 'delivery_at' => $request->delivery_at, + 'discount_type' => $request->discount_type ?? null, + 'discount_rate' => $request->discount_rate ?? null, + 'items' => json_decode($request->items), ]); Storage::delete(invoice_path($invoice)); @@ -169,7 +171,7 @@ class InvoiceController extends Controller // Generate PDF \PDF::loadView('oasis.invoices.invoice', [ 'invoice' => Invoice::find($invoice->id), - 'user' => $user, + 'user' => $user, ]) ->setPaper('a4') ->setOrientation('portrait') @@ -189,6 +191,25 @@ class InvoiceController extends Controller ); } + /** + * Share invoice via email + * + * @param ShareInvoiceRequest $request + * @param Invoice $invoice + */ + public function share(ShareInvoiceRequest $request, Invoice $invoice) + { + Notification::route('mail', $request->email) + ->notify( + new InvoiceDeliveryNotification($request->user(), $invoice) + ); + + return response( + 'Done.', + 204 + ); + } + /** * @param Invoice $invoice * @throws \Exception @@ -210,18 +231,18 @@ class InvoiceController extends Controller $user = Auth::user(); return [ - 'clients' => $user->clients->map(function ($client) { + 'clients' => $user->clients->map(function ($client) { return [ 'label' => $client->name, 'value' => $client->id, ]; }), - 'isVatPayer' => $user->invoiceProfile->ic_dph ?? false, - 'latestInvoiceNumber' => $user->regularInvoices->first() - ? (int) $user->regularInvoices->first()->invoice_number + 'isVatPayer' => $user->invoiceProfile->ic_dph ?? false, + 'latestInvoiceNumber' => $user->regularInvoices->first() + ? (int)$user->regularInvoices->first()->invoice_number : null, 'recommendedInvoiceNumber' => $user->regularInvoices->first() - ? (int) $user->regularInvoices->first()->invoice_number + 1 + ? (int)$user->regularInvoices->first()->invoice_number + 1 : Carbon::now()->format('Y') . '0001', ]; } @@ -232,21 +253,21 @@ class InvoiceController extends Controller */ private function getOrStoreClient(StoreInvoiceRequest $request) { - if (! Str::isUuid($request->client) && $request->store_client) { + if (!Str::isUuid($request->client) && $request->store_client) { return $request->user() ->clients() ->create([ - 'avatar' => store_avatar($request, 'client_avatar') ?? null, - 'name' => $request->client_name, - 'email' => $request->client_email ?? null, + 'avatar' => store_avatar($request, 'client_avatar') ?? null, + 'name' => $request->client_name, + 'email' => $request->client_email ?? null, 'phone_number' => $request->client_phone_number ?? null, - 'address' => $request->client_address, - 'city' => $request->client_city, - 'postal_code' => $request->client_postal_code, - 'country' => $request->client_country, - 'ico' => $request->client_ico ?? null, - 'dic' => $request->client_dic ?? null, - 'ic_dph' => $request->client_ic_dph ?? null, + 'address' => $request->client_address, + 'city' => $request->client_city, + 'postal_code' => $request->client_postal_code, + 'country' => $request->client_country, + 'ico' => $request->client_ico ?? null, + 'dic' => $request->client_dic ?? null, + 'ic_dph' => $request->client_ic_dph ?? null, ]); } diff --git a/app/Http/Requests/Oasis/ShareInvoiceRequest.php b/app/Http/Requests/Oasis/ShareInvoiceRequest.php new file mode 100644 index 00000000..cd55e165 --- /dev/null +++ b/app/Http/Requests/Oasis/ShareInvoiceRequest.php @@ -0,0 +1,30 @@ + 'required|email', + ]; + } +} diff --git a/routes/oasis.php b/routes/oasis.php index 6fb166d8..8309b15e 100644 --- a/routes/oasis.php +++ b/routes/oasis.php @@ -37,6 +37,7 @@ Route::group(['middleware' => 'api', 'prefix' => '/api/oasis'], function () { Route::get('/{invoice}', [InvoiceController::class, 'get_single_invoice']); Route::delete('/{invoice}', [InvoiceController::class, 'destroy']); Route::post('/{invoice}', [InvoiceController::class, 'update']); + Route::post('/{invoice}/share', [InvoiceController::class, 'share']); Route::post('/', [InvoiceController::class, 'store']); }); diff --git a/tests/Feature/Oasis/OasisInvoiceTest.php b/tests/Feature/Oasis/OasisInvoiceTest.php index 67eac8d6..3f2f40cc 100644 --- a/tests/Feature/Oasis/OasisInvoiceTest.php +++ b/tests/Feature/Oasis/OasisInvoiceTest.php @@ -770,4 +770,33 @@ class OasisInvoiceTest extends TestCase 'recommendedInvoiceNumber' => 20210002, ]); } + + /** + * @test + */ + public function it_send_single_invoice_on_email() + { + Notification::fake(); + + $user = User::factory(User::class) + ->create(['role' => 'user']); + + $profile = InvoiceProfile::factory(InvoiceProfile::class) + ->create(['user_id' => $user->id]); + + Sanctum::actingAs($user); + + $invoice = Invoice::factory(Invoice::class) + ->create([ + 'user_id' => $user->id, + 'invoice_type' => 'regular-invoice', + 'user' => $profile->toArray(), + ]); + + $this->postJson("/api/oasis/invoices/$invoice->id/share", [ + 'email' => 'john@doe.com', + ])->assertStatus(204); + + Notification::assertTimesSent(1, InvoiceDeliveryNotification::class); + } }