Billing profile implementation

This commit is contained in:
Peter Papp
2021-04-28 15:55:01 +02:00
parent 1e4bbd10f3
commit b37edd298a
18 changed files with 582 additions and 183 deletions
+45 -2
View File
@@ -4,9 +4,12 @@ namespace App\Console\Commands;
use App\Models\Oasis\Client;
use App\Models\Oasis\Invoice;
use App\Models\Setting;
use App\Models\User;
use Illuminate\Console\Command;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
class SetupOasisEnvironment extends Command
{
@@ -44,6 +47,7 @@ class SetupOasisEnvironment extends Command
$this->info('Setting up Oasis environment');
$this->create_demo_content();
$this->set_oasis_data();
$this->info('Dispatching jobs...');
$this->call('queue:work', [
@@ -58,6 +62,33 @@ class SetupOasisEnvironment extends Command
$user = User::whereEmail('howdy@hi5ve.digital')
->first();
$hash = Str::random(12);
// Get invoice logo and stamp
Storage::putFileAs("system", storage_path("demo/app/logo-horizontal.svg"), "{$hash}-logo-horizontal.svg", "private");
Storage::putFileAs("system", storage_path("demo/oasis/stamp.png"), "{$hash}-stamp.png", "private");
$profile = $user->invoiceProfile()->create([
'company' => 'VueFileManager Inc.',
'registration_notes' => 'Registrácia na OR SR Bratislava I. oddiel: Sro vl. č. 91906',
'logo' => "system/{$hash}-logo-horizontal.svg",
'ico' => '46530045',
'dic' => '2023489457',
'ic_dph' => 'SK2023489457',
'address' => 'Does 11',
'state' => 'Slovakia',
'city' => 'Bratislava',
'postal_code' => '04001',
'country' => 'SK',
'bank' => 'Fio Banka',
'iban' => 'SK20000054236423624',
'swift' => 'FIOZXXX',
'phone' => '+421950123456',
'email' => 'howdy@hi5ve.digital',
'author' => 'John Doe',
'stamp' => "system/{$hash}-stamp.png",
]);
$clients = Client::factory(Client::class)
->count(6)
->create(['user_id' => $user->id]);
@@ -72,8 +103,10 @@ class SetupOasisEnvironment extends Command
['client_id' => $clients[5]->id],
))->count(2)
->create([
'user_id' => $user->id,
'invoice_type' => 'regular-invoice'
'user_id' => $user->id,
'invoice_type' => 'regular-invoice',
'discount_type' => null,
'user' => $profile->toArray(),
]);
$advance_invoices = Invoice::factory(Invoice::class)
@@ -89,6 +122,7 @@ class SetupOasisEnvironment extends Command
'user_id' => $user->id,
'invoice_type' => 'advance-invoice',
'discount_type' => null,
'user' => $profile->toArray(),
]);
// Generate PDF
@@ -109,4 +143,13 @@ class SetupOasisEnvironment extends Command
);
});
}
public function set_oasis_data()
{
Setting::updateOrCreate([
'name' => 'app_color'
], [
'value' => '#ae5fec'
]);
}
}
@@ -6,6 +6,7 @@ use App\Http\Controllers\Controller;
use App\Http\Resources\Oasis\InvoiceProfileResource;
use App\Models\Oasis\InvoiceProfile;
use App\Models\Setting;
use Auth;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Http\Request;
@@ -13,6 +14,15 @@ use Illuminate\Http\Response;
class InvoiceProfileController extends Controller
{
/**
* @return Application|ResponseFactory|Response
*/
public function show()
{
return response(
new InvoiceProfileResource(Auth::user()->invoiceProfile), 200
);
}
/**
* @param Request $request
* @return Application|ResponseFactory|Response
@@ -21,8 +31,8 @@ class InvoiceProfileController extends Controller
{
$profile = InvoiceProfile::create([
'user_id' => $request->user()->id,
'logo' => store_avatar($request, 'logo') ?? null,
'stamp' => store_avatar($request, 'stamp') ?? null,
'logo' => store_system_image($request, 'logo') ?? null,
'stamp' => store_system_image($request, 'stamp') ?? null,
'company' => $request->company,
'email' => $request->email,
'ico' => $request->ico,
@@ -59,7 +69,7 @@ class InvoiceProfileController extends Controller
$request->user()
->invoiceProfile()
->update([
$request->name => store_avatar($request, $request->name)
$request->name => store_system_image($request, $request->name)
]);
return response('Done', 204);
+14 -6
View File
@@ -290,14 +290,22 @@ function store_avatar($request, $name)
// Store avatar
$image_path = Str::random(16) . '-' . $image->getClientOriginalName();
// Create intervention image
$img = Image::make($image->getRealPath());
if (in_array($image->getClientMimeType(), ['image/gif', 'image/jpeg', 'image/jpg', 'image/png', 'image/webp'])) {
// Generate thumbnail
$img->fit('150', '150')->stream();
// Create intervention image
$img = Image::make($image->getRealPath());
// Store thumbnail to disk
Storage::put("avatars/$image_path", $img);
// Generate thumbnail
$img->fit('150', '150')->stream();
// Store thumbnail to disk
Storage::put("avatars/$image_path", $img);
}
if ($image->getClientMimeType() === 'image/svg+xml') {
Storage::putFileAs("avatars", $image, $image_path);
}
// Return path to image
return "avatars/$image_path";
+3 -1
View File
@@ -21,7 +21,9 @@ class Invoice extends Model
'client' => 'array',
];
public $guarded = ['id'];
public $guarded = [
'id'
];
public $incrementing = false;
+7 -3
View File
@@ -25,11 +25,15 @@ class InvoiceFactory extends Factory
'id' => $this->faker->uuid,
'user_id' => $this->faker->uuid,
'client_id' => $this->faker->uuid,
'invoice_type' => $this->faker->randomElement(['regular-invoice', 'advance-invoice']),
'invoice_type' => $this->faker->randomElement([
'regular-invoice', 'advance-invoice'
]),
'invoice_number' => $this->faker->numberBetween(2120001, 2120999),
'variable_number' => $this->faker->numberBetween(2120001, 2120999),
'currency' => $this->faker->randomElement(['CZK', 'EUR']),
'user' => null,
'currency' => $this->faker->randomElement([
'CZK', 'EUR'
]),
'user' => [],
'client' => [
'name' => $this->faker->company,
'email' => $this->faker->email,
+97 -6
View File
@@ -12,7 +12,7 @@
"/chunks/admin~chunks/oasis/invoices~chunks/oasis/invoices/list~chunks/platform~chunks/shared.js": "/chunks/admin~chunks/oasis/invoices~chunks/oasis/invoices/list~chunks/platform~chunks/shared.js?id=a0543d93d8f11a2a5962",
"/chunks/admin~chunks/platform~chunks/shared.js": "/chunks/admin~chunks/platform~chunks/shared.js?id=5f29df56a2d5925c40c9",
"/chunks/app-appearance.js": "/chunks/app-appearance.js?id=b4e2d99a172f06a1d312",
"/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~605f4c49.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~605f4c49.js?id=1ae1e65bb6a5ed7c3e10",
"/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~605f4c49.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~605f4c49.js?id=2feb3390febba02cc5f0",
"/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.js?id=f9f637ff26a13d7beb5d",
"/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~b9e5655a.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~b9e5655a.js?id=04f0cd9719723459b685",
"/chunks/app-billings.js": "/chunks/app-billings.js?id=82133cc16f55222bbbe6",
@@ -52,10 +52,10 @@
"/chunks/invoices.js": "/chunks/invoices.js?id=1deb187f6d3eb1e81ad0",
"/chunks/not-found-shared.js": "/chunks/not-found-shared.js?id=7fc7f9b6f10bdfac770e",
"/chunks/oasis/homepage.js": "/chunks/oasis/homepage.js?id=a1885dd8814f9eb63a1c",
"/chunks/oasis/invoices.js": "/chunks/oasis/invoices.js?id=fd5e7aca8897f59cd625",
"/chunks/oasis/invoices/list.js": "/chunks/oasis/invoices/list.js?id=7e67f5fdd3306971f5e4",
"/chunks/oasis/invoices.js": "/chunks/oasis/invoices.js?id=d43eb767e75676b3709f",
"/chunks/oasis/invoices/list.js": "/chunks/oasis/invoices/list.js?id=a5ade7590b36f3793415",
"/chunks/oasis/invoices~chunks/oasis/invoices/list.js": "/chunks/oasis/invoices~chunks/oasis/invoices/list.js?id=045d3dd7ce573cb7ed11",
"/chunks/oasis/invoices~chunks/oasis/invoices/list~chunks/platform~chunks/shared.js": "/chunks/oasis/invoices~chunks/oasis/invoices/list~chunks/platform~chunks/shared.js?id=750a1e714440c4f03c2f",
"/chunks/oasis/invoices~chunks/oasis/invoices/list~chunks/platform~chunks/shared.js": "/chunks/oasis/invoices~chunks/oasis/invoices/list~chunks/platform~chunks/shared.js?id=c69c0503d09d1588f14a",
"/chunks/oasis/platba.js": "/chunks/oasis/platba.js?id=53d9f2a31b1dd5dad85e",
"/chunks/oasis/platba~chunks/oasis/upgrade-billing~chunks/oasis/upgrade-plan~chunks/upgrade-billing~ch~6880400b.js": "/chunks/oasis/platba~chunks/oasis/upgrade-billing~chunks/oasis/upgrade-plan~chunks/upgrade-billing~ch~6880400b.js?id=0c8d1c3cca084baa177f",
"/chunks/oasis/sign-up.js": "/chunks/oasis/sign-up.js?id=e53eeb48ebabae259f9c",
@@ -72,7 +72,7 @@
"/chunks/plan-subscribers.js": "/chunks/plan-subscribers.js?id=08e2056bc3744b2ea8f9",
"/chunks/plans.js": "/chunks/plans.js?id=5e1c668e35d2f04973b7",
"/chunks/platform.js": "/chunks/platform.js?id=f463eed74ce0e6852b6d",
"/chunks/platform~chunks/shared.js": "/chunks/platform~chunks/shared.js?id=7e96470b4052320d20b0",
"/chunks/platform~chunks/shared.js": "/chunks/platform~chunks/shared.js?id=ec633fb6ff41c34084c8",
"/chunks/profile.js": "/chunks/profile.js?id=1c1c666004fb44b1c404",
"/chunks/profile~chunks/settings-password.js": "/chunks/profile~chunks/settings-password.js?id=d0a44ee2cc3e9882c14a",
"/chunks/purchase-code.js": "/chunks/purchase-code.js?id=a1e46acc22ce82b2a61b",
@@ -108,5 +108,96 @@
"/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~d5ccfc07.js": "/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~d5ccfc07.js?id=2b62263afbefba53c9c6",
"/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~f0e94b19.js": "/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~f0e94b19.js?id=d57479525cd6baaf09f3",
"/vendors~chunks/files~chunks/oasis/invoices~chunks/oasis/invoices/list~chunks/platform~chunks/shared~~c9df84c5.js": "/vendors~chunks/files~chunks/oasis/invoices~chunks/oasis/invoices/list~chunks/platform~chunks/shared~~c9df84c5.js?id=4d042d0c0d8477a4f7ac",
"/vendors~chunks/oasis/invoices~chunks/oasis/invoices/list~chunks/platform~chunks/shared.js": "/vendors~chunks/oasis/invoices~chunks/oasis/invoices/list~chunks/platform~chunks/shared.js?id=11378342c3b6251c133e"
"/vendors~chunks/oasis/invoices~chunks/oasis/invoices/list~chunks/platform~chunks/shared.js": "/vendors~chunks/oasis/invoices~chunks/oasis/invoices/list~chunks/platform~chunks/shared.js?id=11378342c3b6251c133e",
"/chunks/oasis/invoices/list.522cccf189442f3c8df9.hot-update.js": "/chunks/oasis/invoices/list.522cccf189442f3c8df9.hot-update.js",
"/js/main.79ac1678fa87cb40e4cd.hot-update.js": "/js/main.79ac1678fa87cb40e4cd.hot-update.js",
"/js/main.6ff7dfdc1dd89702fe6a.hot-update.js": "/js/main.6ff7dfdc1dd89702fe6a.hot-update.js",
"/chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/~d4164210.js": "/chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/~d4164210.js?id=e3ee9bacf6ea805729dc",
"/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~d0bdaad8.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~d0bdaad8.js?id=20fd8e1ff0fbbb883a9e",
"/chunks/app-language~chunks/app-settings~chunks/dashboard~chunks/dashboard-oasis~chunks/invoices~chun~d23b1aac.js": "/chunks/app-language~chunks/app-settings~chunks/dashboard~chunks/dashboard-oasis~chunks/invoices~chun~d23b1aac.js?id=01ab356d3c9ba1175149",
"/chunks/oasis/invoices/profile.js": "/chunks/oasis/invoices/profile.js?id=ebd70d658c5b32c14826",
"/chunks/oasis/invoices/profile~chunks/profile~chunks/settings-password.js": "/chunks/oasis/invoices/profile~chunks/profile~chunks/settings-password.js?id=5f7a7e52edee7c45c2fe",
"/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~12116e2d.js": "/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~12116e2d.js?id=1f7ca53e6cba768de852",
"/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~8cdffba1.js": "/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~8cdffba1.js?id=f35fc78322dc4eb27c4e",
"/chunks/oasis/invoices/profile.86cce368832399c14f2c.hot-update.js": "/chunks/oasis/invoices/profile.86cce368832399c14f2c.hot-update.js",
"/chunks/oasis/invoices/profile.90535b42202f6ccfb4d4.hot-update.js": "/chunks/oasis/invoices/profile.90535b42202f6ccfb4d4.hot-update.js",
"/chunks/oasis/invoices/profile.46b1c604b9cf2d07c83b.hot-update.js": "/chunks/oasis/invoices/profile.46b1c604b9cf2d07c83b.hot-update.js",
"/chunks/oasis/invoices/profile.d4dc7257e82ccc72c998.hot-update.js": "/chunks/oasis/invoices/profile.d4dc7257e82ccc72c998.hot-update.js",
"/chunks/oasis/invoices/profile.99eed22926ecbbbef068.hot-update.js": "/chunks/oasis/invoices/profile.99eed22926ecbbbef068.hot-update.js",
"/chunks/oasis/invoices/profile.c0ae9ad0cf7b1958a080.hot-update.js": "/chunks/oasis/invoices/profile.c0ae9ad0cf7b1958a080.hot-update.js",
"/chunks/oasis/invoices/profile.4e52b194c26ba587fe50.hot-update.js": "/chunks/oasis/invoices/profile.4e52b194c26ba587fe50.hot-update.js",
"/chunks/oasis/invoices.8695612ce80a082bf0f3.hot-update.js": "/chunks/oasis/invoices.8695612ce80a082bf0f3.hot-update.js",
"/chunks/oasis/invoices.a54b0b63a9fe6e30370b.hot-update.js": "/chunks/oasis/invoices.a54b0b63a9fe6e30370b.hot-update.js",
"/chunks/oasis/invoices/list.8f7344b731f052fffd1e.hot-update.js": "/chunks/oasis/invoices/list.8f7344b731f052fffd1e.hot-update.js",
"/js/main.a8f461a7be41a863060e.hot-update.js": "/js/main.a8f461a7be41a863060e.hot-update.js",
"/chunks/app-language~chunks/dashboard~chunks/dashboard-oasis~chunks/files~chunks/invoices~chunks/oasi~be89c0bb.js": "/chunks/app-language~chunks/dashboard~chunks/dashboard-oasis~chunks/files~chunks/invoices~chunks/oasi~be89c0bb.js?id=b3e30c8dd757237db0e2",
"/chunks/files~chunks/oasis/platba~chunks/settings-subscription~chunks/shared-files~chunks/shared/file~9d1352fd.js": "/chunks/files~chunks/oasis/platba~chunks/settings-subscription~chunks/shared-files~chunks/shared/file~9d1352fd.js?id=4030b241faac6b31341f",
"/chunks/files~chunks/platform~chunks/shared-files~chunks/shared/file-browser.js": "/chunks/files~chunks/platform~chunks/shared-files~chunks/shared/file-browser.js?id=6808db2deb2d07287ce9",
"/chunks/oasis/invoices.a8f461a7be41a863060e.hot-update.js": "/chunks/oasis/invoices.a8f461a7be41a863060e.hot-update.js",
"/chunks/oasis/invoices/list.a8f461a7be41a863060e.hot-update.js": "/chunks/oasis/invoices/list.a8f461a7be41a863060e.hot-update.js",
"/chunks/platform~chunks/shared.a8f461a7be41a863060e.hot-update.js": "/chunks/platform~chunks/shared.a8f461a7be41a863060e.hot-update.js",
"/js/main.54fd2076f822088606df.hot-update.js": "/js/main.54fd2076f822088606df.hot-update.js",
"/chunks/admin~chunks/files~chunks/oasis/invoices~chunks/settings~chunks/shared-files~chunks/shared/fi~41abd910.js": "/chunks/admin~chunks/files~chunks/oasis/invoices~chunks/settings~chunks/shared-files~chunks/shared/fi~41abd910.js?id=c804f9bf9138c4da52e9",
"/chunks/admin~chunks/oasis/invoices~chunks/platform.js": "/chunks/admin~chunks/oasis/invoices~chunks/platform.js?id=022bd4e56166d844c3b0",
"/chunks/admin~chunks/oasis/invoices~chunks/platform~chunks/shared.js": "/chunks/admin~chunks/oasis/invoices~chunks/platform~chunks/shared.js?id=073522656c63224e16a6",
"/chunks/files~chunks/oasis/invoices~chunks/platform~chunks/shared~chunks/shared-files~chunks/shared/f~9f6a6eef.js": "/chunks/files~chunks/oasis/invoices~chunks/platform~chunks/shared~chunks/shared-files~chunks/shared/f~9f6a6eef.js?id=9bc0d89f45dff1feb308",
"/chunks/files~chunks/shared-files~chunks/shared/file-browser.54fd2076f822088606df.hot-update.js": "/chunks/files~chunks/shared-files~chunks/shared/file-browser.54fd2076f822088606df.hot-update.js",
"/chunks/oasis/invoices.54fd2076f822088606df.hot-update.js": "/chunks/oasis/invoices.54fd2076f822088606df.hot-update.js",
"/chunks/oasis/invoices/list.54fd2076f822088606df.hot-update.js": "/chunks/oasis/invoices/list.54fd2076f822088606df.hot-update.js",
"/chunks/oasis/invoices~chunks/platform~chunks/shared.js": "/chunks/oasis/invoices~chunks/platform~chunks/shared.js?id=9ad184d8e96c7d04941c",
"/vendors~chunks/files~chunks/oasis/invoices~chunks/platform~chunks/shared~chunks/shared-files~chunks/~9b82b04f.js": "/vendors~chunks/files~chunks/oasis/invoices~chunks/platform~chunks/shared~chunks/shared-files~chunks/~9b82b04f.js?id=548bff41ffa0385b8f01",
"/vendors~chunks/oasis/invoices~chunks/platform~chunks/shared.js": "/vendors~chunks/oasis/invoices~chunks/platform~chunks/shared.js?id=03d3cf785cbafa4d31f0",
"/chunks/oasis/invoices.a23d9da8da43103742b3.hot-update.js": "/chunks/oasis/invoices.a23d9da8da43103742b3.hot-update.js",
"/chunks/oasis/invoices.fc81410f7429e93506c0.hot-update.js": "/chunks/oasis/invoices.fc81410f7429e93506c0.hot-update.js",
"/chunks/oasis/invoices.e6a621e89dc3de2ba13c.hot-update.js": "/chunks/oasis/invoices.e6a621e89dc3de2ba13c.hot-update.js",
"/chunks/oasis/invoices.5c5267f5589e3ec325ad.hot-update.js": "/chunks/oasis/invoices.5c5267f5589e3ec325ad.hot-update.js",
"/chunks/oasis/invoices.c0d206d920b5666aa893.hot-update.js": "/chunks/oasis/invoices.c0d206d920b5666aa893.hot-update.js",
"/chunks/oasis/invoices.6f84b681c95b116f15e8.hot-update.js": "/chunks/oasis/invoices.6f84b681c95b116f15e8.hot-update.js",
"/chunks/oasis/invoices/profile.54653bbde50307d4acdd.hot-update.js": "/chunks/oasis/invoices/profile.54653bbde50307d4acdd.hot-update.js",
"/chunks/oasis/invoices/profile.e6e1c5c2c9c578939b3a.hot-update.js": "/chunks/oasis/invoices/profile.e6e1c5c2c9c578939b3a.hot-update.js",
"/chunks/oasis/invoices/profile.7d5c568e572fdd809de7.hot-update.js": "/chunks/oasis/invoices/profile.7d5c568e572fdd809de7.hot-update.js",
"/chunks/oasis/invoices/profile.5385474bafa8440580b1.hot-update.js": "/chunks/oasis/invoices/profile.5385474bafa8440580b1.hot-update.js",
"/js/main.2cd9e691a1a4a8a3d1e1.hot-update.js": "/js/main.2cd9e691a1a4a8a3d1e1.hot-update.js",
"/chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chu~f15e904d.js": "/chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chu~f15e904d.js?id=8671a04a21b80c7402e7",
"/chunks/oasis/invoices/profile.2cd9e691a1a4a8a3d1e1.hot-update.js": "/chunks/oasis/invoices/profile.2cd9e691a1a4a8a3d1e1.hot-update.js",
"/chunks/oasis/invoices/profile.620a14906d7efd74eaff.hot-update.js": "/chunks/oasis/invoices/profile.620a14906d7efd74eaff.hot-update.js",
"/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~d0bdaad8.0c58113c8bbca8307549.hot-update.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~d0bdaad8.0c58113c8bbca8307549.hot-update.js",
"/chunks/oasis/invoices/profile.9cf6026da2e8b2c3b666.hot-update.js": "/chunks/oasis/invoices/profile.9cf6026da2e8b2c3b666.hot-update.js",
"/chunks/oasis/invoices/profile.0bfeeb37c7b3b92be57d.hot-update.js": "/chunks/oasis/invoices/profile.0bfeeb37c7b3b92be57d.hot-update.js",
"/chunks/oasis/invoices/profile.d45f2c43faa9e43965d7.hot-update.js": "/chunks/oasis/invoices/profile.d45f2c43faa9e43965d7.hot-update.js",
"/chunks/oasis/invoices/profile.8f15a13976da18e6418f.hot-update.js": "/chunks/oasis/invoices/profile.8f15a13976da18e6418f.hot-update.js",
"/chunks/oasis/invoices/profile.f9299e662088ba4afc0b.hot-update.js": "/chunks/oasis/invoices/profile.f9299e662088ba4afc0b.hot-update.js",
"/chunks/oasis/invoices/profile.5987dbe6cb626274da0b.hot-update.js": "/chunks/oasis/invoices/profile.5987dbe6cb626274da0b.hot-update.js",
"/chunks/oasis/invoices/profile.2b32fc92da7ccad31cab.hot-update.js": "/chunks/oasis/invoices/profile.2b32fc92da7ccad31cab.hot-update.js",
"/chunks/oasis/invoices/profile.f0869e8dad717c3f5842.hot-update.js": "/chunks/oasis/invoices/profile.f0869e8dad717c3f5842.hot-update.js",
"/chunks/oasis/invoices/profile.67560b729a910765a019.hot-update.js": "/chunks/oasis/invoices/profile.67560b729a910765a019.hot-update.js",
"/chunks/oasis/invoices/profile.c8fe1ce298f0408305d6.hot-update.js": "/chunks/oasis/invoices/profile.c8fe1ce298f0408305d6.hot-update.js",
"/chunks/oasis/invoices/profile.3f3f8be5f2dbf23d91ec.hot-update.js": "/chunks/oasis/invoices/profile.3f3f8be5f2dbf23d91ec.hot-update.js",
"/chunks/oasis/invoices/profile.8ef6f820eb0a067689e3.hot-update.js": "/chunks/oasis/invoices/profile.8ef6f820eb0a067689e3.hot-update.js",
"/chunks/oasis/invoices/profile.f7fc6f6fb390e73cff06.hot-update.js": "/chunks/oasis/invoices/profile.f7fc6f6fb390e73cff06.hot-update.js",
"/chunks/oasis/invoices/profile.0ea4b3a214661f4bfa4f.hot-update.js": "/chunks/oasis/invoices/profile.0ea4b3a214661f4bfa4f.hot-update.js",
"/chunks/oasis/invoices/profile.0047dd8c27475df0e683.hot-update.js": "/chunks/oasis/invoices/profile.0047dd8c27475df0e683.hot-update.js",
"/chunks/oasis/invoices/profile.51e7c6d11c7be967eb6b.hot-update.js": "/chunks/oasis/invoices/profile.51e7c6d11c7be967eb6b.hot-update.js",
"/chunks/oasis/invoices/profile.1c6b58e987107cd5de6d.hot-update.js": "/chunks/oasis/invoices/profile.1c6b58e987107cd5de6d.hot-update.js",
"/chunks/oasis/invoices/profile.cdc9250d77e3b26e3f60.hot-update.js": "/chunks/oasis/invoices/profile.cdc9250d77e3b26e3f60.hot-update.js",
"/chunks/oasis/invoices/profile.d9bb7ff6f390d2f9b3e0.hot-update.js": "/chunks/oasis/invoices/profile.d9bb7ff6f390d2f9b3e0.hot-update.js",
"/chunks/oasis/invoices/profile.a03e6c76ad49af4faec7.hot-update.js": "/chunks/oasis/invoices/profile.a03e6c76ad49af4faec7.hot-update.js",
"/chunks/oasis/invoices/profile.095bcb3870fe3096695a.hot-update.js": "/chunks/oasis/invoices/profile.095bcb3870fe3096695a.hot-update.js",
"/js/main.35316e692f00610c86cf.hot-update.js": "/js/main.35316e692f00610c86cf.hot-update.js",
"/js/main.a9a52e8275a61b77c250.hot-update.js": "/js/main.a9a52e8275a61b77c250.hot-update.js",
"/js/main.d50196048f568d3defd5.hot-update.js": "/js/main.d50196048f568d3defd5.hot-update.js",
"/chunks/oasis/invoices/profile.d50196048f568d3defd5.hot-update.js": "/chunks/oasis/invoices/profile.d50196048f568d3defd5.hot-update.js",
"/js/main.5522a02081083adb5775.hot-update.js": "/js/main.5522a02081083adb5775.hot-update.js",
"/chunks/oasis/invoices/profile.5522a02081083adb5775.hot-update.js": "/chunks/oasis/invoices/profile.5522a02081083adb5775.hot-update.js",
"/chunks/oasis/invoices.051e05374113f97f6aa5.hot-update.js": "/chunks/oasis/invoices.051e05374113f97f6aa5.hot-update.js",
"/chunks/oasis/invoices/profile.16dddd982ffc415c461e.hot-update.js": "/chunks/oasis/invoices/profile.16dddd982ffc415c461e.hot-update.js",
"/chunks/oasis/invoices/profile.3cca96e2c03d207f9511.hot-update.js": "/chunks/oasis/invoices/profile.3cca96e2c03d207f9511.hot-update.js",
"/chunks/oasis/invoices/profile.f53a5794b742383f9272.hot-update.js": "/chunks/oasis/invoices/profile.f53a5794b742383f9272.hot-update.js",
"/chunks/oasis/invoices/profile.6b30ee6b601643e547c8.hot-update.js": "/chunks/oasis/invoices/profile.6b30ee6b601643e547c8.hot-update.js",
"/chunks/oasis/invoices/profile.310066790e74c0b9cee6.hot-update.js": "/chunks/oasis/invoices/profile.310066790e74c0b9cee6.hot-update.js",
"/chunks/oasis/invoices/profile.8f961ce3a0a773d1a530.hot-update.js": "/chunks/oasis/invoices/profile.8f961ce3a0a773d1a530.hot-update.js",
"/chunks/oasis/invoices/profile.19871652d7a72470542f.hot-update.js": "/chunks/oasis/invoices/profile.19871652d7a72470542f.hot-update.js",
"/chunks/oasis/invoices/profile.cb81c09128a52a34d332.hot-update.js": "/chunks/oasis/invoices/profile.cb81c09128a52a34d332.hot-update.js",
"/chunks/oasis/invoices/profile.5b768298ff09de647a58.hot-update.js": "/chunks/oasis/invoices/profile.5b768298ff09de647a58.hot-update.js",
"/chunks/oasis/invoices/profile.e846a41b96190f8daccf.hot-update.js": "/chunks/oasis/invoices/profile.e846a41b96190f8daccf.hot-update.js"
}
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 375 KiB

@@ -0,0 +1,267 @@
<template>
<div id="single-page">
<MobileHeader :title="$router.currentRoute.meta.title" />
<PageHeader :title="$router.currentRoute.meta.title" />
<div id="page-content" class="medium-width">
<div class="content-page">
<PageTab :is-loading="! profile">
<PageTabGroup>
<div class="form block-form">
<FormLabel>Company & Logo</FormLabel>
<InfoBox>
Here you can set your <b class="text-theme">billing profile</b> which will be paste to your every newly generated invoice.
</InfoBox>
<div class="block-wrapper">
<label>Logo (optional):</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="logo" v-slot="{ errors }">
<ImageInput @input="$updateImage('/oasis/invoices/profile', 'logo', profile.logo)" :image="$getImage(profile.logo)" v-model="profile.logo" :error="errors[0]" />
</ValidationProvider>
</div>
<div class="block-wrapper">
<label>Company name:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="company" rules="required" v-slot="{ errors }">
<input @input="$updateText('/oasis/invoices/profile', 'company', profile.company)" v-model="profile.company" placeholder="" type="text"
:class="{'is-error': errors[0]}" class="focus-border-theme" />
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<div class="block-wrapper">
<label>Registration Notes (optional):</label>
<div class="input-wrapper">
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="registration_notes" rules="required" v-slot="{ errors }">
<textarea
rows="2"
@input="$updateText('/oasis/invoices/profile', 'registration_notes', profile.registration_notes)"
v-model="profile.registration_notes"
placeholder=""
:class="{'is-error': errors[0]}"
class="focus-border-theme"
/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
</div>
</div>
</PageTabGroup>
<PageTabGroup>
<div class="form block-form">
<FormLabel>Company Details</FormLabel>
<div class="block-wrapper">
<label>ICO:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="ico" rules="required" v-slot="{ errors }">
<input @input="$updateText('/oasis/invoices/profile', 'ico', profile.ico)" v-model="profile.ico" placeholder="" type="text"
:class="{'is-error': errors[0]}" class="focus-border-theme" />
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<div class="block-wrapper">
<label>DIC:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="dic" rules="required" v-slot="{ errors }">
<input @input="$updateText('/oasis/invoices/profile', 'dic', profile.dic)" v-model="profile.dic" placeholder="" type="text"
:class="{'is-error': errors[0]}" class="focus-border-theme" />
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<div class="block-wrapper">
<label>IC DPH (optional):</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="ic_dph" rules="required" v-slot="{ errors }">
<input @input="$updateText('/oasis/invoices/profile', 'ic_dph', profile.ic_dph)" v-model="profile.ic_dph" placeholder="" type="text"
:class="{'is-error': errors[0]}" class="focus-border-theme" />
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
</div>
</PageTabGroup>
<PageTabGroup>
<div class="form block-form">
<FormLabel>Company Address</FormLabel>
<div class="block-wrapper">
<label>Address:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="address" rules="required" v-slot="{ errors }">
<input @input="$updateText('/oasis/invoices/profile', 'address', profile.address)" v-model="profile.address" placeholder="" type="text"
:class="{'is-error': errors[0]}" class="focus-border-theme" />
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<div class="block-wrapper">
<label>City:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="city" rules="required" v-slot="{ errors }">
<input @input="$updateText('/oasis/invoices/profile', 'city', profile.city)" v-model="profile.city" placeholder="" type="text"
:class="{'is-error': errors[0]}" class="focus-border-theme" />
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<div class="block-wrapper">
<label>Postal Code:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="postal_code" rules="required" v-slot="{ errors }">
<input @input="$updateText('/oasis/invoices/profile', 'postal_code', profile.postal_code)" v-model="profile.postal_code" placeholder="" type="text"
:class="{'is-error': errors[0]}" class="focus-border-theme" />
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<div class="block-wrapper">
<label>Country:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="country" rules="required" v-slot="{ errors }">
<SelectInput @input="$updateText('/oasis/invoices/profile', 'country', profile.country)" v-model="profile.country" :default="profile.country" :options="countries" placeholder="" :isError="errors[0]"/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
</div>
</PageTabGroup>
<PageTabGroup>
<div class="form block-form">
<FormLabel>Bank Info</FormLabel>
<div class="block-wrapper">
<label>Bank Name:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="bank" rules="required" v-slot="{ errors }">
<input @input="$updateText('/oasis/invoices/profile', 'bank', profile.bank)" v-model="profile.bank" placeholder="" type="text"
:class="{'is-error': errors[0]}" class="focus-border-theme" />
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<div class="block-wrapper">
<label>Iban:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="iban" rules="required" v-slot="{ errors }">
<input @input="$updateText('/oasis/invoices/profile', 'iban', profile.iban)" v-model="profile.iban" placeholder="" type="text"
:class="{'is-error': errors[0]}" class="focus-border-theme" />
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<div class="block-wrapper">
<label>Swift code:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="swift" rules="required" v-slot="{ errors }">
<input @input="$updateText('/oasis/invoices/profile', 'swift', profile.swift)" v-model="profile.swift" placeholder="" type="text"
:class="{'is-error': errors[0]}" class="focus-border-theme" />
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
</div>
</PageTabGroup>
<PageTabGroup>
<div class="form block-form">
<FormLabel>Author</FormLabel>
<div class="block-wrapper">
<label>Phone (optional):</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="phone" rules="required" v-slot="{ errors }">
<input @input="$updateText('/oasis/invoices/profile', 'phone', profile.phone)" v-model="profile.phone" placeholder="" type="text"
:class="{'is-error': errors[0]}" class="focus-border-theme" />
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<div class="block-wrapper">
<label>Email (optional):</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="email" rules="required" v-slot="{ errors }">
<input @input="$updateText('/oasis/invoices/profile', 'email', profile.email)" v-model="profile.email" placeholder="" type="email"
:class="{'is-error': errors[0]}" class="focus-border-theme" />
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<div class="block-wrapper">
<label>Author name:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="author" rules="required" v-slot="{ errors }">
<input @input="$updateText('/oasis/invoices/profile', 'author', profile.author)" v-model="profile.author" placeholder="" type="text"
:class="{'is-error': errors[0]}" class="focus-border-theme" />
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<div class="block-wrapper">
<label>Stamp:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="stamp" v-slot="{ errors }">
<ImageInput @input="$updateImage('/oasis/invoices/profile', 'stamp', profile.stamp)" :image="$getImage(profile.stamp)" v-model="profile.stamp" :error="errors[0]" />
</ValidationProvider>
</div>
</div>
</PageTabGroup>
</PageTab>
</div>
</div>
</div>
</template>
<script>
import {ValidationProvider, ValidationObserver} from 'vee-validate/dist/vee-validate.full'
import PageTabGroup from '@/components/Others/Layout/PageTabGroup'
import SelectInput from '@/components/Others/Forms/SelectInput'
import ImageInput from '@/components/Others/Forms/ImageInput'
import FormLabel from '@/components/Others/Forms/FormLabel'
import MobileHeader from '@/components/Mobile/MobileHeader'
import ButtonBase from '@/components/FilesView/ButtonBase'
import PageTab from '@/components/Others/Layout/PageTab'
import PageHeader from '@/components/Others/PageHeader'
import ThemeLabel from '@/components/Others/ThemeLabel'
import InfoBox from '@/components/Others/Forms/InfoBox'
import {required} from 'vee-validate/dist/rules'
import {mapGetters} from 'vuex'
export default {
name: 'BillingProfile',
props: [
'user'
],
components: {
ValidationProvider,
ValidationObserver,
PageTabGroup,
MobileHeader,
SelectInput,
ImageInput,
PageHeader,
ButtonBase,
ThemeLabel,
FormLabel,
required,
InfoBox,
PageTab,
},
computed: {
...mapGetters([
'countries',
'config',
]),
},
data() {
return {
isLoading: false,
profile: undefined,
}
},
methods: {},
created() {
axios.get('/api/oasis/invoices/profile')
.then(response => {
this.profile = response.data.data.attributes
})
}
}
</script>
<style lang="scss" scoped>
@import '@assets/vuefilemanager/_variables';
@import '@assets/vuefilemanager/_mixins';
@import '@assets/vuefilemanager/_forms';
.block-form {
max-width: 100%;
}
</style>
@@ -14,7 +14,50 @@
<MobileNavigation />
<SidebarNavigation />
<router-view :class="{'is-scaled-down': isScaledDown}" />
<div id="viewport">
<!--Sidebar navigation-->
<ContentSidebar>
<ContentGroup title="Invoices" class="navigator menu-list-wrapper vertical">
<a @click="goTo('regular-invoice')" :class="{'is-active': $isThisLocation(['regular-invoice']) && $route.name === 'InvoicesList'}" class="menu-list-item link">
<div class="icon text-theme">
<file-text-icon size="17" />
</div>
<div class="label text-theme">
Invoices
</div>
</a>
<a @click="goTo('advance-invoice')" :class="{'is-active': $isThisLocation(['advance-invoice']) && $route.name === 'InvoicesList'}" class="menu-list-item link">
<div class="icon text-theme">
<clock-icon size="17" />
</div>
<div class="label text-theme">
Advance Invoices
</div>
</a>
</ContentGroup>
<ContentGroup title="Others" class="navigator menu-list-wrapper vertical">
<a @click="goTo('clients')" :class="{'is-active': $isThisLocation(['clients']) && $route.name === 'InvoicesList'}" class="menu-list-item link">
<div class="icon text-theme">
<users-icon size="17" />
</div>
<div class="label text-theme">
Clients
</div>
</a>
<router-link :to="{name: 'InvoicesProfile'}" class="menu-list-item link">
<div class="icon text-theme">
<edit2-icon size="17" />
</div>
<div class="label text-theme">
Billing Profile
</div>
</router-link>
</ContentGroup>
</ContentSidebar>
<router-view :class="{'is-scaled-down': isScaledDown}" />
</div>
</div>
</template>
@@ -25,7 +68,7 @@
import ClientMobileMenu from '@/Oasis/Modules/Invoices/components/ClientMobileMenu'
import InvoiceCreateMenu from '@/Oasis/Modules/Invoices/components/InvoiceCreateMenu'
import {UsersIcon, FileTextIcon, ClockIcon} from 'vue-feather-icons'
import {UsersIcon, FileTextIcon, ClockIcon, Edit2Icon} from 'vue-feather-icons'
import SidebarNavigation from '@/components/Sidebar/SidebarNavigation'
import MobileNavigation from '@/components/Others/MobileNavigation'
import ContentSidebar from '@/components/Sidebar/ContentSidebar'
@@ -53,6 +96,7 @@
FileTextIcon,
ContentGroup,
FilePreview,
Edit2Icon,
UsersIcon,
ClockIcon,
},
@@ -68,14 +112,21 @@
'advance-invoice': 'getAdvanceInvoices',
'clients': 'getClients',
}
if (this.$route.name !== 'InvoicesList') {
this.$router.push({name: 'InvoicesList'})
}
this.$store.dispatch(routes[location])
}
},
},
mounted() {
events.$on('mobile-menu:show', () => this.isScaledDown = true)
events.$on('fileItem:deselect', () => this.isScaledDown = false)
events.$on('mobile-menu:hide', () => this.isScaledDown = false)
this.$store.dispatch('getRegularInvoices')
}
}
</script>
@@ -1,115 +0,0 @@
<template>
<section id="viewport">
<!--Sidebar navigation-->
<ContentSidebar>
<ContentGroup title="Invoices" class="navigator menu-list-wrapper vertical">
<a @click="goTo('regular-invoice')" :class="{'is-active': $isThisLocation(['regular-invoice'])}" class="menu-list-item link">
<div class="icon text-theme">
<file-text-icon size="17" />
</div>
<div class="label text-theme">
Invoices
</div>
</a>
<a @click="goTo('advance-invoice')" :class="{'is-active': $isThisLocation(['advance-invoice'])}" class="menu-list-item link">
<div class="icon text-theme">
<clock-icon size="17" />
</div>
<div class="label text-theme">
Advance Invoices
</div>
</a>
</ContentGroup>
<ContentGroup title="Others" class="navigator menu-list-wrapper vertical">
<a @click="goTo('clients')" :class="{'is-active': $isThisLocation(['clients'])}" class="menu-list-item link">
<div class="icon text-theme">
<users-icon size="17" />
</div>
<div class="label text-theme">
Clients
</div>
</a>
</ContentGroup>
</ContentSidebar>
<ContentInvoiceView />
</section>
</template>
<script>
import ContentInvoiceView from '@/Oasis/Modules/Invoices/ContentInvoiceView'
import InvoiceSortingMobile from '@/Oasis/Modules/Invoices/components/InvoiceSortingMobile'
import InvoiceFilterMobile from '@/Oasis/Modules/Invoices/components/InvoiceFilterMobile'
import InvoiceMobileMenu from '@/Oasis/Modules/Invoices/components/InvoiceMobileMenu'
import ClientMobileMenu from '@/Oasis/Modules/Invoices/components/ClientMobileMenu'
import InvoiceCreateMenu from '@/Oasis/Modules/Invoices/components/InvoiceCreateMenu'
import {UsersIcon, FileTextIcon, ClockIcon} from 'vue-feather-icons'
import SidebarNavigation from '@/components/Sidebar/SidebarNavigation'
import MobileNavigation from '@/components/Others/MobileNavigation'
import ContentSidebar from '@/components/Sidebar/ContentSidebar'
import FilePreview from '@/components/FilesView/FilePreview'
import ContentGroup from '@/components/Sidebar/ContentGroup'
import {mapGetters} from 'vuex'
import {events} from '@/bus'
export default {
name: 'Settings',
computed: {
...mapGetters([
'config'
]),
},
components: {
ContentInvoiceView,
InvoiceSortingMobile,
InvoiceFilterMobile,
InvoiceCreateMenu,
InvoiceMobileMenu,
SidebarNavigation,
ClientMobileMenu,
MobileNavigation,
ContentSidebar,
FileTextIcon,
ContentGroup,
FilePreview,
UsersIcon,
ClockIcon,
},
data() {
return {
isScaledDown: false,
}
},
methods: {
goTo(location) {
let routes = {
'regular-invoice': 'getRegularInvoices',
'advance-invoice': 'getAdvanceInvoices',
'clients': 'getClients',
}
this.$store.dispatch(routes[location])
}
},
mounted() {
events.$on('mobile-menu:show', () => this.isScaledDown = true)
events.$on('fileItem:deselect', () => this.isScaledDown = false)
events.$on('mobile-menu:hide', () => this.isScaledDown = false)
this.$store.dispatch('getRegularInvoices')
}
}
</script>
<style lang="scss">
@import '@assets/vuefilemanager/_mixins';
@media only screen and (max-width: 690px) {
.is-scaled-down {
@include transform(scale(0.95));
}
}
</style>
@@ -1,9 +1,9 @@
<template>
<div class="page-tab">
<div id="loader" v-show="isLoading">
<div id="loader" v-if="isLoading">
<Spinner></Spinner>
</div>
<slot v-show="! isLoading"></slot>
<slot v-if="! isLoading"></slot>
</div>
</template>
+11 -1
View File
@@ -86,11 +86,21 @@ const routesOasis = [
name: 'InvoicesList',
path: '/invoice/invoices',
component: () =>
import(/* webpackChunkName: "chunks/oasis/invoices/list" */ './Oasis/Modules/Invoices/Invoices'),
import(/* webpackChunkName: "chunks/oasis/invoices/list" */ './Oasis/Modules/Invoices/InvoicesView'),
meta: {
requiresAuth: true,
title: 'Invoices'
},
},
{
name: 'InvoicesProfile',
path: '/invoice/profile',
component: () =>
import(/* webpackChunkName: "chunks/oasis/invoices/profile" */ './Oasis/Modules/Invoices/BillingProfile'),
meta: {
requiresAuth: true,
title: 'Billing Profile'
},
}
]
},
@@ -27,8 +27,10 @@
<div class="row">
<div class="col-left">
{{--TODO: klientske logo--}}
<img class="logo" src="{{ base64_from_storage_image('system/5YDehSGh-vuefilemanager-horizontal-logo.svg') }}">
{{--TODO: pridat textove logo--}}
@if($user->invoiceProfile->logo)
<img class="logo" src="{{ base64_from_storage_image($user->invoiceProfile->logo) }}">
@endif
<b class="email">{{ $user->invoiceProfile->email }}</b>
<b class="phone">{{ $user->invoiceProfile->phone }}</b>
@@ -275,10 +277,14 @@
@endif
</div>
<div class="sign">
@if(is_route('invoice-debug'))
<img src="{{ asset('/stamp.png') }}">
@if(is_route('invoice-debug') && $user->invoiceProfile->stamp)
<img src="{{ $user->invoiceProfile->stamp }}">
@endif
{{--<img src="{{ public_path('/stamp.png') }}">--}}
@if(! is_route('invoice-debug') && $user->invoiceProfile->stamp)
<img src="{{ base64_from_storage_image($user->invoiceProfile->stamp) }}">
@endif
<span class="highlight">Faktúru vystavil:</span> {{ $invoice->user['author'] }}
</div>
</div>
+1
View File
@@ -31,6 +31,7 @@ Route::group(['middleware' => 'api', 'prefix' => '/api/oasis'], function () {
Route::post('/', [InvoiceController::class, 'store']);
Route::get('/profile', [InvoiceProfileController::class, 'show']);
Route::post('/profile', [InvoiceProfileController::class, 'store']);
Route::patch('/profile', [InvoiceProfileController::class, 'update']);
});
Binary file not shown.

