feat:문서관리 Phase 4.1 - DocumentTemplate API + 결재 워크플로우 활성화

- DocumentTemplate 모델 6개 생성 (Template, ApprovalLine, BasicField, Section, SectionItem, Column)
- DocumentTemplateService (list/show) + DocumentTemplateController (index/show)
- GET /v1/document-templates, GET /v1/document-templates/{id} 라우트
- DocumentTemplateApi.php Swagger (7개 스키마, 2개 엔드포인트)
- Document 결재 워크플로우 4개 엔드포인트 활성화 (submit/approve/reject/cancel)
- ApproveRequest, RejectRequest FormRequest 생성
- DocumentApi.php Swagger에 결재 엔드포인트 4개 추가
- Document.template() 참조 경로 수정 (DocumentTemplate → Documents 네임스페이스)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-31 09:39:55 +09:00
parent fb0155624f
commit fb06975d97
16 changed files with 893 additions and 13 deletions

View File

@@ -3,13 +3,22 @@
/**
* 문서 관리 API 라우트 (v1)
*
* - 문서 양식(템플릿) 조회
* - 문서 CRUD
* - 결재 워크플로우 (보류 - 기존 시스템 연동 필요)
* - 결재 워크플로우
*/
use App\Http\Controllers\Api\V1\Documents\DocumentController;
use App\Http\Controllers\Api\V1\Documents\DocumentTemplateController;
use Illuminate\Support\Facades\Route;
// 문서 양식(템플릿) - 읽기 전용
Route::prefix('document-templates')->group(function () {
Route::get('/', [DocumentTemplateController::class, 'index'])->name('v1.document-templates.index');
Route::get('/{id}', [DocumentTemplateController::class, 'show'])->whereNumber('id')->name('v1.document-templates.show');
});
// 문서 CRUD + 결재
Route::prefix('documents')->group(function () {
// 문서 CRUD
Route::get('/', [DocumentController::class, 'index'])->name('v1.documents.index');
@@ -18,9 +27,9 @@
Route::patch('/{id}', [DocumentController::class, 'update'])->whereNumber('id')->name('v1.documents.update');
Route::delete('/{id}', [DocumentController::class, 'destroy'])->whereNumber('id')->name('v1.documents.destroy');
// 결재 워크플로우 (보류 - 기존 시스템 연동 필요)
// Route::post('/{id}/submit', [DocumentController::class, 'submit'])->name('v1.documents.submit');
// Route::post('/{id}/approve', [DocumentController::class, 'approve'])->name('v1.documents.approve');
// Route::post('/{id}/reject', [DocumentController::class, 'reject'])->name('v1.documents.reject');
// Route::post('/{id}/cancel', [DocumentController::class, 'cancel'])->name('v1.documents.cancel');
});
// 결재 워크플로우
Route::post('/{id}/submit', [DocumentController::class, 'submit'])->whereNumber('id')->name('v1.documents.submit');
Route::post('/{id}/approve', [DocumentController::class, 'approve'])->whereNumber('id')->name('v1.documents.approve');
Route::post('/{id}/reject', [DocumentController::class, 'reject'])->whereNumber('id')->name('v1.documents.reject');
Route::post('/{id}/cancel', [DocumentController::class, 'cancel'])->whereNumber('id')->name('v1.documents.cancel');
});