From e7c40482583259a77e64f5244dfeb81665900fb1 Mon Sep 17 00:00:00 2001 From: Peter Papp Date: Tue, 27 Apr 2021 10:16:31 +0200 Subject: [PATCH] added invoice profile --- .../Controllers/Oasis/InvoiceController.php | 12 ++-- app/Models/Oasis/Invoice.php | 23 ------ app/Models/Oasis/InvoiceProfile.php | 33 +++++++++ app/Traits/Oasis.php | 11 +-- database/factories/Oasis/InvoiceFactory.php | 22 +----- .../factories/Oasis/InvoiceProfileFactory.php | 51 +++++++++++++ ...021_04_21_060812_create_invoices_table.php | 7 +- ...dd_bank_details_to_user_settings_table.php | 39 ---------- ...7_070058_create_invoice_profiles_table.php | 57 +++++++++++++++ .../views/oasis/invoices/invoice.blade.php | 50 ++++++------- tests/Feature/Oasis/OasisInvoiceTest.php | 72 +++++++++++++------ 11 files changed, 232 insertions(+), 145 deletions(-) create mode 100644 app/Models/Oasis/InvoiceProfile.php create mode 100644 database/factories/Oasis/InvoiceProfileFactory.php delete mode 100644 database/migrations/oasis/2021_04_21_065756_add_bank_details_to_user_settings_table.php create mode 100644 database/migrations/oasis/2021_04_27_070058_create_invoice_profiles_table.php diff --git a/app/Http/Controllers/Oasis/InvoiceController.php b/app/Http/Controllers/Oasis/InvoiceController.php index 4c321f67..21bc69e4 100644 --- a/app/Http/Controllers/Oasis/InvoiceController.php +++ b/app/Http/Controllers/Oasis/InvoiceController.php @@ -46,7 +46,7 @@ class InvoiceController extends Controller */ public function get_invoice(Invoice $invoice) { - if (! Storage::exists(invoice_path($invoice))) { + if (!Storage::exists(invoice_path($invoice))) { abort(404, 'Not Found'); } @@ -79,9 +79,10 @@ class InvoiceController extends Controller public function store(StoreInvoiceRequest $request) { $client = $this->getOrStoreClient($request); + $user = $request->user(); $invoice = Invoice::create([ - 'user_id' => $request->user()->id, + 'user_id' => $user->id, 'client_id' => $client->id ?? null, 'invoice_type' => $request->invoice_type, 'invoice_number' => $request->invoice_number, @@ -90,6 +91,7 @@ class InvoiceController extends Controller 'discount_type' => $request->discount_type ?? null, 'discount_rate' => $request->discount_rate ?? null, 'items' => $request->items, + 'user' => $user->invoiceProfile, 'client' => [ 'email' => $client->email ?? $request->client_email, 'name' => $client->name ?? $request->client_name, @@ -106,17 +108,17 @@ class InvoiceController extends Controller // Generate PDF \PDF::loadView('oasis.invoices.invoice', [ 'invoice' => Invoice::find($invoice->id), - 'user' => $request->user(), + 'user' => $user, ]) ->setPaper('a4') ->setOrientation('portrait') ->save( - storage_path("app/files/{$request->user()->id}/invoice-{$invoice->id}.pdf") + storage_path("app/files/{$user->id}/invoice-{$invoice->id}.pdf") ); if ($request->send_invoice && $invoice->client['email']) { Notification::route('mail', $invoice->client['email'])->notify( - new InvoiceDeliveryNotification($request->user(), $invoice) + new InvoiceDeliveryNotification($user, $invoice) ); } diff --git a/app/Models/Oasis/Invoice.php b/app/Models/Oasis/Invoice.php index 323a4a83..b80fc0a6 100644 --- a/app/Models/Oasis/Invoice.php +++ b/app/Models/Oasis/Invoice.php @@ -37,11 +37,6 @@ class Invoice extends Model return $this->hasOne(Client::class, 'id', 'user_id'); } - /** - * Index file - * - * @return array - */ public function toSearchableArray() { $array = $this->toArray(); @@ -72,24 +67,6 @@ class Invoice extends Model $invoice->total_tax = invoice_total_tax($invoice); $invoice->currency = 'CZK'; - - $user = Auth::user() ?? User::find($invoice->user_id); - - $invoice->author_name = $user->settings->name ?? null; - $invoice->author_stamp = ''; // TODO: doplnit - - $invoice->user = [ - 'name' => $user->settings->name ?? null, - 'address' => $user->settings->address ?? null, - 'state' => $user->settings->state ?? null, - 'city' => $user->settings->city ?? null, - 'postal_code' => $user->settings->postcode ?? null, - 'country' => $user->settings->country ?? null, - 'phone_number' => $user->settings->phoneNumber ?? null, - 'bank_name' => $user->settings->bank_name ?? null, - 'iban' => $user->settings->iban ?? null, - 'swift' => $user->settings->swift ?? null, - ]; }); } } diff --git a/app/Models/Oasis/InvoiceProfile.php b/app/Models/Oasis/InvoiceProfile.php new file mode 100644 index 00000000..513a77c2 --- /dev/null +++ b/app/Models/Oasis/InvoiceProfile.php @@ -0,0 +1,33 @@ +hasOne(User::class, 'id', 'user_id'); + } + + protected static function boot() + { + parent::boot(); + + static::creating(function ($invoice) { + $invoice->id = (string) Str::uuid(); + }); + } +} diff --git a/app/Traits/Oasis.php b/app/Traits/Oasis.php index 4f506df4..9883746e 100644 --- a/app/Traits/Oasis.php +++ b/app/Traits/Oasis.php @@ -4,20 +4,21 @@ namespace App\Traits; use App\Models\Oasis\Client; use App\Models\Oasis\Invoice; +use App\Models\Oasis\InvoiceProfile; use App\Models\Oasis\SubscriptionRequest; trait Oasis { - /** - * Get user subscription request - * - * @return mixed - */ public function subscriptionRequest() { return $this->hasOne(SubscriptionRequest::class); } + public function invoiceProfile() + { + return $this->hasOne(InvoiceProfile::class); + } + public function clients() { return $this->hasMany(Client::class, 'user_id', 'id'); diff --git a/database/factories/Oasis/InvoiceFactory.php b/database/factories/Oasis/InvoiceFactory.php index dfcb10b5..0351330c 100644 --- a/database/factories/Oasis/InvoiceFactory.php +++ b/database/factories/Oasis/InvoiceFactory.php @@ -3,9 +3,6 @@ namespace Database\Factories\Oasis; use App\Models\Oasis\Invoice; -use App\Models\User; -use Carbon\Carbon; -use Database\Factories\UserFactory; use Illuminate\Database\Eloquent\Factories\Factory; class InvoiceFactory extends Factory @@ -32,7 +29,7 @@ class InvoiceFactory extends Factory 'invoice_number' => $this->faker->numberBetween(2120001, 2120999), 'variable_number' => $this->faker->numberBetween(2120001, 2120999), 'currency' => $this->faker->randomElement(['CZK', 'EUR']), - 'author_name' => $this->faker->name, + 'user' => null, 'client' => [ 'name' => $this->faker->company, 'email' => $this->faker->email, @@ -47,21 +44,6 @@ class InvoiceFactory extends Factory 'dic' => $this->faker->numberBetween(11111111, 99999999), 'ic_dph' => 'CZ' . $this->faker->numberBetween(1111111111, 9999999999), ], - 'user' => [ - 'name' => $this->faker->name, - 'address' => $this->faker->address, - 'state' => $this->faker->state, - 'city' => $this->faker->city, - 'postal_code' => $this->faker->postcode, - 'country' => $this->faker->randomElement( - ['SK', 'CZ', 'DE', 'FR'] - ), - 'phone_number' => $this->faker->phoneNumber, - - 'bank_name' => $this->faker->randomElement(['Fio Banka', 'Tatra Banka']), - 'iban' => $this->faker->iban('CZ'), - 'swift' => $this->faker->swiftBicNumber, - ], 'items' => [ [ 'description' => $this->faker->realText(60), @@ -77,7 +59,7 @@ class InvoiceFactory extends Factory ], ], 'discount_type' => $this->faker->randomElement(['percent', 'value', null]), - 'delivery_at' => $this->faker->dateTimeBetween( + 'delivery_at' => $this->faker->dateTimeBetween( $startDate = '-6 months', $endDate = 'now', $timezone = null ), 'created_at' => $this->faker->dateTimeBetween( diff --git a/database/factories/Oasis/InvoiceProfileFactory.php b/database/factories/Oasis/InvoiceProfileFactory.php new file mode 100644 index 00000000..e2a2dd59 --- /dev/null +++ b/database/factories/Oasis/InvoiceProfileFactory.php @@ -0,0 +1,51 @@ + $this->faker->uuid, + 'user_id' => $this->faker->uuid, + 'company' => $this->faker->company, + 'logo' => '', + 'email' => $this->faker->email, + 'ico' => rand(11111111, 99999999), + 'dic' => rand(11111111, 99999999), + 'ic_dph' => 'SK' . rand(111111111111, 999999999999), + 'registration_notes' => $this->faker->realText(80), + 'author' => $this->faker->name, + 'stamp' => '', + 'address' => $this->faker->address, + 'state' => $this->faker->state, + 'city' => $this->faker->city, + 'postal_code' => $this->faker->postcode, + 'country' => $this->faker->randomElement([ + 'SK', 'CZ', 'DE', 'FR' + ]), + 'phone' => $this->faker->phoneNumber, + 'bank' => $this->faker->randomElement([ + 'Fio Banka', 'Tatra Banka' + ]), + 'iban' => $this->faker->iban('CZ'), + 'swift' => $this->faker->swiftBicNumber, + ]; + } +} \ No newline at end of file diff --git a/database/migrations/oasis/2021_04_21_060812_create_invoices_table.php b/database/migrations/oasis/2021_04_21_060812_create_invoices_table.php index b683a0b7..4562bcdd 100644 --- a/database/migrations/oasis/2021_04_21_060812_create_invoices_table.php +++ b/database/migrations/oasis/2021_04_21_060812_create_invoices_table.php @@ -18,7 +18,9 @@ class CreateInvoicesTable extends Migration $table->uuid('user_id')->index(); $table->uuid('client_id')->nullable()->index(); - $table->enum('invoice_type', ['regular-invoice', 'advance-invoice']); + $table->enum('invoice_type', [ + 'regular-invoice', 'advance-invoice' + ]); $table->text('invoice_number')->nullable(); $table->text('variable_number')->nullable(); @@ -39,9 +41,6 @@ class CreateInvoicesTable extends Migration $table->string('total_net')->nullable(); $table->string('total_tax')->nullable(); - $table->text('author_stamp')->nullable(); - $table->text('author_name')->nullable(); - $table->timestamps(); }); } diff --git a/database/migrations/oasis/2021_04_21_065756_add_bank_details_to_user_settings_table.php b/database/migrations/oasis/2021_04_21_065756_add_bank_details_to_user_settings_table.php deleted file mode 100644 index 71fdf2cd..00000000 --- a/database/migrations/oasis/2021_04_21_065756_add_bank_details_to_user_settings_table.php +++ /dev/null @@ -1,39 +0,0 @@ -text('registration_notes')->nullable(); - - $table->text('dic')->nullable(); - $table->text('ic_dph')->nullable(); - - $table->text('bank_name')->nullable(); - $table->text('iban')->nullable(); - $table->text('swift')->nullable(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::table('user_settings', function (Blueprint $table) { - $table->dropColumn(['bank_name','iban','swift']); - }); - } -} diff --git a/database/migrations/oasis/2021_04_27_070058_create_invoice_profiles_table.php b/database/migrations/oasis/2021_04_27_070058_create_invoice_profiles_table.php new file mode 100644 index 00000000..4aa0cd2b --- /dev/null +++ b/database/migrations/oasis/2021_04_27_070058_create_invoice_profiles_table.php @@ -0,0 +1,57 @@ +uuid('id')->primary()->index(); + $table->uuid('user_id')->index(); + + $table->text('company')->nullable(); + $table->string('logo')->nullable(); + $table->string('email')->nullable(); + $table->string('phone')->nullable(); + + $table->text('address')->nullable(); + $table->text('state')->nullable(); + $table->text('city')->nullable(); + $table->text('postal_code')->nullable(); + $table->text('country')->nullable(); + + $table->string('ico')->nullable(); + $table->string('dic')->nullable(); + $table->string('ic_dph')->nullable(); + + $table->text('registration_notes')->nullable(); + + $table->text('bank')->nullable(); + $table->string('iban')->nullable(); + $table->string('swift')->nullable(); + + $table->string('author')->nullable(); + $table->string('stamp')->nullable(); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('invoice_profiles'); + } +} diff --git a/resources/views/oasis/invoices/invoice.blade.php b/resources/views/oasis/invoices/invoice.blade.php index d8bd0349..bbdf4957 100644 --- a/resources/views/oasis/invoices/invoice.blade.php +++ b/resources/views/oasis/invoices/invoice.blade.php @@ -30,8 +30,8 @@ {{--TODO: klientske logo--}} - {{ $user->email }} - {{ $user->settings->phone_number }} + {{ $user->invoiceProfile->email }} + {{ $user->invoiceProfile->phone }}
@if($invoice->invoice_type === 'regular-invoice') @@ -78,31 +78,31 @@

Dodávateľ:

-

{{ $user->settings->name }}

- {{ $user->settings->registration_notes }} +

{{ $invoice->user['company'] }}

+ {{ $invoice->user['registration_notes'] }}

Sídlo:

-

{{ $user->settings->address }} {{ $user->settings->city }}

-

{{ $user->settings->postal_code }}, {{ $user->settings->country }}

+

{{ $invoice->user['address'] }} {{ $invoice->user['city'] }}

+

{{ $invoice->user['postal_code'] }}, {{ $invoice->user['country'] }}

Faktúračné údaje:

- @isset($user->settings->ico) -

IČO: {{ $user->settings->ico }}

+ @isset($invoice->user['ico']) +

IČO: {{ $invoice->user['ico'] }}

@endisset - @isset($user->settings->dic) -

DIČ: {{ $user->settings->dic }}

+ @isset($invoice->user['dic']) +

DIČ: {{ $invoice->user['dic'] }}

@endisset - @isset($invoice->supplier_ic_dph) -

IČ DPH: {{ $user->settings->ic_dph }}

+ @isset($invoice->user['ic_dph']) +

IČ DPH: {{ $invoice->user['ic_dph'] }}

@endisset -

{{ $user->settings->bank_name }}

-

IBAN: {{ $user->settings->iban }}, BIC kód/SWIFT: {{ $user->settings->swift }}

+

{{ $invoice->user['bank'] }}

+

IBAN: {{ $invoice->user['iban'] }}, BIC kód/SWIFT: {{ $invoice->user['swift'] }}

@@ -111,7 +111,7 @@
Číslo účtu: - {{ $user->settings->iban }} + {{ $invoice->user['iban'] }}
@@ -150,14 +150,10 @@ Celkom - - {{--TODO: zmenit dph z klienta na usera--}} - @if($invoice->client['ic_dph']) + @if($invoice->user['ic_dph']) Sadzba DPH - @endif - @if($invoice->client['ic_dph']) DPH @@ -185,13 +181,13 @@ {{ format_to_currency($item['price'] * $item['amount']) }} - @if($invoice->client['ic_dph']) + @if($invoice->user['ic_dph']) {{ $item['tax_rate'] }} % @endif - @if($invoice->client['ic_dph']) + @if($invoice->user['ic_dph']) {{ invoice_item_only_tax_price($item, true) }} @@ -218,7 +214,7 @@ @endif {{--VAT Payer--}} - @if($invoice->client['ic_dph'] && ! $invoice->discount_type) + @if($invoice->user['ic_dph'] && ! $invoice->discount_type)
  • Cena bez DPH: {{ format_to_currency($invoice->total_net) }} @@ -230,7 +226,7 @@ @endif {{--VAT Payer with Discount--}} - @if($invoice->client['ic_dph'] && $invoice->discount_type) + @if($invoice->user['ic_dph'] && $invoice->discount_type)
  • Cena bez DPH: @@ -258,7 +254,7 @@
  • Spolu k úhrade: - @if($invoice->client['ic_dph']) + @if($invoice->user['ic_dph']) {{ format_to_currency(invoice_total_net($invoice) + invoice_total_tax($invoice)) }} @else {{ format_to_currency(invoice_total_net($invoice)) }} @@ -274,7 +270,7 @@ {{--Invoice header--}}
    - @if(! $invoice->client['ic_dph']) + @if(! $invoice->user['ic_dph'])

    Nie sme platci DPH

    @endif
    @@ -283,7 +279,7 @@ @endif {{----}} - Faktúru vystavil: {{ $invoice->user['name'] }} + Faktúru vystavil: {{ $invoice->user['author'] }}
  • diff --git a/tests/Feature/Oasis/OasisInvoiceTest.php b/tests/Feature/Oasis/OasisInvoiceTest.php index e8e35cc3..68fef82c 100644 --- a/tests/Feature/Oasis/OasisInvoiceTest.php +++ b/tests/Feature/Oasis/OasisInvoiceTest.php @@ -3,6 +3,7 @@ namespace Tests\Feature\Oasis; use App\Models\Oasis\Client; +use App\Models\Oasis\InvoiceProfile; use App\Notifications\Oasis\InvoiceDeliveryNotification; use PDF; use Carbon\Carbon; @@ -191,12 +192,19 @@ class OasisInvoiceTest extends TestCase */ public function it_test_invoice_factory() { - $invoice = Invoice::factory(Invoice::class) + $invoice_profile = InvoiceProfile::factory(InvoiceProfile::class) ->create(); + $invoice = Invoice::factory(Invoice::class) + ->create(['user' => $invoice_profile->toArray()]); + $this->assertDatabaseHas('invoices', [ 'id' => $invoice->id, ]); + + $this->assertDatabaseMissing('invoices', [ + 'user' => null, + ]); } /** @@ -214,28 +222,21 @@ class OasisInvoiceTest extends TestCase $user = User::factory(User::class) ->create(['role' => 'user']); - $user->settings()->update([ - 'ic_dph' => 'SK2023489457', - 'dic' => '2023489457', - 'ico' => '46530045', - 'bank_name' => 'Fio a.s.', - 'iban' => 'SK7583300000002000476497', - 'swift' => 'FIOZSKBAXXX', - 'registration_notes' => 'Registrácia na OR SR Bratislava I. oddiel: Sro vl. č 91906', - ]); + InvoiceProfile::factory(InvoiceProfile::class) + ->create(['user_id' => $user->id]); Sanctum::actingAs($user); $this->postJson('/api/oasis/invoices', [ - 'invoice_type' => 'regular-invoice', - 'invoice_number' => '2120001', - 'variable_number' => '2120001', - 'items' => $this->items, - 'discount_type' => 'percent', - 'discount_rate' => 10, - 'delivery_at' => Carbon::now()->addWeek(), - 'store_client' => true, - 'send_invoice' => true, + 'invoice_type' => 'regular-invoice', + 'invoice_number' => '2120001', + 'variable_number' => '2120001', + 'items' => $this->items, + 'discount_type' => 'percent', + 'discount_rate' => 10, + 'delivery_at' => Carbon::now()->addWeek(), + 'store_client' => true, + 'send_invoice' => true, 'client' => 'others', 'client_avatar' => $avatar, 'client_name' => 'VueFileManager Inc.', @@ -285,6 +286,9 @@ class OasisInvoiceTest extends TestCase $user = User::factory(User::class) ->create(['role' => 'user']); + InvoiceProfile::factory(InvoiceProfile::class) + ->create(['user_id' => $user->id]); + Sanctum::actingAs($user); $this->postJson('/api/oasis/invoices', [ @@ -340,6 +344,9 @@ class OasisInvoiceTest extends TestCase $user = User::factory(User::class) ->create(['role' => 'user']); + InvoiceProfile::factory(InvoiceProfile::class) + ->create(['user_id' => $user->id]); + Sanctum::actingAs($user); $this->postJson('/api/oasis/invoices', [ @@ -396,6 +403,9 @@ class OasisInvoiceTest extends TestCase $user = User::factory(User::class) ->create(['role' => 'user']); + InvoiceProfile::factory(InvoiceProfile::class) + ->create(['user_id' => $user->id]); + Sanctum::actingAs($user); $this->postJson('/api/oasis/invoices', [ @@ -451,6 +461,9 @@ class OasisInvoiceTest extends TestCase $user = User::factory(User::class) ->create(['role' => 'user']); + InvoiceProfile::factory(InvoiceProfile::class) + ->create(['user_id' => $user->id]); + Sanctum::actingAs($user); $client = Client::factory(Client::class) @@ -492,6 +505,9 @@ class OasisInvoiceTest extends TestCase $user = User::factory(User::class) ->create(['role' => 'user']); + InvoiceProfile::factory(InvoiceProfile::class) + ->create(['user_id' => $user->id]); + Sanctum::actingAs($user); $client = Client::factory(Client::class) @@ -527,12 +543,16 @@ class OasisInvoiceTest extends TestCase $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' + 'invoice_type' => 'regular-invoice', + 'user' => $profile, ]); $this->getJson('/api/oasis/invoices/regular') @@ -549,12 +569,16 @@ class OasisInvoiceTest extends TestCase $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' => 'advance-invoice' + 'invoice_type' => 'advance-invoice', + 'user' => $profile, ]); $this->getJson('/api/oasis/invoices/advance') @@ -571,6 +595,9 @@ class OasisInvoiceTest extends TestCase $user = User::factory(User::class) ->create(['role' => 'user']); + $profile = InvoiceProfile::factory(InvoiceProfile::class) + ->create(['user_id' => $user->id]); + Sanctum::actingAs($user); Invoice::factory(Invoice::class) @@ -580,7 +607,8 @@ class OasisInvoiceTest extends TestCase 'invoice_number' => 2001212, 'client' => [ 'name' => 'VueFileManager Inc.', - ] + ], + 'user' => $profile, ]); $this->getJson('/api/oasis/invoices/search?type=regular-invoice&query=2001212')