share invoice on email backend

This commit is contained in:
Peter Papp
2021-05-11 07:45:38 +02:00
parent 9857a30d2c
commit 5ea898d716
4 changed files with 123 additions and 42 deletions
@@ -1,6 +1,8 @@
<?php <?php
namespace App\Http\Controllers\Oasis; namespace App\Http\Controllers\Oasis;
use App\Http\Requests\Oasis\ShareInvoiceRequest;
use App\Http\Resources\Oasis\OasisInvoiceResource; use App\Http\Resources\Oasis\OasisInvoiceResource;
use Auth; use Auth;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@@ -61,7 +63,7 @@ class InvoiceController extends Controller
*/ */
public function download_invoice(Invoice $invoice) public function download_invoice(Invoice $invoice)
{ {
if (! Storage::exists(invoice_path($invoice))) { if (!Storage::exists(invoice_path($invoice))) {
abort(404, 'Not Found'); abort(404, 'Not Found');
} }
@@ -98,33 +100,33 @@ class InvoiceController extends Controller
$user = $request->user(); $user = $request->user();
$invoice = Invoice::create([ $invoice = Invoice::create([
'user_id' => $user->id, 'user_id' => $user->id,
'client_id' => $client->id ?? null, 'client_id' => $client->id ?? null,
'invoice_type' => $request->invoice_type, 'invoice_type' => $request->invoice_type,
'invoice_number' => $request->invoice_number, 'invoice_number' => $request->invoice_number,
'variable_number' => $request->variable_number, 'variable_number' => $request->variable_number,
'delivery_at' => $request->delivery_at, 'delivery_at' => $request->delivery_at,
'discount_type' => $request->discount_type ?? null, 'discount_type' => $request->discount_type ?? null,
'discount_rate' => $request->discount_rate ?? null, 'discount_rate' => $request->discount_rate ?? null,
'items' => json_decode($request->items), 'items' => json_decode($request->items),
'user' => $user->invoiceProfile, 'user' => $user->invoiceProfile,
'client' => [ 'client' => [
'email' => $client->email ?? $request->client_email, 'email' => $client->email ?? $request->client_email,
'name' => $client->name ?? $request->client_name, 'name' => $client->name ?? $request->client_name,
'address' => $client->address ?? $request->client_address, 'address' => $client->address ?? $request->client_address,
'city' => $client->city ?? $request->client_city, 'city' => $client->city ?? $request->client_city,
'postal_code' => $client->postal_code ?? $request->client_postal_code, 'postal_code' => $client->postal_code ?? $request->client_postal_code,
'country' => $client->country ?? $request->client_country, 'country' => $client->country ?? $request->client_country,
'ico' => $client->ico ?? $request->client_ico, 'ico' => $client->ico ?? $request->client_ico,
'dic' => $client->dic ?? $request->client_dic ?? null, 'dic' => $client->dic ?? $request->client_dic ?? null,
'ic_dph' => $client->ic_dph ?? $request->client_ic_dph ?? null, 'ic_dph' => $client->ic_dph ?? $request->client_ic_dph ?? null,
], ],
]); ]);
// Generate PDF // Generate PDF
\PDF::loadView('oasis.invoices.invoice', [ \PDF::loadView('oasis.invoices.invoice', [
'invoice' => Invoice::find($invoice->id), 'invoice' => Invoice::find($invoice->id),
'user' => $user, 'user' => $user,
]) ])
->setPaper('a4') ->setPaper('a4')
->setOrientation('portrait') ->setOrientation('portrait')
@@ -156,12 +158,12 @@ class InvoiceController extends Controller
$user = $request->user(); $user = $request->user();
$invoice->update([ $invoice->update([
'invoice_number' => $request->invoice_number, 'invoice_number' => $request->invoice_number,
'variable_number' => $request->variable_number, 'variable_number' => $request->variable_number,
'delivery_at' => $request->delivery_at, 'delivery_at' => $request->delivery_at,
'discount_type' => $request->discount_type ?? null, 'discount_type' => $request->discount_type ?? null,
'discount_rate' => $request->discount_rate ?? null, 'discount_rate' => $request->discount_rate ?? null,
'items' => json_decode($request->items), 'items' => json_decode($request->items),
]); ]);
Storage::delete(invoice_path($invoice)); Storage::delete(invoice_path($invoice));
@@ -169,7 +171,7 @@ class InvoiceController extends Controller
// Generate PDF // Generate PDF
\PDF::loadView('oasis.invoices.invoice', [ \PDF::loadView('oasis.invoices.invoice', [
'invoice' => Invoice::find($invoice->id), 'invoice' => Invoice::find($invoice->id),
'user' => $user, 'user' => $user,
]) ])
->setPaper('a4') ->setPaper('a4')
->setOrientation('portrait') ->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 * @param Invoice $invoice
* @throws \Exception * @throws \Exception
@@ -210,18 +231,18 @@ class InvoiceController extends Controller
$user = Auth::user(); $user = Auth::user();
return [ return [
'clients' => $user->clients->map(function ($client) { 'clients' => $user->clients->map(function ($client) {
return [ return [
'label' => $client->name, 'label' => $client->name,
'value' => $client->id, 'value' => $client->id,
]; ];
}), }),
'isVatPayer' => $user->invoiceProfile->ic_dph ?? false, 'isVatPayer' => $user->invoiceProfile->ic_dph ?? false,
'latestInvoiceNumber' => $user->regularInvoices->first() 'latestInvoiceNumber' => $user->regularInvoices->first()
? (int) $user->regularInvoices->first()->invoice_number ? (int)$user->regularInvoices->first()->invoice_number
: null, : null,
'recommendedInvoiceNumber' => $user->regularInvoices->first() 'recommendedInvoiceNumber' => $user->regularInvoices->first()
? (int) $user->regularInvoices->first()->invoice_number + 1 ? (int)$user->regularInvoices->first()->invoice_number + 1
: Carbon::now()->format('Y') . '0001', : Carbon::now()->format('Y') . '0001',
]; ];
} }
@@ -232,21 +253,21 @@ class InvoiceController extends Controller
*/ */
private function getOrStoreClient(StoreInvoiceRequest $request) private function getOrStoreClient(StoreInvoiceRequest $request)
{ {
if (! Str::isUuid($request->client) && $request->store_client) { if (!Str::isUuid($request->client) && $request->store_client) {
return $request->user() return $request->user()
->clients() ->clients()
->create([ ->create([
'avatar' => store_avatar($request, 'client_avatar') ?? null, 'avatar' => store_avatar($request, 'client_avatar') ?? null,
'name' => $request->client_name, 'name' => $request->client_name,
'email' => $request->client_email ?? null, 'email' => $request->client_email ?? null,
'phone_number' => $request->client_phone_number ?? null, 'phone_number' => $request->client_phone_number ?? null,
'address' => $request->client_address, 'address' => $request->client_address,
'city' => $request->client_city, 'city' => $request->client_city,
'postal_code' => $request->client_postal_code, 'postal_code' => $request->client_postal_code,
'country' => $request->client_country, 'country' => $request->client_country,
'ico' => $request->client_ico ?? null, 'ico' => $request->client_ico ?? null,
'dic' => $request->client_dic ?? null, 'dic' => $request->client_dic ?? null,
'ic_dph' => $request->client_ic_dph ?? null, 'ic_dph' => $request->client_ic_dph ?? null,
]); ]);
} }
@@ -0,0 +1,30 @@
<?php
namespace App\Http\Requests\Oasis;
use Illuminate\Foundation\Http\FormRequest;
class ShareInvoiceRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'email' => 'required|email',
];
}
}
+1
View File
@@ -37,6 +37,7 @@ Route::group(['middleware' => 'api', 'prefix' => '/api/oasis'], function () {
Route::get('/{invoice}', [InvoiceController::class, 'get_single_invoice']); Route::get('/{invoice}', [InvoiceController::class, 'get_single_invoice']);
Route::delete('/{invoice}', [InvoiceController::class, 'destroy']); Route::delete('/{invoice}', [InvoiceController::class, 'destroy']);
Route::post('/{invoice}', [InvoiceController::class, 'update']); Route::post('/{invoice}', [InvoiceController::class, 'update']);
Route::post('/{invoice}/share', [InvoiceController::class, 'share']);
Route::post('/', [InvoiceController::class, 'store']); Route::post('/', [InvoiceController::class, 'store']);
}); });
+29
View File
@@ -770,4 +770,33 @@ class OasisInvoiceTest extends TestCase
'recommendedInvoiceNumber' => 20210002, '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);
}
} }