From b87550d95dba88e262a0af4284fd3a4dd85b15f5 Mon Sep 17 00:00:00 2001 From: Nisse Date: Mon, 9 Sep 2024 15:29:31 -0700 Subject: [PATCH] basics test --- app/Http/Controllers/DashboardController.php | 43 ++++++ app/Http/Controllers/HomeController.php | 28 ---- app/Http/Controllers/OrderController.php | 16 +- app/Http/Requests/OrderProductRequest.php | 23 +++ app/Http/Requests/ProductServiceRequest.php | 26 ++++ app/Http/Requests/ProductSizeRequest.php | 22 +++ app/Http/Requests/ServiceFileRequest.php | 24 +++ app/Models/Order.php | 6 + app/Models/OrderProduct.php | 42 ++++++ app/Models/ProductService.php | 33 ++++ app/Models/ProductSize.php | 24 +++ app/Models/ServiceFile.php | 27 ++++ composer.json | 3 +- composer.lock | 78 +++++++++- database/factories/OrderFactory.php | 11 +- database/factories/OrderProductFactory.php | 26 ++++ database/factories/ProductServiceFactory.php | 30 ++++ database/factories/ProductSizeFactory.php | 25 +++ database/factories/ServiceFileFactory.php | 25 +++ .../2024_09_09_194631_create_orders_table.php | 4 +- ..._10_224439_create_order_products_table.php | 25 +++ ...0_224947_create_product_services_table.php | 28 ++++ ...9_10_225029_create_service_files_table.php | 27 ++++ ...9_10_230904_create_product_sizes_table.php | 24 +++ database/seeders/DatabaseSeeder.php | 1 + resources/views/customers/index.blade.php | 2 +- resources/views/customers/show.blade.php | 1 - resources/views/dashboard.blade.php | 131 ++++++++++++++++ resources/views/home.blade.php | 23 --- resources/views/layouts/app.blade.php | 44 +++++- resources/views/orders/index.blade.php | 142 ++++++++++++++++++ .../customers/show-contacts.blade.php | 8 +- .../customers/show-overview.blade.php | 10 +- .../customers/show-packing-slips.blade.php | 10 +- routes/web.php | 6 +- 35 files changed, 919 insertions(+), 79 deletions(-) create mode 100644 app/Http/Controllers/DashboardController.php delete mode 100644 app/Http/Controllers/HomeController.php create mode 100644 app/Http/Requests/OrderProductRequest.php create mode 100644 app/Http/Requests/ProductServiceRequest.php create mode 100644 app/Http/Requests/ProductSizeRequest.php create mode 100644 app/Http/Requests/ServiceFileRequest.php create mode 100644 app/Models/OrderProduct.php create mode 100644 app/Models/ProductService.php create mode 100644 app/Models/ProductSize.php create mode 100644 app/Models/ServiceFile.php create mode 100644 database/factories/OrderProductFactory.php create mode 100644 database/factories/ProductServiceFactory.php create mode 100644 database/factories/ProductSizeFactory.php create mode 100644 database/factories/ServiceFileFactory.php create mode 100644 database/migrations/2024_09_10_224439_create_order_products_table.php create mode 100644 database/migrations/2024_09_10_224947_create_product_services_table.php create mode 100644 database/migrations/2024_09_10_225029_create_service_files_table.php create mode 100644 database/migrations/2024_09_10_230904_create_product_sizes_table.php create mode 100644 resources/views/dashboard.blade.php delete mode 100644 resources/views/home.blade.php create mode 100644 resources/views/orders/index.blade.php diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php new file mode 100644 index 0000000..a132753 --- /dev/null +++ b/app/Http/Controllers/DashboardController.php @@ -0,0 +1,43 @@ +middleware('auth'); + } + + /** + * Show the application dashboard. + * + */ + public function index(Request $request) + { + if (!$request->get('tab')) { + return redirect()->route('dashboard', ['tab' => 'active_orders']); + } + + return view('dashboard', [ + 'today' => Carbon::today(), + 'tab' => $request->get('tab'), + 'active_orders' => Order::where('status', '!=', 'cancelled') + ->where('status', '!=', 'completed') + ->orderByDesc('rush') + ->orderBy('due_date') + ->paginate(15) + ->withQueryString() + ]); + } +} diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php deleted file mode 100644 index 7cbc2c3..0000000 --- a/app/Http/Controllers/HomeController.php +++ /dev/null @@ -1,28 +0,0 @@ -middleware('auth'); - } - - /** - * Show the application dashboard. - * - * @return \Illuminate\Contracts\Support\Renderable - */ - public function index() - { - return view('home'); - } -} diff --git a/app/Http/Controllers/OrderController.php b/app/Http/Controllers/OrderController.php index 5148ec7..a15813f 100644 --- a/app/Http/Controllers/OrderController.php +++ b/app/Http/Controllers/OrderController.php @@ -5,14 +5,28 @@ use App\Enums\OrderStatus; use App\Enums\OrderType; use App\Models\Customer; +use App\Models\Order; use Illuminate\Http\Request; use Illuminate\Support\Carbon; class OrderController extends Controller { - public function index() + public function index(Request $request) { + if (!$request->get('tab')) { + return redirect()->route('orders.index', ['tab' => 'active_orders']); + } + return view('orders.index', [ + 'tab' => $request->get('tab'), + 'today' => Carbon::today(), + 'active_orders' => Order::where('status', '!=', 'cancelled') + ->where('status', '!=', 'completed') + ->orderByDesc('rush') + ->orderBy('due_date') + ->paginate(15) + ->withQueryString() + ]); } public function create() diff --git a/app/Http/Requests/OrderProductRequest.php b/app/Http/Requests/OrderProductRequest.php new file mode 100644 index 0000000..10a9485 --- /dev/null +++ b/app/Http/Requests/OrderProductRequest.php @@ -0,0 +1,23 @@ + ['required', 'exists:orders'], + 'sku' => ['required'], + 'product_name' => ['required'], + 'color' => ['required'], + ]; + } + + public function authorize(): bool + { + return true; + } +} diff --git a/app/Http/Requests/ProductServiceRequest.php b/app/Http/Requests/ProductServiceRequest.php new file mode 100644 index 0000000..0b743db --- /dev/null +++ b/app/Http/Requests/ProductServiceRequest.php @@ -0,0 +1,26 @@ + ['required', 'exists:order_products'], + 'service_file_id' => ['nullable', 'exists:service_files'], + 'service_type' => ['required'], + 'placement' => ['required'], + 'setup_amount' => ['required'], + 'amount' => ['nullable'], + 'amount_price' => ['nullable'], + ]; + } + + public function authorize(): bool + { + return true; + } +} diff --git a/app/Http/Requests/ProductSizeRequest.php b/app/Http/Requests/ProductSizeRequest.php new file mode 100644 index 0000000..272716f --- /dev/null +++ b/app/Http/Requests/ProductSizeRequest.php @@ -0,0 +1,22 @@ + ['required', 'exists:order_products'], + 'size' => ['required'], + 'amount' => ['required'], + ]; + } + + public function authorize(): bool + { + return true; + } +} diff --git a/app/Http/Requests/ServiceFileRequest.php b/app/Http/Requests/ServiceFileRequest.php new file mode 100644 index 0000000..f66ae36 --- /dev/null +++ b/app/Http/Requests/ServiceFileRequest.php @@ -0,0 +1,24 @@ + ['required'], + 'name' => ['required'], + 'width' => ['required', 'numeric'], + 'height' => ['required', 'numeric'], + 'unit' => ['required'], + ]; + } + + public function authorize(): bool + { + return true; + } +} diff --git a/app/Models/Order.php b/app/Models/Order.php index cb8ec44..b98fff9 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\SoftDeletes; class Order extends Model @@ -47,6 +48,11 @@ public function customer(): BelongsTo return $this->belongsTo(Customer::class); } + public function orderProduct(): HasMany + { + return $this->hasMany(OrderProduct::class); + } + protected function serializeDate(DateTimeInterface $date): string { return $date->format('Y-m-d'); diff --git a/app/Models/OrderProduct.php b/app/Models/OrderProduct.php new file mode 100644 index 0000000..745ac50 --- /dev/null +++ b/app/Models/OrderProduct.php @@ -0,0 +1,42 @@ +belongsTo(Order::class); + } + + public function productService(): HasOne + { + return $this->hasOne(ProductService::class); + } + + public function serviceFile(): HasOne + { + return $this->hasOne(ServiceFile::class); + } + + public function productSize(): HasMany + { + return $this->hasMany(ProductSize::class); + } +} diff --git a/app/Models/ProductService.php b/app/Models/ProductService.php new file mode 100644 index 0000000..c351bcf --- /dev/null +++ b/app/Models/ProductService.php @@ -0,0 +1,33 @@ +belongsTo(OrderProduct::class); + } + + public function serviceFile(): HasOne + { + return $this->hasOne(ServiceFile::class); + } +} diff --git a/app/Models/ProductSize.php b/app/Models/ProductSize.php new file mode 100644 index 0000000..51150fa --- /dev/null +++ b/app/Models/ProductSize.php @@ -0,0 +1,24 @@ +belongsTo(OrderProduct::class); + } +} diff --git a/app/Models/ServiceFile.php b/app/Models/ServiceFile.php new file mode 100644 index 0000000..18b4b9c --- /dev/null +++ b/app/Models/ServiceFile.php @@ -0,0 +1,27 @@ +belongsTo(ProductService::class); + } +} diff --git a/composer.json b/composer.json index 7f6cb1b..3b608c3 100644 --- a/composer.json +++ b/composer.json @@ -8,7 +8,8 @@ "php": "^8.2", "davidhsianturi/blade-bootstrap-icons": "^1.5", "laravel/framework": "^11.9", - "laravel/tinker": "^2.9" + "laravel/tinker": "^2.9", + "livewire/livewire": "^3.5" }, "require-dev": { "fakerphp/faker": "^1.23", diff --git a/composer.lock b/composer.lock index da623a1..363f653 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ecf358f6808ee41e24a7136c4c0cd543", + "content-hash": "cf385c78ac1f239d7823feaf6668a15b", "packages": [ { "name": "blade-ui-kit/blade-icons", @@ -1959,6 +1959,82 @@ ], "time": "2024-01-28T23:22:08+00:00" }, + { + "name": "livewire/livewire", + "version": "v3.5.6", + "source": { + "type": "git", + "url": "https://github.com/livewire/livewire.git", + "reference": "597a2808d8d3001cc3ed5ce89a6ebab00f83b80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/livewire/livewire/zipball/597a2808d8d3001cc3ed5ce89a6ebab00f83b80f", + "reference": "597a2808d8d3001cc3ed5ce89a6ebab00f83b80f", + "shasum": "" + }, + "require": { + "illuminate/database": "^10.0|^11.0", + "illuminate/routing": "^10.0|^11.0", + "illuminate/support": "^10.0|^11.0", + "illuminate/validation": "^10.0|^11.0", + "laravel/prompts": "^0.1.24", + "league/mime-type-detection": "^1.9", + "php": "^8.1", + "symfony/console": "^6.0|^7.0", + "symfony/http-kernel": "^6.2|^7.0" + }, + "require-dev": { + "calebporzio/sushi": "^2.1", + "laravel/framework": "^10.15.0|^11.0", + "mockery/mockery": "^1.3.1", + "orchestra/testbench": "^8.21.0|^9.0", + "orchestra/testbench-dusk": "^8.24|^9.1", + "phpunit/phpunit": "^10.4", + "psy/psysh": "^0.11.22|^0.12" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Livewire\\LivewireServiceProvider" + ], + "aliases": { + "Livewire": "Livewire\\Livewire" + } + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Livewire\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Caleb Porzio", + "email": "calebporzio@gmail.com" + } + ], + "description": "A front-end framework for Laravel.", + "support": { + "issues": "https://github.com/livewire/livewire/issues", + "source": "https://github.com/livewire/livewire/tree/v3.5.6" + }, + "funding": [ + { + "url": "https://github.com/livewire", + "type": "github" + } + ], + "time": "2024-08-19T11:52:18+00:00" + }, { "name": "monolog/monolog", "version": "3.7.0", diff --git a/database/factories/OrderFactory.php b/database/factories/OrderFactory.php index 35d8502..b4093ed 100644 --- a/database/factories/OrderFactory.php +++ b/database/factories/OrderFactory.php @@ -3,6 +3,7 @@ namespace Database\Factories; use App\Enums\OrderStatus; +use App\Enums\OrderType; use App\Models\Customer; use App\Models\Order; use Illuminate\Database\Eloquent\Factories\Factory; @@ -14,17 +15,19 @@ class OrderFactory extends Factory public function definition(): array { - $order_date = Carbon::today()->subDays(rand(0, 30)); + $order_date = Carbon::today()->subDays(rand(0, 10)); + $due_date = $order_date->copy()->addDays(rand(9,15)); return [ 'created_at' => Carbon::now(), 'updated_at' => Carbon::now(), 'internal_po' => 'TN' . $this->faker->randomNumber(4, true), 'customer_po' => $this->faker->randomNumber(6, true), + 'order_type' => $this->faker->randomElement(OrderType::cases())->value, 'order_date' => $order_date, - 'due_date' => $order_date->addDays(rand(8, 12)), - 'status' => $this->faker->randomELement(OrderStatus::cases())->value, //todo: setup order status enum - 'rush' => $this->faker->boolean(), + 'due_date' => $due_date, + 'status' => $this->faker->randomELement(OrderStatus::cases())->value, + 'rush' => $this->faker->boolean(10), 'new_art' => $this->faker->boolean(), 'digitizing' => $this->faker->boolean(), 'repeat' => $this->faker->boolean(), diff --git a/database/factories/OrderProductFactory.php b/database/factories/OrderProductFactory.php new file mode 100644 index 0000000..8c60460 --- /dev/null +++ b/database/factories/OrderProductFactory.php @@ -0,0 +1,26 @@ + Carbon::now(), + 'updated_at' => Carbon::now(), + 'sku' => $this->faker->word(), + 'product_name' => $this->faker->name(), + 'color' => $this->faker->word(), + + 'order_id' => Order::factory(), + ]; + } +} diff --git a/database/factories/ProductServiceFactory.php b/database/factories/ProductServiceFactory.php new file mode 100644 index 0000000..e925974 --- /dev/null +++ b/database/factories/ProductServiceFactory.php @@ -0,0 +1,30 @@ + Carbon::now(), + 'updated_at' => Carbon::now(), + 'service_type' => $this->faker->word(), + 'placement' => $this->faker->word(), + 'setup_amount' => $this->faker->word(), + 'amount' => $this->faker->word(), + 'amount_price' => $this->faker->word(), + + 'order_product_id' => OrderProduct::factory(), + 'service_file_id' => ServiceFile::factory(), + ]; + } +} diff --git a/database/factories/ProductSizeFactory.php b/database/factories/ProductSizeFactory.php new file mode 100644 index 0000000..796a500 --- /dev/null +++ b/database/factories/ProductSizeFactory.php @@ -0,0 +1,25 @@ + Carbon::now(), + 'updated_at' => Carbon::now(), + 'size' => $this->faker->word(), + 'amount' => $this->faker->word(), + + 'order_product_id' => OrderProduct::factory(), + ]; + } +} diff --git a/database/factories/ServiceFileFactory.php b/database/factories/ServiceFileFactory.php new file mode 100644 index 0000000..9240a98 --- /dev/null +++ b/database/factories/ServiceFileFactory.php @@ -0,0 +1,25 @@ + Carbon::now(), + 'updated_at' => Carbon::now(), + 'code' => $this->faker->word(), + 'name' => $this->faker->name(), + 'width' => $this->faker->randomFloat(), + 'height' => $this->faker->randomFloat(), + 'unit' => $this->faker->word(), + ]; + } +} diff --git a/database/migrations/2024_09_09_194631_create_orders_table.php b/database/migrations/2024_09_09_194631_create_orders_table.php index c36c202..cb92f61 100644 --- a/database/migrations/2024_09_09_194631_create_orders_table.php +++ b/database/migrations/2024_09_09_194631_create_orders_table.php @@ -14,10 +14,10 @@ public function up(): void $table->foreignId('customer_id'); $table->string('internal_po'); $table->string('customer_po'); - $table->enum('order_type', OrderType::cases()); + $table->string('order_type'); $table->date('order_date'); $table->date('due_date'); - $table->enum('status', OrderStatus::cases()); + $table->string('status'); $table->boolean('rush')->default(0); $table->boolean('new_art')->default(0); $table->boolean('digitizing')->default(0); diff --git a/database/migrations/2024_09_10_224439_create_order_products_table.php b/database/migrations/2024_09_10_224439_create_order_products_table.php new file mode 100644 index 0000000..8edaf9a --- /dev/null +++ b/database/migrations/2024_09_10_224439_create_order_products_table.php @@ -0,0 +1,25 @@ +id(); + $table->foreignId('order_id')->constrained(); + $table->string('sku')->nullable(); + $table->string('product_name'); + $table->string('color')->nullable(); + $table->softDeletes(); + $table->timestamps(); + }); + } + + public function down(): void + { + Schema::dropIfExists('order_products'); + } +}; diff --git a/database/migrations/2024_09_10_224947_create_product_services_table.php b/database/migrations/2024_09_10_224947_create_product_services_table.php new file mode 100644 index 0000000..888e264 --- /dev/null +++ b/database/migrations/2024_09_10_224947_create_product_services_table.php @@ -0,0 +1,28 @@ +id(); + $table->foreignId('order_product_id'); + $table->foreignId('service_file_id')->nullable(); + $table->string('service_type'); + $table->string('placement'); + $table->string('setup_amount'); + $table->string('amount')->nullable(); + $table->string('amount_price')->nullable(); + $table->softDeletes(); + $table->timestamps(); + }); + } + + public function down(): void + { + Schema::dropIfExists('product_services'); + } +}; diff --git a/database/migrations/2024_09_10_225029_create_service_files_table.php b/database/migrations/2024_09_10_225029_create_service_files_table.php new file mode 100644 index 0000000..eca58f6 --- /dev/null +++ b/database/migrations/2024_09_10_225029_create_service_files_table.php @@ -0,0 +1,27 @@ +id(); + $table->foreignId('product_service_id')->constrained(); + $table->string('code'); + $table->string('name'); + $table->decimal('width'); + $table->decimal('height'); + $table->string('unit'); + $table->softDeletes(); + $table->timestamps(); + }); + } + + public function down(): void + { + Schema::dropIfExists('service_files'); + } +}; diff --git a/database/migrations/2024_09_10_230904_create_product_sizes_table.php b/database/migrations/2024_09_10_230904_create_product_sizes_table.php new file mode 100644 index 0000000..00e3e99 --- /dev/null +++ b/database/migrations/2024_09_10_230904_create_product_sizes_table.php @@ -0,0 +1,24 @@ +id(); + $table->foreignId('order_product_id'); + $table->string('size'); + $table->string('amount'); + $table->softDeletes(); + $table->timestamps(); + }); + } + + public function down(): void + { + Schema::dropIfExists('product_sizes'); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 3293b57..6021715 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -25,6 +25,7 @@ public function run(): void ->has(Contact::factory(5)) ->has(PackingSlip::factory(30)) ->has(ShippingEntry::factory(2)) + ->has(Order::factory(25)) ->create(); Customer::factory([ diff --git a/resources/views/customers/index.blade.php b/resources/views/customers/index.blade.php index a9f0430..5a1f8a0 100644 --- a/resources/views/customers/index.blade.php +++ b/resources/views/customers/index.blade.php @@ -7,7 +7,7 @@
-

+{{--

--}}
diff --git a/resources/views/customers/show.blade.php b/resources/views/customers/show.blade.php index 2cc702b..ebf3657 100644 --- a/resources/views/customers/show.blade.php +++ b/resources/views/customers/show.blade.php @@ -65,7 +65,6 @@ @section('content')
-
diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php new file mode 100644 index 0000000..5d2c25c --- /dev/null +++ b/resources/views/dashboard.blade.php @@ -0,0 +1,131 @@ +@extends('layouts.app') + +@section('header') +
+ + +
+
+
+ {{--

Overview

--}} +
+
+ + +
+
+ +
+
+ +
+@endsection + +@section('content') +
+
+
+
+ +
+
+
+
+

Active orders

+
+
+ + + Create entry + +
+ +
+ + +
+
+
+
+
+
+ + + + + + + + + + + + + + + @foreach($active_orders as $order) + + + + + + + + + + + @endforeach + +
CustomerInternal POCustomer POOrder DateDue DateStatusRushView
{{$order->customer->company_name}}{{$order->internal_po}}{{$order->customer_po}}{{$order->order_date}}{{$order->due_date}}{{$order->status->value}} + @if($order->rush) + + @endif + + + + +
+
+
+ +
+
+
+{{-- {{$active_orders->links()}}--}} +
+
+
+ +
+ +
+
+
+@endsection diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php deleted file mode 100644 index 1f34466..0000000 --- a/resources/views/home.blade.php +++ /dev/null @@ -1,23 +0,0 @@ -@extends('layouts.app') - -@section('content') -
-
-
-
-
{{ __('Dashboard') }}
- -
- @if (session('status')) - - @endif - - {{ __('You are logged in!') }} -
-
-
-
-
-@endsection diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 1593400..0d475f0 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -15,10 +15,12 @@ @vite(['resources/sass/app.scss', 'resources/js/app.js']) + + @livewireStyles
-