mirror of
https://github.com/VueFileManager/vuefilemanager.git
synced 2026-05-13 08:45:01 +00:00
share invoice on email backend
This commit is contained in:
@@ -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',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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']);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user