After

Width:  |  Height:  |  Size: 326 KiB

@@ -14,6 +14,26 @@ class OasisInvoiceProfileTest extends TestCase
{
use DatabaseMigrations;
/**
* @test
*/
public function it_get_user_invoice_profile()
{
$user = User::factory(User::class)
->create(['role' => 'user']);
$profile = InvoiceProfile::factory(InvoiceProfile::class)
->create(['user_id' => $user->id]);
Sanctum::actingAs($user);
$this->getJson('/api/oasis/invoices/profile')
->assertStatus(200)
->assertJsonFragment([
'company' => $profile->company,
]);
}
/**
* @test
*/
@@ -30,24 +50,28 @@ class OasisInvoiceProfileTest extends TestCase
Sanctum::actingAs($user);
$this->postJson('/api/oasis/invoices/profile', [
'logo' => $image,
'stamp' => $image,
'company' => 'VueFileManager Inc.',
'email' => 'howdy@hi5ve.digital',
'registration_notes' => 'Some registration notes',
'logo' => $image,
'ico' => '11111111',
'dic' => '11111111',
'ic_dph' => 'SK20002313123',
'registration_notes' => 'Some registration notes',
'author' => 'John Doe',
'address' => 'Does 11',
'state' => 'Slovakia',
'city' => 'Bratislava',
'postal_code' => '04001',
'country' => 'SK',
'phone' => '+421950123456',
'bank' => 'Fio Banka',
'iban' => 'SK20000054236423624',
'swift' => 'FIOZXXX',
'phone' => '+421950123456',
'email' => 'howdy@hi5ve.digital',
'author' => 'John Doe',
'stamp' => $image,
])->assertStatus(201)
->assertJsonFragment([
'company' => 'VueFileManager Inc.',
+27 -30
View File
@@ -292,16 +292,15 @@ class OasisInvoiceTest extends TestCase
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' => null,
'client_name' => 'VueFileManager Inc.',
@@ -350,16 +349,15 @@ class OasisInvoiceTest extends TestCase
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' => false,
'send_invoice' => false,
'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' => false,
'send_invoice' => false,
'client' => 'others',
'client_avatar' => null,
'client_name' => 'VueFileManager Inc.',
@@ -409,16 +407,15 @@ class OasisInvoiceTest extends TestCase
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' => false,
'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' => false,
'send_invoice' => true,
'client' => 'others',
'client_name' => 'VueFileManager Inc.',
'client_email' => 'howdy@hi5ve.digital',