feat(labor): 노임관리 API 구현

- Labor 모델 (BelongsToTenant, SoftDeletes)
- LaborController 7개 엔드포인트
- LaborService 비즈니스 로직
- FormRequest 4개 (Index/Store/Update/BulkDelete)
- 마이그레이션 및 라우트 등록

API: GET/POST /labor, GET/PUT/DELETE /labor/{id}, DELETE /labor/bulk, GET /labor/stats

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-01-11 23:29:32 +09:00
parent ceb7798c28
commit f59dd1b9fb
11 changed files with 703 additions and 0 deletions

View File

@@ -72,6 +72,7 @@
use App\Http\Controllers\Api\V1\PopupController;
// use App\Http\Controllers\Api\V1\ProductBomItemController; // REMOVED: products 테이블 삭제됨
// use App\Http\Controllers\Api\V1\ProductController; // REMOVED: products 테이블 삭제됨
use App\Http\Controllers\Api\V1\LaborController;
use App\Http\Controllers\Api\V1\PositionController;
use App\Http\Controllers\Api\V1\PostController;
use App\Http\Controllers\Api\V1\PricingController;
@@ -1001,6 +1002,17 @@
Route::get('/{id}/revisions', [PricingController::class, 'revisions'])->whereNumber('id')->name('v1.pricing.revisions'); // 변경이력
});
// Labor (노임관리)
Route::prefix('labor')->group(function () {
Route::get('', [LaborController::class, 'index'])->name('v1.labor.index'); // 목록
Route::get('/stats', [LaborController::class, 'stats'])->name('v1.labor.stats'); // 통계
Route::delete('/bulk', [LaborController::class, 'bulkDestroy'])->name('v1.labor.bulk-destroy'); // 일괄 삭제
Route::post('', [LaborController::class, 'store'])->name('v1.labor.store'); // 등록
Route::get('/{id}', [LaborController::class, 'show'])->whereNumber('id')->name('v1.labor.show'); // 상세
Route::put('/{id}', [LaborController::class, 'update'])->whereNumber('id')->name('v1.labor.update'); // 수정
Route::delete('/{id}', [LaborController::class, 'destroy'])->whereNumber('id')->name('v1.labor.destroy'); // 삭제
});
// REMOVED: Products & Materials 라우트 삭제됨 (products/materials 테이블 삭제)
// 모든 품목 관리는 /items 엔드포인트 사용