From 3958ed8b80a4971760f1135308dd6f074bb1ed31 Mon Sep 17 00:00:00 2001 From: choibk Date: Sat, 6 Dec 2025 23:46:48 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9E=85=EC=B6=9C=EA=B3=A0=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=EA=B9=8C=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/StockLogController.php | 44 +++++++++++++++++++ app/Models/Product.php | 5 +++ app/Models/StockLog.php | 16 +++++++ ...5_12_06_221651_create_stock_logs_table.php | 37 ++++++++++++++++ database/seeders/DatabaseSeeder.php | 4 +- resources/views/product/list.blade.php | 4 +- resources/views/stock/input.blade.php | 24 ++++++++++ routes/web.php | 7 +++ 8 files changed, 137 insertions(+), 4 deletions(-) create mode 100644 app/Http/Controllers/StockLogController.php create mode 100644 app/Models/StockLog.php create mode 100644 database/migrations/2025_12_06_221651_create_stock_logs_table.php create mode 100644 resources/views/stock/input.blade.php diff --git a/app/Http/Controllers/StockLogController.php b/app/Http/Controllers/StockLogController.php new file mode 100644 index 0000000..19e253e --- /dev/null +++ b/app/Http/Controllers/StockLogController.php @@ -0,0 +1,44 @@ +query('action','in'); + if(!in_array($action, ['in','out'])) + { + abort(400, '잘못된 action 값 입니다.'); + } + $title = ($action == 'in') ? '입고 등록' : '출고 등록'; + // Product 조회 ( or 404) + $product = Product::findOrFail($id); + // Blade 뷰에 Product 전달 + return view('stock.input', compact('product', 'title', 'action')); + } + + public function Store(Request $request, $id) + { + $action = $request->query('action', 'in'); + if(!in_array($action, ['in','out'])) + { + abort(400, '잘못된 action 값 입니다.'); + } + $product = Product::findOrFail($id); + $validated = $request->validate([ + 'amount' => ['required', 'integer', 'min:1'] + ]); + StockLog::create([ + 'product_id' => $product->id, + 'change_type' => $action, + 'change_amount' => $validated['amount'] + ]); + return redirect()->route('product')->with('success', $action == 'in' ? '입고처리 완료' : '출고처리 완료'); + } +} diff --git a/app/Models/Product.php b/app/Models/Product.php index 14042a9..f135643 100644 --- a/app/Models/Product.php +++ b/app/Models/Product.php @@ -13,4 +13,9 @@ class Product extends Model $return = self::select('id', 'name', 'sku', 'price', 'quantity', 'created_at'); return $return->paginate(1); } + + public function stockLogs() + { + return $this->hasMany(StockLog::class); + } } diff --git a/app/Models/StockLog.php b/app/Models/StockLog.php new file mode 100644 index 0000000..23125db --- /dev/null +++ b/app/Models/StockLog.php @@ -0,0 +1,16 @@ +belongsTo(Product::class); + } +} diff --git a/database/migrations/2025_12_06_221651_create_stock_logs_table.php b/database/migrations/2025_12_06_221651_create_stock_logs_table.php new file mode 100644 index 0000000..bcf3e97 --- /dev/null +++ b/database/migrations/2025_12_06_221651_create_stock_logs_table.php @@ -0,0 +1,37 @@ +id(); + + $table->unsignedBigInteger('product_id'); + + $table->foreign('product_id') + ->references('id') + ->on('products') + ->onDelete('cascade'); + + $table->enum('change_type', ['in', 'out'])->comment('입출고 구분'); + $table->integer('change_amount')->comment('입출고 수량'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('stock_logs'); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 7cf3156..d55a297 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -19,9 +19,9 @@ class DatabaseSeeder extends Seeder // User::factory(10)->create(); User::factory()->create([ - 'name' => 'sokuree', + 'name' => '관리자', 'email' => 'sokuree@sokuree.com', - 'password' => Hash::make('password') + 'password' => Hash::make('^Ocean1472bk') ]); } } diff --git a/resources/views/product/list.blade.php b/resources/views/product/list.blade.php index 940b963..4ccd851 100644 --- a/resources/views/product/list.blade.php +++ b/resources/views/product/list.blade.php @@ -57,8 +57,8 @@
수정 삭제 - 입고 - 출고 + 입고 + 출고
diff --git a/resources/views/stock/input.blade.php b/resources/views/stock/input.blade.php new file mode 100644 index 0000000..30d7575 --- /dev/null +++ b/resources/views/stock/input.blade.php @@ -0,0 +1,24 @@ +@extends('layout') + +@section('main') + +

입고 처리

+ +
에러메시지
+ +
+ @csrf + +
+ +

{{ $product->name }}

+
+
+ + +
+ + 취소 +
+ +@endsection \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 43449be..23b7e30 100644 --- a/routes/web.php +++ b/routes/web.php @@ -2,6 +2,7 @@ use App\Http\Controllers\LoginController; use App\Http\Controllers\ProductController; +use App\Http\Controllers\StockLogController; use App\Http\Middleware\Authenticate; use Illuminate\Support\Facades\Route; @@ -44,4 +45,10 @@ Route::get('/product/{product}/edit', [ProductController::class, 'edit']) Route::put('/product/{product}', [ProductController::class, 'update']) ->name('product.update'); +// 입출고 등록 +Route::get('/stock/input/{id}', [StockLogController::class, 'input']) + ->name('stock.input'); +Route::post('/stock/input/{id}', [StockLogController::class, 'store']) + ->name('stock.store'); +