feat: [시공관리] 계약관리 API 구현

- Contract 모델, 마이그레이션 추가
- ContractController CRUD 엔드포인트 구현
- ContractService 비즈니스 로직 구현
- ContractStoreRequest, ContractUpdateRequest 검증 추가
- Swagger API 문서 작성
- 라우트 등록 (GET/POST/PUT/DELETE)
- 통계 및 단계별 건수 조회 API 추가

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-01-09 10:18:43 +09:00
parent 349917f019
commit 3a8af2d7ee
9 changed files with 1188 additions and 0 deletions

View File

@@ -25,6 +25,7 @@
use App\Http\Controllers\Api\V1\ClassificationController;
use App\Http\Controllers\Api\V1\ClientController;
use App\Http\Controllers\Api\V1\ClientGroupController;
use App\Http\Controllers\Api\V1\Construction\ContractController;
use App\Http\Controllers\Api\V1\CommonController;
use App\Http\Controllers\Api\V1\CompanyController;
use App\Http\Controllers\Api\V1\DashboardController;
@@ -419,6 +420,21 @@
Route::delete('/{id}', [SiteController::class, 'destroy'])->whereNumber('id')->name('v1.sites.destroy');
});
// Construction API (시공관리)
Route::prefix('construction')->group(function () {
// Contract API (계약관리)
Route::prefix('contracts')->group(function () {
Route::get('', [ContractController::class, 'index'])->name('v1.construction.contracts.index');
Route::post('', [ContractController::class, 'store'])->name('v1.construction.contracts.store');
Route::get('/stats', [ContractController::class, 'stats'])->name('v1.construction.contracts.stats');
Route::get('/stage-counts', [ContractController::class, 'stageCounts'])->name('v1.construction.contracts.stage-counts');
Route::delete('/bulk', [ContractController::class, 'bulkDestroy'])->name('v1.construction.contracts.bulk-destroy');
Route::get('/{id}', [ContractController::class, 'show'])->whereNumber('id')->name('v1.construction.contracts.show');
Route::put('/{id}', [ContractController::class, 'update'])->whereNumber('id')->name('v1.construction.contracts.update');
Route::delete('/{id}', [ContractController::class, 'destroy'])->whereNumber('id')->name('v1.construction.contracts.destroy');
});
});
// Card API (카드 관리)
Route::prefix('cards')->group(function () {
Route::get('', [CardController::class, 'index'])->name('v1.cards.index');